mysql常用备份工具:
1、MySQLdump、MySQLpump(逻辑备份)
2、xtrbackup(热备份)
MySQLdump解析:
1、打开general_log:
show variables like 'general_log';
set general_log = 1;
2、执行一次全备份:
mysqldump -uroot -p -A -R -E --triggers --single-transaction --master-data=2 > ~/test.sql
--single-transaction:获取到innodb的一致性快照备份。
-R:备份存储过程
-E:备份事件
--triggers:备份触发器
--master-data:生成change master to语句,注释过的
下面来看general_log生成的内容:
第一部分:
2019-04-22T14:02:01.905221+08:00 2 Query show variables like '%gen%'
2019-04-22T14:02:04.129840+08:00 2 Quit
2019-04-22T14:03:28.584978+08:00 3 Connect root@localhost on using Socket
2019-04-22T14:03:28.585361+08:00 3 Query /*!40100 SET @@SQL_MODE='' */
2019-04-22T14:03:28.586368+08:00 3 Query /*!40103 SET TIME_ZONE='+00:00' */
2019-04-22T14:03:28.586926+08:00 3 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2019-04-22T14:03:28.587210+08:00 3 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2019-04-22T14:03:28.588251+08:00 3 Query SHOW VARIABLES LIKE 'gtid\_mode'
2019-04-22T14:03:28.593981+08:00 3 Query SELECT @@GLOBAL.GTID_EXECUTED
2019-04-22T14:03:28.594307+08:00 3 Query UNLOCK TABLES
2019-04-22T14:03:28.595072+08:00 3 Query SELECT 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 GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
2019-04-22T14:03:28.599645+08:00 3 Query SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
2019-04-22T14:03:28.600894+08:00 3 Query SHOW DATABASES
2019-04-22T14:03:28.605142+08:00 3 Query SHOW VARIABLES LIKE 'ndbinfo\_version'
其中重要的几点:
1)SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
设置事物等级为可重复读,避免幻读和不可重复读
2)START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
开启一个事物,并获取当前的快照,对innodb表有效,是由--single-transaction参数控制的
在开始事物的时候,对所有表执行一次select *操作,这样可以保证在备份时的任何时间点进行select * 操作获取到的数据和事物开启时是一致的。
3)SHOW VARIABLES LIKE 'gtid\_mode',SELECT @@GLOBAL.GTID_EXECUTED
检查gitd模式,生成change master to语句
4)UNLOCK TABLES
释放锁
第二部分:
2019-04-22T14:03:29.109716+08:00 3 Init DB test
2019-04-22T14:03:29.109818+08:00 3 Query SHOW CREATE DATABASE IF NOT EXISTS `test`
2019-04-22T14:03:29.109947+08:00 3 Query SAVEPOINT sp
2019-04-22T14:03:29.110109+08:00 3 Query show tables
2019-04-22T14:03:29.110344+08:00 3 Query show table status like 'test'
2019-04-22T14:03:29.111653+08:00 3 Query SET SQL_QUOTE_SHOW_CREATE=1
2019-04-22T14:03:29.111786+08:00 3 Query SET SESSION character_set_results = 'binary'
2019-04-22T14:03:29.111912+08:00 3 Query show create table `test`
2019-04-22T14:03:29.112092+08:00 3 Query SET SESSION character_set_results = 'utf8'
2019-04-22T14:03:29.112229+08:00 3 Query show fields from `test`
2019-04-22T14:03:29.112695+08:00 3 Query show fields from `test`
2019-04-22T14:03:29.113138+08:00 3 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`
2019-04-22T14:03:29.113432+08:00 3 Query SET SESSION character_set_results = 'binary'
2019-04-22T14:03:29.113601+08:00 3 Query use `test`
2019-04-22T14:03:29.113747+08:00 3 Query select @@collation_database
2019-04-22T14:03:29.113887+08:00 3 Query SHOW TRIGGERS LIKE 'test'
2019-04-22T14:03:29.114582+08:00 3 Query SET SESSION character_set_results = 'utf8'
2019-04-22T14:03:29.114717+08:00 3 Query ROLLBACK TO SAVEPOINT sp
2019-04-22T14:03:29.114832+08:00 3 Query RELEASE SAVEPOINT sp
2019-04-22T14:03:29.118072+08:00 3 Quit
过程解析:
1)Init DB test
初始化test库
2)SAVEPOINT sp
对当前的库设置一个保存点
3)show create table `test`,show fields from `test`
生成建表语句
4) SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`
获取到test表的全部数据,并且生成相应的insert语句到文件中
5)SHOW TRIGGERS LIKE 'test'
查看触发器
6)ROLLBACK TO SAVEPOINT sp
如果在执行select * 语句之间的时候有DDL语句,如果不加ROLLBACK TO SAVEPOINT sp语句,会一直hang下去。执行ROLLBACK TO SAVEPOINT sp语句之后,可以执行DDL语句。
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */的提交语句是COMMIT或ROLLBACK,日志里没有是因为MySQLdump在备份完成之后直接断开与mysql的连接,也不会对服务做出任何改变。