Oracle Stream--Oracle兩資料庫同步

來源:互聯網
上載者:User
1 引言     Oracle官方網:     http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10727/strmover.htm  
    Oracle Stream功能是為提高資料庫的高可用性而設計的,在Oracle 9i及之前的版本這個功能被稱為Advance Replication。Oracle Stream利用進階隊列技術,通過解析歸檔日誌,將歸檔日誌解析成DDL及DML語句,從而實現資料庫之間的同步。這種技術可以將整個資料庫、資料庫中的對象複製到另一資料庫中,通過使用Stream的技術,對歸檔日誌的挖掘,可以在對主系統沒有任何壓力的情況下,實現對資料庫物件級甚至整個資料庫的同步。 

    解析歸檔日誌這種技術現在應用的比較廣泛,Quest公司的shareplex軟體及DSG公司的realsync都是這樣的產品,一些公司利用這樣的產品做應用級的容災。但shareplex或是realsync都是十分昂貴的,因此你可以嘗試用Stream這個Oracle提供的不用額外花錢的功能。Oracle Stream對生產庫的影響是非常小的,從庫可以是與主庫不同的作業系統平台,你可以利用Oracle Stream複製幾個從庫,從庫可用於查詢、報表、容災等不同的功能。本文不談技術細節,只是以手把手的方式一步一步的帶你把Stream的環境搭建起來,細節內容可以查聯機文檔。 

2 概述 
主要資料庫: 

作業系統:Solaris 9 
IP地址:192.168.10.35 
資料庫:Oracle 10.2.0.2 
ORACLE_SID:prod 
Global_name:prod 

從資料庫: 
作業系統:AIX 5.2 
IP地址:192.168.10.43 
資料庫:Oracle 10.2.0.3 
ORACLE_SID:h10g 
Global_name:h10g 
3 環境準備 
3.1 設定初始化參數 
使用pfile的修改init<SID>.ora檔案,使用spfile的通過alter system命令修改spile檔案。主、從資料庫分別執行如下的語句: 
Sqlplus ‘/ as sysdba’ 
alter system set aq_tm_processes=2 scope=both; 
alter system set global_names=true scope=both; 
alter system set job_queue_processes=10 scope=both; 
alter system set parallel_max_servers=20 scope=both; 
alter system set undo_retention=3600 scope=both; 
alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile; 
alter system set streams_pool_size=25M scope=spfile; 
alter system set utl_file_dir='*' scope=spfile; 
alter system set open_links=4 scope=spfile; 

執行完畢後重啟資料庫。 
3.2 將資料庫置為歸檔模式 
設定log_archive_dest_1到相應的位置;設定log_archive_start為TRUE,即啟用自動歸檔功能;設定log_archive_format指定歸檔日誌的命令格式。 
舉例: 
sqlplus ‘/ as sysdba’ 
alter system set log_archive_dest_1=’location=/yang/arch’ scope=spfile; 
alter system set log_archive_start=TRUE scope=spfile; 
alter system set log_archive_format=’ arch%t_%s_%r.arc’ scope=spfile; 
shutdown immediate; 
startup mount; 
alter database archivelog; 
alter database open; 

資料庫置為歸檔模式後,可以按如下方式檢驗一下: 
SQL> archive log list 
Database log mode Archive Mode 
Automatic archival Enabled 
Archive destination /yang/arch 
Oldest online log sequence 534 
Next log sequence to archive 536 
Current log sequence 536 

觀註標紅的部分。 

3.3 建立stream 系統管理使用者 
3.3.1 建立主環境stream系統管理使用者 
#以sysdba身份登入 
connect / as sysdba 

#建立主環境的Stream專用資料表空間 
create tablespace tbs_stream datafile '/yang/oradata/prod/tbs_stream01.dbf' 
size 100m autoextend on maxsize unlimited segment space management auto; 

#將logminer的資料字典從system資料表空間轉移到建立的資料表空間,防止撐滿system資料表空間 
execute dbms_logmnr_d.set_tablespace('tbs_stream'); 

#建立Stream系統管理使用者 
create user strmadmin identified by strmadmin 
default tablespace tbs_stream temporary tablespace temp; 

#授權Stream系統管理使用者 
grant connect,resource,dba,aq_administrator_role to strmadmin; 

begin 
dbms_streams_auth.grant_admin_privilege( 
grantee => 'strmadmin', 
grant_privileges => true); 
end; 

3.3.2 建立從環境stream系統管理使用者 
#以sysdba身份登入 
connect / as sysdba 

#建立Stream專用資料表空間,我的從庫用了ASM,這一步也可以參見3.3.1 
create tablespace tbs_stream datafile '+VGDATA/h10g/datafile/tbs_stream01.dbf' 
size 100m autoextend on maxsize unlimited segment space management auto; 
#同樣,將logminer的資料字典從system資料表空間轉移到建立的資料表空間,防止撐滿system資料表空間 
execute dbms_logmnr_d.set_tablespace('tbs_stream'); 

#建立Stream系統管理使用者 
create user strmadmin identified by strmadmin 
default tablespace tbs_stream temporary tablespace temp; 

#授權Stream系統管理使用者 
grant connect,resource,dba,aq_administrator_role to strmadmin; 

begin 
dbms_streams_auth.grant_admin_privilege( 
grantee => 'strmadmin', 
grant_privileges => true); 
end; 


3.4 配置網路連接 
3.4.1配置主環境tnsnames.ora 
主要資料庫(tnsnames.ora)中添加從資料庫的配置。 
H10G = 
(DESCRIPTION = 
(ADDRESS_LIST = 
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.43)(PORT = 1521)) 

(CONNECT_DATA = 
(SID = h10g) 
(SERVER = DEDICATED) 


3.4.2配置從環境tnsnames.ora 
從資料庫(tnsnames.ora)中添加主要資料庫的配置。 
PROD = 
(DESCRIPTION = 
(ADDRESS_LIST = 
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.35)(PORT = 1521)) 

(CONNECT_DATA = 
(SID = prod) 
(SERVER = DEDICATED) 


3.5 啟用追加日誌 
可以基於Database層級或Table層級,啟用追加日誌(Supplemental Log)。在建立根據Schema粒度進行複製的Oracle Stream環境中,如果確認Schema下所有Table都有合理的主鍵(Primary Key),則不再需要啟用追加日誌。 

#啟用Database 追加日誌 
alter database add supplemental log data; 

#啟用Table追加日誌 
alter table add supplement log group log_group_name(table_column_name) always; 

3.6 建立DBlink 
根據Oracle 10gR2 Stream官方文檔,針對主要資料庫建立的資料庫鏈的名字必須和從資料庫的global_name相同。 
如果需要修改global_name,執行“alter database rename global_name to xxx”。 
3.6.1建立主要資料庫資料庫鏈 
#以strmadmin身份,登入主要資料庫。 
connect strmadmin/strmadmin 
#建立資料庫鏈 
create database link h10g connect to strmadmin identified by strmadmin using 'h10g'; 
3.6.2建立從資料庫資料庫鏈 
#以strmadmin身份,登入從資料庫。 
connect strmadmin/strmadmin 
#建立資料庫鏈 
create database link prod connect to strmadmin identified by strmadmin using 'prod'; 
3.7 建立流隊列 
3.7.1建立Master流隊列 
#以strmadmin身份,登入主要資料庫。 
connect strmadmin/strmadmin 

begin 
dbms_streams_adm.set_up_queue( 
queue_table => 'prod_queue_table', 
queue_name => 'prod_queue'); 
end; 

3.7.2建立Backup流隊列 
#以strmadmin身份,登入從資料庫。 
connect strmadmin/strmadmin 

begin 
dbms_streams_adm.set_up_queue( 
queue_table => 'h10g_queue_table', 
queue_name => 'h10g_queue'); 
end; 


3.8 建立捕獲進程 
#以strmadmin身份,登入主要資料庫。提醒一下,本文檔以hr使用者做樣本。 
connect strmadmin/strmadmin 

begin 
dbms_streams_adm.add_schema_rules( 
schema_name => 'hr', 
streams_type => 'capture', 
streams_name => 'capture_prod', 
queue_name => 'strmadmin.prod_queue', 
include_dml => true, 
include_ddl => true, 
include_tagged_lcr => false, 
source_database => null, 
inclusion_rule => true); 
end; 

3.9 執行個體化複製資料庫 
在主要資料庫環境中,執行如下Shell語句。如果從庫的hr使用者不存在,建立一個hr的空使用者。 
exp userid=hr/hr@prod file='/tmp/hr.dmp' object_consistent=y rows=y 

imp userid=system/manager@h10g file='/tmp/hr.dmp' ignore=y commit=y log='/tmp/hr.log' streams_instantiation=y fromuser=hr touser=hr 
3.10 建立傳播進程 
#以strmadmin身份,登入主要資料庫。 
connect strmadmin/strmadmin 

begin 
dbms_streams_adm.add_schema_propagation_rules( 
schema_name => 'hr', 
streams_name => 'prod_to_h10g', 
source_queue_name => 'strmadmin.prod_queue', 
destination_queue_name => 'strmadmin.h10g_queue@h10g', 
include_dml => true, 
include_ddl => true, 
include_tagged_lcr => false, 
source_database => 'prod', 
inclusion_rule => true); 
end; 


#修改propagation休眠時間為0,表示即時傳播LCR。 
begin 
dbms_aqadm.alter_propagation_schedule( 
queue_name => 'prod_queue', 
destination => 'h10g', 
latency => 0); 
end; 

3.11 建立應用進程 
#以strmadmin身份,登入從資料庫。 
connect strmadmin/strmadmin 

begin 
dbms_streams_adm.add_schema_rules( 
schema_name => 'hr', 
streams_type => 'apply', 
streams_name => 'apply_h10g', 
queue_name => 'strmadmin.h10g_queue', 
include_dml => true, 
include_ddl => true, 
include_tagged_lcr => false, 
source_database => 'prod', 
inclusion_rule => true); 
end; 

3.12 啟動STREAM 
#以strmadmin身份,登入從資料庫。 
connect strmadmin/strmadmin 

#啟動Apply進程 
begin 
dbms_apply_adm.start_apply( 
apply_name => 'apply_h10g'); 
end; 


#以strmadmin身份,登入主要資料庫。 
connect strmadmin/strmadmin 

#啟動Capture進程 
begin 
dbms_capture_adm.start_capture( 
capture_name => 'capture_prod'); 
end; 

3.13 停止STREAM 
#以strmadmin身份,登入主要資料庫。 
connect strmadmin/strmadmin 

#停止Capture進程 
begin 
dbms_capture_adm.stop_capture( 
capture_name => 'capture_prod'); 
end; 


#以strmadmin身份,登入從資料庫。 
connect strmadmin/strmadmin 

#停止Apply進程 
begin 
dbms_apply_adm.stop_apply( 
apply_name => 'apply_h10g'); 
end; 

3.14 清除所有配置資訊 
要清楚Stream配置資訊,需要先執行3.13,停止Stream進程。 

#以strmadmin身份,登入主要資料庫。 
connect strmadmin/strmadmin 
exec DBMS_STREAMS_ADM.remove_streams_configuration(); 

#以strmadmin身份,登入從資料庫。 
connect strmadmin/strmadmin 
exec DBMS_STREAMS_ADM.remove_streams_configuration(); 
4 測試情境 
    本文檔建立了針對hr使用者的Stream 複製環境,如果沒有特別聲明,以下測試情境均以hr使用者身份執行。 
4.1 建一張表測試 
主要資料庫 
SQL> CREATE TABLE TTT(id NUMBER PRIMARY KEY, 
2 name VARCHAR2(50) 
3 ) 
4 / 

Table created. 

從資料庫 
SQL> desc TTT 
Name Null? Type 
---------- -------- ------------- 
ID NOT NULL NUMBER 
NAME VARCHAR2(50) 
4.2 表中插入一行資料 
主要資料庫 
SQL> insert into ttt values (1,'sdfsdfsdfsdf'); 
1 row created. 
SQL> commit; 
Commit complete. 

SQL> 
從資料庫 
SQL> select * from TTT; 
ID NAME 
---------- -------------------- 
1 sdfsdfsdfsdf 
4.3 變更一下表的結構,添加一列 
主要資料庫 
SQL> ALTER TABLE TTT ADD(age NUMBER(2)); 
Table altered 

從資料庫 
SQL> desc TTT 
Name Null? Type 
----------- -------- -------------- 
ID NOT NULL NUMBER 
NAME VARCHAR2(50) 
AGE NUMBER(2) 
4.4 將表換一個資料表空間 
主要資料庫 
SQL> SELECT table_name,tablespace_name FROM user_tables 
2    WHERE table_name='TTT'; 

TABLE_NAME TABLESPACE_NAME 
------------------------------ ------------------------------ 
TTT USERS 

SQL> ALTER TABLE TTT MOVE TABLESPACE tbs_stream; 
Table altered 

SQL> SELECT table_name,tablespace_name FROM user_tables 
   WHERE table_name='TTT'; 
TABLE_NAME TABLESPACE_NAME 
------------------------------ ------------------------------ 
TTT TBS_STREAM 

從資料庫 
SQL> SELECT table_name,tablespace_name FROM user_tables 
   WHERE table_name='TTT'; 
TABLE_NAME TABLESPACE_NAME 
------------------------------ ------------------------------ 
TTT TBS_STREAM 
4.5 表上Name列建一索引 
主要資料庫 
SQL> CREATE INDEX ttt_name_idx ON TTT(name); 
Index created 

從資料庫 
SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TTT'; 
TABLE_NAME INDEX_NAME 
------------------------------     ------------------------------ 
TTT TTT_NAME_IDX 
TTT SYS_C005721 

4.6 Rebuild索引測試 
主要資料庫 
SQL> ALTER INDEX ttt_name_idx REBUILD; 
Index altered 

從資料庫 
SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TTT'; 
TABLE_NAME INDEX_NAME 
------------------------------     ------------------------------ 
TTT TTT_NAME_IDX 
TTT SYS_C005721 

4.7 索引換一個資料表空間測試 
主要資料庫 
SQL> ALTER INDEX ttt_name_idx REBUILD TABLESPACE tbs_stream; 
Index altered 

從資料庫 
SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes 
   WHERE table_name = 'TTT'; 

TABLE_NAME INDEX_NAME TABLESPACE_NAME 
------------------------------ ------------------------------ ------------------------------ 
TTT TTT_NAME_IDX TBS_STREAM 
TTT SYS_C005721 USERS 

4.8 刪除索引測試 
主要資料庫 
SQL> DROP INDEX ttt_name_idx; 
Index dropped 

從資料庫 
SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes 
   WHERE table_name = ‘TTT’; 

TABLE_NAME INDEX_NAME TABLESPACE_NAME 
------------------------------ ------------------------------ ------------------------------ 
TTT SYS_C005721 USERS 
4.9 刪除表測試 
主要資料庫 
SQL> DROP TABLE ttt; 
Table dropped 

從資料庫 
SQL> DESC ttt; 
Object ttt does not exist. 

4.10 建一張帶有LOB類型欄位的表測試 
主要資料庫 
SQL> CREATE TABLE tttclob(id NUMBER PRIMARY KEY, memo CLOB); 
Table created 

從資料庫 
SQL> DESC tttclob; 
Name Null? Type 
----------- -------- -------------- 
ID NOT NULL NUMBER 
MEMO CLOB 

4.11 表中插入一行資料 
主要資料庫 
SQL> INSERT INTO tttclob VALUES(1,'clob_test'); 
1 row inserted 
SQL> commit; 
Commit complete 

從資料庫 
SQL> SELECT * FROM tttclob; 

ID MEMO 
---------- -------------------------------------------------------------------------------- 
1 clob_test 

4.12 建立Type測試 
主要資料庫 
SQL> CREATE or REPLACE TYPE ttttype; 
2 / 
Type created 

從資料庫 
SQL> SELECT * FROM user_types WHERE type_name='TTTTYPE'; 
TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID 
------------------------------ -------------------------------- ------------------------------ ---------- ---------- ---------- ---------- ----- ------------ ------------------------------ ------------------------------ ---------------- ------------- -------------------------------- 
TTTTYPE 1B36AAF10DA8301DE040A8C0289A77B4 OBJECT 0 0 NO YES YES YES 

4.13 刪除Type測試 
主要資料庫 
SQL> DROP TYPE ttttype; 
Type dropped 

從資料庫 
SQL> SELECT * FROM user_types WHERE type_name='TTTTYPE'; 
TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID 
------------------------------ -------------------------------- -

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.