通过dblink,数据泵expdp远程跨版本导库
背景环境
希望导出服务器上的库到本地,并绕过两个数据量很大的表,所以考虑使用数据泵的exclude参数。
远程服务器:
Oracle服务端版本12c:12.1.0.1
本地:
Oracle服务11g:11.2.0.1
Oracle客户端版本11g:11.2.0.1
连接服务器(使用dblink)
这里我本地有一个服务端,所以我是通过plsql连接本地库之后,使用dblink连接远程库再的,与直接连远程库类似:
- 授权并创建dblink;
查看是否有权限:select * from user_sys_privs where privilege like upper('%DATABASE LINK%') AND USERNAME='用户名';
授予权限:grant create public database link to 用户名;
,记得使用上句查看。
创建dblink:create public database link 连接名 connect to 远程服务的用户名 identified by 密码(数字要双引号) USING '远程TNS连接';
例如:
create public database link TESTLINK connect to USERNAME identified by PASSWORD USING '(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.102)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
))';
- 使用低版本连接高版本客户端出错:ORA-28040、ORA-01017
针对ORA-28040:
在数据库服务器上的$ORACLE_HOME/network/admin/sqlnet.ora文件中
增加两行(支持低版本客户端的连接认证方式),不需要重启监听:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
针对ORA-01017:
支持低版本认证后需要重置密码,使用如下命令在sql中刷一下密码即可,不需要修改密码
alert user xxx identified by xxxxxx;
至此,使用低版本客户端连接高版本服务器已经成功,我使用的dblink,也没用问题。
查询时,需要在表名后跟上dblink名
SELECT * FROM v$version@TESTLINK;
数据泵expdp导出
在系统中创建文件夹,并在本地客户端执行以下语句,确保该地址真实存在;
create directory expdp_dir as ‘f:\data’;
select * from dba_directory;
cmd命令行中执行:
expdp 本地用户名/密码@本地库 schemas=需导出用户1 dumpfile=导出的文件名.dmp directory=expdp_dir exclude=table:\"in('除了表1','除了表2')\" logfile=导出记录日志文件名.log version=即将impdp导入的数据库版本号 network_link=testlink(dblink名)
expdp遭遇ORA-39006、ORA-39065、ORA-01422、ORA-39097错误
根据网上经验,在远程服务器上执行,可解决(我实验没用效果,暂时没时间琢磨了,还是使用exp/imp来做了,后面有空再研究把):
sqlplus / as sysdba
SQL>@$ORACLE_HOME/rdbms/admin/catmeta.sql
SQL>@$ORACLE_HOME/rdbms/admin/catmet2.sql
SQL>@$ORACLE_HOME/rdbms/admin/utlrp.sql
附上我查的资料中觉得有所帮助的几篇,供大家参考
客户端登录Oracle 12.2服务器报ORA-01017的解惑
ORACLE 12C连接时报ORA28040和ORA01017的错误
ORA-28040 数据库兼容性解决方案 没有匹配的验证协议
ORACLE dblink的简单使用
使用expdp(非本地)远程导出数据
expdp遭遇ORA-39006、ORA-39065、ORA-01403、ORA-39097错误
[Oracle] expdp ORA-39006, ORA-39065 的解决办法
致谢
- 感谢各位前辈不吝赐教,写下博文分享;
- 感谢大家耐心阅读。