MYSQL--日志

113 阅读3分钟

日志

什么是UNDO LOG?

  • 可以通过BEGIN 和END来开启日志,MYSQL是开启了隐式日志的,在AUTOCOMMI里面进行控制,事务的原子性就是由UNDO LOG保证的

REDO LOG日志和BIN LOG日志有什么区别?

  • BIN LOG是SERVER层实现的日志,所有存储引擎都能使用,主要格式有 STATEMENT(默认格式)、ROW 、MIXED,BIN LOG日志是追加写,写满一个文件就新建,不会覆盖以前日志,是全量日志,BIN LOG主要用于备份恢复,主从复制

    STATEMENT:记录和发送SQL语句,每一条修改过的SQL语句都会记录再BIN LOG逻辑日志里面,主从复制的SLAVE节点根据BIN LOG日志进行SQL语句再现,但是主从复制的过程中会有比如NOW()这种动态函数导致的数据不一致的问题。

    ROW:发送行数据,只存储记录行最终是扫描样子,主从复制不会有数据不一致的情况,但是UPDATE每次修改的行记录都会存储,STATEMENT下只会存储最后一次的UPDATE

    MIXED:包含STATEMENT和ROW,根据情况自动选择。

  • REDO LOG是INNODB存储引擎的日志,REDO LOG是物理日志,记录的是在XXX数据页做出了XXX修改,记录格式为:在XXX表对YYY数据页ZZZ便宜量做出了XXX修改,REO LOG日志是循环写,REDO LOG主要用于掉电恢复。

REDO LOG和BIN LOG在恢复数据上有什么区别?

  • REDO LOG记录的是数据的修改情况,是循环写,主要用于掉电恢复
  • BIN LOG记录的全量数据,不会覆盖写,主要用于备份恢复和主从复制

REDO LOG是怎么实现持久化的?

在MYSQL中,对数据做出的修改其实是在BUFFR POOL缓存池中,比如UPDATE其实是先修改CHANGE POOL中的数据,然后标记为脏页,在后台异步刷盘,如果事务提交时 数据库发生宕机·,数据没来得及刷盘,就会造成数据的丢失,所以在事务提交时,REDO LOG会先进行刷盘,REDO LOG 记录了数据修改位置情况,如果脏页丢失,也能进行掉电恢复。

REDO LOG除了掉电恢复 还能进行扫描?

REDO LOG写磁盘发生在事务提交前,REDO LOG写磁盘时追加写 即顺序写的形式,而BUFFER POOL数据页写磁盘时随机写的形式,先进行REDO LOG刷盘,可以让随机写变成顺序写,提高MYSQL的磁盘写入性能。

两段提交的过程?

  • 两段提交就是将事务的提交分为准备阶段和提交阶段

    • 准备阶段:REDO LOG状态标志位PREPARE,REDO LOG进行刷盘
    • 提交阶段BIN LOG 进行刷盘,并将REDO LOG状态标志为COMMIT
  • 在两段提交中,把BIN LOG刷盘成功的时机作为事务提交成功的标志,如果BINL LOG没有刷入磁盘,事务就会回滚,如果BIN LOG刷入磁盘但是REDO LOG 状态还是PREPARE,下次重启就会提交。

为什么要进行两段提交?

  • 为了保证BIN LOG和REDO LOG日志里面的数据一致
  • 在主从复制过程中,主库发生修改,但是只记录了REDO LOG ,BIN LOG 还没来得及刷盘,就会导致主数据库和从数据库之间数据不一致。