1.MySQL常用日誌文件知識 MySQL常用日誌種類: MySQL日誌種類 解釋說明 錯誤日誌(error log) 當資料庫啟動、運行、停止時產生該日誌 普通查詢日誌(general query log) 客戶端連接資料庫執行語句時產生該日誌 二進位日誌(binary log) 當資料庫內容發生 ...
目錄
- 1.MySQL常用日誌文件知識
- 2.錯誤日誌的介紹與配置
- 3.普通查詢日誌的介紹與配置
- 4.二進位日誌的介紹與配置
- 5.慢查詢日誌
1.MySQL常用日誌文件知識
MySQL常用日誌種類:
MySQL日誌種類 | 解釋說明 |
---|---|
錯誤日誌(error log) | 當資料庫啟動、運行、停止時產生該日誌 |
普通查詢日誌(general query log) | 客戶端連接資料庫執行語句時產生該日誌 |
二進位日誌(binary log) | 當資料庫內容發生改變時產生該日誌,也被用來實現主從複製功能 |
中繼日誌(relay log) | 從庫上收到主庫的數據更新時產生該日誌 |
慢查詢日誌(slow query log) | SQL語句在資料庫查詢超過指定時間時產生該日誌 |
DDL日誌(metadata log) | 執行DDL語句操作元數據時產生該目錄 |
預設情況下,以上所有的日誌都處於非激活狀態(Linux環境)。當激活日誌時,所有的日誌都預設配置在數據文件的目錄下。管理員也可以對上述日誌進行輪詢切割,實現該功能常見的命令是mysqladmin flush-logs、mysqldump的“-F”或“--master-data”參數等。
2.錯誤日誌的介紹與配置
2.1.錯誤日誌的介紹
MySQL的錯誤日誌用於記錄MySQL服務進程mysqld在啟動/關閉或運行過程中遇到的錯誤信息。
2.2.錯誤日誌的記錄配置
MySQL的錯誤日誌通常由mysqld或mysqld_safe程式產生。
記錄MySQL錯誤日誌的配置:
1、在my.cnf配置文件中調整,註意,是在[mysqld_safe]模塊的下麵進行配置。
[mysqld_safe]
log-error = /application/mysql-5.6.40/data/oldboy.err
2、在啟動MySQL服務的命令裡加入記錄錯誤日誌的參數。
mysqld_safe --log-error=/application/mysql-5.6.40/data/oldboy.err &
查看結果
mysql> show variables like 'log_error%';
2.3.錯誤日誌輪詢
管理員可以使用命令輪詢錯誤日誌:
cd /application/mysql/data/ #切換到日誌目錄下
mv oldboy.err oldboy_$(date +%F).err #將錯誤日誌按天移動改名
mysqladmin flush-logs #執行刷新日誌命令
2.4.資料庫故障排查
新手安裝資料庫時,遇到資料庫無法啟動時的排查方法:
1、先清空錯誤日誌文件,然後重新啟動MySQL服務,再查看日誌文件報什麼錯誤,並根據錯誤日誌進行處理。
2、如果無法解決,則刪除數據文件,重新初始化資料庫。
在排查故障時,得到的錯誤日誌是:
The error means mysqld does not have the access rights to
the directory.
該錯誤是許可權問題導致的問題,可對數據目錄遞歸執行許可權,然後再重啟資料庫。
chown -R mysql.mysql /application/mysql/data/
3.普通查詢日誌的介紹與配置
3.1.普通查詢日誌的介紹
普通查詢日誌的作用是記錄客戶端連接信息,以及執行的SQL語句信息。
3.2.普通查詢日誌的功能配置
預設情況下普通查詢日誌是關閉狀態:
mysql>show variables like 'general_log%';
可以執行線上修改的命令使其臨時生效:
mysql>set global general_log = on;
mysql>show variables like 'general_log%';
可以把參數寫入my.cnf的配置文件里的[mysqld]模塊下使其永久生效:
general_log = on
general_log_file = /application/mysql-5.6.40/data/oldboy.log
3.3.普通查詢日誌
tail oldboy.log
3.4.普通查詢日誌的生產使用建議
在高併發資料庫的場景下,普通查詢日誌應該是關閉狀態的(預設也是關閉的),主要是因為查詢日誌的信息量很大,容易導致磁碟I/O性能問題。當訪問量不是很大,而企業又有審計執行的SQL語句的需求時,可以考慮開啟該功能。
4.二進位日誌的介紹與配置
4.1.二進位日誌的介紹
二進位日誌的作用是記錄資料庫里的數據被修改的SQL語句,一般為DDL和DML語句,例如含有insert、update、delete、create、drop、alter等關鍵字的語句。
4.2.二進位日誌的作用
二進位日誌最重要的作用有2個。
第一個是記錄MySQL數據的增量數據,用來做增量資料庫恢復,沒有二進位日誌功能,MySQL的備份將無法完整還原數據。
第二個是實現主從複製功能。
4.3.二進位日誌的配置
vi /etc/my.cnf
[mysqld]
log_bin = mysql-bin
show variables like '%log_bin'; #查看binlog是否開啟
實現在開啟binlog功能的前提下,臨時不記錄binlog
set session sql_log_bin = OFF; #臨時停止記錄binlog
create database oldgirl; #建庫測試
show binary logs; #查看binlog文件列表及位置點
system mysqlbinlog mysql-bin.000005|grep "oldgirl" #過濾binlog文件,沒有記錄binlog
set session sql_log_bin = ON; #開啟記錄binlog
drop database oldgirl; #刪除資料庫
system mysqlbinlog mysql-bin.000005|grep "oldgirl" #繼續過濾,發現記錄了binlog
這個功能常用於在用戶使用mysql恢複數據時不希望恢復的數據SQL記錄到binlog里的情況。
4.4.二進位日誌文件的刷新條件
1、資料庫重啟會自動刷新binlog為新文件。
2、執行“mysqldump -F”或“mysqladmin flush-logs”會將binlog刷新為新文件。
3、binlog文件達到1G左右時,會自動刷新binlog為新文件。
4、人為配置切割及調整。
binlog最大值控制參數及預設大小查看方法:
show variables like 'max_binlog_size';
4.5.二進位日誌索引文件
除了很多按序列生產的binlog文件列表之外,還有一個索引文件mysql-bin.index。
索引文件的文件名和binlog文件一樣,只是擴展名為index。
binlog索引文件的控制參數為:
show variables like 'log_bin_index';
4.6.刪除二進位日誌的方法
binlog日誌很重要,不能隨意清除。
首先,要確定什麼時候可以刪除binlog。
理論上每天的資料庫全備時刻以前的binlog都是無用的,但是工作中我們會根據需要保留3-7天的本地binlog文件。
刪除方式:
4.6.1.設置參數自動刪除binlog
參數設置為:
show variables like 'expire_logs_days';
set global expire_logs_days = 7; #設置刪除7天前的日誌
vi /etc/my.cnf
[mysqld]
expire_logs_days = 7
4.6.2.從最開始一直刪除到指定的文件位置(不含指定文件)
這種方法一般用於處理臨時的需求:
cp mysql-bin.* /tmp
登錄到資料庫執行:
show binary logs;
purge binary logs to 'mysql-bin.000002';
show binary logs;
4.6.3.安裝時間刪除binlog日誌
用於處理臨時的需求:
ls -l --time-style=long-iso mysql-bin*
刪除“2020-05-19 10:24”以前的binlog文件:
PURGE MASTER LOGS BEFORE '2020-05-19 10:24';
system ls -l --time-style=long-iso mysql-bin*
4.6.4.清楚所有的binlog,並從000001開始重新記錄
reset master指令可以清楚資料庫所有的binlog文件,並從000001開始重新記錄;
reset master;
system ls -l --time-style=long-iso mysql-bin*;
binlog相關參數的設置和優化思路。
查看binlog相關的參數:
show variables like 'binlog_%';
show variables like '%log_bin%';
4.6.4.1.binlog_cache_size
二進位日誌緩存是資料庫為每一個客戶連接分配的記憶體空間。對於事務引擎來說,適當調整該參數會獲得更好的性能,該參數的預設值為:
show variables like '%binlog_cache%';
4.6.4.2.max_binlog_size
該參數用於設置binlog日誌的最大大小,預設為1G,但是該值並不能嚴格控制binlog的大小。若binlog大小接近1G,而此時又在執行一個較大的事務,那麼為了保證事務的完整性,資料庫不會做日誌刷新動作,而是直到該事務的日誌全部記錄進入當前binlog日誌後才會進行刷新。該參數的預設值查詢結果為:
show variables like '%max_binlog_size%';
4.6.4.3.sync_binlog
這個參數的作用是控制binlog什麼時候同步到磁碟。對資料庫來說,這是很重要的參數,它不僅會影響資料庫的性能,還會影響資料庫數據的完整性。
sync_binlog參數的具體說明:
1、sync_binlog=0表示在事務提交之後,資料庫不會將binlog_cache中的數據刷新到磁碟,而是讓文件系統自行決定什麼時候來做刷新或者在緩存滿了之後才刷新到磁碟。
2、sync_binlog=n表示每進行n次事務提交之後,資料庫都會進行一次將緩存數據強制刷新到磁碟的操作。
該參數預設的設置是0:
show variables like '%sync_binlog%';
設置為0時資料庫的性能是最好的,但數據風險也是最大的,對於數據安全性要求較高的資料庫,應該調整該參數將其改為1,值得註意的是,即使參數設置為1,仍然有binlog記錄的內容與資料庫的實際內容不一致的風險。
4.7.記錄二進位日誌的三種模式
MySQL使用不同的模式記錄二進位日誌信息,常見的有三種模式。
4.7.1.語句模式
語句(statement-based)模式是MySQL5.6預設的模式,簡單地說,就是每一條被修改的數據的SQL語句都會記錄到master的binlog中。在複製slave庫的時候,SQL進程會解析成與原來master端執行過的相同的SQL來再次執行。
該模式的優點是不需要記錄細到每一行數據的更改變化,因此,可減少binlog日誌量,實際上是減少了很多,節約了磁碟I/O,提高了系統性能。
但該模式同樣有一些缺點,由於語句模式記錄的是執行的SQL語句,所以,對於某些具有特殊功能的SQL語句來說,就可能會導致無法在從庫上正確執行,從而導致主從庫數據不一致的問題。
例如,當特殊的函數被執行時,當觸發器、存儲過程等特殊功能被執行時,而row level模式是基於每一行來記錄變化的,所以不會出現類似的問題。
4.7.2.行級模式
簡單地說,行級(row-based)模式就是將數據被修改的每一行的情況記錄為一條語句。
優點:在行級模式下,binlog中可以不記錄執行的SQL語句的上下文相關信息,僅僅記錄哪一條記錄被修改,修改成什麼樣了即可,所以row level的日誌內容會非常清楚地記錄下每一行數據修改的細節,非常容易理解。而且不會出現某些特定情況下的存儲過程或function以及trigger的調用和觸發無法被正確複製的問題。
缺點:行級模式下,所有的執行語句都將根據修改的行來記錄,而這就可能會產生大量的日誌內容,例如一條語句修改了100萬行,語句模式就用一條語句即可搞定,而行級模式執行之後,日誌中記錄的就是100萬行的修改記錄,binlog日誌的量會非常大。
4.7.3.混合模式
混合(mixed-based)模式預設採用語句模式記錄日誌,在一些特定的情況下會將記錄模式切換為行級模式記錄,這些特殊情況包含但不限於這幾種情況。
1、當函數中包含UUID()時。
2、當表中有自增列(AUTO_INCREMENT)被更新時。
3、當執行觸發器(trigger)或者存儲過程(stored function)等特殊功能時。
4、當FOUND_ROWS()、ROW_COUNT()、USER()、CURRENT_USER()、CURRENT_USER等執行時。
4.8.企業中如何選擇二進位日誌模式
在互聯網公司中,使用MySQL的特殊功能比較少(存儲過程、觸發器、函數),此時可以選擇預設的語句模式。
如果公司較多用到MySQL的特殊功能,如存儲過程、觸發器、函數等,並且需要做主從複製請首選行級模式,次選mixed模式。
4.9.二進位日誌的模式配置調整
臨時調整命令:
set global binlog_format = 'statement';
set global binlog_format = 'row';
set global binlog_format = 'mixed';
永久調整可以將“binlog_format = '模式名'”寫入到my.cnf配置文件中,並重啟服務。
4.10.行級模式二進位日誌實際讀取
當在資料庫中執行語句:
set global binlog_format = 'row';
或者在my.cnf中加入binlog_format = 'row'配置生效後,此時如果更新或者刪除多行數據就會發現binlog日誌記錄的內容有所不同。
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001 #--base64-output=decode-rows -v以行級模式解析binlog日誌。
5.慢查詢日誌
5.1.慢查詢日誌介紹
簡單地理解,慢查詢日誌(slow query log)就是記錄執行時間超出指定值(long_query_time)或其他指定條件(例如,沒有使用到索引,結果集大於1000行)的SQL語句。
5.2.慢查詢日誌相關參數說明
慢查詢的參數,對於資料庫SQL的優化非常重要,是SQL優化的前提,因此,這裡以表的形式進行說明。
慢查詢的參數及說明:
慢查詢參數 | 解釋說明 |
---|---|
slow_query-log | 慢查詢開啟開關,預設值是OFF* |
slow-query-log-file | 記錄慢查詢語句的文件,文件名形如“主機名-slow.log”* |
long_query_time | 記錄大於指定N秒的SQL語句,預設是10秒,也可以使用微秒單位* |
log_queries_not_using_indexes | 記錄沒有使用到索引的SQL語句,預設值是OFF* |
min_examined_row_limit | 記錄結果集大於N行的SQL語句,預設是0行* |
log_slow_admin_statements | 記錄管理的慢SQL語句,例如ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE、REPAIR TABLE |
log_throttle_queries_not_using_indexes | 限制每分鐘寫入記錄的慢SQL語句的數量,預設值為0,表示沒限制 |
5.3.慢查詢日誌重要參數配置
企業中常見的配置慢查詢的參數:
slow-query-log = ON #慢查詢開啟開關
long_query_time = 2 #記錄大於2秒的SQL語句
log_queries_not_using_indexes = ON #沒有使用到索引的SQL語句
slow-query-log-file = /application/mysql/slow.log #記錄SQL語句的文件
min_examined_row_limit = 800 #記錄結果大於800行的SQL語句
5.4.慢查詢日誌的刷新方法
在工作中,可以利用定時任務按天對慢查詢日誌進行切割,然後再分析。
切割腳本:
vi /server/scripts/cut_slow_log.sh
export PATH=/application/mysql/bin:/sbin:/bin:/usr/sbin:/usr/bin
cd /application/mysql &&\
mv slow.log slow.log.$(date +%F) &&\
mysqladmin flush-log
將腳本放入定時任務,每天0點執行切割任務:
00 00 * * * /bin/sh /server/scripts/cut_slow_log.sh >/dev/null 2>&1