該篇文章對MySQL中的日誌進行總結與簡單介紹,不會涉及的太深。主要的目的是爲了對MySQL中的日誌文件有一個體系化的瞭解。後面會對每一種日誌文件作具體的分析與總結。mysql
MySQL中的日誌文件,配置文件、錯誤日誌文件、二進制文件(binary log)、慢查詢日誌(slow-query-log)、全量日誌(genera log)、審計日誌(audit log)、數據庫文件&數據表文件、存儲引擎文件、中繼日誌(relay log)、進程文件(PID)和Socket文件。sql
參數文件就是MySQL中的配置文件,在Linux下的my.cnf文件、Windows下的my.ini文件。文件內容主要分爲server和client兩個模塊。server模塊配置的是有關MySQL的服務信息,例如慢查詢日誌。client模塊配置的是有關MySQL客戶端鏈接信息,例如客戶端鏈接的端口號。
文件格式大體以下:數據庫
[client] port = 3306 default-character-set = utf8mb4 [mysqld] user = mysql port = 3306 sql_mode = "" default-storage-engine = InnoDB default-authentication-plugin = mysql_native_password character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' slow_query_log long_query_time = 3 slow-query-log-file = /var/lib/mysql/mysql.slow.log log-error = /var/lib/mysql/mysql.error.log default-time-zone = '+8:00'
錯誤日誌文件記錄了MySQL從啓動、運行和關閉幾個環節中的日誌信息。例如鏈接MySQL鏈接失敗、查詢命令錯誤、SQL執行流程等等。對於定位MySQL錯誤有着很大的幫助。
文件大體內容以下:安全
Version: '5.7.28-log' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) 2021-04-17T21:23:00.865868Z 3 [Note] Aborted connection 3 to db: 'exam_wechat' user: 'root' host: '172.18.0.1' (Got timeout reading communication packets) 2021-04-17T21:23:00.865969Z 2 [Note] Aborted connection 2 to db: 'exam_wechat' user: 'root' host: '172.18.0.1' (Got timeout reading communication packets) 2021-04-19T22:33:24.137143Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 18415ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.) 2021-04-20T07:03:21.765208Z 79 [Note] Access denied for user 'root'@'172.18.0.1' (using password: NO) 2021-04-20T07:03:23.825044Z 81 [Note] Aborted connection 81 to db: 'unconnected' user: 'root' host: '172.18.0.1' (Got an error reading communication packets) 2021-04-20T07:14:25.033983Z 82 [Note] Access denied for user 'root'@'172.18.0.1' (using password: NO) 2021-04-20T07:14:27.442608Z 84 [Note] Aborted connection 84 to db: 'unconnected' user: 'root' host: '172.18.0.1' (Got an error reading communication packets) 2021-04-20T07:27:13.971644Z 83 [Note] Aborted connection 83 to db: 'unconnected' user: 'root' host: '172.18.0.1' (Got timeout reading communication packets) 2021-04-20T07:41:02.916249Z 85 [Note] Aborted connection 85 to db: 'unconnected' user: 'root' host: '172.18.0.1' (Got timeout reading communication packets)
如何開始錯誤日誌。只要在MySQL中的配置文件中配置意向log_error便可。服務器
mysql root@127.0.0.1:(none)> show variables like '%log_error%'; +---------------------+--------------------------------+ | Variable_name | Value | +---------------------+--------------------------------+ | binlog_error_action | ABORT_SERVER | | log_error | /var/lib/mysql/mysql.error.log | | log_error_verbosity | 3 | +---------------------+--------------------------------+ 3 rows in set Time: 0.010s
全量日誌文件記錄的是MySQL全部的SQL操做日誌記錄。例如增刪改查等操做都會被記錄下來。網絡
mmysql root@127.0.0.1:(none)> show variables like '%general%'; Reconnecting... +------------------+---------------------------------+ | Variable_name | Value | +------------------+---------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/7fdc5f723ff9.log | +------------------+---------------------------------+
配置項有三種值,table,none和file。配置file則會記錄在日誌文件中,配置none則不會記錄,配置table則會在MySQL默認的MySQL數據中建立一張表(表名叫作general-log)來記錄日誌。socket
不推薦開啓,記錄的日誌文件太多,不單單有性能消耗同時也佔用太多無效空間。oop
# 日誌記錄文件格式 mysqld, Version: 5.7.28-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock Time Id Command Argument 2021-04-20T09:16:48.572888Z 88 Connect root@172.18.0.1 on using TCP/IP 2021-04-20T09:16:48.574591Z 88 Connect Access denied for user 'root'@'172.18.0.1' (using password: NO) 2021-04-20T09:16:50.325379Z 89 Connect root@172.18.0.1 on using TCP/IP 2021-04-20T09:16:50.329894Z 89 Query select connection_id() 2021-04-20T09:16:50.335222Z 89 Query SELECT @@VERSION 2021-04-20T09:16:50.339432Z 90 Connect root@172.18.0.1 on using TCP/IP 2021-04-20T09:16:50.339621Z 89 Query SELECT @@VERSION_COMMENT 2021-04-20T09:16:50.343525Z 90 Query select connection_id() 2021-04-20T09:16:50.347115Z 90 Query SHOW DATABASES 2021-04-20T09:16:50.380236Z 90 Query select TABLE_NAME, COLUMN_NAME from information_schema.columns where table_schema = 'None' order by table_name,ordinal_position 2021-04-20T09:16:50.391019Z 90 Query SELECT CONCAT("'", user, "'@'",host,"'") FROM mysql.user 2021-04-20T09:16:50.415062Z 90 Query SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE="FUNCTION" AND ROUTINE_SCHEMA = "None" 2021-04-20T09:16:50.432015Z 90 Query SELECT name from mysql.help_topic WHERE name like "SHOW %" 2021-04-20T09:16:52.572608Z 89 Query show variables like '%general%' 2021-04-20T09:17:13.532046Z 89 Query show variables like '%general%'
慢查詢日誌是定位SQL語句查詢快與慢而記錄的一種日誌文件。當某一條SQL語句查詢時間超過一個固定的閾值,這條SQL語句將被定義爲慢查詢的SQL語句,被記錄在慢查詢日誌文件中。性能
慢查詢的配置主要有以下三個參數。spa
是否開啓慢查詢與慢查詢日誌文件。
mysql root@127.0.0.1:(none)> show variables like '%slow%'; +---------------------------+-------------------------------+ | Variable_name | Value | +---------------------------+-------------------------------+ | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/mysql.slow.log | +---------------------------+-------------------------------+ 5 rows in set Time: 0.014s
慢查詢時間閾值。
mysql root@127.0.0.1:(none)> show variables like '%long_query_time%'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 3.000000 | +-----------------+----------+ 1 row in set Time: 0.013
二進制日誌(binary log)文件用於記錄MySQL的DML語句,記錄了操做以後的物理日誌內容,不會記錄MySQL中的select、show等語句。二進制日誌文件主要的做用以下:
能夠經過以下幾個參數進行配置:
mysql root@127.0.0.1:(none)> show variables like '%log_bin%'; Reconnecting... +---------------------------------+--------------------------------+ | Variable_name | Value | +---------------------------------+--------------------------------+ | log_bin | ON | | log_bin_basename | /var/lib/mysql/mysql-bin | | log_bin_index | /var/lib/mysql/mysql-bin.index | +---------------------------------+--------------------------------+ 6 rows in set Time: 0.015s
log_bin是否開啓二進制日誌文件,log_bin_basename存儲的目錄以及日誌文件前綴,log_bin_index存儲日誌文件索引(日誌文件名稱)。若是日誌文件沒有指定文件名稱,則默認使用本機名稱。
日誌文件列表。
-rw-r----- 1 mysql root 154 Apr 12 09:31 mysql-bin.000041 -rw-r----- 1 mysql root 154 Apr 12 19:45 mysql-bin.000042 -rw-r----- 1 mysql root 1459325 Apr 17 20:26 mysql-bin.000043 -rw-r----- 1 mysql mysql 24576 Apr 17 22:18 mysql-bin.000044
# cat mysql-bin.index ./mysql-bin.000001 ./mysql-bin.000002 ./mysql-bin.000003 ./mysql-bin.000004 ./mysql-bin.000005 ./mysql-bin.000006
審計日誌用來記錄MySQL的網絡活動,對MySQL的操做記錄作統計、分析與報告等。屬於對MySQL安全監控記錄類的日誌文件。
MySQL自身不包含該功能的,而且該功能在MySQL官網也是收費的。這裏也不作具體的演示。
中繼日誌是MySQL主從複製,在從服務器上的一個重要角色。當主服務器將二進制文件發送給從服務器時,從服務器不會立馬執行,而是放在一個指定的一類日誌文件中,從服務器在開啓一個SQL線程去讀取中繼日誌文件內容並寫入到自身數據中。
PID是一個MySQL實例的進程文件號。MySQL屬於單進程服務,在啓動一個MySQL實例,就會建立一個PID文件。
Socket也是MySQL通訊的一種方式。MySQL通訊有兩種方式,TCP和Socket方式。TCP是走網絡通訊,能夠將服務部署到任意能夠訪問的服務器上。Socket是走的文件通訊方式,必須在同一臺服務器上。
# TCP模式 mysql -hxxxx -pxxxx -uxxxx -Pxxx
mysql -uxxxx -pxxxx -s /path/socket
數據庫與表值的就是MySQL中的表結構文件、數據文件和索引文件。
InnoDB存儲引擎的數據表結構
-rw-r----- 1 mysql root 13650 Apr 13 09:46 wechat_user.frm -rw-r----- 1 mysql mysql 98304 Apr 17 13:43 wechat_user.ibd
MyISAM存儲引擎的數據表結構
-rw-r----- 1 mysql mysql 0 Apr 20 17:53 users.MYD -rw-r----- 1 mysql mysql 1024 Apr 20 17:53 users.MYI -rw-r----- 1 root root 8586 Apr 20 17:53 users.frm
不一樣的存儲引擎,實現起來也不一樣。InnoDB存儲引擎分爲redolog和undolog兩種日誌文件。