数据库备份任务是一个从数据库文件中读取备份的过程,故天然不影响数据库读操作。对于DML、DDL操作,GBase 8a集群在没有事务日志的前提下是如何做到不阻塞业务的呢?
下面我们来介绍南大通用GBase 8a集群(gbase database)在线备份如何利用写时复制机制实现不阻塞DML、DDL的。
写时复制是指GBase 8a集群在进行DML、DDL操作前将要修改的表的元数据信息和操作后无法获取的数据内容(如drop clolumn、drop table、truncate table、drop partition)复制到一个临时目录下,并通知备份工具部分需要备份的文件路径发生改变。此时备份工具触发重试机制,将表放入重试清单,并在备份的最后进行这些表的备份重试,重试时从写时复制的文件中读取数据保证正确性。
以库级备份执行流程为例,如下图:
GBase 8a集群启动备份任务后,如果备份表有DML、DDL操作,就会触发写时复制功能。
·对于DML,当备份执行过程中执行DML操作时,监听子线程自动识别表发生DML操作并设置状态,启动表元数据及尾块数据的Copy形成一个副本用于备份读取。表DML操作不会受到影响。
注:在线备份执行时会自动将update操作转为delete+insert的快速更新模式,对于delete操作仅修改元数据中的delete位图,对于insert操作仅在尾块位置追加写入新增数据。所以,DML操作的在线备份写时复制的内容较小。
·对于DDL,在备份执行过程中执行DDL操作时,监听子线程自动识别表发生DDL操作并设置状态,按照DDL类型进行写时复制处理:
1、对于修改表元数据的DDL操作如修改表名称、压缩类型等,只需Copy表元数据即可;
2、对于增加列的DDL操作,因数据存储是向后兼容的,同样只需Copy表元数据即可,备份数据时忽略新增列;
3、对于删除列、删除表的DDL操作,GBase 8a采用将删除的列、表mv到临时目录方式,在备份完成后再执行最终的文件删除。
在完成库、表的备份后,通过监听子线程恢复表状态,并删除Copy的快照文件。