Oracle Stream配置、實施
一、Streams概述
Oracle Stream功能是為提高資料庫的高可用性而設計的,在Oracle 9i及之前的版本這個功能被稱為Advance Replication。Oracle Stream利用高階佇列技術,透過解析歸檔日誌,將歸檔日誌解析成DDL及DML語句,從而實現資料庫之間的同步。這種技術可以將整個資料庫、資料庫中的物件複製到另一資料庫中,透過使用Stream的技術,對歸檔日誌的挖掘,可以在對主系統沒有任何壓力的情況下,實現對資料庫物件級甚至整個資料庫的同步。
Oracle 的Streams提供了資訊共享的一種方式,區別於其它資料共享的方式,Streams甚至允許不同型別的資料庫之間傳遞資料,實現這點的根本在於Streams的複製流程,透過捕獲,傳播,應用三個步驟,將指定的資訊傳輸到指定位置,在捕獲訊息,管理訊息,以及在不同資料庫或應用之間共享訊息等方面提供了比傳統解決方案更為強大的功能和擴充套件性。Streams特性適用於分散式的企業應用,資料倉儲,高可用解決方案等等。
Streams強大的可定製性 ,比如說控制哪些資訊被捕獲,這些資訊在資料庫之間的流向,注入資料庫時做怎樣的處理,何時關閉stream等等。透過一些自定義的配置,Streams自動捕獲、應用和管理諸如DML/DDL修改觸發的訊息。你甚至自定義資訊存入stream,Streams會自動傳輸這些資訊到其它資料庫或相關應用。
二、Streams功能
1、 資料複製Data Replication
Streams 透過capture程式捕獲dml,ddl操作,然後透過propagate程式傳播到其它資料庫,然後再透過apply程式應用的方式複製資料。這中間的每個步驟都是可定製的,
2、 資料保護Data Protection
最有效的資料保護策略就是冗餘,Streams顯然能夠實現這一點,因為streams的主要功能就是複製資料。不過需要注意的是,由於streams實現複製的方式是邏輯的,因此如果希望用streams取代dataguard................不是完全不可以,不過,需要好好設計。Streams與邏輯standby非常相似,都是透過分析primary的redolog
3、 資料倉儲資料載入Data Warehouse Loading
資料載入是資料複製中的特例。資料倉儲系統的資料也是需要更新的,比如說新增或修改資料的同步,streams恰恰就可以滿足這一點,因此streams也可以應用於資料倉儲系統。
4、 提供資料庫服務的高可用支援Database Availability During Upgrade and Maintenance Operations
藉助streams特性的幫助,你可以儘可能的降低甚至避免資料庫在升級或維護操作時的停機時間。而且由於streams的實現是邏輯的,因此幾乎可以無視跨版本跨平臺跨字符集等方式的升級,並且如果前期準備得當,也可以做到短暫停機甚至完全不停機。
三、為什麼要用Streams
前面大概介紹了一下streams能用來做什麼,當然,都是些官方定義,實際上Streams不是一項新特性,但也不是一項很新的特性。從Oracle的9iR2版本開始推出,在10g中得到了一些增強(比如提供了downstream),其主要功能說白了就是複製資料。說到複製資料,你可能會想到oracle的其它一些同樣實現資料複製功能的特性,比如說高階複製(Advanced Replication),Dataguard等等。
在9iR2之前高階複製應用比較廣泛,高階複製也分兩種:多主複製和基於物化檢視的複製,就我理解其最大的劣勢是大資料量下效率堪優,並且對於ddl的支援不夠友好。從技術實現思路上與streams幾無相同之處,倒是邏輯standby與streams的實現方式非常想像,都是透過分析redo生成重做的sql語句在目標端執行,如果要說差異的話,邏輯standby只提供了整庫級的複製,從功能上來看standby還是更適合應用於容災,而streams不僅能夠實現整庫級的同步,在複製策略上設計的非常靈活,你可以透過不同的方式實現表空間/SCHMEA/表級的複製。也就是在複製策略定製上更靈活。由於是分析redo實現,因此對ddl的支援相比高階複製那實在好太多了,並且streams仍屬於邏輯實現的方式,因此支援跨平臺跨版本的實施,在目前,這點是dataguard無法比擬的。
如果要說劣勢的話,雖然經歷了9i,10g到最新的11g,但streams實現還是個新東西,其應用的廣泛程度自然遠不能與高階複製和dataguard相比,因此在穩定性上可能還有所欠缺,比如說碰到bug的機率會比較高。從管理的角度,streams比dataguard要複雜一些,與高階複製應該說不相上下。當然這裡並不是要寫一篇專門對比streams/dataguard/高階複製間差異的文章,因此,點到為止吧,透過大致的對比希望能讓你瞭解到streams的特點和優劣。
2、測試環境介紹
主資料庫:
作業系統:contos 4.7
IP地址:172.16.37.239
資料庫:Oracle 10.2.0.1
ORACLE_SID:dbnms
Global_name:dbnms
從資料庫:
作業系統:windows xp
IP地址:172.16.37.219
資料庫:Oracle 11.1.0.7.0
ORACLE_SID:orcl
Global_name:orcl
3 環境準備
3.1 設定初始化引數
使用pfile的修改init.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 將資料庫置為歸檔模式
主資料庫:
SQL> alter system set log_archive_dest_1='LOCATION=/arch' scope=both;
System altered.
SQL> alter system set log_archive_format='arch%t_%s_%r.arc' scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 6442450944 bytes
Fixed Size 2030408 bytes
Variable Size 1392510136 bytes
Database Buffers 5033164800 bytes
Redo Buffers 14745600 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL>
驗證是否歸檔:
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /arch
Oldest online log sequence 2662
Next log sequence to archive 2679
Current log sequence 2679
從資料庫:
SQL> alter system set log_archive_format='arch%t_%s_%r.arc' scope=spfile;
系統已更改。
SQL> alter system set log_archive_dest_1='LOCATION=d:\arch';
系統已更改。
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area 431038464 bytes
Fixed Size 1347804 bytes
Variable Size 301993764 bytes
Database Buffers 121634816 bytes
Redo Buffers 6062080 bytes
資料庫裝載完畢。
SQL> alter database archivelog;
資料庫已更改。
SQL> alter database open;
資料庫已更改。
SQL>
驗證是否歸檔:
SQL> archive log list;
資料庫日誌模式 存檔模式
自動存檔 啟用
存檔終點 d:\arch
最早的聯機日誌序列 2
下一個存檔日誌序列 4
當前日誌序列 4
SQL>
3.3 建立stream 管理使用者
3.3.1 建立主環境stream管理使用者
以下是引用片段:
以sysdba身份登入
connect / as sysdba
建立主環境的Stream專用表空間
SQL> create tablespace tbs_stream datafile '/oradata/dbnms/stream01.dbf' size 100M;
Tablespace created.
將logminer的資料字典從system表空間轉移到新建的表空間,防止撐滿system表空間
SQL> execute dbms_logmnr_d.set_tablespace('tbs_stream');
PL/SQL procedure successfully completed.
建立Stream管理使用者
SQL> create user strmadmin identified by strmadmin
2 default tablespace tbs_stream temporary tablespace temp;
User created.
授權Stream管理使用者
SQL> grant connect,resource,dba,aq_administrator_role to strmadmin;
Grant succeeded.
SQL> begin
2 dbms_streams_auth.grant_admin_privilege(
3 grantee => 'strmadmin',
4 grant_privileges => true);
5 end;
6 /
PL/SQL procedure successfully completed.
3.3.2 建立從環境stream管理使用者
以下是引用片段:
#以sysdba身份登入
connect / as sysdba
#建立Stream專用表空間
SQL> create tablespace tbs_stream datafile
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\stream01.dbf' size 100M;
表空間已建立。
#同樣,將logminer的資料字典從system表空間轉移到新建的表空間,防止撐滿system表空間
SQL> execute dbms_logmnr_d.set_tablespace('tbs_stream');
PL/SQL 過程已成功完成。
#建立Stream管理使用者
SQL> create user strmadmin identified by strmadmin
2 default tablespace tbs_stream temporary tablespace temp;
使用者已建立。
#授權Stream管理使用者
SQL> grant connect,resource,dba,aq_administrator_role to strmadmin;
授權成功。
SQL> begin
2 dbms_streams_auth.grant_admin_privilege(
3 grantee => 'strmadmin',
4 grant_privileges => true);
5 end;
6 /
PL/SQL 過程已成功完成。
3.4 配置網路連線
3.4.1配置主環境tnsnames.ora
主資料庫(tnsnames.ora)中新增從資料庫的配置。
以下是引用片段:
orcl =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.37.219)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
3.4.2配置從環境tnsnames.ora
以下是引用片段:
從資料庫(tnsnames.ora)中新增主資料庫的配置。
dbnms =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.37.239)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbnms)
)
)
3.5 啟用追加日誌
可以基於Database級別或Table級別,啟用追加日誌(Supplemental Log)。在建立根據Schema粒度進行復制的Oracle Stream環境中,如果確認Schema下所有Table都有合理的主鍵(Primary Key),則不再需要啟用追加日誌。
以下是引用片段:
#啟用Database 追加日誌
SQL> alter database add supplemental log data;
Database altered.
#啟用Table追加日誌
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE, FOREIGN KEY) COLUMNS;
Database altered.
3.6 建立DBlink
根據Oracle 10gR2 Stream官方文件,針對主資料庫建立的資料庫鏈的名字必須和從資料庫的global_name相同。
如果需要修改global_name,執行“alter database rename global_name to xxx”。
3.6.1建立主資料庫資料庫鏈
#以strmadmin身份,登入主資料庫。
SQL> conn strmadmin/strmadmin
Connected.
#建立資料庫鏈
SQL> create database link orcl connect to strmadmin identified by strmadmin using 'orcl';
Database link created.
3.6.2建立從資料庫資料庫鏈
#以strmadmin身份,登入從資料庫。
SQL> conn strmadmin/strmadmin
已連線。
#建立資料庫鏈
SQL> create database link dbnms connect to strmadmin identified by strmadmin using 'dbnms';
資料庫連結已建立。
3.7 建立流佇列
3.7.1建立Master流佇列
以下是引用片段:
#以strmadmin身份,登入主資料庫。
SQL> conn strmadmin/strmadmin
Connected.
begin
dbms_streams_adm.set_up_queue(
queue_table => 'dbnms_queue_table',
queue_name => 'dbnms_queue');
end;
/
示例:
SQL> begin
2 dbms_streams_adm.set_up_queue(
3 queue_table => 'dbnms_queue_table',
4 queue_name => 'dbnms_queue');
5 end;
6 /
PL/SQL procedure successfully completed.
3.7.2建立Backup流佇列
以下是引用片段:
#以strmadmin身份,登入從資料庫。
SQL> conn strmadmin/strmadmin
已連線。
begin
dbms_streams_adm.set_up_queue(
queue_table => 'orcl_queue_table',
queue_name => 'orcl_queue');
end;
/
示例:
SQL> begin
2 dbms_streams_adm.set_up_queue(
3 queue_table => 'orcl_queue_table',
4 queue_name => 'orcl_queue');
5 end;
6 /
PL/SQL 過程已成功完成。
3.8 建立捕獲程式
以下是引用片段:
3.9 例項化複製資料庫
在主資料庫環境中,執行如下Shell語句。如果從庫的dyx使用者不存在,建立一個hr的空使用者。
[oracle@ora]$ exp file='/tmp/dyx.dmp' object_consistent=y rows=y
Export: Release 10.2.0.1.0 - Production on Mon Apr 6 11:51:56 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user DYX
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user DYX
About to export DYX's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export DYX's tables via Conventional Path ...
. . exporting table ARTICLE 181 rows exported
. . exporting table D 1 rows exported
. . exporting table DEDE_ARCHIVES 0 rows exported
. . exporting table DT 2 rows exported
. . exporting table TEST 1000000 rows exported
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully without warnings.
[oracle@ora]$ imp file='/tmp/dyx.dmp' ignore=y commit=y log='/tmp/dyx.log' streams_instantiation=y fromuser=dyx touser=dyx
Import: Release 10.2.0.1.0 - Production on Mon Apr 6 11:54:07 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export file created by EXPORT:V10.02.01 via conventional path
Warning: the objects were exported by DYX, not by you
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
. importing DYX's objects into DYX
. . importing table "ARTICLE" 181 rows imported
. . importing table "D" 1 rows imported
. . importing table "DEDE_ARCHIVES" 0 rows imported
. . importing table "DT" 2 rows imported
. . importing table "TEST" 1000000 rows imported
Import terminated successfully without warnings.
#以strmadmin身份,登入主資料庫。提醒一下,本文件以dyx使用者做示例。
SQL> connect strmadmin/strmadmin
Connected.
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'dyx',
streams_type => 'capture',
streams_name => 'capture_dbnms',
queue_name => 'strmadmin.dbnms_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
/
示例:
SQL> begin
2 dbms_streams_adm.add_schema_rules(
3 schema_name => 'dyx',
4 streams_type => 'capture',
5 streams_name => 'capture_dbnms',
6 queue_name => 'strmadmin.dbnms_queue',
7 include_dml => true,
8 include_ddl => true,
9 include_tagged_lcr => false,
10 source_database => null,
11 inclusion_rule => true);
12 end;
13 /
PL/SQL procedure successfully completed.
3.10 建立傳播程式
以下是引用片段:
#以strmadmin身份,登入主資料庫。
SQL> connect strmadmin/strmadmin
Connected.
begin
dbms_streams_adm.add_schema_propagation_rules(
schema_name => 'dyx',
streams_name => 'dbnms_to_orcl',
source_queue_name => 'strmadmin.dbnms_queue',
destination_queue_name => ,
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'dbnms',
inclusion_rule => true);
end;
/
示例:
SQL> begin
2 dbms_streams_adm.add_schema_propagation_rules(
3 schema_name => 'dyx',
4 streams_name => 'dbnms_to_orcl',
5 source_queue_name => 'strmadmin.dbnms_queue',
6 destination_queue_name => ,
7 include_dml => true,
8 include_ddl => true,
9 include_tagged_lcr => false,
10 source_database => 'dbnms',
11 inclusion_rule => true);
12 end;
13 /
PL/SQL procedure successfully completed.
#修改propagation休眠時間為0,表示實時傳播LCR。
begin
dbms_aqadm.alter_propagation_schedule(
queue_name => 'dbnms_queue',
destination => 'orcl',
latency => 0);
end;
/
示例:
SQL> begin
2 dbms_aqadm.alter_propagation_schedule(
3 queue_name => 'dbnms_queue',
4 destination => 'orcl',
5 latency => 0);
6 end;
7 /
PL/SQL procedure successfully completed.
3.11 建立應用程式
以下是引用片段:
#以strmadmin身份,登入從資料庫。
SQL> conn strmadmin/strmadmin
已連線。
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'dyx',
streams_type => 'apply',
streams_name => 'apply_orcl',
queue_name => 'strmadmin.orcl_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'dbnms',
inclusion_rule => true);
end;
/
示例:
SQL> begin
2 dbms_streams_adm.add_schema_rules(
3 schema_name => 'dyx',
4 streams_type => 'apply',
5 streams_name => 'apply_orcl',
6 queue_name => 'strmadmin.orcl_queue',
7 include_dml => true,
8 include_ddl => true,
9 include_tagged_lcr => false,
10 source_database => 'dbnms.com',
11 inclusion_rule => true);
12 end;
13 /
PL/SQL 過程已成功完成。
3.12 啟動STREAM
以下是引用片段:
#以strmadmin身份,登入從資料庫。
SQL> conn strmadmin/strmadmin
已連線。
#啟動Apply程式
begin
dbms_apply_adm.start_apply(
apply_name => 'apply_orcl');
end;
/
示例:
SQL> begin
2 dbms_apply_adm.start_apply(
3 apply_name => 'apply_orcl');
4 end;
5 /
PL/SQL 過程已成功完成。
#以strmadmin身份,登入主資料庫。
SQL> connect strmadmin/strmadmin
Connected.
#啟動Capture程式
begin
dbms_capture_adm.start_capture(
capture_name => 'capture_dbnms');
end;
/
示例:
SQL> begin
2 dbms_capture_adm.start_capture(
3 capture_name => 'capture_dbnms');
4 end;
5 /
PL/SQL procedure successfully completed.
3.13 停止STREAM
以下是引用片段:
#以strmadmin身份,登入主資料庫。
SQL> connect strmadmin/strmadmin
Connected.
#停止Capture程式
SQL> begin
2 dbms_capture_adm.stop_capture(
3 capture_name => 'capture_dbnms');
4 end;
5 /
PL/SQL procedure successfully completed.
#以strmadmin身份,登入從資料庫。
SQL> conn strmadmin/strmadmin
已連線。
#停止Apply程式
SQL> begin
2 dbms_apply_adm.stop_apply(
3 apply_name => 'apply_orcl');
4 end;
5 /
PL/SQL 過程已成功完成。
如何知道Appy程式是否執行正常
以strmadmin身份,登入從資料庫,執行如下語句:
SELECT apply_name, apply_captured, status FROM dba_apply;
示例:
SQL> SELECT apply_name, apply_captured, status FROM dba_apply;
APPLY_NAME APP STATUS
------------------------------ --- --------
APPLY_ORCL YES DISABLED
如果STATUS狀態是ENABLED,表示Apply程式執行正常;
如果STATUS狀態是DISABLED,表示Apply程式處於停止狀態,只需重新啟動即可;
#以strmadmin身份,登入從資料庫。
SQL> conn strmadmin/strmadmin
已連線。
#啟動Apply程式
begin
dbms_apply_adm.start_apply(
apply_name => 'apply_orcl');
end;
/
示例:
SQL> begin
2 dbms_apply_adm.stop_apply(
3 apply_name => 'apply_orcl');
4 end;
5 /
PL/SQL 過程已成功完成。
如果STATUS狀態是ABORTED,表示Apply程式非正常停止,查詢相應的ERROR_NUMBER、ERROR_MESSAGE列可以得到詳細的資訊;同時,可以查詢DBA_APPLY_ERROR檢視,
瞭解詳細的Apply錯誤資訊。
select propagation_name,destination_dblink,status,ERROR_MESSAGE from dba_propagation;
清除所有配置資訊
要清楚Stream配置資訊,需要先執行3.13,停止Stream程式。
以下是引用片段:
以strmadmin身份,登入主資料庫。
connect strmadmin/strmadmin
SQL> exec DBMS_STREAMS_ADM.remove_streams_configuration();
PL/SQL procedure successfully completed.
#以strmadmin身份,登入從資料庫。
connect strmadmin/strmadmin
SQL> exec DBMS_STREAMS_ADM.remove_streams_configuration();
PL/SQL 過程已成功完成。
然後視需求刪除STREAMS管理員帳號及所屬表空間即可。
DBMS_STREAMS_ADM.REMOVE_STREAMS_CONFIGURATION進行的操作
刪除所有capture程式。
如果仍有表正準備初始化,則透過DBMS_CAPTURE_ADM.ABORT_TABLE_INSTANTIATION過程中止。
如果仍有schema正準備初始化,則透過DBMS_CAPTURE_ADM.ABORT_SCHEMA_INSTANTIATION過程中止。
如果資料庫仍正準備初始化,則透過DBMS_CAPTURE_ADM.ABORT_GLOBAL_INSTANTIATION過程中止。
刪除propagation程式(DBMS_AQADM包建立的propagation不會被刪除),刪除之前,傳播任務將會被禁止。
禁止所有傳播任務。
刪除所有apply程式。如果apply程式存在應用錯誤,則在刪除apply程式前會首先刪除這些應用錯誤。
刪除apply程式的DDL handlers,不過用於handlers的pl/sql過程不會被刪除。
刪除apply程式的message handlers,同樣用於handlers的pl/sql過程不會被刪除。
刪除apply程式的precommit handlers,用於handlers的pl/sql過程不會被刪除。
刪除所有應用物件,schema的instantiation SCN和ignore SCN。
刪除訊息客戶端
重置使用DBMS_STREAMS_ADM.SET_MESSAGE_NOTIFICATION設定的message notification specifications
刪除DML handlers和error handlers,用於handlers的pl/sql過程不會被刪除。
刪除update conflict handlers。
刪除apply tables的substitute key columns。
刪除DBMS_STREAMS_ADM建立的規則集。但不會刪除DBMS_RULE_ADM建立的規則集。
提示:
在執行刪除capture/apply程式前會首先停止這些程式。 REMOVE_STREAMS_CONFIGURATION 過程可 重 復執行(不管是否執行成功) ,如果執行出錯,可在解決造成錯誤的原因後重新執行該過程。
另外,有時候直接執行REMOVE_STREAMS_CONFIGURATION會報錯,這個時候可以嘗試透過DBMS_CAPTURE_ADM/DBMS_PROPAGATION_ADM/DBMS_APPLY_ADM手工停止並刪除捕獲/傳播/應用程式,然後再執行REMOVE_STREAMS_CONFIGURATION過程。
Oracle Stream的測試
4 stream測試
在測試過程中均以dyx使用者身份執行。
4.1 建一張表測試
主資料庫
SQL> conn dyx/dyx
Connected.
SQL> CREATE TABLE test1(id NUMBER PRIMARY KEY,name VARCHAR2(50));
Table created.
在從資料庫
SQL> desc test1;
名稱 是否為空? 型別
----------------------------------------- -------- ------------
ID NOT NULL NUMBER
NAME VARCHAR2(50)
4.2 在主資料庫表中插入一行資料
SQL> insert into test1 values (100,'stream測試');
1 row created.
SQL> commit;
Commit complete.
在從資料庫檢視
SQL> select * from test1;
ID NAME
---------- -------------------------------------------------
100 stream測試
4.3 在主資料庫變更一下表的結構,新增一列
SQL> ALTER TABLE test1 ADD(age NUMBER(3));
Table altered.
在從資料庫
SQL> desc test1
名稱 是否為空? 型別
----------------------------------------- -------- ---------------
ID NOT NULL NUMBER
NAME VARCHAR2(50)
AGE NUMBER(3)
4.4 主資料庫中將表換一個表空間
SQL> SELECT table_name,tablespace_name FROM user_tables
2 WHERE table_name='TEST1';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TEST1 USERS
SQL> ALTER TABLE test1 MOVE TABLESPACE tbs_stream;
Table altered.
SQL> SELECT table_name,tablespace_name FROM user_tables
2 WHERE table_name='TEST1';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TEST1 TBS_STREAM
在從資料庫
SQL> SELECT table_name,tablespace_name FROM user_tables
2 WHERE table_name='TEST1';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TEST1 TBS_STREAM
4.5 主資料庫表上Name列建一索引
SQL> CREATE INDEX test1_name_idx ON test1(name);
Index created.
在從資料庫
SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TEST1';
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
TEST1 SYS_C005169
TEST1 TEST1_NAME_IDX
4.6 主資料庫Rebuild索引測試
SQL> ALTER INDEX test1_name_idx REBUILD;
Index altered.
在從資料庫
SQL> SELECT table_name,index_name FROM user_indexes WHERE table_name = 'TEST1';
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
TEST1 SYS_C005169
TEST1 TEST1_NAME_IDX
4.7 主資料庫表索引換一個表空間測試
SQL> ALTER INDEX test1_name_idx REBUILD TABLESPACE tbs_stream;
Index altered.
在從資料庫
SQL> col TABLE_NAME format a10
SQL> col INDEX_NAME format a30
SQL> col TABLESPACE_NAME format a30
SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes
2 WHERE table_name='TEST1';
TABLE_NAME INDEX_NAME TABLESPACE_NAME
---------- ------------------------------ ------------------------------
TEST1 SYS_C005169 USERS
TEST1 TEST1_NAME_IDX TBS_STREAM
4.8 在主資料庫刪除索引測試
SQL> DROP INDEX test1_name_idx;
Index dropped.
在從資料庫
SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes
2 WHERE table_name ='TEST1';
TABLE_NAME INDEX_NAME TABLESPACE_NAME
---------- ------------------------------ ------------------------------
TEST1 SYS_C005169 USERS
4.9 在主資料庫刪除表測試
SQL> DROP TABLE test1;
Table dropped.
在從資料庫
SQL> DESC test1;
ERROR:
ORA-04043: 物件 test1 不存在
4.10 在主資料庫建一張帶有LOB型別欄位的表測試
SQL> CREATE TABLE test2(id NUMBER PRIMARY KEY, memo CLOB);
Table created.
在從資料庫
SQL> DESC test2;
名稱 是否為空? 型別
----------------------------------------- -------- ----------
ID NOT NULL NUMBER
MEMO CLOB
4.11 在主資料庫表中插入一行資料
SQL> INSERT INTO test2 VALUES(1,'streat_CLOB測試');
1 row created.
SQL> commit;
Commit complete.
在從資料庫
SQL> select * from test2;
ID MEMO
---------- --------------------
1 streat_CLOB測試
4.12 在主資料庫建立Type測試
SQL> CREATE or REPLACE TYPE test_type;
2 /
Type created.
在從資料庫
SQL> select TYPE_NAME from user_types WHERE type_name='TEST_TYPE';
TYPE_NAME
------------------------------
TEST_TYPE
4.13 在主資料庫刪除Type測試
SQL> DROP TYPE test_type;
Type dropped.
在從資料庫
SQL> select TYPE_NAME from user_types WHERE type_name='TEST_TYPE';
未選定行
5 問題診斷
5.1 如何知道捕捉(Capture)程式是否執行正常?
以strmadmin身份,登入主資料庫,執行如下語句:
SELECT CAPTURE_NAME,QUEUE_NAME,RULE_SET_NAME,NEGATIVE_RULE_SET_NAME,STATUS FROM DBA_CAPTURE;
示例:
SQL> SELECT CAPTURE_NAME,QUEUE_NAME,RULE_SET_NAME,NEGATIVE_RULE_SET_NAME,STATUS FROM DBA_CAPTURE;
CAPTURE_NAME QUEUE_NAME RULE_SET_NAME NEGATIVE_RULE_SET_NAME STATUS
--------------- ---------------- -------------- ----------------------- --------
CAPTURE_DBNMS DBNMS_QUEUE RULESET$_14 DISABLED
如果STATUS狀態是ENABLED,表示Capture程式執行正常;
如果STATUS狀態是DISABLED,表示Capture程式處於停止狀態,只需重新啟動即可;
begin
dbms_capture_adm.start_capture(
capture_name => 'capture_dbnms');
end;
/
示例:
SQL> begin
2 dbms_capture_adm.start_capture(
3 capture_name => 'capture_dbnms');
4 end;
5 /
PL/SQL procedure successfully completed.
SQL> SELECT CAPTURE_NAME,QUEUE_NAME,RULE_SET_NAME,NEGATIVE_RULE_SET_NAME,STATUS FROM DBA_CAPTURE;
CAPTURE_NAME QUEUE_NAME RULE_SET_NAME NEGATIVE_RULE_SET_NAME STATUS
--------------- ---------------- -------------- ----------------------- --------
CAPTURE_DBNMS DBNMS_QUEUE RULESET$_14 ENABLED
如果STATUS狀態是ABORTED,表示Capture程式非正常停止,查詢相應的ERROR_NUMBER、ERROR_MESSAGE列可以得到詳細的資訊;同時,Oracle會在跟蹤檔案中記錄該信
息。
5.2 如何知道Captured LCR是否有傳播GAP?
以strmadmin身份,登入主資料庫,執行如下語句:
SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN FROM DBA_CAPTURE;
示例:
SQL> SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN FROM DBA_CAPTURE;
CAPTURE_NAME QUEUE_NAME STATUS CAPTURED_SCN APPLIED_SCN
--------------- ------------- -------- ------------ -----------
CAPTURE_DBNMS DBNMS_QUEUE ENABLED 142078352 142078352
注:透過測試,Stream的功能很強大,也很實用,但在實施過程中,開始測試不能透過,花了好長時間,發現建立使用者時他們的引數設定需相同