熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

在Oracle中實現數據庫的復制

2013-11-13 15:29:56  來源: Oracle 

  在Internet上運作數據庫經常會有這樣的需求把遍布全國各城市相似的數據庫應用統一起來一個節點的數據改變不僅體現在本地還反映到遠端復制技術給用戶提供了一種快速訪問共享數據的辦法
  一實現數據庫復制的前提條件
  數據庫支持高級復制功能
  您可以用system身份登錄數據庫查看v$option視圖如果其中Advanced replication為TRUE則支持高級復制功能否則不支持
  數據庫初始化參數要求
  ①db_domain =
  指明數據庫的域名(默認的是WORLD)這裡可以用您公司的域名
  ②global_names = true
  它要求數據庫鏈接(database link)和被連接的數據庫名稱一致
  現在全局數據庫名db_name++db_domain
  ③有跟數據庫job執行有關的參數
  job_queue_processes =
  job_queue_interval =
  distributed_transactions =
  open_links =  
  第一行定義SNP進程的啟動個數為n系統缺省值為正常定義范圍為根據任務的多少可以配置不同的數值 
  第二行定義系統每隔N秒喚醒該進程一次系統缺省值為正常范圍為事實上該進程執行完當前任務後就進入睡眠狀態睡眠一段時間後由系統的總控負責將其喚醒 
  如果修改了以上這幾個參數需要重新啟動數據庫以使參數生效
  二實現數據庫同步復制的步驟
  假設在Internet上我們有兩個數據庫一個叫深圳(shenzhen)一個叫北京(beijing)
  具體配置見下表
   
  確認兩台數據庫之間可以互相訪問在tnsnamesora裡設置數據庫連接字符串
  ①例如深圳這邊的數據庫連接字符串是以下的格式
  beijing =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = ))
  )
  (CONNECT_DATA =
  (SERVICE_NAME = beijing)
  )
  ) 
  運行$tnsping beijing 
  出現以下提示符
  Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=))
  OK(n毫秒) 
  表明深圳數據庫可以訪問北京數據庫
  ②在北京那邊也同樣配置確認$tnsping shenzhen 是通的
  改數據庫全局名稱建公共的數據庫鏈接
  ①用system身份登錄shenzhen數據庫
  SQL>alter database rename global_name to cn;
  用system身份登錄beijing數據庫
  SQL>alter database rename global_name to ;
  ②用system身份登錄shenzhen數據庫
  SQL>create public database link using beijing;
  測試數據庫全局名稱和公共的數據庫鏈接
  SQL>select * from global_ncn;
  返回結果為就對了
  用system身份登錄beijing數據庫
  SQL>create public database link cn using shenzhen;
  測試數據庫全局名稱和公共的數據庫鏈接
  SQL>select * from global_nacn;
  返回結果為cn就對了
  建立管理數據庫復制的用戶repadmin並賦權
  ①用system身份登錄shenzhen數據庫
  SQL>create user repadmin identified by repadmin default tablespace users temporary tablespace temp;
  SQL>execute dbms_defer_sysregister_propagator(repadmin);
  SQL>grant execute any procedure to repadmin;
  SQL>execute dbms_repcat_admingrant_admin_any_repgroup(repadmin);
  SQL>grant comment any table to repadmin;
  SQL>grant lock any table to repadmin;
  ②同樣用system身份登錄beijing數據庫運行以上的命令管理數據庫復制的用戶repadmin並賦權
  說明repadmin用戶名和密碼可以根據用戶的需求自由命名
  在數據庫復制的用戶repadmin下創建私有的數據庫鏈接
  ①用repadmin身份登錄shenzhen數據庫
  SQL>create database link connect to repadmin identified by repadmin;
  測試這個私有的數據庫鏈接
  SQL>select * from global_ncn;
  返回結果為就對了
  ②用repadmin身份登錄beijing數據庫
  SQL>create database link cn connect to repadmin identified by repadmin;
  測試這個私有的數據庫鏈接
  SQL>select * from global_nacn;
  返回結果為cn就對了
  創建或選擇實現數據庫復制的用戶和對象給用戶賦權數據庫對象必須有主關鍵字
  假設我們用ORACLE裡舉例用的scott用戶dept表
  ①用internal身份登錄shenzhen數據庫創建scott用戶並賦權
  SQL>create user scott identified by tiger default tablespace users temporary tablespace temp;
  SQL>grant connect resource to scott;
  SQL>grant execute on sysdbms_defer to scott;
  ②用scott身份登錄shenzhen數據庫創建表dept
  SQL>create table dept
  (deptno number() primary key dname varchar()
  loc varchar() );
  ③如果數據庫對象沒有主關鍵字可以運行以下SQL命令添加
  SQL>alter table dept add (constraint dept_deptno_pk primary key (deptno));
  ④在shenzhen數據庫scott用戶下創建主關鍵字的序列號范圍避免和beijing的沖突
  SQL> create sequence dept_no increment by start with maxvalue cycle nocache;
  (說明maxvalue 可以根據應用程序及表結構主關鍵字定義的位數需要而定)
  ⑤在shenzhen數據庫scott用戶下插入初始化數據
  SQL>insert into dept values (dept_nonextvalaccountingnew york);
  SQL>insert into dept values (dept_nonextvalresearchdallas);
  SQL>commit;
  ⑥在beijing數據庫那邊同樣運行以上①
  ⑦在beijing數據庫scott用戶下創建主關鍵字的序列號范圍避免和shenzhen的沖突
  SQL> create sequence dept_no increment by start with maxvalue cycle nocache;
  ⑧在beijing數據庫scott用戶下插入初始化數據
  SQL>insert into dept values (dept_nonextvalsaleschicago);
  SQL>insert into dept values (dept_nonextvaloperationsboston);
  SQL>commit;
  創建要復制的組scott_mg加入數據庫對象產生對象的復制支持
  ①用repadmin身份登錄shenzhen數據庫創建主復制組scott_mg
  SQL> execute dbms_repcatcreate_master_repgroup(scott_mg);
  說明scott_mg組名可以根據用戶的需求自由命名
  ②在復制組scott_mg裡加入數據庫對象
  SQL>execute dbms_repcatcreate_master_repobject(sname=>scottoname=>dept type=>tableuse_existing_object=>truegname=>scott_mg);
  參數說明
  sname 實現數據庫復制的用戶名稱
  oname 實現數據庫復制的數據庫對象名稱
  (表名長度在個字節內程序包名長度在個字節內)
  type 實現數據庫復制的數據庫對象類別
  (支持的類別索引同義詞觸發器視圖過程函數程序包程序包體)
  use_existing_object true表示用主復制節點已經存在的數據庫對象
  gname 主復制組名
  ③對數據庫對象產生復制支持
  SQL>execute dbms_repcatgenerate_replication_support(scottdepttable);
  (說明產生支持scott用戶下dept表復制的數據庫觸發器和程序包)
  ④確認復制的組和對象已經加入數據庫的數據字典
  SQL>select gname master status from dba_repgroup; 
  SQL>select * from dba_repobject;
  創建主復制節點
  ①用repadmin身份登錄shenzhen數據庫創建主復制節點
  SQL>execute dbms_repcatadd_master_database 
  (gname=>scott_mgmaster=>use_existing_objects=>true copy_rows=>false propagation_mode => asynchronous);
  參數說明
  gname 主復制組名
  master 加入主復制節點的另一個數據庫
  use_existing_object true表示用主復制節點已經存在的數據庫對象
  copy_rows false表示第一次開始復制時不用和主復制節點保持一致
  propagation_mode 異步地執行
  ②確認復制的任務隊列已經加入數據庫的數據字典
  SQL>select * from user_jobs;
  使同步組的狀態由停頓(quiesced )改為正常(normal)
  ①用repadmin身份登錄shenzhen數據庫運行以下命令
  SQL> execute dbms_repcatresume_master_activity(scott_mgfalse);
  ②確認同步組的狀態為正常(normal)
  SQL> select gname master status from dba_repgroup;
  ③如果這個①命令不能使同步組的狀態為正常(normal)可能有一些停頓的復制運行以下
From:http://tw.wingwit.com/Article/program/Oracle/201311/16816.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.