我每天使用 mysqldump+计划任务备份我的 mysql 数据库
但正如我所读到的这个答案mysqldump 不保证数据集的一致性...这是什么意思?这意味着如果有人在我备份时访问该网站,他的操作将编辑两个表,其中一个表已被 mysqldump 解析,从而导致“不完整”的备份,这会导致问题?如果 mysqldump 不好,最好的备份方法是什么?
答案1
您对可能导致备份不一致的场景的描述是完全正确的。
您可以使用 mysqldump 通过添加标志 --lock-all-tables 进行一致备份。顾名思义,需要注意的是,所有表都将被锁定以防止写入,直到备份完成。这取决于数据库的大小,可能需要很长时间并造成严重破坏。
有一些替代方案。其中一些是商业的。我假设你正在使用 MyISAM,它通常比 InnoDB 更难以进行一致的备份。
一种解决方案是将 MySQL 的数据放在便于通过其他方法更快备份的存储上。例如支持快照的 SAN 或 LVM2 块设备。您仍然必须将 MySQL 置于锁定状态,但由于快照只需很少的时间即可完成,因此破坏性影响可以忽略不计。然后,您可以针对数据快照启动另一个 MySQL 守护程序,以便获取一致的 mysqldump 并将其导出到其他地方。
我自己对 iSCSI 支持的存储使用了类似的方法。
答案2
想象一下两个表。当您备份第一个表时,第二个表发生了更改。备份将包括该更改。您没有快照。如果您删除了外键,这将是一个问题。
解决方案是将数据复制到一个从属数据库,当您进行备份时,停止复制,进行备份,然后再次启动复制。这样,您就有了数据库的快照。
答案3
mysqldump 通常会创建一致的快照(除非您告诉它不要这样做)。它通过使用全局读锁锁定整个服务器来实现这一点,但在大多数情况下,这是不可取的。
如果您只使用 InnoDB 表,则可以使用事务转储,它也是一致的,但不会(长时间)锁定任何内容。
答案4
如果您使用的是 InnoDB 表,则有一个名为“热备份”的商业工具可以在服务器启动时创建一致的备份。我不会链接它,因为它是一个商业网站,但如果您感兴趣,谷歌搜索应该会找到它。
对于其他表格式,您可以获取表上的读锁,然后复制底层数据文件,但这将阻止对表的写操作,因此您必须在应用程序不依赖于写操作时或使用已编写的应用程序来优雅地处理失败的写操作。
MySQL 文档中的更多信息:
http://dev.mysql.com/doc/refman/5.7/en/replication-solutions-backups-rawdata.html