oracle 高級復制同步表數據

jopen 12年前發布 | 77K 次閱讀 Oracle 數據庫服務器
oracle 高級復制同步數據
      oracle我不是很熟,但現被安排要做個2臺數據庫表同步復制,不懂,只能從開始研究,制作。如果你和我一樣,看了我的制作過程,一定給你很大的幫助。廢話不說了,開始.......google....次數已經記不清楚了,可以用天衡量了,大概時斷時續一周。。汗死。。。。。在此,非常感謝那些發表文章的人,通過看過很多人的文章,我才能基本完成,感謝!
    概述
在Internet上運作數據庫經常會有這樣的需求:把遍布全國各城市相似的數據庫應用統一起來,一個節點的數據改變不僅體現在本地,還反映到遠端。復制技術給用戶提供了一種快速訪問共享數據的辦法。
前提條件
要準備2臺測試用的機器,開始制作如下:
2臺機器安裝oracle10g,注意我的版本相同。
SID都是music1
1:安裝及運行vnc。。。用于遠程安裝oracle
2:安裝及運行 oracle10.2....
完成以上步驟后,基本工作就算做完了,現在開始配置高級復制。
假設數據庫機器為 數據庫機器A ...數據庫機器B...
數據庫機器A地址為;192.168.1.205
SID:music1
域名:master.anymusic.com
數據庫機器B地址為;192.168.1.226
SID:music1
域名:salse.anymusic.com
首先配置確認倆臺機器可以互相訪問,如下:
機器A操作:
用oracle登陸
修改如下文件;
vi tnsnames.ora
添加:
MUSIC226 =        這個名稱隨便起
  (DE.ION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.226)(PORT = 1521))    這里為機器B的地址及數據庫端口號
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = music1)    這個名稱為機器B 數據庫SID的值
    )
  )
配置完重起數據庫
機器B操作:
用oracle登陸
同樣修改如下文件;
vi tnsnames.ora
添加:
MUSIC205 =        這個名稱隨便起
  (DE.ION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.205)(PORT = 1522))    這里為機器A的地址及數據庫端口號
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = music1)    這個名稱為機器A 數據庫SID的值
    )
  )
重起數據庫
測試數據庫連通性,在機器A如下;
[oracle @localhost admin]$ tnsping music226
顯示如下;
TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production . 04-JAN-2009 16:53:23
Copyright (c) 1997, 2005, Oracle.  All rights reserved.
Used parameter files:
/home/oracle/oracle/product/10.2.0/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DE.ION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.226)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = music1)))
OK (10 msec)
 
測試數據庫連通性,在機器B如下;
[oracle @localhost admin]$ tnsping music205
顯示;
TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production . 04-JAN-2009 17:09:04
Copyright (c) 1997, 2005, Oracle.  All rights reserved.
Used parameter files:
/home/oracle/oracle/product/10.2.0/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DE.ION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.205)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = music1)))
OK (0 msec)
注意:這里我的2臺機器沒有加防火墻等其他安全措施,數據庫也沒有設置限制地址登陸。如果你連接不上,就仔細看看自己的其他配置。
接著在機器A操作如下:
察看v$option,Advanced replication為TRUE,則支持高級復制功能;否則不支持
select * from v$option;
以上察看結果默認為ture,支持高級復制。
察看global_name參數
SQL> show parameter global_name;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE
看過大多數文章都將這里要設置成true,我沒有改動,默認false使用,

察看默認global_name,數據庫域名
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
MUSIC1.REGRESS.RDBMS.DEV.US.ORACLE.COM
修改global_name,數據庫域名
SQL> alter database rename global_name to master.anymusic.com;
察看修改結果;
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
MASTER.ANYMUSIC.COM
創建帳戶及數據:
SQL> create user wcms identified by abc123 default tablespace users;
SQL>grant connect,resource to wcms;
切換到wcms,
SQL> conn wcms/abc123
創建表
SQL> create table test(id number,name varchar2(20),constraint test_id_pk primary key(id));   (主鍵一定是要的);
插入數據
SQL> insert into test values(1,'abc');
SQL> insert into test values(2,'def');
建立管理數據庫復制的用戶repadmin,并賦權。
SQL> create user repadmin identified by repadmin default tablespace users temporary tablespace temp;
SQL> execute dbms_defer_sys.register_propagator('repadmin');
SQL> grant execute any procedure to repadmin;
SQL> execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
SQL> execute dbms_repcat_admin.grant_admin_any_schema(username => 'repadmin');
SQL> grant comment any table to repadmin;
SQL> grant lock any table to repadmin;
SQL> grant select any dictionary to repadmin;
用repadmin 創建database link 連接
SQL> conn repadmin/repadmin
SQL> create database link "salse.anymusic.com" connect to repadmin identified by repadmin using 'music226';
說明一下;salse.anymusic.com為我修改global_name的值
music226 :是以上tnsnames.ora中我設定連接機器B數據庫的值
察看一下:SQL> select owner,db_link,host from all_db_links;
OWNER         DB_LINK                                 HOST  
REPADMIN  SALSE.ANYMUSIC.COM    music226

在機器B操作如下;
察看v$option,Advanced replication為TRUE,則支持高級復制功能;否則不支持
select * from v$option;
以上察看結果默認為ture,支持高級復制。
察看global_name參數
SQL> show parameter global_name;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                     boolean     FALSE
察看默認global_name,數據庫域名
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
MUSIC1.REGRESS.RDBMS.DEV.US.ORACLE.COM
修改global_name,數據庫域名
SQL> alter database rename global_name to salse.anymusic.com;
察看修改結果;
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
SALSE.ANYMUSIC.COM
創建帳戶及數據:
SQL> create user wcms identified by abc123 default tablespace users;
SQL>grant connect,resource to wcms;
切換到wcms,
SQL> conn wcms/abc123
創建表
SQL> create table test(id number,name varchar2(20),constraint test_id_pk primary key(id));   (主鍵一定是要的);
插入數據
SQL> insert into test values(1,'zhao');
SQL> insert into test values(2,'yong');
配置復制管理用戶
SQL> create user repadmin identified by repadmin default tablespace users;
建立管理數據庫復制的用戶repadmin,并賦權。
SQL> create user repadmin identified by repadmin default tablespace users temporary tablespace temp;
SQL> execute dbms_defer_sys.register_propagator('repadmin');
SQL> grant execute any procedure to repadmin;
SQL> execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
SQL> execute dbms_repcat_admin.grant_admin_any_schema(username => 'repadmin');
SQL> grant comment any table to repadmin;
SQL> grant lock any table to repadmin;
SQL> grant select any dictionary to repadmin;
用repadmin 創建database link 連接
SQL> create database link "master.anymusic.com" connect to repadmin identified by repadmin using 'music205';
說明一下;master.anymusic.com為我修改global_name的值
music205 :是以上tnsnames.ora中我設定連接機器A數據庫的值
察看一下:SQL> select owner,db_link,host from all_db_links;
SQL> select owner,db_link,host from all_db_links;
OWNER            DB_LINK                                      HOST
--------------------------------------------------------------------------------
REPADMIN     MASTER.ANYMUSIC.COM     music205
測試開始
登陸機器A
測試數據庫鏈接:
SQL> select * from global_name@salse.anymusic.com;
顯示:
GLOBAL_NAME
--------------------------------------------------------------------------------
SALSE.ANYMUSIC.COM
表示數據庫到此連接成功
登陸機器B
測試數據庫鏈接:
SQL> select * from global_name@master.anymusic.com;
顯示:
GLOBAL_NAME
--------------------------------------------------------------------------------
MASTER.ANYMUSIC.COM
表示數據庫到此連接成功。
登陸數據庫機器A
開始復制實施進程,在主數據庫執行
用repadmin 登陸數據庫
創建主復制組rep_anymusic,此名可以任意命名
SQL> execute dbms_repcat.create_master_repgroup('REP_anymusic');
察看復制主體組相關信息:
SQL> select gname,master,status from dba_repgroup
GNAME                          M    STATUS
------------------------------ - ---------
REP_ANYMUSIC          Y    QUIESCED
QUIESCED表示主體組未開始運行。
在主體組中添加復制對象
SQL> execute dbms_repcat.create_master_repobject (sname=>'wcms',oname=>'test', type=>'TABLE',  use_existing_object=>true,gname=>'REP_anymusic',copy_rows=>true);
sname 實現數據庫復制的用戶名稱
oname 實現數據庫復制的數據庫對象名稱
type 實現數據庫復制的數據庫對象類別。(支持的類別:表,索引,同義詞,觸發器,視圖,過程,函數,程序包,程序包體)
use_existing_object true表示用主復制節點已經存在的數據庫對象
gname 主復制組名
copy_rows true表示第一次開始復制時和主復制節點保持一致
察看復制主體組中復制對象的相關信息:
SQL>select sname,oname,status,gname from dba_repobject
SNAME         ONAME        STATUS         GNAME
------------------------------
WCMS           TEST             VALID             REP_ANYMUSIC
為復制對象生成復制支持:
SQL> execute dbms_repcat.generate_replication_support('wcms','test','TABLE');
(說明:產生支持wcms用戶下test表復制的數據庫觸發器和程序包)
再次察看對應的復制對象的相關信息:
SQL> select sname,oname,status,gname from dba_repobject
SNAME           ONAME              STATUS           GNAME
------------------------------
WCMS             TEST                    VALID              REP_ANYMUSIC
WCMS             TEST$RP             VALID              REP_ANYMUSIC
WCMS             TEST$RP             VALID              REP_ANYMUSIC
為復制主體組添加數據庫主站點:
SQL>execute dbms_repcat.add_master_database(gname=>'REP_anymusic',master=>'salse.anymusic.com',
use_existing_objects=>true,copy_rows=>true,  propagation_mode => 'synchronous');
gname 主復制組名
master 加入主復制節點的另一個數據庫
use_existing_object true表示用主復制節點已經存在的數據庫對象
copy_rows false表示第一次開始復制時不用和主復制節點保持一致
propagation_mode 異步地執行
察看復制站點信息:
SQL> select gname,dblink,masterdef,master from dba_repsites
GNAME                       DBLINK                                          M M
REP_ANYMUSIC      MASTER.ANYMUSIC.COM      Y   Y
REP_ANYMUSIC      SALSE.ANYMUSIC.COM           N   Y
啟動復制進程:
SQL> execute dbms_repcat.resume_master_activity('REP_anymusic',true);
再次察看復制主體組相關信息:
SQL> select gname,master,status from dba_repgroup
GNAME                          M     STATUS
------------------------------ - ---------
REP_ANYMUSIC          Y      NORMAL
確認復制的任務隊列已經加入數據庫的數據字典
SQL>select job,log_user,this_date,next_date,next_sec,broken,failures,what from user_jobs;
 JOB LOG_USER THIS_DATE NEXT_DATE
 NEXT_SEC B FAILURES WHAT
 21    REPADMIN                     05-JAN-09 
14:23:42    N  0  dbms_repcat.do_deferred_repcat_admin('"REP_ANYMUSIC"', FALSE);
注釋:job:表示當前此工作的標示號
log_user: 表示當前工作的操作者
this_date:表示當前工作是否正在工作,空為空閑。
next_date:表示此工作下次執行日期
next_sec:表示此工作下次執行時間
broken:表示工作是否被掛起
failures:表示工作失敗次數
what: 應該是工作執行語句
注意:復制主體組的狀態由QUIESCED變為NORMAL。停頓(quiesced )正常(normal)
這里在以repadmin登陸機器B,察看結果如下就表示正確
SQL>select job,log_user,this_date,next_date,next_sec,broken,failures,what from user_jobs;
JOB LOG_USER    THIS_DATE NEXT_DATE NEXT_SEC B FAILURES WHAT
21 REPADMIN              05-JAN-09 14:52:04 N 0  dbms_repcat.do_deferred_repcat_admin('"REP_ANYMUSIC"', FALSE);
至此,這個復制過程實施完畢。可以進行相關的數據操作進行測試
開始測試:
用wcms登陸機器A數據庫
插入表test中數據
SQL> insert into test values(4,'aaaaaaaa');
察看結果
SQL> select * from test;
        ID NAME
---------- --------------------
         4 aaaaaaaa
用wcms登陸機器B數據庫
察看表test中數據,因為我以上只對表test作了數據同步工作
SQL> select * from test;
        ID NAME
---------- --------------------
         4 aaaaaaaa
如果沒有看到同步的數據,那就多等會,再看。
由于以上只同步一張表,在現有組中再次插入同步的表,
以wcms 登陸數據庫,在機器A中創建表
SQL> create table aa(id number,name varchar2(20),constraint aa_id_pk primary key(id));
接著插入數據
SQL> insert into aa values(1,'abc');
以repadmin登陸數據庫
 
接下來添加新表然后執行同步操作
SQL> execute dbms_repcat.suspend_master_activity('rep_anymusic');
取消抑制。停止主體組
SQL> execute dbms_repcat.create_master_repobject(sname=>'wcms',oname=>'aa',type=>'TABLE',use_existing_object=>true,gname=>'REP_anymusic',copy_rows=>true);
為組增加新表。
SQL>execute dbms_repcat.generate_replication_support('wcms','aa','TABLE')
增加支持。
SQL>execute dbms_repcat.resume_master_activity('REP_anymusic',true);
啟動進程
用wcms帳戶登陸機器B,
SQL> select * from aa;
        ID NAME
---------- --------------------
         1 abc
登陸機器A
創建復制數據庫的時間表,作用是將倆個數據庫添加到主體組的表同步,包括,添加,刪除,創建 新表及表中數據。以上作用說明我是個人認為。如果你清楚以下push任務具體作用,請告訴我。。
添加PUSH任務
SQL> begin
  2 dbms_defer_sys.schedule_push(
  3 destination=>'SALSE.ANYMUSIC.COM',
  4 interval=>'sysdate + 10/1440', 一天每10分鐘運行一次
  5 next_date=>sysdate, 下一次運行時間為當前時間
  6 delay_seconds=>50, 延遲秒數50
  7 parallelism=>1);
  8 end;
  9 /
如果出現以下類似錯誤,那就注意仔細看看語法是否正確,我出現這個錯誤是,第3行,第4行 沒有加單引號出的錯。哈哈
ERROR at line 3:
ORA-06550: line 3, column 16:
PLS-00201: identifier 'SALSE.ANYMUSIC' must be declared
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
ERROR at line 1:
ORA-23319: parameter value "07-JAN-09" is not appropriate
ORA-06512: at "SYS.DBMS_DEFER_SYS", line 2346
ORA-01403: no data found
ORA-06512: at line 2
添加PURGE任務
SQL> begin
  2  dbms_defer_sys.schedule_purge (
  3  next_date => sysdate,
  4  interval => 'sysdate + 10/1440',
  5  delay_seconds => 0);
###  6  rollback_segment =>0);
  7  end;
  8  /
SQL> select job,what from user_jobs;
JOB WHAT
 21 dbms_repcat.do_deferred_repcat_admin('"REP_ANYMUSIC"', FALSE);
 41 declare rc binary_integer; begin rc := sys.dbms_defer_sys.push(destination=>'SALSE.ANYMUSIC.COM'); end;
 42 declare rc binary_integer; begin rc := sys.dbms_defer_sys.purge( delay_seconds=>0, rollback_segment=>'0'); end;
登陸機器B:
用repadmin登陸數據庫,同樣添加以下代碼
SQL> begin
  2  dbms_defer_sys.schedule_push(
  3  destination=>'master.anymusic.com',
  4  interval=>'sysdate + 10/1440',
  5  next_date=>sysdate,
  6 delay_seconds=>50, 延遲秒數50
  7 parallelism=>1);
  8 end;
  9 /
SQL> begin
  2  dbms_defer_sys.schedule_purge (
  3  next_date => sysdate,
  4  interval => 'sysdate + 10/1440',
  5  delay_seconds => 0);
###  6  rollback_segment =>0);
  7  end;
  8  / 
SQL> select job,what from user_jobs;
       JOB WHAT
--------------------------------------------------------------------------------
        21 dbms_repcat.do_deferred_repcat_admin('"REP_ANYMUSIC"', FALSE);
        41 declare rc binary_integer; begin rc := sys.dbms_defer_sys.push(destination=>'MASTER.ANYMUSIC.COM'); end;
        42 declare rc binary_integer; begin rc := sys.dbms_defer_sys.purge( delay_seconds=>0, rollback_segment=>'0'); end;
 
OK!!!!至此完成同步復制操作,以下是一些實用命令,呵呵呵。。如果以上有哪里不對,請給于指明。。。。。。。
#######################################
用select * from dba_repgroup;檢查站點狀態 狀態為NORMAL時表示該站點正常。
相關視圖
" DBA_REPSITES      ----復制站點情況
" DBA_REPGROUP      -----復制組情況
" DBA_REPOBJECT     ----復制對象情況
" DBA_REPCATLOG     ---同步情況日志
######################################
如果想刪除其中的一個同步表,如下執行;
SQL> execute dbms_repcat.suspend_master_activity('rep_anymusic'); 停止主體組
SQL> EXECUTE Dbms_Repcat.Drop_Master_Repobject('wcms','test','table'); 刪除同步表
SQL> EXECUTE Dbms_Repcat.Remove_Master_Databases('rep_anymusic', 'master.anymusic.com');刪除主站點上面的組
SQL> execute dbms_repcat.resume_master_activity('REP_anymusic',true); 啟動復制組
######################################
刪除私有數據鏈路
用repadmin 登陸數據庫
EXECUTE Dbms_Repcat.Drop_Master_Repgroup('主體組名');刪除主體組
DROP DATABASE LINK master.anymusic.com; 刪除db link名
刪除jobs
select job,what from user_jobs;   查詢job numbers
EXECUTE Dbms_Job.Remove(2);       括號內填寫剛查詢到的job numbers
######################################
刪除REPADMIN用戶,注意:必須先刪除站點下隸屬于該repadmin用戶的jobs和組mygrp 才能刪除用戶
用sys登陸
EXECUTE Dbms_Defer_Sys.Unregister_Propagator(username=>'REPADMIN');
EXECUTE Dbms_Repcat_Admin.Revoke_Admin_Any_Schema(username=>'REPADMIN');
DROP USER repadmin CASCADE;
######################################
--刪除公用的數據鏈路
用sys登陸
DROP PUBLIC DATABASE LINK master.anymusic.com;
######################################
備注:每次運行完repcat 包以后都應該執行一次commit,因為某些rep 的存儲過程是不會
自動commit 的,同時這也是一個troubleshooting,一般的rep 腳本都會較快的返回結果,
如果一條命令之后長時間沒有結果返回,那么很可能是上面的命令沒有commit,取消掉當
前的命令,然后作一次commit,再重新執行,一般都能夠解決問題。
#######################################
強制刪除復制組
Sql>Truncate table system.def$_aqcall;
Sql>Exec dbms_repcat.drop_master_repgroup(gname=>'mygrp',all_sites=>true);
########################################
 
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!