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日志显示如下:

-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=196;

正常备份流程图解

  • 没有加 --single-transaction 和 --master_data  参数执行流程

fb223801a0752690887ae2d931a4a63a.png
  • 加了--single-transaction 和 --master_data 参数执行流程

c3d5b8d2115a369ef1238b1ebe0c5295.png

推荐延伸阅读:

  • https://imysql.com/2008_10_24_deep_into_mysqldump_options

Enjoy GreatSQL :)


《深入浅出MGR》视频课程

戳此小程序即可直达B站

或复制链接在浏览器中打开

  • https://www.bilibili.com/medialist/detail/ml1475247782


文章推荐:


点击文末“阅读原文”直达老叶专栏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值