写在前面:(实在不知道为啥要弄这,我觉得自己没有实操过,即使有理解,应该也只是为了面试)
binlog
binlog是属于MySql Sever层面的,又称为归档日志,属于逻辑日志,是以二进制的形式记录的,用于记录数据库执行的写入性操作(不包括查询),依靠binlog没有crash_safe的能力,所以能这里就需要redolog了。
binlog的应用场景:
1.主从复制。
2.数据库恢复。
binlog日志格式
1.statement格式:基于sql语句的复制,每一条修改数据的sql会记录在binlog中。优点:不需要记录每一行的变化,节约了空间。缺点:有可能导致主从复制时,数据库不一致的问题,比如sql语句中有sysdata()函数。
2.row格式:不记录每条sql语句的上下文,仅记录哪条语句被修改了,优点:不会出现某些特定情况下的存储过程,调用和触发无法被正确处理的情况。缺点:会产生大量的日志。
3.mix模式:就是statement和row格式都有的情况。
redolog
redolog是innodb存储引擎层的日志,用于记录事务操作的变化,不管事务有没有提交,这些变化都会被记录下来,一个事务生成的redo日志是按顺序写入磁盘的,数据库掉电的时候,redolog就能恢复。
redolog包含两部分的内容:redolog buffer和redo log file。mysql每执行一条dml语句,都会先将记录写道redolog buffer中,然后写到redolog file中。先写日志再写磁盘。
redo log记录形式
redolog 日志大小是固定的,如果写满了,就从头开始,重新写。
redo log和bin log的区别
1.redo log是innodb引擎层实现的,bin log是mysql sever层实现的。
2.redo log记录的是物理日志,bin log记录的是逻辑日志。
3.redo log是循环写,写满了,就从头开始写,bin log是一直写,不用管大小。
4.redo log适用于崩溃恢复,bin log适用于主从复制和数据库恢复。