mysql日志
sql执行顺序
日志
bin log
binlog存储对数据库所有操作行为的记录,主要用于mysql的主从同步和数据恢复
记录格式
1 | # 获取binlog有没有开启及日志文件存储的位置 |
对比
ROW(建议使用) | STANTEMENT | MIXED | |
---|---|---|---|
特点 | 记录对行的操作记录 | ||
如果一个update语句更新了10行数据则会存储该10行的操作记录, | 记录sql语句 | ROW和STANTMENT的混合体 | |
优点 | 因为是存储基于行的操作记录,所以不会导致主备不一致, | 只记录sql语句,相较ROW会更加的减少空间和避免大量的IO操作 | 减少空间和避免大量的IO操作。同时会判断当前的执行操作会不会导致主备不一致,如果会的话,就会使用ROW格式存储 |
缺点 | IO的操作/文件大小都会比其他俩中更多/更大 | 可能会导致主备不一致,且因为存储的时sql语句,所有当有慢sql时从库做备份时也会执行一次,导致备份时间过长 | 相当于其他俩种的折中,但也存在和STATEMENT一样主从备份不一致的问题 |
日志文件比ROW小,但准确性比ROW底; | |||
日志文件比STATEMENT较大,但准确性比STANRTEMENT高; |
redo log
只有当mysql的引擎是innodb时,才会存在,记录事务对数据的修改记录,保证了mysql事务的原子性和持久性
刷盘机制
属性:innodb_flush_log_at_trx_commit
1 | # 查看刷盘机制类型 |
对比
类型 | 0 | 1(默认) | 2 |
---|---|---|---|
机制 | 每次提交事务时不进行刷盘操作, | 每次提交事务时都会进行刷盘操作 | 每次提交事务时都只把redo log buffer内从写入page cache(文件系统缓存) |
缺点 | mysql挂了或者宕机会缺失1s的数据 | 只有事务没有完成且mysql宕机了才会缺失1s的数据 | 只有事务没有完成且mysql宕机了才会缺失1s的数据 |
备注 |
- 后台都会有一个后台线程,每个1s,都会把redo log buffer写到page cache中,然后调用fsyns刷盘,所以说机制为0也会刷盘
- 当redo log buffer占用的空间达到innodb_log_buffer_size一半时,后台也会主动刷盘
| | |
innodb_log_buffer_size =0

innodb_log_buffer_size =1

innodb_log_buffer_size =2

undolog
undo log有两个作用:提供回滚和多个行版本控制(MVCC)。
在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。
undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ting-个人博客!