MySQL 日誌
記錄MySQL學習過程中的所有日誌,可能不一定所有的都會用到
MySQL 常用的日誌類型
日誌名稱 | 作用 |
---|---|
錯誤日誌(error_log) | 記錄mysql在啓動、運行或停止時出現的問題 |
常規日誌(general_log) | 記錄所有發向MySQL的請求 |
慢查日誌(slow_query_log) | 記錄符合條件的查詢 |
二進制日誌(binary_log) | 記錄全部有效的數據修改日誌 |
中繼日誌(relay_log) | 用於主從複製,臨時存儲從主庫的二進制日誌 |
錯誤日誌
- 分析排除MySQL 運行錯誤
- 記錄未經授權的訪問
配置錯誤日誌
- log_error=$mysql/sql_log/mysql-error.log(MySQL 的錯誤日誌存儲目錄)
- log_error_verbosity=[1,2,3] (級別越高,記錄的日誌越多)
verbosity | 作用 |
---|---|
1 | Error messages |
2 | Error and warning messages |
3 | Error,warning,and note messages |
- log_error_services=[日誌服務組件;日誌服務組件] (MySQL 8.0 中才有)
組件名稱 | 作用 |
---|---|
log_filter_internal | 默認的日誌過濾組件,依賴log_error_verbosity |
log_sink_internal | 默認的日誌輸出組件,依賴log_error |
log_sink_json | 將錯誤日誌輸出到json文件 |
log_sink_syseventlog | 將錯誤日誌輸出到系統日誌文件 |
查看日誌目錄存放目錄
select @@log_error;
查看log_error_verbosity
select @@log_error_verbosity;
查看log_error_services;
select @@log_error_services;
查看日誌使用的時區
select @@log_timestamps;
設置系統時間作爲時間撮
set persist log_timestamps='SYSTEM';
配置常規日誌
分析客戶端發送到MySQL 的實際請求(短時間內會有大量的日誌被記錄)
這個日誌會從建立連接開始知道連接斷開的所有操作日誌。
密碼明文是不會記錄下來的
- general_log=[ON|OFF]打開或關閉常規日誌(不是特殊情況不要打開)
- general_log_file=$mysql/sql_log/general.log (常規日誌文件的位置)
- log_output=[FILE|TABLE|NONE] 保存在表中或文件中 mysql 庫中的 general_log表
查看general_log
select @@general_log; 0 未啓動 1啓動
查看general_log 文件位置
select @@general_log_file;
設置general_log 文件目錄
set persist general_log_file='/home/mysql/sql_log/general.log'
啓動general_log
set global general_log=on;
設置log_output的位置
set global general_log='table’;
關閉log_output
set global general_log=off;
配置慢查詢日誌
將執行成功並符合條件的查詢記錄到日誌中
找到需要優化的SQL
- slow_query_log=[ON|OFF] (配置是否打開慢查詢日誌)
- slow_query_log_file=$mysql/sql_log/slowlog.log(慢查詢日誌文件位置)
- long_query_time=xx秒(執行成功符合的條件----查詢時間)記錄所有sql可以將這個參數設置爲0
- log_queries_not_using_indexes=[ON|OFF] (記錄所有沒有使用索引的SQL)
- log_slow_admin_statements=[ON|OFF] (記錄所有使用admin 操作的日誌)
- log_slow_slave_statements=[ON|OFF] (記錄二進制日誌,主從數據庫,很少使用,基本不打開了)
查看慢查詢日誌設置的慢查詢時間
show variables like 'long_query_time';
修改慢查詢日誌的慢查詢時間
set global long_query_time=0.01;
配置二進制日誌
記錄所有對數據庫中數據的修改
基於時間點的備份和恢復
主從複製
-
log-bin [=base_name]
-
binlog_format=[Row|STATEMENT|MIXED] (二進制日誌格式)
- Row 每修改一行就記錄一條記錄
- STATEMENT 5.7之前 默認 只記錄執行的SQL 語句(可避免主從不一致的問題)
- MIXED MySQL 數據Row 與 STATEMENT 寫得混合
-
binlog_row_image=[FULL|MINIMAL|NOBLOB]
- FULL 全部記錄
- MINIMAL 只記錄被修改的值
- NOBLOB 值記錄除了BLOB 外的值的修改
-
binlog_rows_query_log_events=[ON|OFF] (在ROW格式下記錄SQL)
-
log_slave_updates=[ON|OFF] 記錄從主數據庫同步過來的二進制數據
-
sync_binlog=[1|0] 控制MySQL 如何刷新日誌到磁盤
- 1 :每寫一次就刷一次
- 0 :由操作系統決定
-
expire_logs_days=days(每天清理一次二進制日誌)
-
PURGE BINARY LOGS TO ‘mysql-bin.010’ (把mysql-bin.001~mysql-bin.009 全部刪除掉)
-
PURGE BINARY LOGS BEFORE ‘2010-10-22 10:12:33’ (小於這個時間點的二進制日誌全部刪除掉)
查看是否打開二進制日誌
show variables like 'log_bin';
查看配置文件目錄
show variables like 'log_bin_basename';
查看binlog_row_image
show variables like 'binlog_row_image';
查看二進制日誌格式
show variables like 'binlog_format';
讀取二進制日誌(轉換爲可讀的內容)
mysqlbinlog --no-defaults -vv --base64-output=DECODE-
ROWS
二進制日誌名
修改二進制日誌格式
set global binlog_row_image=minimal;
打開ROW 格式下記錄SQL
set binlog_rows_query_log_events=on;
配置中繼日誌
只有在主從複製的數據庫中才有
臨時記錄從主服務器同步的二進制日誌
- relay_log=filename (用於文件位置和文件前綴,不填的話則會存在數據目錄中,會用主機名作爲前綴)
- relay_log_purge=[ON|OFF] (對relay_log進行自動清除)
PS:flush logs 可以刷新日誌的配置