2.Mysql日志

58 阅读2分钟

mysql日志

mysql很重要的两个日志系统。redo log是InnoDB的,binlog是server层的。

redo log日志

有个很有趣的例子:古代的掌柜遇到有人吃饭赊账,就在背后的白板上面记录一笔,晚上核算账目时再拿出账本,在上面找到赊账人记录下来。如果白天赊账的人太多,拿出账本一页一页找赊账人实在太慢了,白板先记录好,晚上关门在记录到账本,这样效率高很多。

WAL技术就是先写日志,再写磁盘。

InnoDB引擎先把记录写入redo log里面,更新内存,空闲时间再把数据更新到磁盘。

crash-safe即使数据库异常重启,之前提交的记录不会丢失。

有一个环形数组,每存储一次就向后移动一位,结尾和开头相等,重新循环。

image.png

binlog日志

在执行器的时候往这个日志中写入具体操作,不像redolog会覆盖数据,可以追加写入数据。

数据误删如何恢复数据?

如果发生误删数据,找到最近一次全量备份,恢复到临时库,从备份时间点开始,将备份binlog依次取出,重放到误删除的位置,然后把临时库恢复到线上库。

两阶段提交

有两种情况:

  • 先写redo log后写binlog redo log记录了日志,系统发生崩溃,binlog没写完,没记录该日志。用binlog恢复数据库,发现没有这条记录,恢复出来的数据不一致。

  • 先写binlog后写redo log binlog写完系统崩溃,redo log还没写,恢复的时候binlog的数据和原库不同。

两个日志表示事务的提交状态,两阶段提交让两个状态保持逻辑上一致。

两阶段提交场景

如果数据库需要扩容,保证数据一致,全量备份+binlog完成。

问题:那么在什么场景下,一天一备会比一周一备更有优势呢?或者说,它影响了这个数据库系统的哪个指标?
  • 数据更新频繁
  • 数据价值高
  • 系统稳定性差

RPO恢复点目标,允许的最大数据丢失时间 要满足更低RPO,就要频繁地备份。