实验环境:双节点的 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系统下不同的实例下操作,将无法获得任何结果。
分享到:
相关推荐
Oracle数据库系统提供了强大的XML处理能力,这主要体现在其内置的几个PL/SQL包上,如DBMS_XMLDOM、DBMS_XMLPARSER和DBMS_XMLQUERY。这些包为开发者提供了处理XML文档的一整套工具,使得在数据库环境中进行XML数据的...
在 Oracle 数据库中,dbms_stats 包提供了一种手动收集统计信息的方式,包括基于表、用户和索引的统计信息。通过使用 dbms_stats 包,我们可以手动收集统计信息,以提高数据库的性能和查询优化。 基于表的统计信息...
Oracle数据库系统中,`DBMS_LOB`是一个重要的PL/SQL包,专门用于处理大型对象(LOBs,Large Object)。LOBs是Oracle提供的一种数据类型,用于存储大量数据,如文本、图像、音频或视频文件等。这个包包含了各种过程和...
在这种情况下,补丁可能导致了`DBMS_REGISTRY_SYS`包的失效或不兼容,进而影响到其他数据库操作,比如运行`utlrp`脚本时遇到了错误。`UTLRP`(Utility Load Run Profile)是Oracle用于重新编译所有无效对象的脚本,...
1. **对于分区表**:建议使用 `DBMS_STATS` 而不是 `ANALYZE` 语句,因为 `DBMS_STATS` 支持并行处理、可以收集整个分区表的数据以及单个分区的数据,并且可以在不同级别上计算统计信息。 2. **对于非分区表**:同样...
在Oracle数据库环境中,`dbms_java`包提供了一系列功能强大的工具,用于管理和控制Java应用程序的安全性。这对于那些在Oracle环境中部署了Java应用程序的企业来说尤为重要。本文将详细介绍如何利用`dbms_java`包来...
### DBMS_OBFUSCATION_TOOLKIT:Oracle 数据库中的加密与解密工具包 DBMS_OBFUSCATION_TOOLKIT是Oracle数据库提供的一种用于数据加密解密的强大工具包,自Oracle 8i版本开始引入。它支持多种加密算法,如DES、...
这个包在各种场景下都有广泛的应用,比如在测试数据的生成、模拟随机行为或者创建伪随机数据时。我们将深入探讨`DBMS_RANDOM.VALUE`和`DBMS_RANDOM.STRING`这两个重要的函数。 `DBMS_RANDOM.VALUE`函数用于生成一个...
在Oracle数据库中,`DBMS_SQL`包是一个功能强大的工具,用于执行动态SQL语句。它提供了处理动态SQL语句的能力,使得开发人员能够灵活地构建和执行SQL语句,而不需要预先定义表结构或SQL文本。`DBMS_SQL`主要通过以下...
在Oracle数据库中,`DBMS_JOB`包提供了一种机制,用于创建和管理后台作业(Job),这些作业可以在特定的时间或按一定的时间间隔执行。这对于需要定期执行的任务非常有用,比如数据清理、统计报告生成、备份等。 ###...
dbms_pipe包提供了管道通信机制,允许进程间传递数据。dbms_alert则用于发布和接收异步通知。dbms_transaction管理事务,如设置事务ID和回滚事务。dbms_session用于操作会话信息,如获取和修改会话状态。dbms_rowid...
在使用 DBMS_REDEFINITION 包时,需要注意执行权限,需要拥有 EXECUTE_CATALOG_ROLE 角色、CREATE ANY TABLE 权限、ALTER ANY TABLE 权限、DROP ANY TABLE 权限、LOCK ANY TABLE 权限、SELECT ANY TABLE 权限。...
DBMS_JOB包在此场景中的作用是自动化RMAN备份过程。通过创建作业,可以安排RMAN执行全备份和归档日志备份的脚本。例如,hotbackup.rcv脚本包含了全备份的命令,而hotarcbackup.rcv脚本则用于归档日志备份。这些作业...
DBMS_LOCK是Oracle数据库系统中的一个内置包,用于在用户会话之间实现锁的管理,以确保并发操作的安全性和数据一致性。这篇博文深入探讨了DBMS_LOCK的功能、使用方法以及在实际应用中的重要性。 首先,我们要理解...
支持ArcGIS10.2版本的PostgreSQL_DBMS_for_windows_922,ESRI官方原版资源。
虽然DBMS_STATS提供了许多优点,但在某些情况下,如收集分区索引统计信息时可能会出现性能下降(问题:使用DBMS_STATS收集分区索引统计信息时的慢性能)。这可能需要调整收集策略,例如,使用更精细的采样方法或者在...
在Oracle数据库系统中,DBMS_SQL是一个非常重要的包,它提供了动态执行SQL语句的功能,这对于开发复杂的数据库应用或者需要在运行时构建SQL语句的情况非常有用。DBMS_SQL允许我们处理那些在编译时未知的SQL语句,极...
在这个项目中,"DBMS_c.rar" 提供了一个使用 C 语言实现的简单 DBMS 框架,名为 "DBMS_c",特别强调了用 C 语言来构建数据库系统的能力。C 语言以其高效和灵活性著称,这使得它成为编写底层系统软件的理想选择,尽管...