何处理数据恢复 数据丢失 面试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 协议》,转载必须注明作者和本文链接
推荐文章: