在AUL/MyDUL中如何恢复被Truncate的表

    最近至少看到二次错误地截断(Truncate)表的例子, 并在网上询问如何恢复, 在这儿我给出AUL/MyDUL的解决方案, 下面是我用的一个测试表:

ASQL> DESC TRUNCDEMO

NO# NAME              NULLABLE TYPE
--- ----------------- -------- ------------
  1 COL1                       VARCHAR2(20)

ASQL> SELECT * FROM TRUNCDEMO;

COL1
-----
ROW 1
ROW 2

2 rows returned.

    接下来我们来截断表, 其实这个操作只是重新格式化了段头块(Segment Header), 并分配一个新的数据对象号(Data Object ID), 当然空间分配信息也改了, 除非加了重用空间选项(Reuse Storage). 来看一下这个操作的前后变化:

ASQL> SELECT DATA_OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS;

DATA_OBJECT_ID OBJECT_NAME
-------------- -----------
         13676 TRUNCDEMO

1 rows returned.

ASQL> truncate table truncdemo;

Truncate Table Succeed.

ASQL> SELECT DATA_OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS;

DATA_OBJECT_ID OBJECT_NAME
-------------- -----------
         13677 TRUNCDEMO

1 rows returned.

    由于在System表空间中已经记录了新的信息, 因此用当前的System信息是不能恢复过来的,在AUL/MyDUL中可以当作没有System时的情况来处理,在下面的命令中, 我们用Truncate后的数据对象号就不能进行恢复, 而使用Truncate以前的就可以, 当然空间不能被重新利用了是恢复的前提.

AUL> unload object 13676 column varchar file 4;
2006-09-18 22:38:58
ROW 1
ROW 2
2006-09-18 22:39:04
AUL> unload object 13677 column varchar file 4;
2006-09-18 22:39:10
2006-09-18 22:39:10
AUL>

    因此在意外发生Truncate后, 如果没有备份可以恢复, 首先要做的事是备份一下当前的文件, 免得空间被重用. 而Truncate之前的数据对象号在AUL/MyDUL中是很容易找出来的. 到此已经说明了如何恢复Truncate表了.

留言 (1)

感谢,从中得到思路!

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Do you know Mary?
  • 你认识玛丽吗?
  • Sure. We are friends since primary school.
  • 当然, 我们从小学就是朋友了.
  • Really? I was introduced to her just last weekend.
  • 真的? 上周末我才被介绍给她.
  • What is she doing now?
  • 她现在干些什么呢?
  • She told me she wanted to start a company.
  • 她告诉我她想开公司.