恢复DELETE数据的PACKAGE(操作手册篇)(仅做研究使用)

📅 2026/7/26 13:20:22 👁️ 阅读次数 📝 编程学习
恢复DELETE数据的PACKAGE(操作手册篇)(仅做研究使用)

恢复DELETE数据的PACKAGE(操作手册篇)

关于package的介绍和使用演示,请见《Oracle恢复DELETE数据的PACKAGE(介绍篇)》

安装

package下载链接
https://download.csdn.net/download/sp60cn/92942843
我将恢复delete数据PACKAGE简单集成在一个sql文件中,方便直接执行创建,或者自行复制sql文件中的创建语句执行也可以。

sqlplus/assysdba@del_recover_basic.sql

脚本就是简单的sqlplus / as sysdba进入数据库后执行创建,如果不是ORACLE_SID指向的实例,请修改脚本中的登录部分,或是复制语句后自行执行创建。
如果是CDB/PDB环境,请在要恢复的源表所在的容器的SYS用户中执行创建。

注意事项

  • 暂时仅支持恢复普通表,暂不支持如分区表、索引组织表等类型的表。
  • 暂时仅支持恢复NUMBER, VARCHAR2, CHAR, DATE, TIMESTAMP, RAW这六种数据类型。
  • 大部分不支持的数据类型会填充为null(目前已知的有CLOB、BLOB、XMLTYPE、INTERVAL等)。
  • 部分不支持的数据类型可能还会导致数据读取错误(目前已知的有LONG、LONG RAW)。
  • 源表元数据必须存在(未被 DROP)
  • 若底层数据被覆盖,则无法恢复。
  • 目标数据文件必须在文件系统(不支持共享存储)
  • 支持CDB/PDB环境
  • 目前已知适用于Oracle11g和Oracle19c,期间版本和更高版应该是支持的,但未经过测试。
  • 如果源表中有行迁移、行链接现象,会导致恢复失败。
  • 由于测试环境有局限性,不同环境可能导致失败。
  • 测试脚本的环境为Linux的Oracle19c的单机数据库。

参数详解

init_set 过程

设置恢复时的输出模式。
语法:

DEL_RECOVER_BASIC.INIT_SET(tracingINBOOLEANDEFAULTFALSE,loggingINBOOLEANDEFAULTTRUE);

参数:

参数模式默认值描述
tracingINFALSE恢复时是否输出详细的字段解析信息,供开发调试时使用。
loggingINTRUE恢复时是否输出恢复信息(如对象号、恢复出的表名、处理的数据文件、使用的目录、恢复的行数),建议保持开启。

使用说明:

  • init_set的设置会持续整个会话,直到再次调用覆盖。
  • init_set单独执行没有效果,它是为recover_deleted_table过程服务的。
  • 在sqlplus中执行recover_deleted_table恢复时,务必打开set serveroutput on,否则init_set的设置不会有任何输出。
  • 若源表较大,不建议开启tracing,会导致恢复时间加长。

示例:

EXECDEL_RECOVER_BASIC.init_set(FALSE,TRUE);

recover_deleted_table 过程

创建恢复表,读取数据文件,解析行内数据,将指定源表的数据恢复到恢复表内。
语法:

DEL_RECOVER_BASIC.RECOVER_DELETE_TABLE(p_ownerINVARCHAR2,p_tableINVARCHAR2,p_new_ownerINVARCHAR2DEFAULTUSER,p_new_tableINVARCHAR2DEFAULTNULL,p_ts_nameINVARCHAR2DEFAULTNULL);

参数:

项目模式默认值描述
p_ownerIN源表所属的用户(模式)名称。必选。
p_tableIN源表名称。必须与 dba_tables.table_name 完全一致,不能包含空格。必选。
p_new_ownerINUSER恢复表所属的用户名。默认为当前用户(即执行USER函数返回的用户名)。可选。
p_new_tableINNULL恢复表的名称。若为 NULL,自动生成 R_源表名(若重名则自动添加数字后缀)。可选。
p_ts_nameINNULL恢复表存放的表空间名称。若为 NULL,则使用恢复表所属用户的默认表空间。可选。

使用说明:

  • 再次说明,在sqlplus中执行recover_deleted_table恢复时,建议打开set serveroutput on,否则不会有任何输出。
  • 在SYS用户中创建,在SYS用户中执行。
  • 需要预先存在指向源表数据所在数据文件的目录对象,如不存在,在执行RECOVER_DELETE_TABLE后会提供一个创建语句,创建目录后再次执行恢复即可。
  • 恢复表会自动创建,但不包含源表的约束、索引、触发器、权限等
  • 每成功恢复一行即自动提交,无需用户手动 COMMIT。
  • 若恢复表名已存在,脚本会自动添加数字后缀(如 R_EMP_1),不会覆盖已有表。
  • 每个参数的值均需全部大写
  • 若数据量大,恢复时间可能会很长。

示例:

EXECDEL_RECOVER_BASIC.recover_deleted_table('TEST','EMP','TEST');

usage 过程

显示包的简要帮助信息。
语法:

DEL_RECOVER_BASIC.USAGE;

示例:

EXECDEL_RECOVER_BASIC.usage;