Mysql日志: redolog,undolog,binlog,errorlog,slow_query_log,generallog,relaylog区别与作用

1,redolog: 重做日志

    redolog用来确保事务的持久性,防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redolog进行重做,从而达到事务的持久性这一特性。

    事务一旦开启之后就开始产生redolog,redolog并不需要等待事务提交之后才写入磁盘,而是事务的执行过程中,便开始写入redolog文件,redolog是按照顺序写入redolog文件中的。

    事务开启之后redolog的逐步写盘是如何实现,重做日志有一个缓存区Innodb_log_buffer(默认大小为8M),Innodb存储引擎先将重做日志写入innodb_log_buffer中,然后通过一下三种方式将redolog日志缓冲区的日志写到磁盘

       1,Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。
  2,每个事务提交时会将重做日志刷新到重做日志文件。
  3,当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件

2,undolog: 回滚日志

    undolog 保存了事务发生之前的数据的一个或多个版本,可以用来在事务失败时进行rollback,用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。

    逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,记录数据修改被修改前的值,回滚主要通过DB_ROLL_PTR,回滚指针记录上一个版本的地址,从而回滚到之前的数据。

    当事务提交之后,undo log并不能立马被删除,而是会被放到待清理链表中,待判断没有事物用到该版本的信息时才可以清理相应undolog。

Mysql日志: redolog,undolog,binlog,errorlog,slow_query_log,generallog,relaylog区别与作用_第1张图片

DB_ROW_ID:    行标识(隐藏单调自增ID),大小为6字节,如果表没有主键,InnoDB会自动生成一个隐藏主键,因此会出现这个列。

DB_TRX_ID:    记录最近更新这条行记录的事务 ID,大小为6个字节。

DB_ROLL_PTR:    表示指向该行回滚段(rollback segment)的指针,大小为7个字节,InnoDB便是通过这个指针找到之前版本的数据。

3,redolog和undolog区别

redolog和undolog只存在于innodb中,这两个日志在innodb中统称为事务日志。undolog用于回滚,redolog用于前滚。

  • 前滚:
    事务提交之后,部分数据写入了磁盘,但是还有部分数据存在脏页上,并没有写入磁盘。此时设备宕机,没有写入磁盘的数据丢失,就要依赖redolog来恢复这部分数据。
  • 回滚:
    事务还未提交,改动并没有完全生效,但是记录已经被修改。此时设备宕机,数据是有问题的,就要依赖undolog回滚改动。

4,binlog: 二进制日志

    逻辑格式的日志,记录了数据库表结构和表数据变更,比如update/delete/insert/truncate/create。它不会记录select(因为这没有对表没有进行变更),可以简单认为就是sql语句,但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。

    binlog可以用于主从复制,从库利用主库上的binlog进行重播,实现主从同步。还可以用于数据库的基于时间点的还原。

    事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。

    binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

5,slow_query_log: 慢查询日志

    开启slow_query_log会将执行较慢的sql(默认超过10秒)记录到日志当中,sql调优的时候可以查看slow_query_log定位慢sql。

#查看慢日志是否开启(默认是OFF),以及慢日志存放位置
show variables like 'slow_query%'

#开启慢日志
set global slow_query_log='ON'

#设置慢sql时间,超过2秒是为慢sql
set global long_query_time=2

6,general_log: 一般查询日志

    开启general_log,会将所有到达Mysql Server的SQL语句记录,但是由于记录数量非常庞大,一般不会开启general_log(默认关闭),紧急排障时,可以临时开启。

# 查看日志是否开启
show variables like 'general_log';
# 查看日志输出类型  table或file
show variables like 'log_output';
# 查看日志文件保存位置
show variables like 'general_log_file';
# 设置日志文件保存位置
set global general_log_file='/tmp/general_log';
# 开启日志功能  ON 开启 OFF 关闭
set global general_log=on;
# 设置输出类型为 
# table 将日志记录至数据库表中 
# file:将日志记录在文件中
# none:不记录
set global log_output='table';

7,relaylog: 中继日志

    Mysql master将binlog写入本地,从节点定时请求增量binlog,主节点将binlog同步到从节点 ,从节点单独进程会将binlog 拷贝至本地 relaylog中,从库SQL线程读取relaylog中更新事件并应用,实现mysql主从同步。

Mysql日志: redolog,undolog,binlog,errorlog,slow_query_log,generallog,relaylog区别与作用_第2张图片

8,errorlog: 错误日志

    errorlog记录了MySQL Server每次启动和关闭的详细信息以及运行过程中所有较为严重的警告和错误信息。

9,参考

MySQL中逻辑分层简单介绍

mysql redo ,undo ,binlog

MYSQL general_log日志

浅谈mysql的两阶段提交协议

你可能感兴趣的:(MySQL,mysql)