MySQL—日志管理
- 日志分类
- 日志功能
- 错误日志:
- 一般查询日志
- 3、慢查询日志
- 二进制日志
- 日志分析工具
对日志进行管理可以修改配置文件:my.cnf
# 在下面条件配置即可设置日志管理
[mysqld]
#skip-grant-tables
# 错误日志
#log-error=/usr/local/mysql/data/mysql_error.log
# 二进制日志
#log_bin=mysql-bin
#binlog_format=MIXED
#server-id=1
日志分类
日志种类
1、错误日志:记录启动、运行或停止时出现的问题,一般也会记录警告信息。
2、一般查询日志:记录建立的客户端连接和执行的语句。
3、慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询,可以帮我们定位服务器性能问题。
4、二进制日志:任何引起或可能引起数据库变化的操作,主要用于复制和即时点恢复。
### MySQL中对于日志文件的环境比变量非常多,可以使用以下命令来查看:
show global variables like '%log%';
日志功能
错误日志:
错误日志主要记录如下几种日志:
- 服务器启动和关闭过程中的信息
- 服务器运行过程中的错误信息
- 事件调度器运行一个事件时产生的信息
- 在从服务器上启动从服务器进程时产生的信息
错误日志定义:
可以用–log-error [ = file_name ]选项来指定mysqld保存错误日志文件的位置。如果没有给定file_name值,mysqld使用错误日志名host_name.err 并在数据目录中写入日志文件。如果你执行FLUSH LOGS,错误日志用-old重新命名后缀并且mysqld创建一个新的空日志文件。(如果未给出–log-error选项,则不会重新命名)。
错误日志一般有以上两个变量可以定义:
错误日志文件:log_error
启用警告信息:log_warnings (默认启用)
show global variables like 'log_error';
log_error C:\ProgramData\MySQL\MySQL Server 5.5\Data\WIN-19A0VNP9PVD.err
show global variables like 'log_warnings';
log_warnings 1
一般查询日志
启动开关:general_log={ON|OFF}
日志文件变量:general_log_file [ =/PATH/TO/file]
全局日志开关:log={ON|OFF} 该开关打开后,所有日志都会被启用
记录类型:log_output={TABLE|FILE|NONE}
log_output定义了日志的输出格式,可以是表,文件,若设置为NONE,则不启用日志,因此,要启用通用查询日志,需要至少配置general_log=ON,log_output={TABLE|FILE}。而general_log_file如果没有指定,默认名是host_name.log。由于一般查询使用量比较大,启用写入日志文件,服务器的I/O操作较多,会大大降低服务器的性能,所以默认为关闭的。
3、慢查询日志
查询超时时间:long_query_time
启动慢查日志:log_slow_queries={YES|NO}
启动慢查日志 : slow_query_log
日志记录文件:slow_query_log_file [= file_name ]
MySQL如果启用了slow_query_log=ON选项,就会记录执行时间超过long_query_time的查询(初使表锁定的时间不算作执行时间)。日志记录文件如果没有给出file_name值, 默认为主机名,后缀为-slow.log。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
二进制日志
二进制日志启动开关:log-bin [= file_name]
在5.6及以上版本一定要手动指定。5.6以下版本默认file_name为$datadir/mysqld-binlog,二进制日志用于记录所有更改数据的语句,主要用于复制和即时点恢复。二进制日志的主要目的是在数据库存在故障时,恢复时能够最大可能地更新数据库(即时点恢复),因为二进制日志包含备份后进行的所有更新,二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。
查看二进制日志的工具为:mysqlbinlog
二进制日志的格式:
基于语句: statement
基于行: row
混合方式: mixed
由于基于语句和基于行的日志格式都有自己的好处,MySQL使用的二进制日志文件是混合方式的二进制日志,内置策略会自动选择最佳的格式。
二进制日志事件:
产生的时间:starttime
相对位置:position
二进制日志文件:
索引文件
二进制日志文件
在数据目录下有一个mysql-bin.index便是索引文件,以mysql-bin开头并以数字结尾的文件为二进制日志文件。
日志的滚动:
MySQL的滚动方式与其他日志不太一样,滚动时会创建一个新的编号大1的日志用于记录最新的日志,而原日志名字不会被改变。每次重启MySQL服务,日志都会自动滚动一次。
另外如果需要手动滚动,则使用命令:flush logs;
show master status; #查看当前正在使用的二进制文件
show binary logs; #查看所有的二进制文件
show binlog events in 'mysql-bin.000033'; #查看二进制文件中记录的内容
show binlog events in 'mysql-bin.000033' from 407; #也可以从某个位置查看二进制文件
purge binary logs to 'mysql-bin.000025'; #删除某个序号之前的日志文件
使用命令mysqlbinlog查看二进制日志内容:
基本语法:
mysqlbinlog [options] log-files
常用options(类似字节偏移数):
--start-position :开始位置
--stop-position :结束位置
--start-datetime 'yyyy-mm-dd hh:mm:ss' :开始时间
--stop-datetime 'yyyy-mm-dd hh:mm:ss' :结束时间
mysqlbinlog --start-position 407 --stop-position 556 mysql-bin.000033
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
日志分析工具
mysqldumpslowmysql:官方提供的慢查询日志分析工具
mysqlsla:hackmysql.com 推出的一款日志分析工具(该网站还维护了 mysqlreport,mysqlidxchk 等比较实用的mysql 工具)。 整体来说,功能非常强大。输出的数据报表非常有利于分析慢查询的原因,包括执行频率、数据量、查询消耗等。
myprofi:纯 php 写的一个开源分析工具.项目在 sourceforge 上。功能上,列出了总的慢查询次数和类型、去重后的 sql 语句、执行次数及其占总的 slow log 数量的百分比。从整体输出样式来看,比 mysql-log-filter 还要简洁,省去了很多不必要的内容。对于只想看 sql 语句及执行次数的用户来说,比较推荐。
mysql-log-filter:google code 上找到的一个分析工具,提供了 python 和 php 两种可执行的脚本。 特色功能除了统计信息外,还针对输出内容做了排版和格式化,保证整体输出的简洁。喜欢简洁报表的朋友,推荐使用一下。