物化视图复制站点的配置步骤
主站点:oratom
物化视图站点:chenlp
主机名:guoxh, chenlp
复制用户:tax
1. 检查初始化参数
复制对数据库的初始化参数限制不多,主要注意两点。
global_names 为TRUE 以及job_queue_process 大于0。
分别在主站点和物化视图站点执行下面两条sqlplus 命令,检查数据库初始化参数是否符合
要求。
show parameter global_names
show parameter job
如果初始化参数设置的不满足要求,可以通过下列语句动态修改。
alter system set global_names = true;
alter system set job_queue_processes = 20;
2. 检查全局数据库名称
两个数据库的db_domain 名称应该相同,只有db_name 不同。
通过下列语句检查主站点和物化视图站点的全局数据库名
select * from global_name;
如果全局数据库名设置不符合规范,可以通过如下语句动态修改。
alter database rename global_name to oratom;
alter database rename global_name to chenlp;
3. 修改tnsnames.ora 文件,主站点和物化视图站点的参数文件中都添加下列内容
4. 建立主体站点
--以system 用户连接到主站点
CONN system/oratom@oratom
--建立复制管理用户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;
--注册传播用户并授权,这里使用了管理用户repadmin,也可以分别建立用户
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => 'repadmin');
END;
/
--建立物化视图站点复制管理员的代理用户,出于简单考虑,这里也使用repadmin 用户
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'proxy_snapadmin',
list_of_gnames => NULL);
END;
/
--设置代理刷新用户,并授权,这里仍然使用repadmin 用户
--对于repadmin 而言,不需要create session 权限
--但是这里如果新建用户的话,create session 权限则是必须的
GRANT CREATE SESSION TO repadmin;
GRANT SELECT ANY TABLE TO repadmin;
--设置清除延迟序列的job
--以复制管理员身份登陆到主站点
CONNECT repadmin/repadmin@oratom
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0);
END;
/
commit;
--多主站点的设置还需要多个站点间建立数据库链并建立调度机制
--但是对于物化视图复制的主体站点,则这些设置是不需要的
5. 设置物化视图站点
--以system 用户连接到物化视图站点
CONN chenlp/c@chenlp
--建立物化视图管理员,并授权
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;
--建立传播者,并授权,这里使用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;
--注册接受者
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'mvadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
--建立PUBLIC 数据库链
CREATE PUBLIC DATABASE LINK oratom USING 'oratom_syax-guoxh';
--建立到主站点上代理物化视图管理员的数据库链
--以物化视图管理员身份连接到物化视图站点
CONNECT mvadmin/mvadmin@chenlp
CREATE DATABASE LINK oratom CONNECT TO repadmin IDENTIFIED BY
repadmin;
--建立到主站点上复制管理员的数据库链
--以传播者身份登陆物化视图站点
--在本例中,这个数据库链与上面的数据库链相同,故省略。
--设置清除延迟序列的job
--如果物化视图站点只包括只读物化视图,这一步可以省略
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0,
rollback_segment => '');
END;
/
--设置将修改推入到主站点的job
--如果物化视图站点只包括只读物化视图,这一步可以省略
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'rep.yangtingkun',
interval => 'SYSDATE + 1/24',
next_date => SYSDATE,
stop_on_error => FALSE,
delay_seconds => 0,
parallelism => 0);
END;
/
--如果需要此物化视图站点作为主物化视图站点
--则还需要建立物化视图站点的代理物化视图管理用户以及代理刷新用户
--本例中从略
commit;
6. 建立主体组
--以复制管理员身份登陆复制站点
CONNECT repadmin/repadmin@oratom
--建立名为rep_test 的复制组
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'rep_test');
END;
/
--将复制对象增加到复制组中
--主键所用的索引自动复制,其他索引需要明确添加到复制组中
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'rep_test',
type => 'TABLE',
oname => 'test_rep',
sname => 'yangtk',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'rep_test',
type => 'INDEX',
oname => 'ind_test_rep_name',
sname => 'yangtk',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
--生成复制支持
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'yangtk',
oname => 'test_rep',
type => 'TABLE',
min_communication => TRUE);
END;
/
--开始复制
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'rep_test');
END;
/
commit;
7. 建立物化视图
--以复制用户连接到主站点
CONNECT yangtk@rep
--建立物化视图日志表,FAST 刷新方式必须要求建立物化视图日志,COMPLETE 则不需要
CREATE MATERIALIZED VIEW LOG ON yangtk.test_rep;
--如果被复制用户不存在则建立,并授予相应权限
--本例中,用户已存在,此步骤省略
/*
CONNECT system@yangtk
CREATE USER yangtk IDENTIFIED BY yangtk;
ALTER USER yangtk DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER yangtk 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
TO yangtk;
*/
--建立复制用户到主站点代理刷新者的数据库链
CONNECT yangtk@yangtk
CREATE DATABASE LINK rep.yangtingkun CONNECT TO repadmin IDENTIFIED BY
repadmin;
--建立物化视图组
--以物化视图管理员身份登陆物化视图站点
CONNECT mvadmin/mvadmin@yangtk
--物化视图组必须和复制站点上的复制组名称相同
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
gname => 'rep_test',
master => 'rep.yangtingkun',
propagation_mode => 'ASYNCHRONOUS');
END;
/
--创建刷新组
--对于只包含只读物化视图的站点,不需要此步骤
BEGIN
DBMS_REFRESH.MAKE (
name => 'mvadmin.rep_refresh',
list => '',
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
implicit_destroy => FALSE,
rollback_seg => '',
push_deferred_rpc => TRUE,
refresh_after_errors => FALSE);
END;
/
--创建物化视图
--对于只读物化视图,省略FOR UPDATE 语句
CREATE MATERIALIZED VIEW yangtk.test_rep
REFRESH FAST WITH PRIMARY KEY FOR UPDATE
AS SELECT * FROM yangtk.test_rep@rep.yangtingkun;
--将物化视图添加到物化视图组
--对于只读物化视图,此步骤可以省略
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname => 'rep_test',
sname => 'yangtk',
oname => 'test_rep',
type => 'SNAPSHOT',
min_communication => TRUE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname => 'rep_test',
sname => 'yangtk',
oname => 'ind_test_rep_name',
type => 'INDEX',
min_communication => TRUE);
END;
/
--将物化视图添加到刷新组
BEGIN
DBMS_REFRESH.ADD (
name => 'mvadmin.rep_refresh',
list => 'yangtk.test_rep',
lax => TRUE);
END;
/
commit;
8. 主对象上建立测试对象脚本
create table test_rep (id number not null, name varchar2(100));
alter table test_rep add constraint pk_test_rep primary key (id);
create index ind_test_rep_name on test_rep (name);
insert into test_rep values (1, 'ytk');
insert into test_rep values (2, 'zhly');
commit;
__