如何以低优先级备份mysql数据库?


15

我想备份数据库,但是要在服务器上有负载的白天。备份不影响在同一服务器上运行的apache和其他数据库至关重要。

应该可以使用mysqldump命令,但是以低优先级运行该命令。

我怎样才能做到这一点?

更新: 貌似简单的使用使用mysqldump漂亮不起作用,因为的mysqldump生成一个新的进程。


你看过mysqlhotcopy吗?

@fsb mysqlhotcopy如何支持OP的需求?
Tomas

Answers:


8

如果周围有备用服务器可以应付服务器的写负载,则可以设置到该服务器的复制,然后从从属服务器备份。这还有一个优势,您可以在执行备份时停止复制,并在所有数据库或一个数据库中的所有表中获得一致的数据快照,而不会影响数据库服务器。如果您有资源,我总是建议您使用此设置来备份MySQL。

不错的好处是,您现在拥有一个只读从属服务器,可用于慢速长时间运行的查询。


不幸的是,该选项看起来是最有用的,但是如果我希望对主服务器的影响最小,我想它是唯一的真实选择。
andyuk

2
如果您不希望影响操作,这几乎是获得正确的静默备份的唯一方法。由于放慢速度mysqldump将导致保持较长的锁定或表不同步。
丹·卡利

15

安迪,到目前为止,我猜您已经有足够的时间来寻找解决方案。我最近在tsheets上提出了一个对我来说非常有用的解决方案,并认为我会分享。

cstream是类似于UNIX dd的通用流处理工具,通常在命令行构造的管道中使用。使cstream对我们有用的是,它允许您指定所有输入的最大带宽。这意味着您可以使用以下简单命令来限制mysqldump命令的磁盘IO:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

假设您正在备份使用所有InnoDB表的数据库,则上述命令是安全的(不会影响其他查询),并且将执行mysqldump,同时将其磁盘读取限制为每秒一兆字节。使用-t参数将带宽调整为任何值,这将允许您的环境执行备份而不会影响客户的体验。


刚刚测试,我的工作就像一个魅力!感谢您分享布兰登!
sucotronic

4

FWIW,您也应该可以使用pv(http://linux.die.net/man/1/pv)完成此操作

mysqldump-单事务--quick -u -p | pv --rate-limit 1m>目标(或| nc或| tar cfj backup.bz2-)

这样做的好处是可以使用各种选项监视进度,使用-R选项可以将选项传递给已经运行的进程,例如;--rate-limit更改传输速率。


1

如果你使用InnoDB,你可以尝试xtrabackup与--throttle 选项

您也可以查看ionice并使用它运行mysqldump。

或者,也许您想在mysql中启用二进制日志记录并每周/每晚运行一次完全转储,同时每1-2小时将bin-logs复制到安全位置。以及用于备份目的的只读从站也是一个选项。


0

如果您是在Linux或其他* nix变体上运行它,则可以使用以下命令进行操作:

不错-n ## mysqldump

这将使其具有较低的调度优先级。调度优先级的范围是从-20(最高优先级)到19(最低优先级),如果省略-n参数,则默认值nice为10。


0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

I / O优先级为ionice,cpu优先级为nice。

运行vmstat 5,检查显示WA的列。较高的值表示CPU正在等待I / O。使用ionice,如果只是CPU负载,请使用nice。

更新响应:

看来您是对的。它调用了不好的mysql。我猜您可以为此使用renice并在运行后设置一个不错的值。

我没有足够大的数据库来转储atm来为您创建有用的脚本。

正如您的链接所建议的,复制是一种方法。在以前的主机上复制,停止和转储。


0

将您的MySQL数据放在LV上,并使用出色的mylvmbackup作业,该作业会拍摄LV的快照并压缩 MySQL数据文件。这样,您就不会锁定表,从而将仅对IO负载的影响降到最低。


0

您总是可以尝试在高峰时段不运行它。无论使用哪种优先级,转储仍然需要对所有表进行锁定。


事实并非如此:如果表是InnoDB,则不会在表上放置任何锁以进行读取。
dr01
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.