服务化-mysql-02 mysql日志系统

02 mysql日志系统

    • 一、binlog日志系统
    • 二、redo log 日志
      • 2.1.1 WAL技术(write-Ahead-logging技术)
      • 2.1.2 redo log原理解析:
      • 2.1.3 临时客人太多,小黑板记不完了怎么办?
      • 2.1.4 如何解决crash-safe问题
    • 2.2 binlog server层归档日志
    • 2.3 binlog 和redo log的区别
    • 2.4 两段式提交
    • 2.5 mysql运行参数设置

一、binlog日志系统

binlog是属于server层,且所有引擎共有。当我们需要回复数据库某一时刻的数据时,记录着mysql逻辑语句的binlog就可以帮助我们完成恢复操作。

inlog是Server层实现的二进制日志,他会记录我们的cud操作。
Binlog有以下几个特点:
1、Binlog在MySQL的Server层实现(引擎共用)
2、Binlog为逻辑日志,记录的是一条语句的原始逻辑
3、Binlog不限大小,追加写入,不会覆盖以前的日志

#配置开启binlog
log‐bin=/usr/local/mysql/data/binlog/mysql‐bin
#注意5.7以及更高版本需要配置本项:
server‐id=123454(自定义,保证唯一性);
#binlog格式,有3种statement,row,mixed(当需要开启主从数据库时,需要设置为ROW或mixed,row记录某行数据执行完操作后的结果,而statement记录的是原始操作,当针对不同sql语句出现索引分歧时,会导致主从数据的不一致问题。)
binlog‐format=ROW
#表示每1次执行写入就与硬盘同步,会影响性能,为0时表示,事务提交时mysql不做刷盘操作,由系统决定
sync‐binlog=1

二、redo log 日志

redo log是innoDB引擎特有的日志系统,能够解决mysql宕机的crash-safe问题。

2.1.1 WAL技术(write-Ahead-logging技术)

简单的说就是先将修改记录写在日志中,后在闲暇时写入磁盘。

2.1.2 redo log原理解析:

redo log原理拿丁奇老师的《孔乙己》故事中的酒馆老板记账模式解释最为通俗易懂。有一条update操作的执行操作,老板先将该条记录写在小黑板(redo log日记)中。等不忙的时候再拿出详细的账本,把当天小黑板的临时账单归档到磁盘(记账本)中。

2.1.3 临时客人太多,小黑板记不完了怎么办?

redo log日志的大小的固定的,假设配置的文件个数为4个,每个文件大小1GB。那么小黑板的容量就是4GB,老板开始写入的位置叫做write postion,小黑板的面积是有限的,小黑板的下沿位置是checkpoint(酒馆闲暇的时候老板会把小黑板的临时账入库并清理小黑板上的账单,所以这里checkpoint是动态变化的),把logfile3的尾接上logfile0的头部就可以把日志文件视为闭环的黑板圆环。当write pos 到达checkpoint的位置,老板需要停下手中的活,处理账单在黑板上腾出些位置才行。

2.1.4 如何解决crash-safe问题

redolog就像小黑板一样,不管服务崩溃或是酒馆临时关门,当重启服务的时候,仍然能查找到日志中的物理日志,继续执行下去,将数据写入到磁盘中。
服务化-mysql-02 mysql日志系统_第1张图片

2.2 binlog server层归档日志

2.3 binlog 和redo log的区别

1)redolog属于innoDB存储引擎独有的,binlog属于server层 且所有引擎共有
2)binlog不支持crash-safe,redo log支持
3)redo log 属于物理日志,记录某个数据做什么修改;binlog 属于逻辑日志,记录原始sql语句语义
4)redo log固定文件空间大小;binlog可以追加写入

2.4 两段式提交

目的:解决数据库备份内容或扩容时,数据库一致问题。
原理:当酒馆老板将赊账记录写入小黑板(redo log)后,redolog处于prepare状态,当执行器将执行记录写入binlog后,redo log将状态修改为commit状态。
如何解决宕机等场景的数据库数据不一致:
反向说明 1、先写binlog后写redolog,如redolog没写完mysql进程异常,重启mysql将丢失该条记录,而恢复备份数据文件时,binlog却多出一个事务来,导致数据不一致。
反向说明 2、先写redolog后写binlog,中途mysql崩溃,redolog已经记录了该条记录,重启后仍会写磁盘。但binlog却不存在该记录,恢复备份数据时没有该条记录执行,导致数据不一致。
浅色框是innoDB执行,深色框是执行器执行。
服务化-mysql-02 mysql日志系统_第2张图片

2.5 mysql运行参数设置

redo log用于保证crash-safe能力。innodb_flush_log_at_trx_commit这个参数设置成1的时候, 表示每次事务的redo log都直接持久化到磁盘。这个参数我建议你设置成1,这样可以保证 MySQL异常重启之后数据不丢失。 sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。这个参数我也建 议你设置成1,这样可以保证MySQL异常重启之后binlog不丢失。

摘自:丁奇 mysql45讲。
ps:https://time.geekbang.org/column/139

你可能感兴趣的:(mysql,mysql)