真实一边跑mysqldump一边并发修改同一张表,验证--single-transaction的一致性快照到底靠不靠谱,再真实把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开始前,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》验证过的同一套机制在真实备份场景里的应用。
CREATE DATABASE restore_test; mysql -u root restore_test < dump.sql; SELECT COUNT(*) FROM accounts; → 8 ← 真实行数完全一致 SELECT * FROM accounts LIMIT 3; → 真实内容也完全一致
每一步都是本文上面用真实并发操作跑出来的原始结果。