MySQL中的日志文件 你全都了解吗?

卡二条的技术圈

共 8363字,需浏览 17分钟

 ·

2021-04-22 01:39

简介

该篇文章对MySQL中的日志进行总结与简单介绍,不会涉及的太深。主要的目的是为了对MySQL中的日志文件有一个体系化的了解。后面会对每一种日志文件做具体的分析与总结。

日志分类

MySQL中的日志文件,配置文件、错误日志文件、二进制文件(binary log)、慢查询日志(slow-query-log)、全量日志(genera log)、审计日志(audit log)、数据库文件&数据表文件、存储引擎文件、中继日志(relay log)、进程文件(PID)和Socket文件。

Snipaste_2021-04-20_16-55-53

参数文件

参数文件就是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)来记录日志。

不推荐开启,记录的日志文件太多,不仅仅有性能消耗同时也占用太多无效空间。

# 日志记录文件格式
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语句,被记录在慢查询日志文件中。

慢查询的配置主要有如下三个参数。

是否开启慢查询与慢查询日志文件。

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等语句。二进制日志文件主要的作用如下:

  1. 用户主从复制,主服务器将二进制文件中的物理日志发送给从服务器,从服务器在将日志写入到自身。

  2. 用于数据恢复。根据物理日志,找回数据丢失之前的操作日志。

可以通过如下几个参数进行配置:

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文件

PID是一个MySQL实例的进程文件号。MySQL属于单进程服务,在启动一个MySQL实例,就会创建一个PID文件。

Socket文件

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两种日志文件。

发现好物

这只一个非常不错的生活类微信小程序。

推荐阅读

MySQL函数sum使用场景解读

全面分析与总结 MySQL 事务中那些事儿

玩转dnmp之MySQL实现主从复制操作



浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报