Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
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 всё равно не помогает. Память доходит до этого значения. Какое-то время система в раздумьях и всё равно валится. Как я уже понял с памятью возиться учень муторно и играться с параметрами всё равно ничё не даёт. Память эт дело тёмное. Посоветуйте, пожалуйста, как мне найти сессию, что залочила табличку каким-нидь другим способом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2006, 18:21 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
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 Можно поискать даже в этом форуме, я ранее приводил такие запросы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2006, 20:16 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Пожалуй, не совсем верно ответил на вопрос в предыдущем посте. Я предложил запрос, который покажет ВСЕ текущие блокировки и при их большом количестве будет сложновато разобраться. Вот запрос по блокировкам для одной таблицы: --------------------------------------------- -- 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) или *' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2006, 20:31 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
похоже на баг при использовании systabnames, у вас табличек в инстансе не стало больше в несколько раз, недавно? Может копию бд сделали на том же сервере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 08:56 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 09:30 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
vasilisВот запрос по блокировкам для одной таблицы: ......... 'Укажи имя таблицы (table_name) или *' Попробовал. К сожалению на этом запросе память поплыла так же как и на моём. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 10:40 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Танчтобы не использовать systabnames, я таким пользуюсь запросом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Хм... А Ваш запрос по-моему отработал "на Ура". Я конечно его ещё "в деле" полностью не отработал. Но эксперименты показывают, что во-первых он отрабатывает мгновенно (в отличие от долгого моего), во-вторых кажется выдаёт-таки правильный результат о блокировках. Я сделал такой эксперимент. Создал табличку. Стартовал транзакцию. Добавил пару записей и пока не сделал commit запустил Ваш запрос. Он мне честно выдал мою сессию. Я подожду когда он понадобится по настоящему, но мне кажется, что это то, что мне нужно. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 10:47 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Журавлев Дениспохоже на баг при использовании systabnames, у вас табличек в инстансе не стало больше в несколько раз, недавно? Может копию бд сделали на том же сервере? Так чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 10:51 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Rumata EstorskiyТак чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да?Баг: при обращении к systabnames кушается память, чем больше таблиц тем больше кушает, назад не отдает. Правят года четыре уже. У кого 1000 таблиц не замечает, а у кого 10000 те :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 11:03 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Вопрос такого плана - на 9.40хС6 есть бага связанная с блокировками. После динамического выделения новой порции блокировок - отследить блокировки не получается. onstat -u показывает что ждем освобождения блокировки. onstat -k не показывает, что данная нить ждет блокировку, Запросы по syslckta не помогают. Помимо перехода на более поздний релиз, пересмотра кода и увеличения количества блокировок при старте , как еще боретесь с выявлением сессий, заблокировавших ресурс? Я "выявляю" сессии заблокировавшие ресурс достаточно геморройно - выявляю таблицу, смотрю кто ее держит и потихоньку в неком избирательном порядке отстреливаю сессии. Может есть более красивый способ и не все так плохо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 11:14 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис Rumata EstorskiyТак чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да?Баг: при обращении к systabnames кушается память, чем больше таблиц тем больше кушает, назад не отдает. Правят года четыре уже. У кого 1000 таблиц не замечает, а у кого 10000 те :( это не то чтобы совсем баг, это такое поведение у Informix. При обращении к таблице информация о ней сохраняется в памяти, что-то вроде кэша. Информация эта не удаляется никогда. И вот если вдруг вы решите обратиться ко всем таблицам на сервере, то при большом количестве таблиц память потечет. Сканирование systabnames порождает обращения ко всем таблицам на сервере. Update statistics порождает обращения ко всем таблицам в базе. Чем больше таблиц "открыто", тем больше памяти утекло... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 12:22 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Танэто не то чтобы совсем баг, это такое поведение у Informix. Согласен не баг. Но исправить пытаются , у тебя ведь и case в саппорте имеется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 12:35 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис Танэто не то чтобы совсем баг, это такое поведение у 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 13:16 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 21:44 |
|
||
|
Как найти сессию, что залочила табличку
|
|||
|---|---|---|---|
|
#18+
Преимуществом такого подхода является скорость исполнения и отсутствие багов (onstat берет данные прямо из определенных областей памяти сервера, не нагружая сам сервер). недостатком - необходимость прямого доступа к боксу, на котором сервер крутится (админы как правило такой доступ имеют). В таком вот аксепте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 21:47 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=34081807&tid=1608571]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 394ms |

| 0 / 0 |
