高級復制與global_names、global_name、DBLINK、DB_name、DB_domain之間的聯系
高級復制環境中,包括ORACLE在內的所有文檔都要求初始參數global_names的值必須要設為TRUE,其實這不是必須的,下面分段說說它們的聯系。
1、global_name怎麼得到的?
為了更清晰地標識數據庫,建議global_name=db_name.db_domain,當然global_name也可以隨意設置成你喜歡的名字。
在創建數據庫時,系統會根據初始參數DB_name、DB_domain的值設置global_name=db_name.db_domain,如果建庫時db_domain的值為空,則global_name=db_name;在創建完數據庫後,db_domain初始參數就沒有作用了,你修改db_domain初始參數不會改變global_name的值,修改global_name的值也不會影響db_domain初始參數(感覺db_domain慘兮兮的,至少在下“小菜”目前還沒發現該參數的其它用處)。當然也不會影響db_name初始參數的值。
2、修改global_name的值
global_name除了建庫時自動生成,也可以手動更改,有些應用中,如高級復制,更改global_name後需重啟instance才能生效。
查看global_name的值(來源於global_name視圖):
SQL> select * from global_name;
GLOBAL_NAME
---------------------------------
TAOM
修改global_name的值:
方法一:
SQL> alter database rename global_name to test.com;
資料庫已被更改
SQL> select * from global_name;
GLOBAL_NAME
----------------------------------------------------
TEST.COM
方法二:有時在將global_name修改成xx.com類似的格式後,想把後面domain那部份去掉,通過上面的命令怎麼改也不行,比如再通過命令SQL> alter database rename global_name to taom,得到global_name的結果卻是taom.com,那麼通過下面方法可以更改:
通過toad工具查看創建global_name視圖的script得到該視圖的源表是sys.PROPS$,
SQL> select * from sys.PROPS$ where name='GLOBAL_DB_NAME';
資料列將會被截斷
NAME VALUE$
------------------------------------------------------------ -------------
GLOBAL_DB_NAME TEST.COM
直接conn "/as sysdba"登陸sys帳號,直接修改sys.PROPS$表,執行update sys.PROPS$ set value$='taom' where name='GLOBAL_DB_NAME';
3、global_names、global_name、DBLINK之間的關系
global_names初始參數僅存在建立DBLINK時有以下限制作用:
當庫A的global_names=true時,庫A建立到其它任何庫的DBLINK時,其中dblink的名稱必須是對方庫的global_name,其它庫建立到A庫DBLINK的方式不變。
不然在執行分布式DML操作,出現 錯誤提示
*
ERROR 在行 1:
ORA-02085: database link ABC connects to TAOM
如果在庫A的同一個schema下(即同一個命名空間)需要向其它庫建立多條DBLINK路徑時,由格式如下
create database link a.global_name@dblink_1 connect to username by password using tnsnet_name;
create database link a.global_name@dblink_2 connect to username by password using tnsnet_name;
以上作用,結合下文第四點,可以更完整的保証數據庫環境,以不發生名稱錯亂。
雖然做高級復制時,包括oracle官方在內的所有文檔都強調要求global_names=true,其它這不是必須的,隻是保証庫名稱環境一致性。
4、高級復制與global_name、DBLINK之間的關系
當高級復制中master def site創建復制組時,定義主站點會自動將global_name的值作為自己站點的dblinkl名稱注冊到系統表中
execute dbms_repcat.create_master_repgroup('rep_test');
然後在定義主站點在添加其它主站點時,定義主站點自動將前面以global_name注冊到系統表中自己站點的DBLINK名稱,同步到其它所有主站點,所有主站點都會以定義主站點以global_name注冊的dblink與定義主站點同步。
execute dbms_repcat.suspend_master_activity (gname => 'rep_hh');
以下,taom是定義主站點,添加主站點taom2,在主站點查詢到的節點信息。
SQL> select * from dba_repsites;
GNAME DBLINK MA SN MASTER_COMME MA PROP_UPDATES MY GROUP_OWNER
------------ ------------ -- -- ------------ -- ------------ -- ----------------
REP_HH TAOM2 N Y 2 N PUBLIC
REP_HH TAOM Y Y 0 Y PUBLIC
高級復制環境中,global_name可以隨意設置,但無論global_name是什麼,無論是定義主站點,還是主站點,DBLINK的名稱一定要與對方的global_name相同,不然不能同步。這也就是為什麼強調global_names要設為true的原因(global_names設為true後,建立到對方的DBLINK必須與對方的GLOBAL_NAME相同)
以上經過實驗,高級復制中,global_names=false,且global_name不等於db_name,但等於DBLINK名稱,復制組可以正常同步。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7608831/viewspace-675728/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7608831/viewspace-675728/