无SYSTEM表空间恢复

当SYSTEM表空间损坏或丢失时,无法通过数据字典获取表结构信息,需要通过扫描和采样来恢复数据。具体步骤如下:

1

设置字符集等参数(gdul.ini)

conf/gdul.ini
db_charset   ZHS16GBK
db_ncharset  AL16UTF16
db_timezone  +08:00

说明:可以查询其它相似库来获取参数值:

select name, value$
  from sys.props$
 where name in ('NLS_CHARACTERSET',
'NLS_NCHAR_CHARACTERSET',
'DBTIMEZONE');
2

扫描表所在表空间

GDUL> scan tablespace 7 parallel 10
3

采样已扫描的表空间

GDUL> sample segment all
$ cd sample

说明:该操作执行采样,并在sample目录下生成segment列定义及采样数据。

注意:采样的列类型可能不准确,如果有测试库可以获取表结构,可以替换掉sample/seg_<data_object_id>.dict中<column_def></column_def>内的采样列定义,再执行unload。

从其它库获取表定义语句:

SQL> select  '<row>'
    || '<COL#>'         || col#         || '</COL#>'
    || '<SEGCOL#>'      || segcol#      || '</SEGCOL#>'
    || '<INTCOL#>'      || intcol#      || '</INTCOL#>'
    || '<TYPE#>'        || type#        || '</TYPE#>'
    || '<NAME>'         || name         || '</NAME>'
    || '<LENGTH>'       || length       || '</LENGTH>'
    || '<SEGCOLLENGTH>' || segcollength || '</SEGCOLLENGTH>'
    || '<PRECISION#>'   || precision#   || '</PRECISION#>'
    || '<SCALE>'        || scale        || '</SCALE>'
    || '<CHARSETID>'    || charsetid    || '</CHARSETID>'
    || '<CHARSETFORM>'  || charsetform  || '</CHARSETFORM>'
    || '</row>'
    from sys.col$
    where obj# = (select object_id from dba_objects
                   where owner = '<OWNER>'
                     and object_name = '<TABLE_NAME>')
    order by col#;
4

unload采样出的数据段

GDUL> unload segment all | <data_object_id>

说明:用指定的data_object_id unload表数据,指定all会恢复所有segment。