[轉帖]MySQLdump之single-transaction詳解

 

作者:@張扶搖
本文爲作者原創,轉載請註明出處:https://www.cnblogs.com/zhangshengdong/p/9196128.html


目錄

MySQLdump之single-transaction詳解
single-transaction
保存點的日誌分析
查看當前會話級別
導出文件的字符集類型

MySQLdump之single-transaction詳解

single-transaction

  • 開啓general log選項
  1. 查看目前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)
  1. 開啓general log的選項
mysql> set global general_log=on;
  1. 使用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


感謝您的閱讀,如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕。本文歡迎各位轉載,但是轉載文章之後必須在文章頁面中給出作者和原文連接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章