Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как связать/найти сессии в двух базах при работе через дблинк / 24 сообщений из 24, страница 1 из 1
08.07.2014, 19:52
    #38691072
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Коллеги, помогите с проблемкой - не нашёл ответов на просторах интернета - как узнать sid сессии в базе, в которую моя сессия полезла по дблинку?
...
Рейтинг: 0 / 0
08.07.2014, 20:10
    #38691090
UDW
UDW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
сделай запрос
select * from v$session@your_dblink;
и ищи себя по названию терминала и имени юзера.
...
Рейтинг: 0 / 0
08.07.2014, 20:14
    #38691092
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
UDW,

Сорри, некорректно сформулировал вопрос - как связать не мою сессию, а чужую?
...
Рейтинг: 0 / 0
08.07.2014, 20:14
    #38691093
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
UDWсделай запрос
select * from v$session@your_dblink;
и ищи себя по названию терминала и имени юзера.это ежели сессия своя
Обычно надо, когда не твоя
...
Рейтинг: 0 / 0
08.07.2014, 20:15
    #38691095
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
TakuravaUDW,

Сорри, некорректно сформулировал вопрос - как связать не мою сессию, а чужую?я обычно визуально , по osuser
...
Рейтинг: 0 / 0
08.07.2014, 20:23
    #38691100
UDW
UDW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Вообще-то в словаре отображаются все действующие сессии, а v$session вьюшка словарная. Можешь приставить sys.v$session
...
Рейтинг: 0 / 0
08.07.2014, 21:56
    #38691160
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
andreymxя обычно визуально , по osuser
Дак у нас трёхзвенка - все лезут на первую базу с одного сервера приложений под одним пользователем вебсервиса, и, естественно, под одним пользователем дблинка видятся на второй базе - хрен там кого отличишь :(
...
Рейтинг: 0 / 0
08.07.2014, 22:16
    #38691173
если dedicated
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Takurava,

ид пользователького процесса первичной бд ддя вторичной является клиентским. в сочетани с "клиентским" адресом.
...
Рейтинг: 0 / 0
08.07.2014, 22:50
    #38691188
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
если dedicatedид пользователького процесса первичной бд для вторичной является клиентским. в сочетани с "клиентским" адресом.
Ээээ, мня.... А как это называется, если по полям в v$session?
...
Рейтинг: 0 / 0
10.07.2014, 11:54
    #38692909
vr-frost
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Узнать ИД сессии на клиенте, например вот так:
Код: plsql
1.
Select userenv('sessionid') from dual


Ну а потом отслеживать ее по v$session
...
Рейтинг: 0 / 0
10.07.2014, 12:02
    #38692929
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
vr-frostУзнать ИД сессии на клиенте
Ну а потом отслеживать ее по v$session
Как связать сессию в одной базе (local) с сессией в другой (remote) при запросе по database link?
Да, а точно знаю сессию в первой, локальной, базе - но её AUDSID никак не проявляется в v$session на удалённой базе.
...
Рейтинг: 0 / 0
10.07.2014, 12:12
    #38692953
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Takurava,

Note:104420.1
...
Рейтинг: 0 / 0
10.07.2014, 12:18
    #38692968
vr-frost
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Takuravaеё AUDSID никак не проявляется в v$session на удалённой базе.
Ну тут или ИД не верный или смотришь не туда, может той сессии к моменту выборки вообще нет уже.
Напрямую то видишь сессию?
...
Рейтинг: 0 / 0
10.07.2014, 12:27
    #38692989
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
xtender,

Йоу, оно самое ! :)
А саппорт оракловый мне уже третий день мозги промывает насчёт osuser, username и logon_time из v$session
...
Рейтинг: 0 / 0
10.07.2014, 12:29
    #38692994
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
vr-frostНу тут или ИД не верный или смотришь не туда, может той сессии к моменту выборки вообще нет уже.
Напрямую то видишь сессию?
Товарищ, а выложить логи из sqlplus с реальным применением вашей идеи вы можете? Или у вас нет в наличии двух БД?
...
Рейтинг: 0 / 0
10.07.2014, 13:45
    #38693153
dba123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Takurava,

dbms_session.set_identifier разве не поможет?
...
Рейтинг: 0 / 0
10.07.2014, 14:41
    #38693264
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
dba123dbms_session.set_identifier разве не поможет?
Поможет всё, что я могу сделать в своей сессии - но мы имеем сферического коня в вакууме без возможности что-то изменить:
1. Трёхзвенку - все сессии приходят в первую базу под одним username, с одним osuser, с одной machine, из одной program и с одним и тем же module
2. 10000 сессий по 20-50 соединений в минуту - никакие logon_time не прокатят.
3. В v$session никакие поля не коррелируют на локальной и удалённой базах.

Так что приведённый xtender номер ноты это единственное правильное решение.
Как я уже упоминал на support.oracle.com мне уже три дня крутят яйца про osuser, username и logon_time и т.п. и т.д.
...
Рейтинг: 0 / 0
10.07.2014, 15:21
    #38693361
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Вот для не совсем сферического коня (UNIX системы с dedicated):

В локальной базе SPID из v$process равен process из v$session на удалённой
...
Рейтинг: 0 / 0
10.07.2014, 15:25
    #38693366
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Я не очень понял, что нужно, но, может быть, что-то вроде этого
Это обсуждалось здесь несколько лет назад
...
Рейтинг: 0 / 0
10.07.2014, 15:30
    #38693382
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
имхо v$global_transaction просто ораклу было бы лучше чуток по-другому изначально написать. Например, как-то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
create or replace view v$xt_global_transaction as 
   select
       g.inst_id                                                                       as inst_id
      ,g.k2gtdses                                                                      as saddr
      ,regexp_replace(g.k2gtitid_ora,'^(.*)\.(\w+)\.(\d+\.\d+\.\d+)$','\1')            as remote_db
      ,regexp_replace(g.k2gtitid_ora,'^(.*)\.(\w+)\.(\d+\.\d+\.\d+)$','\2')            as remote_dbid_reversed
      ,regexp_replace(g.k2gtitid_ora,'^(.*)\.(\w+)\.(\d+\.\d+\.\d+)$','\3')            as trans_id
      ,nvl2(replace(g.k2gtibid,'0'),'TO REMOTE','FROM REMOTE')                         as direction
      ,g.k2gtitid_ext  /* utl_raw.cast_to_varchar2(k2gtitid_ext) = g.k2gtitid_ora */   as globalid    
      ,g.k2gtitid_ora  /* utl_raw.cast_to_varchar2(k2gtitid_ext) = g.k2gtitid_ora */   as globalid_ora
      ,g.k2gtibid                                                                      as branchid
      ,g.k2gtecnt                                                                      as branches
      ,g.k2gterct                                                                      as refcount
      ,g.k2gtdpct                                                                      as preparecount
      ,g.k2gtifmt                                                                      as formatid
      , decode(bitand(g.k2gtdflg, 512) , 512 ,'[ORACLE COORDINATED]')
      ||decode(bitand(g.k2gtdflg,1024) ,1024 ,'[MULTINODE]')
      ||decode(bitand(g.k2gtdflg, 511)
                                       ,0    ,'ACTIVE'
                                       ,1    ,'COLLECTING'
                                       ,2    ,'FINALIZED'
                                       ,4    ,'FAILED'
                                       ,8    ,'RECOVERING'
                                       ,16   ,'UNASSOCIATED'
                                       ,32   ,'FORGOTTEN'
                                       ,64   ,'READY FOR RECOVERY'
                                       ,128  ,'NO-READONLY FAILED'
                                       ,256  ,'SIBLING INFO WRITTEN'
             )                                                                         as  state
       ,g.k2gtdflg                                                                     as flags
       ,DECODE(g.k2gtetyp
                 ,0 ,'FREE'
                 ,1 ,'LOOSELY COUPLED'
                 ,2 ,'TIGHTLY COUPLED')                                                as coupling
   from   x$k2gte2 g
         ,x$ktcxb t
         ,x$ksuse s
   where  g.k2gtdxcb = t.ktcxbxba
   and    g.k2gtdses = t.ktcxbses
   and    s.addr     = g.k2gtdses
/

...
Рейтинг: 0 / 0
10.07.2014, 15:34
    #38693396
dba123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
Да, был пример от Владимира интересный

Takurava, тесткейса нет
а корреляцию можно и так продемонстрировать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
--session1:
tester@TEST.SQL.RU>; select username,sid,serial#,client_identifier,sys_context('userenv','service_name') SRV from v$session where username = 'TESTER';
USERNAME                              SID    SERIAL# CLIENT_IDENTIFIER        SRV
------------------------------ ---------- ---------- ----------------------- -----------------------------------------
TESTER                              1           11                            test.sql.ru


--session2:
tester@DEV.SQL.RU>; select username,sid,serial#,client_identifier,sys_context('userenv','service_name') srv from v$session where username = 'TESTER';
USERNAME                              SID    SERIAL# CLIENT_IDENTIFIER        SRV
------------------------------ ---------- ---------- ----------------------- -----------------------------------------
TESTER                              2           12                            dev.sql.ru


--session1:
tester@TEST.SQL.RU>; exec dbms_session.set_identifier('test:sid_serial:1-11');

PL/SQL procedure successfully completed.


tester@TEST.SQL.RU>; select username,sid,serial#,client_identifier from v$session where username = 'TESTER';
USERNAME                              SID    SERIAL# CLIENT_IDENTIFIER    
------------------------------ ---------- ---------- ----------------------------------------------------------------
TESTER                              1           11   test:sid_serial:1-11   



tester@TEST.SQL.RU>; select username,sid,serial#,client_identifier from v$session@devlink where username = 'TESTER';
USERNAME                              SID    SERIAL# CLIENT_IDENTIFIER      
------------------------------ ---------- ---------- ----------------------------------------------------------------
TESTER                              2           12
TESTER                              1           13   test:sid_serial:1-11


--session2:
tester@DEV.SQL.RU>; select username,sid,serial#,client_identifier from v$session where username = 'TESTER';
USERNAME                              SID    SERIAL# CLIENT_IDENTIFIER
------------------------------ ---------- ---------- ----------------------------------------------------------------
TESTER                              2           12
TESTER                              1           13   test:sid_serial:1-11
...
Рейтинг: 0 / 0
10.07.2014, 15:43
    #38693420
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
dba123,

Да, теперича понятно :)
Но есть вмешательство в личную жизнь сессии, что иногда как бы может не быть позволительно
...
Рейтинг: 0 / 0
10.07.2014, 16:09
    #38693492
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
xtenderимхо v$global_transaction просто ораклу было бы лучше чуток по-другому изначально написать.
пример скрипта без создания вьюшки:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
prompt "Enter filters: "
accept _sid         prompt "Sid: ";
accept _globalid    prompt "Globalid mask: ";
accept _remote_db   prompt "Remote_db mask: ";

col remote_db               for a20;
--col remote_dbid_reversed    for a10;
col trans_id                for a16;
col direction               for a11;
col globalid                for a80;
col globalid_ora            for a40;
col branchid                for a80;
col state                   for a40;
col coupling                for a15;
col username                for a30;
col event                   for a35;
col wait_class              for a10;

with v$xt_global_transaction as (
   select
       g.inst_id                                                                       as inst_id
      ,g.k2gtdses                                                                      as saddr
      ,regexp_replace(g.k2gtitid_ora,'^(.*)\.(\w+)\.(\d+\.\d+\.\d+)$','\1')            as remote_db
--      ,regexp_replace(g.k2gtitid_ora,'^(.*)\.(\w+)\.(\d+\.\d+\.\d+)$','\2')            as remote_dbid_reversed
      ,to_number(hextoraw(reverse(regexp_replace(g.k2gtitid_ora,'^(.*)\.(\w+)\.(\d+\.\d+\.\d+)$','\2'))),'XXXXXXXXXXXX') as remote_dbid
      ,regexp_replace(g.k2gtitid_ora,'^(.*)\.(\w+)\.(\d+\.\d+\.\d+)$','\3')            as trans_id
      ,nvl2(replace(g.k2gtibid,'0'),'FROM REMOTE','TO REMOTE')                         as direction
      ,g.k2gtitid_ext  /* utl_raw.cast_to_varchar2(k2gtitid_ext) = g.k2gtitid_ora */   as globalid    
      ,g.k2gtitid_ora  /* utl_raw.cast_to_varchar2(k2gtitid_ext) = g.k2gtitid_ora */   as globalid_ora
      ,g.k2gtibid                                                                      as branchid
      ,g.k2gtecnt                                                                      as branches
      ,g.k2gterct                                                                      as refcount
      ,g.k2gtdpct                                                                      as preparecount
      ,g.k2gtifmt                                                                      as formatid
      , decode(bitand(g.k2gtdflg, 512) , 512 ,'[ORACLE COORDINATED]')
      ||decode(bitand(g.k2gtdflg,1024) ,1024 ,'[MULTINODE]')
      ||decode(bitand(g.k2gtdflg, 511)
                                       ,0    ,'ACTIVE'
                                       ,1    ,'COLLECTING'
                                       ,2    ,'FINALIZED'
                                       ,4    ,'FAILED'
                                       ,8    ,'RECOVERING'
                                       ,16   ,'UNASSOCIATED'
                                       ,32   ,'FORGOTTEN'
                                       ,64   ,'READY FOR RECOVERY'
                                       ,128  ,'NO-READONLY FAILED'
                                       ,256  ,'SIBLING INFO WRITTEN'
             )                                                                         as  state
       ,g.k2gtdflg                                                                     as flags
       ,DECODE(g.k2gtetyp
                 ,0 ,'FREE'
                 ,1 ,'LOOSELY COUPLED'
                 ,2 ,'TIGHTLY COUPLED')                                                as coupling
   from   x$k2gte2 g
         ,x$ktcxb t
         ,x$ksuse s
   where  g.k2gtdxcb = t.ktcxbxba
   and    g.k2gtdses = t.ktcxbses
   and    s.addr     = g.k2gtdses
)
select
     tr.inst_id
--    ,tr.saddr
    ,tr.remote_db
--    ,tr.remote_dbid_reversed
    ,tr.remote_dbid
    ,tr.trans_id
    ,tr.direction
    ,tr.globalid
    ,tr.globalid_ora
    ,tr.branchid
    ,tr.branches
    ,tr.refcount
    ,tr.preparecount
    ,tr.formatid
    ,tr.state
    ,tr.flags
    ,tr.coupling
    ,s.sid
    ,s.serial#
    ,s.username
    ,s.event
    ,s.wait_class
    ,s.event
from v$xt_global_transaction tr
    ,v$session s
where tr.saddr=s.saddr
  and ('&_sid'       is null or s.sid='&_sid')
  and ('&_globalid'  is null or tr.globalid like '&_globalid')
  and ('&_remote_db' is null or tr.remote_db like '&_remote_db')
/
col remote_db               clear;
--col remote_dbid_reversed    clear;
col trans_id                clear;
col direction               clear;
col globalid                clear;
col globalid_ora            clear;
col branchid                clear;
col state                   clear;
col coupling                clear;
col username                clear;
col event                   clear;
col wait_class              clear;
undef  _sid      ;
undef  _globalid ;
undef _remote_db ;


То есть действуем так: первым запуском смотрим откуда пришел, берем полученный globalid и коннектимся на указанную базу, на той базе выполняем этот же скрипт, но с указанием globalid и получаем нужную сессию

ps. в той вьюшке была ошибочка:
Код: plsql
1.
,nvl2(replace(g.k2gtibid,'0'),'TO REMOTE','FROM REMOTE')                         as direction


параметры надо поменять порядком:
Код: plsql
1.
,nvl2(replace(g.k2gtibid,'0'),'FROM REMOTE','TO REMOTE')                         as direction
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
17.09.2019, 14:16
    #39862866
feagor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать/найти сессии в двух базах при работе через дблинк
xtender,

up, в 11-12 версии какие-то более простые варианты не появились?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как связать/найти сессии в двух базах при работе через дблинк / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]