MySQL-日志
- 前言
- 一、錯誤日志(error log)
- 二、慢查詢日志(slow query log)
- 三 、一般查詢日志(general log)
- 四、 事務日志
- 重做日志(redo log)
- 回滾日志(undo log)
- 五、 二進制日志(bin log)/歸檔日志 => 數據同步和數據恢復
- 總結
前言
日志用來做什么?
記錄了很多關于程序運行狀態的信息(正常、出錯…)
- 用于排錯
- 了解MySQL性能(速度)運行情況…
- 數據的備份和恢復
一、錯誤日志(error log)
記錄MySQL啟動、關閉、運行過程中的錯誤信息
配置方式
my.cnf文件
[mysqld]
log-error=/var/log/mysqld.log
查看錯誤日志路徑
root@test 15: 38>
show variables like 'log_error';
±--------------±---------------------------+
| Variable_name | Value |
±--------------±---------------------------+
| log_error | /data/mysql/mysqld3308.err |
±--------------±---------------------------+
1 row in set (0.00 sec)
二、慢查詢日志(slow query log)
記錄MySQL中響應時間超過閾值的SQL語句信息
作用:記錄消耗時間較長的SQL語句,為數據庫性能提升提供了線索(DBA/開發人員)
配置方式
my.cnf
[mysqld]
slow_query_log=1 # on
slow_query_log_file=/data/mysql/mysqld_query.log
long_query_time=10 # 默認10s,如果sql語句執行超過10s,將會記錄下來
分析慢日志:mysqldumpslow
查看與慢查詢時間閾值
root@test 15: 48>
show variables like '%long_query%';
±----------------±----------+
| Variable_name | Value |
±----------------±----------+
| long_query_time | 10.000000 |
±----------------±----------+
慢查詢日志開關及路徑
root@test 15: 48>
show variables like '%slow_query%';
±--------------------±-----------------------------+
| Variable_name | Value |
±--------------------±-----------------------------+
| slow_query_log | ON |
| slow_query_log_file | /data/mysql/mysqld_query.log |
±--------------------±-----------------------------+
三 、一般查詢日志(general log)
記錄客戶端連接服務端的信息以及執行SQL語句的信息
執行的SQL命令,執行結果(成功、失敗原因)
從性能考慮,默認沒有開啟
[mysqld]
general_log=1
general_log_file=/data/mysql/mysqld_general.log
查看一般查詢日志開關及路徑
root@test 15: 48>
show variables like '%general_log%';
±-----------------±-------------------+
| Variable_name | Value |
±-----------------±-------------------+
| general_log | OFF |
| general_log_file | /data/mysql/db.log |
±-----------------±-------------------+
四、 事務日志
重做日志(redo log)
是MySQL存儲引擎InnoDB的事務日志
可以讓MySQL擁有崩潰恢復的能力
比如MySQL實例掛了、宕機了,重啟時InnoDB使用redo log恢復數據保持數據的一致性
redo log時當做更新操作時,就會寫的日志。
查看 InnoDB 存儲引擎中與刷盤策略相關的配置參數,默認為1
show variables like '%innodb_flush%';
innodb_flush_log_at_trx_commit= 1
當值為1時表示,只要事務提交成功,將redo log寫入磁盤
即使系統崩潰,也不會丟失已提交的事務
當值為2時表示,當事務提交時,只把redo log buffer寫入page cache
定期刷盤,若操作系統崩潰,可能丟失緩存中的數據
當值為0時表示,每秒刷寫一次 redo log 到磁盤,事務提交時不主動刷盤。若系統崩潰,可能丟失最后 1 秒內已提交的事務
redo log 文件的大小?
大小固定,循環寫入格式
為什么這么設計?
因為redo log記錄的數據頁上的修改,如果buffer pool中數據已經刷盤(寫入磁盤),日志失效了。因此可以將其進行覆蓋
回滾日志(undo log)
是MySQL存儲引擎InnoDB的
起到回滾的作用,保證事務的原子性
1->2
當執行rollback時,2->1
當修改操作時,記錄下對應所需要的信息
插入一條記錄:至少記錄這條記錄主鍵 -> 回滾:找到主鍵刪除
刪除一條記錄:記錄下這條記錄的所有信息 -> 回滾:將信息整理成INSERT SQL
修改一條記錄:主鍵,舊值 -> 回滾:Update為舊值
五、 二進制日志(bin log)/歸檔日志 => 數據同步和數據恢復
數據以二進制方式存儲在磁盤上邏輯日志,記錄了用戶對數據庫寫操作
二進制日志能完整記錄數據變更歷史,默認沒有開啟
表結構/數據 增、刪、改 存儲過程、函數
二進制日志的作用
- 備份恢復
- 主從復制
- 日志審計場景(被攻擊)
查詢是否開啟了二進制日志
root@test 16: 57>
select @@log_bin;
±----------+
| @@log_bin |
±----------+
| 1 |
±----------+
二進制日志配置
[mysqld]
log_bin=/data/mysql/mysqld_binlog
binlog_format=ROW
STATEMENT:記錄SQL語句
ROW: 記錄每一行數據更改
MIXED:以上兩者的混合
查看二進制日志的記錄格式
root@test 17: 00>
show variables like 'binlog_format';
±--------------±------+
| Variable_name | Value |
±--------------±------+
| binlog_format | ROW |
±--------------±------+
二進制日志很大,日志切割
查看與二進制日志大小限制相關的配置參數
root@test 17: 01>
show variables like '%max_binlog%';
±---------------------------±---------------------+
| Variable_name | Value |
±---------------------------±---------------------+
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 | 1G
| max_binlog_stmt_cache_size | 18446744073709547520 |
±---------------------------±---------------------+
xxx.index => binlog目錄
xxx.00001 => binlog文件
-rw-r----- 1 mysql mysql 157 8月 9 17:00 mysqld_binlog.000001
-rw-r----- 1 mysql mysql 33 8月 9 17:00 mysqld_binlog.index
查看有哪些binlog文件
root@test 17: 04>
show master logs;
±---------------------±----------±----------+
| Log_name | File_size | Encrypted |
±---------------------±----------±----------+
| mysqld_binlog.000001 | 180 | No |
| mysqld_binlog.000002 | 157 | No |
±---------------------±----------±----------+
2 rows in set (0.00 sec)
root@test 17: 05>
show binary logs;
±---------------------±----------±----------+
| Log_name | File_size | Encrypted |
±---------------------±----------±----------+
| mysqld_binlog.000001 | 180 | No |
| mysqld_binlog.000002 | 157 | No |
±---------------------±----------±----------+
2 rows in set (0.00 sec)
查看當前binlog文件
root@test 17: 05>
show master status\G
*************************** 1. row ***************************
File: mysqld_binlog.000002
Position: 157
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
查看二進制日志
show binlog events in 'mysqld_binlog.000002' \G
*************************** 17. row ***************************Log_name: mysqld_binlog.000002 日志文件名 Pos: 1085 pos起始位置Event_type: Xid 事件類型Server_id: 1 哪臺服務在操作
End_log_pos: 1116 pos結束位置Info: COMMIT /* xid=80 */ 操作的內容
查看指定二進制日志文件
root@test 17: 09>
show binlog events in 'mysqld_binlog.000002' from 924\G
解析和查看二進制二進制日志文件
mysqlbinlog -vv /data/mysql/mysqld_binlog.000002
-vv 選項表示以詳細模式輸出,會顯示更完整的日志內容(包括行級變更細節)
自動清除策略
root@test 17: 18>
show variables like '%expire_logs_days%';
±-----------------±------+
| Variable_name | Value |
±-----------------±------+
| expire_logs_days | 0 |
±-----------------±------+
設置為自動保留 7 天
[mysqld]
expire_logs_days=7
刪除所有二進制日志
reset master
二進制如何寫入磁盤
- 什么寫二進制日志(INSERT/DELETE/UPDATE)
- 當執行以上操作 -> binlog_buffer -> 磁盤
sync_binlog=0:由操作系統來決定什么時候寫入磁盤
sync_binlog=1:每次事務提交時都會調用fsync,刷新binlog寫入磁盤
sync_binlog=N:每N次事務提交時都會調用fsync,刷新binlog寫入磁盤
查看二進制日志的同步策略配置
root@test 17: 20>
show variables like "sync_binlog";
±--------------±------+
| Variable_name | Value |
±--------------±------+
| sync_binlog | 1 |
±--------------±------+
1 row in set (0.00 sec)
總結
Innodb引擎使用redo log保持事務持久性,undo log保證事務原子性
數據備份、集群(主備、主主、主從)都離不開binlog, 負責同步數據,保證數據一致性
當需要查找系統瓶頸時,可以通過slow query log分析
錯誤日志、一般查詢日志