GreatSQL社区

搜索

mysqldump 获得一致性快照执行了哪些操作?

2479 1 2022-8-18 15:55
mysqldump 获得一致性快照执行了哪些操作?
全部回复(1)
GreatSQL万答 2022-8-18 16:01:52
实验场景
MySQL 8.0.25 InnoDB

实验步骤
先开启 general_log 观察导出执行过程的执行情况
  1. set global general_log=ON;
复制代码
mysqldump 关键参数说明:
--single-transaction  参数说明:
将隔离级别设为 REPEATABLE READ , 并开启一个只读事务,该事务中会进行一致性快照读,这个选项对InnoDB的数据表有效,但是不能保证MyISAM表和MEMORY表的数据一致性,dump 操作期间会先关闭所有打开的表,并产生FTWRL锁 ,然后快速释放FTWRL锁。
general_log 日志显示如下:
  1. FLUSH /*!40101 LOCAL */ TABLES
  2. FLUSH TABLES WITH READ LOCK
  3. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
  4. START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
复制代码
如果这时候当前的数据库已经有表锁,那么dump操作会被堵塞,直到先前的表锁被释放后继续执行;或者超过锁定时间 lock_wait_timeout 后退出。
下面是先模拟执行了 LOCK TABLES t_user READ; 操作后,dump操作被堵塞的情况。
  1. (Sun Nov 21 06:42:07 2021)[root@GreatSQL][(none)]>show processlist;
  2. +----+-----------------+-----------+------+---------+-------+-------------------------+--------------------------------+----------+-----------+---------------+
  3. | Id | User            | Host      | db   | Command | Time  | State                   | Info                           | Time_ms  | Rows_sent | Rows_examined |
  4. +----+-----------------+-----------+------+---------+-------+-------------------------+--------------------------------+----------+-----------+---------------+
  5. |  5 | event_scheduler | localhost | NULL | Daemon  | 77523 | Waiting on empty queue  | NULL                           | 77523235 |         0 |             0 |
  6. | 11 | root            | localhost | test | Sleep   |   266 |                         | NULL                           |   266664 |         0 |             0 |
  7. | 14 | root            | localhost | NULL | Query   |   263 | Waiting for table flush | FLUSH /*!40101 LOCAL */ TABLES |   263751 |         0 |             0 |
  8. | 17 | root            | localhost | NULL | Query   |     0 | init                    | show processlist               |        0 |         0 |             0 |
  9. +----+-----------------+-----------+------+---------+-------+-------------------------+--------------------------------+----------+-----------+---------------+
  10. 4 rows in set (0.00 sec)
复制代码
--master_data=1|2  参数说明:
执行 show master status\G;  获取binlog文件和position值,区别在于参数设置为2,导出的内容被注释了。
general_log日志显示如下:
  1. -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=196;
复制代码
正常备份流程图解
  • 没有加 --single-transaction 和 --master_data  参数执行流程

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

12.png
推荐延伸阅读:
https://imysql.com/2008_10_24_deep_into_mysqldump_options

GreatSQL万答

22

主题

0

博客

73

贡献

版主

Rank: 7Rank: 7Rank: 7

积分
117

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-11-21 17:18 , Processed in 0.022485 second(s), 16 queries , Redis On.
快速回复 返回顶部 返回列表