`

dbms_pipe 包在RAC下跨INSTANCE操作无效

阅读更多

实验环境:双节点的 10.2.0.1.0    RAC  系统

 

操作内容:检查DBMS_PIPE包跨INSTANCE操作是否有效

 

1.在RAC下,用相同的用户登录RAC系统,但是登录到不同的实例上进行测试:

LIBIN@orac>conn libin/libin@orac;
已连接。
LIBIN@orac>conn libin/libin@orac;
已连接。
LIBIN@orac>select instance_number,instance_name from v$instance;
INSTANCE_NUMBER INSTANCE_NAME
--------------- --------------------------------
              1 ORAC1

已用时间:  00: 00: 00.09
LIBIN@orac>

 

@>conn libin/libin@orac;

LIBIN@orac>select instance_number,instance_name from v$instance;
INSTANCE_NUMBER INSTANCE_NAME
--------------- --------------------------------
              2 ORAC2

已用时间:  00: 00: 00.06

LIBIN@orac>select instance_number,instance_name,host_name from gv$instance;
INSTANCE_NUMBER INSTANCE_NAME                    HOST_NAME
--------------- -------------------------------- ------------------------------
              1 ORAC1                            rac01
              2 ORAC2                            rac02

已用时间:  00: 00: 01.09

LIBIN@orac>select * from gv$version;
   INST_ID BANNER
---------- ------------------------------------------------------------------------
         2 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
         2 PL/SQL Release 10.2.0.1.0 - Production
         2 CORE 10.2.0.1.0      Production
         2 TNS for Linux: Version 10.2.0.1.0 - Production
         2 NLSRTL Version 10.2.0.1.0 - Production
         1 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
         1 PL/SQL Release 10.2.0.1.0 - Production
         1 CORE 10.2.0.1.0      Production
         1 TNS for Linux: Version 10.2.0.1.0 - Production
         1 NLSRTL Version 10.2.0.1.0 - Production

已选择10行。

已用时间:  00: 00: 03.35
LIBIN@orac>

 

在ORAC1上:

LIBIN@orac>CREATE TABLE T_RECORD
  2  (STR VARCHAR2(30),
  3  TIME DATE);

表已创建。

已用时间:  00: 00: 00.25
LIBIN@orac> DECLARE
  2   V_RETURN NUMBER;
  3   V_STR VARCHAR2(32767);
  4   BEGIN
  5  V_RETURN := DBMS_PIPE.CREATE_PIPE('P_TEST');
  6  WHILE (V_RETURN = 0) LOOP
  7   V_RETURN := DBMS_PIPE.RECEIVE_MESSAGE('P_TEST', 60);
  8   IF V_RETURN = 0 THEN
  9   DBMS_PIPE.UNPACK_MESSAGE(V_STR);
 10  INSERT INTO T_RECORD VALUES (V_STR, SYSDATE);
 11  ELSE
 12  INSERT INTO T_RECORD VALUES ('errors'||V_RETURN,SYSDATE);
 13   END IF;
 14   END LOOP;
 15   V_RETURN := DBMS_PIPE.REMOVE_PIPE('P_TEST');
 16   END;
 17  /

PL/SQL 过程已成功完成。

已用时间:  00: 02: 00.51

在ORAC2上:

LIBIN@orac>DECLARE
  2  V_STR VARCHAR2(4000) := 'STEP BEGIN';
  3  V_RETURN NUMBER;
  4  BEGIN
  5   DBMS_PIPE.PACK_MESSAGE(V_STR);
  6   V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
  7  DBMS_LOCK.SLEEP(10);
  8   V_STR := 'STEP MIDDLE';
  9   DBMS_PIPE.PACK_MESSAGE(V_STR);
 10   V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
 11   DBMS_LOCK.SLEEP(10);
 12   V_STR := 'STEP END';
 13   DBMS_PIPE.PACK_MESSAGE(V_STR);
 14   V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
 15   END;
 16  /

PL/SQL 过程已成功完成。

已用时间:  00: 00: 29.29
LIBIN@orac>

 

当RAC01监控完毕以后,检查RAC01 t_record表生成的记录
LIBIN@orac>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

已用时间:  00: 00: 00.01
LIBIN@orac>select * from t_record;
STR                                                          TIME
------------------------------------------------------------ -------------------
errors1                                                      2010-05-20 09:33:26

已用时间:  00: 00: 00.03
LIBIN@orac>

除了一条操作超时记录以为,没有监控到任何记录;

 

2.继续测试,在RAC下,用相同的用户登录RAC系统,但是登录到相同的实例上进行测试:

登录第一个用户:

LIBIN@orac>conn libin/libin@orac;
已连接。
LIBIN@orac>select instance_number,instance_name from v$instance;
INSTANCE_NUMBER INSTANCE_NAME
--------------- --------------------------------
              2 ORAC2

已用时间:  00: 00: 00.11
LIBIN@orac>

登录第二个用户:

LIBIN@orac>conn libin/libin@orac;
已连接。
LIBIN@orac>select instance_number,instance_name from v$instance;
INSTANCE_NUMBER INSTANCE_NAME
--------------- --------------------------------
              2 ORAC2

已用时间:  00: 00: 00.11
LIBIN@orac>

在第一个用户下:

LIBIN@orac>DECLARE
  2   V_RETURN NUMBER;
  3   V_STR VARCHAR2(32767);
  4   BEGIN
  5  V_RETURN := DBMS_PIPE.CREATE_PIPE('P_TEST');
  6  WHILE (V_RETURN = 0) LOOP
  7   V_RETURN := DBMS_PIPE.RECEIVE_MESSAGE('P_TEST', 60);
  8   IF V_RETURN = 0 THEN
  9   DBMS_PIPE.UNPACK_MESSAGE(V_STR);
 10  INSERT INTO T_RECORD VALUES (V_STR, SYSDATE);
 11  ELSE
 12  INSERT INTO T_RECORD VALUES ('errors'||V_RETURN,SYSDATE);
 13   END IF;
 14   END LOOP;
 15   V_RETURN := DBMS_PIPE.REMOVE_PIPE('P_TEST');
 16   END;
 17  /
DECLARE
*
第 1 行出现错误:
ORA-23322: Privilege error accessing pipe
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.DBMS_PIPE", line 117
ORA-06512: at line 5


已用时间:  00: 00: 00.45
LIBIN@orac>declare
  2  test number;
  3  begin
  4  test:=DBMS_PIPE.REMOVE_PIPE('P_TEST');
  5  end;
  6  /

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.07
LIBIN@orac>DECLARE
  2   V_RETURN NUMBER;
  3   V_STR VARCHAR2(32767);
  4   BEGIN
  5  V_RETURN := DBMS_PIPE.CREATE_PIPE('P_TEST');
  6  WHILE (V_RETURN = 0) LOOP
  7   V_RETURN := DBMS_PIPE.RECEIVE_MESSAGE('P_TEST', 60);
  8   IF V_RETURN = 0 THEN
  9   DBMS_PIPE.UNPACK_MESSAGE(V_STR);
 10  INSERT INTO T_RECORD VALUES (V_STR, SYSDATE);
 11  ELSE
 12  INSERT INTO T_RECORD VALUES ('errors'||V_RETURN,SYSDATE);
 13   END IF;
 14   END LOOP;
 15   V_RETURN := DBMS_PIPE.REMOVE_PIPE('P_TEST');
 16   END;
 17  /

然后同时在第二个用户下执行:

LIBIN@orac>DECLARE
  2  V_STR VARCHAR2(4000) := 'STEP BEGIN';
  3  V_RETURN NUMBER;
  4  BEGIN
  5   DBMS_PIPE.PACK_MESSAGE(V_STR);
  6   V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
  7  DBMS_LOCK.SLEEP(10);
  8   V_STR := 'STEP MIDDLE';
  9   DBMS_PIPE.PACK_MESSAGE(V_STR);
 10   V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
 11   DBMS_LOCK.SLEEP(10);
 12   V_STR := 'STEP END';
 13   DBMS_PIPE.PACK_MESSAGE(V_STR);
 14   V_RETURN := DBMS_PIPE.SEND_MESSAGE('P_TEST');
 15   END;
 16  /

PL/SQL 过程已成功完成。

当两个PL/SQL都执行完毕后,再在第一个用户实例下测试监控到的记录:

LIBIN@orac>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

已用时间:  00: 00: 00.01
LIBIN@orac>select * from t_record;
STR                                                          TIME
------------------------------------------------------------ -------------------
STEP BEGIN                                                   2010-05-20 15:35:32
STEP MIDDLE                                                  2010-05-20 15:35:42
STEP END                                                     2010-05-20 15:35:52
errors1                                                      2010-05-20 15:36:52

已用时间:  00: 00: 00.04
LIBIN@orac>

成功监控到第二个用户的PL/SQL运行信息。

 

结论:在相同用户登录到不同的SESSION情况下,DBMS_PIPE包只能在相同的实例下操作,在RAC系统下不同的实例下操作,将无法获得任何结果。

分享到:
评论

相关推荐

    DBMS_XMLDOM DBMS_XMLPARSER DBMS_XMLQUERY 文档

    Oracle数据库系统提供了强大的XML处理能力,这主要体现在其内置的几个PL/SQL包上,如DBMS_XMLDOM、DBMS_XMLPARSER和DBMS_XMLQUERY。这些包为开发者提供了处理XML文档的一整套工具,使得在数据库环境中进行XML数据的...

    使用dbms_stats包手工收集统计信息

    在 Oracle 数据库中,dbms_stats 包提供了一种手动收集统计信息的方式,包括基于表、用户和索引的统计信息。通过使用 dbms_stats 包,我们可以手动收集统计信息,以提高数据库的性能和查询优化。 基于表的统计信息...

    oracle dbms_lob

    Oracle数据库系统中,`DBMS_LOB`是一个重要的PL/SQL包,专门用于处理大型对象(LOBs,Large Object)。LOBs是Oracle提供的一种数据类型,用于存储大量数据,如文本、图像、音频或视频文件等。这个包包含了各种过程和...

    ORACLE SYS.DBMS_REGISTRY_SYS has errors

    在这种情况下,补丁可能导致了`DBMS_REGISTRY_SYS`包的失效或不兼容,进而影响到其他数据库操作,比如运行`utlrp`脚本时遇到了错误。`UTLRP`(Utility Load Run Profile)是Oracle用于重新编译所有无效对象的脚本,...

    DBMS_STATS.GATHER_TABLE_STATS详解.pdf

    1. **对于分区表**:建议使用 `DBMS_STATS` 而不是 `ANALYZE` 语句,因为 `DBMS_STATS` 支持并行处理、可以收集整个分区表的数据以及单个分区的数据,并且可以在不同级别上计算统计信息。 2. **对于非分区表**:同样...

    怎样禁用及回收java的授权dbms_java

    在Oracle数据库环境中,`dbms_java`包提供了一系列功能强大的工具,用于管理和控制Java应用程序的安全性。这对于那些在Oracle环境中部署了Java应用程序的企业来说尤为重要。本文将详细介绍如何利用`dbms_java`包来...

    dbms_obfuscation_toolkit加密解密数据

    ### DBMS_OBFUSCATION_TOOLKIT:Oracle 数据库中的加密与解密工具包 DBMS_OBFUSCATION_TOOLKIT是Oracle数据库提供的一种用于数据加密解密的强大工具包,自Oracle 8i版本开始引入。它支持多种加密算法,如DES、...

    DBMS_RANDOM.VALUE OR DBMS_RANDOM.STRING

    这个包在各种场景下都有广泛的应用,比如在测试数据的生成、模拟随机行为或者创建伪随机数据时。我们将深入探讨`DBMS_RANDOM.VALUE`和`DBMS_RANDOM.STRING`这两个重要的函数。 `DBMS_RANDOM.VALUE`函数用于生成一个...

    DBMS_SQL的使用

    在Oracle数据库中,`DBMS_SQL`包是一个功能强大的工具,用于执行动态SQL语句。它提供了处理动态SQL语句的能力,使得开发人员能够灵活地构建和执行SQL语句,而不需要预先定义表结构或SQL文本。`DBMS_SQL`主要通过以下...

    DBMS_JOB包创建ORACLE定时任务

    在Oracle数据库中,`DBMS_JOB`包提供了一种机制,用于创建和管理后台作业(Job),这些作业可以在特定的时间或按一定的时间间隔执行。这对于需要定期执行的任务非常有用,比如数据清理、统计报告生成、备份等。 ###...

    Oracle系统包详细使用方法

    dbms_pipe包提供了管道通信机制,允许进程间传递数据。dbms_alert则用于发布和接收异步通知。dbms_transaction管理事务,如设置事务ID和回滚事务。dbms_session用于操作会话信息,如获取和修改会话状态。dbms_rowid...

    DBMS_REDEFINITION

    在使用 DBMS_REDEFINITION 包时,需要注意执行权限,需要拥有 EXECUTE_CATALOG_ROLE 角色、CREATE ANY TABLE 权限、ALTER ANY TABLE 权限、DROP ANY TABLE 权限、LOCK ANY TABLE 权限、SELECT ANY TABLE 权限。...

    Oracle用RMAN和DBMS_JOB包实现自动存储2

    DBMS_JOB包在此场景中的作用是自动化RMAN备份过程。通过创建作业,可以安排RMAN执行全备份和归档日志备份的脚本。例如,hotbackup.rcv脚本包含了全备份的命令,而hotarcbackup.rcv脚本则用于归档日志备份。这些作业...

    dbms_lock控制串行详解

    DBMS_LOCK是Oracle数据库系统中的一个内置包,用于在用户会话之间实现锁的管理,以确保并发操作的安全性和数据一致性。这篇博文深入探讨了DBMS_LOCK的功能、使用方法以及在实际应用中的重要性。 首先,我们要理解...

    PostgreSQL_DBMS_for_Windows_922_136133.exe

    支持ArcGIS10.2版本的PostgreSQL_DBMS_for_windows_922,ESRI官方原版资源。

    Metalink_DBMS_STATS.doc

    虽然DBMS_STATS提供了许多优点,但在某些情况下,如收集分区索引统计信息时可能会出现性能下降(问题:使用DBMS_STATS收集分区索引统计信息时的慢性能)。这可能需要调整收集策略,例如,使用更精细的采样方法或者在...

    DBMS_SQL.rar_dbms_oracle

    在Oracle数据库系统中,DBMS_SQL是一个非常重要的包,它提供了动态执行SQL语句的功能,这对于开发复杂的数据库应用或者需要在运行时构建SQL语句的情况非常有用。DBMS_SQL允许我们处理那些在编译时未知的SQL语句,极...

    DBMS_c.rar_C语言实现DBMS_DBMS_c_c语言DBMS_dbms

    在这个项目中,"DBMS_c.rar" 提供了一个使用 C 语言实现的简单 DBMS 框架,名为 "DBMS_c",特别强调了用 C 语言来构建数据库系统的能力。C 语言以其高效和灵活性著称,这使得它成为编写底层系统软件的理想选择,尽管...

Global site tag (gtag.js) - Google Analytics