前言
在MySQL服务器运行过程中,除了会产生各种数据文件外,还会记录各种日志文件,这些日志文件不仅仅记录MySQL的数据库的运行情况、用户操作、错误信息等,还和MySQL服务器的数据息息相关。
1. MySQL日志文件
MySQL主要有以下几类日志文件:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log)、中继日志(relay log)
1.1 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。
1.2 Undo Log (回滚日志)
数据库事务开始之前,会将要修改的记录放到Undo日志里,当事务回滚时或者数据库崩溃时,可以利用UndoLog撤销未提交事务对数据库产生的影响。
- Undo log的作用:
- 事务回滚 - 原子性: 当事务回滚时或者数据库崩溃时,可以利用Undo Log来进行数据回滚。
- 多个行版本控制(MVCC)- 隔离性: 即在InnoDB存储引擎中MVCC的实现是通过Undo来完成。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过Undo读取之前的行版本信息,以此实现非锁定读取。
1.3 Binary Log (二进制日志)
binary 就是bin log,即二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。
- binlog日志包括两类文件:
- 二进制日志索引文件(文件名后缀为.index): 用于记录所有的二进制文件。
- 二进制日志文件(文件名后缀为.00000* ): 记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。
1.3.1 查看binlog日志是否开启
mysql> show variables like '%log_bin%';
+---------------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------+
| log_bin | ON |
| log_bin_basename | /www/server/data/mysql-bin |
| log_bin_index | /www/server/dat