mysql日志
mysql很重要的两个日志系统。redo log是InnoDB的,binlog是server层的。
redo log日志
有个很有趣的例子:古代的掌柜遇到有人吃饭赊账,就在背后的白板上面记录一笔,晚上核算账目时再拿出账本,在上面找到赊账人记录下来。如果白天赊账的人太多,拿出账本一页一页找赊账人实在太慢了,白板先记录好,晚上关门在记录到账本,这样效率高很多。
WAL技术就是先写日志,再写磁盘。
InnoDB引擎先把记录写入redo log里面,更新内存,空闲时间再把数据更新到磁盘。
crash-safe即使数据库异常重启,之前提交的记录不会丢失。
有一个环形数组,每存储一次就向后移动一位,结尾和开头相等,重新循环。
binlog日志
在执行器的时候往这个日志中写入具体操作,不像redolog会覆盖数据,可以追加写入数据。
数据误删如何恢复数据?
如果发生误删数据,找到最近一次全量备份,恢复到临时库,从备份时间点开始,将备份binlog依次取出,重放到误删除的位置,然后把临时库恢复到线上库。
两阶段提交
有两种情况:
-
先写redo log后写binlog redo log记录了日志,系统发生崩溃,binlog没写完,没记录该日志。用binlog恢复数据库,发现没有这条记录,恢复出来的数据不一致。
-
先写binlog后写redo log binlog写完系统崩溃,redo log还没写,恢复的时候binlog的数据和原库不同。
两个日志表示事务的提交状态,两阶段提交让两个状态保持逻辑上一致。
两阶段提交场景
如果数据库需要扩容,保证数据一致,全量备份+binlog完成。
问题:那么在什么场景下,一天一备会比一周一备更有优势呢?或者说,它影响了这个数据库系统的哪个指标?
- 数据更新频繁
- 数据价值高
- 系统稳定性差
RPO恢复点目标,允许的最大数据丢失时间 要满足更低RPO,就要频繁地备份。