深入浅出MySQL中介绍了6种不同的日志,记录着数据库在不同方面的踪迹。
MySQL的六种日志:
- 错误日志(Error Log)
- 二进制日志(Binary Log、Bin Log)
- 查询日志(General Query Log)
- 慢查询日志(Slow Query Log)
- 中继日志(Relay Log)
- 元数据日志(DDL Log)
平常很少使用到中继日志和元数据日志,所以只介绍前四种日志。
一、错误日志
它记录了mysqld(MySQL服务器)启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。
当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。
可以用 –log-err[=file_name]选项来指定mysqld保存错误日志文件的位置。
查看MySQL数据库,错误日志位置的方法:
1 2 3 4 5 6 7 |
mysql> show Variables like "log_error"; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | log_error | ./AMDServer.err | +---------------+-----------------+ 1 row in set (0.00 sec) |
然后切换到这个目录 /usr/local/mysql/var
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[xiong@AMDServer var]$ ll -a total 139M drwxr-xr-x 8 mysql mysql 4.0K 11月 4 11:13 ./ drwxr-xr-x 14 root mysql 4.0K 7月 23 18:24 ../ -rw-rw---- 1 mysql mysql 28K 7月 23 22:56 amdserver.err -rw-rw---- 1 mysql mysql 88K 11月 4 11:13 AMDServer.err -rw-rw---- 1 mysql mysql 5 11月 4 11:13 AMDServer.pid -rw-rw---- 1 mysql mysql 56 7月 23 18:24 auto.cnf drwx------ 2 mysql mysql 4.0K 10月 22 13:05 blog/ drwx------ 2 mysql mysql 4.0K 8月 26 18:24 danni/ drwx------ 2 mysql mysql 4.0K 9月 14 09:34 ginBlog/ -rw-rw---- 1 mysql mysql 74M 11月 9 16:02 ibdata1 -rw-rw---- 1 mysql mysql 32M 11月 9 16:02 ib_logfile0 -rw-rw---- 1 mysql mysql 32M 9月 10 13:28 ib_logfile1 drwx------ 2 mysql mysql 4.0K 7月 23 18:24 mysql/ -rw-rw---- 1 mysql mysql 58K 11月 4 00:24 mysql-bin.000026 -rw-rw---- 1 mysql mysql 1.6K 11月 9 16:02 mysql-bin.000027 -rw-rw---- 1 mysql mysql 38 11月 4 11:13 mysql-bin.index drwx------ 2 mysql mysql 4.0K 7月 23 18:24 performance_schema/ drwx------ 2 mysql mysql 4.0K 11月 9 15:42 xiong/ |
AMDServer.err就是我们要找的文件。
可以使用vim打开这个文件进行查看。
二、二进制日志
二进制日志(BinLog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句。
不过不包括数据查询语句。
语句以“事件”的形式保存,它描述了数据的更改过程。
此日志对于灾难时的数据恢复起着极其重要的作用。
日志的位置
当用–log-bin[=file_name]选项启动时,mysqld开始将数据变更情况写入日志文件。
当没有给出file_name值时,默认名为主机名后面跟-bin选项。
如果给出了文件名,但是不包含路径,则文件默认被写入参数DATADIR(数据目录)指定的目录。
日志的格式
二进制日志的格式分为三种,可以在启动时通过参数 –binglog_format进行设置
- STATEMENT(语句)
- ROW(每一行的变更记录,默认格式)
- MIXED(混合模式)
Statement语句模式
在MySQL5.1之前的版本都采用这种方式。
日志中记录的都是语句,每一条对数据造成修改的SQL语句都会记录在日志中。
通过mysqlbinlog工具,可以看到每一条语句的文本。
这种格式的优点是日志记录清晰易读、日志量小,对I/O影响较小。
缺点是在某些情况下slave(从服务器)的日志复制会出错。
Row行变更
MySQL目前默认的日志格式,它将每一行的变更记录到日志中。
比如简单的更新SQL: UPDATE emp SET name=’abc’;
如果是Statement格式,日志中会记录一行SQL文本。
如果是Row格式,由于是对全表进行更新,也就是每一行记录都会发生变更,如果是一个100万行的大表,则日志中会记录100万条记录的变化情况,日志量大大增加。
这种格式的优点是会记录每一行数据的变化细节,不会出现某些情况下无法复制的情况。
缺点是日志量大,对I/O影响较大。
MIXED混合模式
该日志混合了Statement和Row两种日志。默认情况下采用Statement,但在一些特殊情况下采用Row来记录。
比如采用NDB存储引擎,此时对表的DML语句全部采用Row。
客户端使用了临时表,客户端采用了不确定函数,比如current_user()等。
因为这种不确定函数在主从中得到的值可能不同,导致主从数据产生不一致。
MIXED格式能尽量利用这两种格式的优点,而避开它们的缺点。
可以在global和session级别对binlog_format进行日志格式的设置,但一定要谨慎操作,确保主从库的复制能够正常进行。
查看BinLog日志
1. 使用mysql查看binlog
1 2 3 4 5 6 7 8 9 10 11 |
-- 只查看第一个binlog文件的内容 mysql> show binlog events; -- 查看指定binlog文件的内容 mysql> show binlog events in 'mysql-bin.000001'; -- 获取binlog文件列表 mysql> show binary logs; -- 查看当前正在写入的binlog文件 mysql> show master status; |
2. 使用mysqlbinlog工具
binlog是二进制存储的,我们可以使用一个查看mysql二进制日志的工具(mysqlbinlog)操作binlog日志文件。
该工具的默认安装路径为:/usr/local/mysql/bin/mysqlbinlog
1 2 3 4 5 6 7 8 9 10 |
#基于开始时间/结束时间 # --start-datetime 指定开始时间 # --stop-datetime 指定结束时间 # -d 选项, 指定数据库 # 最后加上文件名 sudo /usr/local/mysql/bin/mysqlbinlog \ --start-datetime='2020-11-08 00:00:00' \ --stop-datetime='2020-11-10 00:00:00' \ -d test \ /usr/local/mysql/var/mysql-bin.000027 |
另外还有一些其他的参数可以使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#使用偏移量 sudo /usr/local/mysql/bin/mysqlbinlog \ -o 10 /usr/local/mysql #从特定位置提取 sudo /usr/local/mysql/bin/mysqlbinlog \ -j 9527 mysqld-bin.0000001 > from_id_9527.sql #截止到一个特定位置的条目 # --stop-position 截止位置 sudo /usr/local/mysql/bin/mysqlbinlog \ --stop-position=9527 mysqld-bin.0000001 > upto_id_9527.sql #使用Linux重定向命令,将可读的文本输出到文件中 sudo /usr/local/mysql/bin/mysqlbinlog \ mysqld-bin.0000001 > output.log #也可以使用 -r 选项将输出存储到文件中 sudo /usr/local/mysql/bin/mysqlbinlog \ -r output.sql mysqld-bin.000001 |
删除日志
Reset Master可以删除所有日志
三、查询日志
查询日志记录了客户端的所有语句,binlog日志不包含查询数据的语句。
如果要启用查询日志,可以通过下面两个参数控制:
- –general_log[={0|1}],控制是否启用日志
- –general_log_file=file_name,控制日志文件的路径
日志的位置
查询日志和慢查询日志都可以选择保存在文件或者表中。
使用参数 –log-output[=value]来控制,value可以是TABLE、FILE、NONE的一个或多个的组合,中间用逗号分隔。
这里的表指的是: general_log 表。
P.S. log日志中记录了所有数据库的操作,对于访问频繁的系统,此日志对系统性能的影响较大,建议关闭。
四、慢查询日志
慢查询日志记录了所有执行时间超过参数 long_query_time(单位为秒)设置值,并且扫描记录数不少于min_examined_row_limit的所有SQL语句的日志。
获取表锁的时间不算在执行时间内。
两类语句不计入慢查询日志:
- 管理语句,它使用 –log-slow-admin-statements控制
- 不使用索引的查询,它使用 –log-queries-not-using-indexes进行控制
慢查询日志默认是关闭的,使用 –slow_query_log[={0|1}]显式指定慢查询状态,如果不指定或者指定值为1都会打开慢查询。
使用slow_query_log_file[=filename]指定慢查询日志的路径。
如果没有给定file_name的值,日志将写入DATADIR指定的路径下,默认文件名是[host_name]-slow.log
小结
这里介绍的四种日志在碰到不同问题时,用途各不同。
- 系统故障时,优先查看错误日志,迅速定位故障原因。
- 二进制日志记录数据变更和DDL操作,用于数据备份、数据复制、数据恢复等操作,应默认开启。
- 如果想看到数据库操作的所有内容,就用查询日志,但是一般情况下建议不要打开,会影响系统整体性能。
- 如果希望查看系统的性能问题,就用慢查询日志,找到有性能问题的SQL语句,进行针对性优化。