我维护大型MySQL数据库。我需要每晚备份它,但数据库一直处于活动状态。有来自用户的查询。 现在我只是禁用网站,然后进行备份,但这是非常糟糕的,因为服务被禁用,用户不喜欢这个。
如果在备份期间更改数据,备份数据的好方法是什么?
这是什么最佳做法?
答案 0 :(得分:14)
我使用数据库服务器的只读复制从属实现了此方案。
MySQL数据库复制非常容易设置和监控。您可以将其设置为对生产数据库进行所有更改,然后每晚离线进行备份。
Replication Slave服务器可以以只读方式启动,以确保不会直接对其进行任何更改。
还有其他方法可以不需要复制奴隶,但根据我的经验,这是解决此问题的一种非常可靠的方法。
以下是MySQL Replication上文档的链接。
答案 1 :(得分:3)
如果你有一个非常大的(50G +像我)MySQL MyISAM数据库,你可以使用锁和rsync
。根据MySQL文档,您可以安全地复制原始文件,同时读取锁定处于活动状态,而您无法使用InnoDB进行复制。
因此,如果目标是零停机并且您有额外的HD空间,请创建一个脚本:
rsync -aP --delete /var/lib/mysql/* /tmp/mysql/sync
然后执行以下操作:
flush tables
flush tables with read lock;
unlock tables;
首次运行rsync会在不停止MySQL的情况下复制很多。第二次运行将非常短,它只会延迟写入查询,因此它是真正的零停机时间解决方案。
rsync
向远程服务器执行另一个/tmp/mysql/sync
,压缩,保留增量版本,任何您喜欢的内容。答案 2 :(得分:2)
这部分取决于你是否使用innodb或myiasm。对于innodb; mySQL有自己的(这需要花钱)解决方案(innodb热门副本),但你可能想看一下Percona的开源版本:
答案 3 :(得分:0)
您要做的是“在线备份”。这是一个指向可能选项矩阵的指针,其中包含更多信息:
http://www.zmanda.com/blogs/?p=19
它基本上归结为您正在使用的存储后端以及您可用的硬件数量。