数据库日志的原理

数据库日志主要分为普通日志、重点日志两种类型

数据库日志的原理_第1张图片
MySQL核心日志分类

普通日志很容易理解这里就不赘述,重点日志着重介绍

一、innodb引擎中的redo/undo log是什么

  • redo
    介绍redo 日志是什么时,需要先回顾一下操作数据库数据的逻辑,一般是这样:首先,从数据库文件中找到记录,文件一般是按照一种特定的格式存放,比如页,然后加载整页数据到内存,在内存中进行数据的操作(脏页)然后将脏页同步回文件,一般不会立即将脏页刷回到磁盘,这样会产生大量的随机IO操作,性能低下,如果不立即刷回磁盘,那么当服务器挂掉后,存放在内存中的数据会丢失,造成数据的不一致性,也就无从持久化。为了解决这一矛盾,引入了redo日志。

  • undo
    undo日志是取消操作,用于事务回滚,将数据恢复到修改之前的状态,InnoDB的多版本并发控制(MVCC)就是基于undo来实现的 (原子性)

小结:redo与undo是MySQL存储引擎级别的日志,俗称事务日志,与事务的实现息息相关

二、什么是binlog

数据库的任何变化(创建表,更新数据库,对行数据进行增删改),都以二进制文件的方式记录在主库的Binary Log(即binlog)日志文件中,(对于select操作则不会被记录到binlog里,因为它并没有修改数据库的数据),binlog是在事务最终commit前写入的,在MySQL主从复制中就是依靠binlog来实现。

三、binlog的三种模式

  • row:
    基于行的模式,记录的是行的变化,很安全。但是binlog会比其他两种模式大很多,在一些大表中清除大量数据时在binlog中会生成很多条语句,可能导致从库延迟变大。
  • statement:
    基于SQL语句的模式,某些语句和函数如UUID, LOAD DATA INFILE等在复制过程可能导致数据不一致甚至出错。
  • mixed:
    混合模式,根据语句来选用是statement还是row模式。

你可能感兴趣的:(数据库日志的原理)