mysqldump针对innodb备份及备份过程分析

使用mysqldump对innodb表进行一致性备份经常在生产环境中使用,简单看下他是怎么工作的。

实验以wangxin库下的t1表为例

首先临时打开general_log来记录mysqldump备份的工作过程,记录到日志进行分析

备份单表

-备份单表
mysqldump -uroot -p --single-transaction --master-data=2 --tables wangxin t1>t1_$(date +%F).sql

--single-transaction  在数据库里面做了一致性快照,基于快照做了dump ,但是如果在备份中存在ALTER TABLE, DROP TABLE, RENAME TABLE,
                      TRUNCATE TABLE,那么一致性快照是不能保护的


metadata lock 元数据锁 当前访问的表是不能进行DDL操作,但是没有被访问的表还是可以进行DDL操作


--master-data=2表示在dump过程中执行show master status记录主库的binlog和pos点,并在dump文件中注释掉这一行;
--master-data=1表示在dump过程中记录主库的binlog和pos点,并在dump文件中不注释掉这一行,即恢复时会执行;


查看日志(添加了个人理解的注释):

#首先要理解一个概念,整个mysqldump的过程是在一个事务中的

2016-12-22T08:10:16.440414Z  443 Connectroot@localhost on  using Socket
2016-12-22T08:10:16.440598Z  443 Query/*!40100 SET @@SQL_MODE='' */
2016-12-22T08:10:16.440701Z  443 Query/*!40103 SET TIME_ZONE='+00:00' */ #时区默认是0


#先执行了flush tables 确定有没有DDL操作,有DDL是执行不下去的,因为DDL操作会自动进行commit,破坏事务的一致性。
2016-12-22T08:10:16.440823Z  443 QueryFLUSH /*!40101 LOCAL */ TABLES


#执行flush tables with read lock给数据库加一个全局读锁。记录当时的master_log_file和master_log_pos点
2016-12-22T08:10:16.441534Z  443 QueryFLUSH TABLES WITH READ LOCK


#设置事务隔离级别RR,这个也是为了保证事务的一致性,确保事务的过程中,有其他线程修改了数据,对dump线程的数据没有影响。
2016-12-22T08:10:16.441661Z  443 QuerySET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ


#设置快照级别,这个步骤是为了进一步巩固RR设置的事务一致性,防止在可重复读的时候,其他线程修改了数据,第一次查询到修改后的数据,开启快照读就可以第一次查询的结果就是事务开始时的数据A,即使这时其他线程将其数据修改为B,查的结果依然是A。
2016-12-22T08:10:16.441747Z  443 QuerySTART TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
#查看gtid
2016-12-22T08:10:16.441873Z  443 QuerySHOW VARIABLES LIKE 'gtid\_mode'


#show master slave status 记录master_log_file和master_log_pos点
2016-12-22T08:10:16.444214Z  443 QuerySHOW MASTER STATUS


2016-12-22T08:10:16.444325Z  443 QueryUNLOCK TABLES
#show master status获取到了pos点,最后执行了unlock操作,解除全局lock,以上这个过程是需要锁表的,但是时间非常短,忽略不计。


2016-12-22T08:10:16.444502Z  443 QuerySELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='wangxin' AND TABLE_NAME IN ('t1'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
2016-12-22T08:10:16.445822Z  443 QuerySELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='wangxin' AND TABLE_NAME IN ('t1')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
2016-12-22T08:10:16.446374Z  443 QuerySHOW VARIABLES LIKE 'ndbinfo\_version'
2016-12-22T08:10:16.448394Z  443 Init DBwangxin
2016-12-22T08:10:16.448477Z  443 QuerySHOW TABLES LIKE 't1' #选择备份表
2016-12-22T08:10:16.448655Z  443 QuerySAVEPOINT sp #创建事务起始点(回滚点)
2016-12-22T08:10:16.448759Z  443 Queryshow table status like 't1' #查看表状态
2016-12-22T08:10:16.448989Z  443 QuerySET SQL_QUOTE_SHOW_CREATE=1
2016-12-22T08:10:16.449077Z  443 QuerySET SESSION character_set_results = 'binary'
2016-12-22T08:10:16.449169Z  443 Queryshow create table `t1` #查看表结构
2016-12-22T08:10:16.449282Z  443 QuerySET SESSION character_set_results = 'utf8'
2016-12-22T08:10:16.449383Z  443 Queryshow fields from `t1` #查看表结构
2016-12-22T08:10:16.449712Z  443 Queryshow fields from `t1` #查看表结构,和上一步进行对比
2016-12-22T08:10:16.451521Z  443 QuerySELECT /*!40001 SQL_NO_CACHE */ * FROM `t1` #获取全表数据,并将数据dump到本地
2016-12-22T08:10:17.477453Z  443 QuerySET SESSION character_set_results = 'binary'
2016-12-22T08:10:17.477568Z  443 Queryuse `wangxin`
2016-12-22T08:10:17.477661Z  443 Queryselect @@collation_database
2016-12-22T08:10:17.477789Z  443 QuerySHOW TRIGGERS LIKE 't1'#查看有没有触发器
2016-12-22T08:10:17.478348Z  443 QuerySET SESSION character_set_results = 'utf8'
2016-12-22T08:10:17.478424Z  443 QueryROLLBACK TO SAVEPOINT sp #回到起始位置
2016-12-22T08:10:17.478506Z  443 QueryRELEASE SAVEPOINT sp #释放回滚点
2016-12-22T08:10:17.575788Z  443 Quit
#最后事务结束,在这个事务中没有修改任何数据,所以不需要进行commit,而我们在log里面也没看到。



你可能感兴趣的:(备份)