Oracle Stream配置详细步骤
Oracle Stream配置詳細(xì)步驟
作者: 楊寶秋, 出處:IT1681 引言
Oracle Stream功能是為提高數(shù)據(jù)庫(kù)的高可用性而設(shè)計(jì)的,在Oracle 9i及之前的版本這個(gè)功能被稱(chēng)為Advance Replication。Oracle Stream利用高級(jí)隊(duì)列技術(shù),通過(guò)解析歸檔日志,將歸檔日志解析成DDL及DML語(yǔ)句,從而實(shí)現(xiàn)數(shù)據(jù)庫(kù)之間的同步。這種技術(shù)可以將整個(gè)數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)中的對(duì)象復(fù)制到另一數(shù)據(jù)庫(kù)中,通過(guò)使用Stream的技術(shù),對(duì)歸檔日志的挖掘,可以在對(duì)主系統(tǒng)沒(méi)有任何壓力的情況下,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)對(duì)象級(jí)甚至整個(gè)數(shù)據(jù)庫(kù)的同步。
解析歸檔日志這種技術(shù)現(xiàn)在應(yīng)用的比較廣泛,Quest公司的shareplex軟件及DSG公司的realsync都是這樣的產(chǎn)品,一些公司利用這樣的產(chǎn)品做應(yīng)用級(jí)的容災(zāi)。但shareplex或是realsync都是十分昂貴的,因此你可以嘗試用Stream這個(gè)Oracle提供的不用額外花錢(qián)的功能。Oracle Stream對(duì)生產(chǎn)庫(kù)的影響是非常小的,從庫(kù)可以是與主庫(kù)不同的操作系統(tǒng)平臺(tái),你可以利用Oracle Stream復(fù)制幾個(gè)從庫(kù),從庫(kù)可用于查詢(xún)、報(bào)表、容災(zāi)等不同的功能。本文不談技術(shù)細(xì)節(jié),只是以手把手的方式一步一步的帶你把Stream的環(huán)境搭建起來(lái),細(xì)節(jié)內(nèi)容可以查聯(lián)機(jī)文檔。
2 概述
主數(shù)據(jù)庫(kù):
操作系統(tǒng):Solaris 9
IP地址:192.168.10.35
數(shù)據(jù)庫(kù):Oracle 10.2.0.2
ORACLE_SID:prod
Global_name:prod
從數(shù)據(jù)庫(kù):
操作系統(tǒng):AIX 5.2
IP地址:192.168.10.43
數(shù)據(jù)庫(kù):Oracle 10.2.0.3
ORACLE_SID:h10g
Global_name:h10g
3 環(huán)境準(zhǔn)備
3.1 設(shè)定初始化參數(shù)
使用pfile的修改init.ora文件,使用spfile的通過(guò)alter system命令修改spile文件。主、從數(shù)據(jù)庫(kù)分別執(zhí)行如下的語(yǔ)句:
?
| 以下是引用片段: 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; |
?
執(zhí)行完畢后重啟數(shù)據(jù)庫(kù)。
3.2 將數(shù)據(jù)庫(kù)置為歸檔模式
設(shè)置log_archive_dest_1到相應(yīng)的位置;設(shè)定log_archive_start為T(mén)RUE,即啟用自動(dòng)歸檔功能;設(shè)定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; |
?
數(shù)據(jù)庫(kù)置為歸檔模式后,可以按如下方式檢驗(yàn)一下:
?
| 以下是引用片段: 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 創(chuàng)建stream 管理用戶(hù)
3.3.1 創(chuàng)建主環(huán)境stream管理用戶(hù)
?
| 以下是引用片段: #以sysdba身份登錄 connect?/?as?sysdba #創(chuàng)建主環(huán)境的Stream專(zhuān)用表空間 create?tablespace?tbs_stream?datafile?'/yang/oradata/prod/tbs_stream01.dbf' size?100m?autoextend?on?maxsize?unlimited?segment?space?management?auto; #將logminer的數(shù)據(jù)字典從system表空間轉(zhuǎn)移到新建的表空間,防止撐滿(mǎn)system表空間 execute?dbms_logmnr_d.set_tablespace('tbs_stream'); #創(chuàng)建Stream管理用戶(hù) create?user?strmadmin?identified?by?strmadmin default?tablespace?tbs_stream?temporary?tablespace?temp; #授權(quán)Stream管理用戶(hù) 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 創(chuàng)建從環(huán)境stream管理用戶(hù)?
| 以下是引用片段: #以sysdba身份登錄 connect?/?as?sysdba #創(chuàng)建Stream專(zhuān)用表空間,我的從庫(kù)用了ASM,這一步也可以參見(jiàn)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的數(shù)據(jù)字典從system表空間轉(zhuǎn)移到新建的表空間,防止撐滿(mǎn)system表空間 execute?dbms_logmnr_d.set_tablespace('tbs_stream'); #創(chuàng)建Stream管理用戶(hù) create?user?strmadmin?identified?by?strmadmin default?tablespace?tbs_stream?temporary?tablespace?temp; #授權(quán)Stream管理用戶(hù) grant?connect,resource,dba,aq_administrator_role?to?strmadmin; begin dbms_streams_auth.grant_admin_privilege( grantee?=>?'strmadmin', grant_privileges?=>?true); end; / |
?
3.4 配置網(wǎng)絡(luò)連接
3.4.1配置主環(huán)境tnsnames.ora
主數(shù)據(jù)庫(kù)(tnsnames.ora)中添加從數(shù)據(jù)庫(kù)的配置。
?
| 以下是引用片段: H10G?= (DESCRIPTION?= (ADDRESS_LIST?= (ADDRESS?=?(PROTOCOL?=?TCP)(HOST?=?192.168.10.43)(PORT?=?1521)) ) (CONNECT_DATA?= (SID?=?h10g) (SERVER?=?DEDICATED) ) ) |
?
3.4.2配置從環(huán)境tnsnames.ora
?
| 以下是引用片段: 從數(shù)據(jù)庫(kù)(tnsnames.ora)中添加主數(shù)據(jù)庫(kù)的配置。 PROD?= (DESCRIPTION?= (ADDRESS_LIST?= (ADDRESS?=?(PROTOCOL?=?TCP)(HOST?=?192.168.10.35)(PORT?=?1521)) ) (CONNECT_DATA?= (SID?=?prod) (SERVER?=?DEDICATED) ) ) |
?
3.5 啟用追加日志可以基于Database級(jí)別或Table級(jí)別,啟用追加日志(Supplemental Log)。在建立根據(jù)Schema粒度進(jìn)行復(fù)制的Oracle Stream環(huán)境中,如果確認(rèn)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 創(chuàng)建DBlink
根據(jù)Oracle 10gR2 Stream官方文檔,針對(duì)主數(shù)據(jù)庫(kù)建立的數(shù)據(jù)庫(kù)鏈的名字必須和從數(shù)據(jù)庫(kù)的global_name相同。
如果需要修改global_name,執(zhí)行“alter database rename global_name to xxx”。
3.6.1創(chuàng)建主數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)鏈
#以strmadmin身份,登錄主數(shù)據(jù)庫(kù)。
connect strmadmin/strmadmin
#建立數(shù)據(jù)庫(kù)鏈
create database link h10g connect to strmadmin identified by strmadmin using 'h10g';
3.6.2創(chuàng)建從數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)鏈
#以strmadmin身份,登錄從數(shù)據(jù)庫(kù)。
connect strmadmin/strmadmin
#建立數(shù)據(jù)庫(kù)鏈
create database link prod connect to strmadmin identified by strmadmin using 'prod';
3.7 創(chuàng)建流隊(duì)列
3.7.1創(chuàng)建Master流隊(duì)列
?
| 以下是引用片段: #以strmadmin身份,登錄主數(shù)據(jù)庫(kù)。 connect?strmadmin/strmadmin begin dbms_streams_adm.set_up_queue( queue_table?=>?'prod_queue_table', queue_name?=>?'prod_queue'); end; / |
?
3.7.2創(chuàng)建Backup流隊(duì)列
?
| 以下是引用片段: #以strmadmin身份,登錄從數(shù)據(jù)庫(kù)。 connect?strmadmin/strmadmin begin dbms_streams_adm.set_up_queue( queue_table?=>?'h10g_queue_table', queue_name?=>?'h10g_queue'); end; / |
?
3.8 創(chuàng)建捕獲進(jìn)程
?
| 以下是引用片段: #以strmadmin身份,登錄主數(shù)據(jù)庫(kù)。提醒一下,本文檔以hr用戶(hù)做示例。 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 實(shí)例化復(fù)制數(shù)據(jù)庫(kù)
在主數(shù)據(jù)庫(kù)環(huán)境中,執(zhí)行如下Shell語(yǔ)句。如果從庫(kù)的hr用戶(hù)不存在,建立一個(gè)hr的空用戶(hù)。
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 創(chuàng)建傳播進(jìn)程
?
| 以下是引用片段: #以strmadmin身份,登錄主數(shù)據(jù)庫(kù)。 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休眠時(shí)間為0,表示實(shí)時(shí)傳播LCR。 begin dbms_aqadm.alter_propagation_schedule( queue_name?=>?'prod_queue', destination?=>?'h10g', latency?=>?0); end; / |
?
3.11 創(chuàng)建應(yīng)用進(jìn)程?
| 以下是引用片段: #以strmadmin身份,登錄從數(shù)據(jù)庫(kù)。 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 啟動(dòng)STREAM
?
| 以下是引用片段: #以strmadmin身份,登錄從數(shù)據(jù)庫(kù)。 connect?strmadmin/strmadmin #啟動(dòng)Apply進(jìn)程 begin dbms_apply_adm.start_apply( apply_name?=>?'apply_h10g'); end; / #以strmadmin身份,登錄主數(shù)據(jù)庫(kù)。 connect?strmadmin/strmadmin #啟動(dòng)Capture進(jìn)程 begin dbms_capture_adm.start_capture( capture_name?=>?'capture_prod'); end; / |
?
3.13 停止STREAM
?
| 以下是引用片段: #以strmadmin身份,登錄主數(shù)據(jù)庫(kù)。 connect?strmadmin/strmadmin #停止Capture進(jìn)程 begin dbms_capture_adm.stop_capture( capture_name?=>?'capture_prod'); end; / #以strmadmin身份,登錄從數(shù)據(jù)庫(kù)。 connect?strmadmin/strmadmin #停止Apply進(jìn)程 begin dbms_apply_adm.stop_apply( apply_name?=>?'apply_h10g'); end; / |
?
3.14 清除所有配置信息要清楚Stream配置信息,需要先執(zhí)行3.13,停止Stream進(jìn)程。
?
| 以下是引用片段: #以strmadmin身份,登錄主數(shù)據(jù)庫(kù)。 connect?strmadmin/strmadmin exec?DBMS_STREAMS_ADM.remove_streams_configuration(); #以strmadmin身份,登錄從數(shù)據(jù)庫(kù)。 connect?strmadmin/strmadmin exec?DBMS_STREAMS_ADM.remove_streams_configuration(); |
?
4 測(cè)試場(chǎng)景
本文檔建立了針對(duì)hr用戶(hù)的Stream 復(fù)制環(huán)境,如果沒(méi)有特別聲明,以下測(cè)試場(chǎng)景均以hr用戶(hù)身份執(zhí)行。
4.1 建一張表測(cè)試
主數(shù)據(jù)庫(kù)
SQL> CREATE TABLE TTT(id NUMBER PRIMARY KEY,
2 name VARCHAR2(50)
3 )
4 /
Table created.
從數(shù)據(jù)庫(kù)
SQL> desc TTT
Name Null? Type
---------- -------- -------------
ID NOT NULL NUMBER
NAME VARCHAR2(50)
4.2 表中插入一行數(shù)據(jù)
主數(shù)據(jù)庫(kù)
SQL> insert into ttt values (1,'sdfsdfsdfsdf');
1 row created.
SQL> commit;
Commit complete.
SQL>
從數(shù)據(jù)庫(kù)
SQL> select * from TTT;
ID NAME
---------- --------------------
1 sdfsdfsdfsdf
4.3 變更一下表的結(jié)構(gòu),添加一列
主數(shù)據(jù)庫(kù)
SQL> ALTER TABLE TTT ADD(age NUMBER(2));
Table altered
從數(shù)據(jù)庫(kù)
SQL> desc TTT
Name Null? Type
----------- -------- --------------
ID NOT NULL NUMBER
NAME VARCHAR2(50)
AGE NUMBER(2)
4.4 將表?yè)Q一個(gè)表空間
主數(shù)據(jù)庫(kù)
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
從數(shù)據(jù)庫(kù)
SQL> SELECT table_name,tablespace_name FROM user_tables
WHERE table_name='TTT';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TTT TBS_STREAM
4.5 表上Name列建一索引
主數(shù)據(jù)庫(kù)
SQL> CREATE INDEX ttt_name_idx ON TTT(name);
Index created
從數(shù)據(jù)庫(kù)
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索引測(cè)試
主數(shù)據(jù)庫(kù)
SQL> ALTER INDEX ttt_name_idx REBUILD;
Index altered
從數(shù)據(jù)庫(kù)
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 索引換一個(gè)表空間測(cè)試
主數(shù)據(jù)庫(kù)
SQL> ALTER INDEX ttt_name_idx REBUILD TABLESPACE tbs_stream;
Index altered
從數(shù)據(jù)庫(kù)
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 刪除索引測(cè)試
主數(shù)據(jù)庫(kù)
SQL> DROP INDEX ttt_name_idx;
Index dropped
從數(shù)據(jù)庫(kù)
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 刪除表測(cè)試
主數(shù)據(jù)庫(kù)
SQL> DROP TABLE ttt;
Table dropped
從數(shù)據(jù)庫(kù)
SQL> DESC ttt;
Object ttt does not exist.
4.10 建一張帶有LOB類(lèi)型字段的表測(cè)試
主數(shù)據(jù)庫(kù)
SQL> CREATE TABLE tttclob(id NUMBER PRIMARY KEY, memo CLOB);
Table created
從數(shù)據(jù)庫(kù)
SQL> DESC tttclob;
Name Null? Type
----------- -------- --------------
ID NOT NULL NUMBER
MEMO CLOB
4.11 表中插入一行數(shù)據(jù)
主數(shù)據(jù)庫(kù)
SQL> INSERT INTO tttclob VALUES(1,'clob_test');
1 row inserted
SQL> commit;
Commit complete
從數(shù)據(jù)庫(kù)
SQL> SELECT * FROM tttclob;
ID MEMO
---------- --------------------------------------------------------------------------------
1 clob_test
4.12 創(chuàng)建Type測(cè)試
主數(shù)據(jù)庫(kù)
SQL> CREATE or REPLACE TYPE ttttype;
2 /
Type created
從數(shù)據(jù)庫(kù)
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測(cè)試
主數(shù)據(jù)庫(kù)
SQL> DROP TYPE ttttype;
Type dropped
從數(shù)據(jù)庫(kù)
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 問(wèn)題診斷
5.1 如何知道捕捉(Capture)進(jìn)程是否運(yùn)行正常?
以strmadmin身份,登錄主數(shù)據(jù)庫(kù),執(zhí)行如下語(yǔ)句:
SQL> SELECT CAPTURE_NAME,
2 QUEUE_NAME,
3 RULE_SET_NAME,
4 NEGATIVE_RULE_SET_NAME,
5 STATUS
6 FROM DBA_CAPTURE;
結(jié)果顯示如下:
CAPTURE_NAME QUEUE_NAME
------------------------------ ------------------------------
RULE_SET_NAME NEGATIVE_RULE_SET_NAME STATUS
------------------------------ ------------------------------ --------
CAPTURE_PROD PROD_QUEUE
RULESET$_14 ENABLED
ENABLED
如果STATUS狀態(tài)是ENABLED,表示Capture進(jìn)程運(yùn)行正常;
如果STATUS狀態(tài)是DISABLED,表示Capture進(jìn)程處于停止?fàn)顟B(tài),只需重新啟動(dòng)即可;
如果STATUS狀態(tài)是ABORTED,表示Capture進(jìn)程非正常停止,查詢(xún)相應(yīng)的ERROR_NUMBER、ERROR_MESSAGE列可以得到詳細(xì)的信息;同時(shí),Oracle會(huì)在跟蹤文件中記錄該信息。
5.2 如何知道Captured LCR是否有傳播GAP?
以strmadmin身份,登錄主數(shù)據(jù)庫(kù),執(zhí)行如下語(yǔ)句:
SQL> SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN
2 FROM DBA_CAPTURE;
結(jié)果顯示如下:
CAPTURE_NAME QUEUE_NAME STATUS
------------------------------ ------------------------------ --------
CAPTURED_SCN APPLIED_SCN
------------ -----------
CAPTURE_PROD PROD_QUEUE ENABLED
17023672 17023672
如果APPLIED_SCN小于CAPTURED_SCN,則表示在主數(shù)據(jù)庫(kù)一端,要么LCR沒(méi)有被dequeue,要么Propagation進(jìn)程尚未傳播到從數(shù)據(jù)庫(kù)一端。
5.3 如何知道Appy進(jìn)程是否運(yùn)行正常?
以strmadmin身份,登錄從數(shù)據(jù)庫(kù),執(zhí)行如下語(yǔ)句:
SQL> SELECT apply_name, apply_captured, status FROM dba_apply;
結(jié)果顯示如下:
APPLY_NAME APPLY_ STATUS
---------------------- ------ ----------------
APPLY_H10G YES ENABLED
如果STATUS狀態(tài)是ENABLED,表示Apply進(jìn)程運(yùn)行正常;
如果STATUS狀態(tài)是DISABLED,表示Apply進(jìn)程處于停止?fàn)顟B(tài),只需重新啟動(dòng)即可;
如果STATUS狀態(tài)是ABORTED,表示Apply進(jìn)程非正常停止,查詢(xún)相應(yīng)的ERROR_NUMBER、ERROR_MESSAGE列可以得到詳細(xì)的信息;同時(shí),可以查詢(xún)DBA_APPLY_ERROR視圖,了解詳細(xì)的Apply錯(cuò)誤信息。
6 結(jié)篇
通過(guò)如上的測(cè)試可以看出stream的功能還是十分強(qiáng)大的,通過(guò)配置Oracle Stream可以更大的提升數(shù)據(jù)庫(kù)的可用性和安全性,如此一個(gè)好用且不用花費(fèi)高昂額外費(fèi)用的功能還是很值得一用的。
轉(zhuǎn)載于:https://www.cnblogs.com/jerryxing/archive/2013/03/13/2957000.html
總結(jié)
以上是生活随笔為你收集整理的Oracle Stream配置详细步骤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第一阶段冲刺07
- 下一篇: CodeForces - 617E X