78

虽然做 MySQL 转储很容易,但我有一个实时的专用 MySQL 服务器,我想在其上设置复制。为此,我需要将数据库转储导入到我的复制从站。

当我进行转储时,问题就出现了,MySQL 全力以赴,并将资源绑定到连接到它的站点。我想知道是否有办法将转储查询限制为优先考虑实时连接的低优先级状态?这个想法是来自外部站点的负载不受 MySQL 进行完全转储的努力的影响......

4

6 回答 6

172

我有非常大的数据库,其中包含数万个表,其中一些表在数以千万计的条目中具有高达 5GB 的数据。(我运行一个流行的服务)...备份这些数据库时我一直很头疼。使用默认的 mysqldump 它会迅速使服务器负载失控并锁定所有内容……影响我的用户。试图停止该进程可能会导致表崩溃并在恢复这些表期间导致大量停机。

我现在用...

mysqldump -u USER -p --single-transaction --quick --lock-tables=false DATABASE | gzip > OUTPUT.gz

dev.mysql.com 上的mysqldump 参考甚至说...

要转储大型表,您应该将 --single-transaction 选项与 --quick 结合使用。

没有说明依赖于 InnoDB 的数据库,我的是 myISAM,这对我来说效果很好。服务器负载几乎完全不受影响,我的服务在整个过程中像劳力士一样运行。如果您有大型数据库并且备份它们会影响您的最终用户......这就是解决方案。;)

于 2012-08-27T13:00:54.107 回答
50

如果使用 InnoDB 表,请为 mysqldump 使用 --single-transaction 和 --quick 选项

于 2011-10-14T14:08:45.767 回答
2

除了已经提到的使用--single-transactionand的解决方案之外--quick,我不会直接将结果通过管道传输到 gzip 中,而是先将其转储为 .sql 文件,然后再 gzip 。(使用 && 代替 | )

转储本身会更快,因此停机时间更短。(我测试的速度是原来的两倍

所以我会选择“&& gzip”而不是“| gzip”

重要提示:首先检查可用磁盘空间df -h因为你需要的不仅仅是管道| 压缩包。

mysqldump --single-transaction --quick -u user -p my_db_name > dump_name.sql && gzip dump_name.sql

-> 这也将产生 1 个名为 dump_name.sql.gz 的文件

于 2020-07-08T09:48:18.997 回答
0

1)首先您需要了解您的 MySQL 版本。至少使用 5.7,因此它支持多线程。旧版本仅使用 1 个线程,如果您有大型数据库,则同时使用 DB 和执行 mysqldump 不是一个好主意。

2) 最好不要在同一个 DB 磁盘中构建备份,因为读/写的性能,或者您可能需要 RAID 10。

3) MySQL Enterprise 的 mysqlbackup 更好,但要付费,我不知道您是否可以选择。

4)有时很多表不需要事务,所以只在你需要的表上使用事务

5)事务一般是必要的,使用InnoDB格式以获得更好的性能并且不使用锁表。

6)某些情况下最好做一个程序,所以你可以创建你的事务只读取你的表而不锁定任何人,并通过一些睡眠进行测试,而不是冻结你的服务。

于 2020-05-25T19:41:25.137 回答
-3

您可以在 mysqldump 命令前加上以下内容:

ionice -c3 nice -n19 mysqldump ...

它将以低 IO 和 CPU 优先级运行它,因此应该限制它的影响。

注意,这只会延迟 MySQL 执行之间的时间。脚本本身仍将像以前一样密集,只是脚本之间的休息时间更长。

于 2011-04-14T17:02:46.367 回答
-3

使用 nice 和 gzip 命令以最低优先级执行命令。

nice -n 10 ionice -c2 -n 7 mysqldump db-name | gzip > db-name.sql.gz 
于 2015-07-03T11:07:12.213 回答