對於想入門或者初級,中級mysql資料庫運維人員,了解mysqldump對mysql資料庫的影響,是非常必要的,當執行mysqldump命令之後,mysql後臺執行了什麼,下面就帶大家看看,在這裡使用general_log進行分析
1.首先的開啟資料庫的general_log,如下所示
[root@localhost] 17:30:41 [(none)]>show variables like &39;;+------------------+---------------------------------+| Variable_name | Value |+------------------+---------------------------------+| general_log | OFF || general_log_file | /data/mysql/data/3306/mysql.log |+------------------+---------------------------------+2 rows in set (0.00 sec)開啟general_log[root@localhost] 17:41:40 [(none)]>set global general_log=on;Query OK, 0 rows affected (0.42 sec)[root@localhost] 17:41:50 [(none)]>show variables like &39;;+------------------+---------------------------------+| Variable_name | Value |+------------------+---------------------------------+| general_log | ON || general_log_file | /data/mysql/data/3306/mysql.log |+------------------+---------------------------------+2 rows in set (0.00 sec)
2.執行mysqldump備份命令
mysqldump --socket=/data/mysql/run/3306/mysql.sock --skip-tz-utc --all-databases --single-transaction -ER -u root -proot> db_script.sql
執行之後,看看general_log的內容
2020-08-20T17:44:58.473668+08:00 6 Connect root@localhost on using Socket2020-08-20T17:44:58.473911+08:00 6 Query /*!40100 SET @@SQL_MODE=&39; */2020-08-20T17:44:58.474234+08:00 6 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ2020-08-20T17:44:58.474325+08:00 6 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */2020-08-20T17:44:58.474514+08:00 6 Query SHOW VARIABLES LIKE &39;2020-08-20T17:44:58.478784+08:00 6 Query SELECT @@GLOBAL.GTID_EXECUTED2020-08-20T17:44:58.478972+08:00 6 Query UNLOCK TABLES
備份命令首先設置會話的隔離級別為RR,然後開始設置事物一致性快照,看到這裡,有同學會問,為什麼後臺沒有執行FTWRL(flush table with read lock),這是因為備份的時候沒有添加--master-data參數,那看看添加這個參數之後,會有什麼不同呢
mysqldump --socket=/data/mysql/run/3306/mysql.sock --master-data=2 --skip-tz-utc --all-databases --single-transaction -ER -u root -proot> db_script.sql
再次看看general_log的內容
2020-08-20T17:52:33.612990+08:00 7 Connect root@localhost on using Socket2020-08-20T17:52:33.613504+08:00 7 Query /*!40100 SET @@SQL_MODE=&39; */2020-08-20T17:52:33.614493+08:00 7 Query FLUSH /*!40101 LOCAL */ TABLES2020-08-20T17:52:33.617383+08:00 7 Query FLUSH TABLES WITH READ LOCK2020-08-20T17:52:33.617559+08:00 7 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ2020-08-20T17:52:33.617628+08:00 7 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */2020-08-20T17:52:33.617804+08:00 7 Query SHOW VARIABLES LIKE &39;2020-08-20T17:52:33.625696+08:00 7 Query SELECT @@GLOBAL.GTID_EXECUTED2020-08-20T17:52:33.625876+08:00 7 Query SHOW MASTER STATUS2020-08-20T17:52:33.626051+08:00 7 Query UNLOCK TABLES
這裡就會發現,多了2個操作
FLUSH /*!40101 LOCAL */ TABLES
FLUSH TABLES WITH READ LOCK
這是因為添加--master-data參數,是表示從複製的主庫上導出備份,可以利用此 備份文件直接建立另一個複製從庫,FLUSH TABLES WITH READ LOCK主要用於備份工具獲取一致性備份(數據與binlog位點匹配 )。
在這裡非常有必要了解一下FLUSH TABLES WITH READ LOCK,因為操作不好,所有DML,DDL,for Update都會被堵塞,造成業務無法做任何操作
FTWRL主要包括3個步驟:
1.上全局讀鎖(lock_global_read_lock)
2.清理表緩存(close_cached_tables)
3.上全局COMMIT鎖(make_global_read_lock_block_commit)
在第一個步驟中,由於上的是全局讀鎖,他會堵塞所有的DML,DDL,for Update操作,但是這一步非常快,業務感覺不到
在第二個步驟中,清理表緩存,在這裡需要注意了,如果有一個慢查詢,FTWRL就會被堵塞了,而且,涉及的表上所有的操作,是所有的操作,包括select,都會被堵塞,而且現在就算終止mysqldump備份命令,堵塞也不會解除,除非你kill掉慢查詢語句,所以在凌晨做備份的同學,可以要注意了
在第三個操作中,會申請全局commit鎖,如果這個時候有大事物,長時間沒有提交,FTWRL就會被堵塞了
綜上所述,在執行mysqldump命令之前,先檢查一下,資料庫中是否有慢sql,長時間未提交的大事物。