ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle闪回删除恢复误删数据

Oracle闪回删除恢复误删数据

原创 Linux操作系统 作者:壹頁書 时间:2013-11-19 21:48:32 0 删除 编辑
单位把程序做成了exe的安装包。
安装包在初始化数据库的时候,会先drop所有的表,然后建表,最后插入数据。
在开发用的数据库,一个同事加了一天班,给所有的表和字段都加了注释,估计是用于PD反向工程。
但是不凑巧,第二天另外一个同事运行安装包直接把他的表覆盖了...

大致过程如下,
同事A:
  1. create table a(a int);
  2. create table b(b int);
  3. create table c(c int);
  4. create table d(d int);
  5. create table e(e int);
  6. comment on column a.a is 'Test a';
  7. comment on column b.b is 'Test b';
  8. comment on column c.c is 'Test c';
  9. comment on column d.d is 'Test d';
  10. comment on column e.e is 'Test e';

第二天,同事B:
  1. drop table a;
  2. drop table b;
  3. drop table c;
  4. drop table d;
  5. drop table e;
  6. create table a(a int);
  7. create table b(b int);
  8. create table c(c int);
  9. create table d(d int);
  10. create table e(e int);
现在需要恢复同事A的注释。

当时解决的过程如下
1.查看回收站,发现表还在。

  1. SQL> select object_name,original_name,createtime from recyclebin;

  2. OBJECT_NAME ORIGINAL_NAME CREATETIME
  3. ------------------------------ -------------------------------- -------------------
  4. BIN$NmbxAasiR2CPSv0of/GyzA==$0 A 2013-11-19:21:19:28
  5. BIN$cyT3N5nJQMO85ho0DkpV9g==$0 B 2013-11-19:21:19:29
  6. BIN$fdrhQ5VtS0q7pZ5kT9tceA==$0 C 2013-11-19:21:19:29
  7. BIN$o8t+PJl3SpmRTh2gD1mUBQ==$0 D 2013-11-19:21:19:29
  8. BIN$RhLkOWtCTo+ls8QSwMxD9g==$0 E 2013-11-19:21:19:29
2.使用闪回删除,恢复表。
在恢复的时候,将表加上前缀。
(之所以没有删除当前的表,再将回收站的表恢复,是因为怕新删除的表,直接将旧表挤出回收站)
  1. SQL> select 'flashback table "'||object_name||'" to before drop rename to bak_'||original_name||';' from recyclebin;

  2. 'FLASHBACKTABLE"'||OBJECT_NAME||'"TOBEFOREDROPRENAMETOBAK_'||ORIGINAL_NAME||';'
  3. ---------------------------------------------------------------------------------------------------------------
  4. flashback table "BIN$NmbxAasiR2CPSv0of/GyzA==$0" to before drop rename to bak_A;
  5. flashback table "BIN$cyT3N5nJQMO85ho0DkpV9g==$0" to before drop rename to bak_B;
  6. flashback table "BIN$fdrhQ5VtS0q7pZ5kT9tceA==$0" to before drop rename to bak_C;
  7. flashback table "BIN$o8t+PJl3SpmRTh2gD1mUBQ==$0" to before drop rename to bak_D;
  8. flashback table "BIN$RhLkOWtCTo+ls8QSwMxD9g==$0" to before drop rename to bak_E;
3.删除当前存在的表

  1. SQL> select 'drop table '||substr(table_name,5)||' purge;' from user_tables where table_name like 'BAK%';

  2. 'DROPTABLE'||SUBSTR(TABLE_NAME,5)||'PURGE;'
  3. ----------------------------------------------------------------------
  4. drop table A purge;
  5. drop table B purge;
  6. drop table C purge;
  7. drop table D purge;
  8. drop table E purge;
4.将恢复的表重命名

  1. SQL> select 'alter table '|| table_name||' rename to '||substr(table_name,5)||';' from user_tables where table_name like 'BAK%';

  2. 'ALTERTABLE'||TABLE_NAME||'RENAMETO'||SUBSTR(TABLE_NAME,5)||';'
  3. ----------------------------------------------------------------------------------------------------------
  4. alter table BAK_A rename to A;
  5. alter table BAK_B rename to B;
  6. alter table BAK_C rename to C;
  7. alter table BAK_D rename to D;
  8. alter table BAK_E rename to E;
运行alter table命令之后,查看注释,已经恢复。

  1. SQL> select * from user_col_comments;

  2. TABLE_NAME COLUMN_NAME COMMENTS
  3. ------------------------------ ------------------------------ ----------
  4. A A Test a
  5. B B Test b
  6. C C Test c
  7. D D Test d
  8. E E Test e
后来发现还有一种更简单的方法。
表被Drop之后,放入回收站,他的table_name被改名,
而注释的table_name会和回收站的table_name保持一致。

  1. SQL> select * from user_col_comments;

  2. TABLE_NAME COLUMN_NAME COMMENTS
  3. ------------------------------ ------------------------------ ----------
  4. BIN$sKho5ULVTNOOG2eLJIufhA==$0 A Test a
  5. BIN$zxSn8/FpSZyllfe4evv3EQ==$0 B Test b
  6. BIN$Fc/XryYETrqEMfv0aMxY1g==$0 C Test c
  7. BIN$fVzUmlAeR72hOkHWH85z3g==$0 D Test d
  8. BIN$r5cZoCgSSxO4DLf8xrem/A==$0 E Test e

  9. SQL> select object_name,original_name,createtime from recyclebin;

  10. OBJECT_NAME ORIGINAL_NAME CREATETIME
  11. ------------------------------ -------------------------------- -------------------
  12. BIN$sKho5ULVTNOOG2eLJIufhA==$0 A 2013-11-19:21:19:28
  13. BIN$zxSn8/FpSZyllfe4evv3EQ==$0 B 2013-11-19:21:19:29
  14. BIN$Fc/XryYETrqEMfv0aMxY1g==$0 C 2013-11-19:21:19:29
  15. BIN$fVzUmlAeR72hOkHWH85z3g==$0 D 2013-11-19:21:19:29
  16. BIN$r5cZoCgSSxO4DLf8xrem/A==$0 E 2013-11-19:21:19:29
所以不用恢复回收站中的表,直接用回收站连接user_col_comments,生成注释信息即可。

  1. SQL> select 'comment on column '||recyclebin.original_name||'.'||user_col_comments.column_name||' is '''||user_col_comments.comments||''';' create_comments
  2.   2 from recyclebin
  3.   3 inner join user_col_comments
  4.   4 on user_col_comments.table_name=recyclebin.object_name
  5.   5 where recyclebin.type='TABLE';

  6. CREATE_COMMENTS
  7. ------------------------------------------------------------------------------------------------------------------------------------------------------------
  8. comment on column A.A is 'Test a';
  9. comment on column B.B is 'Test b';
  10. comment on column C.C is 'Test c';
  11. comment on column D.D is 'Test d';
  12. comment on column E.E is 'Test e';

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-777031/,如需转载,请注明出处,否则将追究法律责任。

下一篇: Bad Habits
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    621
  • 访问量
    5949553