我想备份一个数据库,但是在服务器上有负载的那一天。 备份不会影响运行在同一台服务器上的apache和其他数据库。
应该可以使用mysqldump命令,但以低优先级运行命令。
我该怎么做?
更新:看起来只是使用mysqldump的好用不起作用,因为mysqldump产生一个新的进程。
如果你周围有一个备用的服务器,可以处理你的服务器的写入负载,你可以设置复制到该服务器,然后从从服务器备份。 这也有一个好处,就是您可以在执行备份时停止复制,并在所有数据库或一个数据库中的所有表中获得一致的数据快照,而不会影响数据库服务器。 如果你有资源,这是我总是build议备份MySQL的设置。
作为一个很好的奖励,你现在有一个只读的奴隶,你可以使用缓慢的长时间运行的查询。
安迪,现在我猜你已经有足够的时间find解决scheme了。 我最近想出了一个解决scheme,这在tsheets中对我很好 ,并且我想分享它。
cstream是一个通用的stream处理工具,如UNIX dd,通常用于命令行构build的pipe道。 使cstream对我们有用的东西是它允许你指定所有input的最大带宽。 这意味着你可以用一个简单的命令来限制你的mysqldump命令的磁盘IO:
mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql
假设你正在备份一个使用所有InnoDB表的数据库,上面的命令是安全的(不会影响其他查询),并且会执行你的mysqldump,同时将它的磁盘读取限制为每秒一兆字节。 使用-t paramater调整带宽,以使您的环境能够执行备份,而不会影响客户的体验。
FWIW你也应该可以用pv( http://linux.die.net/man/1/pv )
mysqldump –single-transaction –quick -u -p | pv –rate-limit 1m> destination(或| nc或| tar cfj backup.bz2 – )
关于这一点的好处是监视进度的各种选项和-R选项允许您将选项传递给已经运行的进程,例如: – 限制改变传输速率。
如果您使用innodb,则可以使用–throttle 选项尝试xtrabackup 。
你也可以看看ionice并运行mysqldump。
或者你想在mysql中启用二进制日志logging,并且每周/每晚运行一次完全转储,而每1-2小时将bin-logs复制到安全位置。 和..只读的奴隶为备份的目的也是一个选项。
如果您正在Linux或其他* nix变体上运行它,可以使用以下方法:
nice -n ## mysqldump
这将给它一个较低的调度优先级。 如果-n参数被忽略,调度优先级的范围从-20(最高优先级)到19(最低优先级),nice的默认值是10。
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
ionice I / O优先级和CPU优先级。
运行vmstat 5,检查WA列。 高值表示CPU正在等待I / O。 使用ionice,如果它只是CPU负载,使用很好。
响应更新:
似乎你是正确的。 它调用不是niced的mysql。 我想你可以使用renice这个并且在运行后设置好的值。
我没有一个足够大的数据库来转储atm为你做一个有用的脚本。
复制,正如你的链接所暗示的,是一种方法。 在anthoer主机上复制,停止和转储。
把你的MySQL数据放在一个LV上,然后使用一个micedvmbackup作业, 这个作业会取得LV的快照,并打开MySQL数据文件。 通过这种方式,您不会locking这些表,从而将对应用程序的影响最小化为IO负载。
在繁忙时间,您可以尝试不运行。 无论您使用哪种优先级,转储仍然需要在所有表上locking。