詳解MySQL的日誌

MySQL日誌

MySQL的日誌記錄了MySQL的平常操做和錯誤信息,經過這些日誌咱們能夠知道MySQL內部發生的事情,能夠爲MySQL的優化和管理提供必要的信息。java

MySQL的日誌主要有:二進制日誌、通用查詢日誌、慢查詢日誌、錯誤日誌、事務日誌等。mysql

二進制日誌

二進制日誌用來記錄操做MySQL數據庫中的寫入性操做(包括增刪改,但不包括查詢),操做語句以事件的形式進行保存,描述數據更改。sql

二進制的主要做用有兩個:數據庫

  1. 複製,配置了主從複製的時候,主服務器會將其產生的二進制日誌發送到slave端,slave端會利用這個二進制日誌的信息在本地重作,實現主從同步。
  2. 恢復,由於二進制日誌包含了備份之後的全部更新,所以能夠用於最大限度地恢復數據庫。所以,建議二進制日誌單獨保存到一個磁盤上,以便磁盤損壞之後進行數據恢復。   

查看二進制日誌是否打開

二進制能夠經過show variables like 'log_bin';查看是否已經打開。緩存

下面的返回表示是關閉的:性能優化

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
複製代碼

Windows下配置MySQL二進制日誌

  1. 首先確保MySQL Server已經安裝,筆者是在Windows10操做系統安裝的 MySQL5.7 64位的服務,MySQL服務名爲:MySQL57

安裝成功之後,查看MySQL版本:bash

C:\>mysql -V
mysql  Ver 14.14 Distrib 5.7.17, for Win64 (x86_64)
複製代碼
  1. 打開C:\ProgramData\MySQL\MySQL Server 5.7(注意目錄不要搞錯)目錄下的my.ini文件,並在[mysqld]配置組下面加入以下配置:
# MySQL二進制日誌配置
# bin log輸出的目錄及文件
log-bin="C:/1workspace/develop/db/mysql/mysql57/logs/binlog"
# bin log清理時間
expire_logs_days=7
# 每一個bin log文件大小
max_binlog_size=200m
#binlog緩存大小
binlog_cache_size=10m
#最大binlog緩存大小
max_binlog_cache_size=20m
複製代碼
  1. 經過 管理員模式 打開cmd,重啓MySQL服務:
C:\>net stop MySQL57
MySQL57 服務正在中止.
MySQL57 服務已成功中止。


C:\>net start MySQL57
MySQL57 服務正在啓動 .
MySQL57 服務已經啓動成功。
複製代碼
  1. 鏈接MySQL服務:
C:\>mysql -uroot -pmysqltao
複製代碼
  1. 下面顯示MySQL的bin log已經開啓:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
複製代碼

這時候你能夠打開你配置的bin log路徑,能夠看到生成的二進制日誌文件:binlog.000001,服務器

以及一個二進制log的索引文件:binlog.index。session

查看 bin log

每次重啓MySQL都會生成一個新的binlog文件,經過show binary logs語句能夠看到全部的binlog文件,返回的內容跟 binlog.index 文件裏記錄的binlog文件數是同樣的。app

如今有3個binglog文件:

mysql> show binary logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000001 |       177 |
| binlog.000002 |       177 |
| binlog.000003 |       154 |
+---------------+-----------+
複製代碼

執行一條update語句:

update demo_java_db_1.t_user set name='Jack' where id=1;
複製代碼

再經過mysqlbinlog語句查看當前的binlog文件:

C:\1workspace\develop\db\mysql\mysql57\logs>mysqlbinlog binlog.000003
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#190704 17:19:28 server id 1  end_log_pos 123 CRC32 0xaf193fc6  Start: binlog v 4, server v 5.7.17-log created 190704 17:19:28 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
oMQdXQ8BAAAAdwAAAHsAAAABAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACgxB1dEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AcY/Ga8=
'/*!*/;
# at 123
#190704 17:19:29 server id 1  end_log_pos 154 CRC32 0xc916f3aa  Previous-GTIDs
# [empty]
# at 154
#190704 17:39:43 server id 1  end_log_pos 219 CRC32 0xcecca4bf  Anonymous_GTID  last_committed=0    sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#190704 17:39:43 server id 1  end_log_pos 287 CRC32 0xb6a3de97  Query   thread_id=7     exec_time=0 error_code=0
SET TIMESTAMP=1562233183/*!*/;
SET @@session.pseudo_thread_id=7/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1344274432/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 287
#190704 17:39:43 server id 1  end_log_pos 358 CRC32 0xd1ce52d6  Table_map: `demo_java_db_1`.`t_user` mapped to number 115
# at 358
#190704 17:39:43 server id 1  end_log_pos 445 CRC32 0x7a57aa7a  Update_rows: table id 115 flags: STMT_END_F

BINLOG '
X8kdXRMBAAAARwAAAGYBAAAAAHMAAAAAAAEADmRlbW9famF2YV9kYl8xAAZ0X3VzZXIABQgPDw8P
CGAAYABgAGAAHtZSztE=
X8kdXR8BAAAAVwAAAL0BAAAAAHMAAAAAAAEAAgAF///wAQAAAAAAAAAFZmlyc3QGcHdkMTIzA01B
TvABAAAAAAAAAARKYWNrBnB3ZDEyMwNNQU56qld6
'/*!*/;
# at 445
#190704 17:39:43 server id 1  end_log_pos 476 CRC32 0x6e49c227  Xid = 42
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*/;
複製代碼

經過binlog能夠看到在 17:39:43改了demo_java_db_1庫的t_user表。

經過binlog恢復數據

經過show binlog events命令能夠查看binlog內記錄的事件:

mysql> show binlog events in 'binlog.000003'\G
*************************** 1. row ***************************
   Log_name: binlog.000003
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 123
       Info: Server ver: 5.7.17-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: binlog.000003
        Pos: 123
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 154
       Info:
*************************** 3. row ***************************
   Log_name: binlog.000003
        Pos: 154
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 219
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
   Log_name: binlog.000003
        Pos: 219
 Event_type: Query
  Server_id: 1
End_log_pos: 287
       Info: BEGIN
*************************** 5. row ***************************
   Log_name: binlog.000003
        Pos: 287
 Event_type: Table_map
  Server_id: 1
End_log_pos: 358
       Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 6. row ***************************
   Log_name: binlog.000003
        Pos: 358
 Event_type: Update_rows
  Server_id: 1
End_log_pos: 445
       Info: table_id: 115 flags: STMT_END_F
*************************** 7. row ***************************
   Log_name: binlog.000003
        Pos: 445
 Event_type: Xid
  Server_id: 1
End_log_pos: 476
       Info: COMMIT /* xid=42 */
*************************** 8. row ***************************
   Log_name: binlog.000003
        Pos: 476
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 541
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 9. row ***************************
   Log_name: binlog.000003
        Pos: 541
 Event_type: Query
  Server_id: 1
End_log_pos: 609
       Info: BEGIN
*************************** 10. row ***************************
   Log_name: binlog.000003
        Pos: 609
 Event_type: Table_map
  Server_id: 1
End_log_pos: 680
       Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 11. row ***************************
   Log_name: binlog.000003
        Pos: 680
 Event_type: Update_rows
  Server_id: 1
End_log_pos: 765
       Info: table_id: 115 flags: STMT_END_F
*************************** 12. row ***************************
   Log_name: binlog.000003
        Pos: 765
 Event_type: Xid
  Server_id: 1
End_log_pos: 796
       Info: COMMIT /* xid=69 */
*************************** 13. row ***************************
   Log_name: binlog.000003
        Pos: 796
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 861
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 14. row ***************************
   Log_name: binlog.000003
        Pos: 861
 Event_type: Query
  Server_id: 1
End_log_pos: 929
       Info: BEGIN
*************************** 15. row ***************************
   Log_name: binlog.000003
        Pos: 929
 Event_type: Table_map
  Server_id: 1
End_log_pos: 1000
       Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 16. row ***************************
   Log_name: binlog.000003
        Pos: 1000
 Event_type: Update_rows
  Server_id: 1
End_log_pos: 1085
       Info: table_id: 115 flags: STMT_END_F
*************************** 17. row ***************************
   Log_name: binlog.000003
        Pos: 1085
 Event_type: Xid
  Server_id: 1
End_log_pos: 1116
       Info: COMMIT /* xid=101 */
*************************** 18. row ***************************
   Log_name: binlog.000003
        Pos: 1116
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 1181
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 19. row ***************************
   Log_name: binlog.000003
        Pos: 1181
 Event_type: Query
  Server_id: 1
End_log_pos: 1249
       Info: BEGIN
*************************** 20. row ***************************
   Log_name: binlog.000003
        Pos: 1249
 Event_type: Table_map
  Server_id: 1
End_log_pos: 1320
       Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 21. row ***************************
   Log_name: binlog.000003
        Pos: 1320
 Event_type: Update_rows
  Server_id: 1
End_log_pos: 1405
       Info: table_id: 115 flags: STMT_END_F
*************************** 22. row ***************************
   Log_name: binlog.000003
        Pos: 1405
 Event_type: Xid
  Server_id: 1
End_log_pos: 1436
       Info: COMMIT /* xid=107 */
22 rows in set (0.00 sec)
複製代碼
  • Log_name: 此條log存在那個文件中,從上面能夠看出這2條log皆存在與mysql_bin.000001文件中。
  • Pos: log在bin-log中的開始位置
  • Event_type:log的類型信息
  • Server_id:能夠查看配置中的server_id, 表示log是那個服務器產生, server_id能夠在my.ini配置
  • End_log_pos:log在bin-log中的結束位置
  • Info: log的一些備註信息,能夠直觀的看出進行了什麼操做

經過mysqlbinlog命令能夠恢復數據,mysqlbinlog命令支持添加參數來恢復指定的事件:

mysqlbinlog --start-date="2019-07-04 18:00:00" --stop-date="2019-07-04 18:10:00" binlog.000003 |mysql -uroot -pmysqltao
複製代碼

錯誤日誌

MySQL的錯誤日誌記錄了 mysqld 啓動和中止時,以及服務器在運行過程當中出現的任何嚴重錯誤。

與binlog同樣,在my.ini文件配置:

# error log輸出的目錄及文件
log-error="C:/1workspace/develop/db/mysql/mysql57/logs/errorlog"
複製代碼

通用查詢日誌

通用查詢日誌可以存放到一個文本文件或者表中,所有鏈接和語句被記錄到該日誌文件或表,默認不開啓該日誌。

在my.ini文件[mysqld]組配置通用查詢日誌:

#通用查詢日誌輸出格式 [none|file|table|file,table]
log_output=file
#是否啓用通用查詢日誌[on|off] 
general_log=on
#通用查詢日誌位置及名字
general_log_file="C:/1workspace/develop/db/mysql/mysql57/logs/generallog"
複製代碼

慢查詢日誌

慢查詢日誌記錄的是查詢較慢的SQL語句的日誌,可用於對執行時間較長、執行效率較低的SQL語句的性能優化。

  1. 臨時開啓慢查詢日誌:
set global slow_query_log = on; 
複製代碼

若是想關閉慢查詢日誌,只須要執行:

set global slow_query_log = off;
複製代碼

2.臨時設置慢查詢時間臨界點

查詢時間高於這個臨界點的都會被記錄到慢查詢日誌中。

全部執行時間超過1秒的sql都將被記錄到慢查詢日誌:

set long_query_time = 1;
複製代碼
  1. 設置慢查詢存儲的方式
set globle log_output = file;
複製代碼

這裏設置爲了file,就是說慢查詢日誌是經過file保存,默認是none,咱們還能夠設置爲table,若是是table則慢查詢信息會保存到mysql庫下的slow_log表中。

  1. 查詢慢查詢日誌的開啓狀態和慢查詢日誌儲存的位置
show variables like '%quer%';
複製代碼

補充:事務日誌

事務日誌是InnoDB引擎特有的日誌,能夠幫助提升事務的效率。

使用事務日誌,存儲引擎在修改表的數據時只須要修改其內存拷貝,再把改修改行爲記錄到持久在硬盤上的事務日誌中,而不用每次都將修改的數據自己持久到磁盤。

事務日誌採用追加的方式,所以寫日誌的操做是磁盤上一小塊區域內的順序I/O,而不像隨機I/O須要在磁盤的多個地方移動磁頭,因此採用事務日誌的方式相對來講要快得多。

事務日誌持久之後,內存中被修改的數據在後臺能夠慢慢的刷回到磁盤。目前大多數的存儲引擎都是這樣實現的,咱們一般稱之爲預寫式日誌,修改數據須要寫兩次磁盤。

若是數據的修改已經記錄到事務日誌並持久化,但數據自己尚未寫回磁盤,此時系統崩潰,存儲引擎在重啓時可以自動恢復這部分修改的數據。具備的恢復方式則視存儲引擎而定。

查看事務日誌參數:

mysql> SHOWGLOBAL VARIABLES LIKE '%log%';
+-----------------------------------------+-----------------------------------+
| Variable_name                           | Value                             |
+-----------------------------------------+-----------------------------------+
| innodb_flush_log_at_trx_commit          | 1             |
|innodb_locks_unsafe_for_binlog          |OFF                               |
| innodb_log_buffer_size                  | 8388608                           |
|innodb_log_file_size                    |5242880                           |
| innodb_log_files_in_group               | 2                      |
|innodb_log_group_home_dir               |./            |
|innodb_mirrored_log_groups              |1              |
複製代碼

總結

  • MySQL日誌主要有:

錯誤日誌、通用查詢日誌、慢查詢日誌、事務日誌、二進制日誌

  • MySQL日誌的輸出位置通常有三種方式:

file(文件),table(表)、none(不保存)

  • MySQL日誌主要是用於:

異常監控、性能優化、數據恢復、主從同步


Wechat-westcall
相關文章
相關標籤/搜索