<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    想飛就別怕摔

    大爺的并TM罵人

    [轉]oracle數據庫同步技術

    oracle數據庫同步技術

    高級復制
    什么是復制?簡單地說復制就是在由兩個或者多個數據庫系統構成的一個分布式數據庫環境中拷貝數據的過程。
           高級復制,是在組成分布式數據庫系統的多個數據庫中復制和維護數據庫對象的過程。 Oracle 高級復制允許應用程序更新數據庫的任何副本,并將這些更改自動傳遞到其他數據庫,同時確保全局事務處理的一致性和數據完整性。
           同步復制,復制數據在任何時間在任何復制節點均保持一致。如果復制環境中的任何一個節點的復制數據發生了更新操作,這種變化會立刻反映到其他所有的復制節點。這種技術適用于那些對于實時性要求較高的商業應用中。
           異步復制,所有復制節點的數據在一定時間內是不同步的。如果復制環境中的其中的一個節點的復制數據發生了更新操作,這種改變將在不同的事務中被傳播和應用到其他所有復制節點。這些不同的事務間可以間隔幾秒,幾分種,幾小時,也可以是幾天之后。復制節點之間的數據臨時是不同步的,但傳播最終將保證所有復制節點間的數據一致。
    一、實現數據庫復制的前提條件  
    1、數據庫支持高級復制功能  
    您可以用system身份登錄數據庫,查看v$option視圖,如果其中Advanced replication為TRUE,則支持高級復制功能;否則不支持。  
    2、數據庫初始化參數要求  
    ①、db_domain = test.com.cn  
    指明數據庫的域名(默認的是WORLD),這里可以用您公司的域名。  
    ②、global_names = true  
    它要求數據庫鏈接(database link)和被連接的數據庫名稱一致。  
    現在全局數據庫名:db_name+”.”+db_domain  
    ③、有跟數據庫job執行有關的參數  
    job_queue_processes = 1  
    job_queue_interval = 60  
    distributed_transactions = 10  
    open_links = 4  
    第一行定義SNP進程的啟動個數為n。系統缺省值為0,正常定義范圍為0~36,根據任務的多少,可以配置不同的數值。  
    第二行定義系統每隔N秒喚醒該進程一次。系統缺省值為60秒,正常范圍為1~3600秒。事實上,該進程執行完當前任務后,就進入睡眠狀態,睡眠一段時間后,由系統的總控負責將其喚醒。  
    如果修改了以上這幾個參數,需要重新啟動數據庫以使參數生效。  
    二、實現數據庫同步復制的步驟  
    假設在Internet上我們有兩個數據庫:一個叫深圳(shenzhen),一個叫北京(beijing)。  
    具體配置見下表:  
    數據庫名 shenzhen beijing  
    數據庫域名 test.com.cn test.com.cn  
    數據庫sid號 shenzhen beijing  
    Listener端口號 1521 1521  
    服務器ip地址 10.1.1.100 10.1.1.200  
      
    1、確認兩臺數據庫之間可以互相訪問,在tnsnames.ora里設置數據庫連接字符串。  
    ①、例如:深圳這邊的數據庫連接字符串是以下的格式  
    beijing =  
    (DESCRIPTION =  
    (ADDRESS_LIST =  
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.200)(PORT = 1521))  
    )  
    (CONNECT_DATA =  
    (SERVICE_NAME = beijing)  
    )  
    )  
    運行$tnsping beijing  
    出現以下提示符:  
    Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.200)(PORT=1521))  
    OK(n毫秒)  
    表明深圳數據庫可以訪問北京數據庫。  
    ②、在北京那邊也同樣配置,確認$tnsping shenzhen 是通的。  
    2、改數據庫全局名稱,建公共的數據庫鏈接。  
    ①、用system身份登錄shenzhen數據庫  
    SQL>alter database rename global_name to shenzhen.test.com.cn;  
    用system身份登錄beijing數據庫:  
    SQL>alter database rename global_name to beijing.test.com.cn;  
    ②、用system身份登錄shenzhen數據庫  
    SQL>create public database link beijing.test.com.cn using 'beijing';  
    測試數據庫全局名稱和公共的數據庫鏈接  
    SQL>select * from global_name@beijing.test.com.cn;  
    返回結果為beijing.test.com.cn就對了。  
    用system身份登錄beijing數據庫:  
    SQL>create public database link shenzhen.test.com.cn using 'shenzhen';  
    測試數據庫全局名稱和公共的數據庫鏈接  
    SQL>select * from global_name@shenzhen.test.com.cn;  
    返回結果為shenzhen.test.com.cn就對了。  
    3、建立管理數據庫復制的用戶repadmin,并賦權。  
    ①、用system身份登錄shenzhen數據庫  
    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>grant comment any table to repadmin;  
    SQL>grant lock any table to repadmin;  
    ②、同樣用system身份登錄beijing數據庫,運行以上的命令,管理數據庫復制的用戶repadmin,并賦權。  
    說明:repadmin用戶名和密碼可以根據用戶的需求自由命名。  
    4、在數據庫復制的用戶repadmin下創建私有的數據庫鏈接。  
    ①、用repadmin身份登錄shenzhen數據庫  
    SQL>create database link beijing.test.com.cn connect to repadmin identified by repadmin;  
    測試這個私有的數據庫鏈接:  
    SQL>select * from global_name@beijing.test.com.cn;  
    返回結果為beijing.test.com.cn就對了。  
    ②、用repadmin身份登錄beijing數據庫  
    SQL>create database link shenzhen.test.com.cn connect to repadmin identified by repadmin;  
    測試這個私有的數據庫鏈接  
    SQL>select * from global_name@shenzhen.test.com.cn;  
    返回結果為shenzhen.test.com.cn就對了。  
    5、創建或選擇實現數據庫復制的用戶和對象,給用戶賦權,數據庫對象必須有主關鍵字。  
    假設我們用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 sys.dbms_defer to scott;  
    ②、用scott身份登錄shenzhen數據庫,創建表dept  
    SQL>create table dept  
    (deptno number(2) primary key,  
    dname varchar2(14),  
    loc varchar2(13) );  
    ③、如果數據庫對象沒有主關鍵字,可以運行以下SQL命令添加:  
    SQL>alter table dept add (constraint dept_deptno_pk primary key (deptno));  
    ④、在shenzhen數據庫scott用戶下創建主關鍵字的序列號,范圍避免和beijing的沖突。  
    SQL> create sequence dept_no increment by 1 start with 1 maxvalue 44 cycle nocache;  
    (說明:maxvalue 44可以根據應用程序及表結構主關鍵字定義的位數需要而定)  
    ⑤、在shenzhen數據庫scott用戶下插入初始化數據  
    SQL>insert into dept values (dept_no.nextval,'accounting','new york');  
    SQL>insert into dept values (dept_no.nextval,'research','dallas');  
    SQL>commit;  
    ⑥、在beijing數據庫那邊同樣運行以上①,②,③  
    ⑦、在beijing數據庫scott用戶下創建主關鍵字的序列號,范圍避免和shenzhen的沖突。  
    SQL> create sequence dept_no increment by 1 start with 45 maxvalue 99 cycle nocache;  
    ⑧、在beijing數據庫scott用戶下插入初始化數據  
    SQL>insert into dept values (dept_no.nextval,'sales','chicago');  
    SQL>insert into dept values (dept_no.nextval,'operations','boston');  
    SQL>commit;  
    6、創建要復制的組scott_mg,加入數據庫對象,產生對象的復制支持  
    ①、用repadmin身份登錄shenzhen數據庫,創建主復制組scott_mg  
    SQL> execute dbms_repcat.create_master_repgroup('scott_mg');  
    說明:scott_mg組名可以根據用戶的需求自由命名。  
    ②、在復制組scott_mg里加入數據庫對象  
    SQL>execute dbms_repcat.create_master_repobject(sname=>'scott',oname=>'dept', type=>'table',use_existing_object=>true,gname=>'scott_mg');  
    參數說明:  
    sname 實現數據庫復制的用戶名稱  
    oname 實現數據庫復制的數據庫對象名稱  
    (表名長度在27個字節內,程序包名長度在24個字節內)  
    type 實現數據庫復制的數據庫對象類別  
    (支持的類別:表,索引,同義詞,觸發器,視圖,過程,函數,程序包,程序包體)  
    use_existing_object true表示用主復制節點已經存在的數據庫對象  
    gname 主復制組名  
    ③、對數據庫對象產生復制支持  
    SQL>execute dbms_repcat.generate_replication_support('scott','dept','table');  
    (說明:產生支持scott用戶下dept表復制的數據庫觸發器和程序包)  
    ④、確認復制的組和對象已經加入數據庫的數據字典  
    SQL>select gname, master, status from dba_repgroup;  
    SQL>select * from dba_repobject;  
    7、創建主復制節點  
    ①、用repadmin身份登錄shenzhen數據庫,創建主復制節點  
    SQL>execute dbms_repcat.add_master_database  
    (gname=>'scott_mg',master=>'beijing.test.com.cn',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;  
    8、使同步組的狀態由停頓(quiesced )改為正常(normal)  
    ①、用repadmin身份登錄shenzhen數據庫,運行以下命令  
    SQL> execute dbms_repcat.resume_master_activity('scott_mg',false);  
    ②、確認同步組的狀態為正常(normal)  
    SQL> select gname, master, status from dba_repgroup;  
    ③、如果這個①命令不能使同步組的狀態為正常(normal),可能有一些停頓的復制,運行以下命令再試試(建議在緊急的時候才用):  
    SQL> execute dbms_repcat.resume_master_activity('scott_mg',true);  
    9、創建復制數據庫的時間表,我們假設用固定的時間表:10分鐘復制一次。  
    ①、用repadmin身份登錄shenzhen數據庫,運行以下命令  
    SQL>begin  
    dbms_defer_sys.schedule_push (  
    destination => 'beijing.test.com.cn',  
    interval => 'sysdate + 10/1440',  
    next_date => sysdate);  
    end;  
    /  
      
    SQL>begin  
    dbms_defer_sys.schedule_purge (  
    next_date => sysdate,  
    interval => 'sysdate + 10/1440',  
    delay_seconds => 0,  
    rollback_segment => '');  
    end;  
    /  
      
    ②、用repadmin身份登錄beijing數據庫,運行以下命令  
    SQL>begin  
    dbms_defer_sys.schedule_push (  
    destination => ' shenzhen.test.com.cn ',  
    interval => 'sysdate + 10 / 1440',  
    next_date => sysdate);  
    end;  
    /  
      
    SQL>begin  
    dbms_defer_sys.schedule_purge (  
    next_date => sysdate,  
    interval => 'sysdate + 10/1440',  
    delay_seconds => 0,  
    rollback_segment => '');  
    end;  
    /  
    10、添加或修改兩邊數據庫的記錄,跟蹤復制過程  
    如果你想立刻看到添加或修改后數據庫的記錄的變化,可以在兩邊repadmin用戶下找到push的job_number,然后運行:  
    SQL>exec dbms_job.run(job_number);  
    三、異常情況的處理  
    1、檢查復制工作正常否,可以在repadmin 用戶下查詢user_jobs  
    SQL>select job,this_date,next_date,what, broken from user_jobs;  
    正常的狀態有兩種:  
    任務閑——this_date為空,next_date為當前時間后的一個時間值  
    任務忙——this_date不為空,next_date為當前時間后的一個時間值  
    異常狀態也有兩種:  
    任務死鎖——next_date為當前時間前的一個時間值  
    任務死鎖——next_date為非常大的一個時間值,例如:4001-01-01  
    這可能因為網絡中斷照成的死鎖  
    解除死鎖的辦法:  
    $ps –ef|grep orale  
    找到死鎖的刷新快照的進程號ora_snp*,用kill –9 命令刪除此進程  
    然后進入repadmin 用戶SQL>操作符下,運行命令:  
    SQL>exec dbms_job.run(job_number);  
    說明:job_number 為用select job,this_date,next_date,what from user_jobs;命令查出的job編號。  
    2、增加或減少復制組的復制對象  
    ①、停止主數據庫節點的復制動作,使同步組的狀態由正常(normal)改為停頓(quiesced )  
    用repadmin身份登錄shenzhen數據庫,運行以下命令  
    SQL>execute dbms_repcat.suspend_master_activity (gname => 'scott_mg');  
    ②、在復制組scott_mg里加入數據庫對象,保證數據庫對象必須有主關鍵字。  
    SQL>execute dbms_repcat.create_master_repobject(sname=>'scott',oname=>'emp', type=>'table',use_existing_object=>true,gname=>'scott_mg');  
    對加入的數據庫對象產生復制支持  
    SQL>execute dbms_repcat.generate_replication_support('scott','emp','table');  
    ③、在復制組scott_mg里刪除數據庫對象。  
    SQL>execute dbms_repcat.drop_master_repobject ('scott','dept','table');  
    ④、重新使同步組的狀態由停頓(quiesced )改為正常(normal)。  
    SQL> execute dbms_repcat.resume_master_activity('scott_mg',false);

    posted on 2009-04-28 08:35 生命的綻放 閱讀(2606) 評論(0)  編輯  收藏 所屬分類: 數據庫

    <2009年4月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    導航

    統計

    常用鏈接

    留言簿(5)

    隨筆分類(94)

    隨筆檔案(93)

    文章分類(5)

    文章檔案(5)

    相冊

    JAVA之橋

    SQL之音

    兄弟之窗

    常用工具下載

    積分與排名

    最新評論

    閱讀排行榜

    主站蜘蛛池模板: 亚洲?v女人的天堂在线观看| 亚洲一区二区三区免费| 亚洲综合图片小说区热久久| 亚洲女人初试黑人巨高清| 久久久久久久99精品免费 | 亚洲国产精品无码久久久秋霞2 | 插鸡网站在线播放免费观看| 亚洲国产电影av在线网址| 99亚洲乱人伦aⅴ精品| 免费污视频在线观看| 国产亚洲综合一区柠檬导航| a级毛片毛片免费观看永久| 成人免费看吃奶视频网站| 亚洲中文字幕无码亚洲成A人片| 久久午夜无码免费| 亚洲国产成人精品女人久久久 | 男女一边桶一边摸一边脱视频免费 | 亚洲精品无码mⅴ在线观看| 成人黄18免费视频| 亚洲人成未满十八禁网站| 在线视频免费国产成人| 亚洲国产av美女网站| 国产va免费精品观看精品| 亚洲人成网站在线在线观看| 国产麻豆剧传媒精品国产免费| 美女裸体无遮挡免费视频网站| 亚洲综合无码精品一区二区三区| 亚洲av成人一区二区三区观看在线| 免费无码中文字幕A级毛片| 亚洲人色婷婷成人网站在线观看| 狠狠躁狠狠爱免费视频无码| 亚洲国产精品婷婷久久| 国产精品入口麻豆免费观看| 国产午夜亚洲精品国产| 亚洲国产一成久久精品国产成人综合| 亚洲精品久久无码| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 免费在线观看视频a| 中国毛片免费观看| 亚洲国产精品久久人人爱| 国产一卡二卡3卡四卡免费|