MySQL中有以下日志文件,分別是:
1:錯誤日志(errorlog)
2:一般查詢日志(general log)
3:慢查詢日志(slow query log)
4:二進制日志(binlog)
5:中繼日志(relay log)
6:重做日志(redo log)
7:回滾日志(undo log)
其中重做日志和回滾日志與事務操作息息相關,二進制日志也與事務操作有一定的關系,這三種日志,對理解MySQL中的事務操作有着重要的意義。
一、錯誤日志(error log)
錯誤日志介紹
MySQL的錯誤日志用於記錄MySQL服務進程mysqld在啟動/關閉或運行過程中遇到的錯誤信息。
錯誤日志產生
MySQL的錯誤日志通常由mysqld或mysqld_safe程序產生
錯誤日志配置
方法1:啟動命令可以使用" --log-error=[file_name] "來指定mysqld記錄的錯誤日志文件,如果沒有指定file_name,則默認的錯誤日志文件為datadir目錄下的 `hostname`.err ,hostname表示當前的主機名。
方法2:在my.cnf配置文件中調整,注意,是在[mysqld_safe]或[mysqld]模塊的下面進行配置。命令如下:
[mysqld] # /data/mysql/error.err 都是自己手動創建的,記得修改所屬的用戶與所屬的組為mysql ,或者修改操作權限 # chown -R mysql:mysql /data/mysql # chmod -R 755 /data/mysql log-error = /data/mysql/error.err
可以查看變量log_error來查看,命令如下:
mysql> show variables like 'log_error'; +---------------+--------------------------------+ | Variable_name | Value | +---------------+--------------------------------+ | log_error | /data/logs/mysql-log/error.log | +---------------+--------------------------------+ 1 row in set (0.01 sec)
錯誤日志查看
以下是MySQL 8.0.12 啟動的日志信息。

二、一般查詢日志(general log)
一般查詢日志介紹
查詢日志分為一般查詢日志和慢查詢日志,它們是通過查詢是否超出變量 long_query_time 指定時間的值來判定的。
在超時時間內完成的查詢是一般查詢,可以將其記錄到一般查詢日志中,但是建議關閉這種日志(默認是關閉的),超出時間的查詢是慢查詢,可以將其記錄到慢查詢日志中。
一般查詢日志產生
在客戶端使用sql查詢的時候,mysql服務端會產生查詢日志
一般查詢日志配置
方法1: 命令啟動時,使用" --general_log={0|1} "來決定是否啟用一般查詢日志,使用" --general_log_file=file_name "來指定查詢日志的路徑。不給定路徑時默認的文件名以 `hostname`.log 命名。
方法2: 在my.cnf配置文件中調整
# 開啟一般查詢日志,默認off關閉 general_log=on # 指定一般查詢日志路徑 general_log_file=/data/logs/mysql-log/general.log
可以查看變量general_log%來查看,命令如下:
mysql> show variables like 'general_log%';
+------------------+----------------------------------+
| Variable_name | Value |
+------------------+----------------------------------+
| general_log | ON |
| general_log_file | /data/logs/mysql-log/general.log |
+------------------+----------------------------------+
和查詢日志有關的變量有
# 指定慢查詢超時時長,超出此時長的屬於慢查詢,會記錄到慢查詢日志中 long_query_time = 10 # 定義一般查詢日志和慢查詢日志的輸出格式,不指定時默認為file log_output={TABLE|FILE|NONE}
一般查詢日志查看

三、慢查詢日志(slow query log)
慢查詢日志介紹
查詢超出變量 long_query_time 指定時間值的為慢查詢。但是查詢獲取鎖(包括鎖等待)的時間不計入查詢時間內。
慢查詢日志產生
mysql記錄慢查詢日志是在查詢執行完畢且已經完全釋放鎖之后才記錄的,因此慢查詢日志記錄的順序和執行的SQL查詢語句順序可能會不一致(例如語句1先執行,查詢速度慢,語句2后執行,但查詢速度快,則語句2先記錄)。
慢查詢日志配置
方法1: 在my.cnf配置文件中調整
# 是否啟用慢查詢日志,默認不啟用 slow_query_log={1|ON|0|OFF} # 默認路徑為庫文件目錄下主機名加上-slow.log slow_query_log_file=/mydata/data/hostname-slow.log # 指定慢查詢超時時長(默認10秒),超出此時長的屬於慢查詢 long_query_time=10 # 定義一般查詢日志和慢查詢日志的輸出格式,默認為file log_output={TABLE|FILE|NONE} # 查詢沒有使用索引的時候是否也記入慢查詢日志,默認OFF log_queries_not_using_indexes=OFF
可以查看變量slow_query_log%來查看,命令如下:
mysql> show variables like 'slow_query_log%'; +---------------------+--------------------------------------------------------+ | Variable_name | Value | +---------------------+--------------------------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /data/soft/mysql-8.0.12-el7-x86_64/data/H__D2-slow.log | +---------------------+--------------------------------------------------------+ 2 rows in set (0.00 sec)
慢查詢日志查看
四、二進制日志(bin log)
二進制日志介紹
二進制日志包含了引起或可能引起數據庫改變(如delete語句但沒有匹配行)的事件信息,但絕不會包括select和show這樣的查詢語句。語句以"事件"的形式保存,所以包含了時間、事件開始和結束位置等信息。
二進制日志是以事件形式記錄的,不是事務日志(但可能是基於事務來記錄二進制日志),不代表它只記錄innodb日志,myisam表也一樣有二進制日志。
對於事務表的操作,二進制日志只在事務提交的時候一次性寫入(基於事務的innodb二進制日志),提交前的每個二進制日志記錄都先cache,提交時寫入。
對於事務表來說,一個事務中可能包含多條二進制日志事件,它們會在提交時一次性寫入。而對於非事務表的操作,每次執行完語句就直接寫入。
mysqld還創建一個二進制日志索引文件,當二進制日志文件滾動的時候會向該文件中寫入對應的信息。所以該文件包含所有使用的二進制日志文件的文件名。默認情況下該文件與二進制日志文件的文件名相同,擴展名為'.index'。要指定該文件的文件名使用 --log-bin-index[=file_name] 選項。
當重啟mysql服務或刷新日志或者達到日志最大值時,將滾動二進制日志文件,滾動日志時只修改日志文件名的數字序列部分。
二進制日志文件的最大值通過變量 max_binlog_size 設置(默認值為1G)。但由於二進制日志可能是基於事務來記錄的(如innodb表類型),而事務是絕對不可能也不應該跨文件記錄的,如果正好二進制日志文件達到了最大值但事務還沒有提交則不會滾動日志,而是繼續增大日志,所以 max_binlog_size 指定的值和實際的二進制日志大小不一定相等。
因為二進制日志文件增長迅速,但官方說明因此而損耗的性能小於1%,且二進制目的是為了恢復定點數據庫和主從復制,所以出於安全和功能考慮,極不建議將二進制日志和datadir放在同一磁盤上。
二進制日志產生
事務提交的時候,一次性將事務中的sql語句(一個事物可能對應多個sql語句)按照一定的格式記錄到binlog中。
二進制日志配置
二進制日志默認時開啟的,可以通過 show variables like '%log_bin%'; 查看是否開啟,以下是指定binlog日志文件名
方法1: 命令啟動時,使用" --log_in=binlog" 賦值來指定binlog日志的文件名,開啟binlog日志
方法2: 在my.cnf配置文件中調整
1 # 賦值來指定binlog日志的文件名,開啟二進制日志 2 log_bin = /data/logs/mysql-log/binlog/binlog
二進制日志查看
binlog 的配置信息:show variables like '%log_bin%';
binlog 的格式:show variables like 'binlog_format';
日志的文件列表:show binary logs;
當前日志的寫入狀態:show master status;
清空 binlog 日志:reset master;
mysql> show variables like '%log_bin%'; +---------------------------------+------------------------------------------+ | Variable_name | Value | +---------------------------------+------------------------------------------+ | log_bin | ON | | log_bin_basename | /data/logs/mysql-log/binlog/binlog | | log_bin_index | /data/logs/mysql-log/binlog/binlog.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+------------------------------------------+ 6 rows in set (0.00 sec)
查看binlog日志命令: mysqlbinlog /data/logs/mysql-log/binlog/binlog.000001
[root@H__D2 ~]# mysqlbinlog /data/logs/mysql-log/binlog/binlog.000001; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #210505 18:11:52 server id 1 end_log_pos 124 CRC32 0xc4ac9366 Start: binlog v 4, server v 8.0.12 created 210505 18:11:52 at startup # Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; BINLOG ' aG+SYA8BAAAAeAAAAHwAAAABAAQAOC4wLjEyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABob5JgEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA CgFmk6zE '/*!*/; # at 124 #210505 18:11:52 server id 1 end_log_pos 155 CRC32 0x4a0e84b6 Previous-GTIDs # [empty] # at 155 #210505 18:17:53 server id 1 end_log_pos 230 CRC32 0x8a51b856 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=yes original_committed_timestamp=1620209873720931 immediate_commit_timestamp=1620209873720931 transaction_length=308 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; # original_commit_timestamp=1620209873720931 (2021-05-05 18:17:53.720931 CST) # immediate_commit_timestamp=1620209873720931 (2021-05-05 18:17:53.720931 CST) /*!80001 SET @@session.original_commit_timestamp=1620209873720931*//*!*/; SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 230 #210505 18:17:53 server id 1 end_log_pos 314 CRC32 0x7eaa39b9 Query thread_id=8 exec_time=0 error_code=0 SET TIMESTAMP=1620209873/*!*/; SET @@session.pseudo_thread_id=8/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1168113696/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8mb4 *//*!*/; SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; /*!80005 SET @@session.default_collation_for_utf8mb4=255*//*!*/; BEGIN /*!*/; # at 314 #210505 18:17:53 server id 1 end_log_pos 372 CRC32 0x335603d9 Table_map: `test`.`user` mapped to number 62 # at 372 #210505 18:17:53 server id 1 end_log_pos 432 CRC32 0x4fd1e95f Update_rows: table id 62 flags: STMT_END_F BINLOG ' 0XCSYBMBAAAAOgAAAHQBAAAAAD4AAAAAAAEABHRlc3QABHVzZXIAAgMPAoAAAgEBAAID/P8A2QNW Mw== 0XCSYB8BAAAAPAAAALABAAAAAD4AAAAAAAEAAgAC//8AAQAAAAblsI/nmb0AAQAAAAblpKfnmb1f 6dFP '/*!*/; # at 432 #210505 18:17:53 server id 1 end_log_pos 463 CRC32 0x9afadbaf Xid = 12 COMMIT/*!*/; SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
五、中繼日志(relay log)
中繼日志介紹
從數據庫Slave服務的I/O線程從主數據庫Master服務的二進制日志中讀取數據庫的更改記錄並寫入到中繼日志中,然后在Slave數據庫執行修改操作。這就是中繼日志Relay Log。

中繼日志產生
同上
中繼日志配置
配置中繼日志的文件名
# 配置中繼日志的文件名,開啟中繼日志 relay-log=/data/logs/mysql-log/relaylog
相關參數
mysql> show variables like '%relay%'; +---------------------------+---------------------------------------------------------------+ | Variable_name | Value | +---------------------------+---------------------------------------------------------------+ | max_relay_log_size | 0 | | relay_log | H__D2-relay-bin | | relay_log_basename | /data/soft/mysql-8.0.12-el7-x86_64/data/H__D2-relay-bin | | relay_log_index | /data/soft/mysql-8.0.12-el7-x86_64/data/H__D2-relay-bin.index | | relay_log_info_file | relay-log.info | | relay_log_info_repository | TABLE | | relay_log_purge | ON | | relay_log_recovery | OFF | | relay_log_space_limit | 0 | | sync_relay_log | 10000 | | sync_relay_log_info | 10000 | +---------------------------+---------------------------------------------------------------+ 11 rows in set (0.00 sec)
中繼日志參數說明
relay_log 中繼日志存儲位置和文件名
relay_log_info_file 記錄master數據庫二進制日志的pos和中繼日志的pos
max_relay_log_size 中繼日志的文件最大SIZE
relay_log_purge 是否自動清理中繼日志
relay_log_recovery 中繼日志自動恢復
relay_log_space_limit 中繼日志空間限制
sync_relay_log 中繼日志同步方式
sync_relay_log_info 主從復制狀態記錄文件info_file更新方式
中繼日志查看
查看中繼日志命令: mysqlbinlog H__D-relay-bin.000001
[root@H__D2 data]# mysqlbinlog H__D-relay-bin.000001 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #210505 15:30:12 server id 1 end_log_pos 124 CRC32 0x8d7ef9ef Start: binlog v 4, server v 8.0.12 created 210505 15:30:12 # This Format_description_event appears in a relay log and was generated by the slave thread. # at 124 #210505 15:30:12 server id 1 end_log_pos 155 CRC32 0x4700fe0d Previous-GTIDs # [empty] # at 155 #210505 15:30:12 server id 1 end_log_pos 178 CRC32 0xb55d9865 Stop SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER ; # End of log file /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
六、重做日志(redo log)
undo log 和 redo log 其實都不是 MySQL 數據庫層面的日志,而是 InnoDB 存儲引擎的日志。二者的作用聯系緊密,事務的隔離性由鎖來實現,原子性、一致性、持久性通過數據庫的 redo log 或 redo log 來完成。redo log 又稱為重做日志,用來保證事務的持久性,undo log 用來保證事務的原子性和 MVCC。
重做日志介紹
如果每一次更新都寫磁盤,然后磁盤也要找到對應記錄,再更新,整個過程的IO成本和查找成本都很高。所以InnoDB采取WAL(Write-Ahead Logging)技術,即先寫日志,再寫磁盤。
當有記錄需要更新時,InnoDB引擎先記錄redo log,再更新內存。然后找適當時機將該操作寫到磁盤(比如系統空閑時)。
redo log的大小是固定的(可配置),比如4個文件,每個文件大小1GB,從第一個文件開始寫,寫到第四個文件末尾再從頭循環。
確保事務的持久性。redo日志記錄事務執行后的狀態,用來恢復未寫入data file的已成功事務更新的數據。防止在發生故障的時間點,尚有臟頁未寫入磁盤,在重啟mysql服務的時候,根據redo log進行重做,從而達到事務的持久性這一特性。
重做日志產生
事務開始之后就產生redo log,redo log的落盤並不是隨着事務的提交才寫入的,而是在事務的執行過程中,便開始寫入redo log文件中。
當對應事務的臟頁寫入到磁盤之后,redo log的使命也就完成了,重做日志占用的空間就可以重用(被覆蓋)。
重做日志配置
默認情況下,對應的物理文件位於數據庫的data目錄下的 ib_logfile1 和 ib_logfile2
innodb_log_group_home_dir 指定日志文件組所在的路徑,默認./ ,表示在數據庫的數據目錄下。
innodb_log_files_in_group 指定重做日志文件組中文件的數量,默認2
關於文件的大小和數量,由以下兩個參數配置:
innodb_log_file_size 重做日志文件的大小。
innodb_mirrored_log_groups 指定了日志鏡像文件組的數量,默認1
mysql> show variables like 'innodb_log_file_size'; +----------------------+----------+ | Variable_name | Value | +----------------------+----------+ | innodb_log_file_size | 50331648 | +----------------------+----------+ 1 row in set (0.00 sec)
重做日志查看
ib_logfile1 和 ib_logfile2 為 二進制文件
七、回滾日志(undo log)
回滾日志介紹
保證數據的原子性,保存了事務發生之前的數據的一個版本,可以用於回滾,同時可以提供多版本並發控制下的讀(MVCC),也即非鎖定讀
回滾日志產生
事務開始之前,將當前是的版本生成undo log,undo 也會產生 redo 來保證undo log的可靠性
回滾日志配置
MySQL5.6之前,undo表空間位於共享表空間的回滾段中,共享表空間的默認的名稱是ibdata,位於數據文件目錄中。
MySQL5.6之后,undo表空間可以配置成獨立的文件,但是提前需要在配置文件中配置,完成數據庫初始化后生效且不可改變undo log文件的個數
如果初始化數據庫之前沒有進行相關配置,那么就無法配置成獨立的表空間了。
關於MySQL5.7之后的獨立undo 表空間配置參數如下:
innodb_undo_directory = /data/undospace/ –undo獨立表空間的存放目錄 innodb_undo_logs = 128 –回滾段為128KB innodb_undo_tablespaces = 2 –指定有2個undo log文件
如果undo使用的共享表空間,這個共享表空間中又不僅僅是存儲了undo的信息,共享表空間的默認為與MySQL的數據目錄下面,其屬性由參數innodb_data_file_path配置。
mysql> show variables like 'innodb_data_file_path'; +-----------------------+------------------------+ | Variable_name | Value | +-----------------------+------------------------+ | innodb_data_file_path | ibdata1:12M:autoextend | +-----------------------+------------------------+ 1 row in set (0.00 sec)
mysql> show variables like '%undo%'; +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | innodb_max_undo_log_size | 1073741824 | | innodb_undo_directory | ./ | | innodb_undo_log_encrypt | OFF | | innodb_undo_log_truncate | ON | | innodb_undo_tablespaces | 2 | +--------------------------+------------+ 5 rows in set (0.00 sec)
回滾日志查看
ibdata1 為二進制文件
參考:https://www.cnblogs.com/f-ck-need-u/p/9001061.html#auto_id_4
參考:https://www.cnblogs.com/myseries/p/10728533.html
