网站开发维护多少钱,贵阳网站建设制作方法,烟台建网站公司,wordpress搭建的小程序MySQL的逻辑架构图
MySQL中两个重要的日志模块#xff1a;redo log#xff08;重做日志#xff09;和binlog#xff08;归档日志#xff09;
我们先来看redo log#xff1a;
介绍一个MySQL里经常说到的WAL技术#xff0c;即Write-Ahead-Logging#xff0c;它的关键点… MySQL的逻辑架构图
MySQL中两个重要的日志模块redo log重做日志和binlog归档日志
我们先来看redo log
介绍一个MySQL里经常说到的WAL技术即Write-Ahead-Logging它的关键点就是先写日志再写磁盘。具体来说当有一条记录需要更新的时候InnoDB引擎就会先把记录写到redo log里面并更新内存这个时候更新就算完成了同时InnoDB引擎会在适当的时候将这个操作记录更新到磁盘里面而这个更新往往是在系统比较空闲的时候做的。
InnoDB的redo log是固定大小的比如可以配置为一组4个文件每个文件在大小是1GB总共就可以记录4GB的操作。从头开始写写到末尾就又回到开头循环写如下面所示 write pos是当前记录的位置一边写一边后移写到第3号文件末尾就回到0号文件开头。checkpoint是当前要擦除的位置也是往后推移并且循环的擦除记录前要把记录更新到数据文件。write pos和checkpoint之间是还空着的部分可以用户来记录新的操作。如果write pos追上checkpoint就表示满了这时候不能再执行新的更新得停下来先擦掉一些记录把checkpoint推进一下。
有了redo logInnoDB就可以保证即使数据库发生异常重启之前提交的记录都不会丢失这个能力称为crash-safe。
再来看下binlog
MySQL整体来看其实就两块一块是Server层它主要做的是MySQL功能层面的事情还有一块是引擎层负责存储相关的具体事宜。redo log是InnoDB引擎特有的日志而Server层也有自己的日志称为binlog。
redo log和binlog的不同点有三个
1redo log是InnoDB引擎特有的binlog是MySQL的Server层实现的所有引擎都可以使用
2redo log是物理日志记录的是“在某个数据页上做了什么修改”binlog是逻辑日志记录的是这个语句的原始逻辑比如“给ID2这一行的c字段加1”
3redo log是循环写的空间固定会用完binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个并不会覆盖以前的日志。
一个update语句的执行流程如下图所示 再介绍一下两阶段提交指的是redo log的prepare和commit两个阶段
为什么需要“两阶段提交”呢这是为了让两份日志之间的逻辑一致。如果不使用“两阶段提交”那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。简单说redo log和binlog都可以用于表示事务的提交状态而两阶段提交就是让这两个状态保持逻辑上的一致。
现在来回答标题中的问题MySQL是如何做到可以恢复到半个月内任意一秒的状态的这里需要有两个前提即开启了定期整库备份和开启了binlog记录。恢复时的操作步骤如下
1首先找到最近一次的全量备份将这个备份恢复到临时库
2然后从备份的时间点开始将备份的binlog依次取出来重放到我们期望的那个时刻。
binlog还有一种用途当需要扩容的时候也就是需要再多搭建一些备库来增加系统的读能力的时候现在常见的做法也是用全量备份加上应用binlog来实现的。
注
1为了保证MySQL异常重启之后redo log的数据不丢失强烈建议将innodb_flush_log_at_trx_commit这个参数设置成1表示每次事务的redo log都直接持久化到磁盘
2为了保证MySQL异常重启之后binlog的数据不丢失强烈建议将sync_binlog这个参数设置成1表示每次事务的binlog都持久化到磁盘。