我目前正在研究在一些生产服务器上实施的mysql备份解决方案。
阅读一段时间后,我得出结论,最好的解决方案是使用主/从方法实现 mysql 复制。
老实说,考虑到我的实际需求,这可能有点过头了,因为简单的数据库转储就足够了。
因此,我将尝试通过rsync和mysqldump实现备份解决方案。
如果数据库大小不是太大(较大的数据库的 ibdata1 有 42MB,mysqldump 命令执行相当快,生成一个 6.7M 的转储文件),并且数据库访问量相当少,那么在工作期间使用 mysqldump 是足够安全的,使用选项-单笔交易?
使用这种方法,是否可以配置一个 cron 任务来在一天内执行 2-3 次转储?如果我没记错的话,-单笔交易选项的使用可确保一定的数据完整性。
提前感谢所有的帮助,问候
答案1
对于 InnoDB 表,--single-transaction 将确保每个表的转储是一致的,但它不一定与其他表一致,因为它一次锁定并转储一个表,而不是在转储期间锁定所有表。当然,如果您在转储表时尝试写入表,则写入操作会延迟,以等待锁定释放。
更好的办法是使用允许您拍摄快照的 LVM 或文件系统,然后锁定整个数据库足够长的时间以拍摄快照,然后您可以在方便的时候备份。
答案2
如果不了解以下信息,我很难做出判断:您的网站对数据库的访问模式、数据库流量或您预计数据库会有多大。如果您对将要发生的任何锁定都满意,我会说去做吧。
我所处的环境中不允许任何超出常规用途的锁定,我们的数据库大约有 750GB。我们所做的是获取 LVM 快照,然后从快照运行 mysqldump。当然,快照期间我们的性能会有所下降,但这比完全锁定表要好。
答案3
Mysqldump 锁定正在备份的数据库,因此您应该考虑使用实时备份工具,例如xtrabackup
。您将需要使用 Percona 的 MySQL 构建并将所有表转换为 InnoDB。Oracle 的最新 InnoDB 插件也支持实时备份,不记得他们的实时备份工具的名称了。
答案4
我认为 mysql 复制是一个不错的选择。Mysql 在提交事务后生成新日志。因此,只要您正确使用事务,您就会拥有一致的备份。
一开始进行一次全备份,然后就可以得到复制系统生成的二进制日志。曾经应用过的二进制日志文件应该以一致的方式更新数据库。
这总是可以使用的。但是,使用系统快照的选项可能不可行,因为它与您使用的文件系统相关。