MySQL(二十二)其他数据库日志(一)通用查询日志和错误日志

MySQL(二十二)其他数据库日志(一)通用查询日志和错误日志


1 MySQL支持的日志


1.1 日志类型
  • 慢查询日志:记录执行时间超过long_query_time的所有查询,方便我们对查询进行优化
  • 通用查询日志:记录所有连接的起始和终止时间,以及连接发送给数据库的所有指令,对复原操作的实际场景、发现问题甚至是对数据库操作的审计都有很大的作用
  • 错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便了解服务器的状态,从而对服务器进行维护
  • 二进制日志:记录所有更新数据的语句,可以用于主从服务器之间的数据同步以及服务器遇到故障的时候数据的无损失恢复
  • 中继日志(MySQL8.0新增):用于主从服务器架构中,从服务器用来存放主服务器二进制文件内容的一个中间文件,从服务器通过读取中继日志的内容,来同步主服务器上的操作
  • 数据定义语句日志(MySQL8.0新增):记录数据定义语句执行的元数据操作

除了二进制日志外,其他的文件都是文本文件。默认情况下,所有的日志文件都创建于MySQL数据目录中。

1.2 日志的弊端
  • 日志功能会降低MySQL的性能。例如在查询频繁的数据库中开启通用查询日志和慢查询日志,MySQL数据库会花费很多时间去记录日志
  • 日志文件会占据大量的磁盘空间

2 慢查询日志


​ 详见MySQL(十三)MySQL性能分析工具:慢查询日志与PROFILE查询成本

3 通用查询日志


​ 通用查询日志记录所有连接的起始和终止时间,以及连接发送给数据库的所有指令,对复原操作的实际场景、发现问题甚至是对数据库操作的审计都有很大的作用

3.1 问题场景
image-20230509143607789
3.2 查看当前状态
mysql> show variables like '%general%';
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | OFF                             |
| general_log_file | /var/lib/mysql/89d64201156e.log |
+------------------+---------------------------------+
2 rows in set (0.00 sec)

general_log:通用日志状态,默认是关闭的

general_log_file:通用日志生成路径,没有开启通用日志是查不到的

3.3 启动日志
  • 永久修改,在my.conf配置文件中的[mysqld]组下加入log选项,并重启MySQL服务

    [mysqld]
    genral_log = on
    genral_log_file = xxx # 如果不指定,默认为hostname.log
    
  • 临时性方式

    mysql> set global general_log = on;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> cat /var/lib/mysql/89d64201156e.log;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cat /var/lib/mysql/89d64201156e.log' at line 1
    mysql> show variables like '%general%';
    +------------------+---------------------------------+
    | Variable_name    | Value                           |
    +------------------+---------------------------------+
    | general_log      | ON                              |
    | general_log_file | /var/lib/mysql/89d64201156e.log |
    +------------------+---------------------------------+
    2 rows in set (0.01 sec)
    

    设置完成后即可查看:

    bash-4.4# cat /var/lib/mysql/89d64201156e.log
    /usr/sbin/mysqld, Version: 8.0.31 (MySQL Community Server - GPL). started with:
    Tcp port: 3306  Unix socket: /var/run/mysqld/mysqld.sock
    Time                 Id Command    Argument
    2023-05-09T06:38:42.730222Z      3596 Query     show variables like '%general%'
    
3.4 停止日志
  • 永久修改,在my.conf配置文件中的[mysqld]组下加入log=off选项或者注释掉,并重启MySQL服务

    [mysqld]
    general_log = off
    #general_log = off
    
  • 临时性方式

    SET GLOBAL general_log = off;
    
3.5 删除、刷新日志

​ 如果数据使用特别频繁,那么通用查询日志会占用服务器特别大的磁盘空间,数据管理员可以删除很长时间之前的通用查询日志,以保证MySQL服务器上的磁盘空间。

​ 然后使用下面的命令重新生成通用查询日志文件,前提是一定要开启通用日志

mysqladmin -uroot -p flush-logs;

​ 如果希望备份原文件:

bash-4.4# cd /var/lib/mysql/                
bash-4.4# ls
'#ib_16384_0.dblwr'   89d64201156e.log   binlog.000007   binlog.000011   binlog.000015   ca.pem            dbtest2         grainmall_sms    ibdata1     mysql.sock           public_key.pem    sys
'#ib_16384_1.dblwr'   atguigudb          binlog.000008   binlog.000012   binlog.index    client-cert.pem   document        grainmall_ums    ibtmp1      mysqlTest            renren_fast       undo_001
'#innodb_redo'        atguigudb1         binlog.000009   binlog.000013   blog            client-key.pem    grainmall_oms   grainmall_wms    mysql       performance_schema   server-cert.pem   undo_002
'#innodb_temp'        auto.cnf           binlog.000010   binlog.000014   ca-key.pem      dbtest1           grainmall_pms   ib_buffer_pool   mysql.ibd   private_key.pem      server-key.pem
# 备份日志文件
bash-4.4# mv /var/lib/mysql/89d64201156e.log /var/lib/mysql/89d64201156e.log.bak

# 重新生成
bash-4.4# mysqladmin -uroot -p flush-logs;
Enter password: 

bash-4.4# cat /var/lib/mysql/89d64201156e.log;
/usr/sbin/mysqld, Version: 8.0.31 (MySQL Community Server - GPL). started with:
Tcp port: 3306  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
2023-05-09T06:53:27.135253Z      3613 Quit

4 错误日志


错误日志记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便了解服务器的状态,从而对服务器进行维护。如果MySQL服务出现异常,错误日志是发现问题解决问题的首选

4.1 启动日志

​ 在MySQL中错误日志功能是默认开启的,并且无法关闭。默认情况下错误日志存储在mysql数据目录下的mysqld.log(linux系统)或hostname.err(mac系统)。如果需要更改可以在my.cnf配置文件中进行配置:

[mysqld]
log-error=xxxx
4.2 查看日志
mysql> show variables like 'log_err%';
+---------------------+---------------------+
| Variable_name       | Value               |
+---------------------+---------------------+
| log_error           | /var/log/mysqld.log |
| log_error_verbosity | 3                   |
+---------------------+---------------------+
2 rows in set (0.02 sec)

image-20230509151455128

​ 可以看到错误日志中记录了服务器启动的时间,以及存储引擎InnoDB启动和停止的时间,最初在做初始化的时候生成的数据库初始密码也是放在mysqld.log文件中的。

4.3 删除、刷新日志

​ 和上面通用日志差不多,但是这里可能会报错,这是由于flush-logs的更新:

  • MySQL5.5.7以前的版本,flush-logs会将错误日志重命名为filename.err_old,并创建新的日志

  • MySQL5.5.7开始,flush-logs只是重新打开日志文件,并不会做日志的备份和创建工作,所以需要自行创建新日志文件

    install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log
    
mysqladmin -uroot -p flush-logs;
MySQL 8新特性
image-20230509152235466
posted @ 2023-05-09 20:24  Tod4  阅读(67)  评论(0编辑  收藏  举报