文章内容学习: 极客时间 - 林晓彬老师 - MySQL 实战 45 讲 整理而得
我们知道 MySQL 数据库在发生意外宕机的情况下, 可以将数据恢复到历史的某个时间点, 能实现这个功能依靠的是日志, MySQL 提供两种类型的日志, 也是两个模块中的日志, 分别是存储引擎中的日志 (redo log(重做日志)) 和 Server 层的日志(binlog(归档日志))
redo log
MySQL 在执行一条更新语句的时候, 需要更新内存中的数据, 然后在更新磁盘中的数据, 这里运用到了 WAL 技术, 全称是 Write-Ahead Logging 这里的关键点就是先写个更新日志, 然后把内存中的数据给更新, 等到系统有空闲时间了, 再更新磁盘上的数据
InnoDB 的 redo log 是物理日志, 记录了在某个数据页做了什么修改, 并且文件是固定大小, 可以配置一组为 4 个日志文件, 每个文件大小为 1G, 那么总计可以存储 4G 的日志. 因为日志大小是固定的, 所以存满了需要从第一个日志文件开始循环继续写. 有了 redo log InnoDB 就可以保证数据库发生异常宕机重启后, 之前提交的数据都不会丢失, 这个能力称之为 crash-safe
binlog
binlog 是 Server 的日志, 记录的是逻辑日志, 比如 "给 ID=2 的一行数据的 C 字段更新为 1", 并且日志是追加写入的, 文件到了指定大写会自动切割换到下一个文件, 不会覆盖以前的文件, 这一点不像 redo log.
用于调节日志的参数
innodb_flush_log_at_trx_commit 这个参数设置为 1, 表示每次事务的 redo log 日志都直接持久化到磁盘
sync_binlog 这个参数设置为 1, 表示每次事务 binlog 都持久化到磁盘
来源: http://www.bubuko.com/infodetail-3683698.html