在 MySQL中,有 4 种不同的日志,分别是错误日志、二进制日志(BINLOG 日志)、查询日志和慢查询日志。
1.错误日志
错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。
可以用 --log-error[=file_name] 选项来指定 mysqld(MySQL 服务器)保存错误日志文件的位置。如果没有给定 file_name值,mysqld 使用错误日志名 host_name.err(host_name 为主机名)并默认在参数 DATADIR(数据目录)指定的目录中写入日志文件。
2.二进制文件
二进制日志(BINLOG)记录了所有的 DDL(数据定义语言) 语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。语句以“事件”的形式保存,它描述了数据的更改过程。此日志对于灾难时的数据恢复起着极其重要的作用。
2.1日志的位置和格式
当用 --log-bin[=file_name] 选项启动时,mysqld 开始将数据变更情况写入日志文件。如果没有给出 file_name 值,默认名为主机名跟“-bin”。如果给出了文件名,但没有包含路径,则文件默认被写入参数 DATADIR(数据目录)指定的目录。
MySQL 5.5 中,二进制日志的格式分为 3 种:STATEMENT、ROW、MIXED,可以在启动时通过参数 --binlog_format 进行设置,这 3 种格式的区别如下。
- STATEMENT
MySQL 5.1 之前的版本都采用这种方式。顾名思义,日志中记录的偶素是语句(statement),每一条对数据造成修改的 SQL 语句都会记录在日志中,通过 mysqlbinlog 工具,可以清晰的看到每条语句的文本。主从复制的时候,从库(slave)会将日志解析为原文本,并在从库重新执行一次。
这种格式的优点是日志记录清晰易读、日志量少,对 I/O 影响较小。
缺点是某些情况下 slave 的日志复制会出错。
- ROW
MySQL 5.1.11 之后,出现了这种新的日志格式。它将每一行的变更记录到日志中,而不是记录 SQL 语句。
这种格式的优点是会记录每一行数据的变化细节,不会出现某些情况下无法复制的情况。
缺点是日志量大,对 I/O 影响较大。
- MIXED
这是目前 MySQL 默认的日志格式,即混合了 STATEMENT 和 ROW 两种日志。默认情况下采用 STATEMENT,但在一些特殊情况下采用 ROW 来进行记录,比如采用 NDB 存储引擎,此时对表的 DML 语句全部采用 ROW;客户端使用了临时表;客户端采用了不确定函数,比如 current_user() 等,因为这种不确定函数在主从中得到的值可能不同,导致主从数据产生不一致。MIXED 格式能尽量利用两种模式的优点,而避开它们的缺点。
注意:可以在 global 和 session 级别对 binlog_format 进行日志格式的设置,但一定要谨慎操作,确保从库的复制能够正常进行。
2.2日志的读取
由于日志以二进制的方式存储,不能直接读取,需要用 mysqlbinlog 工具来查看,语法如下:
1 shell > mysqlbinlog log-file;
如果日志是 ROW 格式,则 mysqlbinlog 解析后是一堆无法读懂的字符。此时可以加上 -v 或者 -vv 参数进行读取。
2.3日志的删除
方法1
执行
RESET MASTER;
命令,该命令将删除所有 BINLOG 日志,新日志编号从 000001 开始。
方法2
执行
PURGE MASTER LOGS TO ‘mysql-bin.******‘
命令,该命令将删除 “******” 编号之前的所有日志。
方法3
执行
PURGE MASTER LOGS BEFORE ‘yyyy-mm-dd hh24:mi:ss‘
命令,该命令将删除指定日志之前产生的所有日志。
方法4
设置参数 --expire_logs_days=#,此参数的含义是设置日志的过期天数,过了指定的天数后日志将会被自动删除,这样将有利于减少 DBA 管理日志的工作量。
触发日志文件更新:
mysqladmin flush-log
2.4其他选项
二进制日志由于记录了数据的变化过程,对于数据的完整性和安全性起着非常重要的作用。因此,MySQL 还提供了一些其他参数选项来进行更小粒度的管理。
--binlog-do-db=db_name:该选项告诉主服务器,如果当前的数据库(即 USE 选定的数据库)是 db_name,应该更新记录到二进制日志中。其他所有没有显式指定的数据库更新将被忽略,不记录在日志中。
--binlog-ignore-db=db_name:该选项告诉服务器,如果当前的数据库(即 USE 选定的数据库)是 db_name,不应该将更新保存到二进制日志中,其他没有显式忽略的数据库都将进行记录。
如果想记录或忽略多个数据库,可以对上面两个选项分别使用多次,即对每个数据库指定相应的选项。
--innodb-safe-binlog:此选项经常和 --sync-binlog=N(每写 N 次日志同步磁盘)一起配合使用,使得事务在日志的记录更加安全。
SET SQL_LOG_BIN=0:具有 SUPER 权限的客户端可以通过此语句禁止将自己的语句记入二进制记录。这个选项在某些环境下是有用的,但是使用时一定要小心,因为它很可能造成日志记录的不完整或者在复制环境中造成主从数据的不一致。