无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。
