【Oracle】存储过程 Drop后闪回恢复

文中使用的Oracle版本为10g。
flashback教程又来了,这次flashback的是误操作删除的存储过程。

本操作需要在获得DBA账号权限的前提下进行操作,只要执行如下脚本:

select text
from dba_source as of timestamp to_timestamp('<time>', 'YYYY-MM-DD HH24:MI:SS')
where owner = '<tablespace>' and name = '<procedures_name>'
order by line;

这条语句共需传入3个参数,一个是时间,这个时间一般来说是被删除的确切时间。第二个是表空间,有了表空间才知道存储过程的拥有者是谁,最后是存储过程的名称,这个好理解如果连删除掉的存储过程名称都不知道那还查个鬼。
最后需要根据行序号(line)进行自然排序,为什么还需要排序呢?

因为查询出来的内容虽然说是存储过程,但是是一个数据集来的。可以简单理解成原本存储过程的每一行在这里会形成一行记录,同时会被记录行数。将所有内容都导出到命令窗口中进行再执行即可恢复存储过程。

这样就很有意思了,从这里可以推测出Oracle数据库在存储未知容量的数据时也是通过切割存储的方式来存储的,这种方式会形成一张虚拟的纵表,纵表内容可以超出一般字段类型的容量大小。这为后面我们做大数据量存储提供了思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我可以为您提供一个思路。首先,我们需要备份EMP表的数据和结构,可以使用Oracle提供的expdp命令进行导出,例如: ``` expdp username/password@database tables=EMP directory=backup_dir dumpfile=emp_backup.dmp ``` 这个命令将会把EMP表的数据和结构导出到名为emp_backup.dmp的文件中,存储在目录backup_dir中。 接下来,我们可以创建一个存储过程恢复EMP表。这个存储过程需要: 1. 检查备份文件是否存在,如果不存在则抛出异常提示用户备份文件不存在; 2. 使用impdp命令将备份文件导入到一个临时表中,例如emp_temp; 3. 比较emp_temp表和EMP表的结构,如果不相同则抛出异常提示用户表结构不匹配; 4. 使用MERGE语句将emp_temp表的数据合并到EMP表中,这样就可以保证数据完整性,并且可以处理多了或少了的数据。 下面是一个简单的存储过程示例: ``` CREATE OR REPLACE PROCEDURE restore_emp_table AS l_file_exists NUMBER; BEGIN -- 检查备份文件是否存在 SELECT COUNT(*) INTO l_file_exists FROM dba_data_files WHERE file_name like '%backup_dir%emp_backup.dmp'; IF l_file_exists = 0 THEN RAISE_APPLICATION_ERROR(-20001, '备份文件不存在'); END IF; -- 导入备份数据到临时表 EXECUTE IMMEDIATE 'DROP TABLE emp_temp PURGE'; EXECUTE IMMEDIATE 'CREATE TABLE emp_temp AS SELECT * FROM EMP@backup_dir(emp_backup.dmp)'; -- 检查表结构是否匹配 FOR c IN (SELECT column_name, data_type, data_length FROM user_tab_columns WHERE table_name = 'EMP') LOOP BEGIN EXECUTE IMMEDIATE 'ALTER TABLE emp_temp MODIFY ' || c.column_name || ' ' || c.data_type || '(' || c.data_length || ')'; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20002, '表结构不匹配'); END; END LOOP; -- 合并数据 MERGE INTO EMP e USING emp_temp t ON (e.empno = t.empno) WHEN MATCHED THEN UPDATE SET e.ename = t.ename, e.job = t.job, e.mgr = t.mgr, e.hiredate = t.hiredate, e.sal = t.sal, e.comm = t.comm WHEN NOT MATCHED THEN INSERT (empno, ename, job, mgr, hiredate, sal, comm) VALUES (t.empno, t.ename, t.job, t.mgr, t.hiredate, t.sal, t.comm); -- 删除临时表 EXECUTE IMMEDIATE 'DROP TABLE emp_temp PURGE'; DBMS_OUTPUT.PUT_LINE('EMP表已恢复'); END; ``` 这个存储过程会检查备份文件是否存在,如果不存在则抛出异常;然后使用impdp命令将备份数据导入到emp_temp表中;接着检查emp_temp表和EMP表的结构是否匹配,如果不匹配则抛出异常;最后使用MERGE语句将emp_temp表的数据合并到EMP表中,然后删除临时表。 希望这个思路能够帮助到您,如有不明白的地方可以随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kida 的技术小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值