mysql日志
mysql的日志大体上需要了解的有三种
binlog,redo log,undolog
binlog
我们知道binlog在mysql中扮演的角色其实是类似备份一样的模块,并且它备份的方式是 逻辑备份
逻辑备份 : 只需要保存下系统操作的指令 而不是物理磁盘地址
刷盘时机
由于binlog文件时存储在磁盘中的,因此就需要定制刷盘的策略 大体上分为0~n
0 设置为0表示刷盘的时机由cpu决定
- 1 设置为1表示每一次commit就会刷盘
-
保存策略
保存逻辑存储也是分为不同的方式
statment level
这一种方式同步表示每一次sql语句都会同步到文件中
优点 : 这一种方式只需要保存比较少的日志就可以做到备份数据的效果
缺点 :某一些函数执行在主从可能造成超出预期的效果,不能到达主从一致的目标
- row
这一种方式表示只会保存每一行的上下文数据 也就是每一条数据的变化状态
优点:这一种方式不会出现无法复制的情况,可以正确备份函数和触发器
缺点: 由于需要记录每一行数据的变化情况,如果出现全表操作,那么产生的日志是非常大的
- mixed
这一种就是混合,默认使用tatment模式 当这一种模式保存不了,那么就使用raw模式
redo log
WAL 【预日志记录】
write-ahead logging 先写入日志在写入磁盘
每执行一条dml语句先写入redo log buffe 【日志缓存】后续某一个时间点在一次性将多个操作记录写入到redo log file【日志文件】
日志缓冲 : 存储在内存中的日志缓冲
日志文件 : 存储在磁盘中的日志文件
刷盘策略
- 0 【延迟写】 事务提交的时候不会讲redo log buffer 中日志写入到so buffer ,而是每一秒写入so buffer 斌且调用fsync() 写入到redo log file 中,也就是设置为0的时候 大约每秒写入到磁盘中的,当系统崩溃,也就只会丢失一秒的数据
- 1 【实时写,实时刷】 事务每一提交都会讲redo log buffer 中的日志写入os buffer 并且调用fsync() 刷盘到redo log file 中,这种方式即使系统崩溃也不会丢失任何数据,但是因为每次提交都写入磁盘,IO的性能较差。
- 2 【实时写,延迟刷】 每次提交写入到os buffer ,然后每秒提交fsync() 将os buffer 中的日志写入到redo log file
总结
redo log 是需要刷盘的,并且数据页也是需要刷盘,redo log 存在的意义就是降低对数据页刷盘的要求。
