powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как найти сессию, что залочила табличку
15 сообщений из 15, страница 1 из 1
Как найти сессию, что залочила табличку
    #34078164
Rumata Estorskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBM Informix Dynamic Server Version 9.40.TC7 Windows 2000 Server

Бывает так, что какая-то сессия зависает и другие юзеры не могут внести изменения в табличку. Пишет что-то типа "Не удаётся заблокировать таблицу ..."
Насчёт уровня изоляции транзакции или там режима открытия точно сказать не могу, т.к. программа не моя. Но всегда спасал такой вот запрос:

database sysmaster;
select distinct sid, username from sysrstcb a, systabnames b, syslcktab c
where b.tabname = 'table_name'
and b.dbsname = 'bd_name'
and b.partnum = c.partnum
and c.owner = a.txp;


Этот запросик выдавал id-сессии. Я её (сессию) отстреливал
onmode -z id-сессии
и всё было чётко.
Но недавно вылезла такая вот байда. Этот запрос стал дико жрать память. Да так, что система стала валиться.

Через минуту-две после выполнения запроса начинается стремительное наращивание виртуальной памяти

14:57:51 Dynamically allocated new virtual shared memory segment (size 32768KB)
14:57:59 Dynamically allocated new virtual shared memory segment (size 32768KB)
14:58:06 Dynamically allocated new virtual shared memory segment (size 32768KB)


и потом

15:00:32 shmat: [ENOMEM][12]: out of available data space, check
system memory parameters (e.g. MAXMEM).
15:00:32 out of virtual shared memory
15:00:32 shmat: [ENOMEM][12]: out of available data space, check
system memory parameters (e.g. MAXMEM).
15:00:32 out of virtual shared memory


и сервак валится.

15:01:22 PANIC: Attempting to bring system down

В onconfig:

LOCKS 100000 # Maximum number of locks
BUFFERS 200000 # Maximum number of shared buffers
NUMAIOVPS # Number of IO vps
PHYSBUFF 32 # Physical log buffer size (Kbytes)
LOGBUFF 32 # Logical log buffer size (Kbytes)
CLEANERS 4 # Number of buffer cleaner processes
SHMBASE 0xC000000L # Shared memory base address
SHMVIRTSIZE 500000 # initial virtual shared memory segment size
SHMADD 32768 # Size of new shared memory segments (Kbytes)
EXTSHMADD 32768 # Size of new extension shared memory segments (Kbytes)
SHMTOTAL 0 # Total shared memory (Kbytes). 0=>unlimited
CKPTINTVL 300 # Check point interval (in sec)
LRUS 50 # Number of LRU queues
LRU_MAX_DIRTY 60 # LRU percent dirty begin cleaning limit
LRU_MIN_DIRTY 50 # LRU percent dirty end cleaning limit
TXTIMEOUT 300 # Transaction timeout (in sec)
STACKSIZE 64 # Stack size (Kbytes)


Пробовал SHMTOTAL выставлять например 1859008 всё равно не помогает. Память доходит до этого значения. Какое-то время система в раздумьях и всё равно валится.
Как я уже понял с памятью возиться учень муторно и играться с параметрами всё равно ничё не даёт. Память эт дело тёмное.

Посоветуйте, пожалуйста, как мне найти сессию, что залочила табличку каким-нидь другим способом?
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34078420
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rumata EstorskiyПосоветуйте, пожалуйста, как мне найти сессию, что залочила табличку каким-нидь другим способом?
Таких способов много (не считая стандартного, через onstat -k)
Например, такой:
---------------------------------------------
-- To list the all user's current locks, who owns them,
-- (db locks included)
-- IDS 7.3+ 9.2+
--
-- V.Shulzhenko DBA_Tools
---------------------------------------------
set isolation to dirty read;
SELECT username[1,8]
,sid
,dbsname[1,18]
,tabname[1,18]
,type
,substr(round(count(*),0),1,6) locks
FROM syslocks l,syssessions s
WHERE s.sid = l.owner
and s.sid !=dbinfo('sessionid') --исключить свой запрос
GROUP BY 1,2,3,4,5
ORDER BY 1,2,3,4

Можно поискать даже в этом форуме, я ранее приводил такие запросы...
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34078450
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуй, не совсем верно ответил на вопрос в предыдущем посте.
Я предложил запрос, который покажет ВСЕ текущие блокировки и при их большом количестве будет сложновато разобраться.
Вот запрос по блокировкам для одной таблицы:
---------------------------------------------
-- To list the TABLE's current locks, who owns them,
-- and if any session is waiting for a lock
-- (Who has locks on the TABLE in the current db ?)
--
-- Shulzhenko V. DBA_Tools
---------------------------------------------
SELECT
owner sid_owner
,username[1,8]
,tty[1,12]
,hex(rowidlk) rowidlock
,keynum
,type
,waiter
-- ,tabname[1,18]
-- ,dbsname[1,18]
FROM sysmaster:syslocks l,sysmaster:syssessions s
WHERE s.sid = l.owner
and dbsname='db-name'
and tabname matches
'Укажи имя таблицы (table_name) или *'
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34078882
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже на баг при использовании systabnames, у вас табличек в инстансе не стало больше в несколько раз, недавно? Может копию бд сделали на том же сервере?
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34078981
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rumata EstorskiyIBM Informix Dynamic Server Version 9.40.TC7 Windows 2000 Server

Бывает так, что какая-то сессия зависает и другие юзеры не могут внести изменения в табличку. Пишет что-то типа "Не удаётся заблокировать таблицу ..."
Насчёт уровня изоляции транзакции или там режима открытия точно сказать не могу, т.к. программа не моя. Но всегда спасал такой вот запрос:

database sysmaster;
select distinct sid, username from sysrstcb a, systabnames b, syslcktab c
where b.tabname = 'table_name'
and b.dbsname = 'bd_name'
and b.partnum = c.partnum
and c.owner = a.txp;



чтобы не использовать systabnames, я таким пользуюсь запросом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
database sysmaster;
select sid, username from sysrstcb a, syslcktab c
where c.owner = a.txp and 
c.partnum in (select hex(partnum) from 'bd_name':systables
              where tabname matches 'table_name' and partnum <> 0  
              union all
              select hex(partn) from 'bd_name':sysfragments f, 'bd_name':systables t 
              where tabname matches 'table_name' and t.tabid=f.tabid and fragtype = 'T')
;
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34079225
Rumata Estorskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilisВот запрос по блокировкам для одной таблицы:
.........
'Укажи имя таблицы (table_name) или *'

Попробовал. К сожалению на этом запросе память поплыла так же как и на моём. :(
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34079255
Rumata Estorskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Танчтобы не использовать systabnames, я таким пользуюсь запросом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
database sysmaster;
select sid, username from sysrstcb a, syslcktab c
where c.owner = a.txp and 
c.partnum in (select hex(partnum) from 'bd_name':systables
              where tabname matches 'table_name' and partnum <> 0  
              union all
              select hex(partn) from 'bd_name':sysfragments f, 'bd_name':systables t 
              where tabname matches 'table_name' and t.tabid=f.tabid and fragtype = 'T')
;


Хм... А Ваш запрос по-моему отработал "на Ура". Я конечно его ещё "в деле" полностью не отработал. Но эксперименты показывают, что во-первых он отрабатывает мгновенно (в отличие от долгого моего), во-вторых кажется выдаёт-таки правильный результат о блокировках. Я сделал такой эксперимент. Создал табличку. Стартовал транзакцию. Добавил пару записей и пока не сделал commit запустил Ваш запрос. Он мне честно выдал мою сессию. Я подожду когда он понадобится по настоящему, но мне кажется, что это то, что мне нужно. Спасибо!
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34079274
Rumata Estorskiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Дениспохоже на баг при использовании systabnames, у вас табличек в инстансе не стало больше в несколько раз, недавно? Может копию бд сделали на том же сервере?

Так чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да?
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34079325
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rumata EstorskiyТак чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да?Баг: при обращении к systabnames кушается память, чем больше таблиц тем больше кушает, назад не отдает. Правят года четыре уже. У кого 1000 таблиц не замечает, а у кого 10000 те :(
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34079372
Igor Zaiets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос такого плана - на 9.40хС6 есть бага связанная с блокировками.
После динамического выделения новой порции блокировок - отследить блокировки не получается.
onstat -u показывает что ждем освобождения блокировки.
onstat -k не показывает, что данная нить ждет блокировку,
Запросы по syslckta не помогают.

Помимо перехода на более поздний релиз, пересмотра кода и увеличения количества блокировок при старте , как еще боретесь с выявлением сессий, заблокировавших ресурс?

Я "выявляю" сессии заблокировавшие ресурс достаточно геморройно - выявляю таблицу, смотрю кто ее держит и потихоньку в неком избирательном порядке отстреливаю сессии.
Может есть более красивый способ и не все так плохо?
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34079695
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис Rumata EstorskiyТак чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да?Баг: при обращении к systabnames кушается память, чем больше таблиц тем больше кушает, назад не отдает. Правят года четыре уже. У кого 1000 таблиц не замечает, а у кого 10000 те :(
это не то чтобы совсем баг, это такое поведение у Informix.
При обращении к таблице информация о ней сохраняется в памяти, что-то вроде кэша. Информация эта не удаляется никогда. И вот если вдруг вы решите обратиться ко всем таблицам на сервере, то при большом количестве таблиц память потечет.
Сканирование systabnames порождает обращения ко всем таблицам на сервере.
Update statistics порождает обращения ко всем таблицам в базе.
Чем больше таблиц "открыто", тем больше памяти утекло...
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34079754
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Танэто не то чтобы совсем баг, это такое поведение у Informix.
Согласен не баг. Но исправить пытаются , у тебя ведь и case в саппорте имеется?
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34079950
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис Танэто не то чтобы совсем баг, это такое поведение у Informix.
Согласен не баг. Но исправить пытаются , у тебя ведь и case в саппорте имеется?
Был. Закрыт.

Bug: 115066 SYSTEM WITH LARGE NUMBER OF TABLES CAN CONSUME LARGE AMOUNTS OF MEMORY IN THE RSAM POOL

We, our development team, are actually working on seeing if we can change how the 9.40 and 10 version of the IDS is handling some things in the RSAM pool.
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34081807
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rumata Estorskiy
Посоветуйте, пожалуйста, как мне найти сессию, что залочила табличку каким-нидь другим способом?

1. Узнать partnum вашей таблицы
можно используя oncheck -pt <database>:<table>
C:\Informix94>oncheck -pt stores_demo:call_type

TBLspace Report for stores_demo:smitin.call_type

Physical Address 1:240
Creation date 07/03/2006 16:09:05
TBLspace Flags 801 Page Locking
TBLspace use 4 bit bit-maps
Maximum row size 31
Number of special columns 0
Number of keys 0
Number of extents 1
Current serial value 1
First extent size 8
Next extent size 8
Number of pages allocated 8
Number of pages used 2
Number of data pages 1
Number of rows 5
Partition partnum 1048803
Partition lockid 1048803

1048803 = 0x1000E3

2. найти, кто ее лочит : делаете onstat -k , ищете tblsnum 1000e3 где rowid = 0 (это значит, что залочена вся таблица)

IBM Informix Dynamic Server Version 9.40.TC2E1 -- On-Line -- Up 00:01:12 -- 25728 Kbytes

Locks
address wtlist owner lklist type tblsnum rowid key#/bsiz
c0967b0 0 caf9e54 0 HDR+S 100002 205 0
c096804 0 caf9e54 c0967b0 HDR+X 1000e3 0 0


3. По адресу сессии находите ее информацию :
делаете onstat -u

Userthreads
address flags sessid user tty wait tout locks nreads nwrites
caf8018 ---P--D 1 informix - 0 0 0 26 7
caf8624 ---P--F 0 informix - 0 0 0 0 0
caf8c30 ---P--- 6 informix - 0 0 0 0 0
caf923c ---P--B 7 informix - 0 0 0 0 0
caf9e54 Y--P--- 13 user PHX00012 d1cdf30 0 2 61 0
cafa460 ---P--D 10 informix - 0 0 0 0 0
...
Рейтинг: 0 / 0
Как найти сессию, что залочила табличку
    #34081815
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Преимуществом такого подхода является скорость исполнения и отсутствие багов (onstat берет данные прямо из определенных областей памяти сервера, не нагружая сам сервер). недостатком - необходимость прямого доступа к боксу, на котором сервер крутится (админы как правило такой доступ имеют).

В таком вот аксепте
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как найти сессию, что залочила табличку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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