MySQL 日志类型
事务的4大特性ACID
- 原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。
- 一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。(其实原子性和隔离性间接的保证了一致性)
- 隔离性(isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
- 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。
bin log(归档日志)
是什么
由Mysql的Server层实现,是逻辑日志,记录的是sql语句的原始逻辑,比如"给 ID=2 这一行的C字段加1"
怎么工作的
binlog会写入指定大小的物理文件中,是追加写入的,当前文件写满则会创建新的文件写入。 产生:事务提交的时候,一次性将事务中的sql语句,按照一定的格式记录到binlog中。 清理:可设置参数expire_logs_days,在生成时间超过配置的天数之后,会被自动删除。
有什么作用
- 1.用于复制,在主从复制中,从库利用主库上的binlog进行重播(执行日志中记录的修改逻辑),实现主从同步。
- 2.用于数据库的基于时间点的还原。
3种记录模式
- statement:基于SQL语句的模式,某些语句中含有一些函数,例如 UUID,NOW 等在复制过程可能导致数据不一致甚至出错。
- row:基于行的模式,记录的是行的变化,很安全。但是 binlog 的磁盘占用会比其他两种模式大很多,在一些大表中清除大量数据时在 binlog 中会生成很多条语句,可能导致从库延迟变大。
- mixed:混合模式,根据语句来选用是 statement 还是 row 模式。表结构变更使用 statement 模式来记录,如果 SQL 语句是 update 或者 delete 语句,那么使用row模式。
怎么查看
- show variables like “%bin%”;
redo log(重做日志):
是什么
由引擎层的InnoDB引擎实现,是物理日志,记录的是物理数据页修改的信息,比如"某个数据页上内容发生了哪些改动"
怎么工作的
- 原理:当一条数据需要更新时,InnoDB会先将更新操作记录到rodolog中,并更新到内存中,这个更新就算是完成了。InnoDB引擎会在mysql空闲时将这些更新操作更新到磁盘中(数据文件)。 (这个就是MySql经常说到的WAL技术,Write-Ahead Logging ,关键点是先写日志,再写磁盘)
- 存储:redolog是顺序写入指定大小的物理文件中的。是循环写入的,当文件快写满时,会边擦除边刷磁盘,即擦除日志记录(redolog file)并将数据刷到磁盘中。
有什么作用
- 1.提供crash-safe 能力(崩溃恢复),确保事务的持久性。 数据库突然崩溃,有些数据并未刷到数据文件中,当重启MySQL数据库,会从redolog中未刷到磁盘的数据刷到磁盘中。
- 2.利用WAL技术推迟物理数据页的刷新,从而提升数据库吞吐,有效降低了访问时延。
-
- 保证的是事务的持久性(Durability)和一致性(Consistency)
怎么查看
show variables like “%relay%”;
undo log(回滚日志):
是什么
由引擎层的InnoDB引擎实现,是逻辑日志,记录数据修改被修改前的值,比如"把Name=‘B’ 修改为Name = ‘B2’ ,那么undo日志就会用来存放Name='B’的记录"
怎么工作的
当一条数据需要更新前,会先把修改前的记录存储在undolog中,如果这个修改出现异常,则会使用undo日志来实现回滚操作,保证事务的一致性。
当事务提交之后,undo log并不能立马被删除,而是会被放到待清理链表中,待判断没有事物用到该版本的信息时才可以清理相应undolog。
有什么作用
- 保存了事务发生之前的数据的一个版本,用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
- 保证了事务的原子性(Atomicity)
怎么查看
show variables like “%undo%”;
relay log(中继日志):
是什么
relay log与bin log一样,由一组包含描述数据库更改事件的编号文件和一个包含所有使用的中继日志文件名称的索引文件组成。
怎么工作的
一般情况下它在MySQL主从同步读写分离集群的从节点才开启, 主节点的binlog传到从节点后,被写到relay log里,从节点 sql线程从relaylog里读取日志然后应用到从节点 本地。
然后SQL线程会读取relay-log日志的内容并应用到从节点服务器,从而使从服务器和主服务器的数据保持一致。
有什么作用
中介临时的日志文件,用于存储从主节点同步过来的binlog日志内容
怎么查看
show variables like “%relay%”;
日志在事物执行过程中的工作
其他
-
物理日志:通俗的讲,就是只有"我"自己可以使用,别人无法共享我的物理格式,私有化。
-
逻辑日志:可以给别的引擎使用,是所有引擎共享的。MySQL 层面实现的。
参考
- https://piaohua.github.io/post/mysql/20210529-mysql-log/
- https://github.com/bingoohuang/blog/issues/137
- https://dev.mysql.com/doc/refman/5.7/en/replica-logs-relaylog.html