Mysqldump --single-transaction 選項解析

一、解析

查看general_log

 

      206 Query    SETSESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

     ##更改隔離級別(採取快照,保證了事務中一致性讀)

      206 Query    START TRANSACTION/*!40100 WITH CONSISTENT SNAPSHOT */

         ##事務開始

      206 Query    UNLOCKTABLES

      206 Init DB  sanguo_single

      206 Query    SAVEPOINTsp

          ##設置保存點

      206 Query    showtables

      206 Query    showtable status like 'achievements'4

      206 Query    SETSQL_QUOTE_SHOW_CREATE=15

      206 Query    SETSESSION character_set_results = 'binary'5

      206 Query    showcreate table `achievements`

          ##獲取表結構

      206 Query    SETSESSION character_set_results = 'utf8'

            ##設置備份參數

      206 Query    showfields from `achievements`

      206 Query    SELECT/*!40001 SQL_NO_CACHE */ * FROM `achievements`6

     ##獲取表的數據

      206 Query    SETSESSION character_set_results = 'binary'

      206 Query    use`sanguo_single`

      206 Query    select@@collation_database

      206 Query    SHOWTRIGGERS LIKE 'achievements'

      206 Query    SETSESSION character_set_results = 'utf8'

      206  Query     ROLLBACK TOSAVEPOINT sp

           ##回滾保存點(撤銷select對於achievements表的影響)

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

## achievements表備份結束,其他表以此類推。可以看出--single-transaction是一張一張表進行備份然後一一進行撤銷select


二、實驗

1. --single-transaction 選項備份時執行dml語句

事務一

show processlist;

事務二

mysqldump --single-transactionsanguo_single >sanguo_single.sql

| 213 | root | localhost | sanguo_single |Query   |     5 | Sending data | SELECT /*!40001SQL_NO_CACHE */ * FROM `player_pve_battles` |

+-----+------+-----------+---------------+---------+-------+--------------+-------------------------------------------------------------+

5 rows in set (0.00 sec)

mysql> delete from player_pve_battles;

Query OK, 52646 rows affected (18.24 sec)


------------

TRANSACTIONS

------------

Trx idcounter 12887

Purgedone for trx's n:o < 12794 undo n:o < 0 state: running but idle

Historylist length 639

LIST OFTRANSACTIONS FOR EACH SESSION:

---TRANSACTION0, not started

MySQLthread id 178, OS thread handle 0x7f61312f1700, query id 48564 localhost rootinit

showengine innodb status

---TRANSACTION12793, not started

MySQLthread id 208, OS thread handle 0x7f608bfff700, query id 39534 localhost rootcleaning up

---TRANSACTION12886, ACTIVE 4 sec starting index read

mysqltables in use 1, locked 1

20188lock struct(s), heap size 1799720, 64197 row lock(s)

MySQL thread id 210, OS thread handle 0x7f613122e700, queryid 48563 localhost root updating   ###Delete沒有被鎖住,然後他對player_pve_battles加了個鎖。

deletefrom player_pve_battles

---TRANSACTION12792, ACTIVE 625 sec

MySQLthread id 207, OS thread handle 0x7f61312b0700, query id 39535 localhost rootcleaning up

Trx read view will not see trx with id >= 12793, sees< 12793


2. --single-transaction 選項備份時執行ddl語句

事務一事務二
mysqldump --single-transactionsanguo_single >sanguo_single.sql

mysql> drop table player_pve_battles;

^CCtrl-C -- sending "KILL QUERY210" to server ...

Ctrl-C -- query aborted.

ERROR 1317 (70100): Query execution wasinterrupted


結論:因爲-single-transaction選項備份時涉及到的是select語句,所以dml語句是被允許的,ddl不被允許直到回滾保存點撤銷select 語句


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章