作业1:如果只用redo log或只用bin log可以行吗?
当然不可行。
假设1:如果只有binlog,那么MySQL的执行逻辑将变成:数据更新到内存---写binlog---提交事务. 这种情况下,如果写完binlog之后MySQL发生了crash,那么内存中的数据页是无法修复的,由于MySQL采用的是WAL技术,也就是先写内存日志再写磁盘,而binlog是没有能力恢复损坏的内存数据页的。
假设2:如果只有redo log,那么因为redo log是循环写的,也就没有办法保留很长的周期,失去了binlog归档变更操作的功能。再者主从复制的结构可能会更脆弱,高可用架构也就更不行了。
redo log 作用:保证事务的一致性和持久性,写缓存、快速提交,崩溃恢复前滚。
bin log 作用:二进制日志文件,用于记录mysql的数据更新或者潜在更新(比如DELETE语句执行删除而实际并没有符合条件的数据),在mysql主从复制中就是依靠的binlog。
redo log 和 bin log 的区别:
-
redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
-
redo log是物理日志,记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1 ”。
-
redo log是循环写的,空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
作业2:redo log的crash-safe、writepos 、checkpoint 介绍,为什么redo log具有crash-safe的能力,是binlog 无法替代的?
crash safe 定义