mysql 是日志先行的原则,在操作一条数据的时候,就会把旧数据插入undolog
在事务提交的时候,会把最新的数据保存在redolog表中
如下为:logbuffer刷盘的机制
在事务提交之后,如果开启了binlog,则会把sql或者数据的前后变化保存在binlog中
undo.log和redo.log保证了数据的一致性,保证了数据库的安全
持久性:持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何数据库系统故障。持久性通过数据库备份和恢复来保证。
mysql中innodb_flush_log_at_trx_commit默认设置的是1,即最安全的设置
当设置为0的时候,mysql宕机会丢失前一秒的数据
当设置为1的时候,操作系统宕机,会丢失掉缓冲区的数据
再来看另外一个参数sync_binlog :
sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。
sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
mysql 8.0已经默认是1了, 当mysql宕机了,此时正好有一个事务没有提交,但是此时最新数据已经刷到redo表了,还没及时把sql信息刷到binlog日志,可能会造成短暂的binlog日志和表数据不一致的情况,当重启启动数据回滚之后,变成正常了
所以:innodb_flush_log_at_trx_commit =1 和sync_binlog = 1是数据库最安全的设置,当然业务数据库主要还是要保证数据的一致性,如果准求性能的话,可以把innodb_flush_log_at_trx_commit =2 和sync_binlog = 500/1000 ,但是这样风险挺大的
当innodb_flush_log_at_trx_commit =1 和sync_binlog = 1设置的时候,三个日志插入的顺序