所有 InnoDB 表环境上的 Mysql 备份

标签 mysql innodb mysql-backup

目前我正在使用 mysqlbackup 进行备份。这将调用“FLUSH TABLES WITH READ LOCK”并增加锁定表的可能性,直到刷新完成并释放全局锁。

那么,有没有办法备份我的数据库,这个数据库非常大,有超过 100 GB 的表,没有这个全局锁?

像 mysqldump --single-transaction 这样的东西,我读到它在小型数据库上很有用,但事实并非如此。 有类似的情况适用于我的情况吗?

希望如此!

最佳答案

当您的表很大时,Percona Xtrabackup 是一个很好的选择。这主要是由于以下两点:

a) 从逻辑备份(即:由 mysqldump 创建)恢复 100GB 表所花费的时间会过多,因为 mysql 必须重建索引并在重放 SQL 时执行大量 I/O 处理。

b) xtrabackup 可以在您进行第一次完整备份后进行增量备份,从而使日常夜间或每小时的备份更快、占用的磁盘空间更小。

也就是说,请注意,由于 xtrabackup 会复制/lib/mysql 目录中的所有相关文件,因此磁盘空间要求很高。如果您的数据库在磁盘上分配了 200GB(即使某些表上有一些空的分配空间),您的备份大小将为 200GB。

这与mysqldump的逻辑备份(可以重新创建数据、表结构、索引等的sql语句)相比,后者只占用很小的空间。

了解有关 Percona xtrabackup 如何工作的更多信息:https://www.percona.com/doc/percona-xtrabackup/LATEST/how_xtrabackup_works.html

mysqldump 与 innodb 表一起使用以及 --master-data 和 --single-transaction 选项的组合是一个值得考虑的好选择。它在所有表上获取全局读锁,但仅持续足够长的时间来读取二进制日志坐标。通常,这将非常快,除非正在进行非常重要的更新,在这种情况下,它可能会停止,直到更新完成。

这为您提供了一致的时间点备份,并且除了初始读锁定之外没有锁定。

语法如下:

  mysqldump --all-databases --master-data --single-transaction > all_databases.sql

  mysqldump --master-data --single-transaction my-database > my-database.sql

备份单个数据库。

有关此内容的更多信息可以在 dev.mysql.com 网站上阅读:https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_single-transaction

关于所有 InnoDB 表环境上的 Mysql 备份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30641582/

相关文章:

mysql - 库存历史记录 - 版本控制风格方法

mysql - 通过使用 union 合并两个表来创建一个新表

Mysql获取行号

mysql - 为什么 MySQL 查询在开发环境和实时环境之间运行不同?

mysql - 如何从 varchar 列中获取单词及其在 mysql 中的出现频率

mysql - 如何将数据导入MySQL主/副本结构

mysql - 如何从本地系统备份表并将其恢复到 amazon RDS

python - Django/MySQL-python - 使用旧(4.1.1 之前)身份验证协议(protocol)的连接被拒绝(启用客户端选项 'secure_auth')

mysql - 如何提高innodb表扫描的性能

mysql - 备份mysql集群数据库的最佳方法