利用DB Link實現資料庫間的表同步

Michael_DD發表於2014-10-30
利用DB Link實現資料庫間的表同步

######################################
使用create Database link語句建立資料庫連結。資料庫連結是本地資料庫中的模式物件,利用它可以訪問遠端資料庫的物件。遠端資料庫不必是Oracle系統。

一旦建立了資料庫連結,就可以用它來引用遠端資料庫上的表和檢視。在表或檢視名後附加@[dblink],就可以在SQL語句中引用遠端表或檢視。
用select語句可以查詢遠端表或檢視。如果正以分散式選項使用Oracle,還可以使用任何insert、update、delete或lock table語句訪問遠端表或檢視。


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1  檢視dblink

SQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';
OWNER
------------------------------
OBJECT_NAME
-----------------------------------------------------------------------
PUBLIC
DBLINK1

PUBLIC
DBLINK2

PUBLIC
DBLINK3

或者
select * from dba_db_links;
#######################################

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
建立dblink
前提:

建立dblink的使用者有對應的資料庫許可權
create public database link 或者create database link
可以使用
grant create public database link,create database link to myAccount;
來授權.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
如果在create之後不加public,則建立的dblink就不是公共的,就只有建立者可以使用了.
補充:
如何確定目標資料庫的servicename:
a.在sqlplus中使用
show parameter[s] service_names;
注意parameter和parameters都可以
b.或者
SQL> select name,value from v$parameter where name='service_names';

NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
service_names
testdb
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
 
    
**********************************************************************************
2  建立dblink
語法

  CREATE [SHARED][PUBLIC] DATABASE LINK dblink

  CONNECT TO [username IDENTIFIED BY password authenticated_clause|| CURRENT_USER]

  USING ‘connectstring’

關鍵字和引數

  shared:指定shared使用一個單獨的網路連線建立可被多個使用者共享的公用資料庫連結。

  public:建立可被全體使用者使用的公用資料庫連結。若省略該子句,資料庫連結為私有的,只能由建立者使用。

  dblink:指定資料庫連結的完整名或部分名。GLOBAL_NAMES初始化引數決定資料庫連結是否必須具有與該連結相連的資料庫的相同的名字。

    在一個會話或真正的應用叢集配置中的一個例項可以開啟的資料庫連結的最大數量,取決於初始化引數OPEN_LINKS和OPEN_LINKS_PER_INSTANCE的值。

  限定:不能在其他使用者的模式中建立資料庫連結,不能用模式名限定dblink(在資料庫連結名中允許有“.”字元,所以Oracle將全名,如RALPH.LINKTOSALES,
          解釋為你的模式中的資料庫連結名,而不是RALPH模式中的LINKTOSALES資料庫連結。

  connect to子句:connect to子句允許啟用對遠端資料庫的連線。

  CURRENT_USER子句:使用CURRENT_USER建立當前使用者的資料庫連結。為使連結成功,當前使用者必須是在遠端資料庫上具有有效賬戶的全域性使用者。

  若直接使用資料庫連結(即不是從儲存物件中使用),當前使用者即為被連線的使用者。

  當執行儲存物件(如過程、檢視或觸發器)啟用資料庫連結時,CURRENT_USER是擁有儲存物件的使用者名稱,而不是呼叫物件的使用者名稱。例如,若資料庫連結出現在過程SCOTT.P(由SCOTT建立)內部並且使用者JANE呼叫過程SCOTT.P,當前使用者是SCOTT。

  但是,若儲存物件是一個呼叫方權利(invoker-right)函式、過程或包,呼叫方的授權ID用於連線作為遠端使用者。例如,資料庫連結出現在過程SCOTT.P(由SCOTT建立的呼叫方權利過程)的內部,使用者JANE呼叫該過程,那麼CURRENT_USER是JANE並且用JANE的許可權執行該過程。

  user IDENTIFIED BY password:是使用固定使用者資料庫連結連線遠端資料庫的使用者名稱和口令。若省略該子句,資料庫連結使用連線到資料庫的每個的使用者的名字和口令(這稱為連線的使用者資料庫連結)。

  authenticated_clause:指定目標例項上的使用者名稱和口令。該子句在遠端伺服器驗證使用者,是安全性所必須的。指定的使用者名稱和口令必須是遠端例項上的有效使用者名稱和口令。使用者名稱和口令只用於驗證。其他操作不以該使用者的名義執行。

   使用SHARED子句時必須指定該子句。

  USING 'connect string':指定遠端資料庫的服務名。


example:

create public database link dblink1
 connect to sales identified by sales
 using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = heksales)
    )
  )';


host=資料庫的ip地址

service_name=資料庫的ssid。

資料庫連線字串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA裡定義

資料庫全域性名稱可以用以下命令查出

  SELECT * FROM GLOBAL_NAME;

 

需要DB支援Advanced replication(高階複製)功能,是否支援,可用如下SQL檢視:
SQL> select * from v$option where PARAMETER='Advanced replication';

PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
Advanced replication
TRUE
SQL>
如果是返回True就表示支援。

檢視Global_name引數是true還是False
SQL> show parameter global_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE
SQL>
該引數為true時,在本地建立的DBLINK的名稱必須和遠端的Global_name一致才行。


create public database link dblink1
connect to GGSYNC identified by "123456"
 using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = testdb)
    )
  )';
insert into GGSYNC.GG_SYNC_TESTDB select * from GGSYNC.GG_SYNC_TESTDB@dblink1;


create public database link dblink2
connect to test1 identified by "123456"
 using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = testdb)
    )
  )';

create public database link dblink3
connect to test2 identified by "123456"
 using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = testdb)
    )
  )';

insert into test1.t1 select * from test1.t1@dblink2;
insert into test1.t2 select * from test1.t1@dblink2;
insert into test2.t1 select * from test2.t1@dblink3;
insert into test2.t2 select * from test2.t1@dblink3;

 
**********************************************************************************
3  使用db link
    例如,在本機資料庫上建立了一個scott_rmthost的public dblink(使用遠端主機的scott使用者連線),則用sqlplus連線到本機資料庫,
    執行select * from scott.emp@scott_rmthot即可以將遠端資料庫上的scott使用者下的emp表中的資料獲取到.

    也可以在本地建一個同義詞來指向scott.emp@scott_rmthost,這樣取值就方便多了.

    可建立同義詞省略@dblink字尾

  CREATE SYNONYM 同義詞名FOR 表名;

  CREATE SYNONYM 同義詞名FOR 表名@資料庫連結名;
*********************************************************************************

*********************************************************************************
4  刪除
注意:使用者有create public database link 或者create database link 許可權.
drop public database link dblinkname;
*********************************************************************************

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

相關文章