1.如果只用redolog或者只用binlog可行吗
不可行
redo log称为重做日志,用于记录事务的变化,记录的是数据被修改之后的值。InnoDB采用redo log来保证事务更新的一致性和持久性。
在MySQL中,如果你要更新一条语句,需要带更新条件,比如update T set name = ‘god-jiang’ where id=6,一般都是先查询到id=6的语句,然后再进行更新操作。具体操作:当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log中,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候(系统空闲时),将这个操作记录更新到磁盘中,这个更新往往是在系统比较空闲的时候。
binlog主要用来进行POINT-IN-TIME(PIT)的恢复及主从复制环境的建立。从表面上看它和redo log非常相似,都是记录了对于数据库操作的日志,但是从本质上看,还是有着非常大的不同。
redo log和binlog的区别:
首先,redo log是在InnoDB存储引擎层产生,而binlog是在数据库上层产生的,并且binlog不仅仅针对InnoDB存储引擎,MySQL数据库中任何存储引擎都会产生binlog
其次,两种日志的内容记录不同。binlog是一种逻辑日志,其记录的是对应的SQL语句,而redo log是一种物理日志,其对应的是对于每个页的修改
最后,两种日志写入磁盘的时间点不同,binlog只在事务提交完成后进行一次写入,而redo log在事务进行中不断的写入,表现为不是随事务提交的顺序写入
binlog一般作为恢复数据使用,主从复制搭建,而redo log通常作为MySQL异常宕机或者介质故障后的数据恢复使用
redo log可以保存crash-safe能力,可以保证MySQL异常重启数据不丢失
binlog可以记录对应的SQL语句,也可以保证MySQL异常重启数据不丢失
2.为什么 redo log 具有 crash-safe 的能力,是 binlog 无法替代的
redo log :一个固定大小,“循环写”的日志文件,记录的是物理日志——“在某个数据页上做了某个修改”。
binlog :一个无限大小,“追加写”的日志文件,记录的是逻辑日志——“给 ID=2 这一行的 c 字段加1”。
redo log 和 binlog 有一个很大的区别就是,一个是循环写,一个是追加写。也就是说 redo log 只会记录未刷盘的日志,已经刷入磁盘的数据都会从 redo log 这个有限大小的日志文件里删除。binlog 是追加日志,保存的是全量的日志。
当数据库 crash 后,想要恢复未刷盘但已经写入 redo log 和 binlog 的数据到内存时,binlog 是无法恢复的。