首页 > 开发 > 综合 > 正文

讲解物化视图ORA-23313错误的解决方法

2024-07-21 02:42:26
字体:
来源:转载
供稿:网友

问题:

物化视图问题:

物化视图复制的设置

主站点: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>


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表