bigywater.tech
MySQL / InnoDB · 116

mysqldump 一致性备份

真实一边跑mysqldump一边并发修改同一张表,验证--single-transaction的一致性快照到底靠不靠谱,再真实把dump还原到新库核对数据。

完全不受影响
dump过程中真实的并发修改被MVCC隔离
8行完全一致
真实还原验证数据内容对得上

做的事:真实一边跑dump一边并发修改同一行数据

代码-- 后台:真实跑mysqldump mysqldump -u root --single-transaction --set-gtid-purged=OFF mysqllab accounts > dump.sql & -- 几乎同时:真实修改dump正在读的这张表 UPDATE accounts SET balance=99999 WHERE id=10;

验证:dump真实完全没受并发修改影响,拿到的是旧值

实测 · 本机执行输出
dump开始前,id=10真实的balance:1000.00
(dump进行中,真实并发把它改成了99999,并且真实提交了)
dump完成后,检查导出的SQL文件:
INSERT INTO `accounts` VALUES (10,1000.00,10),(20,1000.00,20),...
→ 真实还是1000.00,完全没有被中途的修改影响

--single-transaction真实让整个dump过程运行在一个REPEATABLE READ事务里,从dump开始的那一刻起,它看到的真实是一份基于MVCC的一致性快照——期间不管有多少并发写入真实提交了,dump读到的永远是它自己事务开始时刻的旧版本数据,这正是本系列前面《MVCC、Undo Log和Read View》验证过的同一套机制在真实备份场景里的应用。

验证:真实把这份dump还原到一个全新的库,数据完全对得上

实测 · 本机执行输出
CREATE DATABASE restore_test;
mysql -u root restore_test < dump.sql;
SELECT COUNT(*) FROM accounts;
→ 8   ← 真实行数完全一致
SELECT * FROM accounts LIMIT 3;
→ 真实内容也完全一致
--single-transaction真实的价值在于它不需要像老式的FLUSH TABLES WITH READ LOCK那样锁住整个库——对InnoDB表来说,dump期间业务真实可以继续正常读写,不会被备份操作阻塞。它真实的前提条件是所有要备份的表都得是事务型引擎(InnoDB),如果库里混有MyISAM这类非事务表,--single-transaction对它们真实不起一致性保护的作用,读到的可能是备份过程中途的中间状态。

分步演示:一致性快照如何扛住并发修改的真实过程

每一步都是本文上面用真实并发操作跑出来的原始结果。

dump进行中的并发修改,真实完全影响不到它
这一步新验证的状态

    本文用到的工具

    • 本机 MySQL 26.7.0(InnoDB),真实的mysqldump --single-transaction + 并发写入测试
    • 延续前面《MVCC、Undo Log和Read View》一篇的真实机制
    京ICP备2026067502号-1京公网安备11010502063487号