oracle dblink用法總結和expdp和impdp利用dblink倒入匯出到本地

flywiththewind發表於2018-06-30

oracle中的database link是定義一個資料庫到另一個資料庫的路徑的物件,database link允許你查詢遠端表和執行遠端程式。在任何分散式環境裡,dblink都是必要的,另外注意database link是單向的連線。在建立database link的時候,oracle在資料字典中儲存了相關的database link的資訊,在使用database link的時候,oracle再透過oracle net使用者預先定義好的連線資訊訪問相應的遠端資料庫來完成相應的工作。

1、在建立database link之前需要注意:

(1)確認從local database到remote database的網路連線是否正常,tnsping要能成功。

(2)確認在remote database上面有相應的訪問許可權。

2、oracle database link可分為下面三類:

(1)private:建立的是使用者級別的dblink,只有建立該dblink的使用者才可以使用這個dblink來訪問遠端的資料庫,同時也只有該使用者可以刪除這個dblink。

(2)public:建立的是資料庫級別的dblink,本地資料庫中所有的使用者資料庫訪問許可權的使用者或者pl/sql程式都能使用這個dblink。

(3)global:建立的是網路級別的dblink,這是對於oracle network而言的。

3、建立dblink需要的許可權:

如果你新建了一個使用者,那麼你必須為它授予以下許可權才可以建立dblink:create database link、create public database link、create session。

4、建立dblink:


點選(此處)摺疊或開啟

  1. -- 如果不指定public,預設的是private,host後面可以是ip地址,也可以是解析過的域名
  2. CREATE PUBLIC DATABASE LINK dl_OCPLYZ1 CONNECT TO lyz IDENTIFIED BY lyz
  3.   USING '(DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.95.155)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = OCPLYZ1)
        )
      )
    ';

或者我們可以這樣寫:
create public database link dl_OCPLYZ1 connect to lyz identified by lyz  using 'OCPLYZ1';

但是要再 tnsnames.ora 檔案上加上這個:OCPLYZ1 ,這個格式最好要和上面的對應規整點。。。。否則有可能認不到。。
然後上面的   using 'OCPLYZ1' 這邊就要和tnsnames.ora 名字一樣了


5、檢視dblink:

檢視dblink,可以從dba_objects、dba_db_links這兩張表去查:
點選(此處)摺疊或開啟

  1. SELECT * FROM dba_objects do WHERE do.OBJECT_TYPE = 'DATABASE LINK';
  2. SELECT * FROM dba_db_links ddl;

除了上面兩張表,還有all_db_links、user_db_links。

6、使用dblink:

點選(此處)摺疊或開啟

  1. -- 最簡單的用法
  2. SELECT * FROM table_name@database_link;
  3. -- 不想讓別人知道database link名字的時候,可以使用同義詞包裝一下
  4. CREATE SYNONYM table_name for table_name@database_link;
  5. SELECT * FROM table_name;
  6. -- 也可以建立一個檢視來封裝
  7. CREATE VIEW table_name_v AS SELECT * FROM table_name@database_link;
7、刪除dblink:

點選(此處)摺疊或開啟

  1. -- 刪除public型別的dblink
  2. DROP PUBLIC DATABASE LINK dblink_name;
  3. -- 刪除private型別的dblink,只有建立者自己能刪
  4. DROP DATABASE LINK dblink_name;
好,接下來講 expdp 使用dblink 的用法:

如果我們要使用expdp ,然後要像實現exp一樣,把這個dmp檔案,給它倒到本地,那麼我們應該怎麼實現呢。。。。。。?

我們可以用連線 dblink的方法來匯出
:也就是說我們要用到兩個庫:

例子:我們可以從遠端資料庫倒入到本地資料庫。。。。
1 我們首先要在本地資料庫建立一個dblink

連線到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
再本地資料庫建立一個dblink :
SQL> create public database link dl_OCPLYZ1 connect to lyz identified by lyz  us
ing 'OCPLYZ1';

資料庫連結已建立。
SQL>

'OCPLYZ1' 這邊的 OCPLYZ1我已經再 tnsnames.ora 那邊配好了:

我們可以簡單的遠端檢查下資料庫能不能通:查得到說明建立成功

點選(此處)摺疊或開啟

  1. SQL> select count(1) from lyz.EMPLOYEES2@dl_OCPLYZ1;

  2.   COUNT(1)
  3. ----------
  4.          4
  5. SQL>
2 接下來我們來進行匯出操作。。。。
我們可以在 client 端或目標資料庫執行。。。。
我們這邊是直接在本地執行:
我們可以先查下本地ip 是多少:ipconfig:查得ip 172.17.146.3 ,但由於本地資料庫是直接安裝再win 7電腦上的,所以我本地就是目標資料庫啦。。。。
倒出命令如下:這邊說明下:這邊的倒出是基於 表的倒出。。。。。

點選(此處)摺疊或開啟

  1. expdp scott/tiger@172.17.146.3/orcl directory=DATA_PUMP_DIR dumpfile=exptable.dmp TABLES=lyz.TESTA network_link=dl_OCPLYZ1 LOGFILE=expdp_table.log;
解釋如下:
這邊的 expdp 倒出一定是要本地的資料庫,也就是目標資料庫的使用者 和服務名
  1. expdp scott/tiger@172.17.146.3/orcl
這邊我 dblink 的使用者是遠端資料庫,對應的使用者是 lyz
  1. network_link=dl_OCPLYZ1
由於我本地資料庫和遠端資料庫的使用者不一致,所以我們這邊要加個字首:lyz.xxt ,否則 資料庫認不處你是來自哪裡的表


  1. TABLES=lyz.TESTA
然後會如下錯誤:找不到scott.testa,


也就是說,如果不加 使用者來源:lyz.testa 表,資料庫應該是預設成你這個
  1. TABLES=TESTA
就是來自 scott表的,而scott表沒有這個表,當然就報錯了。。。我之前就是因為沒寫這個,所以一直報這個錯,,,,

當然如果你目標庫(本地資料庫)有這個lyz 這個使用者,我們也可以這樣寫:

點選(此處)摺疊或開啟

  1. expdp lyz/lyz@172.17.146.3/orcl directory=DATA_PUMP_DIR dumpfile=exptable.dmp TABLES=TESTA network_link=dl_OCPLYZ1 LOGFILE=expdp_table.log;
這樣也沒問題:


然後我們可以到本地看下結果: 這個 exptable.dmp 檔案就是從 遠端資料庫倒下來的資料來。。。。。





然後我們再倒入到庫就可以 了:這邊要倒入的資料庫為:oracl

由於上面的是基於表的匯出,我們可以用下面這個命令:


impdp scott/tiger@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=exptable.dmp TABLES=lyz.TESTA REMAP_SCHEMA=lyz:scott table_exists_action=REPLACE


這邊的意思是:impdp 倒入到 oracl庫下的使用者,倒入的路徑為DATA_PUMP_DIR,倒入的dmp 檔案為:exptable.dmp ,倒入的表為:TABLES=lyz.TESTA REMAP_SCHEMA=lyz:scott  這邊的意思是  lyz使用者到scott使用者,table_exists_action=REPLACE  這邊的意思是:如果表存在,就直接替換掉。

或者是基於使用者的倒入:去掉這個TABLES=lyz.TESTA,但是也是 lyz 使用者到 scott使用者

impdp scott/tiger@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=exptable.dmp   REMAP_SCHEMA=lyz:scott table_exists_action=REPLACE



好了,這個就是 利用 db_link 的expdp 、impdp的匯出匯入。。。。。。。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-2156821/,如需轉載,請註明出處,否則將追究法律責任。

相關文章