没有SYSTEM时如何恢复数据?
AUL/MyDUL » http://www.anysql.net/aulmydul/aul_nosystem_recovery.html 2006-09-05在Oracle数据库中, 所有的表结构的信息都存放在SYSTEM表空间中. 光从数据文件的角度看, 我们只能从文件中找到一个数据对象的编号及你 想要的数据. 在丢失SYSTEM的情况下, 还是可以通过扫描所有的数据文件而恢复数据. 但是并不知道这些记录本属于那个表, 需要DBA和开发人员一起去确定这些 记录是那个表的. 下面是一个用AUL/MyDUL去做没有SYSTEM的恢复的例子.
我创建了一个只有2M大小的表空间(一个数据文件, 压缩后6KB), 并在这个表 空间上创建了几张表, 插入一些记录, 然后在Oracle中发一个Checkpoint命令或正常关闭, 以让Oracle将所有的内容写入文件中. 创建表的SQL语句如下:
SQL> CREATE TABLE TEST1 (COL1 VARCHAR2(10));
SQL> CREATE TABLE TEST2 (COL1 VARCHAR2(10));
SQL> CREATE TABLE TEST3 (COL1 VARCHAR2(10));
接下来我们编辑一个配置文件并打开, 运行"SCAN TABLE TO 文件"来扫描文件获得恢复的命令. 如下所示:
AUL> open db10g.cfg
* ts# fno rfn ver bsize blocks filename
- ---- ---- ---- --- ----- ---------- ----------------------
Y 5 5 5 a2 8192 256 AULTEST01.DBF
AUL> scan table to scan_table.log
2006-08-12 13:02:43
2006-08-12 13:02:43
接下来我们来检查生成的"scan_table.log"文件, 你可以看到很多信息, 其中以"CMD:"开头的行为AUL/MyDUL自动猜测列类型和数量以后自动 生成的恢复命令, 这儿不保证能正确认识所有列的类型, 所以称之为猜. 另外对于每一个不同的数据对象, 会以二进制打印出5条样本记录. 通过Linux/Unix"下 的grep命令, 很容易生成恢复的角本的. 扫描出来的结果中也包括了DROP或TRUNCATE了的表的数据, 总之是包括了现在还留在数据文件中的所有数据对象.下面是 这个命令的结果:
RDBA=0x01400015(5/21),type=0x06,fmt=0xa2,seq=0x03,flag=0x06
seg/obj=0x000026fb=9979,csc=0x0000.000999cd,itc=2,typ=1 - DATA
tab#= 0 nrow= 11 offs= 0
545f50415254
545f4f424a454354
545f4c4f42
545f434c4f42
42494e24773455692b46
Column Count=1
CMD:UNLOAD OBJECT 9979 CLUSTER 0 COLUMN VARCHAR
RDBA=0x0140001d(5/29),type=0x06,fmt=0xa2,seq=0x03,flag=0x06
seg/obj=0x000026fc=9980,csc=0x0000.000999cd,itc=2,typ=1 - DATA
tab#= 0 nrow= 11 offs= 0
545f50415254
545f4f424a454354
545f4c4f42
545f434c4f42
42494e24773455692b46
Column Count=1
CMD:UNLOAD OBJECT 9980 CLUSTER 0 COLUMN VARCHAR
RDBA=0x01400025(5/37),type=0x06,fmt=0xa2,seq=0x03,flag=0x06
seg/obj=0x000026fd=9981,csc=0x0000.000999cd,itc=2,typ=1 - DATA
tab#= 0 nrow= 11 offs= 0
545f50415254
545f4f424a454354
545f4c4f42
545f434c4f42
42494e24773455692b46
Column Count=1
CMD:UNLOAD OBJECT 9981 CLUSTER 0 COLUMN VARCHAR
然后我们用生成的恢复命令来进行恢复, 可以看到记录被恢复出来, 在这个例子中我的三个表都包函一样的记录:
AUL> UNLOAD OBJECT 9979 CLUSTER 0 COLUMN VARCHAR;
2006-08-12 13:17:52
T_PART
T_OBJECT
T_LOB
T_CLOB
BIN$w4Ui+F
BIN$JRhlBf
TEST
TEST2
BIN$IRebiY
TEST1
TEST3
2006-08-12 13:17:52
AUL> UNLOAD OBJECT 9980 CLUSTER 0 COLUMN VARCHAR;
2006-08-12 13:18:01
T_PART
T_OBJECT
T_LOB
T_CLOB
BIN$w4Ui+F
BIN$JRhlBf
TEST
TEST2
BIN$IRebiY
TEST1
TEST3
2006-08-12 13:18:01
AUL> UNLOAD OBJECT 9981 CLUSTER 0 COLUMN VARCHAR;
2006-08-12 13:18:09
T_PART
T_OBJECT
T_LOB
T_CLOB
BIN$w4Ui+F
BIN$JRhlBf
TEST
TEST2
BIN$IRebiY
TEST1
TEST3
2006-08-12 13:18:09
即使有这样比较方便的命令, 没有SYSTEM的恢复也是比较麻烦的, 因为后面还要人工识别这些记录是那个表的.


Recent Comments