MySQL - 避免备份期间表锁

MySQL - 避免备份期间表锁

我使用 mysqldump 在服务器上运行夜间备份。不幸的是,这几乎每晚都会让我的网站瘫痪半个小时左右,因为备份期间表被锁定了。

根据进程列表,甚至似乎不相关的表上的查询有时会被阻塞,例如“INSERT INTO A”处于锁定状态几分钟,而唯一正在运行的查询仅涉及表 B。

有没有更好的方法来进行这样的备份?

答案1

您有两个选择:

A. 使用--skip-lock-tablesmysqldump 选项。您的表不会被锁定,但您的备份可能不一致(取决于您的模式:如果您的数据库事务同时涉及多个表,并且一个表已经备份而另一个表尚未备份。例如:两个表:客户和订单。如果首先备份客户,然后插入新的客户/订单对,则您的备份中可能会出现没有客户的订单)。

此问题是 mysqldump 默认锁定所有表的主要原因。如果此问题不适用于您,则跳过 mysql 中的表锁定是最简单的解决方案。

B. 使用其他备份方法。例如:使用读锁刷新表、创建 LVM 快照、解锁表、安装 LVM 快照并备份数据。这比简单的 mysqldump 更快、更复杂。谷歌搜索“使用 LVM 快照进行 mysql 备份”,有许多可用的脚本和教程。

如果您的 MySQL 数据不在 LVM 卷上,您可以创建一个从属 MySQL 服务器并备份它,而无需触及主服务器,因此锁定发生在从属服务器上,而主服务器始终是空闲的。

相关内容