我想备份数据库,但是要在服务器上有负载的白天。备份不影响在同一服务器上运行的apache和其他数据库至关重要。
应该可以使用mysqldump命令,但是以低优先级运行该命令。
我怎样才能做到这一点?
更新: 貌似简单的使用使用mysqldump漂亮不起作用,因为的mysqldump生成一个新的进程。
我想备份数据库,但是要在服务器上有负载的白天。备份不影响在同一服务器上运行的apache和其他数据库至关重要。
应该可以使用mysqldump命令,但是以低优先级运行该命令。
我怎样才能做到这一点?
更新: 貌似简单的使用使用mysqldump漂亮不起作用,因为的mysqldump生成一个新的进程。
Answers:
如果周围有备用服务器可以应付服务器的写负载,则可以设置到该服务器的复制,然后从从属服务器备份。这还有一个优势,您可以在执行备份时停止复制,并在所有数据库或一个数据库中的所有表中获得一致的数据快照,而不会影响数据库服务器。如果您有资源,我总是建议您使用此设置来备份MySQL。
不错的好处是,您现在拥有一个只读从属服务器,可用于慢速长时间运行的查询。
mysqldump
将导致保持较长的锁定或表不同步。
安迪,到目前为止,我猜您已经有足够的时间来寻找解决方案。我最近在tsheets上提出了一个对我来说非常有用的解决方案,并认为我会分享。
cstream是类似于UNIX dd的通用流处理工具,通常在命令行构造的管道中使用。使cstream对我们有用的是,它允许您指定所有输入的最大带宽。这意味着您可以使用以下简单命令来限制mysqldump命令的磁盘IO:
mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql
假设您正在备份使用所有InnoDB表的数据库,则上述命令是安全的(不会影响其他查询),并且将执行mysqldump,同时将其磁盘读取限制为每秒一兆字节。使用-t参数将带宽调整为任何值,这将允许您的环境执行备份而不会影响客户的体验。
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更改传输速率。
如果你使用InnoDB,你可以尝试xtrabackup与--throttle 选项。
您也可以查看ionice并使用它运行mysqldump。
或者,也许您想在mysql中启用二进制日志记录并每周/每晚运行一次完全转储,同时每1-2小时将bin-logs复制到安全位置。以及用于备份目的的只读从站也是一个选项。
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来为您创建有用的脚本。
正如您的链接所建议的,复制是一种方法。在以前的主机上复制,停止和转储。
将您的MySQL数据放在LV上,并使用出色的mylvmbackup作业,该作业会拍摄LV的快照并压缩 MySQL数据文件。这样,您就不会锁定表,从而将仅对IO负载的影响降到最低。