大家好,我是anyux。本文介紹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號
查看GTID文件
server-uuid=xxx:TID
GTID文件默認存儲到數據目錄下的auto.cnf文件中
重啟服務後,會自動生成新的文件。但是不要隨意刪除、修改此文件
<code> cd /data/mysql/data
cat auto.cnf/<code>
TID是一個自動增長的數字,從1開始增長
GTID的冪等性
如果使用開戶GTID的日誌去恢復數據,會查看當前系統是否有GTIDk號,有相同的會自動跳過,冪等性會影響二進制日誌的對數據的恢復和主從複製
GTID開啟和配置
在配置文件加入兩條配置,配置修改後,重啟數據庫。
<code> vim /etc/my.cnf
開啟gtid模式
gtid-mode=on
強制gtid一致性
enforce-gtid-consistency=true/<code>
注意,GTID開啟後,只對開啟後的事務做記錄,之前的事務,沒有記錄.
查看GTID信息
創建數據庫並查看開啟GTID後,二進制日誌的記錄信息
<code> show master status;
create database gtid charset utf8mb4;
show master status;/<code>
通過上圖可以看出,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>
上圖看到,對於建表建庫語句,每次執行都會有一個GTID號被創建,對於DML語句,只有在commit提交事務後,才會創建新的事務號
查看二進制日誌詳細信息
<code> show binlog events in 'log-bin.000007';/<code>
在上圖的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>
上圖為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>
上圖將sql語句排序輸出
找到上面語句耗時最多的進行分析,比如下面的語句
<code> select num,k1 from t100w where num !=N order by k1 limit N;/<code>
可以將N替換為相應的數字,進行查看,明顯使用!=號是不會走索引的
對於這個語句,通過執行計劃分析,查看索引使用情況,在此基礎上進行創建索引。或者與開發人員溝通,優化sql語句
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹運維、數據庫相關的技術,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章。
閱讀更多 anyux1 的文章