我使用mysqldump +计划任务每天备份我的mysql数据库
但是,正如我可以读这个答案 ,mysqldump不能保证一致的数据集…这是什么意思? 这意味着如果有人在我备份时访问网站,他的行为将编辑两个表,并且一个表已经被mysqldumpparsing,导致“不完整”的备份可能导致问题? 如果mysqldump不好,最好的备份方法是什么?
什么可能会导致不一致的备份的情况是完全正确的。
您可以使用mysqldump通过添加标志–lock-all-tables来进行一致的备份。 需要注意的是,在备份完成之前,所有的表都将被locking写入。 这取决于你的数据库的大小可能会很长时间,并造成很大的干扰。
有一些替代品。 其中一些是商业的。 我打算假设你使用的是MyISAM,一般比InnoDB更难以备份。
一种解决scheme是将MySQL的数据放到存储上,以便通过另一种方法更快地进行备份。 如支持快照的SAN或LVM2块设备。 您仍然必须将MySQL置于locking状态,但由于快照只需很短的时间来完成,所以破坏性影响可以忽略不计。 然后你可以启动另一个MySQL守护进程,对数据的快照应该采取一致的mysqldump并将其导出到其他地方。
我使用类似的方法来对付iSCSI支持的存储。
想象两张桌子。 当您备份第一个时,第二个将被更改。备份将包含该更改。 你没有快照。 这是一个问题,如果说你删除了一个外键。
解决方法是复制一个从属数据库,当您执行备份时,停止复制,执行备份,然后再次开始复制。 这样,你的数据库就有了快照。
mysqldump通常会创build一致的快照(除非你不告诉它)。 它通过使用全局读锁来locking整个服务器来实现这一点,这在大多数情况下是不可取的。
如果你独占地使用InnoDB表,你可以使用一个也是一致的事务转储,但是不会locking任何东西(很长时间)。
如果您使用的是InnoDB表,那么有一个称为“热备份”的商业工具,可以在服务器启动时创build一致的备份。 我不会链接它,因为它是一个商业网站,但谷歌search应该提出来,如果你有兴趣。
使用其他表格格式,您可以获得对表的读取locking,然后复制底层的数据文件,但是这会阻止对表的写入操作,因此您必须在应用程序不依赖写入或具有已经被写入来优雅地处理失败的写入。
更多信息在MySQL文档中:
http://dev.mysql.com/doc/refman/5.7/en/replication-solutions-backups-rawdata.html