ITPub博客

首页 > 应用开发 > IT综合 > mv for update 补充

mv for update 补充

原创 IT综合 作者:wmlm 时间:2012-02-09 11:39:41 0 删除 编辑

结合昨天的结果,今天重新使用一个用户来做。
在每个阶段中,先在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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: mv for update
下一篇: mv for update 之三
请登录后发表评论 登录
全部评论

注册时间:2008-04-08

  • 博文量
    398
  • 访问量
    3716771