binlog 与 redo log 的区别

binlog 写入机制

我们知道 redo log 的写入机制是事务中有更新操作时就会将更新操作记录在 redo log buffer 中,在事务提交时,根据相关参数的设定,按照不同逻辑持久化到磁盘文件。由于多个事务共用一个 redo log buffer,当有其他并行事务提交时,未提交的事物的 redo log 也会被持久化到磁盘。这个时候,崩溃恢复时因为两阶段提交的机制不会导致未提交事务数据被恢复。

binlog 区别于 redo log,每个事务所在的线程都会存在一个 binlog cache,并且只有事务提交时会持久化到磁盘文件(binlog file)。注意磁盘文件是共用的,只有 binlog cache 是单个线程一个。具体流程是事务执行过程中先把日志写到 binlog cache 中,在事务提交的时候持久化到磁盘文件。

由于一个事务的 binlog 是不能被拆开的,因此不论这个事务多大,也要确保一次性写入,这就涉及到了binlog cache保存这个事务binlog 的能力

参数 binlog_cache_size 用于控制单个线程的 binlog cache 大小,当一个事务的 binlog 数据超过了设定的大小,则需要暂存到磁盘,等事务提交的时候,再把 binlog cache 中的完整的事务持久化到磁盘。

与 redo log buffer 持久化到磁盘一样,binlog cache 也可以设置持久化到磁盘的操作,即可以延迟写。

binlog 与 redo log 的基本区别

  1. 这两者使用方式不一样
    binlog 会记录表所有更改操作,包括更新删除数据,更改表结构等等,主要用于人工恢复数据,而 redo log 对于我们是不可见的,它是 InnoDB 用于保证 crash-safe 能力的,也就是在事务提交后MySQL崩溃的话,可以保证事务的持久性,即事务提交后其更改是永久性的
    一句话概括:binlog 是用作人工恢复数据,redo log 是 MySQL 自己使用,用于保证在数据库崩溃时的事务持久性。
  2. redo log 是 InnoDB 引擎特有的,binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  3. redo log 文件是固定大小的,是循环写的,写满了会从头继续写,而 binlog 是追加写的,写满了再新建文件接着写。

binlog 和 redo log 记录格式的区别

binlog 格式

binlog有三种格式:Statement、Row 以及 Mixed。从安全性来看,ROW(最安全)、MIXED(不推荐)、STATEMENT(不推荐)。

  1. 基于SQL语句的复制(statement-based replication,SBR), 每一条会修改数据的sql都会记录在binlog中。
  2. 基于行的复制(row-based replication,RBR), binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。
  3. 混合模式复制(mixed-based replication,MBR)。Statement与Row的结合。
redo log 格式

redo log 是物理日志,记录的是在某个表做了什么修改,用于 MySQL 异常重启时数据恢复,所以恢复速度比 bin log 更快。

与性能相关的参数

binlog 参数
  1. 参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。
  2. 事务提交的时候,binlog cache write 到文件系统的 page catche 中,在合适的机会进行fsync,将数据持久化到磁盘中。write 阶段,指的就是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快。fsync 阶段,是将数据持久化到磁盘的操作。一般情况下,我们认为 fsync 才占磁盘的 IOPS。write 和 fsync 的时机,是由参数 sync_binlog 控制的。
sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync;
sync_binlog=1 的时候,表示每次提交事务都会执行 fsync;
sync_binlog=N(N>1) 的时候,表示每次提交事务都 write,但累积 N 个事务后才 fsync。
  1. 参数binlog_cache_size,用于控制每个线程 binlog cache 的大小

将 sync_binlog 设置为一个比较大的数,可以有效提升性能,但是同时会带来一个问题,主机发生异常重启会丢失一部分 binlog 数据。通常设置为 100~1000。

redo log 参数
  1. 参数innodb_flush_log_at_trx_commit
    用于控制 redo log 的写入策略,写入 redo log buffer 和文件系统缓冲区速度很快,但是数据写入磁盘会比较慢。
0:表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ;
1:表示每次事务提交时都将 redo log 直接持久化到磁盘;
2:表示每次事务提交时都只是把 redo log 写到 page cache。
  1. 参数innodb_log_file_size
    用于调整 redo log 单个文件的大小
  2. 参数innodb_log_files_in_group
    用于调整 redo log 文件数量
  3. 参数innodb_log_buffer_size
    用于调整 redo log buffer 的大小
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值