#万答10:mysqldump 是如何实现一致性备份的
万答10:mysqldump 是如何实现一致性备份的
实验场景
MySQL 8.0.25
InnoDB
实验步骤:
先开启 general_log 观察导出执行过程的变化
set global general_log=ON;
mysqldump 关键参数说明:
--single-transaction 参数说明:
将隔离级别设为 REPEATABLE READ , 并开启一个只读事务,该事务中会进行一致性快照读,这个选项对InnoDB的数据表有效,但是不能保证MyISAM表和MEMORY表的数据一致性,dump 操作期间会先关闭所有打开的表,并产生FTWRL锁 ,然后快速释放FTWRL锁。
general_log 日志显示如下:
FLUSH /*!40101 LOCAL */ TABLES
FLUSH TABLES WITH READ LOCK
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
如果这时候当前的数据库已经有表锁,那么dump操作会被堵塞,直到先前的表锁被释放后继续执行;或者超过锁定时间 lock_wait_timeout 后退出。
下面是先模拟执行了 LOCK TABLES t_user READ; 操作后,dump操作被堵塞的情况。
(Sun Nov 21 06:42:07 2021)[root@GreatSQL][(none)]>show processlist;
+----+-----------------+-----------+------+---------+-------+-------------------------+--------------------------------+----------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Time_ms | Rows_sent | Rows_examined |
+----+-----------------+-----------+------+---------+-------+-------------------------+--------------------------------+----------+-----------+---------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 77523 | Waiting on empty queue | NULL | 77523235 | 0 | 0 |
| 11 | root | localhost | test | Sleep | 266 | | NULL | 266664 | 0 | 0 |
| 14 | root | localhost | NULL | Query | 263 | Waiting for table flush | FLUSH /*!40101 LOCAL */ TABLES | 263751 | 0 | 0 |
| 17 | root | localhost | NULL | Query | 0 | init | show processlist | 0 | 0 | 0 |
+----+-----------------+-----------+------+---------+-------+-------------------------+--------------------------------+----------+-----------+---------------+
4 rows in set (0.00 sec)
--master_data=1|2 参数说明:
执行 show master status\G; 获取binlog文件和position值,区别在于参数设置为2,导出的内容被注释了。
general_log日志显示如下:
正常备份流程图解
- 正常备份流程图解
没有加 --single-transaction 和 --master_data 参数执行流程
- 加了--single-transaction 和 --master_data 参数执行流程
推荐延伸阅读:
Enjoy GreatSQL 😃
文章推荐:
技术分享 | MGR最佳实践(MGR Best Practice)
https://mp.weixin.qq.com/s/66u5K7a9u8GcE2KPn4kCaA
技术分享 | 万里数据库MGR Bug修复之路
https://mp.weixin.qq.com/s/IavpeP93haOKVBt7eO8luQ
Macos系统编译percona及部分函数在Macos系统上运算差异
https://mp.weixin.qq.com/s/jAbwicbRc1nQ0f2cIa_2nQ
技术分享 | 利用systemd管理MySQL单机多实例
https://mp.weixin.qq.com/s/iJjXwd0z1a6isUJtuAAHtQ
产品 | GreatSQL,打造更好的MGR生态
https://mp.weixin.qq.com/s/ByAjPOwHIwEPFtwC5jA28Q
产品 | GreatSQL MGR优化参考
https://mp.weixin.qq.com/s/5mL_ERRIjpdOuONian8_Ow
关于 GreatSQL
GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/GreatSQL
GitHub:
https://github.com/GreatSQL/GreatSQL
微信&QQ群:
可扫码添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群,亦可直接扫码加入GreatSQL/MGR交流QQ群。
本文由博客一文多发平台 OpenWrite 发布!