网站建设知识
MySQL服务器日志
2025-07-22 10:01  点击:1

??参考MySQL5.7官方文档
??MySQL服务器有以下几种类型的日志,通过这些日志,可以知道服务器的活动;

错误日志:记录了mysqld启动、运行、停止时,所遇到的问题; 普通查询日志:日志记录了服务器建立的客户端连接,以及来自客户端的查询语句; 二进制日志:记录了更新数据的语句,也包括复制数据的语句; 中继日志:只有主从复制的slave服务器才会有,记录的是来自主服务器的数据变化; 慢查询日志:记录的是查询时间超过变量long_query_time秒的查询; DDL日志:也叫元数据日志,记录的是通过DDL进行的元数据操作;

??关于中继日志,可以先参考文章高性能MySQL主从架构的复制原理及配置详解

1 设置普通查询日志和慢查询日志的输出

??mysql服务器可以让用户灵活地普通查询日志和通用查询日志的输出地方,可以分为两种,在服务器启动时设置和在服务器运行时设置;
??参考:dev.mysql/doc/refman/5.7/en/log-destinations.html

1.1 在服务器启动时

??如果要指定日志的输出形式,需要使用log-out-put选项,但是不能启用日志记录功能;

    --log-out-put=TABLE,FILE

??log-out-put选项有3种取值:TABLE,FILE,NONE;默认值为FILE。
??TABLE:将日志分别输出到数据库mysql的general_log和 slow_log表中;
??FILE:将日志输出到文件中;
??NONE:禁止日志输出;
??可以同时取值多个,中间用逗号隔开;当取值为多个时,NONE的优先级最高;

??如果要启用日志输出功能,需要使用选项general-log和选项slow-query-log,默认状态都是OFF禁用;

    --general-log=1    --slow-query-log=1

??general-log指定普通查询日志的状态,取值为0或1,默认为0;1代表启用,0或不指定代表禁用;
??slow-query-log指定慢查询日志的状态,取值为0或1,默认为0;1代表启用,0或不指定代表禁用;

??如果指定日志输出到文件,还要指定日志文件的位置,需要使用选项general-log-file和选项slow-query-log-file;

    --general-log-file=file_name    --slow-query-log-file=file_name

??general-log-file选项指定普通查询日志的文件名称,默认是hostname.log;
??slow-query-log-file选项指定慢查询日志的文件名称,默认是hostname-slow.log;
??查看本人机器服务器如下:

mysql> show variables like 'slow_query_log%';+---------------------+---------------------------------------------------------+| Variable_name       | Value                                                   |+---------------------+---------------------------------------------------------+| slow_query_log      | OFF                                                     || slow_query_log_file | /usr/local/mysql/data/xxxdeMacBook-Pro-slow.log |+---------------------+---------------------------------------------------------+2 rows in set (0.00 sec)mysql> show variables like 'general_log%';+------------------+----------------------------------------------------+| Variable_name    | Value                                              |+------------------+----------------------------------------------------+| general_log      | OFF                                                || general_log_file | /usr/local/mysql/data/xxxdeMacBook-Pro.log |+------------------+----------------------------------------------------+2 rows in set (0.01 sec)mysql> 

??使用举例:

把普通查询日志,写到文件和表中:
--log-output=TABLE,FILE --general_log=1
把普通查询日志和慢查询日志,只写到表中:
--log-output=TABLE --general_log=1--slow_query_log=1
把慢查询日志,只写到文件中:
--log-output=FILE (可以省略)--slow_query_log=1

1.2在服务器运行时

??通过控制与日志相关的系统变量,可以在服务器运行时,动态地控制日志的输出。

global变量log_output:当前日志输出的目的地,可以动态修改; global变量general_log和slow_query_log:普通查询日志和慢查询日志的启用(ON)与禁用(OFF),可以动态修改; global变量general_log_file和slow_query_log_file:普通查询日志和慢查询日志的文件名称,可以在服务器启动时设置,可以在运行时动态修改; session变量sql_log_off:控制当前连接的查询日志的启用(ON)与禁用(OFF);

2 错误日志

dev.mysql/doc/refman/5.7/en/error-log.html
- mysqld在启动、停止、以及运行过程中的错误日志;
- mysqld检查表、修复表的信息;
- mysqld非正常退出时的栈跟踪信息;
- mysqld_safe使用mysqld启动时,如果mysqld非正常退出,mysqld_safe重启mysqld的信息;

??mysqld写错误日志时,使用log-error选项:

 --log-error[=file_name]

??没有log-error选项时,错误日志输出到标准输出中;
??如果file_name有文件名,则会创建该文件;否则,写到默认文件host_name.err文件中;
??如果错误日志输出到标准输出中,则log_error变量为stderr,本机器上的值为:

+---------------------+----------------------------------------+| Variable_name       | Value                                  |+---------------------+----------------------------------------+| log_error           | /usr/local/mysql/data/mysqld.local.err || log_error_verbosity | 3                                      |+---------------------+----------------------------------------+2 rows in set (0.00 sec)mysql> 

??关于错误日志的更多内容,可以查看官方文档;

3 普通查询日志

??第一节中已经介绍如何开启普通查询日志以及设置输出目的地,这里补充几点:

??主从复制时,如果采用基于语句的二进制日志:

slave会把从master接收到的语句写入到slave的查询日志中; 当slave使用mysqlbinlog工具从master读事件时,master会把语句写到master的查询日志中;

??如果采用基于行的二进制日志,则不会将更新语句,记录到查询日志中;
??如果采用基于混合模式的二进制日志,更新语句可能会记录到查询日志中,具体可参考:dev.mysql/doc/refman/5.7/en/replication-sbr-rbr.html;

??服务器重启和日志刷新都不会产生新的日志文件,可以采用如下方式:

shell> mv host_name.log host_name-old.logshell> mysqladmin flush-logsshell> mv host_name-old.log backup-directory

??可以使用选项log-raw禁止语句中的密码重写,但是会带来安全风险:

4 二进制日志

??记录了数据库变化的事件,比如表的创建、表数据的更新;使用基于语句的日志模式时,还包含更新语句;此外,还包含更新数据时的耗时;

??二进制日志有两个重要目的:

主从复制 备份恢复

4.1 服务器启动时,开启binlog

??启动服务器时,可以使用log_bin选项开启日志:

 --log-bin[=base_name]

??该选项是global,如果设置base_name,会使得系统变量log_bin的值为ON,而不是[base_name];系统变量log_bin_basename对应的值才是[base_name];
??默认情况下,log_bin变量为OFF:

mysql> show variables like 'log_bin%';+---------------------------------+-------+| Variable_name                   | Value |+---------------------------------+-------+| log_bin                         | OFF   || log_bin_basename                |       || log_bin_index                   |       || log_bin_trust_function_creators | OFF   || log_bin_use_v1_row_events       | OFF   |+---------------------------------+-------+5 rows in set (0.01 sec)

??MySQL5.7.3以后,开启日志,还需要指定选项sever-id;
??mac os下开启二进制日志方法如下:

??(1)拷贝默认的配置文件到/etc目录下

sudo cp my-default.cnf /etc/ 

??(2)重名配置文件为my.cnf

mv my-default.cnf my.cnf                         

??(3)编辑文件my.cnf, 编辑两个选项值

log_bin=my_log_base_nameserver_id = 1

??(4)重启mysql服务器

sudo /usr/local/mysql/support-files/mysql.server stopsudo /usr/local/mysql/support-files/mysql.server start

??(5)登录mysql服务器,查询日志相关的系统变量:

mysql> show variables like 'log_bin%';+---------------------------------+----------------------------------------------+| Variable_name                   | Value                                        |+---------------------------------+----------------------------------------------+| log_bin                         | ON                                           || log_bin_basename                | /usr/local/mysql/data/my_log_base_name       || log_bin_index                   | /usr/local/mysql/data/my_log_base_name.index || log_bin_trust_function_creators | OFF                                          || log_bin_use_v1_row_events       | OFF                                          |+---------------------------------+----------------------------------------------+5 rows in set (0.01 sec)

??(6)导入mysql测试库的建库建表语句以及测试数据:
??????数据下载及导入
??查看二进制日志文件,这里会看到二进制文件的名称为my_log_base_name.000001,前缀是在步骤3中设置的,后缀则是以数字结尾的。

ls /usr/local/mysql/dataauto.cnf                           my_log_base_name.indexemployees                          mysqlib_buffer_pool                     mysqld_safe.pidib_logfile0                        performance_schemaib_logfile1                        sysibdata1                            zhengweiwzwdeMacBook-Pro.local.erribtmp1                             zhengweiwzwdeMacBook-Pro.local.pidmy_log_base_name.000001

4.2 binlog文件概述

??binlog文件是以数字后缀结尾的,服务器每产生一个binlog文件时,后缀数字就会自动加1;

??生成新binlog文件的情况有:

服务器启动时; 刷新日志(flush logs)时; 当前日志文件的大小超过max_binlog_size时;

??4.1小节最后列出的文件,有一个名为my_log_base_name.index的文件,这个文件保存了已经被用到的binlog文件,可以使用选项log-bin-index修改文件名称;查看文件内容如下:

sudo cat my_log_base_name.index./my_log_base_name.000001