在MySQL数据库和InnoDB存储引擎中,有很多种文件,如:参数文件、日志文件、socket文件、pid文件、MySQL表结构文件、存储引擎文件。
本节重点关注日志文件,MySQL的复制、事务等重要功能都和日志文件相关。日志文件主要包括错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件、重做日志文件等。其中重做日志文件是InnoDB引擎文件。
1、日志文件介绍 1.1、错误日志(error log)错误日志文件对MySQL的启动、运行、关闭过程进行了记录,是定位MySQL问题的第一把钥匙。
1.2、慢查询日志(slow query log)慢查询日志是用来记录执行时间超过 long_query_time 这个变量定义的时长的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。
1.3、一般查询日志(general log)一般查询日志记录了所有对MySQL数据库请求的信息,无论请求是否正确执行。
默认情况下,general log 是关闭的,开启通用查询日志会增加很多磁盘 I/O, 所以如非出于调试排错目的,不建议开启通用查询日志。
1.4、二进制日志(bin log)关于二进制日志,它记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制文件中。
log_bin:指定binlog是否开启及文件名称。
server_id:指定服务器唯一ID,开启binlog 必须设置此参数。
binlog_format:指定binlog模式,建议设置为ROW。
max_binlog_size:控制单个二进制日志大小,当前日志文件大小超过此变量时,执行切换动作。
expire_logs_days:控制二进制日志文件保留天数,默认值为0,表示不自动删除,可设置为0~99。
二进制日志文件是非常重要的日志文件,建议开启,二进制日志主要有这么几个作用:
恢复:利用二进制文件恢复数据,原理是取出日志的操作记录,重新执行
复制:和恢复原理类似,一般分为主库和从库。
审计: 通过观察二进制文件,可以判断是否存在对数据库有危险性的操作。
1.5、重做日志(redo log)对于InnoDB,重做日志至关重要,因为它们记录了对于InnoDB存储引擎的事务日志。
当实例或介质失败时,如数据库由于所在主机断电导致实例失败,InnoDB存储引擎就会恢复到断电前的时刻,以此来保证数据的完整性。
InnoDB引擎对数据的更新,是先将更新记录写入redo log日志,然后会在系统空闲的时候或者是按照设定的更新策略再将日志中的内容更新到磁盘之中。这就是所谓的预写式技术(Write Ahead logging)。这种技术可以大大减少IO操作的频率,提升数据刷新的效率。
写入重做日志文件也不是直接写,而是先写入一个重做日志缓冲,然后按照一定的条件顺序写入日志文件。
redo log日志的大小是固定的,为了能够持续不断的对更新记录进行写入,在redo log日志中设置了两个标志位置,checkpoint和write_pos,分别表示记录擦除的位置和记录写入的位置。redo log日志的数据写入示意图可见下图。
当write_pos标志到了日志结尾时,会从结尾跳至日志头部进行重新循环写入。所以redo log的逻辑结构并不是线性的,而是可看作一个圆周运动。write_pos与checkpoint中间的空间可用于写入新数据,写入和擦除都是往后推移,循环往复的。
当write_pos追上checkpoint时,表示redo log日志已经写满。这时不能继续执行新的数据库更新语句,需要停下来先删除一些记录,执行checkpoint规则腾出可写空间。
checkpoint规则:checkpoint触发后,将buffer中脏数据页和脏日志页都刷到磁盘。
同样是记录事务日志,和bin log有什么不同呢?
bin log会记录所有与数据库有关的日志记录,包括InnoDB、MyISAM等存储引擎的日志,而redo log只记InnoDB存储引擎的日志。
记录的内容不同,bin log记录的是关于一个事务的具体操作内容,即该日志是逻辑日志。而redo log记录的是关于每个页(Page)的更改的物理情况。
写入的时间不同,bin log仅在事务提交前进行提交,也就是只写磁盘一次。而在事务进行的过程中,却不断有redo ertry被写入redo log中。
写入的方式也不相同,redo log是循环写入和擦除,bin log是追加写入,不会覆盖已经写的文件。
1.6、回滚日志(undo log)提到了redo log,这里在简单了解一下回滚日志(undo log)。