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来查看二进制日志:
查看当前格式
删除二进制日志的一些方法
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目录下