MySQL日志管理

1、MySQL日志概述

日志是数据库的重要组成部分,主要用来记录数据库的运行情况、日常操作和错误信息。为了维护 MySQL 数据库,经常需要在 MySQL 中进行日志操作,包含日志文件的启动、查看、停止和删除等,这些操作都是数据库管理中最基本、最重要的操作。

1.1 日志分类

  • 二进制日志
  • 错误日志
  • 通用查询日志
  • 慢查询日志

1.2 日志作用

二进制日志:

  • 该日志文件会以二进制的形式记录数据库的各种操作,但不记录查询语句,二进制日志中的记录可以用来修复数据库。

错误日志:

  • 该日志文件会记录 MySQL 服务器的启动、关闭和运行错误等信息;默认只开启错误日志。

通用查询日志:

  • 该日志记录 MySQL 服务器的启动和关闭信息、客户端的连接信息、更新、查询数据记录的 SQL 语句等。

慢查询日志:

  • 记录执行事件超过指定时间的操作,通过工具分析慢查询日志可以定位 MySQL 服务器性能瓶颈所在。

使用日志有优点也有缺点,启动日志后,虽然可以对 MySQL 服务器性能进行维护,但是会降低 MySQL 的执行速度;日志文件还会占用大量的硬盘空间。对于用户量非常大、操作非常频繁的数据库,日志文件需要的存储空间甚至比数据库文件需要的存储空间还要大。因此,是否启动日志,启动什么类型的日志要根据具体的应用来决定。

2、二进制日志(Binary Log)

二进制日志(Binary Log)也可叫作变更日志(Update Log),是 MySQL 中非常重要的日志。主要用于记录数据库的变化情况。

//在数据库中查看二进制日志是否开启
MariaDB [(none)]> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.001 sec)

//在配置文件中开启二进制日志
[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server_id=1			//服务id号,不可重复,为0则拒绝从服务器连接
log_bin=mysql-bin	//二进制日志文件名称
expire_logs_days=10	//二进制日志过期时间,默认为0
max_binlog_size=100M	//单个文件二进制日志文件大小,默认1G
:wq!

//重启服务
[root@localhost ~]# systemctl restart mariadb

//二进制日志文件存放位置
[root@localhost ~]# ls /var/lib/mysql/
aria_log.00000001  ib_logfile0  multi-master.info  mysql.sock
aria_log_control   ib_logfile1  mysql              mysql_upgrade_info
hzz                ibdata1      mysql-bin.000001   performance_schema
ib_buffer_pool     ibtmp1       mysql-bin.index

//查看二进制日志文件内容
[root@localhost ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000001 
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
........略.........

//登录数据库查看二进制日志已经开启
MariaDB [(none)]> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.001 sec)

//在数据库中查看有哪些二进制日志文件
MariaDB [(none)]> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       328 |
| mysql-bin.000002 |       371 |
+------------------+-----------+

//在数据库中查看正在写入的是哪个二进制日志文件
MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      371 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

//在数据库中删除'mysql-bin.000002'之前所有的二进制日志文件
MariaDB [(none)]> PURGE MASTER LOGS TO 'mysql-bin.000002';
Query OK, 0 rows affected (0.001 sec)

//在数据库中查看剩下的二进制日志发现'mysql-bin.000002'之前的日志都被删除
MariaDB [(none)]> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000002 |       371 |
+------------------+-----------+
1 row in set (0.000 sec)

//在数据库中根据时间删除二进制日志文件,删除该时间之前的所有二进制日志
MariaDB [(none)]> PURGE MASTER LOGS BEFORE '2021-03-05 19:16:01';
Query OK, 0 rows affected (0.000 sec)

//在数据库中删除所有二进制日志
MariaDB [(none)]> RESET MASTER;
Query OK, 0 rows affected (0.004 sec)

//在数据库中暂停二进制日志进行记录,暂停并不是关闭
MariaDB [(none)]> SET sql_log_bin=0;
Query OK, 0 rows affected (0.000 sec)

//在数据库中开启二进制日志继续记录
MariaDB [(none)]> SET sql_log_bin=1;
Query OK, 0 rows affected (0.000 sec)

3、错误日志(Error Log)

错误日志(Error Log)是 MySQL 中最常用的一种日志,主要记录 MySQL 服务器启动和停止过程中的信息、服务器在运行过程中发生的故障和异常情况等;作为初学者,要学会利用错误日志来定位问题。

//在数据库中查看错误日志存放的位置信息
MariaDB [(none)]> SHOW VARIABLES LIKE 'log_error';
+---------------+------------------------------+
| Variable_name | Value                        |
+---------------+------------------------------+
| log_error     | /var/log/mariadb/mariadb.log |
+---------------+------------------------------+
1 row in set (0.001 sec)

//如果错误日志未开启,在配置文件中开启错误日志
[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
log-error=/var/log/mariadb/mariadb.log	//配置文件中默认存在
:wq!

//重启服务
[root@localhost ~]# systemctl restart mariadb

//查看错误日志
[root@localhost ~]# cat /var/log/mariadb/mariadb.log
2021-03-05 19:22:18 11 [ERROR] MYSQL_BIN_LOG::purge_logs was called with file ./2021-3-5 19:22:00 not listed in the index.
2021-03-05 19:22:52 11 [ERROR] MYSQL_BIN_LOG::purge_logs was called with file ./2021-3-5 19:22:00 not listed in the index.
....略......

//清空错误日志
[root@localhost ~]# > /var/log/mariadb/mariadb.log

4、通用查询日志(General Query Log)

通用查询日志(General Query Log)用来记录用户的所有操作,包括启动和关闭 MySQL 服务、更新语句和查询语句等。默认情况下,通用查询日志功能是关闭的。

//在数据库中查看通用查询日志开启状态和存放的位置信息
MariaDB [(none)]> SHOW VARIABLES LIKE '%general%';
+------------------+---------------+
| Variable_name    | Value         |
+------------------+---------------+
| general_log      | OFF           |
| general_log_file | localhost.log |
+------------------+---------------+
2 rows in set (0.001 sec)

//在配置文件中开启通用查询日志
[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf 
[mysqld]
general_log=on		//开启通用查询日志
general_log_file=/var/lib/mysql/mysql-log.log	//通用查询日志存放位置
:wq!

//重启服务
[root@localhost ~]# systemctl restart mariadb

//在数据库中查看通用查询日志已经开启,通用查询日志会记录用户的所有行为
MariaDB [(none)]> SHOW VARIABLES LIKE '%general%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | ON                           |
| general_log_file | /var/lib/mysql/mysql-log.log |
+------------------+------------------------------+
2 rows in set (0.001 sec)

//在数据库中 开启/关闭 通用查询日志
MariaDB [(none)]> SET GLOBAL general_log=on/off;
Query OK, 0 rows affected (0.000 sec)

//清空通用查询日志
[root@localhost ~]# > /var/lib/mysql/mysql-log.log

5、慢查询日志(Slow Query Log)

慢查询日志用来记录在 MySQL 中执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率低,以便进行优化。通俗的说,MySQL 慢查询日志是排查问题的 SQL 语句,以及检查当前 MySQL 性能的一个重要功能。如果不是调优需要,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。

//在数据库中查看慢查询日志开启状态和存放的位置信息
MariaDB [(none)]> SHOW VARIABLES LIKE '%slow_query%';
+---------------------+--------------------+
| Variable_name       | Value              |
+---------------------+--------------------+
| slow_query_log      | OFF                |
| slow_query_log_file | localhost-slow.log |
+---------------------+--------------------+
2 rows in set (0.001 sec)

//在数据库中查看慢查询日志规定超时时间
MariaDB [(none)]> SHOW VARIABLES LIKE '%long_query_time%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.000 sec)

//在配置文件中开启慢查询日志,并设置超时时间
[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf 
[mysqld]
slow_query_log=on	//开启慢查询日志
slow_query_log_file=/var/lib/mysql/mysql-slow.log	//慢查询日志存放位置
long_query_time=5	//慢查询日志查询超时时间

//重启服务
[root@localhost ~]# systemctl restart mariadb

//在数据库中查看慢查询日志已经开启,时间设置为5秒
MariaDB [(none)]> SHOW VARIABLES LIKE '%slow_query%';
+---------------------+-------------------------------+
| Variable_name       | Value                         |
+---------------------+-------------------------------+
| slow_query_log      | ON                            |
| slow_query_log_file | /var/lib/mysql/mysql-slow.log |
+---------------------+-------------------------------+
2 rows in set (0.000 sec)

MariaDB [(none)]> SHOW VARIABLES LIKE '%long_query_time%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
1 row in set (0.000 sec)

//在数据库中 继续/暂停 慢查询日志,
MariaDB [(none)]> SET GLOBAL slow_query_log=on/off;
Query OK, 0 rows affected (0.000 sec)

//清空通用查询日志
[root@localhost ~]# > /var/lib/mysql/mysql-slow.log

6、日志输出方式(Log Output)

MySQL 的查询日志支持写入到文件或写入数据表两种输出形式。启用了通用查询日志或慢查询日志功能后,可以选择让服务器把日志写入到日志文件或mysql数据库中的日志表、或者同时写到这两个地方。

//在数据库中查看日志存放方式
MariaDB [(none)]> SHOW VARIABLES LIKE '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.000 sec)

//在数据库中设置日志输出方式为TABLE
MariaDB [(none)]> SET GLOBAL log_output='TABLE';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> SHOW VARIABLES LIKE '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | TABLE |
+---------------+-------+
1 row in set (0.001 sec)

//在数据库中设置日志输出方式为FILE和TABLE
MariaDB [(none)]> SET GLOBAL log_output='FILE,TABLE';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> SHOW VARIABLES LIKE '%log_output%';
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| log_output    | FILE,TABLE |
+---------------+------------+
1 row in set (0.001 sec)

//日志表存放在mysql库中,可以直接用select查看表中内容
MariaDB [(none)]> SHOW TABLES FROM mysql LIKE '%log%';
+-------------------------+
| Tables_in_mysql (%log%) |
+-------------------------+
| general_log             |
| slow_log                |
+-------------------------+
2 rows in set (0.000 sec)