MySQL 日志文件:redo log、undo log、binlog
在MySQL服务器运行过程中,除了会产生各种数据文件外,还会记录各种日志文件,这些日志文件不仅仅记录MySQL的数据库的运行情况、用户操作、错误信息等,还和MySQL服务器的数据息息相关。
MySQL主要有以下几类日志文件:
- 重做日志(redo log)
- 回滚日志(undo log)
- 二进制日志(binlog)
- 错误日志(errorlog)
- 慢查询日志(slow query log)
- 一般查询日志(general log)
- 中继日志(relay log)
Redo Log (重做日志)
redo log也叫做重做日志,是保证事务持久性的重要机制。用于崩溃恢复,防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
redo log是在事务begin时就开始记录(并不是事务commit时才记录,因为整个事务做的操作可能很多,如果在commit的时候才写redo log,此时一旦发生异常,redo log还没写,这就太晚了,无法确保事务的持久性)。
redo log 是物理日志,记录的是“在某个数据页上做了什么修改”。另外,redo log是循环写入固定的文件,而且是顺序写入磁盘的。
在一个事务中,可能会发生多次的数据修改,对应的就是多个数据页多个偏移量位置的字段变更,也就是说会产生多条redo log,而且因为在同一个事物中,这些redo log,也是不可再分的,也就是说,一个组的redo log在持久化的时候,不能部分成功,部分失败,否则的话,就会破坏事务的原子性。
另外为了提升性能redo log是按照块组织在一起,然后写入到磁盘中的,类似于数据的页,而且引入了redo log buffer,默认的大小为16MB。buffer中分了很多的block,每个block的大小为512kb,每一个事务产生的所有redo log称为一个group。
Undo Log (回滚日志)
数据库事务开始之前,会将要修改的记录放到Undo日志里,当事务回滚时或者数据库崩溃时,可以利用UndoLog撤销未提交事务对数据库产生的影响。
Undo log的作用:
- 事务回滚 – 原子性:当事务回滚时或者数据库崩溃时,可以利用Undo Log来进行数据回滚。
- 多个行版本控制(MVCC)- 隔离性:即在InnoDB存储引擎中MVCC的实现是通过Undo来完成。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过Undo读取之前的行版本信息,以此实现非锁定读取。
Binary Log (二进制日志)
binary 就是bin log,即二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。
- binlog日志包括两类文件:
- 二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件。
- 二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。
Error Log (错误日志)
错误日志记录了MySQL 服务器运行过程中所有较为严重的警告和错误信息,以及MySQL服务器每次启动和关闭的详细信息。
在默认情况下,系统记录错误日志的功能是关闭的( 我所使用的 MySQL 5.6 是开启的 ),错误信息被输出到标准错误输出( Stderr )。
Slow Query Log (慢查询日志)
慢查询日志是记录查询时长超过指定时间的日志,慢查询日志主要用来记录时间较长的查询语句,通过慢查询日志可以找出查询时间较长的、执行效率较低的语句,以便进行优化。
默认情况下,慢查询日志功能是关闭的。如果不是调优需要,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。
- 查看慢查询日志
mysql> show variables like "%slow_query%"; +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | slow_query_log | ON | | slow_query_log_file | /www/server/data/mysql-slow.log | +---------------------+---------------------------------+ 2 rows in set (0.00 sec)
MySQL通过long_query_time参数来指定慢查询时间,时间以秒为单位。如果查询时间超过了这个时间值,这个查询语句将被记录到慢查询日志,如果不设置,默认时间为 10 秒。
mysql> show variables like "%long_query_time%"; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 3.000000 | +-----------------+----------+ 1 row in set (0.00 sec)
- 开启和关闭慢查询日志
#开启慢查询日志 0关闭 1开启 SET GLOBAL slow_query_log=1; #修改慢日志记录SQL的最低阈值时间,单位秒 SET GLOBAL long_query_time=3;
General Log (一般查询日志)
一般查询日志会记录MySQL所有的SQL语句,不管是查询语句,还是DML语句,还是DDL语句,还是DCL语句,这些语句统统都会被记录在general log文件中。就连我们连接和断开MySQL数据库的这些语句。
MySQL会把它收到的所有SQL语句按照接收的顺序依次记录在general log中。默认情况下一般查询日志是关闭的(OFF状态),并且默认保存在数据包目录中。
- 查看一般查询日志
mysql> show variables like "%general%"; +------------------+--------------------------------------+ | Variable_name | Value | +------------------+--------------------------------------+ | general_log | OFF | | general_log_file | /www/server/data/VM-16-15-centos.log | +------------------+--------------------------------------+ 2 rows in set (0.01 sec)
genral_log:用于控制是否开启general log。等于0表示关闭,等于1表示开启。默认是0。
general_log_file:指定general log日志的保存路径和文件名,如果不配置这个参数的话,默认会以MySQL服务器的hostname作为general log日志的文件名称,具体文件为:<hostname>.log。日志的存放路径,如果不指定,则默认放在datadir参数所指定的目录下,也可以在这个参数中指定具体的路径+名称
- 开启一般查询日志
通用日志有一个默认的保存路径,和我们的数据库文件在同一个目录下,我们只需要开启即可。
mysql> set @@global.general_log = 1; Query OK, 0 rows affected (0.03 sec)
然后我们在查看一般查询日志的状态,就会发现已经是ON。
Relay Log (中继日志)
一般情况下它在MySQL主从同步读写分离集群的从节点才开启。主节点一般不需要这个日志。
如上图,master主节点的binlog传到slave从节点后,被写到relay log里,它是一个临时的日志文件,用于存储从master节点同步过来的binlog日志内容,它里面的内容和master节点的binlog日志里面的内容是一致的。然后slave从节点从这个relaylog日志文件中读取数据应用到数据库中,来实现数据的主从复制。