| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> redolog 、undolog 和binlog -> 正文阅读 |
|
[大数据]redolog 、undolog 和binlog |
首先提及一下事务的ACID :原子性、一致性、隔离性和持久性 隔离性:是由 锁实现的 原子性、一致性、和持久性 是由 redo log 和undo log 来保证的 Mysql日志主要包括1、慢查询日志:记录执行时间超过long_query_time的所有查询,方便我们对查询优化 2、通用查询:日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对我们复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。 3、查询日志:错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的状态,从而对服务器进行维护。 4、二进制日志(bin?log):记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以吸服务器遇到故障时数据的无损失恢复。 5、中继日志:用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。 6、数据定义语句日志:记录数据定义语句执行的元数据操作。 redo? logredo log 称为重做日志 ,是储存引擎层(innodb)生成的日志。提供再写入的操作,回复提交事务修改页的操作,用来保证事务持久性,假如说发生宕机,可以进行恢复数据,保证持久性,。他记录的是“物理级别”上的页修改操作,比如页号x,偏移量y,写入了“”ds‘’数据。为了保证数据的可靠性; undo log 称为回滚日志,也是是储存引擎层(innodb)生成的日志。回滚记录到某个特定的版本,用来保证事务原子性,一致性。主要用于事物的回滚 和 一致性非锁定读(undo log 会滚到记录某种特定的版本---mvcc,也就是多版本并发控制)。其实现原理借鉴以下图片 他是不断指向上一个日志链条,以此实现回滚。 好处:redo日志降低了刷盘频率 占用空间非常小(只是储存空间ID、页号、偏移量和需要更新的值) 特点顺序写入磁盘(每执行一条语句就可能产生redo日志,这些日志是按顺序写入磁盘的)事务执行过程中,redo不断记录,假设一个事务我们插入10万数据,在这个过程,redo 会不断地记录。但是bin log(数据库层产生) 不会记录,直到事务提交完成才一次性写入 组成redo? log buffer? 和 redo log file redo log buffer保存在内存之中,容易丢失 每次启动时后就会申请一大片称之为redo,log buffer的连续空间,然后这款空间再被划分成若干连续的redo log block 。一个 block占512字节 参数设置:innodb_log_buffer_size 默认16MB ,最大值4096M ,最小值1M redo log file保存在磁盘中,是最持久的 默认存储当前文件夹下 ?流程 第1步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝 redo log 的刷盘策略 其实就是redo log buffer 到 redo log file 的过程 InnoDB给出 innodb_ flush_ .log- at_ _trx_ .commit 参数,该参数控制commit提交事务时,如何将redo log buffer中的日志刷新到redo log file中。它支持三种策略: 总结 Undo log简介undo log 称为回滚日志,也是是储存引擎层(innodb)生成的日志。回滚记录到某个特定的版本,用来保证事务原子性,一致性。主要用于事物的回滚 和 一致性非锁定读(undo log 会滚到记录某种特定的版本---mvcc,也就是多版本并发控制)。其实现原理借鉴以下图片 作用1:回滚数据 undo是逻辑日志,只是将数据库逻辑地回复到原来的样子。所有的修改被逻辑的取消了,但是数据结构和页本身和之前大不相同, 作用2:MVCC mvcc是通过undo来完成的,当用户读取一条行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取 读已提交如何基于ReadView机制实现的 RC级别的核心是每次发起查询都重新生成一个ReadView。第一次查询的时候,发现数据的trx_id在自己的min和max之间和m_ids之中,所以它是一个活跃的事务修改的,并且此时尚未提交,所以它会顺着undo log版本链查找以及提交的事务。第二次查询的时候,重新开启一个新的READ VIEW,发现数据的trx_id不在m_ids中,说明该事务已经提交,所以直接读取数据行的数据。这就是RC级别的实现原理。 可重复读如何基于ReadView实现的可重复读的核心是只在事务开始时生成一个ReadView,后续再次读的时候,即使事务B提交了,但是事务A它的ReadView还是刚开始事务时的,所以认为B还是活跃的,所以继续沿着undo log版本链查询,读取到始终一样。MySQL的可重复读还解决了幻读,因为新插入的数据记录的trx_id要么大于事务A的max_trx_id,要么在m_ids之中 (而且非本身)所以认为插入的数据记录时不能被读取的。 储存结构1、回滚段与undo页 InnoDB对undo log的管理采用段的方式,也就是回滚段(rollback segment) 。每个回滚段记录了1024个undo log segment ,而在每个undo log segment段中进行undo页的申请。 undo页的重用
流程图?undo的版本回滚是基于ReadView机制 bin log简介binlog即binary log,二进制日志文件,也叫作变更日志(update log)。它记录了数据库所有执行的DDL和DML等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、show等) 。它以事件形式记录并保存在二进制文件中。通过这些信息,我们可以再现数据更新操作的全过程。 应用场景1、数据恢复:如果MySQL数据库,意外停止,可以通过二进制的文件夹来查看用户执行了哪些操作,对数据库服务器文件做了哪些修改,然后根据二进制文件中的记录来恢复数据库服务器。 2、数据复制:??有数据库的延续性和时效性,master把他的二进制日志传递给slaves来达到master-save数据一致的目的 mysql数据库的数据备份 数据备份、主备、主主 ,主从都离不开binlog 写入机制bihlog写入时,事务执行过程中,先把日志写到binlog cache ,事务提交的时候,再把binlog cache写到binlog文件中。因为一个事务的binlog不能被拆开, 所以无论这个事务多大,也要确保一次性写入, 所以系统会给每个线程分配一个块内存作为binlog cache。我们可以通过binlog_ cache_ size 参数控制单个线程binlog cache大小,如果存储内容超过了这个参数,就要暂存到磁盘(Swap) 。主要流程如下 write和fsync的时机,可以由参数sync_ binlog 控制,默认是0。 为0的时候,表示每次提交事务都只write,由系统自行判断什么时候执行fsync。虽然性能得到提升,但是机器宕机,page cache里面的binglog会丢失 为1的时候,表示每次提交事务都会执行fsync,就跟redo log的刷盘流程一样 sync_ binlog可以设置成一个较大的数N,表示每次提交事务都会write但是只有当提交事务的数量到达N的时候才会刷盘。 binlog和redolog对比●redo log它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于InnoDB存储引擎层产生的。 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 2:44:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |