我如何指示 MySQL 完成所有“正在进行的”事务,但延迟启动新事务(不关闭客户端),直到我拍摄了 ZFS 或 LVM 快照(所需时间不到一秒)。
例如
- 暂停 MySQL,等待“正在进行的”事务完成
- 同步到磁盘
- 拍摄 ZFS/LVM 快照
- 恢复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