MySQL的GTID和慢日誌

​大家好,我是anyux。本文介紹MySQL的GTID和慢日誌。


MySQL的GTID和慢日誌

binlog的gtid記錄模式管理

GTID簡介

從5.7開始,建議將二進制日誌模式改為GTID模式。GTID模式不僅用在主從複製中,在單機模式中也有。一旦開啟了GTID,它的管理方式就發生了改變。


沒有GTID時,二進制日誌按事件來規劃事務。要找到完整的事務,就需要找到Pos開始值,找到 End_log_pos結束值,然後導出到sql文件,再恢復數據。

開啟GTID後,對於每一個獨立的"事務",都會生一個GTID號碼


需要注意的是,此處的"事務"與innodb的事務有所區別

對於DDL、DCL,一個event就是一個事務,就會有一個GTID號

對於DML,就是從begin到commit就是一個事務,也會有一個GTID號

MySQL的GTID和慢日誌

查看GTID文件

server-uuid=xxx:TID

GTID文件默認存儲到數據目錄下的auto.cnf文件中

重啟服務後,會自動生成新的文件。但是不要隨意刪除、修改此文件

<code> cd /data/mysql/data
 cat auto.cnf/<code>
MySQL的GTID和慢日誌

TID是一個自動增長的數字,從1開始增長

GTID的冪等性

如果使用開戶GTID的日誌去恢復數據,會查看當前系統是否有GTIDk號,有相同的會自動跳過,冪等性會影響二進制日誌的對數據的恢復和主從複製

GTID開啟和配置

在配置文件加入兩條配置,配置修改後,重啟數據庫。

<code> vim /etc/my.cnf
 開啟gtid模式
 gtid-mode=on
 強制gtid一致性
 enforce-gtid-consistency=true/<code>

注意,GTID開啟後,只對開啟後的事務做記錄,之前的事務,沒有記錄.

MySQL的GTID和慢日誌

查看GTID信息

創建數據庫並查看開啟GTID後,二進制日誌的記錄信息

<code> show master status;
 create database gtid charset utf8mb4;
 show master status;/<code>
MySQL的GTID和慢日誌

通過上圖可以看出,Executed_Gtid_Set列出現了新的記錄值,這表明GTID記錄已被寫入到二進制日誌中

<code> use gitd; 

 創建數據表
 create table gtid_01(id int);
 查看GITD信息
 show master status;
 插入數據
 insert into gtid_01(1);
 查看GITD信息
 show master status;
 提交事務
 commit;
 查看GITD信息
 show master status;/<code>
MySQL的GTID和慢日誌

上圖看到,對於建表建庫語句,每次執行都會有一個GTID號被創建,對於DML語句,只有在commit提交事務後,才會創建新的事務號

查看二進制日誌詳細信息

<code> show binlog events in 'log-bin.000007';/<code>
MySQL的GTID和慢日誌

在上圖的Info列中,可以看到如下內容

<code> SET @@SESSION.GTID_NEXT= '87031e16-4413-11ea-bb11-000c2922081d:1'/<code>

結尾的":1"就是GTID號,有了這個號,就可以很快實現數據恢復。能發現這裡的1到3號,就對應的上面的建庫、建表、插入操作

刪除數據庫

<code> drop database gtid;/<code>

基於GTID的數據恢復

導出二進制日誌到sql文件

參數include-gtids,表明已經開啟gtid模式參數skip-gtids,在導出時,忽略原有的gtid信息,恢復時生成最新的gtid信息參數exclude-gtids 排序指定的gtid對於不連續的gtid,排除多個gtid方式為

--exclude-gtids='87031e16-4413-11ea-bb11-000c2922081d:1','87031e16-4413-11ea-bb11-000c2922081d:3',

<code> cd /data/mysql
 
 mysqlbinlog --skip-gtids --include-gtids='87031e16-4413-11ea-bb11-000c2922081d:1-3' log-bin.000007 >/tmp/gtid.sql/<code>

設置臨時會話狀態

注意,恢復數據,暫停數據庫記錄二進制日誌。原因是,恢復數據的過程不需要再次被記錄

<code> set sql_log_bin=0;/<code>

恢復數據

<code> source /tmp/gtid.sql;/<code>

設置臨時會話狀態

<code> set sql_log_bin=1;/<code>

查看數據

<code> use gtid;
 select * from gtid_01;/<code>

慢日誌(slow-log)

記錄運行較慢的日誌,優化過程中常用的工具日誌

參數名稱參數解釋slow_query_log1慢日誌開關slow_query_log_file/data/mysql/slow.log文件位置及名稱long_query_time0.1設定慢查詢時間log_queries_not_using_idexes無沒有走索引的語句也記錄

修改日誌文件後,需要重啟數據庫服務

<code> vim /etc/my.cnf
 慢日誌開關
 slow_query_log=1
 慢日誌存儲位置
 slow_query_log_file=/data/mysql/slow.log
 慢查詢閥值
 long_query_time=0.1
 記錄未走索引的日誌
 log_queries_not_using_indexes/<code>

查詢慢語句閥值

<code> select @@long_query_time;/<code>

模擬慢查詢

<code> use test;
 select num,k1 from t100w where num !=0 order by k1 limit 10;
 select num,k1 from t100w where num !=10 order by k1 limit 100;
 select num,k1 from t100w where num >1000 order by k1 limit 100;
 select num,k1 from t100w where num >10000 order by k1 limit 10000;
 select num,k1 from t100w where num !=1000 order by k1 limit 100;
 select num,k1 from t100w where num !=10 order by k1 limit 10000;
 select * from t100w where num !=10 order by k1 limit 100,300;
 select * from t100w where num !=0 order by k1 limit 100,3000;
 select * from t100w where num >1 order by k1 limit 10000,30000;
 select * from t100w where k1="s" order by k1 limit 10000,30000;
 select * from t100w where k1="s" order by k1 limit 1000,3000;
 select num,k1 from t100w where k1="s" order by k1 limit 1000,3000;
 select num,k1 from t100w where k1="s" order by k1 limit 10000,30000;
 select num,k1 from t100w where k1="0" order by k1 limit 10000,30000;

 select num,k1 from t100w where k1 like "%1%" order by k1 limit 10000,30000;
 select num,k1 from t100w where k1 like "%2%" order by k1 limit 10000,30000;/<code>

查看慢日誌

慢日誌是一個文件文件,可以使用vim等工具打開

<code> cd /data/mysql
 vim slow.log/<code>
MySQL的GTID和慢日誌

上圖為slow.log慢日誌的內容,上面顯示的sql語句都是運行時間超閥值或是沒走索引語句

Query_time表示查詢消耗時間,單位是秒。這些sql語句是按sql執行的時間順序來記錄的,沒有一對於消耗時間排序。需要使用到工具,輔助查看


分析慢日誌

mysqldumpslow是mysql自帶的慢日誌處理工具,其中s參數表示排序,c表示次數,t 10表示前10位

<code> mysqldumpslow -s c -t 10 /data/mysql/slow.log/<code>
MySQL的GTID和慢日誌

上圖將sql語句排序輸出

找到上面語句耗時最多的進行分析,比如下面的語句

<code> select num,k1 from t100w where num !=N order by k1 limit N;/<code>

可以將N替換為相應的數字,進行查看,明顯使用!=號是不會走索引的

對於這個語句,通過執行計劃分析,查看索引使用情況,在此基礎上進行創建索引。或者與開發人員溝通,優化sql語句

MySQL的GTID和慢日誌

歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹運維、數據庫相關的技術,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章。


分享到:


相關文章: