- 论坛徽章:
- 0
|
我按照该步骤配置完毕后,却无法实现每分钟一次的dept表同步。
详细内容如下:
主站点:TEST.US.ORACLE.COM ---10.11.0.73 LINUX/ORACLE9204
物化视图站点:ORACLE.US.ORACLE.COM 10.11.6.9 WINDOWS2003/ORACLE9201
主机名:testlinux.test
复制用户:scott ---以系统已存在的用户为例
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;
commit;
2. 检查全局数据库名称
两个数据库的db_domain 名称应该相同,只有db_name 不同。
通过下列语句检查主站点和物化视图站点的全局数据库名
select * from global_name;
如果全局数据库名设置不符合规范,可以通过如下语句动态修改。
alter database rename global_name to TEST.US.ORACLE.COM;
alter database rename global_name to ORACLE.US.ORACLE.COM;
3. 修改tnsnames.ora 文件,主站点和物化视图站点的参数文件中都添加下列内容
test73 =
( DESCRIPTION =
( ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.0.73)(PORT = 1521))
)
( CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = test)
)
)
copy69 =
( DESCRIPTION =
( ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.6.9)(PORT = 1521))
)
( CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oracle)
)
)
4. 建立主体站点
--以system 用户连接到主站点
CONN system@test73 也可以直接在主站点机器上操作
--建立复制管理用户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 =>; 'receiver',
list_of_gnames =>; NULL);
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@test73
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date =>; SYSDATE,
interval =>; 'SYSDATE + 1/(24*60)',
delay_seconds =>; 0);
END;
/
commit;
--多主站点的设置还需要多个站点间建立数据库链并建立调度机制
--但是对于物化视图复制的主体站点,则这些设置是不需要的
5. 设置物化视图站点
--以system 用户连接到物化视图站点
conn system/manager@copy69
--建立物化视图管理员,并授权
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 数据库链
----dblink名称最好和远程服务器的数据库全局名test.us.oracle.com相同)
CREATE PUBLIC DATABASE LINK test.us.oracle.com using 'test73';
--以物化视图管理员身份连接到物化视图站点
CONNECT mvadmin/mvadmin@copy69
CREATE DATABASE LINK TEST.US.ORACLE.COM CONNECT TO repadmin IDENTIFIED BY
Repadmin using 'test73';
--以上建立到主站点上复制管理员的数据库链
--以传播者身份登陆物化视图站点 //传播者和物化视图管理员同为mvadmin
--在本例中,这个数据库链与上面的数据库链相同,故省略。
--设置清除延迟序列的job
--如果物化视图站点只包括只读物化视图,这一步可以省略
--每分钟更新一次
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date =>; SYSDATE,
interval =>; 'SYSDATE + 1/(24*60)',
delay_seconds =>; 0,
rollback_segment =>; '');
END;
/
commit;
6. 建立主体组
--以复制管理员身份登陆复制站点
CONNECT repadmin/repadmin@test73
--建立名为rep_test 的复制组
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname =>; 'rep_test');
END;
/
--将复制对象增加到复制组中
--主键所用的索引自动复制,其他索引需要明确添加到复制组中
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname =>; 'rep_test',
type =>; 'TABLE',
oname =>; 'dept',
sname =>; 'scott',
use_existing_object =>; TRUE,
copy_rows =>; FALSE);
END;
/
也可更改上面的oname =>; 'dept', sname =>; 'scott',从而达到增加要复制的表的目的。
---注意下面中dept为表dept
---该表的索引名称 ind_dept_name 实际对应的dept的索引名,为pk_dept,可以查的。
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname =>; 'rep_test',
type =>; 'INDEX',
oname =>; 'pk_dept',
sname =>; 'scott',
use_existing_object =>; TRUE,
copy_rows =>; FALSE);
END;
/
--生成复制支持
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname =>; 'scott',
oname =>; 'dept',
type =>; 'TABLE',
min_communication =>; TRUE);
END;
/
--如改oname的值为emp,则将emp也列入可复制名单
--开始复制
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname =>; 'rep_test');
END;
/
commit;
7. 建立物化视图
--以复制用户连接到主站点
conn scott/tiger@test73
--建立物化视图日志表,FAST 刷新方式必须要求建立物化视图日志,COMPLETE 则不需要
CREATE MATERIALIZED VIEW LOG ON scott.dept; --对表dept有无安全方面的影响?
--如果被复制用户(及要复制的表)不存在则建立,并授予相应权限
--本例中,用户已存在,此步骤省略
CONNECT system@copy69
--实际存在的用户,也可以删除重建
CREATE USER scott IDENTIFIED BY tiger;
ALTER USER scottt DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER scott TEMPORARY TABLESPACE temp;
--另建新的用户,
CREATE USER scotttest IDENTIFIED BY scotttest;
ALTER USER scotttest DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER scotttest 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 scott; 或者增加一个用户 to scotttest,前面代码一样
*/
--建立复制用户到主站点代理刷新者的数据库链
CONNECT scott/tiger@copy69
CREATE DATABASE LINK TEST.US.ORACLE.COM CONNECT TO repadmin IDENTIFIED BY repadmin
using 'test73';
--建立物化视图组
--以物化视图管理员身份登陆物化视图站点
CONNECT mvadmin/mvadmin@copy69
--物化视图组必须和复制站点上的复制组名称相同
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPGROUP (
gname =>; 'rep_test',
master =>; 'TEST.US.ORACLE.COM',
propagation_mode =>; 'ASYNCHRONOUS');
END;
/
出错处理:
删除 rep_test
1) 删除mview_repgroup
SQL>; begin dbms_repcat.DROP_MVIEW_REPGROUP('rep_test');
end;
/
2)删除master_repgroup --没有则不删除
BEGIN
DBMS_REPCAT.drop_MASTER_REPGROUP (
gname =>; 'rep_test');
END;
/
--创建刷新组
--对于只包含只读物化视图的站点,不需要此步骤
BEGIN
DBMS_REFRESH.MAKE (
name =>; 'mvadmin.rep_refresh',
list =>; '',
next_date =>; SYSDATE,
interval =>; 'SYSDATE + 1/(24*60)',
implicit_destroy =>; FALSE,
rollback_seg =>; '',
push_deferred_rpc =>; TRUE,
refresh_after_errors =>; FALSE);
END;
/
更改刷新时间间隔
begin
dbms_refresh.change(name =>; 'mvadmin.rep_refresh',interval=>;'SYSDATE + 1/(24*60)');
end;
/
--创建物化视图 如要删除该视图 语句如下:drop materialized view scott.dept
--对于只读物化视图,省略FOR UPDATE 语句
--注意DBLINK应为TEST.US.ORACLE.COM
CREATE MATERIALIZED VIEW scott.dept
REFRESH FAST WITH PRIMARY KEY FOR UPDATE
AS SELECT * FROM scott.dept@TEST.US.ORACLE.COM;
――TEST.US.ORACLE.COM为创建的dblink
--将物化视图添加到物化视图组
--对于只读物化视图,此步骤可以省略
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname =>; 'rep_test',
sname =>; 'scott',
oname =>; 'dept',
type =>; 'SNAPSHOT',
min_communication =>; TRUE);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MVIEW_REPOBJECT (
gname =>; 'rep_test',
sname =>; 'scott',
oname =>; 'pk_dept',
type =>; 'INDEX',
min_communication =>; TRUE);
END;
/
上述步骤可以不做
--将物化视图添加到刷新组
BEGIN
DBMS_REFRESH.ADD (
name =>; 'mvadmin.rep_refresh',
list =>; 'scott.dept',
lax =>; TRUE);
END;
/
commit;
做完后,我更新主站点上的dept表,而物化视图站点的dept内容却没改变。
不知道哪个地方错了,还请大侠们指点一二,不胜感激。 |
|