备份和恢复功能是数据库可靠性的重要保证。基于时间点的恢复能力提供了更加灵活快捷的恢复方式,使用户能够在发现故障或错误操作后,根据业务需求尽快地恢复至过去某一指定的一致性时间点,以减小损失。在一致性时间点内,集群中的所有复制组保证全局事务完全一致。用户执行时间点恢复时,在指定一致性时间点后提交的事务将被回滚。用户也可以使用某个数据备份,重新创建一套包含特定数据的环境,用于开发测试。
集群在使用 sdbrestore 恢复后重启,将自动开启恢复模式,以进行时间点恢复。开启恢复模式的集群将会阻止数据访问,特殊情况下如果不需要进行全局一致性恢复,用户可通过 restoreAbort() 中止恢复模式。此时数据库将可以提供对外服务,但不保证各数据组中数据的全局一致性。
时间点恢复功能可进行离线恢复和在线恢复:
Note:
使用时间点恢复的集群必须支持全局一致性,且所有的备份操作须在全局一致性属性为开启的状态下执行。而集群的全局一致性,需要同时将所有节点的配置参数 globtranson 和 mvccon 设置为 true。
对所有编目复制组和数据复制组进行全量备份
> db.backup({Name:'backupAll'})
在数据库对外提供服务的同时,定期执行同名增量备份
> db.backup({Name:'backupAll', EnsureInc: true})
停止集群
$ sdbstop
恢复所有的编目复制组和数据复制组,如下以编目节点 11820 和数据节点 11830 为例:
$ sdbrestore -b -1 -p /opt/sequoiadb/database/catalog/11820/bakfile/ -n backupAll $ sdbrestore -b -1 -p /opt/sequoiadb/database/data/11830/bakfile/ -n backupAll
重启集群
$ sdbstart
检查是否存在一致性时间点
> db.restoreCheck({Time: 0})
Note:
restoreCheck() 用于检查指定时间点是否为一致性时间点,也可以用于获取当前最新的一致性时间点。
恢复至最新的一致性时间点
> db.restoreToTime({Time: 0})
Note:
restoreToTime() 用于将集群恢复至指定的一致性时间点。
无需关闭数据库,直接启用恢复模式
> db.restorePrepare()
Note:
restorePrepare() 用于开启集群的恢复模式,以进行时间点恢复。
检查指定时间点是否为可恢复的一致性时间点
> db.restoreCheck({Time: Timestamp("2021-01-01T00:00:00+08:00")});
还原至指定时间点
> db.restoreToTime({Time: Timestamp("2021-01-01T00:00:00+08:00")})
SequoiaDB 巨杉数据库中,部分操作会修改数据组中的数据,但属于非事务性的操作,因此在时间点恢复中被认为是不可逆操作。时间点恢复功能的实现基于全局一致性时间,SequoiaDB 使用时间序列协议为分布式事务分配全局时间。由于非事务操作没有全局时间,不能按照时间点进行回滚,并且会切断有效的一致性时间窗口,导致无法恢复至非事务操作前的一致性时间点。因此,建议用户避免在事务操作中混用非事务性操作,并在执行非事务性操作之前对数据进行备份。
SequoiaDB 包含的非事务性操作如下: