MYSQL-note2, 日志系统
Posted kids and edu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL-note2, 日志系统相关的知识,希望对你有一定的参考价值。
redo log(重做日志、物理日志)与 bin log(归档日志、逻辑日志)
redo log:
WAL技术(write-ahead logging),先写日志,再写磁盘
更新一条记录的时候:innodb引擎会把记录写到redo log里面,并更新内存,这个时候更新就算完成了。同时,innodb引擎会在适当的时候,将操作记录更新到磁盘里面,一般都是系统比较空闲的时候。
innodb的redo log是固定大小的,比如可以配置一组4个文件,每个大小是1Gb,那么总共可以记录4GB的操作。从头开始写,写到末尾就又从头开始循环写(环形)
wirte pos是当前记录的位置,一边写一边后移
checkpoint 就是当前要擦除的位置,也是往后推移并循环。擦除记录前要把记录更新到数据文件中。
write pos和checkpoint中间还空着的部分,可以用来记录新的操作,如果追上了,则不能执行更新操作,得先停下来把checkpoint推进一下。
有了redo log,innodb就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力成为crash-safe
redolog 也是写在磁盘当中,但因为是顺序写,相比比数据文件更新磁盘的随机性,显得更快
如果update语句更新了redolog,但是还没来得及写到数据文件中,此时再对这行做更新,其实是在内存中访问。
binlog:
mysql:server层(功能层面的)和引擎层(存储相关),上面提到的redolog是innodb引擎特有的日志,而server层也有自己的日志,称为binlog(归档日志)
因为一开始mysql自带的引擎是myisam,没有crash-safe能力,binlog日志只能用于归档。而innodbo是以插件形式引入mysql的,实现了crash-safe。
这两种日志有以下三个不同:
1)redo log是innodb特有,binlog是mysql server层实现的,所有引擎均可以用
2)redo log是物理日志,记录的是在某个数据页是哪个做了什么修改;bin log是逻辑日志,记录的是这个语句的原始逻辑,比如给id=2 这行的c字段+1
3)redo log是循环写,空间固定会用完;binlog是追加写,写到一定大小,会切换到下一个,不会覆盖以前的日志。
两阶段提交:
以一个update语句为例看看内部流程
1)执行器取ID=2这行的数据,主键索引直接找到这一行
2)执行器拿到这行的数据后,做了更新,调用引擎接口写入新数据
3)引擎将数据更新到内存中,并将操作记录到redolog中,此时redo log处于prepare阶段,随时可以提交事务
4)执行器生成这个操作的binlog,并把binlog写入磁盘
5)执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成commit
上面是redo log的两阶段提交,用来保证redo log 和bin log保持逻辑上的一致
数据库在恢复的时候,是在上一次全备的基础上,依次取出binlog数据,在临时库重放到之前的某个时刻。这样临时库就跟之前的一样,可以再把表数据从临时库取出。
一些参数:
1)innodb_flush_log_at_trx_commit =1,redo log用来crash-safe的参数,表示每次事务的redo log都直接持久化到磁盘
2)sync_binlog=1,每次事务的binlog都持久化到磁盘
以上是关于MYSQL-note2, 日志系统的主要内容,如果未能解决你的问题,请参考以下文章