streams之用dbms_streams_admin.maintain_tables快速创建表级复制流
源库:source
目标库:target
数据库版本:10.2.0.4
源库:source
目标库:target
数据库版本:10.2.0.4
调整参数(源库/目标库)
alter system set aq_tm_processes=10 scope=both;
alter system set global_names=true scope=both; #建议但并不是必须
alter system set undo_retention=3600 scope=both;
alter system set job_queue_processes=10 scope=both;
alter system set parallel_max_servers=10 scope=both;
alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile; #建议但并不是必须
alter system set streams_pool_size=50M scope=spfile;
alter system set utl_file_dir='*' scope=spfile; #建议但并不是必须
alter system set open_links=4 scope=spfile;
参数说明:
流初始化参数
streams_pool_size
指定流池的大小 (字节)。流池包含缓冲的队列事件。另外, 流池也可用于在流捕获和应用期间进行内部通信。此参数是可修改的。如果在某个实例运行时此参数减为零, 流进程和作业将不会运行。
alter system set aq_tm_processes=10 scope=both;
alter system set global_names=true scope=both; #建议但并不是必须
alter system set undo_retention=3600 scope=both;
alter system set job_queue_processes=10 scope=both;
alter system set parallel_max_servers=10 scope=both;
alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile; #建议但并不是必须
alter system set streams_pool_size=50M scope=spfile;
alter system set utl_file_dir='*' scope=spfile; #建议但并不是必须
alter system set open_links=4 scope=spfile;
参数说明:
流初始化参数
streams_pool_size
指定流池的大小 (字节)。流池包含缓冲的队列事件。另外, 流池也可用于在流捕获和应用期间进行内部通信。此参数是可修改的。如果在某个实例运行时此参数减为零, 流进程和作业将不会运行。
job_queue_processes
传播由作业队列进程处理。实例中启动的作业队列进程数由此参数控制。此参数的默认值为 0。要传播消息, 必须至少将此参数设置为 2。如果有多个要从中传播消息的队列, 有多个要将消息传播到的目标, 或作业队列中存在其他作业, 则可以将此参数设置为更高的值。
传播由作业队列进程处理。实例中启动的作业队列进程数由此参数控制。此参数的默认值为 0。要传播消息, 必须至少将此参数设置为 2。如果有多个要从中传播消息的队列, 有多个要将消息传播到的目标, 或作业队列中存在其他作业, 则可以将此参数设置为更高的值。
parallel_max_servers
指定实例的最大并行执行进程数和最大并行恢复进程数。随着需求的增长, Oracle 的进程数将从实例启动时创建的值增加到此值。在流环境中, 每个捕获进程和应用进程都可以使用多个并行执行服务器。将此初始化参数设置为一个适当的值, 可以确保有足够的并行执行服务器。
指定实例的最大并行执行进程数和最大并行恢复进程数。随着需求的增长, Oracle 的进程数将从实例启动时创建的值增加到此值。在流环境中, 每个捕获进程和应用进程都可以使用多个并行执行服务器。将此初始化参数设置为一个适当的值, 可以确保有足够的并行执行服务器。
sga_target
指定所有系统全局区 (SGA) 组件的总大小。如果此参数设置为非零值, 则流池的大小将由自动共享内存管理来管理。
指定所有系统全局区 (SGA) 组件的总大小。如果此参数设置为非零值, 则流池的大小将由自动共享内存管理来管理。
undo_retention
指定要保留在数据库中的已提交的还原信息量 (以秒为单位)。对于运行一个或多个捕获进程的数据库, 必须设置此参数以指定适当的还原保留期。如果您正在运行一个或多个捕获进程且不确定设置是否正确, 请尝试将此参数设置为不小于 3600 的值。另外, 还需要确保还原表空间有足够的空间来容纳 UNDO_RETENTION 设置。
建议值:undo_retention=3600
指定要保留在数据库中的已提交的还原信息量 (以秒为单位)。对于运行一个或多个捕获进程的数据库, 必须设置此参数以指定适当的还原保留期。如果您正在运行一个或多个捕获进程且不确定设置是否正确, 请尝试将此参数设置为不小于 3600 的值。另外, 还需要确保还原表空间有足够的空间来容纳 UNDO_RETENTION 设置。
建议值:undo_retention=3600
aq_tm_processes
在 Oracle Database 10g 之前的版本中, Oracle 流高级队列时间管理器进程由此参数控制, 必须将此参数设置为非零值才能执行队列消息时间监视, 并处理指定了延迟和失效属性的消息。尽管使用 Oracle 流高级队列或流时不再需要设置此参数, 但如果您确实指定了一个值, 那么仍将考虑该值。该值可以在 0 到 10 之间。将该值设置为 0 将禁用队列监视后台进程。但是, 建议您不要指定此参数, 从而使系统自动进行优化。
建议值:aq_tm_processes=10
在 Oracle Database 10g 之前的版本中, Oracle 流高级队列时间管理器进程由此参数控制, 必须将此参数设置为非零值才能执行队列消息时间监视, 并处理指定了延迟和失效属性的消息。尽管使用 Oracle 流高级队列或流时不再需要设置此参数, 但如果您确实指定了一个值, 那么仍将考虑该值。该值可以在 0 到 10 之间。将该值设置为 0 将禁用队列监视后台进程。但是, 建议您不要指定此参数, 从而使系统自动进行优化。
建议值:aq_tm_processes=10
创建用户(源库/目标库)
create user strmadmin identified by strmadmin default tablespace users temporary tablespace temp;
grant connect,resource,dba,select_catalog_role,select any dictionary to strmadmin;
begin
dbms_streams_auth.grant_admin_privilege(grantee=>'strmadmin',grant_privileges=>true);
end;
/
create user strmadmin identified by strmadmin default tablespace users temporary tablespace temp;
grant connect,resource,dba,select_catalog_role,select any dictionary to strmadmin;
begin
dbms_streams_auth.grant_admin_privilege(grantee=>'strmadmin',grant_privileges=>true);
end;
/
双方配置tns(源库/目标库)
target =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT =2521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = target)
)
)
source =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = source)
)
)
target =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = host2)(PORT =2521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = target)
)
)
source =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = host1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = source)
)
)
创建dblink,名字要和global_name一致
源库:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
source
SQL> connect strmadmin/strmadmin
Connected.
SQL> create database link target connect to strmadmin identified by strmadmin using 'target';
Database link created.
SQL> select * from dual@target;
D
-
X
源库:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
source
SQL> connect strmadmin/strmadmin
Connected.
SQL> create database link target connect to strmadmin identified by strmadmin using 'target';
Database link created.
SQL> select * from dual@target;
D
-
X
目标库:
create database link source connect to strmadmin identified by strmadmin using 'source';
SQL> connect strmadmin/strmadmin
Connected.
SQL> create database link source connect to strmadmin identified by strmadmin using 'source';
Database link created.
SQL>select * from dual@source;
D
-
X
create database link source connect to strmadmin identified by strmadmin using 'source';
SQL> connect strmadmin/strmadmin
Connected.
SQL> create database link source connect to strmadmin identified by strmadmin using 'source';
Database link created.
SQL>select * from dual@source;
D
-
X
源库起用supplemental log
SQL> alter database add supplemental log data;
Database altered.
SQL> alter database add supplemental log data;
Database altered.
用dbms_streams_admin.maintain_tables快速创建target用户下t1,t2,t3三张表的复制关系,注意如果多次执行,请先在目标库上删除这些需要复制的对象
DECLARE
tbls DBMS_UTILITY.UNCL_ARRAY;
BEGIN
tbls(1) := 'target.t1';
tbls(2) := 'target.t2';
tbls(3) := 'target.t3';
DBMS_STREAMS_ADM.MAINTAIN_TABLES(
table_names => tbls,
source_directory_object => 'DATA_PUMP_DIR',
destination_directory_object => 'DATA_PUMP_DIR',
source_database => 'source',
destination_database => 'target',
perform_actions => true,
dump_file_name => 'export_tbls_20100925.dmp',
log_file => 'export_tbls_expdp_20100925.log',
script_name => 'configure_rep_20100925.sql',
script_directory_object => 'DATA_PUMP_DIR',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK);
END;
/
以上过程在源库上执行,执行成功的话,三张表的streams复制已经配置完成,可以找张表插入条记录测试一下
注1:dbms_streams_adm.maintain_tables说明
PROCEDURE MAINTAIN_TABLES
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
TABLE_NAMES TABLE OF VARCHAR2(227) IN
SOURCE_DIRECTORY_OBJECT VARCHAR2 IN
DESTINATION_DIRECTORY_OBJECT VARCHAR2 IN
SOURCE_DATABASE VARCHAR2 IN
DESTINATION_DATABASE VARCHAR2 IN
PERFORM_ACTIONS BOOLEAN IN DEFAULT
SCRIPT_NAME VARCHAR2 IN DEFAULT
SCRIPT_DIRECTORY_OBJECT VARCHAR2 IN DEFAULT
DUMP_FILE_NAME VARCHAR2 IN DEFAULT
CAPTURE_NAME VARCHAR2 IN DEFAULT
CAPTURE_QUEUE_TABLE VARCHAR2 IN DEFAULT
CAPTURE_QUEUE_NAME VARCHAR2 IN DEFAULT
CAPTURE_QUEUE_USER VARCHAR2 IN DEFAULT
PROPAGATION_NAME VARCHAR2 IN DEFAULT
APPLY_NAME VARCHAR2 IN DEFAULT
APPLY_QUEUE_TABLE VARCHAR2 IN DEFAULT
APPLY_QUEUE_NAME VARCHAR2 IN DEFAULT
APPLY_QUEUE_USER VARCHAR2 IN DEFAULT
LOG_FILE VARCHAR2 IN DEFAULT
BI_DIRECTIONAL BOOLEAN IN DEFAULT
INCLUDE_DDL BOOLEAN IN DEFAULT
INSTANTIATION BINARY_INTEGER IN DEFAULT
注2:maintain各个包初始化数据选项说明
MAINTAIN_GLOBAL, MAINTAIN_SCHEMAS, 和MAINTAIN_TABLES几个过程提供了初始化数据的选项。所谓数据初始化就是指在source端准备数据,复制数据到远端,以及设置初始scn的过程。
DECLARE
tbls DBMS_UTILITY.UNCL_ARRAY;
BEGIN
tbls(1) := 'target.t1';
tbls(2) := 'target.t2';
tbls(3) := 'target.t3';
DBMS_STREAMS_ADM.MAINTAIN_TABLES(
table_names => tbls,
source_directory_object => 'DATA_PUMP_DIR',
destination_directory_object => 'DATA_PUMP_DIR',
source_database => 'source',
destination_database => 'target',
perform_actions => true,
dump_file_name => 'export_tbls_20100925.dmp',
log_file => 'export_tbls_expdp_20100925.log',
script_name => 'configure_rep_20100925.sql',
script_directory_object => 'DATA_PUMP_DIR',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK);
END;
/
以上过程在源库上执行,执行成功的话,三张表的streams复制已经配置完成,可以找张表插入条记录测试一下
注1:dbms_streams_adm.maintain_tables说明
PROCEDURE MAINTAIN_TABLES
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
TABLE_NAMES TABLE OF VARCHAR2(227) IN
SOURCE_DIRECTORY_OBJECT VARCHAR2 IN
DESTINATION_DIRECTORY_OBJECT VARCHAR2 IN
SOURCE_DATABASE VARCHAR2 IN
DESTINATION_DATABASE VARCHAR2 IN
PERFORM_ACTIONS BOOLEAN IN DEFAULT
SCRIPT_NAME VARCHAR2 IN DEFAULT
SCRIPT_DIRECTORY_OBJECT VARCHAR2 IN DEFAULT
DUMP_FILE_NAME VARCHAR2 IN DEFAULT
CAPTURE_NAME VARCHAR2 IN DEFAULT
CAPTURE_QUEUE_TABLE VARCHAR2 IN DEFAULT
CAPTURE_QUEUE_NAME VARCHAR2 IN DEFAULT
CAPTURE_QUEUE_USER VARCHAR2 IN DEFAULT
PROPAGATION_NAME VARCHAR2 IN DEFAULT
APPLY_NAME VARCHAR2 IN DEFAULT
APPLY_QUEUE_TABLE VARCHAR2 IN DEFAULT
APPLY_QUEUE_NAME VARCHAR2 IN DEFAULT
APPLY_QUEUE_USER VARCHAR2 IN DEFAULT
LOG_FILE VARCHAR2 IN DEFAULT
BI_DIRECTIONAL BOOLEAN IN DEFAULT
INCLUDE_DDL BOOLEAN IN DEFAULT
INSTANTIATION BINARY_INTEGER IN DEFAULT
注2:maintain各个包初始化数据选项说明
MAINTAIN_GLOBAL, MAINTAIN_SCHEMAS, 和MAINTAIN_TABLES几个过程提供了初始化数据的选项。所谓数据初始化就是指在source端准备数据,复制数据到远端,以及设置初始scn的过程。
如果运行上述三过程来实施复制,你可以选择下列的初始化步骤:
a>.Data Pump Export Dump File Instantiation
首先在source端expdp导出要共享的数据库对象,然后impdp到目标端。然后执行过程时设置instantiation参数值为:
首先在source端expdp导出要共享的数据库对象,然后impdp到目标端。然后执行过程时设置instantiation参数值为:
运行MAINTAIN_GLOBAL过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_FULL
运行MAINTAIN_SCHEMAS过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA
运行MAINTAIN_TABLES过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_TABLE
b>.Data Pump Network Import Instantiation
实际与上类似,也是借助data pump执行导出和导入,只不过导出/导入不再依赖介绍文件,而是直接通过网络传输。因此,设置instantiation参数时,参数值也有所不同:
运行MAINTAIN_SCHEMAS过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA
运行MAINTAIN_TABLES过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_TABLE
b>.Data Pump Network Import Instantiation
实际与上类似,也是借助data pump执行导出和导入,只不过导出/导入不再依赖介绍文件,而是直接通过网络传输。因此,设置instantiation参数时,参数值也有所不同:
运行MAINTAIN_GLOBAL过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_FULL_NETWORK
运行MAINTAIN_SCHEMAS过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA_NETWORK
运行MAINTAIN_TABLES过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK
c>.Generate a Configuration Script. with No Instantiation Specified
本操作并不执行实例化。因为执行过程时设置perform_actions参数为false,因此过程并不真正配置streams复制环境,而是生成脚本。这种情况下,配置脚本并不执行实例化并且也不会设置初始scn,你必须手动执行并确保设置适当的初始scn值。
运行MAINTAIN_SCHEMAS过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA_NETWORK
运行MAINTAIN_TABLES过程时设置为:DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK
c>.Generate a Configuration Script. with No Instantiation Specified
本操作并不执行实例化。因为执行过程时设置perform_actions参数为false,因此过程并不真正配置streams复制环境,而是生成脚本。这种情况下,配置脚本并不执行实例化并且也不会设置初始scn,你必须手动执行并确保设置适当的初始scn值。
这种情况下,执行过程时,设置instantiation参数值为DBMS_STREAMS_ADM.INSTANTIATION_NONE。
由于PRE_INSTANTIATION_SETUP和POST_INSTANTIATION_SETUP两过程不会执行初始化操作,因此需要你手工在执行完PRE_INSTANTIATION_SETUP后执行初始化,然后再执行POST_INSTANTIATION_SETUP过程。手工初始化数据库的方式也很多,比如通过rman duplicate,transport tablespace等等。
增加一个需要复制的表
DECLARE
tbls DBMS_UTILITY.UNCL_ARRAY;
BEGIN
tbls(1) := 'target.t4';
DBMS_STREAMS_ADM.MAINTAIN_TABLES(
table_names => tbls,
source_directory_object => 'DATA_PUMP_DIR',
destination_directory_object => 'DATA_PUMP_DIR',
source_database => 'source',
destination_database => 'target',
perform_actions => true,
dump_file_name => 'export_tbls_20100925.dmp',
log_file => 'export_tbls_expdp_20100925.log',
script_name => 'configure_rep_20100925_t4.sql',
script_directory_object => 'DATA_PUMP_DIR',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK);
END;
/
DECLARE
tbls DBMS_UTILITY.UNCL_ARRAY;
BEGIN
tbls(1) := 'target.t4';
DBMS_STREAMS_ADM.MAINTAIN_TABLES(
table_names => tbls,
source_directory_object => 'DATA_PUMP_DIR',
destination_directory_object => 'DATA_PUMP_DIR',
source_database => 'source',
destination_database => 'target',
perform_actions => true,
dump_file_name => 'export_tbls_20100925.dmp',
log_file => 'export_tbls_expdp_20100925.log',
script_name => 'configure_rep_20100925_t4.sql',
script_directory_object => 'DATA_PUMP_DIR',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK);
END;
/
删除streams(源库/目标库)
SQL> exec DBMS_STREAMS_ADM.remove_streams_configuration();
PL/SQL procedure successfully completed.