我使用 mysqldump 在服务器上运行夜间备份。不幸的是,这几乎每晚都会让我的网站瘫痪半个小时左右,因为备份期间表被锁定了。
根据进程列表,甚至似乎不相关的表上的查询有时会被阻塞,例如“INSERT INTO A”处于锁定状态几分钟,而唯一正在运行的查询仅涉及表 B。
有没有更好的方法来进行这样的备份?
答案1
您有两个选择:
A. 使用--skip-lock-tables
mysqldump 选项。您的表不会被锁定,但您的备份可能不一致(取决于您的模式:如果您的数据库事务同时涉及多个表,并且一个表已经备份而另一个表尚未备份。例如:两个表:客户和订单。如果首先备份客户,然后插入新的客户/订单对,则您的备份中可能会出现没有客户的订单)。
此问题是 mysqldump 默认锁定所有表的主要原因。如果此问题不适用于您,则跳过 mysql 中的表锁定是最简单的解决方案。
B. 使用其他备份方法。例如:使用读锁刷新表、创建 LVM 快照、解锁表、安装 LVM 快照并备份数据。这比简单的 mysqldump 更快、更复杂。谷歌搜索“使用 LVM 快照进行 mysql 备份”,有许多可用的脚本和教程。
如果您的 MySQL 数据不在 LVM 卷上,您可以创建一个从属 MySQL 服务器并备份它,而无需触及主服务器,因此锁定发生在从属服务器上,而主服务器始终是空闲的。