#恢复

# 操作说明

  • 使用本方式执行恢复时,要求当前数据库实例处于NOMOUNT状态。
  • 执行恢复操作的数据库版本需与生成备份集的数据库版本完全一致。
  • 共享集群部署中,只能在主集群上执行恢复操作(即其角色必须为MASTER_ROLE,可查询视图V$INSTANCE的INSTANCE_ROLE字段可获得集群中每个实例的角色属性)。
  • 恢复命令仅SYS用户才可执行,恢复语法详细说明请参考开发手册RESTORE DATABASERECOVER DATABASE
  • 若已开启yasom仲裁选主,需先关闭仲裁选主再进行恢复操作,待恢复完成后再按需还原对应配置。

# 恢复

# 全量恢复

示例

-- 默认并发度为2,共享集群可指定YFS路径。
RESTORE DATABASE FROM '/YashanDB/backup/incr_1_20211209193740';

-- 指定并发度为6。
RESTORE DATABASE FROM '/YashanDB/backup/incr_1_20211209193740' PARALLELISM 6;
 
-- 成功恢复备份集后,若归档日志和在线日志连续且完整,YashanDB将自动应用所有日志,即全量恢复。
RECOVER DATABASE;

-- 打开数据库
ALTER DATABASE OPEN;

全量恢复属于完全恢复,成功后可以直接打开当前数据库,对于共享集群需要依次启动其他备集群(查看共享集群启停)。

恢复备份集的并发度默认设置为2,当备份集数据量大或希望提升恢复效率时,可增大并发度,并发度范围为[1-8]

如果备份集是加密生成的备份集,在恢复时还需要指定解密密码。

示例

-- 对加密的备份集恢复指定DECRYPTION关键字,并且密码与加密时一致
RESTORE DATABASE DECRYPTION yas2022 FROM '/YashanDB/backup/full_encryption';

# 基于tag增量备份集的连续恢复

在执行增量备份集恢复时需注意如下事项:

  • 假如零级增量备份指定tag为incr_0,普通一级增量备份指定tag为incr_1_1,incr_1_2... (按顺序发起备份):
    • 当指定tag为incr_1_2的一级增量备份恢复时,必须保证tag为incr_0的零级增量备份以及tag为incr_1_1的普通一级增量备份的备份文件保存目录存在且完整,否则将会触发 YAS-00313 错误。
  • 假如零级增量备份指定tag为incr_0,累积一级增量备份指定tag为incr_1_1,incr_1_2... (按顺序发起备份):
    • 当指定tag为incr_1_2的一级增量备份恢复时,必须保证tag为incr_0的零级增量备份的备份文件保存目录存在且完整,否则将会触发 YAS-00313 错误。
  • 假如零级增量备份指定tag为incr_0,累积一级增量备份指定tag为incr_1_1,普通一级增量备份指定tag为incr_1_2,累积一级增量备份指定tag为incr_1_3,普通一级增量备份指定tag为incr_1_4... (按顺序发起备份):
    • 当指定tag为incr_1_4的一级增量备份恢复时,必须保证tag为incr_0、incr_1_3的增量备份的备份文件保存目录存在且完整,否则将会触发 YAS-00313 错误。
    • 当指定tag为incr_1_3的一级增量备份恢复时,必须保证tag为incr_0的零级增量备份的备份文件保存目录存在且完整,否则将会触发 YAS-00313 错误。

Note

相比较原始的备份集恢复,基于tag的增量备份集恢复新增两个语法关键字:INCREMENTAL和NOREDO,INCREMENTAL可单独出现,NOREDO必须和INCREMENTAL成对出现。

  • INCREMENTAL:指定该关键字,恢复完成之后数据库处于nomount状态,若要拉起数据库,需要先将数据库拉起至mount状态,再执行recover、open。
  • NOREDO:指定该关键字,数据库处于不完整恢复,恢复完成之后数据库处于nomount状态,不恢复备份集中的redo和归档文件,该数据库不可拉起正常使用,若在最后一次恢复增量备份集后要拉起数据库正常使用,不可使用该参数。 如果连续增量备份集中包含slice文件,连续restore必须严格按照备份生成顺序restore,若未遵守该规则,可能导致slice文件丢失。 如果restore失败使用同一个备份集重复restore,可能会因为已存在slice文件导致restore失败,这种情况下只能通过手动清除对应slice文件后继续执行restore。

示例

基于tag的增量备份集恢复首次必须恢复LEVEL 0的备份集,指定NOREDO参数可加快恢复速度。

RESTORE DATABASE INCREMENTAL NOREDO FROM '/YashanDB/backup/incr_0_20211209193740';

Note

在此基线恢复成功的基础上,可连续恢复同一数据库的增量备份集。

RESTORE DATABASE INCREMENTAL FROM '/YashanDB/backup/incr_1_20211209193740';

Note

最后一次恢复时不可指定NOREDO参数。

ALTER DATABASE MOUNT;

RECOVER DATABASE;
 
ALTER DATABASE OPEN;

Note

执行RECOVER DATABASE完成恢复后不可再执行增量备份集恢复。

# 指定时间点恢复

本功能只适用于单机部署的数据库恢复。

示例

RESTORE DATABASE FROM '/YashanDB/backup/incr_0_20211209193516';
 
--成功恢复备份集后,指定日志序号时间点进行恢复
RECOVER DATABASE UNTIL TIME TO_DATE('2021-12-09 19:35:55','yyyy-mm-dd hh24:mi:ss'); 

--可按SCN进行指定时间点恢复,"258477020237086720"为用户在数据库发生故障前记录下的SCN值
RECOVER DATABASE until SCN 258477020237086720;
 
--重置redo时间线并打开数据库
ALTER DATABASE OPEN RESETLOGS;

本示例执行指定时间点恢复,属于不完全恢复,成功后需重置redo时间线。

until time的时间格式可以为:

  • '2021-12-09 19:35:55':此格式需要与当前会话的DATE_FORMAT参数所指定格式匹配。
  • TO_DATE('2021-12-09 19:35:55','yyyy-mm-dd hh24:mi:ss'):使用TO_DATE函数转换。
  • TO_TIMESTAMP('2021-12-09 19:35:55','yyyy-mm-dd hh24:mi:ss'):使用TO_TIMESTAMP函数转换。

SCN值可通过动态视图获取:

SELECT CURRENT_SCN FROM V$DATABASE;

Note

当LSC表在备份集后生成了不可变数据文件时,在以下场景可能导致恢复后该LSC表存在数据不一致现象:

  • 数据库原来的不可变数据文件全部存在,但是使用老的时间点恢复,此时该LSC表会多出部分不可变数据文件。
  • 数据库原来的不可变数据文件被清理,使用基于时间点的恢复,LSC表可能丢失存储在不可变数据文件中的数据。

# 使用恢复场景

场景1:数据库无法启动

可能发生原因:

  • 控制文件损坏或丢失
  • 系统关键数据文件损坏或丢失
  • 在线日志文件损坏或丢失

恢复方式:

  • 建议采取全量恢复。

场景2:表误操作

可能发生原因:

  • delete或update误操作导致表数据被删除或修改
  • truncate导致表数据被清空
  • drop导致表被删除

恢复方式:

  • 若能及时发现误操作导致数据丢失,建议采取闪回的方式恢复表数据(参考UNDO_RETENTION/UNDO_FORCE_RETENTION具体含义)。

    • delete或update误操作,若undo被覆盖,则恢复不一定成功。闪回指令为:

      FLASHBACK TABLE {table_name} TO SCN {SCN};
      FLASHBACK TABLE {table_name} TO TIMESTAMP {TIMESTAMP};
      
    • truncate误操作,需确保回收站开启,回收站被覆盖,则恢复不一定成功。闪回指令为:

      FLASHBACK TABLE TO BEFORE TRUNCATE;
      
    • drop误操作,需确保回收站开启,回收站被覆盖,则恢复不一定成功。闪回指令为:

      FLASHBACK TABLE TO BEFORE DROP
      
  • 若无法使用闪回的方式恢复,建议采取指定时间点恢复,恢复到表误操作之前的时间点。

场景3:主备模式下,主库崩溃时备库自动提升为主库,搭建新备库

可能发生原因:

  • 主库操作系统崩溃
  • 数据库关键文件被误删除
  • 网络原因导致无法连接至主库

恢复方式:

  • 若数据量大,建议采用全量恢复的方式重建备库;否则可以采用build database方式重建备库。

场景4:数据迁移

可能发生原因:

  • 主库系统崩溃,需要进行异机恢复
  • 数据库克隆

恢复方式:

  • 全量恢复和指定时间点恢复都能完成数据库恢复,需按照具体要求选择恢复方式。

# 常见问题

  • 恢复到与备份集不同的数据库文件或日志文件路径(例如HA架构中的主备复制)时,需要先设置DB_FILE_NAME_CONVERT和REDO_FILE_NAME_CONVERT两个配置参数指定文件路径转换。

  • 单机部署中,若$YASDB_DATA/dbfiles目录下存在数据库文件,执行恢复将触发YAS-00311错误;共享集群部署中则要求+DG0目录(安装时默认的第一个磁盘组名称,调整为其他值时此处相应修改)下不存在数据库文件,否则将触发YAS-00311错误。

Note

$YASDB_DATA/archive为存储归档文件的默认目录,若要执行PITR恢复操作,需保留该目录下的归档文件,以保证PITR恢复操作正常恢复。若要执行全量恢复且仅恢复备份集中的内容,则需要清空归档目录下的文件,否则执行RECOVER操作可能回放残留归档文件中的数据,导致实际恢复出的数据与备份集中的不一致。