mysql的binlog,undo log,redo log

本文详细介绍了MySQL的binlog(二进制日志)、undolog(回滚日志)和redolog(重做日志)的用途和工作机制。binlog用于主从复制和数据恢复,undolog保障原子性,redolog确保数据持久性。此外,还讨论了redolog的三种刷新策略及其对数据安全和性能的影响。
摘要由CSDN通过智能技术生成

1. binlog 二进制日志

binlog用于mysql记录写入性操作信息,以二进制的形式保存到磁盘中。
binlog日志的使用场景主要有三个:
1. 主从复制:
在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从而达到主从数据一致。
2. 数据恢复
通过使用mysqlbinlog工具来恢复数据。
3. 增量备份
MySQL->Elasticsearch需要有对应的同步程序(一般就是监听MySQL的binlog,解析binlog后导入到Elasticsearch) JAVA实现mysql的binlog监听

mysql操作binlog日志语句:
	 查看是否开启binlog日志:show variables like 'log_bin'
	 查看所有binlog的日志列表:show master logs
	 刷新binlog:flush logs
	 清空所有的binlog日志:reset master
	 查看第一个binlog日志:show binlog events
	 根据binlog日志名称查询:show binlog events in '[Log_name]'

2. undo log 回滚日志

数据库有四大特性:一致性、原子性、隔离性、持久性
其中,原子性是指一个事务里的对数据库一系列操作,要么全部成功,要么全部失败,不可能出现部分成功部分失败的情况。

而原子性就是依靠undo log来实现的,undo log记录了数据的逻辑变化。

比如一条插入(INSERT)操作,就会对应一条删除(DELETE)的undo log记录。对于每个修改(UPDATE)操作,就会对应一条相反的修改(UPDATE)的undo log记录。这样在发生异常时,就能依靠undo log来进行回滚。

在innodb中,每条数据都有两个隐藏字段,事务id(trx_id)和回滚指针(roll_pointer)。

  • 每次修改某行记录时,都会把该事务的事务id赋值给trx_id隐藏列。
  • 每次修改某行记录时,都会把undo日志地址赋值给roll_pointer隐藏列。

由于每次变动都会先把undo日志记录下来,并用回滚指针(roll_pointer)指向undo日志地址。因此可以认为,对该条记录的修改日志串联起来就形成了一个版本链,版本链的头节点就是当前记录最新的值。

3. redo log 前滚日志

redo log是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

比如MySQL实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

redo log包含两个部分:一个是内存中的日志缓冲(redo log buffer),另一个是磁盘上的日志文件(redo log file)。

由于每次写数据都会和磁盘发生一次IO操作,很影响性能,所以mysql每执行一条写操作语句,就会先将记录写入redo log buffer(日志缓冲区),然后后续某个时间点再一次性将多个操作记录写到redo log file。
但是在操作系统中,是无法直接将用户的缓冲区的数据直接写入到磁盘中的,所以会经过内核的缓冲区(os buffer),通过调用缓冲区的fsync()再将redo log buffer写入到redo log file中。

innode引擎记录一条数据一般是这样的流程:写操作 -->redo Log操作–>写入redo log buffer -->通过缓冲区,写入redo log file(记录到磁盘中)。

mysql支持三种将redo log buffer写入redo log file的时机,可以通过innodb_flush_log_at_trx_commit参数配置,各参数值含义如下:

  • innodb_flush_log_at_trx_commit=0
    设置为0时是(大约)每秒刷新写入到磁盘中的,当系统崩溃,会丢失1秒钟的数据。
  • innodb_flush_log_at_trx_commit=1(默认)
    每次提交事务,都会将redolog buffer里的写入到redolog file里,这种方式即使系统崩溃也不会丢失任何数据,但是因为每次提交都写入磁盘,IO的性能较差。
  • innodb_flush_log_at_trx_commit=2
    事务每次提交,将数据写入到内核的缓冲区(os buffer)中,然后每秒调用缓冲区的fsync()再将redo log buffer写入到redo log file中。

redo log实际上记录数据页的变更,而这种变更记录是没必要全部保存,因此redo log实现上采用了大小固定,循环写入的方式,当写到结尾时,会回到开头循环写日志。

启动innodb的时候,不管上次是正常关闭还是异常关闭,总是会进行恢复操作。因为redo log记录的是数据页的物理变化,因此恢复的时候速度比逻辑日志(如binlog)要快很多。

前滚:事务提交之后,部分数据写入了磁盘,但是还有部分数据存在脏页上,并没有写入磁盘。此时设备宕机,没有写入磁盘的数据丢失。就要依赖redolog来恢复这部分数据。

回滚:事务还未提交,改动并没有完全生效,但是记录已经被修改。此时设备宕机,数据是有问题的,就要依赖undolog回滚改动。

二进制日志(binlog)是由数据库层面实现的,undo log和redo log是事务日志,undo log和redo log只存在于innodb中,myisam引擎是不存在undo log和redo log这两个日志文件的,所以myisam引擎是不支持事务的。

BinlogUndo LogRedo Log是三种常见的日志文件类型。 BinlogMySQL数据库的二进制日志文件,它记录了所有对数据库的修改操作,包括增删改等。Binlog以追加的方式进行写入,并可以通过设置max_binlog_size参数来控制每个binlog文件的大小。当文件大小达到给定值后,会生成新的文件来保存日志。Binlog的主要用途是用于数据备份、数据恢复以及数据库复制的过程Undo Log是用于回滚操作的日志文件,记录了事务执行过程对数据的修改操作。当事务进行回滚操作时,Undo Log的日志记录会被用来还原事务执行前的数据状态。Undo Log的存储格式可以根据数据库的实现方式而有所不同。 Redo Log是用于事务的持久性和恢复操作的日志文件。它记录了事务执行过程对数据的修改操作,并在事务提交前将这些操作持久化到磁盘上。当数据库发生故障时,Redo Log可以通过重做操作来恢复数据的一致性。Redo Log的格式通常是固定的,如MySQLRedo Log文件名为ib_logfileN。 综上所述,Binlog是记录数据库的修改操作的二进制日志文件,Undo Log是记录事务回滚操作的日志文件,而Redo Log是用于事务的持久性和恢复操作的日志文件。它们在存储内容、格式、生成方式以及使用场景上都有一定的区别。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQLredo logundo logbinlog](https://download.csdn.net/download/weixin_38619613/13686869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [mysql_三大日志binlogredoLogundoLog详解](https://blog.csdn.net/chuige2013/article/details/123027580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值