mysql日志:binlog、redolog、undolog

阅读数:104 评论数:0

跳转到新版页面

分类

数据库

正文

一、概述

mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志。下面将重点关注的是二进制日志(binlog)和事务日志(redo log和undo log)。

二、binlog

二进制日志是记录Mysql实例数据变更的一个组件,日志中包含了一系列变更数据的操作,例如变更表结构、删除数据、更改添加数据等DML、DDL。这些操作在binlog中统一称为事件(event)。

1、使用场景

(1)主从同步

binlog记录主库的数据变更,然后这些记录发送到从库,从库执行这些变更。

(2)数据恢复

2、组成

一个完整的binlog由两种文件组件:

(1)索引文件

索引文件用于跟踪多个binlog文件,例于主库创建新的binlog文件。

(2)日志文件

3、binlog写入时机

事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。

一个事务的binlog是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。

三、redolog

因为 Innodb 是以 页 为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了!
一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差!
因此 mysql 设计了 redo log , 具体来说就是只记录事务对数据页做了哪些修改,这样就能完美地解决性能问题了(相对而言文件更小并且是顺序IO)。

1、组成

(1)type: 该条redo日志的类型

(2)space ID:表空间ID

(3)page number: 页号

(4)data: 该条redo日志的具体内容

2、WAL

Write Ahead Logging,预写式日志是数据库系统提供原子性和持久化的一系列技术。

所有的修改先被写入到日志中,然后再被应用到系统状态中。

由于redo日志小,且是顺序写入磁盘的,所以在事务提交时只刷新redo日志到数据更优。

3、redolog和binlog的区别

(1)binlog只在事务提交完成后进行一次写入,而redo log是在事务进行中不断地被写入。

(2)binlog可以作为恢复数据使用,主从复制; redolog作为异常宕机或介质故障后的数据恢复使用。redo log只会记录未刷新到磁盘的数据。

(3)不管使用哪种存储引擎,都会有binlog,而不一定要有redolog。

四、undolog

原子性是通过undolog实现,undolog也是mvcc(版本控制)实现的关键。

 




相关推荐

一、explain explain能解释mysql如何处理SQL语句,表的加载顺序,表是如何连接,以及索引使用情况。是SQL优化的重要工具 1、explain table   上面语句的输出结果非常

Centos7的yum源中没有mysql,为了解决这个问题,我们需要先下载mysql的repo源。 一、下载mysql的repo源并安装 wget http://repo.mysql.com/mysq

备份的类型 1、根据是否需要数据库离线 (1)冷备: 需要关mysql服务,请写请求均不允许 (2)温备: 服务在线,但仅支持读请求。 <p

如果主库已经投入使用了,此时如果需要主从同步,需要导出所表结构和数据,然后导入到从库中。这时需要注意修改/var/lib/mysql/auto.cnf中uuid。 master配

一、事务的ACID 1、Atomicity原子性 Transactions are often composed of multiple statements. Atomicity guarantee

一、登录mysql mysql --version -查看Mysql版本 mysql -h hostname -u username -p -h:运行mysql服务器的机器,如果正在该机器上运行此命令

mysql的权限分为4级:全局、数据库、表、列。 1、grant grant privileges [

insert [into] table [(column1,column2,column3,...)] values (val

一、语法 select [optioins] items [into file_details] from tables [where conditions] [group by gr

一、语法 update [low_priority] [ignore] tablename set column1=expression1,... [where condition] [order b