【赛迪网-it技术报道】
问题:
物化视图问题:
物化视图复制的设置
主站点:db001.d-link
物化视图站点:db002.d-link
主机名:dbmis
复制用户:dev001
检查初始化参数
sql> connect sys/change_on_install@db001.d-link as sysdba ;
已连接。
sql> show parameter global_names ;
name type value
------------------------------------ ----------- -------------------------
global_names boolean true
sql> show parameter job;
name type value
------------------------------------ ----------- ------------------------------
job_queue_processes integer 20
sql> select * from global_name ;
global_name
------------------------------------------------------------------------------
db001.d-link
sql>
sql> connect sys/change_on_install@db002.d-link as sysdba ;
已连接。
sql> show parameter global_names ;
name type value
------------------------------------ ----------- ------------------------------
global_names boolean true
sql> show parameter job;
name type value
------------------------------------ ----------- ------------------------------
job_queue_processes integer 10
sql> select * from global_name ;
global_name
-----------------------------------------
db002.d-link
sql>
检查全局数据库名称
sql> connect dev001/whoami@db002.d-link ;
已连接。
sql> select * from dev001.test001@db001 ;
a b
---------- ----------
1 wui
2 zyun
sql>
sql> connect sys/change_on_install@db002.d-link as sysdba ;
已连接。
sql> select owner,db_link from all_db_links ;
owner db_link
-------------------- --------------------
sys db001.d-link
public db001.d-link
sql> connect sys/change_on_install@db001.d-link as sysdba ;
已连接。
sql> select owner,db_link from all_db_links ;
owner db_link
-------------------- --------------------
sys db002.d-link
public db002.d-link
sql>
建立主体站点
sql> connect system/whoami@db001.d-link ;
已连接。
sql>
--建立复制管理用户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;
--注册传播用户并授权
begin
dbms_defer_sys.register_propagator (username => 'repadmin');
end;
/
--注册接收用户
begin
dbms_repcat_admin.register_user_repgroup (
username => 'repadmin',
privilege_type => 'receiver',
list_of_gnames => null);
end;
/
--建立物化视图站点复制管理员的代理用户
begin
dbms_repcat_admin.register_user_repgroup (
username => 'repadmin',
privilege_type => 'proxy_snapadmin',
list_of_gnames => null);
end;
/
grant create session to repadmin;
grant select any table to repadmin;
--以复制管理员身份登陆到主站点
sql> connect repadmin/repadmin@db001.d-link ;
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/24',
delay_seconds => 0);
end;
/
commit;
设置物化视图站点
sql> connect system/whoami@db002.d-link ;
--建立物化视图管理员,并授权
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;
--建立传播者,并授权
begin
dbms_defer_sys.register_propagator (username => 'mvadmin');
end;
/
--建立刷新者,并授权,这里使用mvadmin 用户刷新物化视图
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 db001 using 'db001.d-link';
sql> connect mvadmin/mvadmin@db002.d-link;
已连接。
sql>create database link db001 connect to repadmin identified by repadmin;
--建立到主站点上复制管理员的数据库链
--以传播者身份登陆物化视图站点
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 => 'db001.d-link',
interval => 'sysdate + 1/24',
next_date => sysdate,
stop_on_error => false,
delay_seconds => 0,
parallelism => 0);
end;
/
commit;
建立主体组
--以复制管理员身份登陆复制站点
connect repadmin/repadmin@db001.d-link ;
--建立名为rep_test 的复制组
begin
dbms_repcat.create_master_repgroup (
gname => 'reptest');
end;
/
--将复制对象增加到复制组中
begin
dbms_repcat.create_master_repobject (
gname => 'rep_test',
type => 'table',
oname => 'test001',
sname => 'dev001',
use_existing_object => true,
copy_rows => false);
end;
/
--生成复制支持
begin
dbms_repcat.generate_replication_support (
sname => 'dev001',
oname => 'test001',
type => 'table',
min_communication => true);
end;
/
--开始复制
begin
dbms_repcat.resume_master_activity (
gname => 'reptest');
end;
/
commit;
建立物化视图
connect dev001/whoami@db001.d-link ;
--建立物化视图日志表,fast 刷新方式必须要求建立物化视图日志
create materialized view log on dev001.test001;
--建立复制用户到主站点代理刷新者的数据库链
connect dev001/whoami@db002.d-link;
create database link db001 connect to repadmin identified by repadmin;
--建立物化视图组
connect mvadmin/mvadmin@db002.d-link ;
--物化视图组必须和复制站点上的复制组名称相同
begin
dbms_repcat.create_mview_repgroup (
gname => 'reptest',
master => 'db001.d-link',
propagation_mode => 'asynchronous');
end;
/
-----------------------------------------------------
错误提示:
sql> begin
2 dbms_repcat.create_mview_repgroup(
3 gname=>'reptest',
4 master=>'db001.d-link',
5 propagation_mode => 'asynchronous');
6 end;
7 /
begin
*
error 位于第 1 行:
ora-23313: 在 public 没有控制对象组 "reptest"."db001.d-link"
ora-06512: 在"sys.dbms_sys_error", line 105
ora-06512: 在"sys.dbms_repcat_sna_utl", line 1690
ora-06512: 在"sys.dbms_repcat_sna", line 64
ora-06512: 在"sys.dbms_repcat", line 1262
ora-06512: 在line 2
sql>
查找资料后得到的结论:说是因为目前主站属于静默模式,解决过程如下:
begin
dbms_repcat.resume_master_activity (
gname => 'reptest');
end;
/
但依然无效,同样样报错,上午这样执行一下后,建立物化视图组虽然通过了,但意外的是,
现在把所有都删除了重新建立,竟然报错误了。
sql> connect repadmin/repadmin@db001.d-link ;
已连接。
sql> select gname, master, status from dba_repgroup;
gname m status
------------------------------ - ---------
reptest y normal
按照其他方法:
sql> execute dbms_repcat.suspend_master_activity (gname => 'reptest');
pl/sql 过程已成功完成。
sql> connect mviewadmin/mviewadmin@db002.d-link ;
已连接。
sql> begin
2 dbms_repcat.create_mview_repgroup(
3 gname=>'reptest',
4 master=>'db001.d-link',
5 propagation_mode=>'asynchronous');
6 end;
7 /
begin
*
error 位于第 1 行:
ora-23313: 在 public 没有控制对象组 "reptest"."db001.d-link"
ora-06512: 在"sys.dbms_sys_error", line 105
ora-06512: 在"sys.dbms_repcat_sna_utl", line 1690
ora-06512: 在"sys.dbms_repcat_sna", line 64
ora-06512: 在"sys.dbms_repcat", line 1262
ora-06512: 在line 2
sql>
-----------------------------------------------------
--创建刷新组
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;
/
sql> connect mviewadmin/mviewadmin@db002.d-link ;
已连接。
sql> select *from dev001.test001@db001 ;
a b
---------- ----------
1 wui
2 zyun
sql>
------------------------------------------------------------------
--创建物化视图
sql> create materialized view dev001.test001
2 refresh fast with primary key for update
3 as select * from dev001.test001@db001 ;
as select * from dev001.test001@db001
*
error 位于第 3 行:
ora-12028: 主体站点 @db001.d-link 不支持实体化视图类型
sql>
-------------------------------------------------------------------
(两处用长虚线的位置是问题所在)。
解决方法:(参考)
在进行复制组创建的过程中出现如下错误:
sql> begin
2 dbms_repcat.create_mview_repgroup(
3 gname=>'reptest',
4 master=>'db001.d-link',
5 propagation_mode => 'asynchronous');
6 end;
7 /
begin
*
error 位于第 1 行:
ora-23313: 在 public 没有控制对象组 "reptest"."db001.d-link"
ora-06512: 在"sys.dbms_sys_error", line 105
ora-06512: 在"sys.dbms_repcat_sna_utl", line 1690
ora-06512: 在"sys.dbms_repcat_sna", line 64
ora-06512: 在"sys.dbms_repcat", line 1262
ora-06512: 在line 2
经多次检查后发现问题出现在db link上,在测试中发现的问题:
sql> connect system/pass@db002 ;
已连接。
sql> select owner,db_link from dba_db_links ;
owner db_link
---------- --------------------
public db001.q-link
mvadmin db001.q-link
dev001 db001.q-link
sql> connect system/pass@db001 ;
已连接。
sql> select owner,db_link from dba_db_links ;
owner db_link
---------- --------------------
public db002.q-link
repadmin db002.q-link
sql> connect mvadmin/pass@db002
已连接。
sql> select * from dev001.test001@db001 ;
a b
---------- --------------------
1 wanghui
2 zhangyun
sql> select * from dev001.test001@db001.q-link ;
select * from dev001.test001@db001.q-link
*
error 位于第 1 行:
ora-00933: sql 命令未正确结束
sql>
当引用类似"db001.q-link"的db link时,oracle出现了错误,此时应注意"-"这个特殊字符,因为oracle在db link 中无法正确的识别。
然后加上双引号(""),如下:
select * from dev001.test001@"db001.q-link" ;
此时结果正常。现在就可以确认是域名出现问题了。
然后通过使用类似命令更改了域名以后,即可恢复正常:
alter database rename global_name to db002.qlink;
问题的详细描述,note:274162.1
the above problem is known to arise due to the presence of the '-' character in the domain name. upon renaming the domain to a name that doesn't contain this character, the above problem disappears. oracle的说法:
the cause of this occurance is not clear. 报告中的影响范围为:
oracle net services - version: 8.1.7.4 to 8.1.7.4
solaris operating system (sparc 32-bit)
注释:oracle 9i中此问题也同样存在,此示例的数据库版本如下:
sql> select * from v$version ;
banner
----------------------------------------------------------------
oracle9i enterprise edition release 9.2.0.1.0 - production
pl/sql release 9.2.0.1.0 - production
core 9.2.0.1.0 production
tns for 32-bit windows: version 9.2.0.1.0 - production
nlsrtl version 9.2.0.1.0 - production
sql>
闽公网安备 35060202000074号