首页 > 应用开发 > IT综合 > mv for update 补充
结合昨天的结果,今天重新使用一个用户来做。
在每个阶段中,先在orc1 后在mv1 上操作
为什么要建很多用户?便于权限分配和管理多个复制对象
------------------------阶段1 设置环境 ------------------------
master site (orc1) | mv site (mv1)
------------------ | -------------
create user ww; | create user ww;
admin 注册 | admin 注册
propagator 注册 | propagator 注册
receiver 注册 | receiver 注册
schedule_purge | 建链路 schedule_purge
proxy_snapadmin 注册 | schedule_push
|
------------------------阶段2 添加对象 ------------------------
master site (orc1) mv site (mv1)
---------------------- ---------------------------
create master-group | create mv-group
create repobject | create refresh-group
create rep_support | create mv
active | create repobject
create mv log | add object to refresh-group
|
|
------------------------阶段3 测试 ------------------------
update mv on mv1
refresh mv
select master table on master site
-----------------------------------------------------------------
[@more@]-----------------------------------------------------------------
sqlplus system/oracle@orc1
CREATE USER ww IDENTIFIED BY ww;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
username => 'ww');
END;
/
GRANT COMMENT ANY TABLE TO ww;
GRANT LOCK ANY TABLE TO ww;
GRANT SELECT ANY DICTIONARY TO ww;
exec dbms_defer_sys.UNREGISTER_PROPAGATOR('repadmin'); -- 否则报错 传播者只能有一个
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (
username => 'ww');
END;
/
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'ww',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
CONNECT ww/ww@orc1
exec dbms_defer_sys.unschedule_purge; -- 否则报错 作业编号1在作业队列中不是一个作业
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0);
END;
/
CONNECT SYSTEM/oracle@orc1
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'ww',
privilege_type => 'proxy_snapadmin',
list_of_gnames => NULL);
END;
/
GRANT SELECT_CATALOG_ROLE TO ww;
---------------------------------------------------
CONNECT system/oracle@mv1
CREATE USER ww IDENTIFIED BY ww;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
username => 'ww');
END;
/
GRANT COMMENT ANY TABLE TO ww;
GRANT LOCK ANY TABLE TO ww;
GRANT SELECT ANY DICTIONARY TO ww;
exec dbms_defer_sys.UNREGISTER_PROPAGATOR('propagator'); -- 只能有一个propagator
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (
username => 'ww');
END;
/
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'ww',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
CONNECT system/oracle@mv1
CREATE PUBLIC DATABASE LINK orc1 USING 'orc1';
CONNECT ww/ww@mv1;
CREATE DATABASE LINK orc1
CONNECT TO ww IDENTIFIED BY ww;
exec dbms_defer_sys.unschedule_purge; -- 只能有一个 purge
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
delay_seconds => 0,
rollback_segment => '');
END;
/
exec dbms_defer_sys.unschedule_push('orc1'); -- 只能有一个 push
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'orc1',
interval => 'SYSDATE + 1/24',
next_date => SYSDATE,
stop_on_error => FALSE,
delay_seconds => 0,
parallelism => 0);
END;
/
--------------------------------------------------
conn ww/ww@orc1
create table emp as select * from hr.employees;
alter table emp add primary key (employee_id);
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'ww_repg');
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'ww_repg',
type => 'TABLE',
oname => 'emp',
sname => 'ww',
use_existing_object => TRUE,
copy_rows => FALSE);
END;
/
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'ww',
oname => 'emp',
type => 'TABLE',
min_communication => TRUE);
END;
/
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'ww_repg');
END;
/
----------------------------------------------------
CONNECT system/oracle@orc1
CREATE MATERIALIZED VIEW LOG ON ww.emp;
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 ww;
-- Step 3 Create the materialized view group.
CONNECT ww/ww@mv1
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
gname => 'ww_repg',
master => 'orc1',
propagation_mode => 'ASYNCHRONOUS');
END;
/
-- Step 4 Create the refresh group.
BEGIN
DBMS_REFRESH.MAKE (
name => 'ww.ww_repg',
list => '',
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
implicit_destroy => FALSE,
rollback_seg => '',
push_deferred_rpc => TRUE,
refresh_after_errors => FALSE);
END;
/
-- Step 5 Add objects to the materialized view group.
CREATE MATERIALIZED VIEW ww.emp_mv1
REFRESH FAST WITH PRIMARY KEY FOR UPDATE
AS SELECT * FROM ww.emp@orc1;
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname => 'ww_repg',
sname => 'ww',
oname => 'emp_mv1',
type => 'SNAPSHOT',
min_communication => TRUE);
END;
/
-- Step 6 Add objects to the refresh group.
BEGIN
DBMS_REFRESH.ADD (
name => 'ww.ww_repg',
list => 'ww.emp_mv1',
lax => TRUE);
END;
/
------------------------------------------------
测试效果
SQL> show user
USER 为 "WW"
SQL> select tname from tab;
TNAME
------------------------------------------------------------
EMP_MV1
USLOG$_EMP_MV1
SQL> select count(1) from emp_mv1;
COUNT(1)
----------
107
SQL> select max(employee_id) from ww.emp_mv1;
MAX(EMPLOYEE_ID)
----------------
206
SQL> insert into ww.emp_mv1
2 .
SQL> desc emp_mv1
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
SQL> insert into ww.emp_mv1
2 (employee_id,last_name,email,hire_date,job_id)
3 select 207,last_name,email,hire_date,job_id from emp_mv1 where employee_id=
206;
已创建 1 行。
SQL> commit;
提交完成。
SQL> select count(1) from emp_mv1;
COUNT(1)
----------
108
SQL> select count(1) from ww.emp@orc1;
COUNT(1)
----------
107
SQL> exec dbms_refresh.refresh('ww_refg');
BEGIN dbms_refresh.refresh('ww_refg'); END;
*
第 1 行出现错误:
ORA-23404: 刷新组 "WW"."WW_REFG" 不存在
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: 在 "SYS.DBMS_REFRESH", line 23
ORA-06512: 在 "SYS.DBMS_REFRESH", line 195
ORA-06512: 在 line 1
SQL> conn ww/ww@mv1
已连接。
SQL> exec dbms_refresh.refresh('ww_repg');
PL/SQL 过程已成功完成。
SQL> select count(1) from ww.emp@orc1;
COUNT(1)
----------
108
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/271063/viewspace-1057311/ ,如需转载,请注明出处,否则将追究法律责任。