学无止境
分类: Oracle
2013-10-11 14:30:25
配置和管理master复制。
高级复制可以是多主站点复制,或是物化视图站点复制,物化视图站点复制需要基于一个主站点。
配置高级复制环境,除了需要数据库版本支持高级复制外需要设置参数GLOBAL_NAMES为TRUE。
GLOBAL_NAMES指定了DBLINK是否要求和被连接的数据库具有相同的名称。
如果GLOBAL_NAMES为false,则不执行检查。如果使用或计划使用分布式处理,Oracle建议设置该参数为true,确保在同一个网络环境中连接和数据库名的命名一致。
数据的global_name具有域名,相同域名之间才能进行复制。
其他还需要设置一些相关参数,如job_processes等,满足需求。
多主站点复制配置。这里配置简单的情况,2个master站点相互复制。
1.数据库环境检查及设置
SQL> select value from v$option where parameter='Advanced replication';
VALUE
----------------------------------------------------------------
TRUE
SQL> alter system set global_names = true;
SQL> alter system set job_queue_processes = 10;
SQL> alter database rename global_name to ora10g.com;
SQL> select * from global_name;
GLOBAL_NAME
---------------------------------
ORA10G.COM
另一个数据库设置为ora10g48.com
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
ORA10G48.COM
以下步骤先在ora10g.com上执行:
2.创建一个复制管理员账号
conn system/oracle@ora10g
CREATE USER repadmin IDENTIFIED BY repadmin;
3.给复制管理员账号分配权限
执行GRANT_ADMIN_ANY_SCHEMA存储过程,分配创建和管理复制环境的权限。
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
username => 'repadmin');
END;
/
GRANT COMMENT ANY TABLE TO repadmin;
GRANT LOCK ANY TABLE TO repadmin;
GRANT SELECT ANY DICTIONARY TO repadmin;
4.注册传播器,传播器负责传播延迟事务队列到其他master站点上。
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (
username => 'repadmin');
END;
/
5.注册接收器,接收器用来接收其他master站点传播的延迟事务队列。
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
6.在master站点上设置调度purge。
为了保持延迟事务队列的大小,便于check。需要purge成功完成的延迟事务。
SCHEDULE_PURGE存储过程自动地purge,执行该存储过程必须使用复制管理账号。
CONNECT repadmin/repadmin@ora10g
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0);
END;
/
以上相同类似的步骤在ora10g48的数据库上也执行一遍。
以下步骤完成在各master站点之间的调度连接创建。
1.在master站点之间创建dblink
DBLINK提供了分布式机制,允许不同站点之间复制数据。在创建私有dblink之前,必须先创建用于每个私有dblink的公有dblink。私有dblink要创建在复制管理员账号下。
CONNECT system/oracle@ora10g
CREATE PUBLIC DATABASE LINK ora10g48.com USING 'ora10g48';
CONNECT repadmin/repadmin@ora10g
CREATE DATABASE LINK ora10g48.com CONNECT TO repadmin IDENTIFIED BY repadmin;
CONNECT system/oracle@ora10g48
CREATE PUBLIC DATABASE LINK ora10g.com USING 'ora10g';
CONNECT repadmin/repadmin@ora10g48
CREATE DATABASE LINK ora10g.com CONNECT TO repadmin IDENTIFIED BY repadmin;
2.定义每个dblink的调度,创建调度连接
使用SCHEDULE_PUSH存储过程定义调度连接。该调度连接决定了多长时间传播延迟事务队列到其他master站点。需要为第一步中建立的每一个dblink都执行一次SCHEDULE_PUSH过程。
CONNECT repadmin/repadmin@ora10g
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'ora10g48.com',
interval => 'SYSDATE + (1/144)',
next_date => SYSDATE,
parallelism => 1,
execution_seconds => 1500,
delay_seconds => 1200);
END;
/
CONNECT repadmin/repadmin@ora10g48
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'ora10g.com',
interval => 'SYSDATE + (1/144)',
next_date => SYSDATE,
parallelism => 1,
execution_seconds => 1500,
delay_seconds => 1200);
END;
/
设置master站点之后,准备建立master组,按以下照顺序成功建立复制环境。
以下步骤创建了一个ldy_repg的master组。
在ora10g.com上使用复制管理员用户登录:
CONNECT repadmin/repadmin@ora10g
1.准备需要复制的对象
复制表:
ldy.ar_tab
包含索引:
pk_ar_tab1(主键索引)
idx_ar_objname
所有站点上都已经具有了相同的复制表和数据。
在准备复制表的时候,遭遇到一个问题。使用CTAS方法从dba_objects建立的表,在之后添加对象时,始终会报"ORA-23318: 出现 ddl 故障"的错误
create table ar_tab1 as select * from dba_objects;
如果是已经建好一张表,通过这张表再去用CTAS的方法建立的表,添加时没有问题。
create table ar_tab1 as select * from ar_tab2;
平台是win7,10.2.0.5,不知道是否遭遇了bug。
2.创建master组
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'ldy_repg');
END;
/
3.添加对象到master组
添加之前,先确认复制组的状态是QUIESCED
SQL> select gname, master, status from dba_repgroup;
GNAME M STATUS
------------------------------ - ---------
LDY_REPG Y QUIESCED
如果不是,可以使用命令将组挂起
SQL> execute dbms_repcat.suspend_master_activity (gname => 'ldy_repg');
使用CREATE_MASTER_REPOBJECT存储过程增加对象到前面建立的master组中。在大多数情况下,通常增加表和索引到master组中,也可以添加存储过程、视图、同义词等。
添加表:
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'ldy_repg',
type => 'TABLE',
oname => 'ar_tab1',
sname => 'ldy',
use_existing_object => TRUE,
copy_rows => FALSE
);
END;
/
添加索引:
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'ldy_repg',
type => 'INDEX',
oname => 'pk_ar_tab1',
sname => 'ldy',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'ldy_repg',
type => 'INDEX',
oname => 'idx_ar_objname',
sname => 'ldy',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
添加之后可以查看dba_repobject视图,检查已添加的对象。
select * from dba_repobject;
如果需要删除对象用以下命令:
begin
DBMS_REPCAT.drop_master_repobject(
type => 'TABLE',
oname => 'ar_tab1',
sname => 'ldy'
);
end;
/
4.添加其他站点数据库
在master定义站点(创建master组的站点默认为master定义站点)上定义了master组之后,需要定义其他站点,参与到这个复制环境中。
BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE (
gname => 'ldy_repg',
master => 'ora10g48.com',
use_existing_objects => TRUE,
copy_rows => FALSE,
propagation_mode => 'ASYNCHRONOUS');
END;
/
添加之后可以在dba_repsites
select * from dba_repsites;
5.产生复制支持
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'ldy',
oname => 'ar_tab1',
type => 'TABLE',
min_communication => TRUE);
END;
/
产生复制支持后,必须等待DBA_REPCATLOG视图为空时,才可以重新启用master。
SELECT COUNT(*) FROM DBA_REPCATLOG WHERE GNAME = 'LDY_REPG';
6.激活复制组,开始复制
SQL> execute dbms_repcat.resume_master_activity('ldy_repg',true);
SQL> select gname, master, status from dba_repgroup;
GNAME M STATUS
------------------------------ - ---------
LDY_REPG Y NORMAL
至此master复制配置完成。