您好,登錄后才能下訂單哦!
MySQL中的mysqldump,真是一個經(jīng)典而有效的工具,經(jīng)常用,但是不知道后臺運(yùn)行的過程中到底在干些什么,其實(shí)如果想得到這些基本的信息不一定要去看代碼,我們通過日志的方式就能一窺其中的奧妙。
如果想看到里面的一些較為細(xì)節(jié)的日志,開個general log就可以了。至于性能不用太擔(dān)心,general log我們隨開隨關(guān)。
在不同的版本中也有一些差別,我選擇的是MySQL 5.7.13的版本,簡單看了下里面的日志。
首先這個環(huán)境的事務(wù)隔離級別我選擇的是RC.
# mysqladmin var|grep isol
| tx_isolation | READ-COMMITTED
導(dǎo)出的時候,用了下面的命令導(dǎo)出:
mysqldump --single-transaction --databases mobile_billing > test.sql
得到的日志如下,我們來選擇性的解讀一下。
Query /*!40100 SET @@SQL_MODE='' */
Query /*!40103 SET TIME_ZONE='+00:00' */
這里需要注意mysqldump會默認(rèn)把隔離級別改為RR,然后開啟的事務(wù)是有consistent snapshot選項(xiàng),這個選項(xiàng)只對RR隔離級別有效。
Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
因?yàn)殚_啟了GTID,這里就會按照這個規(guī)則來,后面導(dǎo)出的數(shù)據(jù)都是以這個GTID的事務(wù)為基準(zhǔn)。
Query SELECT @@GLOBAL.GTID_EXECUTED
Query UNLOCK TABLES
下面考慮了存儲的差異性,比如undo,通用表空間等,在這個環(huán)境中暫時沒用,所以結(jié)果都是空。
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
考慮了分區(qū)的影響范圍
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
下面是要導(dǎo)出數(shù)據(jù)的步驟了,會在開始的時候設(shè)定一個savepoint,然后導(dǎo)出表中的數(shù)據(jù),完成之后,rollback到之前的save point點(diǎn)位,繼續(xù)導(dǎo)出下一個表,直到完成,會釋放savepoint,這樣一來得到的數(shù)據(jù)就是基于同一個基準(zhǔn)了。
Query SHOW VARIABLES LIKE 'ndbinfo\_version'
Init DB mobile_billing
得到建庫語句,默認(rèn)沒有添加if not exists的選項(xiàng)。
Query SHOW CREATE DATABASE IF NOT EXISTS `mobile_billing`
開啟save point
Query SAVEPOINT sp
得到指定庫下的數(shù)據(jù)表列表
Query show tables
循環(huán)列表,得到表的狀態(tài),以便進(jìn)一步處理。
Query show table status like 'open\_sdk\_doc\_version'
sql_quote_show_create這個采納數(shù)有兩個值(1,0),默認(rèn)是1,表示表名和列名會用``包著的。 這個服務(wù)器參數(shù)只可以在session級別設(shè)置,不支持global設(shè)置的(不支持my.cnf設(shè)置)
Query SET SQL_QUOTE_SHOW_CREATE=1
Query SET SESSION character_set_results = 'binary'
得到建表語句,默認(rèn)沒有添加if not exists的選項(xiàng)。
Query show create table `open_sdk_doc_version`
設(shè)定字符集
Query SET SESSION character_set_results = 'utf8'
得到字段信息
Query show fields from `open_sdk_doc_version`
Query show fields from `open_sdk_doc_version`
得到的數(shù)據(jù)會是insert into的形式,其中sql_no_cache的作用是避免查詢結(jié)果緩存
Query SELECT /*!40001 SQL_NO_CACHE */ * 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
。。。
繼續(xù)下一個表
直到完成,就會釋放save point
Query ROLLBACK TO SAVEPOINT sp
Query RELEASE SAVEPOINT sp
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。