欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库——MySQL日志(redo log、undo log、bin log、erro log、slow query log、general log)

程序员文章站 2022-07-08 14:46:07
...

MySQL中有六种日志文件:

  • 重做日志(redo log)
  • 回滚日志(undo log)
  • 二进制日志(binlog)
  • 错误日志(errorlog)
  • 慢查询日志(slow query log)
  • 一般查询日志(general log)
  • 中继日志(relay log)

 

一、重做日志(redo log)

1、作用

确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性。

2、内容

物理格式的日志,记录的是物理数据页面的修改的信息,其中redo log是顺序写入redo log file的物理文件中取得。

3、产生

事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。(原因:重做日志有一个缓冲区Innodb_log_buffer,默认8M,,Innodb存储引擎先将重做日志写入innodb_log_buffer中)

4、释放

当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

5、刷新(将innodb日志缓冲区的日志刷新到磁盘)

主线程每秒执行刷新Innodb_log_buffer到重做日志;每个事务提交时会将重做日志刷新到日志文件;当日志缓存可用空间少于一半,重做日志缓存被刷新到重做日志文件;缓冲区到重做日志文件是主线程的定时任务;即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件,所以再大的事务提交时间也很短暂。

 

二、回滚日志(undo log)

1、作用

保存事务发生之前的数据的一个版本,可以用于回滚,同时也就而已提供多版本并发控制下的读(MVCC),即飞锁定读

2、内容

逻辑格式的日志,在执行回滚时,仅仅将数据从逻辑上会恢复到事务之前的状态,而不是在物理页面上操作实现,与重做日志不同

3、产生

事务开始之前,将当前版本生成undo log,undo也会产生redo来保证undo log的可靠性。

4、释放

当事务提交之后,undo log并不能立马删除,而是放入代清理链表,由purge线程是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间

5、对应的物理文件

MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。

MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数

如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

关于MySQL5.7之后的独立undo 表空间配置参数如下

innodb_undo_directory = /data/undospace/ –undo独立表空间的存放目录
innodb_undo_logs = 128 –回滚段为128KB
innodb_undo_tablespaces = 4 –指定有4个undo log文件

如果undo使用的共享表空间,这个共享表空间中又不仅仅是存储了undo的信息,共享表空间的默认为与MySQL的数据目录下面,其属性由参数innodb_data_file_path配置。

6、其他

undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。默认情况下undo文件是保持在共享表空间的,也即ibdatafile文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的。因此共享表空间可能会变的很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的。

因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。

 

三、二进制日志(bin log)

1、作用

用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步;用于数据库的基于时间点的还原

2、内容

逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。

在使用mysql binlog解析binlog之后一些都会真相大白,因此可以基于binlog做到类似于oracle的闪回功能,其实都是依赖于binlog中的日志记录。

二进制日志存储修改数据库中表数据的所有动作,包含了所有更新了数据或者已经潜在更新了数据的所有语句。

MySQL在执行语句之后,但在释放锁之前,马上将修改写入二进制日志中。

3、产生

事务提交的时候,一次性将事务中的sql语句(一个事务可能对应多sql语句)按一定格式记录到bin log中。这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。

因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。

这是因为bin log是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。

4、释放

bin log默认保持时间由参数expire_logs_days配置,对于非活动日志文件,在生成时间超过其配置天数后,被自动删除。

5、对应的物理文件

配置文件的路径为log_bin_basename,binlog日志文件按照指定大小,当日志文件达到指定的最大的大小之后,进行滚动更新,生成新的日志文件。

对于每个binlog日志文件,通过一个统一的index文件来组织。

6、其他

二进制日志的作用之一是还原数据库的,与redo log类似,二者本质区别:

  • 作用不同:

redo log是保持事务持久性的,属于事务层面;

bin log 作为还原功能,属于数据库层面(也可精确到事务层面),都有还原意思,但是保护数据的层次不同。

  • 内容不同:

redo log是物理日志,是数据页面修改后的物理记录;

bin log是逻辑日志,简单认为记录的是sql语句;

  • 产生时间,施放时间,可释放情况下的清理机制完全不同;
  • 恢复数据时的效率:redo log>bin log

 

关于事务提交时,redo log和bin log的写入顺序,为了保证主从复制时候的主从一致(当然也包括使用bin log进行基于时间点还原的情况),是要严格一致的,MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,理论上是先写redo log,再写binlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。

 

四、错误日志(erro log)

1、作用

记录mysqld(服务器端)启动和停止,以及服务器运行过程中发生错误的相关信息。默认情况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出。

2、内容

是一个文本文件。记录了MySQL Server每次启动和关闭的详细信息以及运行过程中所有较为严重的警告和错误信息。用--logerror[=file_name]选项来开启mysql错误日志,该选项指定mysqld保存错误日志文件的置。

在MySQL 5.5.7之前,刷新日志操作(如flush logs)会备份旧的错误日志(以_old结尾),并创建一个新的错误日志文件并打开,在MySQL 5.5.7之后,执行刷新日志的操作时,错误日志会关闭并重新打开,如果错误日志不存在,则会先创建。

 

五、慢查询日志(slow query log)

1、作用

将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件,通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的。

2、内容

通过使用--slow_query_log[={0|1}]选项来启用慢查询日志。所有执行时间超过long_query_time秒的SQL语句都会被记录到慢查询日志。

慢查询日志默认是关闭的。

缺省情况下hostname-slow.log为慢查询日志文件安名,存放到数据目录,同时缺省情况下未开启慢查询日志。

mysqld在语句执行完并且所有锁释放后记入慢查询日志。记录顺序可以与执行顺序不相同。获得初使表锁定的时间不算作执行时间。

show variables like '%slow%';

参数说明:

slow_query_log : 是否已经开启慢查询 
slow_query_log_file : 慢查询日志文件路径 
long_query_time :  超过多少秒的查询就写入日志  
log_queries_not_using_indexes 如果值设置为ON,则会记录所有没有利用索引的查询(性能优化时开启此项,平时不要开启)

 

六、一般(通用)查询日志(general log)

1、作用

记录建立的客户端连接和执行的语句

2、内容

通用查询日志可以存放到一个文本文件或者表中,所有连接和语句被记录到该日志文件或表,缺省未开启该日志。

https://blog.csdn.net/qq_35571554/article/details/82800463

https://blog.csdn.net/xiamiflying/article/details/80960598

https://blog.csdn.net/jerryDzan/article/details/91433035