如何在拍摄 LVM/ZFS 快照之前暂停 MySQL?

如何在拍摄 LVM/ZFS 快照之前暂停 MySQL?

我如何指示 MySQL 完成所有“正在进行的”事务,但延迟启动新事务(不关闭客户端),直到我拍摄了 ZFS 或 LVM 快照(所需时间不到一秒)。

例如

  1. 暂停 MySQL,等待“正在进行的”事务完成
  2. 同步到磁盘
  3. 拍摄 ZFS/LVM 快照
  4. 恢复MySQL 这样做的目的是为了备份目的获得一致的快照。第 2 步只需要不到一秒的时间。

第 1 步不应导致客户端错误,只需短暂暂停直至到达第 4 步。

是否有 MySQL 命令可以执行 1 和 4?这些是什么?

答案1

一种巧妙的方法是等待交易完成:

mysql> FLUSH LOCAL TABLES; Query OK, 0 rows affected (11.31 sec)

然后获取读锁:

mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (22.55 sec)

现在,所有查询都被阻止(即,它们等待锁被释放),直到您的会话结束。请注意 - 您仍然需要等到所有交易完成。根据您的工作负载,这可能需要一段时间(更新几百万行......)。

您可以用您最喜欢的脚本语言对此进行编码。

但说真的 - 为什么不使用超备份?它确实为您处理了 mysql 的一致快照,您可以将其转储到文件系统上,然后 zfs/lvm 对其进行快照。

答案2

这是我的解决方案如何在保持全局锁的同时创建ZFS快照,从而使MyISAM和InnoDB数据文件保持一致。

mysql << EOF
    FLUSH TABLES WITH READ LOCK;
    system zfs snapshot data/db@snapname
    UNLOCK TABLES;
EOF

相关内容