《一张思维导图纵观MySQL数据安全体系》要点:
本文介绍了一张思维导图纵观MySQL数据安全体系,希望对您有用。如果有疑问,可以联系我们。
作者介绍 :
杨奇龙,前阿里数据库团队资深DBA,主要负责淘宝业务线,经历多次双十一,有海量业务访问DB架构设计经验.目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化、故障诊断、性能压测.
和团队内部的同事一起沟通,讨论了MySQL数据库系统数据安全性问题,主要针对MySQL丢数据 、主从不一致的场景 ,还有业务层面使用不得当导致主备库数据结构不一样的情况,本文是基于以上的讨论和总结做的思维导图.
(1)redo log
innodb_flush_log_at_timeout
< 5.6.6: 每隔一秒将redo log buffer中的数据刷新到磁盘
>= 5.6.6:每隔innodb_flush_log_at_timeout秒将数据刷新到磁盘中去
(2)binlog
sync_binlog =1
(3)innodb buffer data
不同的flush mathod刷数据的图形展示.图片来自hatemysql.com.
(4)InnoDB 落盘
MySQL数据落盘的路径,图片来自李春hatemysql.com.
常见的双写
(1)slave_skip_counter 不合理
slave_skip_counter =1
slave_skip_counter >1
(2)DB Crash,OS正常
innodb_flush_log_at_trx_commit=0
事务提交时,不刷新缓存,系统刷新的频率是1s,故会丢失1s的数据.
innodb_flush_log_at_trx_commit=1
事务提交时,会刷新到磁盘,保证事务落盘,故不丢数据.
innodb_flush_log_at_trx_commit=2
事务提交时,刷新到os cache,系统没有crash,数据无丢失.
(3)DB正常,OS Crash
带有 BBU
innodb_flush_log_at_trx_commit=0
事务提交时,不刷新缓存,系统刷新的频率是1s,故会丢失1s的数据.
innodb_flush_log_at_trx_commit=1
事务提交时,会刷新到磁盘,保证事务落盘,故不丢数据.
innodb_flush_log_at_trx_commit=2
事务提交时,刷新到os cache,系统没有crash,数据无丢失.
(4)slave非实时写redo和binlog丢失数据
在slave机器上会存在三个文件来保证事件的正确重放:relay log、 relay log info、 master info.
(5)异步模式
(6)semi sysnc
after_commit
比如主库操作update t1 set val=1 where id=10将val从5修改为1 .
分析:
after_sync
比如主库操作update t1 set val=1 where id=10将val从5修改为1.
分析:
知识点:两阶段提交
第一阶段是先prepare、再同步写redo log,第二阶段同步写binlog、再commit,如果在写入commit标志时崩溃,则恢复时,会重新对commit标志进行写入.
HA切换
(6)主从
binlog_format
ROW(最安全)
MIXED(不推荐)
STATEMENT(不推荐)
sync_binlog
=0:由os系统的刷新机制来控制,刷新数据到磁盘的频率
=1:每次commit刷新到磁盘
>1:每N次提交刷新到磁盘
innodb_support_xa
版本要打开,保证binlog提交的顺序,否则乱序的binlog在恢复或者slave应用的时候会有问题,及以后废弃,始终支持两阶段提交.
crash safe
crash-safe就是将relay-info.log的信息保存在InnoDB的事务表中,这时执行relay log中的事务和写relay info在一个事务中,就能得到原子性保证.从而避免已执行的binlog位点和写入relay log info的位点信息不一致的情况发生.
IO thread
master-info-repository=TABLE
sync_master_info=N:每N个event刷新一次表
SQL thread
relay-log-info-repository=TABLE
sync_relay_info=N:每N个event刷新一次表
relay-log-recovery
当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性.
relay_log_info_repository = TABLE
relay_log_recovery = 1
http://mysqlserverteam.com/relay-log-recovery-when-sql-threads-position-is-unavailable/
semi_sync
GTID
相比位点复制,能减少不一致的概率
参考资料
- MySQL数据丢失讨论http://hatemysql.com/?p=395
- 细看InnoDB数据落盘http://hatemysql.com/?p=503
- MySQL5.7 深度解析:Loss-Less半同步复制技术
- MySQL 5.7 Replication相关新功能说明
原文来自微信公众号:DBAplus社群
转载请注明本页网址:
http://www.vephp.com/jiaocheng/2370.html