何处理数据恢复 数据丢失 面试tx的架构师的岗位问的

mysql 对于数据恢复与数据丢失的处理:

  1. 存储引擎层面:innodb 存储主要是由 innodb_flush_log_at_trx_commit 参数控制事务写入数据到磁盘,不同值有不同的情况:
    0 :每秒 写入缓存与磁盘
    1 :每次 commit 都写入缓存与磁盘
    2 :每次 commit 都 写入缓存,然后根据 innodb_flush_log_at_timeout(默认为 1s)时间写入磁盘

  2. 主从复制:
    主从复制实现主要是依靠 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 协议》,转载必须注明作者和本文链接
有梦想的人睡不着,没有梦想的人睡不醒。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
文章
88
粉丝
23
喜欢
134
收藏
270
排名:227
访问:4.2 万
私信
所有博文
博客标签
展开
社区赞助商