乐趣区

关于数据库:Oracle-Database别无选择时的EXP导出数据手记

更多精彩内容,请登录: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.trc
Use 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 database
USER (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 Production
With 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=y
datafiles='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_IDX
file=sandata_exp.dmp
log=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 path
About 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 SYS
IMP-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 encountered
ORA-29345: cannot plug a tablespace into a database using an incompatible character set
ORA-06512: at "SYS.DBMS_PLUGTS", line 2610
ORA-06512: at "SYS.DBMS_PLUGTS", line 2119
ORA-06512: at line 1
IMP-00000: Import terminated unsuccessfully

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

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

退出移动版