13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

一张思维导图纵观MySQL数据安全体系

简介

成都创新互联主营宝兴网站建设的网络公司,主营网站建设方案,成都app软件开发公司,宝兴h5微信平台小程序开发搭建,宝兴网站营销推广欢迎宝兴等地区企业咨询

和团队内部的同事一起沟通,讨论了MySQL数据库系统数据安全性问题,主要针对MySQL丢数据 、主从不一致的场景 ,还有业务层面使用不得当导致主备库数据结构不一样的情况,本文是基于以上的讨论和总结做的思维导图。

思维导图

内容展示

OS

单机

(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刷数据的图形展示。

(4)InnoDB 落盘

MySQL数据落盘的路径。

主从不一致

业务架构

常见的双写

“丢”数据的场景

(1)slave_skip_counter 不合理

 
 
 
 
  1. slave_skip_counter =1
  2. slave_skip_counter >1

(2)DB Crash,OS正常

 
 
 
 
  1. innodb_flush_log_at_trx_commit=0

事务提交时,不刷新缓存,系统刷新的频率是1s,故会丢失1s的数据。

 
 
 
 
  1. innodb_flush_log_at_trx_commit=1

事务提交时,会刷新到磁盘,保证事务落盘,故不丢数据。

 
 
 
 
  1. innodb_flush_log_at_trx_commit=2

事务提交时,刷新到os cache,系统没有crash,数据无丢失。

(3)DB正常,OS Crash

带有 BBU

 
 
 
 
  1. innodb_flush_log_at_trx_commit=0

事务提交时,不刷新缓存,系统刷新的频率是1s,故会丢失1s的数据。

 
 
 
 
  1. innodb_flush_log_at_trx_commit=1

事务提交时,会刷新到磁盘,保证事务落盘,故不丢数据。

 
 
 
 
  1. innodb_flush_log_at_trx_commit=2

事务提交时,刷新到os cache,系统没有crash,数据无丢失。

(4)slave非实时写redo和binlog丢失数据

在slave机器上会存在三个文件来保证事件的正确重放:relay log、 relay log info、 master info。

(5)异步模式

事务T1写入binlog buffer;

dumper线程通知slave有新的事务T1;

binlog buffer进行checkpoint;

slave因为网络不稳定,一直没有收到t1;master挂掉,slave提升为新的master,t1丢失。

(6)semi sysnc

after_commit

比如主库操作update t1 set val=1 where id=10将val从5修改为1 。

  1. 会话session1在主库提交update t1 set val=1 where id=10 ;commit;
  2. 主库根据二阶段提交将数据持久化到innodb和提交日志binlog;
  3. 同步日志到slave ,并等待slave 返回ack信息,等待的实际时间以 rpl_semi_sync_master_timeout 为准,超过该设置时间则超时,主库返回给客户端成功写入信息。
  4. 接收到来自slave的ack信息,返回成功给OK客户端。

分析:

after_sync

比如主库操作update t1 set val=1 where id=10将val从5修改为1。

  1. 会话session1在主库提交 :update t1 set val=1 where id=10;commit;
  2. 主库将事务写入binlog。
  3. 将binlog同步给slave,不提交。
  4. 等待slave返回ack信息,等待的实际时间以rpl_semi_sync_master_timeout为准,如果超时master改为异步模式。
  5. 接收到来自slave的ack信息,主库进行提交并且返回成功给OK客户端。

分析:

知识点:两阶段提交

***阶段是先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://cdbrznjsb.com/article/cdghigg.html

其他资讯

让你的专属顾问为你服务