何处理数据恢复 数据丢失 面试tx的架构师的岗位问的
mysql对于数据恢复与数据丢失的处理:
存储引擎层面:innodb存储主要是由innodb_flush_log_at_trx_commit参数控制事务写入数据到磁盘,不同值有不同的情况:
0 :每秒 写入缓存与磁盘
1 :每次commit都写入缓存与磁盘
2 :每次commit都 写入缓存,然后根据innodb_flush_log_at_timeout(默认为1s)时间写入磁盘主从复制:
主从复制实现主要是依靠binlog日志与中继日志,每次数据写入binlog日志是由参数sync_binlog所控制
= 0 :表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新0 :表示每sync_binlog次事务提交,MySQL调用文件系统的刷新操作将缓存刷下去
其中最安全的就是sync_binlog设置为1,表示每次事务提交,MySQL都会把binlog缓存刷下去,这样在掉电等情况下,系统才有可能丢失1个事务的数据。同时对系统的IO消耗也是非常大的。
注意:如果innodb_flush_log_at_trx_commit没有设置为1,仍会丢数据的。如果严格要求保证数据不丢失,必须设置redo log和binlog实时刷盘
binlog刷盘时机
对于InnoDB
存储引擎而言,只有在事务提交时才会记录biglog
,此时记录还在内存中,那么biglog
是什么时候刷到磁盘中的呢?mysql
通过sync_binlog
参数控制biglog
的刷盘时机,取值范围是0-N
:
- 0:不去强制要求,由系统自行判断何时写入磁盘;
- 1:每次
commit
的时候都要将binlog
写入磁盘; - N:每N个事务,才会将
binlog
写入磁盘。
从上面可以看出,sync_binlog
最安全的是设置是1
,这也是MySQL 5.7.7
之后版本的默认值。但是设置一个大一些的值可以提升数据库性能,因此实际情况下也可以将值适当调大,牺牲一定的一致性来获取更好的性能。
本作品采用《CC 协议》,转载必须注明作者和本文链接