今天遇到一個這樣的問題,問題描述大概以下,這是別人寫的,而後我研究了一下,問題的解決方法以下:
有兩臺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>
查詢能夠正常進行
COUNT(*)
----------
106
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
的步驟