目录
五.问题:全量备份的周期取决与系统重要性,那在什么场景下,一天一备比一周一备更有优势呢?或者说它影响了数据库的系统的那个指标呢?
思维导图
02|日志系统:一条SQL更新语句是如何执行的? | 八九. | 思维导图(新) | ProcessOn
密码:I3X8
引言
一.更新的流程
这里只能使用InooDB引擎哦,因为他有crash-safe的能力(下面会细说)
二.redo log(属于InnoDB引擎特有的日志)
(1)WAL技术
WAL技术:write-ahead logging 就是先写日志,再写磁盘,也就是先写粉板,再写磁盘
(2)crash-safe
redo log 是固定大小,分为四个文件,总共大小为4GB
write pos与checkpoint:前者是记录当前的位置,一边写,一边后移;后者是当前要擦除的位置,也是往后推移并且新换的,擦除记录前要把记录更新到数据库,这是在粉板上的操作,也就是在redo log上的操作
两者之前的距离就是拿来记录新的操作,有了redolog,InnoDB就可以保证即使数据库发生异常重启,之前调教的记录都不会丢失,这个能力就是crash-safe
三.binlog(server层,归档日志)
1.两种日志的区别
1.redolog是InnoDB引擎特有的,binlog是所有引擎都可以使用的
2.redo log 是物理日志,记录的是‘在某个数据上做了什么修改’,binlog是逻辑日志,记录的是这个语句的原始逻辑,比如‘给id=2这一行的c字段加1’
3.redolog是循环写的,binlog是可以追加写入的,追加写入指的是binlog文件写道一定大小后会切换到下一个,并不会覆盖以前的日志
2.update语句时候的内部流程
3.数据恢复
binlog会记录所有的逻辑操作,采用追加写的形式,如果你的DBA承诺半个月内可以恢复数据,那么备份系统一定会保存最近半个月的所有binlog,同时系统会定期做整库的备份,这里的定期可以是一天一备,也可以是一周一备
例子:如果你在某个点误删了一个表
1.首先找到最近的一次全量备份
2.然后从备份的时间点开始,将备份的binlog一次取出来,重放到误删表的操作之前
四.二阶段提交
为什么使用二阶段提交(反例类说明)
1.先写redo log 再写binlog
假设在redolog写完,binlog没有写完,binlog还没有写完,mysql就进行了异常重启,redolog写完就发生了crash,数据已经更新到磁盘,但是binlog没有记录这条数据,所以如果用binlog来恢复数据的话,那就不会有刚刚redolog写入磁盘的数据
2.先写binlog 再写redo log
binlog已经写完,但是redolog还没有写,mysql在这时候进行了异常重启,那这条数据更新明明还没跟新,但是binlog已经记录更新了,恢复出来的数据就会和已经操作的不符合,可能会多出来一个数据或者说是事务,代码中的事务已经回滚,但是binlog已经记录了,那再运行就会多出来一个事务
小结
redolog用与保证crash-safe的能力,innodb_flush_log_at_trx_commit这个参数设置成1,表示每次事务的redo log 都直接持久化到磁盘中(保证mysql异常重启之后,数据不丢失)
sync_binlog这个参数设置成1,每次事务的binlog都会持久化到磁盘中(mysql异常重启,binlog不会丢失)
五.问题:全量备份的周期取决与系统重要性,那在什么场景下,一天一备比一周一备更有优势呢?或者说它影响了数据库的系统的那个指标呢?
这是要根据业务来说明
一天一备:好处是最长回复时间更短,但是经常备份的话那会频繁消耗更多存储空间,这个是根据RTO(恢复目标时间)成本来换得
所以和它有关的是恢复目标时间,和内存的成本,还有业务需求的重要性和容忍度。