Mysql日志类型分析

186 阅读4分钟

本文正在参加 活动 [「技术专题19期 漫谈数据库技术」](juejin.cn/post/716060…

前言

Mysql日志文件,在我们日常使用mysql事物的时候还是尤为重要的,主要用于我们回滚操作、事物的持久性、实现主从复制、以及数据恢复等作用。 以往我们知道比较多的就是二进制日志(binlog)只是其中的一种,mysql包含很多类型的日志,其中比较重要的是redo log 、 undo log 和 binlog。 其他还有错误日志(errorlog)、慢查询日志(slow query log)、 一般查询日志(general log)、中继日志(relay log),这篇主要学习下redo log 、 undo log 和 binlog这三种日志类型。

Binlog

FFDC98D8-200A-4E9F-BCD8-1FE7A8BC7DBD.png Binlog是二进制日志文件,记录了mysql所有的sql执行的操作,通过查看binlog日志我们可以做数据恢复、增量备份、数据的主从复制,注意:一般的select语句不会记录,因为不会对数据产生改动。

Binlog日志文件编码格式

8F5CF5E8-7095-4881-A66B-C33C42FB5EF4.png

row、statement(默认格式)、mixed statement:每次执行一条update语句都会被记录到binlog日志中,主从复制的时候slave端会根据statement格式日志进行sql语句重现。 row:记录每一行修改的细节,缺点也显而易见就是每一行的修改细节都会记录,就会产生大量的日志内容,只要是update或delete对行进行操作都会记录。 mixed:statement和row的结合格式,介于两者之间,如果statement无法完成主从复制则会使用row,对每一条sql分别记录。

Binlog日志查看

因为binlog日志是二进制格式的,默认情况下不能使用文本工具的命令进行查看(cat,vi)都会使打开的binlog日志乱码,可以使用mysqlbinlog解析工具进行查看。

Redolog

又名重做日志,主要是用于数据恢复,mysql出现异常情况实例宕机了,这时候就需要使用redo log进行数据恢复,注意redolog是InnoDB存储引擎独有的日志。

redolog写入过程

redo log是先写入redo log buffer中,然后在分别写入ib_logfile0、ib_logfile1和ib_logfile2。

innodb_flush_log_at_trx_commit(同步磁盘参数):= 0事务提交,不写入磁盘、=1事务提交写入磁盘、=2写入磁盘缓冲区(缓冲区在数据库宕机的时候,操作系统的缓冲区能保证数据不丢失)

这里有个疑问,binlog作用也是数据恢复,为什么还要用redolog来进行数据恢复呢? 事务如果没有提交,mysql挂了,那么日志丢失不会有任何的损失,但是如果事务提交了 redo log buffer 会将内容写到page cache(文件系统缓存),这里涉及到一个刷盘的操作,如果只是在这一秒挂了,只会丢失一秒的数据。 每隔1秒会对写入page cache的缓存进行刷盘,写进redo.file中。所以数据恢复的时候一定要redolog和binlog一起看,如果是回滚直接看redolog日志进行数据恢复。

Undolog

撤销回滚日志,在mysql事务开始之前,会把更新前的sql语句记录到uodolog文件,事务发生回滚或者mysql宕机,可以利用uodolog记录的信息进行回滚。

看样子redolog和undolog有些相似,在某些原因导致事务回滚,执行rollback,redolog和undolog都可以将数据回滚到事务提交之前的状态

Undolog和Redolog区别

Undolog是逻辑型日志,redolog是物理型日志,undo记录数据更新前的状态,redo记录数据更新后的状态。

Mvcc多版本并发控制

说到mvcc肯定就离不开undolog,mysql隔离级别可重复读(Repeatable Read)所产生的幻读的解决方式,就是根据undolog和read view来解决的, 主要是也是通过读取快照的方式,通过高版本读取低版本的方式来读取undolog中某个版本的数据。

数据库的隐式字段

1),DB_TRX_ID:6字节,最近修改事务id,记录创建这条记录或者最后一次修改该记录的事务id。

2),DB_ROLl_PTR:7字节,回滚指针,指向这条记录的上一个版本,用于配合undolog,指向上一个旧版本 。

3),DB_ROWjD:6字节,隐藏的主键,如果数据表没有主键,那么innodb会自动生成一个6字节的row_id。 关于mvcc多版本并发控制解决RR隔离级别下的幻读问题,可以看下blog.csdn.net/nandao158/a… 这篇文章