diff --git a/mysql/mysql文档/mysql_事务.md b/mysql/mysql文档/mysql_事务.md index af6ab28..1a06239 100644 --- a/mysql/mysql文档/mysql_事务.md +++ b/mysql/mysql文档/mysql_事务.md @@ -78,15 +78,34 @@ redo log(重做日志)用于实现事务的持久性,其由两部分组成 - 内存中的重做日志缓冲(redo log buffer) - 磁盘中的重做日志文件(redo log file) +#### redo log persists before transaction committed innodb存储引擎支持事务,其通过`force log at commit`机制实现事务的持久性,即当事务提交时,必须先将该事务的所有日志写入到磁盘的日志文件中进行持久化,直到该过程完成后事务才提交完成。 > 上述描述中`提交时将事务所有日志写入到磁盘的日志文件中`,这句话中`日志`代表`redo log 和 undo log`。 > - redo log用于保证事务持久性 > - undo log用于帮助事务回滚,也用于mvcc功能 -redo log基本都是顺序写的,在数据库进程运行时不需要对redo log进行读取操作;而数据库进行需要对undo log进行随机读写。 +#### redo log和undo log比较 +- redo log在mysql server运行时,只会被顺序的写入,server运行时并不会被读取 +- undo log则不同,在server运行时可能需要对事务进行回滚或执行mvcc操作,此时可能需要对undo log文件进行`随机读写` + +#### redo log和binlog的比较 +binglog通常用于对数据库进行`point in time`形式的恢复(从某个时间点起恢复数据)以及主从复制;但是,binlog和redo log的差别如下: +- binlog针对的是mysql数据库级别,不止用于innodb,还用于其他存储引擎 +- redo log属于innodb存储引擎级别 +- binlog实际记录的是对应sql语句,属于逻辑日志 +- redo log实际记录的格式则是物理格式,具体为针对某个页面的物理修改 + +redo log和 bin log日志写入磁盘的时机也有所不同: +- bin log`仅在事务提交后才进行一次写入` +- redo log`在事务执行过程中也可能发生写入`(redo log buffer满后会写入到磁盘中),故而,redo log file中同一事务写入的redo log内容可能并非是连续的,`多个事务在写入redo log时可能会交叉写入` #### innodb_flush_log_at_trx_commit 参数`innodb_flush_log_at_trx_commit`用于控制redo log/ undo log刷新到磁盘的策略,该参数默认值为`1`,即事务提交时刷新日志到磁盘。除了默认值之外,还可以为该参数设置如下值: - 0: 事务提交时不刷新日志到磁盘,仅在master thread中刷新日志到磁盘,master thread中刷新操作每秒触发一次 -- 1:事务提交时刷新日志,但是仅将日志写入到文件系统的缓存中,`并不进行fsync操作` \ No newline at end of file +- 2:事务提交时刷新日志,但是仅将日志写入到文件系统的缓存中,`并不进行fsync操作` + +将`innodb_flush_log_at_trx_commit`参数设置为`0`或`2`虽然可以在一定幅度上提高性能,但是会丧失数据库的ACID特性。 + + +