分类: Oracle
2008-05-16 21:22:46
来源: |
|
问题: 物化视图问题:
物化视图复制的设置 主站点: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> |