今天遇到一个这样的问题,问题描述大概如下,这是别人写的,然后我研究了一下,问题的解决方法如下:
有两台DB服务器,A和B。两台服务器都是AIX系统,数据库版本是10.2.0.2。
现在要从A服务器上导出数据库表到B服务器上。首先在B服务器上建立和A服务器的public database link后(con_a),使用sql查询可以查询到A服务器上的数据库表内容,使用tnsping con_a也显示正常。但是使用expdp导出数据库表时指定参数network_link = con_a,提示ora-39200,ora-12154错误。但是在A服务器上建立到B服务器的public database link后(con_b),无论是sql查询还是tnsping con_b还是使用expdp导出B服务器上的数据库表都没有问题。请问在B服务器上使用expdp时出现错误的原因是什么?
错误代码是:
起先在B服务器上创建了如下dblink,但是一直提示上面的错误:
SQL> create  database link link_daolang connect to system identified by daolang using 'daolang';
数据库链接已创建。
SQL> create or replace directory daolang as 'E:\Oracle\daolang';
目录已创建。
SQL> grant read,write on directory daolang to system;
授权成功。
SQL>

查询可以正常进行
SQL> select count(*) from hr.employees@link_daolang;
  COUNT(*)
----------
       106
SQL> select * from sys.test@link_daolang;
        ID
----------
         1
         2
         3
         4
但是就是不能执行expdp命令,执行就提示
C:\>expdp system/daolang directory=daolang,dumpfile=daolang.dmp,full=y,network_link=link_daolang
Export: Release 10.2.0.1.0 - Production on 星期四, 03 6月, 2010 18:40:04
Copyright (c) 2003, 2005, Oracle.  All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
ORA-39001: 参数值无效
ORA-39200: 链接名称 "link_daolang" 无效。
ORA-02019: 未找到远程数据库的连接说明
 
 
经查阅资料,发现必须创建public dblink才可以,然后先删除掉原有的dblink,再重新创建,然后一切正常。
SQL> drop database link link_daolang
  2  ;
数据库链接已删除。
SQL> create public database link link_daolang connect to system identified by daolang using 'daolang';
数据库链接已创建。
SQL>
 
 

还有一点要加以说明的是,创建dblink的正确步骤为:
expdp 属于服务端工具,而 exp 属于客户端工具, expdp 生成的文件默认是存放在服务端的,而 exp 生成的文件是存放在客户端的

1.expdp username/password@connect_string   //
对于使用这种格式来说, directory 使用源数据库创建的,生成的文件存放在服务端。 如何将生成的文件放在目标数据库而不放在源数据库呢,在 expdp 中使用 network_link
2.
a. 创建到服务端的 dblink
create database link link_name connect to  username identified by password using 'connect_string' ;
//username password server 端的,并且特别注意该处的connect_string 就为tnsnames.ora中的服务名,
b. conn / as sysdba
create or replace directory dir as 'directory';
grant read,write on directory dir to username;
c.expdp username/password  directory=dir network_link=link_name ...  //
这里的 username 用创建 dblink 的那个用户, directory 也是目标数据库创建的   
3.
如果想不生成 dmp 文件而直接导入一个数据库,原理和 2 类似,直接使用 impdp network_link ,这样可以直接 impdp ,而绕过了 expdp 的步骤