恢复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);参数:
| 参数 | 模式 | 默认值 | 描述 |
|---|---|---|---|
| tracing | IN | FALSE | 恢复时是否输出详细的字段解析信息,供开发调试时使用。 |
| logging | IN | TRUE | 恢复时是否输出恢复信息(如对象号、恢复出的表名、处理的数据文件、使用的目录、恢复的行数),建议保持开启。 |
使用说明:
- 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_owner | IN | 无 | 源表所属的用户(模式)名称。必选。 |
| p_table | IN | 无 | 源表名称。必须与 dba_tables.table_name 完全一致,不能包含空格。必选。 |
| p_new_owner | IN | USER | 恢复表所属的用户名。默认为当前用户(即执行USER函数返回的用户名)。可选。 |
| p_new_table | IN | NULL | 恢复表的名称。若为 NULL,自动生成 R_源表名(若重名则自动添加数字后缀)。可选。 |
| p_ts_name | IN | NULL | 恢复表存放的表空间名称。若为 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;