更多精彩内容,请登录:ke.sandata.com.cn

现在曾经是Oracle Database 21c的时代了,你是否还思考过应用EXP/IMIP这些9i中的工具呢?

其实在非凡的场景中,这些看似“老的工具”,也是能够帮忙你解决辣手的问题。

比方:能够在数据库只读模式下,导出数据等。又或者将其利用在我下文中所形容的场景中。

进入正题,某客户找到我,形容了其数据库无奈启动的故障,通过剖析得出数据库软件被注入了歹意的代码,导致TAB$表数据被删除,从而无奈启动数据库,告警日志外面的输入如下:

Errors in file D:\APP\ADMINISTRATOR\diag\rdbms\xxxx\xxxx\trace\xxxx_ora_13308.trc  (incident=26578):ORA-00600: 外部错误代码, 参数: [16703], [1403], [20], [], [], [], [], [], [], [], [], []Incident details in: D:\APP\ADMINISTRATOR\diag\rdbms\xxxx\xxxx\incident\incdir_26578\xxxx_ora_13308_i26578.trcUse ADRCI or Support Workbench to package the incident.See Note 411.1 at My Oracle Support for error and packaging details.Errors in file D:\APP\ADMINISTRATOR\diag\rdbms\xxxx\xxxx\trace\xxxx_ora_13308.trc:ORA-00704: 疏导程序过程失败ORA-00704: 疏导程序过程失败ORA-00600: 外部错误代码, 参数: [16703], [1403], [20], [], [], [], [], [], [], [], [], []Errors in file D:\APP\ADMINISTRATOR\diag\rdbms\xxxx\xxxx\trace\xxxx_ora_13308.trc:ORA-00704: 疏导程序过程失败ORA-00704: 疏导程序过程失败ORA-00600: 外部错误代码, 参数: [16703], [1403], [20], [], [], [], [], [], [], [], [], []Error 704 happened during db open, shutting down databaseUSER (ospid: 13308): terminating the instance due to error 704

这种攻打事件,网上有很多探讨,有机会再给大家详细分析这个故障。此篇文章次要记录一下,在解决这个歹意攻打过程中,为了导出数据到新搭建的数据库中,所遇到一些EXP和IMP的技术点。

首先,因为无奈完满复原数据块,于是抉择应用传输表空间技术,将被毁坏数据库的数据迁徙到新搭建的数据库里。但因为数据字典有问题,应用EXPDP导出元数据信息时,会报谬误,无奈进行。这个时候,只有抉择用EXP工具来进行导出元数据工作。

应用传输表空间实现后,一些没有段的对象,如view,sequence,function等等是没有方法一起导入的,因为这些对象的定义信息都放在SYSTEM表空间里。因而,咱们再次应用EXP和IMP,对schemas数据进行导出和导入,步骤如下:

1. 传输表空间导出元数据:

exp '/ as sysdba' file=sandata_exp.dmp log=sandata_exp.log transport_tablespace=y tablespaces=SANDATA_IDX,SANDATA statistics=none

应用statistics=none选项能够防止上面形容的EXP-00091的报错。

EXP-00091: 正在导出有问题的统计信息。

如果数据库的字符集和操作系统的不统一,会有如下报错:

连贯到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing options已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集服务器应用 AL32UTF8 字符集 (可能的字符集转换)注: 将不导出表数据 (行)行将导出可传输的表空间元数据...

2. 导入表空间到新数据库中,因为文件比拟多,因而应用parfile文件来执行。这是因为一条命令如果过长的话,是无奈失常执行的。

imp '/  as sysdba' parfile='sandata.txt'

parfile文件sandata.txt的内容:

TRANSPORT_TABLESPACE=ydatafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA01.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA02.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA03.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA04.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA05.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA06.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA07.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA08.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA09.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA010.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA011.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA012.DBF'datafiles='D:\APP\ADMINISTRATOR\ORADATA\SANDATA\SANDATA_IDX_01.DBF'tablespaces=SANDATA,SANDATA_IDXfile=sandata_exp.dmplog=sandata_tts.log

3.实现后,view,sequence,function等没有导入,于是咱们再次依照用户导出这些内容;

其中最重要的选项就是rows=n,此选项示意不导出表的任何数据;也能够按需抉择indexes=n,constraints=n,triggers=n等选项。

这样咱们就取得了view,sequence,function等内容,同时又没有导出数据了。

exp '/ as sysdba' file=sandata_schemas.dmp log=sandata_schemas.log owner=sandata rows=n indexes=n constraints=n triggers=n

4.导入到新数据库中,此时ignore=y和rows=n选项都要应用上。

imp '/  as sysdba' file=sandata_schemas.dmp log=sandata_imp_schemas.log fromuser=sandata touser=sandata ignore=y rows=n

如果源数据库和指标数据库字符集不一样,在导入时会报如下谬误:

Export file created by EXPORT:V11.02.01 via conventional pathAbout to import transportable tablespace(s) metadata...import done in ZHS16GBK character set and AL16UTF16 NCHAR character set. importing SYS's objects into SYS. importing SYS's objects into SYSIMP-00017: following statement failed with ORACLE error 29345: "BEGIN   sys.dbms_plugts.beginImport ('11.2.0.4.0',873,'2000',12,'Microsoft " "Windows x86 64-bit',96170,7289301,2,1,1,0); END;"IMP-00003: ORACLE error 29345 encounteredORA-29345: cannot plug a tablespace into a database using an incompatible character setORA-06512: at "SYS.DBMS_PLUGTS", line 2610ORA-06512: at "SYS.DBMS_PLUGTS", line 2119ORA-06512: at line 1IMP-00000: Import terminated unsuccessfully

5.不要忘了最初核查一下源库和指标库中对象的数量是否统一。

总结,EXP工具不如EXPDP功能丰富,当遇到不得不用EXP工具时,能够参考本文章。正所谓,工具没有老和旧,只有实用和不实用。