服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

讲解物化视图ora-23313错误的解决方法 (1)

【赛迪网-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>

扫描关注微信公众号