mysql日志

任何一种数据库都存在日志,记录着数据库工作的方方面面,以帮组数据库管理员追踪数据库曾经发生过的各种事件。mysql也不例外,在mysql中有4中不同的日志,分别记录错误日志、二进制日志(binlog日志)、查询日志和慢查询日志,这些日志分别记录着数据库在不同方面的踪迹。

1、错误日志

错误日志是mysql中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障无法正常运行时,可以首先查看此日志。
可以使用--log-error=[file_name]选项来指定mysqld(mysql服务器)保存错误日志文件的位置。如果没有指定file_name值,mysqld使用错误日志名host_name.err(hostname为主机名),并默认在参数DATADIR(数据目录)指定目录中写入的日志文件。用户可以在/etc/mysql/mysql.conf.d目录下的mysqld.cnf配置文件中配置:
mysql日志
通过--log-error指定错误日志文件名及保存的路径,如果没有指定,则默认的再DATADIR(即配置文件中的/var/lib/mysql)中。

2、二进制日志

二进制日志(记录了)所有的DDL(数据定义语言)和DML(数据操纵语言)语句,但是不包括数据查询语句。语句以“事件”的形式保存,它描述了数据的更改过程。此日志对于灾难时数据恢复起着极其重要的作用。

2.1日志的格式和位置

当用--log-bin[=file_name]选项启动时,mysql开始将数据变更情况写入日志文件。如果没有给出file_name值,默认名为主机名后面分着“-bin”。如果给出了文件名,但是没有包含路径,则文件默认被写入到DATADIR指定目录中。
mysql5.5中,二进制日志格式分为3中:STATEMENT、ROW、MIXED,可以在启动时通过参数--binlog_format进行设置。
mysql日志

1、STATEMENT
mysql5.1之前的版本都采用这样的方式,顾明思议,日志记录的都是语句,每一条对数据造成修改的sql语句都会记录在日志中,通过mysqlbinlog工具,可以清晰的查看每条语句的文本。主从复制时的时候,从库(slave)会将日志解析为原文本,并在从库重新执行一次。这种格式的优点是日志记录清晰易读、日志量少,对I/O影响较小。缺点是某些情况下slave的日志复制会出错。

2、ROW
mysql5.1.11之后,出现了这种新的格式。它将每一行的变更记录到日志中,而不是记录SQL语句。比如一个简单的更新sql:update emp set name='abc',如果是STATEMENT格式,日志文件中会记录一行sql文本;如果是row,由于是对全表进行更新,也就是没一行记录都会发生变更,如果是一个100万行的大表,则日志中会记录100万条记录的变化情况,日志量大大增加。

3、MIXED
这是目前Mysql默认日志格式。

2.2日志读取

由于日志以二进制文件形式存在,不能直接读取,需要mysqlbinlog工具来查看,关于mysqlbinlog工具可以网上查看具体的使用方法。
mysql日志

这样直接查看无法读懂,可以加上-v进行读取:mysqlbinlog -v binlog.log

mysql日志

2.3日式删除

对于比较繁忙的OLTP(在线事物处理)系统,由于每天生成日志量大,这些日志如果长时间不清除,将会对磁盘空间带来很大的浪费。因此,定期删除日志是DBA维护Mysql数据库的一个重要工作内。删除日志的方式很多,这里不再一一介绍,这里介绍一个比较简单的方法,在mysqld.cnf配置文件中添加--expire_logs_days=#,此参数的含义是设置日志的过期天数,过了指定的天数后日志将被自动删除,这样将有利于减少DBA管理日志的工作量。

2.4 其他选项

二进制日志文件由于记录了数据的变化过程,对于数据的完整性和安全性起着非常重要的作用,因此,mysql还提供了一些其他的参数选项进行更小粒度的管理。
  • --binlog-do-db=dbname:该选项该诉服务器,如果当前的数据库(即use选定的数据库)是db_name,应将更新记录到二进制日志中,其他所有没有显示指定的数据库更新将被忽略。
  • --binlog-ignore-db=dbname:该选项告诉服务器,如果当前的数据库时db_name,不应将更新保存到二进制中,其它没有显示忽略的数据库都将进行记录。

如果想记录或忽略多个数据库,可以对上面两个选项分别使用多次,即对每个数据库指定相应的选项。例如只想记录数据库db1和db2的日志,可以在参数文件中设置两行:
--binlog-do-db=db1
--binlog-do-db=db2

3、查询日志

查询日志一般用处不大,这里不再细说,读者可以自行到网上查询详细的资料。

4、慢查询日志

慢查询日志记录了所有执行时间超过参数long_query_time(单位:秒)设置值并且扫描记录数不小于min_examined_row_limit的所有sql语句的日志。long_query_time默认的是10秒,最小为0秒,精度可以到微妙。
默认情况下,有两类常见语句不会记录到慢查询日志中:管理语句不使用索引进行查询的语句,管理语句包括ALTER TABLE、DROP INDEX等等。如果要监控这两类sql语句,可以分别通过参数--log-slow-admin-statements和log_queries_not_using_indexs进行控制,例如:
log-queries-not-using-indexes = nouseindex.log --就是字面意思,log下来没有使用索引的query 。
慢查询日志默认是关闭的。在mysql5.1.29之前,当用--log-slow-queries=[=file_name]选项启动mysql时,慢查询日志开始被记录。在5.1.29之后,--log-slow-queries已经不推荐使用。而是采用两个新的参数来替换:使用--show_query_log[={0|1}]显示指定慢查询状态,如果不指定值或者指定值为1都会打开慢查询,使用slow_query_log_file[=file_name],来指定慢查询日志路径。

5、小结

日志是数据库中很重要的记录内容,他可以帮组我们诊断数据库出现的各种问题。
  • 系统故障时,建议首先查询错误日志,以帮助用户迅速定位故障原因。
  • 如果要记录数据的变更、数据的备份、数据的复制等操作时,二进制日志必须打开,以帮组用户进行数据恢复等操作。默认不记录此日志,建议使用--log-bin选项打开。
  • 如果希望记录数据库发生的任何操作,包括select,则需要用--log将查询日志开启,此日志默认管理,一般情况下不建议打开此日志,以免影响系统整体性能。
  • 如果希望查询系统的性能问题,希望找到有性能问题的sql语句,则需要用--slow_query_log打开慢查询日志。对于大量慢查询日志,建议使用mysqldumpslow工具进行汇总查看。