数新网络——让每个人享受数据的价值

官网已全副降级,欢送拜访!

https://www.datacyber.com

前言

在MySQL中,有三个重要的日志文件,别离是undolog、redolog和binlog。这三个日志文件在MySQL中扮演着不同的角色。

01 undo Log

在数据库事务的四大个性中,原子性是指事务中的所有操作要么全副胜利,要么全副失败回滚。实现原子性的底层机制之一就是通过应用Undo Log。

undolog是innodb引擎独有的日志,次要是为事务而筹备的,采纳循环写笼罩的形式提供回滚能力。它用于记录批改操作的反向操作。

当MySQL执行一个事务时,它将对数据进行批改,同时也将反向操作(如果咱们执行了insert操作,那么日志中就会新增一条相同的delete的sql)记录到 undolog 中。如果MySQL在执行事务的过程中呈现故障或者回滚操作,它能够通过 undolog 中的信息进行复原。

另外,undolog 还有一个作用,通过 ReadView + undo log 实现多行版本控制(MVCC):当读取的某一行被其余事务锁定时,它能够从undolog中剖析出该行记录以前的数据是什么,从而提供该行版本信息,让用户实现非锁定一致性读取。

02 redo log

MySQL 的数据都是存在磁盘中的,当咱们要更新一条记录的时候,得先要从磁盘读取该记录,而后在内存中批改这条记录。批改完这条记录不是间接写回到磁盘,而是缓存起来。为此,Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来进步数据库的读写性能。

Buffer Pool 是进步了读写然而Buffer Pool 是基于内存的,而内存总不牢靠,万一MySQL在执行事务的过程中遇到系统故障或者解体,还没来得及落盘的数据就会失落。为了解决这个问题,引入了redo log, undo log也是innodb引擎独有的日志,次要是为事务而筹备的,应用了 WAL 技术(Write-Ahead Logging),也就是预写日志。

它的关键点就是先写日志,再写磁盘。对应到Mysql中具体操作,就是每次更新操作,先写日志,而后更新内存数据,最初等零碎压力小的时候再进行IO更新磁盘数据。防止了每一次更新都须要进行IO操作。redo log 是保障了事务持久性的要害。

当咱们从数据库中获取到数据并对其进行批改操作之后,这个批改操作就会优先被寄存到redo log buffer中,最终就会被写入到redo log file中。

后续,InnoDB 引擎会在适当的时候将redo log的写入磁盘,写入磁盘的机会是由MySQL零碎参数设置决定的,咱们能够键入上面这条SQL查看

SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

innodb_flush_log_at_trx_commit有3种值:0、1、2,默认为1。

当设置为1的时候:事务每次提交都会将log buffer中的日志写入os buffer并调用fsync()刷到log file on disk中。这种形式即便零碎解体也不会失落任何数据,然而因为每次提交都写入磁盘,IO的性能较差。

当设置为0的时候:事务提交时不会将log buffer中日志写入到os buffer,而是每秒写入os buffer并调用fsync()写入到log file on disk中。也就是说设置为0时是(大概)每秒刷新写入到磁盘中的,当零碎解体,最多会失落1秒钟的数据。

当设置为2的时候:每次提交都仅写入到os buffer,而后是每秒调用fsync()将os buffer中的日志写入到log file on disk。

redo log 和 undo log都属于 InnoDB 存储引擎的日志,并且次要是为事务而筹备的,他们的区别在于 : redo log 记录了此次事务「实现后」的数据状态,记录的是更新之后的值;

undo log 记录了此次事务「开始前」的数据状态,记录的是更新之前的值; 事务提交之前产生了解体,重启后会通过 undo log 回滚事务,事务提交之后产生了解体,重启后会通过 redo log 复原事务,如下图:

三. binlog

MySQL 在实现一条更新操作后,Server 层还会生成一条 binlog,等之后事务提交的时候,会将该事物执行过程中产生的所有binlog对立写入binlog文件。在正式运行环境,binlog十分重要,其关系到数据是否被找回的问题,binlog采纳了追加写的形式,记录了所有数据库表构造变更和表数据批改的日志,不会记录查问类的操作,比方 SELECT 和 SHOW 操作。

redo log 和 binlog 有什么区别?

1、实用对象不同:
binlog 是 MySQL 的 Server 层实现的日志,所有存储引擎都能够应用; redo log 是 Innodb 存储引擎实现的日志; 2、文件格式不同:
bin log则是记录批改的动作,例如update table set name='zhangsan' whrere id=1,redo log存储的物理日志,即批改的数据内容

2、写入形式不同:
binlog 采纳追加写的形式,写满一个文件,就创立一个新的文件持续写,不会笼罩以前的日志,保留的是全量的日志。 redo log 是循环写,日志空间大小是固定,全副写满就从头开始,保留未被刷入磁盘的脏页日志。

3、用处不同:
binlog 用于备份复原、主从复制;
redo log 用于停电等故障复原。

查看mysql是否开启binlog同步性能
show variables like 'log_bin';

查问的结果显示为ON则示意MySQL开启了binlog。如果数据库的binlog处于敞开的状态,倡议通过批改Mysql的配置文件:Windows下的Mysql配置文件是my.ini ,Linux下Mysql的配置文件是my.cnf。

[mysqld]# 开启binloglog-bin = mysql-binbinlog_format = ROWexpire_logs_days = 30

增加相干配置后重启数据库即可

四.总结

这三个日志不仅能够用于复原数据库的状态,同时还能够加强数据库的性能和可靠性。对于MySQL的性能来说,redolog和undolog是至关重要的,他们通过管制事务的提交和回滚,保障了批改的正确性。

binlog则更多的是用于备份和数据复制的场合,做到业务间断不中断。而对于MySQL的可靠性来说,这三种日志都很重要,每种日志都施展了不同的作用,从而最大水平的进步了MySQL的可靠性。