IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> mysql的binlog,undo log,redo log -> 正文阅读

[大数据]mysql的binlog,undo log,redo log

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引擎是不支持事务的。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-24 15:21:56  更:2022-02-24 15:22:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:40:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码