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 userid=dyx/dyx@dbnms 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 userid=system/oracle@orcl 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 => 'strmadmin.orcl_queue@orcl',
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 => 'strmadmin.orcl_queue@orcl',
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的功能很强大,也很实用,但在实施过程中,开始测试不能通过,花了好长时间,发现建立用户时他们的参数设置需相同