15 авг. 2011 г.

dbms_session.is_session_alive in RAC

На семинаре RAC is simple один из слушателей заявил, что функция is_session_alive из пакета dbms_session не работает в RAC. Неужели есть еще один функционал, который не работает в RAC, и нужно будет добавлять новую проверку в утилиту RACChecker ?
Давайте проверим !

rac1-> sqlplus rscott/rtiger@racdb2

SQL*Plus: Release 11.2.0.3.0 Beta on Sun Aug 14 21:21:54 2011

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Beta
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options


SQL> set serveroutput on
SQL> --Наша сессия открыта на втором узле:
SQL> exec dbms_output.put_line(dbms_utility.current_instance);
2

PL/SQL procedure successfully completed.

SQL> --Выясняем id нашей сессии:
SQL> exec dbms_output.put_line(dbms_session.unique_session_id);
002A00630002

PL/SQL procedure successfully completed.

SQL> --запускаем некую активность в этой сессии:
declare
  k number;
begin
  for i in 1..20000000
  loop
    dbms_lock.sleep(300);
    k := i;
  end loop;
end;
/

Оставив эту сессию выполняться, подключаемся к другому узлу кластера
(к первому узлу - к экземпляру racdb1), и пытаемся проверить статус нашей активной сессии:
rac1-> sqlplus rscott/rtiger@racdb1

SQL*Plus: Release 11.2.0.3.0 Beta on Sun Aug 14 21:24:21 2011

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Beta
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options


SQL> set serveroutput on
SQL> --Наша сессия открыта на первом узле:
SQL> exec dbms_output.put_line(dbms_utility.current_instance);
1

PL/SQL procedure successfully completed.

SQL> begin
  if dbms_session.is_session_alive('002A00630002') then
    dbms_output.put_line('Session active !');
  else
    dbms_output.put_line('Session not active !');
  end if;
end;
/
Session active !

PL/SQL procedure successfully completed.

SQL> 
Как Вы видите, в сессии на первом узле прекрасно виден статус активности другой сессии,
которая выполняется на другом узле !

Таким образом вызов dbms_session.is_session_alive полностью поддерживает RAC!

Возможно проблема была связана с Bug 6440088 DBMS_SESSION.IS_SESSION_ALIVE does not work properly in RAC
Этот баг был устранен в 10.2.0.5.


P.S.
На фото - новое издание бестселлера Тома Кайта "Oracle для профессионалов" на русском языке, переработанное с учетом технологий Oracle 11g.

3 комментария:

  1. Oracle Database 11g Enterprise Edition Release [b]11.2.0.3.0 - Beta[/b]
    опять пропалились :)

    ОтветитьУдалить
  2. В дополнение о функции dbms_session.unique_session_id:
    Запрос показывающий и чего составляется unique_session_id
    select to_number(substr(dbms_session.unique_session_id,1,4),'XXXX') sid,
    to_number(substr(dbms_session.unique_session_id,5,4),'XXXX') serial#,
    to_number(substr(dbms_session.unique_session_id,9,4),'XXXX') instance
    from dual;

    ОтветитьУдалить
  3. >>опять пропалились

    В том что будет 11.2.0.3 никакого секрета не было ... :-)

    ОтветитьУдалить