我想备份数据库,但白天服务器负载很大。备份不能影响同一台服务器上运行的 Apache 和其他数据库,这一点至关重要。
应该可以使用mysqldump命令,但以低优先级运行该命令。
我怎样才能做到这一点?
更新: 好像简单地使用 nice 和 mysqldump 不起作用因为 mysqldump 会产生一个新进程。
答案1
如果您身边有一台可以应付服务器写入负载的备用服务器,则可以设置到该服务器的复制,然后从从属服务器备份。这样做还有一个好处,就是您可以在执行备份时停止复制,并在所有数据库或一个数据库中的所有表中获得数据的一致快照,而不会影响数据库服务器。如果您有资源,我始终建议使用此设置来备份 MySQL。
作为一个不错的奖励,您现在有一个只读从属服务器,可以用于缓慢的长时间运行的查询。
答案2
安迪,现在我猜你已经有充足的时间来寻找解决方案了。我最近想出了一个解决方案,对我来说效果很好表格,并决定与大家分享。
流是一种通用的流处理工具,类似于 UNIX dd,通常用于命令行构造的管道。cstream 对我们有用的原因是它允许您指定所有输入的最大带宽。这意味着您可以使用如下简单命令来限制 mysqldump 命令的磁盘 IO:
mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql
假设您正在备份一个使用所有 InnoDB 表的数据库,则上述命令是安全的(不会影响其他查询),并且将执行 mysqldump,同时将其磁盘读取限制为每秒仅 1 兆字节。使用 -t 参数将带宽调整为任何值,以使您的环境能够执行备份而不会影响客户的体验。
答案3
你也可以用 pv 来做到这一点(http://linux.die.net/man/1/pv)
mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m > 目标(或 | nc 或 | tar cfj backup.bz2 -)
它的优点在于有各种用于监控进度的选项,并且 -R 选项允许您将选项传递给已经运行的进程,例如;--rate-limit 来改变传输速率。
答案4
如果您在 Linux 或其他 *nix 变体上运行它,您可以执行以下操作:
很好 -n ## mysqldump
这将赋予它较低的调度优先级。调度优先级的范围从 -20(最高优先级)到 19(最低优先级),如果省略 -n 参数,则 nice 的默认值为 10。