1、Oracle导入、导出
(1)导出数据:
(2)远程导出数据
(3)导入数据:
2、导出时遇到的问题分析
(1)、 用EXP命令导出数据时,出现:ORA-06550: line 1, column 41:
PLS-00302: component 'SET_NO_OUTLINES' must be declared
ORA-06550: line 1, column 15:
PL/SQL: Statement ignored
EXP-00000: Export terminated unsuccessfully
Cause
Solution
Export: Release 9.2.0.4.0 - Production on Wed Jul 14 18:35:26 2010
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
EXP-00056: ORACLE error 12154 encountered
ORA-12154: TNS:could not resolve service name
EXP-00000: Export terminated unsuccessfully
原因: sqlnet.ora文件中引用了domain域(注:我们这边没使用域)
# SQLNET.ORA Network Configuration File: /opt/oracle/products/9.2.0/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.
MES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
NAMES.DEFAULT_DOMAIN = db.alibaba.com
TNS Ping Utility for Linux: Version 9.2.0.4.0 - Production on 14-JUL-2010 18:37:58
Copyright (c) 1997 Oracle Corporation. All rights reserved.
Used parameter files:
/opt/oracle/products/9.2.0/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 某ip值)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ocntest)))
OK (0 msec)
Action: To export non-questionable statistics, change the client character set or NCHARSET to match the server, export with no query clause, or export complete tables. If desired, import parameters can be supplied so that only non-questionable statistics will be imported, and all questionable statistics will be recalculated.
解决:
linux下的oracle用户的环境变量语言集和oralce数据库中的环境变量语言集不相同。
查看oracle的环境变量语言集:
数据库服务器字符集:
select * from nls_database_parameters
客户端字符集:
select * from nls_instance_parameters
将oracle用户的环境变量语言集改成和数据库服务器字符集一样。
export NLS_LANG=american_america.ZHS16GBK
(4)Oracle的exp工具有一个query参数可以指定一个where条件来有条件地导出记录, 对于不经常用这个选项的人来说, 经常会遇到这样的错误:
LRM-00112: multiple values not allowed for parameter 'query'
EXP-00019: failed to process parameters, type 'EXP HELP=Y' for help
EXP-00000: Export terminated unsuccessfully
exp ... query='where deptno=10'
exp ... query='where deptno=''10'''
exp ... query='where deptno"<"10'
exp ..... query=\"where col1 \< 1000\"
exp ..... query=\"where col1 \< '1000'\"
(5) EXP数据时出现exp-00003错误
原因:用低版本导高版本数据库数据造成的
EXP导出10203数据的时候,出现了EXP-3错误:EXP-00003: no storage definition found for segment(41, 6024)
查询了一下METALINK,发现9205版本之前的EXP客户端,导出9205以上版本的数据时,如果表中包含LOB字段,或者表中的EXTENT超过一个,则会导致EXP-00003错误。
造成问题的原因是由于Oracle在9205及以上版本中,解决了一个查询DBA_SEGMENTS的BYTES/EXTENTS/BLOCKS列速度缓慢的错误。而解决这个bug的代价就是9204及以下版本在导出高版本数据时会碰到EXP-3这个错误。
具体的相关信息可以查询METALINK:
Bug 2948717 : Queries against DBA_SEGMENTS can be slow accessing BYTES/BLOCKS/EXTENTS columns;
Bug 3593227 "EXP-3 WHEN EXPORTING A TABLE WITH MORE THAN 1 EXTENT USING EXP BELOW 9.2.0.5"
Bug 3784697 "EXPORT OF LOB FROM 9205 WITH PRE-9205 EXP GIVES EXP-3 (NO STORAGE DEF FOUND)"
解决问题的方法到是不算复杂:
如果导出不包含LOB字段,那么可以将EXP语句中的COMPRESS参数设置为Y,重新执行导出即可。
如果包含LOB字段,或者上面的方法无效,那么需要对导出库修改exu9tne视图。在导出完成后,再将该视图恢复。
服务器和客户端两边连接都很正常,百思不得解,难道是导出版本的问题?不至于啊,1024导出1023的库,之前操作过,没发现过这个问题,而且看提示不像啊,众所周知版本错误会提示ORA-06550。实在无法,最后报着死马当活马医的想法尝试换了一个同版本的客户端执行exp,结果顺利执行。
后来又经过多番尝试,发现出错的均是含lob字段的表,看来一方面oracle在执行exp时对版本的处理非常严格,即使大版本相同,小版本有略微差异也会导致exp时报错,另一方面是处理规则也存在版本延续的情况,如果不涉及到处理规则的变化,即使exp时客户端版本与服务器不符,导出时也有可能不报错(运气好的话)。
将此次事件记录下来以加强记忆,以后执行导出还是都尽可能确保版本一致吧(起码exp的客户端版本不能高于服务器)。