mysqldump简单解析
MySQL中的mysqldump,真是一个经典而有效的工具,经常用,但是不知道后台运行的过程中到底在干些什么,其实如果想得到这些基本的信息不一定要去看代码,我们通过日志的方式就能一窥其中的奥妙。
如果想看到里面的一些较为细节的日志,开个general log就可以了。至于性能不用太担心,general log我们随开随关。
在不同的版本中也有一些差别,我选择的是MySQL 5.7.13的版本,简单看了下里面的日志。
首先这个环境的事务隔离级别我选择的是RC.
# mysqladmin var|grep isol
| tx_isolation | READ-COMMITTED
导出的时候,用了下面的命令导出:
mysqldump --single-transaction --databases mobile_billing > test.sql
得到的日志如下,我们来选择性的解读一下。
Query
Query
这里需要注意mysqldump会默认把隔离级别改为RR,然后开启的事务是有consistent snapshot选项,这个选项只对RR隔离级别有效。
Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
Query START TRANSACTION
因为开启了GTID,这里就会按照这个规则来,后面导出的数据都是以这个GTID的事务为基准。
Query SELECT @@GLOBAL.GTID_EXECUTED
Query UNLOCK TABLES
下面考虑了存储的差异性,比如undo,通用表空间等,在这个环境中暂时没用,所以结果都是空。
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 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 IN ('mobile_billig'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE, EXTRA ORDER BY LOGFILE_GROUP_NAME
考虑了分区的影响范围
Query SELECT 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 IN ('mobile_billig')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
下面是要导出数据的步骤了,会在开始的时候设定一个savepoint,然后导出表中的数据,完成之后,rollback到之前的save point点位,继续导出下一个表,直到完成,会释放savepoint,这样一来得到的数据就是基于同一个基准了。
Query SHOW VARIABLES LIKE 'ndbinfo\_version'
Init DB mobile_billing
得到建库语句,默认没有添加if not exists的选项。
Query SHOW CREATE DATABASE IF NOT EXISTS `mobile_billing`
开启save point
Query SAVEPOINT sp
得到指定库下的数据表列表
Query show tables
循环列表,得到表的状态,以便进一步处理。
Query show table status like 'open\_sdk\_doc\_version'
sql_quote_show_create这个采纳数有两个值(1,0),默认是1,表示表名和列名会用``包着的。 这个服务器参数只可以在session级别设置,不支持global设置的(不支持my.cnf设置)
Query SET SQL_QUOTE_SHOW_CREATE=1
Query SET SESSION character_set_results = 'binary'
得到建表语句,默认没有添加if not exists的选项。
Query show create table `open_sdk_doc_version`
设定字符集
Query SET SESSION character_set_results = 'utf8'
得到字段信息
Query show fields from `open_sdk_doc_version`
Query show fields from `open_sdk_doc_version`
得到的数据会是insert into的形式,其中sql_no_cache的作用是避免查询结果缓存
Query SELECT * FROM `open_sdk_doc_version`
Query SET SESSION character_set_results = 'binary'
Query show create table `open_sdk_doc_version`
Query SET SESSION character_set_results = 'utf8'
Query ROLLBACK TO SAVEPOINT sp
。。。
继续下一个表
直到完成,就会释放save point
Query ROLLBACK TO SAVEPOINT sp
Query RELEASE SAVEPOINT sp
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341