MySQL中 binlog、redo log、undo log

  • redo log和binlog 区别

1、redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
2、redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c某字段加 1 ”。
3、redo log 是循环写的,空间固定会用完(一共4个文件,每个文件1G);binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志

  • undo主要用来回滚日志,用来做MVCC多版本并发控制
  • binlog 的写入机制

1、事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中
2、系统给 binlog cache 分配了一片内存,每个线程一个,参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘(tmp文件)
3、事务提交的时候,执行器把 binlog cache 里的完整事务写入到 binlog 中,并清空 binlog cache

write 和 fsync 的时机,是由参数 sync_binlog 控制的:
1、sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync;
2、sync_binlog=1 的时候,表示每次提交事务都会执行 fsync;
3、sync_binlog=N(N>1) 的时候,表示每次提交事务都 write,但累积 N 个事务后才 fsync

  • redo log 的写入机制

1、事务在执行过程中,生成的 redo log 是要先写到 redo log buffer 的

为了控制 redo log 的写入策略,InnoDB 提供了 innodb_flush_log_at_trx_commit 参数,它有三种可能取值:
1、设置为 0 的时候,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ;
2、设置为 1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘;
3、设置为 2 的时候,表示每次事务提交时都只是把 redo log 写到 page cache;

在什么时候会把线上生产库设置成“非双 1”
1、业务高峰期。一般如果有预知的高峰期,DBA 会有预案,把主库设置成“非双 1”。
2、备库延迟,为了让备库尽快赶上主库。
3、用备份恢复主库的副本,应用 binlog 的过程,这个跟上一种场景类似。
4、批量导入数据的时候。

  • binlog 存储格式

当 binlog_format=statement 时,binlog 里面记录的就是 SQL 语句的原文,这可能不安全,因为备库同步了主库的binlog,并执行里面的sql,会造成数据不一致的情况,比如执行delete用错索引导致误删数据
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值