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, 日志系统的主要内容,如果未能解决你的问题,请参考以下文章

等保2.0之Linux系统日志备份

linux菜鸟基础学习 系统日志

系统日志在哪里看

zabbix日志监控:操作系统业务系统文件大小多行日志

zabbix日志监控:操作系统业务系统文件大小多行日志

Linux系统日志怎么查看