2日志系统
binlog、redolog
redo log
InnoDB引擎特有的物理日志,固定容量,环形结构,会覆盖,记录数据页改动
WAL(Write-Ahead Logging)更新内存,先写日志,再刷盘
先跟新内存,记录redolog,等到空闲再刷盘(更新磁盘redolog和数据页)
redo log 保证数据库异常重启,之前的记录不会丢失(crash-safe)
write pos记录当前写入位置,check point 记录将擦除位置(之后的数据还未刷盘)
redo log buffer:事务提交前redo log记录在内存,事务提交时记录到文件
刷盘时机:redo log空间不足;内存不足;空闲时间;mysql正常关闭;
用途:崩溃恢复
设置为多个文件的好处:并发处理,扩展不需要修改单个文件
binlog
server层逻辑日志,不覆盖,记录sql语句或某行的修改
两种日志模式
- statement 记录sql语句
- row 记录行内容(两条,更新前和更新后)
用途:数据复制(主从复制),数据恢复(恢复到某时间节点)
更新语句执行流程
- 执行器从引擎获取id=1的行,引擎根据索引找到数据所在数据页,加载到内存,返回给执行器
- 执行器执行++操作,调用引擎写入接口
- 引擎将数据跟新到内存(若内存没有该数据,记录到change buffer),记录更新操作到redo log,此时redo log处于prepare状态。返回执行器执行完成了,可随时提交事务
- redo log写入
innodb_flush_log_at_trx_commit:0 每次事务提交 redo log 写入buffer
innodb_flush_log_at_trx_commit:1 每次事务提交 redo log 写入磁盘,prepare阶段就写入磁盘,commit不再fsync,只写入pagechache
innodb_flush_log_at_trx_commit:2 每次事务提交 redo log 写入page cache
- redo log写入
- 执行器生成binlog写入磁盘
sync_binlog:0 Filesystem决定同步时机或cache满后写入磁盘
sync_binlog:1 每次事务提交写(fsync)入磁盘
sync_binlog:大于1 多次事务提交后写(fsync)入磁盘 - 执行器调用引擎事务提交接口
- 引擎把redo log状态改为commit,更新完成。
- 空闲后将redo log flush到磁盘(数据页更新)
总结
两阶段提交保证redo log / bin log 一致性
redo log、bin log如何关联
XID 崩溃恢复的时候,会按顺序扫描redo log:
如果碰到既有prepare、又有commit的redo log,就直接提交;
如果碰到只有parepare、而没有commit的redo log,就拿着XID去binlog找对应的事务。
问题
一天一备份和一周已备份的优势?影响数据库系统什么指标?
一天已备份恢复需要应用一天的binlog,一周已备份则需要应用一周的binlog
对恢复时间敏感的系统需缩短备份时间
频发的全量备份成本:占用存储空间