如果我没记错的话,执行 mysqldump 时会锁定表,不是吗?呃,没关系,我的问题是:
如果我每小时使用 mysqldump 备份 LIVE 数据库,会有什么后果?
我有很多数据库(大约 15 个),但只需要备份 10 个数据库(其中 2 个非常大,大约 40 mb)。因此,在我的批处理文件中,我按数据库执行 mysqldump,而不使用“--all-”选项。
我想尽可能多地备份这些重要的数据库,我计划每 3 小时备份一次。但是,我担心性能,我担心这会减慢我的网站速度。有什么建议吗?
答案1
您将给数据库服务器的 IO 子系统带来巨大的负载。
如果您需要这样做,那么我的建议是将 mysql 复制设置到第二台服务器并从那里运行备份。
从技术上讲,一旦您运行此复制,从属服务器上的二进制日志就足以进行时间点恢复,并且您不需要经常运行完整备份。
此外,运行备份时请考虑--single-transation
启用该标志mysqlbackup
以避免对每个表执行表级锁定。这要求您使用 InnoDB 而不是 MyISAM,无论如何您都应该这样做。
答案2
除非您的意思是 40G 而不是 40M,否则这样做绝对没有问题。40M 并不大,它非常小 :) 并且绝对应该适合内存(即使考虑到其余数据库,正如您所说,它们甚至更小),除非您的内存非常低并且没有给您的 mysql 足够的内存,但即便如此,即使从磁盘完全加载数据也只需要几秒钟。
我建议您至少使用“time”shell 命令计时一次。
在备份过程中(假设您使用正确的选项(我使用“-ceKq --single-transaction --create-options”),您的应用程序对数据库的所有查询都将被锁定,但如果每隔几个小时只是一秒钟,我不会太担心,除非您有一个流量非常大的网站,在这种情况下 mysqldump 并不是真正的备份选项。
答案3
LVM 快照可以在几分之一秒内提供数据库文件系统的冻结图像。如果使用 MyISAM 表,则过程如下:
- 用读锁刷新表;#锁定服务器中的所有表
- 创建 LVM 快照
- 解锁表格;
锁定只会持续一秒钟左右。
然后可以安装快照并针对它运行第二个 mysql 实例。或者,您可以压缩快照并将其复制到远程系统,它将一直保留在那里直到需要为止。
答案4
我会采纳 Daves 的建议。设置一个复制从服务器,并在那里运行备份。您不想影响生产数据库服务器。如果您想要一个不错的开箱即用工具,我会尝试 MySQL-ZRM。社区版本工作正常。当您配置 ZRM 时,您可以选择它是一个从服务器,它会在您备份时为您停止复制。此外,正如 Dave 所说,拥有该从服务器及其日志真是太好了。MySQL的ZRM