配置 Oracle 10g 双向流
复制
by Maclean.liu
liu.maclean@gmail.com
www.oracledatabase12g.com
About Me
l Email:liu.maclean@gmail.com
l Blog:www.oracledatabase12g.com
l Oracle Certified Database Administrator Master 10g
and 11g
l Over 6 years experience with Oracle DBA technology
l Over 7 years experience with Linux technology
l Member Independent Oracle Users Group
l Member All China Users Group
l Presents for advanced Oracle topics: RAC,
DataGuard, Performance Tuning and Oracle Internal.
构建 Oracle 双向流复制是一个十分复杂的过程,我写这个文档的目的是尽量有条理地列出所需做的工作,帮助
DBA 更有效的建设流复制环境。
1.以 scott 模式为复制示例,一般只要在创建数据库时选择了安装 sample schema,都会存在该 scott 模式;至少
保证源库中存在该 schema,以便可以初始化到目标库中。
2.在源和目标 2 个数据库中创建 strmadmin 流管理用户,当然你也可以选用其他名字。同时在 2 个库中都要创建
streams 使用的表空间,以便让 logmnr 使用它:
CREATE TABLESPACE streams_tbs DATAFILE 'XXXXXX' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE
UNLIMITED;
/* 10g r2 中 logmnr 默认使用 SYSAUX 表空间 */
exec DBMS_LOGMNR_D.SET_TABLESPACE ('streams_tbs');
/* 创建完表空间后,接着要创建 strmadmin 用户 */
CREATE USER strmadmin IDENTIFIED BY strmadmin
DEFAULT TABLESPACE streams_tbs
QUOTA UNLIMITED ON streams_tbs;
GRANT DBA TO strmadmin;
BEGIN
DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(
grantee => 'strmadmin',
grant_privileges => true);
END;
/
/* 可以通过查询 dba_streams_administrator 视图检查用户是否正确授予流管理权限 */
SQL> SELECT * FROM dba_streams_administrator;
USERNAME LOC ACC
------------------------------ --- ---
MACLEAN YES YES
STRMADMIN YES YES
3.在 2 边数据库中都需要设置合理的实例初始化参数,我们以 10g release2 为例:
参数名与推荐值:_job_queue_interval = 1
描述:job 的队列的扫描参数,默认为 5,即 5s 扫描一次
出于何种考虑:设置较小的_job_queue_interval 有利于 propagation 作业
如何设置:alter system set "_job_queue_interval"=1 scope=spfile;
/* 注意 scope=spfile 的参数都需要重启实例方能生效 */
参数名与推荐值:COMPATIBLE>= 10.2.0.0
描述:数据库版本兼容性参数,以前介绍过,不再展开
出于何种考虑:10g release2 的部分 Streams 新特性要求该参数至少为 10.2.0.0 或更高
如何设置:只有从较低版本升级到 10g r2 的数据库需要设置该参数,
alter system set compatible="10.2.0.0" scope=spfile;
参数名与推荐值:GLOBAL_NAMES=true
描述:指定是否要求 database link 名与数据库全局名一致,默认为 FALSE 也就是不需要一致
出于何种考虑:帮助我们准确识别 database link 和数据库的关系,避免误操作
如何设置:alter system set global_names=true scope=spfile;
参数名与推荐值:job_queue_processes>4
描述:指定了实例中 job 队列进程的数量(如 J000…J999).
出于何种考虑:该参数控制了实例中能够并行运行的 job 的最大值,应设一个大于已配置的 propagations
数量的值,同时也要考虑到可能还有其他数据库作业
如何设置:alter system set job_queue_processes=15;
参数名与推荐值:PARALLEL_MAX_SERVERS
描述:指定了实例中最大并行进程的数量
出于何种考虑:
在 Streams 环境中,capture 进程和 apply 进程都会用到多个并行进程。
设置该初始化参数为适当值(10*CPU#)以保证总是有足够的可用并行进程;
每多一个 capture 或 apply 进程,则有必要为该参数+2 再加上加入的 capture 或 apply 进程的并行度 parallelism
参数。
如何设置:
alter system set PARALLEL_MAX_SERVERS=40;
参数名与推荐值:REMOTE_ARCHIVE_ENABLE
描述:指定是否将归档日志传送到远程目的地
出于何种考虑:只有 downstream capture 时会用到,不展开
4.为 scott schema 下的对象创建追加日志(supplemental log),可以使用 dbms_capture_adm 包的
prepare_schema_instantiation 存储过程为指定模式创建追加日志:
NAME
prepare_schema_instantiation()
FUNCTION
prepare a schema for instantiation
PARAMETERS
schema_name - (IN) the name of the schema to prepare
supplemental_logging - (IN) supplemental logging level
('NONE', 'KEYS', or 'ALL')
NOTES
KEYS means PRIMARY KEY, UNIQUE INDEX, and FOREIGN KEY levels combined.
----------------------------------------------------------------------------*/
PROCEDURE prepare_schema_instantiation(
schema_name IN VARCHAR2,
supplemental_logging IN VARCHAR2 DEFAULT 'KEYS');
/* 其默认 supplemental_logging 选项为 Key,即为 PRIMARY KEY, UNIQUE INDEX, and FOREIGN KEY 等键
创建 IMPLICIT 的追加日志 */
/* 在 10g 或以上版本中 prepare_xxx_instantiation 存储过程也会隐式地创建追加日志组了
(In versions 10g and above,prepare_xxx_instantiation procedure implicitly creates
supplemenal log groups.
Type of supplemental logging that is enabled implicitly using this command can be checked
using the sql in the following link to the documentation. However, additional
supplemental
logging might need to be enabled depending on the requirements as mentioned above)。
可以通过以下查询了解其追加日志组的属性:
SELECT SCHEMA_NAME,
SUPPLEMENTAL_LOG_DATA_PK log_pk,
SUPPLEMENTAL_LOG_DATA_FK log_fk,
SUPPLEMENTAL_LOG_DATA_UI log_ui,
SUPPLEMENTAL_LOG_DATA_ALL log_all
FROM DBA_CAPTURE_PREPARED_SCHEMAS;
SCHEMA_NAME LOG_PK LOG_FK LOG_UI LOG_ALL
------------------------------ -------- -------- -------- --------
SCOTT IMPLICIT IMPLICIT IMPLICIT NO
5.在源库上创建到目标库 strmadmin 用户的 database link:
conn strmadmin/strmadmin;
Connected.
create database link clinicb.rh3.oracle.com connect to strmadmin identified by strmadmin
using 'clinicb.rh3.oracle.com';
Database link created.
/* 其中 clinicb.rh3.oracle.com 为目标库的全局数据库名,clinicb 为 db_name,rh3.oracle.com 为
domain_name */
在目标库上创建到源库 strmadmin 用户的 database link:
conn strmadmin/strmadmin;
Connected.
create database link clinica.rh2.oracle.com connect to strmadmin identified by strmadmin
using 'clinica.rh2.oracle.com';
Database link created.
/* 其中 clinica.rh2.oracle.com 为源库的全局数据库名,clinica 为数据库名,rh2.oracle.com 为
domain_name */
6.在源库中分别为 capture 和 apply 创建队列 queue:
begin
dbms_streams_adm.set_up_queue(
queue_table => 'apply_srctab',
queue_name => 'apply_src',
queue_user => 'strmadmin');
end;
/
PL/SQL procedure successfully completed.
begin
dbms_streams_adm.set_up_queue(
queue_table => 'capture_srctab',
queue_name => 'capture_src',