Oracle 19c RECOVER TABLE 恢复误删除数据
Oracle 19c RMAN 单表恢复RECOVER TABLE1 概述Oracle 19c 支持使用 RMAN 备份直接进行单表/单分区恢复可恢复被删除Drop或截断的表数据。这种恢复方式相当于“傻瓜版”将原本需要手动执行的复杂操作集合起来自动完成。可以从 RMAN 备份中将一个特定的表或分区恢复到某个时间点、SCN 或归档序列号并且可以使用REMAP选项将表恢复为一个新表或者分区中也可以恢复到其他用户中使用NOTABLEIMPORT只生成 expdp 格式的 dump 文件后续再进行恢复2 RMAN 内部执行步骤RECOVER TABLE 本质是自动化执行 TSPITR表空间时间点恢复RMAN 会自动执行以下 8 个步骤步骤说明1. 判断备份判断哪些备份包含需要恢复的表或表分区2. 检查空间判断主机是否有足够空间创建 auxiliary instance3. 创建辅助实例创建 auxiliary database 并恢复表到辅助实例4. 导出 dump在辅助实例中使用 DataPump 导出表数据5.可选导入将 dump 文件导入到目标实例6.可选重命名在目标数据库中重命名恢复的表或分区7. 清理自动关闭并删除辅助实例8. 清理文件清理所有临时文件内部流程详解1. 判断备份 ↓ 判断哪些备份包含需要恢复的表或表分区 根据指定的时间点确定可用的备份集 2. 检查空间 ↓ 判断目标主机是否有足够空间创建 auxiliary instance 空间不足则报错并退出 3. 创建辅助实例 ↓ 根据源库参数文件1:1 clone创建辅助实例 SID 由系统自动生成如 wtrc 还原控制文件和数据文件 应用归档日志到指定时间点 4. 打开辅助实例只读 ↓ 以 RESETLOGS 方式打开辅助实例 此时可以查询误删表的数据 5. DataPump 导出 ↓ 在辅助实例中执行 expdp 导出误删表 生成 dump 文件到 AUXILIARY DESTINATION 6. 可选DataPump 导入 ↓ 在生产库中执行 impdp 导入数据 自动创建表并插入数据 7. 可选重命名 ↓ 如果使用 REMAP重命名表 8. 清理 ↓ 自动关闭并删除辅助实例 清理所有临时文件和目录⚠️注意由于步骤 3 需要创建辅助实例1:1 clone 源库参数对主机物理资源要求很高资源不足会执行失败。3 语法2.1 非PDB模式CDBRECOVERTABLEschema.table_name UNTILTIMEto_date(2026-04-13 16:38:00,yyyy-mm-dd hh24:mi:ss)AUXILIARY DESTINATION/backup/tablerecovery;2.2 PDB模式RECOVERTABLEschema.table_nameOFPLUGGABLEDATABASEpdb_name UNTILTIMEto_date(2026-04-13 16:38:00,yyyy-mm-dd hh24:mi:ss)AUXILIARY DESTINATION/backup/tablerecovery;2.3 常用参数参数说明OF PLUGGABLE DATABASE指定PDB名称PDB模式必选UNTIL TIME恢复到指定时间点UNTIL SCN恢复到指定SCNUNTIL LOGSEQ恢复到指定日志序列号AUXILIARY DESTINATION辅助实例数据文件存放目录DATAPUMP DESTINATION数据泵导出文件存放目录可选REMAP TABLE恢复到新表如schema.table:schema.new_tableNOTABLEIMPORT只生成dump文件不导入目标库2.4 适用场景RMAN 单表恢复适用于以下场景场景说明小表恢复恢复单张或某几张表但 Restore Database 代价太高逻辑损坏恢复恢复有逻辑损坏或被误删除的表Undo 覆盖Flashback Table 不可用Undo 数据已覆盖DDL 操作后恢复Flashback Table 不支持的结构变更后回退如 TRUNCATE2.5 限制条件⚠️以下情况无法使用 RECOVER TABLE限制说明SYS 用户表SYS 用户下的表或分区无法恢复系统表空间存储于 SYSAUX 和 SYSTEM 表空间的表无法恢复Standby 库备库上不能进行恢复NOT NULL 约束使用 REMAP 时有 NOT NULL 约束的表无法恢复读写模式目标数据库必须置于读写模式归档模式目标数据库必须置于归档模式兼容性恢复单表分区需要 COMPATIBLE 11.1.02.6 时间点指定方式-- 方式1SCN号RECOVERTABLETEST.TEXTUNTIL SCN1234567AUXILIARY DESTINATION/backup;-- 方式2日志序列号RECOVERTABLETEST.TEXTUNTIL LOGSEQ100AUXILIARY DESTINATION/backup;-- 方式3时间推荐RECOVERTABLETEST.TEXTUNTILTIMEto_date(2026-04-13 16:38:00,yyyy-mm-dd hh24:mi:ss)AUXILIARY DESTINATION/backup;-- 方式4相对时间RECOVERTABLETEST.TEXTUNTILTIMESYSDATE-7AUXILIARY DESTINATION/backup;3 工作原理3.1 内存要求⚠️关键辅助实例启动时会读取源库的参数文件进行1:1 clone需要加载与主库相同的SGA_MAX_SIZE。如果SGA_MAX_SIZE * 2 物理内存则执行命令会失败项目说明主数据库 SGAsga_max_size占用内存辅助实例 SGA1:1 clone 源库参数也需要 sga_max_size所需内存主库 sga_max_size 辅助实例 sga_max_size 物理内存3.2 当前环境分析物理内存8.6GB 主库 sga_max_size5328MB 辅助实例 sga_max_size5328MB1:1 clone 总计需求10656MB 8.6GB ❌3.3 报错分析RMAN-04014: startup failed: ORA-27125: unable to create shared memory segment Linux-x86_64 Error: 28: No space left on device原因物理内存不足辅助实例需要与主库相同的 sga_max_size1:1 clone导致总内存需求超过物理内存。解决方案减小主库 sga_max_size 后重启使用 NOTABLEIMPORT不启动辅助实例使用闪回查询3.4 解决方案减小 sga_max_size查看源库参数文件SQLSHOWPARAMETER sga_max_size;SQLSHOWPARAMETER sga_target;辅助实例会1:1 clone源库的参数文件因此需要同时加载两个相同大小的 SGA。-- 减小 sga_max_size需要重启数据库生效ALTERSYSTEMSETsga_max_size2048M SCOPESPFILE;ALTERSYSTEMSETsga_target2048M SCOPESPFILE;重启数据库后sga_max_size 将降至 2GB辅助实例有足够内存启动2GB 2GB 4GB 8.6GB。3.5 备份要求⚠️必须存在以下备份备份类型说明完整数据库备份至少要有 SYSTEM、UNDO、SYSAUX 表空间备份表空间相关备份包含需要恢复的表的表空间备份PDB 模式额外要求需要备份 Root Container 的 SYSTEM、SYSAUX、UNDO以及 PDB 的相关表空间3.6 磁盘空间要求目录空间要求AUXILIARY DESTINATION需要存放辅助实例数据文件约 2-3 倍表大小DATAPUMP DESTINATION需要存放数据泵导出文件约表大小4 操作步骤4.1 预处理检查清单确认物理内存充足SGA × 2 物理内存创建辅助实例目录并授权确认 RMAN 备份有效确定正确的恢复时间点确认需要恢复的表名和所属用户PDB模式需指定PDB4.2 创建辅助目录# 以 root 用户执行mkdir-p/backup/tablerecoverychownoracle:oinstall /backup/tablerecoverychmod755/backup/tablerecovery4.3 检查备份可用性# 连接 RMANrman target /# 查看备份LIST BACKUP OF DATABASE;LIST ARCHIVELOG ALL;4.4 确认删除时间点-- 使用闪回查询确认表删除前的时间SELECT*FROMschema.table_nameASOFTIMESTAMPTO_TIMESTAMP(2026-04-13 16:35:00,yyyy-mm-dd hh24:mi:ss);4.5 执行恢复恢复到原表RMANRECOVERTABLETEST.TEXTUNTILTIMEto_date(2026-04-13 16:38:00,yyyy-mm-dd hh24:mi:ss)AUXILIARY DESTINATION/u01/app/oracle/aux_instance;PDB模式恢复到原表RMANRECOVERTABLELUCIFER.LUCIFEROFPLUGGABLEDATABASElucifer UNTILTIMEto_date(2022-02-10 16:12:00,yyyy-mm-dd hh24:mi:ss)AUXILIARY DESTINATION/backup/tablerecovery/;恢复到新表REMAPRMANRECOVERTABLETEST.TEXTUNTILTIMEto_date(2026-04-13 16:38:00,yyyy-mm-dd hh24:mi:ss)REMAPTABLETEST.TEXT:TEST.TEXT_BAKAUXILIARY DESTINATION/u01/app/oracle/aux_instance;4.6 验证恢复结果-- 查询恢复后的表SELECTCOUNT(*)FROMTEST.TEXT;-- 如果使用了REMAP检查新表SELECT*FROMTEST.TEXT_BAK;5 成功案例日志5.1 PDB模式恢复日志RMAN RECOVER TABLE lucifer.lucifer OF PLUGGABLE DATABASE lucifer UNTIL TIME to_date(2022-02-10 16:12:00,yyyy-mm-dd hh24:mi:ss) AUXILIARY DESTINATION /backup/tablereovery/; Starting recover at 10-FEB-22 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID1588 device typeDISK RMAN-05026: warning: presuming following set of tablespaces applies to specified point-in-time List of tablespaces expected to have UNDO segments Tablespace SYSTEM Tablespace LUCIFER:SYSTEM Tablespace UNDOTBS1 Tablespace LUCIFER:UNDOTBS1 Creating automatic instance, with SIDwtrc initialization parameters used for automatic instance: db_nameORCL db_unique_namewtrc_pitr_lucifer_ORCL compatible19.0.0 db_block_size8192 db_files200 diagnostic_dest/u01/app/oracle _system_trig_enabledFALSE sga_target2048M processes200 db_create_file_dest/backup/tablereovery/ log_archive_dest_1location/backup/tablereovery/ enable_pluggable_databasetrue _clone_one_pdb_recoverytrue #No auxiliary parameter file used starting up automatic instance ORCL Oracle instance started Total System Global Area 2147482136 bytes Fixed Size 9136664 bytes Variable Size 486539264 bytes Database Buffers 1644167168 bytes Redo Buffers 7639040 bytes Automatic instance created5.2 数据导出和导入Performing export of tables... EXPDP Starting SYS.TSPITR_EXP_wtrc_isse: EXPDP Processing object type TABLE_EXPORT/TABLE/TABLE_DATA EXPDP . . exported LUCIFER.LUCIFER 5.515 KB 3 rows EXPDP Dump file set for SYS.TSPITR_EXP_wtrc_isse is: EXPDP /backup/tablereovery/tspitr_wtrc_94954.dmp EXPDP Job SYS.TSPITR_EXP_wtrc_isse successfully completed Performing import of tables... IMPDP Starting SYS.TSPITR_IMP_wtrc_mvyj: IMPDP Processing object type TABLE_EXPORT/TABLE/TABLE IMPDP . . imported LUCIFER.LUCIFER 5.515 KB 3 rows IMPDP Job SYS.TSPITR_IMP_wtrc_mvyj successfully completed Removing automatic instance Automatic instance removed Finished recover at 10-FEB-226 常见错误错误原因解决方案ORA-27125 共享内存sga_max_size × 2 物理内存减小 sga_max_sizeRMAN-05001 文件冲突auxiliary file 与目标库文件冲突指定不同的 AUXILIARY DESTINATIONRMAN-05002 aborting TSPITR辅助实例文件冲突使用独立的辅助实例目录ORA-19913 无法恢复时间点无效指定更早的时间点ORA-38788表不支持闪回RMAN 自动处理无需开启RMAN-05026需要 UNDO确保 SYSTEM 和 UNDO 表空间在线RMAN-05093辅助实例启动失败检查内存、目录权限、内核参数7 备选方案7.1 使用 NOTABLEIMPORT只导出 dump不导入RECOVERTABLETEST.TEXTUNTILTIMEto_date(2026-04-13 16:38:00,yyyy-mm-dd hh24:mi:ss)AUXILIARY DESTINATION/backup/auxiliaryDATAPUMP DESTINATION/backupNOTABLEIMPORT;然后手动导入impdp TEST/TESTdirectorybackup_dirdumpfiletspitr_*.dmptable_exists_actionREPLACE⚠️注意NOTABLEIMPORT 只是不导入数据辅助实例仍然会创建因此AUXILIARY DESTINATION仍需指定impdp TEST/TESTdirectorybackup_dirdumpfiletspitr_*.dmptable_exists_actionREPLACE7.2 使用闪回查询数据量小-- 直接从 UNDO 恢复INSERTINTOTEST.TEXTSELECT*FROMTEST.TEXTASOFTIMESTAMPTO_TIMESTAMP(2026-04-13 16:35:00,yyyy-mm-dd hh24:mi:ss);COMMIT;7.3 使用 TSPITR表空间时间点恢复# 使用 RMAN TSPITRrman target / RECOVER TABLESPACE test_ts UNTIL TIMEto_date(2026-04-13 16:38:00,yyyy-mm-dd hh24:mi:ss);8 注意事项需要指定误删表的 PDB如果是PDB模式需要指定误删数据的时间点精确到秒需要指定恢复辅助目录且目录要有足够磁盘空间确保物理内存充足否则会报 ORA-27125恢复完成后会自动清理辅助实例临时文件如果表恢复后需要导入到原表先使用 REMAP TABLE 恢复到新表再手动插入