mysql:各种log

mysql服务层log主要有慢查询日志和binlog,存储引擎层日志(InnoDB引擎)主要有undo log和redo log。

服务层日志

慢查询日志记录的是执行时间超过阈值的sql,用于定位问题。

binlog主要作用是数据复制,如主从同步。

 

InnoDB存储引擎层日志

undo log记录的是数据修改前的旧值,用于事务回滚和MVCC(多版本并发控制)。

比如有一个事务,要修改id=1的记录

begin;

update account set balance=50  where id=1;

执行update时,会先记录undo log再修改数据。这样,如果执行rollback,就会根据undo log恢复数据。

mvcc用于实现读写并发时,不加锁也能读到历史数据,即快照读。

 

redo log用于保证事务的持久性,崩溃恢复。以事务中执行update操作为例,执行流程是:

修改buffer pool中的数据页,产生脏页。

写入redo log buffer。

事务提交后,redo log刷盘,返回成功。即提交成功,代表redo log已经落盘。

而脏页刷盘是异步的,由后台线程处理。

redo log记录的是物理页的修改,比如,某一页的某个偏移位置写了什么字节,而不是sql语句,所以redo log是幂等的。mysql崩溃重启时,会先通过redo log进行重做,恢复已记录的修改。然后再通过redo log,回滚未提交事务,最终只保留已提交事务的结果。崩溃恢复=redo+undo。

 

双1配置

sync_binlog,控制的是bin log的刷盘机制。值为1,表示事务提交时就刷盘。

innodb_flush_log_at_trx_commit,控制的是redo log的刷盘机制。值为1,表示事务提交时就刷盘。

 

posted on 2017-04-17 23:38  koushr  阅读(579)  评论(0)    收藏  举报

导航