MySQL-07 日誌管理
學習目標
- MySQL日誌
- 二進制日誌
- 錯誤日誌
- 查詢通用日誌
- 慢查詢日誌
MySQL日誌
MySQL日誌分為四類,說明如下:
- 錯誤日誌:記錄MySQL服務的啟動、運行或者停止時出現的問題。
- 查詢日誌:記錄客戶端連接和執行的語句。
- 二進制日誌:記錄所有更改數據的語句,可以用於數據復制。
- 慢查詢日誌:記錄所有執行時間超過long_query_time的所有查詢或者不使用索引的查詢。
刷新日誌的命令:FLUSH LOGS、MySQLAdmin flush-logs、MySQLAdmin refresh。
啟用日誌功能會降低MySQL數據庫的性能和占用磁盤空間。
二進制日誌
二進制日誌是一個二進制文件,主要用於記錄修改數據或有可能引起數據變更(例如沒有匹配刪除條件的DELETE語句)的MySQL語句,以事務安全的方式包含更新日誌中可用的所有信息。
二進制日誌中記錄了對MySQL數據庫執行更改的所有操作,並且記錄了語句發生時間、執行時長、操作數據等其它額外信息,但是它不記錄SELECT、SHOW等那些不修改數據的SQL語句。如果記錄所有語句,使用查詢日誌。
二進制日誌主要要用於數據庫恢復和主從復制,以及審計(audit)操作。
啟動和設置二進制日誌
在my.ini配置文件的[mysqld]節點添加以下配置信息:
[mysqld] port = 3306 ; 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 ; 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB ; 二進制日誌設置開始 ; 開啟二進制日誌 log-bin ; 自動清除10天過期日誌。MySQL服務重啟或者日誌刷新時候將被刪除。 expire-logs-days=10 ; 單個日誌文件大小 max_binlog_size=100M ;二進制日誌設置結束
添加完成後,關閉並重啟MySQL服務進程,即可打開和查看二進制日誌。
確認二進制日誌已經打開:
在mysql的data數據目錄下,生成以主機名稱作為文件名的日誌文件:
如果需要修改二進制日誌文件的存儲位置和名稱,則修改my.ini配置文件中log-bin的值:
例如:
log-bin="D:/logs/binlog"
重啟mysql服務後,日誌將保存在“D:/logs”目錄中,並且文件名為“binlog”。
查看二進制日誌
MySQL服務每重啟一次(或者執行SQL命令FLUSH LOGS),以後綴名為.00000*的文件會增加一個;或者日誌文件的的大小超過max_bin_log設置的大小(默認1G),也會重新創建一個新文件。
示例1:在MySQL中查看日誌文件個數和文件名:
示例2:查看二進制日誌
在命令行中,使用mysqlbinlog命令工具查看。
mysqlbinlog需要添加參數“-v”,否則無法看到SQL語句。
二進制日誌格式
- 基於行的格式row
由於ROW格式記錄的日誌量巨大, 在MySQL 5.6以後, 官方增加了binlog_row_image參數改善其記錄方式。
value值:
FULL為默認值,意思是記錄一行紀錄裏面的所有內容,無論該列是否被修改。
MINIMAL僅記錄被修改的列,這樣就可以大大減少記錄量。
NOBLOB與FULL類型,但是如果沒有修改BLOB或TEXT類型的列,就不會記錄該大數據類型的列。
- 基於段的格式statement
優點:記錄每個事件所執行的SQL語句, 故不需要記錄每一行的具體變化, 所以日誌記錄量相對較少, 節約磁盤IO與網絡IO(如果只對一條記錄修改或者插入,ROW格式的日誌量有可能少於STATEMENT格式)。
缺點:為了確保這些SQL語句能在從庫中正確地執行, 所以要記錄上下文信息, 以保證重放時的行為一致. 但如果使用UUID()這類非確定性函數, 可能會造成主從的數據不一致.
格式設置:
刪除二進制日誌
示例1:刪除全部二進制文件
示例2:刪除創建時間比RASK-PC-bin.000005的日誌文件
刪除前日誌文件:
或者:
執行刪除部分日誌命令:
暫時啟動和停止二進制日誌功能
啟動
停止
使用二進制日誌恢復數據庫
mysqlbinlog工具可以從指定的時間點開始恢復數據。
mysqlbinlog恢復數據語法格式:
mysqlbinlog [option] filename | mysql -uUser -pPassword
option可選項:
--start-datetime:指定恢復數據庫的起始時間點。
--stop-datetime:指定恢復數據庫的結束時間點。
--start-position:恢復的開始位置(日誌中的位置)。
--stop-position:恢復的結束位置。
示例1:全部恢復
示例2:恢復到2018年6月17日10:30:00時的狀態
錯誤日誌
錯誤日誌默認位於data目錄下,文件名為:hostname.err。例如:
如果需要修改默認文件存儲路徑和文件名,需要在my.ini配置文件的[mysqld]節點添加以下信息:
log-error=[path/[filename]]
查看日誌文件
直接使用文本工具查看。
刪除日誌文件
可以直接刪除文本日誌文件。MySQL在運行時,刪除錯誤日誌文件不會自動創建新的日誌文件,需要在服務器端執行:
mysqladmin -u root -pPassword flush-logs
或者在mysql中執行
FLUSH LOGS
MySQL重啟會重新創建日誌文件。
通用查詢日誌
通用查詢日誌記錄了MySQL的所有用戶操作,包括啟動和關閉服務、執行查詢和更新語句。
啟動和設置通用查詢日誌
5.7之前的版本
在my.ini配置文件[mysqld]節點下添加:
log[=path/[filename]]
例如:
; 開啟通用查詢日誌 log
5.7版本
; 開啟通用查詢日誌 general-log=1 general_log_file="D:/mysql.log"
如果不指定general_log_file,則查詢日誌保存在data目錄下,文件名:hostname.log。
查看通用查詢日誌
使用記事本查看
刪除和重建通用查詢日誌
通過my.ini配置文件找到查詢日誌存儲位置,直接在文件管理系統中刪除。
重建通用查詢日誌命令:
mysqladmin -flush logs
慢查詢日誌
慢查詢日誌記錄查詢時長超過指定時間的日誌。通過慢查詢日誌,可以找出執行時間較長、執行效率較低的語句,然後針對其進行優化。
啟動和設置慢查詢日誌
在my.ini配置文件[mysqld]節點下添加慢查詢日誌配置:
5.6和之前版本:
; 開啟慢查詢日誌 log-slow-queries ; 設置查詢時長閥值為20秒(默認10秒) long_query_time=20
5.7版本:
slow_query_log=ON ; 設置慢查詢日誌存儲位置 slow_query_log_file=‘d:/msql_slow‘ ; 設置超時,默認為10秒 long_query_time=20
slow_query_log_file不進行設置,則日誌存儲在data目錄下,默認文件名為hostname-slow.log,例如:
查看慢查詢日誌
使用文本工具直接查看日誌文件即可。
刪除慢查詢日誌
直接使用文件系統刪除。刪除後無法自動創建,需要執行mysqladmin命令或者登陸到mysql服務器執行刷新日誌命令:
# 系統命令 mysqladmin -u User -pPassword flush-logs # mysql執行語句 FLUSH LOGS;
綜合練習
練習一:二進制日誌綜合練習:
- 啟動二進制日誌,指定二進制日誌名稱為binlog,日誌存儲位置為D:/logs
- 驗證重啟mysql和FLUSH LOGS執行語句對二進制日誌的影響
- 使用mysqlbinlog命令查看二進制日誌文件
- 使用二進制日誌文件恢復數據:創建測試表T1(id,name),向數據表插入兩條記錄,查看日誌文件,找出日誌文件記錄的SQL語句;刪除T1表,使用mysqlbinlog命令恢復T1表
- 刪除二進制日誌文件。暫停和啟動二進制日誌文件。
練習二:錯誤日誌綜合練習
- 設置和啟動錯誤日誌文件,指定錯誤日誌文件名稱為errlog,日誌存儲位置為D:/logs
- 使用記事本查看錯誤日誌文件
- 刪除錯誤日誌文件
- 重新創建日誌文件
練習三:通用查詢日誌綜合練習
- 設置和啟動通用查詢日誌文件,指定通用查詢日誌文件名稱為general_query_log,日誌存儲位置為D:/logs
- 查看通用查詢日誌
- 刪除通用查詢日誌
練習四:慢查詢日誌綜合練習
- 設置和啟動慢查詢日誌文件,指定慢查詢日誌文件名稱為slow_query_log,日誌存儲位置為D:/logs
- 查看慢查詢日誌文件
- 刪除慢查詢日誌文件
MySQL-07 日誌管理