按照惯例先报系统环境:
导出环境:
操作系统Release版本:CentOS 6.5
OS内核Kernel版本:2.6.32-431.el6.x86.64
Oracle版本信息:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
导入环境:
操作系统Release版本:CentOS 6.4
OS内核Kernel版本:2.6.32-358.el6.x86_64
Oracle版本信息:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
由上可见本次操作是操作系统平台几乎相同,相同平台数据库版本环境下进行
---------------------------------------------------分界线------------------------------------------------------------
下面讲下使用oracle在10g和11g版本推出的expdp/impdp数据泵进行数据的导入导出,下面与oracle相关的命令皆在用户oracle环境下执行:
(PS:expdp/impdp是服务端工具,只运行在数据库服务端,使其不受客户端版本的影响,其次其可解决一定的版本向前向后兼容问题,版本不兼容解决程度比exp/imp高,且expdp/impdp和exp/imp所导出数据不能混用,其余跟exp/imp异同和特性请猛击我)
首先查看确认被导入库的oracle版本:
SQL> select * from v$version;
接着查看管理员目录,同时确认操作系统是否存在该目录,以备存放导出数据。因为创建目录时oracle不关心该目录是否存在,如果不存在,则出错(使用mkdir -p /xxx/xxx创建,使用chown -R oracle:oinstall /xxx/xxx更改目录从属为oracle避免权限问题):
SQL>select * from dba_directories;
出于用户权限控制和数据安全考虑等特殊场景考虑,可以新建一个逻辑目录(注意在系统相同位置创建该目录,下同),并对需要使用该目录的用户进行授权使用:
SQL>create directory dpdata1 as '/home/oracle/dumptest';
给用户XXX对该目录dpdata1(即/home/oracle/dumptest)进行读写授权,授权时最好使用具有DBA角色权限的用户进行授权,如system等。由于本次操作进行的是全库导入导出,使用oracle安装时自动创建的用户system,默认该用户角色为DBA数据库管理员,为最高权限,故不需要再对新建目录进行读写授权,下面给出对某个用户授权语句:
SQL>grant read,write on directory dpdata1 to xxx;
接下来使用system用户直接导出全库文件到/home/oracle/dumptest/下,system密码为oracle,导出文件为testfullexpdp.dmp,导出过程日志为testfullexpdp.log,此处@orcl意为连接的实例解析名是orcl,为本机的服务端的实例orcl,使用该命令前可先尝试使用“tnsping [实例名]”的方式测试该实例解析orcl是否生效。关于实例解析名请看$ORACLE_HOME/network/admin/tnsname.ora文件里面有解析名和实例名一一对应关系:
expdp system/oracle@orcl directory=dpdata1 dumpfile=testfullexpdp.dmp log=testfullexpdp.log full=y导出完毕:
接 下来将导出目录dpdata1即/home/oracle/dumptest下的导出文件testfullexpdp.dmp发送到导入目标库服务器上的管理目录里,假设导入库的管理目录也为dpdata1,即物理目录为/home/oracle/dumptest/,接下来导入数据,首先是确认目录存在和对应情况:
select * from dba_directories where directory_name='DPDATA1';
impdp system/oracle DIRECTORY=dpdata1 DUMPFILE=testfullexpdp.dmp LOG=testfullimpdp.log FULL=y IGNORE=y;
如下图提示表已存在,由于本次操作是覆盖导入,故可以使用”IGNORE=y“选项忽略
导入完成,有相当多的错误报告:
这是由于当前执行的是覆盖导入操作,大量表空间和数据,还有索引等等已经存在,所以提示数据重复错误,当然其中也夹杂了部分其他异常错误,可以根据ORA-xxxxx错误代码结合命令“oerr ora [错误代码]“逐步排查问题所在。
至此数据导入完毕,至于其他类型的数据导入方式,如按表导入,按表空间导入,按查询条件导入,按用户导入等等可以参考以下文章:
Oracle expdp/impdp导出导入命令及数据库备份(转)