作者:@張扶搖
本文爲作者原創,轉載請註明出處:https://www.cnblogs.com/zhangshengdong/p/9196128.html
目錄
MySQLdump之single-transaction詳解
single-transaction
保存點的日誌分析
查看當前會話級別
導出文件的字符集類型
MySQLdump之single-transaction詳解
single-transaction
- 開啓general log選項
- 查看目前general log的情況
mysql> show variables like '%general_log%';
+------------------+--------------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------------+
| general_log | OFF |
| general_log_file | /data/mysqldata/3306/general_statement.log |
+------------------+--------------------------------------------+
2 rows in set (0.00 sec)
- 開啓general log的選項
mysql> set global general_log=on;
- 使用mysqldump命令:。
[mysql@racnode1 ~]$ /usr/local/mysql/bin/mysqldump -uroot -p'zsd@7101' -S /data/mysqldata/3306/mysql.sock --single-transaction --default-character-set=utf8 zdemo student > /tmp/studentbackup.sql
其中使用了兩個參數
-
--single-transaction
此選項會將隔離級別設置爲:REPEATABLE READ。並且隨後再執行一條START TRANSACTION語句,讓整個數據在dump過程中保證數據的一致性,這個選項對InnoDB的數據表很有用,且不會鎖表。但是這個不能保證MyISAM表和MEMORY表的數據一致性。
爲了確保使用--single-transaction
命令時,保證dump文件的有效性。需沒有下列語句ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE
,因爲一致性讀不能隔離上述語句。所以如果在dump過程中,使用上述語句,可能會導致dump出來的文件數據不一致或者不可用。
如何驗證上述的過程呢,可以開啓general log看看過程是否如上述所說。 -
--default-character-set=utf8
導出的dump文件字符集爲uft8,檢驗文件字符集的命令可以使用file -i
通用查詢日誌文件如下:
2018-06-18T11:42:31.035205Z 9163 Query /*!40100 SET @@SQL_MODE='' */
2018-06-18T11:42:31.036090Z 9163 Query /*!40103 SET TIME_ZONE='+00:00' */
2018-06-18T11:42:31.036905Z 9163 Query /*!80000 SET SESSION information_schema_stats_expiry=0 */
2018-06-18T11:42:31.037521Z 9163 Query SET SESSION NET_READ_TIMEOUT= 700, SESSION NET_WRITE_TIMEOUT= 700
2018-06-18T11:42:31.038398Z 9163 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2018-06-18T11:42:31.038977Z 9163 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2018-06-18T11:42:31.039859Z 9163 Query SHOW VARIABLES LIKE 'gtid\_mode'
2018-06-18T11:42:31.058093Z 9163 Query UNLOCK TABLES
中間日誌省略
......
2018-06-18T11:42:31.084432Z 9163 Query SAVEPOINT sp
2018-06-18T11:42:31.087632Z 9163 Query show create table `student`
2018-06-18T11:42:31.088094Z 9163 Query SET SESSION character_set_results = 'utf8'
2018-06-18T11:42:31.088407Z 9163 Query show fields from `student`
2018-06-18T11:42:31.092360Z 9163 Query show fields from `student`
2018-06-18T11:42:31.094718Z 9163 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `student`
2018-06-18T11:42:32.815435Z 9163 Query ROLLBACK TO SAVEPOINT sp
2018-06-18T11:42:32.815546Z 9163 Query RELEASE SAVEPOINT sp
從上述日誌分析:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ 設置隔離級別爲REPEATABLE READ
START TRANSACTION 開啓了事務
事務的實現是通過InnoDB存儲引擎的MVCC機制事項,細節如下:InnoDB是一個多版本控制的存儲引擎。它可以對已修改的行保留一箇舊版本的數據信息。用於支持事務特性。例如:併發和數據回滾。這個信息保留在數據結構中的表空間中,這個表空間稱之爲rollback segment回滾段。(在Oracle中也有一種類似的數據結構)。
當事務需要回滾的時候,InnoDB會使用回滾段的信息,用於執行undo操作。對於某一行,InnoDB會用早先版本的信息來保障讀一致性(consistent read)。
Undo日誌在回滾段(rollback segment)中被分爲兩部分,一部分叫做插入undo日誌(insert undo logs),另外一部分叫做更新undo日誌(update undo logs)。插入undo日誌只用於事務回滾,如事務一旦提交,那麼日誌就可以被丟棄。更新undo日誌用在讀一致性,InnoDB會指定一個數據快照,這個快照的構建來自於更新undo日誌中數據行的早期版本。通過數據行早期版本的快照來保證讀一致性,如果不需要這種事務數據保護的時候,這個日誌可以被丟棄。
保存點的日誌分析
SAVEPOINT SP
......中間日誌省略...
SELECT /*!40001 SQL_NO_CACHE */ * FROM `student`
......中間日誌省略...
ROLLBACK TO SAVEPOINT sp
RELEASE SAVEPOINT sp
可以看到通過REPEATABLE READ事務,保證數據一致性數據,然後
設置保存點sp,當讀取了所有數據的快照,就回退這個保存點sp。可以比喻爲遊戲中存檔之後,然後取檔備份成一個遊戲外的文件,刪除這個檔。可以當作這個檔在這個遊戲內不存在。
查看當前會話級別
## 會話級當前事務級別
mysql> show variables like '%isolation%';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.03 sec)
## 系統全局級當前事務級別
mysql> show global variables like '%isolation%';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ
+-----------------------+-----------------+
1 row in set (0.11 sec)
## 修改全局級事務級別
mysql>set global transaction_isolation='read-committed'
就算修改了全局事務級別,Mysqldump導出時也會設定隔離事務級別爲:REPEATABLE READ。用於保證數據的讀一致性。
導出文件的字符集類型
[mysql@racnode1 tmp]$ file -i studentbackup.sql
studentbackup.sql: text/plain; charset=utf-8
感謝您的閱讀,如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕。本文歡迎各位轉載,但是轉載文章之後必須在文章頁面中給出作者和原文連接。