MySQL日志管理

参照:系统是CentOS6.4 ,MySQL版本为5.5.32

MySQL 服务器上一共有六种日志:错误日志,查询日志,慢查询日志,二进制日志,事务日志,中继日志。

一 错误日志

错误日志不仅仅记录错误信息,它记录的事件有:
– 服务器启动和关闭过程中的信息
– 服务器运行过程中的错误信息
– 事件调度器运行一个事件时产生的信息
– (如果被配置为从服务器)启动从服务器进程时产生的信息

查看错误日志文件的路径

在mysql数据库中,错误日志功能是默认开启的。

xmlmysql> SHOW VARIABLES LIKE 'log_error%';
+---------------+-----------------------------------------------+
| Variable_name | Value                                         |
+---------------+-----------------------------------------------+
| log_error     | /opt/lampstack-5.4.22-0/mysql/data/mysqld.log |
+---------------+-----------------------------------------------+

配置错误日志

编辑 my.cnf(一般在mysql目录下),修改 log-error 参数,如果没有就新增:
错误日志文件配置

# Error Logging.
log-error="filename.log"
  • 相关配置变量说明
    log_error={1 | 0 | /PATH/TO/ERROR_LOG_FILENAME}
    定义错误日志文件。作用范围为全局或会话级别,可用于配置文件,属非动态变量。
    log_warnings = {1|0}
    决定是否将警告信息记录入错误日志。

二 查询日志

其中查询日志记录查询操作,默认情况下查询日志是关闭的。开启查询日志会增加很多磁盘 I/O, 所以如非出于调试目的,不建议开启查询日志

查看查询日志是否启用及查询日志的路径

xmlmysql> SHOW VARIABLES LIKE 'general_log%';
+------------------+--------------------------------------------------+
| Variable_name    | Value                                            |
+------------------+--------------------------------------------------+
| general_log      | OFF                                              |
| general_log_file | /opt/lampstack-5.4.22-0/mysql/data/localhost.log |
+------------------+--------------------------------------------------+

配置查询日志

编辑 my.cnf,修改 general-log 参数为 1,同时设定 log-output 参数(日志输出类型)和 general_log_file 参数(查询日志路径):

# General logging.:
log-output=FILE
general-log=1
general_log_file="filename.log"

保存 my.cnf 更改,重启 MySQL 服务。

三 慢查询日志

慢查询是指执行时长(包括等待CPU/IO的时间)超过 long_query_time 这个变量定义的时长的查询。慢查询日志开销比较小,可以用于定位性能问题,建议开启。

查看慢查询日志是否启用及慢查询日志的路径

xmlmysql> SHOW VARIABLES LIKE 'slow_query_log%';
+---------------------+--------------------------------------------------+
| Variable_name       | Value                                            |
+---------------------+--------------------------------------------------+
| slow_query_log      | OFF                                              |
| slow_query_log_file | /usr/local/var/mysql/upstreamdeMac-mini-slow.log |
+---------------------+--------------------------------------------------+

配置慢查询日志

编辑 my.cnf ,设置 log_slow_queries 参数为 1,同时设定 log-output 参数(日志输出类型)、slow-query-log_file 参数(慢查询日志路径)和 long_query_time 参数:

log# Slow logging.
log-output=FILE
log_slow_queries=1    //MySQL 5.6将此参数修改为了slow_query_log
slow_query_log_file="filename.log"
long_query_time=10    //慢查的时长单位为秒,可以精确到小数点后6位(微秒)

保存 my.cnf 更改,重启 MySQL 服务。

关闭慢查询日志

设置 log_slow_queries 参数为 0:

# Slow logging.
log-output=NONE
log_slow_queries=0   //MySQL 5.6将此参数修改为了slow_query_log
slow_query_log_file="filename.log"
long_query_time=10

保存 my.cnf 更改,重启 MySQL 服务。

四 二进制日志

二进制日志记录 MySQL 数据库中所有与更新相关的操作,即二进制日志记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。常用于恢复数据库和主从复制。

查看 log_bin 状态

xmlmysql> 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   |
+---------------------------------+-------+

启用二进制日志功能

编辑 my.cnf ,在 [mysqld] 下添加

# Binary Logging.
log-bin="filename-bin"

保存 my.cnf 更改,重启 MySQL 服务。

其他相关配置:

max_binlog_size={4096 .. 1073741824} ;
设定二进制日志文件上限,单位为字节,最小值为4K,最大值为1G,默认为1G。某事务所产生的日志信息只能写入一个二进制日志文件,因此,实际上的二进制日志文件可能大于这个指定的上限。作用范围为全局级别,可用于配置文件,属动态变量。

查看日志文件

在data目录下有一个mysql-bin.index便是索引文件,以mysql-bin开头并以数字结尾的文件为二进制日志文件。
查看所有的二进制文件:

xmlmysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |    276665 |
+------------------+-----------+
1 row in set (0.03 sec)

查看当前正在使用的二进制文件:

xmlmysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

二进制日志滚动

当 MySQL 服务进程启动、当前二进制日志文件的大小已经超过上限时、执行 FLUSH LOG 时,MySQL 会创建一个新的二进制日志文件。新的编号大1的日志用于记录最新的日志,而原日志名字不会被改变。

手动滚动命令:flush logs;

查看日志详细

查看binlog日志有几种方式:
1. 使用show binlog events方式可以获取当前以及指定binlog的日志,
2. 使用mysqlbinlog命令行。

1. show binlog events方式

  • 只查看第一个binlog文件的内容(show binlog events)
xmlmysql> show binlog events; #默认会返回mysql-bin.000001的日志
#太多,我就不截屏了
  • 查看指定binlog文件的内容(show binlog events in ‘binname.xxxxx’)
mysql> show binlog events in 'mysql-bin.000002';

  • 获取指定位置binlog的内容(show binlog events from xxx)
mysql> show binlog events in 'mysql-bin.000002'  from 107;

2. mysqlbinlog命令行

mysqlbinlog在mysql/bin目录

I 查看binlog日志

  • 查看指定的binlog日志
shell[root@localhost bin]# ./mysqlbinlog ../data/mysql-bin.000003
  • 按时间查看二进制日志
    mysqlbinlog ../data/mysql-bin.000003 –start-datetime=”2015-3-11 17:00:00″
    mysqlbinlog ../data/mysql-bin.000003 –stop-datetime=”2015-3-12 17:30:00″
    mysqlbinlog ../data/mysql-bin.000003 –start-datetime=”2015-3-11 17:00:00″ –stop-datetime=”2015-3-12 17:30:00″

  • 按字节数查看二进制日志
    mysqlbinlog ../data/mysql-bin.000003 –start-position=20
    mysqlbinlog ../data/mysql-bin.000003 –stop-position=200
    mysqlbinlog ../data/mysql-bin.000003 –start-position=20 –stop-position=200

  • 过滤insert、update操作
    mysqlbinlog ../data/mysql-bin.000003 | grep insert

II 查看binlog日志并输出

下面参考:使用mysqlbinlog提取二进制日志

c、提取指定position位置的binlog日志并输出到压缩文件  
# mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 |gzip >extra_01.sql.gz  

d、提取指定position位置的binlog日志导入数据库  
# mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 | mysql -uroot -p  

e、提取指定开始时间的binlog并输出到日志文件  
# mysqlbinlog --start-datetime="2014-12-15 20:15:23" /opt/data/APP01bin.000002 --result-file=extra02.sql  

f、提取指定位置的多个binlog日志文件  
# mysqlbinlog --start-position="120" --stop-position="332" /opt/data/APP01bin.000001 /opt/data/APP01bin.000002|more  

g、提取指定数据库binlog并转换字符集到UTF8  
# mysqlbinlog --database=test --set-charset=utf8 /opt/data/APP01bin.000001 /opt/data/APP01bin.000002 >test.sql  

h、远程提取日志,指定结束时间   
# mysqlbinlog -urobin -p -h192.168.1.116 -P3306 --stop-datetime="2014-12-15 20:30:23" --read-from-remote-server mysql-bin.000033 |more  

i、远程提取使用row格式的binlog日志并输出到本地文件  
# mysqlbinlog -urobin -p -P3606 -h192.168.1.177 --read-from-remote-server -vv inst3606bin.000005 >row.sql  

expire_logs_days 参数

在 my.cnf 中配置 expire_logs_days 参数指定二进制日志的有效天数,MySQL 会自动删除过期的二进制日志。expire_logs_days 设置在服务器启动或者 MySQL 切换二进制日志时生效,因此,如果二进制日志没有增长和切换,服务器不会清除老条目。

# 二进制日志的有效天数
expire_logs_days = 5

清除二进制日志

  • 清除所有日志(不存在主从复制关系
mysql> RESET MASTER;
  • 清除指定日志之前的所有日志
mysql> PURGE MASTER LOGS TO 'mysql-bin.000003';
  • 清除某一时间点前的所有日志
mysql> PURGE MASTER LOGS BEFORE '2015-01-01 00:00:00';
  • 清除 n 天前的所有日志
mysql> PURGE MASTER LOGS BEFORE CURRENT_DATE - INTERVAL 10 DAY;

警告

由于二进制日志的重要性,请仅在确定不再需要将要被删除的二进制文件,或者在已经对二进制日志文件进行归档备份,或者已经进行数据库备份的情况下,才进行删除操作,且不要使用 rm 命令删除。

五 事务日志

出于性能和故障恢复的考虑,MySQL 服务器不会立即执行事务,而是先将事务记录在日志里面,这样可以将随机IO转换成顺序IO,从而提高IO性能。

事物日志通常是一组至少两个固定大小的文件,当其中一个写满时,MySQL会将事务日志写入另一个日志文件(先清空原有内容)。当 MySQL 从崩溃中恢复时,会读取事务日志,将其中已经 commit 的事务写入数据库,没有 commit 的事务 rollback 。

事务日志由存储引擎(innodb)管理,一般不需要手动干预。

六 中继日志

中继日志用于主从复制架构中的从服务器上,从服务器的 slave 进程从主服务器处获取二进制日志的内容并写入中继日志,然后由 IO 进程读取并执行中继日志中的语句。

日志分析工具

  • mysqldumpslowmysql:官方提供的慢查询日志分析工具
  • mysqlsla:hackmysql.com 推出的一款日志分析工具(该网站还维护了 mysqlreport,mysqlidxchk 等比较实用的mysql 工具)。 整体来说,功能非常强大。输出的数据报表非常有利于分析慢查询的原因,包括执行频率、数据量、查询消耗等。
  • myprofi:纯 php 写的一个开源分析工具.项目在 sourceforge 上。功能上,列出了总的慢查询次数和类型、去重后的 sql 语句、执行次数及其占总的 slow log 数量的百分比。从整体输出样式来看,比 mysql-log-filter 还要简洁,省去了很多不必要的内容。对于只想看 sql 语句及执行次数的用户来说,比较推荐。
  • mysql-log-filtergoogle code 上找到的一个分析工具,提供了 python 和 php 两种可执行的脚本。 特色功能除了统计信息外,还针对输出内容做了排版和格式化,保证整体输出的简洁。喜欢简洁报表的朋友,推荐使用一下。

MySQL Innodb日志机制深入分析

参考

MySQL 日志管理
MySQL日志管理
使用mysqlbinlog提取二进制日志

    原文作者:SQL
    原文地址: https://segmentfault.com/a/1190000003072237
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞