记一次由Gbase备份造成的数据写入超时的问题

169 阅读2分钟

问题描述:

采用Gbase替代oracle后,数据落入Gbase中出现耗时过长的现象。原因定位在此时数据库正在备份,处于readonly的状态,阻塞了数据落表。

问题引申1:数据库备份时是否一定需要设为只读状态,事务型数据库如何做到热备?

以Mysql为例,分析数据备份的原理。
1)为了保证备份后数据库中所有的表都是同一个逻辑时间的数据,需要将数据库进行锁表,防止出现因数据增删改、表结构变化造成备份结果错误。
2)除了通过Flush tables with read lock (FTWRL)加锁外,Mysql表如果采用了InnoDB存储引擎,可以通过MVCC机制,开启快照读后,获取那个时间的一致的数据,无论需要备份多长时间,直到整个事务结束(commit)为止。从而可以避免通过加锁的方式保证备份数据的时间一致性。
**备份的基本流程如下:**
    0.flush tables,刷脏页,关闭表(避免现有长查询或大事务,引起无法关闭表,导致下面1步骤阻塞其他表)

    1.调用FTWRL(flush tables with read lock),将脏页刷新到磁盘并获得只读锁,全局禁止写;

    2.设置会话隔离级别为RR,开启快照读事务,获取此时的快照(仅对innodb表起作用)

    3.备份非innodb表数据(*.frm,*.myi,*.myd等)

    4.非innodb表备份完毕后,释放FTWRL锁

    5.逐一备份innodb表数据

    6.备份完成。

3)mysqldump
官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
4)事务的隔离性
隔离级别描述的就是事务所做变更的可见性。在实现上,每开启一个事务,MySQL 就会创建一个一致性视图(快照),事务内访问到的数据以视图的逻辑结果为准。
“读未提交” 隔离级别下,直接返回记录上的最新值,没有视图概念。
“读提交” 隔离级别下,视图是在每个查询 SQL 语句开始执行时创建的。
“可重复读” 隔离级别下,视图是在事务启动时创建的,整个事务执行期间都用这个视图。
“串行化” 隔离级别下,直接用加锁的方式来避免并行访问,不创建视图。

问题引申2:Gbase如何实现备份

由于Gbase 8a不支持事务,因此无法通过开启事务做到数据库的热备,只能通过只读的方式备份数据库。

参考:

https://blog.csdn.net/xiliunian/article/details/122418760
https://www.cnblogs.com/gered/p/10822654.html