MySQL 中有六种日志文件,分别是 二进制日志(
binary log)、
错误日志(error log)、
慢查询日志(slow query log)、
通用查询日志(general query log)、
中继日志(relay log)、
元数据日志(metadata log),这些日志文件在数据库中各司其职。
错误日志
错误日志是用来记录 MySQL 服务器在启动、停止和运行过程中发生任何严重警告和错误的信息。
查看错误日志的位置:
SHOW VARIABLES LIKE 'LOG_ERROR'
中继日志
中继日志是用于主从复制,临时存储从主库同步的二进制日志,也就说该服务器将主服务器的二进制日志读取后记录到从服务器的本地文件中,服务器会读取日志内容并应用,这样使得主从服务器的数据保持一致。
查看中继日志的具体信息:
SHOW VARIABLES LIKE '%RELAY%'

max_relay_log_size:是中继日志允许的最大值,若该值为 0,则默认其最大值为 1 G。relay_log:定义了中继日志的位置和名称,若值为空,则是在数据文件的默认位置。relay-log_basename:也是定义了中继日志的位置和名称。relay_log_index:定义了中继日志索引的位置和名称。relay_log_info_repository:确定中继日志是放在 FILE 还是 TABLE 里。relay_log_purge:是否自动清空中继日志,ON 为启动。relay_log_recovery:当中继日志损坏,是否保存所有未执行的中继日志,OFF 为关闭。relay_log_space_limit:设置中继日志最大限额。sync_relay_log:是否把日志写入缓存。
普通查询日志
普通查询日志是记录客户端连接数据库执行语句时所产生的日志。 普通查询日志默认是关闭的,查看普通查询日志是否开启:
SHOW VARIABLES LIKE '%GENERAL_LOG%'

可以看到普通查询日志目前是关闭状态,开启普通查询日志可以使用以下语句:
SET GLOBAL GENERAL_LOG=ON
关闭普通查询日志:
SET GLOBAL GENERAL_LOG=OFF
若访问量很大时,建议不要开启普通查询日志,因为它的信息量很大,会导致磁盘性能问题。
普通查询日志的默认输出格式为 FILE,我们可以使用以下语句查看输出格式:
SHOW VARIABLES LIKE'%LOG_OUTPUT%'
还可以设置它的输出格式为 TABLE,设置语句如下所示:
SET GLOBAL LOG_OUTPUT='TABLE';
值得注意的是,这些命令是临时有效,重启 MySQL 后就会失效,如果想永久有效需要去系统中配置。
慢查询日志
慢查询日志是用来记录所有执行时间超过 long_query_time 秒的所有查询,其 long_query_time 的默认值为 10 秒,运行时间在 10 秒以上的是慢查询语句。在 MySQL 中是默认不开启慢日志的。
查看是否开启了慢日志:
SHOW VARIABLES LIKE '%QUERY%'

long_query_time:指定慢查询的时间阀值,默认为 10。slow_query_log:是否开启慢日志,默认是关闭。slow_query_log_file:是记录慢日志到文件中的路径。
开启慢查询日志:
SET GLOBAL SLOW_QUERY_LOG=ON
还可以修改慢查询的默认阀值,比如我们把它的阀值修改为 5,命令如下所示:
# 修改阀值 为 5
SET GLOBAL LONG_QUERY_TIME=5;
# 查看修改后的阀值
SELECT @@GLOBAL.LONG_QUERY_TIME;
二进制日志
二进制日志是记录了所有的数据定义语句和数据操纵语句,当数据库的内容发生改变时,会产生二进制日志文件,它也被用来实现主从复制功能。二进制日志的格式有三种,分别是 STATEMENT、ROW、MIXED。接下来给大家简单介绍一下这三种格式吧。
STATEMENT是语句格式,通过mysqlbinlog工具可以清楚看到每条语句的文本。ROW是将每一行变更记录到日志中。MIXED是混合了STATEMENT和ROW这两种格式。
查看二进制日志的相关信息:
SHOW VARIABLES LIKE '%LOG_BIN%'

log_bin:记录二进制日志是否开启。log_bin_trust_function_creators:是否允许用户创建和更改存储函数,默认是OFF。log_bin_use_v1_row_events:二进制日志的版本信息,默认为OFF。sql_log_bin:是否停止对二进制的写入。
要开启二进制日志,需要去系统里面配置一下:
- 先用
quit来退出 mysql; - 然后执行
cd /etc/mysql来进入 mysql 配置文件目录; - 进入之后,执行
ls命令,找到配置文件my.cnf; - 找到之后,我们可以使用
vim my.cnf进入文本编辑器,在里面可以看到有一个/etc/mysql/mysql.conf.d的配置文件,使用esc+:+x退出来; - 然后输入命令
cd mysql.conf.d进入到这个目录下,再使用sudo vim mysqld.cnf; - 按
i即可编辑内容,修改内容如下:# 指定一个集群内的 MySQL 服务器 id,指定为 1 service-id = 1 # 日志路径 log_bin = /var/log/mysql-bin.log # 指定索引文件的位置 log-bin-index = mysql-bin.index # 保存日志的天数 expire_logs_days = 10 # 日志大小 max_binlog_size = 100M
修改之后,esc+shift+z+kbd>z 保存并退出 vim 编辑。使用 sudo service mysql restart 重启服务器即可。
查看当前使用了哪些二进制文件:
SHOW BINARY LOGS;
查看日志中进行了哪些操作:
SHOW BINLOG EVENTS\G;
获得当前二进制的位置:
SHOW MASTER STATUS\G;
显示服务器所有二进制日志:
SHOW MASTER LOGS;
二进制日志中,会记录我们对数据表的插入、删除、更新等操作。
还可以禁止和启用当前会话二进制日志,语法格式如下所示:
# 禁用当前会话二进制日志
SET sql_log_bin=0;
# 启用当前会话二进制日志
SET sql_log_bin=1;
查看二进制日志格式:
SHOW VARIABLES LIKE 'BINLOG_FORMAT'
可以使用 SET GLOBAL BINLOG_FORMAT='<格式名>'来对其修改。例如,我们把二进制给是设置为 MIXED。
SET SESSION BINLOG_FORMAT=`MIXED`;
SHOW VARIABLES LIKE 'BINLOG_FORMAT';
删除二进制日志:
PURGE MASTER LOGS TO ‘<文件名>’是用于清空该文件之前的所有日志。例如,在 company 数据库中的 intern 表里做了一次 INSERT 操作,现在会有三条二进制日志,如下图所示。

现在我们删除在 mysql-bin.000003 之前的所有二进制文件,删除之后就只有 mysql-bin.000003 在表里了。

还可以使用 RESET MASTER 来删除所有日志。

RESET MASTER 能够删除日志索引文件中记录的所有二进制文件,然后会创建一个起始值为 00001 的新日志文件。
使用 FLUSH LOGS 来刷新二进制日志,每刷新一次就会增加一条二进制文件的记录。

从图中,我们可以看到每执行一次,就会多一条二进制日志,因为它的作用是关闭当前使用的二进制日志文件,打开一个新的二进制日志文件,并且系统中会有所记录。
二进制日志有一个非常重要的功能,它记录了 MySQL 的增量数据,用来做增量数据库的恢复,如果没有二进制日志,MySQL 的备份将无法还原数据。
本文详细介绍了MySQL的日志系统,包括错误日志、中继日志用于主从复制、普通查询日志记录客户端查询、慢查询日志记录执行时间超标的查询,以及二进制日志用于数据恢复和主从同步。文章讲解了各日志的用途、查看与配置方法,强调了二进制日志在数据备份与恢复中的重要性。
6002

被折叠的 条评论
为什么被折叠?



