MySQL 日志

MySQL 日志

概述

MySQL日志记录了MySQL服务器的各种行为,MySQL中日志有如下几种:

类型 描述
Error Log 记录 MySQL启动,运行,停止过程
General Query Log  记录客户端的连接以及接受的SQL
Binary Log  记录改变数据的语句(通常用于复制)
Relay Log 记录 从Master上接受到的数据变更
Slow Query Log  记录慢查询
 DDL Log  记录DDL

 

在Windows平台,默认情况下只有Error Log是开启的

 

1. 错误日志 Error Log

 错误日志记录了当mysql启动、停止和运行过程中发生任何严重错误时的相关信息,以便排错,可通过配置项log-error=[file-name] 来指定错误日志文件位置,默认文件名为 hostname.err,位于data目录下。.

 

 

2. 查询日志General Query Log

 查询日志记录了客户端的所有语句

 

启用查询日志:

 

[mysqld]
general_log[={0 | 1}] # 设为1或不设值则代表启用
general_log_file = file_name # 指定日志文件名,若不配置该项则默认为hostname.log,hostname为主机名,位于data目录下

 

 

关于log-output配置项

该选项指定日志输出到哪里,该选项对查询日志和慢查询日志都有效

 

[mysqld]
log-output=[value,...]
 value 可取值为FILE,TABLE和NONE

 

FILE表示记录到文件中,TABLE表示记录到mysql.general_log表中,NONE表示不记录,可以设置多个,用逗号隔开,但只要设置了NONE,则即使设置了FILE或者TABLE也不会记录

 

 

 

3. 二进制日志 Binary Log

二进制日志记录了对数据库的所有更改数据的操作,意味着包括update,delete等,不包括select,show等,此外,二进制日志同时也会记住更改操作的执行时间点和执行时长。

 

二进制日志主要有两方面的用途:

1.恢复(Recovery):某些数据的恢复需要二进制日志,如当一个数据库全备文件恢复后,可以通过二进制日志进行Point-In-Time恢复

2.复制(Replication):Master通过将二进制日志发给Slave,Slave将日志存到Relay Log中,然后Slave中的进程/线程再从Relay Log中读取记录执行数据更改操作,从而达到数据一致的目的

 

二进制日志默认是不开启的,我们可以再配置文件中 用log-bin[=name] 配置项启用:

log_bin = mysql_bin

 按上面配置后,MySQL会把二进制日志写到data目录下文件名为mysql_bin.00001,mysql_bin.00002....的文件中,同时data目录下还会有个文件名为mysql_bin.index的文件,该文件用来存储所有的二进制日志文件的文件名。

 

和二进制日志相关的配置项有如下:

max_binlog_size:指定单个二进制日志文件的最大大小,单位为字节,默认为1GB

binlog_cache_size:当使用事务时,未提交的事务二进制日志会写到缓存中,等到提交时才把缓存中的写到磁盘中,而该参数指定了缓存的大小,默认为32KB,该参数是基于会话的,当一个线程开始一个事务时,都会申请一个该参数指定大小的缓冲区,所以不能设太大,另外,当该缓存用完时MySQL会把日志写入到一个临时文件中,因此也不能设的太小。通过show global status查看binlog_cache_use和binlog_cache_disk_use,前者表示写缓冲二进制日志的次数,后者表示写临时文件日志的次数,从而调整适应当前生产环境

sync_binlog:表示写缓冲多少次就将缓冲区的日志刷到磁盘中,设为1则表示不使用缓冲,每次写日志都直接写到磁盘中

binlog-do-db:要写二进制日志的数据库

binlog-ignore-db:不用写二进制日志的数据库

log-slave-update:如果当前MySQL为Slave,那么默认是不会把从Master那里接受到的binlog写入到自己的binlog中的,如果想这么做,那么加上该配置即可,在Master -> Slave1 -> Slave2 这种情况下非尾的Slave必须配置该项。

binlog_format:二进制日志的格式,可选值:STATEMENT、ROW和MIXED

STATEMENT:记录的是SQL语句,在语句中使用了如UUID,TIMESTAMP等时会导致数据不一致的问题

ROW:记录表的行更改情况,解决了上面说的数据不一致问题

MIXED:混合使用,根据语句具体情况来判断使用STATEMENT还是ROW

binlog_format是动态参数,可以在运行时改变

set session binlog_format = row;
或者
set global binlog_format = row;

 

可以使用mysqlbinlog来查看二进制日志:

 查看当前格式

 
MySQL 日志_第1张图片
 




 

删除二进制日志的一些方法

1.用reset master 命令删除所有binlog文件,之后的文件将重新于000001后缀开始命名

2.执行 "PURGE MASTER LOGS TO 'mysql-bin.******' "命令,该命令将删除'******'编号之前的所有日志

3.执行 "PURGE MASTER LOGS BEFORE 'yyyy-mm-dd hh24:mi:ss'" 命令,该命令将删除日期为 'yyyy-dd-dd hh24:mi:ss'之前的所有日志。

4.设置mysqld组的配置项 expire_logs_days=n, n指定了过期天数,过了指定的天数后,日志文件将被自动删除

 

 

4. 慢查询日志

慢查询日志记录了所有执行事件超过参数long_query_time(秒) 指定的时长并且扫描记录数不小于min_examined_row_limit的所有SQL语句的日志(获得表锁定的事件不算执行时间)

 

在默认情况下,管理语句(如ALTER TABLE,ANALYZE TABLE,CHECK TABLE,CREATE INDEX,DROP INDEX,OPTIMIZE TABLE和REPAIR TABLE)和不使用索引进行查询的语句不会记录到慢查询日志中,

如想启用,则分别用参数--log-slow-admin-statements和log_queries_not_using_indexes设置

 

启用慢查询日志:

 

[mysqld]
slow_query_log[={0 | 1} # 不设置或设为1则启用
slow_query_log_file[=file_name] # 指定日志文件名,若不配置该项则默认为hostname-slow.log,hostname为主机名,位于data目录下
 
logout配置项同样对慢查询日志有效。

 

 

5. DDL日志

 DDL语句顾名思义就是记录DDL语句的,mysql用此文件来从执行ddl语句down掉时恢复,日志记录到data目录下的ddl_log.log中;该文件为二进制文件,每次mysqld成功启动,该文件都将被删除;

该文件最大大小为1048573字节,即4GB

 

参考:http://dev.mysql.com/doc/refman/5.7/en/server-logs.html

你可能感兴趣的:(mysql,日志,慢日志,二进制日志)