一、准备工作
1.1 检查初始化参数
确认gloal_names是否为true,job_queue_process大于0。分别在主站点和物化视图站点执行下面两条sqlplus 命令,检查数据库初始化参数是否符合要求。
show parameter global_namesshow parameter job如果初始化参数设置的不满足要求,可以通过下列语句动态修改。
alter system set global_names = true;alter system set job_queue_processes = 20;1.2 检查全局数据库名称
两个数据库的db_domain 名称应该相同,只有db_name 不同。通过下列语句检查主站点和物化视图站点的全局数据库名:
select * from global_name;GLOBAL_NAME--------------------------------------------------------------------------------RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM如果全局数据库名设置不符合规范,可以通过如下语句动态修改。
alter database rename global_name to RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM; (主站点)
alter database rename global_name to TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM; (物化视图站点)
1.3 修改tnsnames.ora 文件
主站点和物化视图站点的tnsnames.ora参数文件中都添加下列内容,注意需要按照实际情况修改HOST的ip地址,以及SERVICE_NAME的值,PORT一般都默认为1521。
RANDY = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 19.168.0.66)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = randy) ) )TEST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 19.168.0.68)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = test) ) )二、主体站点配置
2.1 建立复制管理用户并授权
以sys或者system用户登陆到主体站点
conn sys/test as sysdba;--建立复制管理员,在实际应用中,需要修改repadmin帐号的密码,以确保安全。
CREATE USER repadmin IDENTIFIED BY repadmin;--授权
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;2.2 注册传播者
这里使用了管理用户repadmin,也可以分别建立用户。
BEGIN DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'repadmin');END;/2.3 注册接收者
这里使用了管理用户repadmin,也可以分别建立用户。
BEGIN DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP ( username => 'repadmin', privilege_type => 'receiver', list_of_gnames => NULL);END;/2.4 建立物化视图站点复制管理员的代理用户
--出于简单考虑,这里也使用repadmin 用户
BEGIN DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP ( username => 'repadmin', privilege_type => 'proxy_snapadmin', list_of_gnames => NULL);END;/--授权
--对于repadmin 而言,不需要create session 权限
--但是这里如果新建用户的话,create session 权限则是必须的
GRANT CREATE SESSION TO repadmin;GRANT SELECT ANY TABLE TO repadmin;2.5 设置清除延迟序列的job
--以复制管理员身份登陆到主站点
CONNECT repadmin/repadmin;BEGIN DBMS_DEFER_SYS.SCHEDULE_PURGE ( next_date => SYSDATE, interval => 'SYSDATE + 1/24', delay_seconds => 0);END;/Commit;2.6 对复制用户授权
conn sys/test as sysdbacreate user rbtidentified by rbtdefault tablespace userstemporary tablespace temp;GRANT CREATE SESSION,CREATE TABLE,CREATE PROCEDURE,CREATE SEQUENCE,CREATE TRIGGER, CREATE VIEW,CREATE SYNONYM,ALTER SESSION,CREATE MATERIALIZED VIEW, ALTER ANY MATERIALIZED VIEW,CREATE DATABASE LINK,select any dictionaryTO rbt;2.7 建立复制测试表
conn sys/test as sysdbacreate table rbt.jobsasselect * from hr.jobs;alter table rbt.jobsadd constraint pk_jobs primary key(job_id);2.8 在主体站点上建立主体组,将复制对象增加到复制组中
conn repadmin/repadminBEGIN DBMS_REPCAT.CREATE_MASTER_REPGROUP ( gname => 'RBTSYN');END;/Commit;BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'RBTSYN', type => 'TABLE', name => 'JOBS', sname => 'RBT', use_existing_object => TRUE, copy_rows => FALSE);END;/BEGIN DBMS_REPCAT.CREATE_MASTER_REPOBJECT ( gname => 'RBTSYN', type => 'INDEX', name => 'PK_JOBS', sname => 'rbt', use_existing_object => TRUE, copy_rows => FALSE);END;/--添加的时候如果一次没有成功,再次添加可能会报ORA-23308或ORA-23309的错误
--使用DBMS_REPCAT.DROP_MASTER_REPOBJECT删除对象后重新添加
2.9 在主体站点上生成复制支持
BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT ( sname => 'RBT', name => 'JOBS', type => 'TABLE', min_communication => TRUE);END;/2.10 在主体站点上开始复制
BEGIN DBMS_REPCAT.RESUME_MASTER_ACTIVITY ( gname =>'RBTSYN');END;/2.11 主体站点上面建立物化视图日志表
conn rbt/rbtcreate materialized view log on jobs;3. 物化视图站点配置
--连接到物化视图站点
conn sys/test as sysdba;
3.1 建立物化视图管理员并授权
CREATE USER mvadmin IDENTIFIED BY mvadmin;BEGIN DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA ( username => 'mvadmin');END;/GRANT COMMENT ANY TABLE TO mvadmin;GRANT LOCK ANY TABLE TO mvadmin;GRANT SELECT ANY DICTIONARY TO mvadmin;3.2 注册传播者,并授权
--这里使用mvadmin 用户,也可以建立单独的用户
BEGIN DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'mvadmin');END;/--建立刷新者,并授权,这里使用mvadmin 用户刷新物化视图
--对于mvadmin 而言,不需要create session 权限
--但是这里如果新建用户的话,create session 权限则是必须的
GRANT CREATE SESSION TO mvadmin;GRANT ALTER ANY MATERIALIZED VIEW TO mvadmin;3.3 注册接收者,并授权
--注册接受者
BEGIN DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP ( username => 'mvadmin', privilege_type => 'receiver', list_of_gnames => NULL);END;/ 3.4 建立到主站点公用的数据库链接
--通过sys用户,建立公用的数据库链接,注意在正式使用的时候,需要按照需要修改数据--库链接的名字和主站点上面的别名
CREATE PUBLIC DATABASE LINK RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM USING 'randy';3.5 从物化视图站点建立到主站点上代理物化视图管理员的数据库链
conn mvadmin/mvadmincreate database link RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COMconnect to repadmin identified by repadmin;3.6 在物化视图站点设置清除延迟序列的job
BEGIN DBMS_DEFER_SYS.SCHEDULE_PURGE ( next_date => SYSDATE, interval => 'SYSDATE + 1/24', delay_seconds => 0, rollback_segment => '');END;/3.7 在物化视图站点上设置将修改推入到主站点的job
BEGIN DBMS_DEFER_SYS.SCHEDULE_PUSH ( destination => 'RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM', interval => 'sysdate + 10/(60*60*24)', next_date => SYSDATE, stop_on_error => FALSE, delay_seconds => 0, parallelism => 0);END;/3.8 建立复制用户并对其授权
create user rbt identified by rbt;alter user rbt temporary tablespace temp;GRANT CREATE SESSION,CREATE TABLE,CREATE PROCEDURE,CREATE SEQUENCE, CREATE TRIGGER,CREATE VIEW,CREATE SYNONYM,ALTER SESSION,CREATE MATERIALIZED VIEW, ALTER ANY MATERIALIZED VIEW,CREATE DATABASE LINK,select any dictionaryTO rbt;3.9 在目标站点上面建立复制用户到主站点代理刷新者的数据库链
conn rbt/rbtCREATE DATABASE LINK RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COMCONNECT TO repadmin IDENTIFIED BY repadmin;3.10 在物化视图管理帐号上建立物化视图组
--以物化视图管理员身份登陆物化视图站点
CONNECT mvadmin/mvadmin
--物化视图组必须和复制站点上的复制组名称相同
BEGIN DBMS_REPCAT.CREATE_MVIEW_REPGROUP ( gname => 'RBTSYN', master => 'RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM', propagation_mode => 'ASYNCHRONOUS');END;/--创建刷新组,从物化视图上面刷新数据到本地表
--对于只包含只读物化视图的站点,不需要此步骤
BEGIN DBMS_REFRESH.MAKE ( name => 'mvadmin.rbt_refresh', list => '', next_date => SYSDATE, interval => 'sysdate + 10/(60*60*24)', implicit_destroy => FALSE, rollback_seg => '', push_deferred_rpc => TRUE, refresh_after_errors => FALSE);END;/--创建物化视图
create table rbt.jobsasselect * FROM rbt.jobs@RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COMwhere 1=2;CREATE MATERIALIZED VIEW RBT.JOBSON PREBUILT TABLEREFRESH FASTNEXT sysdate + 5/1440ASSELECT * FROM rbt.jobs@RANDY.REGRESS.RDBMS.DEV.US.ORACLE.COM;BEGIN DBMS_REFRESH.ADD( name => '"MVADMIN"."RBT_REFRESH"', list => '"RBT"."JOBS"', lax => TRUE);END;--将物化视图添加到刷新组
BEGIN DBMS_REFRESH.ADD( name => '"MVADMIN"."RBT_REFRESH"', list => '"RBT"."JOBS"', lax => TRUE);END;--将物化视图添加到物化视图组
--对于只读物化视图,此步骤可以省略
BEGIN DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT( gname => '"RBTSYN"', sname => '"RBT"', name => '"JOBS"', type => 'SNAPSHOT', min_communication => FALSE);END;BEGIN DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT( gname => '"RBTSYN"', sname => '"RBT"', name => '"PK_JOBS"', type => 'INDEX');END;--至此,物化视图的配置就全部完成了。
四、生成测试数据,并验证配置
--在主站点执行数据修改
begin for i in 1..20 loop insert into jobs values(i,i,i,i); end loop; commit;end;/--在复制站点验证结果
conn rbt/rbtselect * from jobs;JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY---------- ----------------------------------- ---------- ----------1 1 1 110 10 10 10......19 19 19 1920 20 20 205 注意事项
5.1 复制对象的限制
序列不能复制;
主键索引和其他索引,均需要添加到复制对象里面,不能自动复制;
ddl语句,不会自动复制。
5.2 如何使用序列同步
只能对所有的序列,建立一个job,扫描对应表的最大id值,并定时执行,或者在需要使用的时候,手工执行序列同步job。
本文参照网上的一篇文章《oracle物化视图配置指导书》,因为作者没有留下姓名,只有表示精神上的感谢了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14284241/viewspace-434703/
,如需转载,请注明出处,否则将追究法律责任。