Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 чем убивать блокировки таблиц без перезапуска сервера?  [new]
___Firebird___
Guest
в некоторую таблицу базы стороннее ПО делает INSERT-ы .

Причем ПО глючное и может вызывать зависание транзакции (вечный статус ACTIVE) с блокировкой всей таблицы.

какими сторонними инструментами можно мониторить эту таблицу на наличие блокирующих ее транзакций?

зы. Исходных текстов ПО нет, ее саппорт ушел в подполье, причину блокировок выяснить не удалось, тот же самый запрос из IBExpert работает правильно.

Зы зы. К этой таблице имеет доступ только эта глючная программа
18 янв 12, 19:26    [11928552]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 32560

___Firebird___
какими сторонними инструментами можно мониторить эту таблицу на наличие блокирующих ее
транзакций?

fb_lock_print.

Posted via ActualForum NNTP Server 1.5

18 янв 12, 19:40    [11928614]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
Таблоид
Member

Откуда:
Сообщений: 7959
Блог
в линухе примерно так (прошу не пинать, сбацано на коленке )

Создаём на сервере скрипт следующего содержания (я дал ему имя 'getlocks.sql'):
rollback;
set transaction read committed record_version no wait;
update t set id=id rows 1;

Создаём пустую базу, в ней таблицу:
create table t(id int);
commit;
insert into t values(1);
insert into t values(2);
insert into t values(3);
insert into t values(4);
insert into t values(5);
commit;


SESSION #1 // плохой парень, блокирует таблицу

[firebird@firebirdG firebird]$ isql testr.fdb
Database: testr.fdb
SQL> select * from t for update with lock;

ID
============
1
2
3
4
5

SESSION #2 // хороший парень, "вычисляет" гада и создает .sh -скрипт, отрубающий его от базы:

[firebird@firebirdG firebird]$ isql -n testr.fdb -i getlocks.sql -m  | grep "number is" | awk '{ print "delete from mon$attachments a where exists(select * from mon$transactions t where t.mon$attachment_id=a.mon$attachment_id and t.mon$transaction_id="$NF"); commit;" }' > killbad.sql; echo "isql testr.fdb -i killbad.sql" > killbad.sh; chmod 0700 killbad.sh

В результате действия этой команды будет создано два файла:
1) shell-скрипт killbad.sh следующего содержания:
isql testr.fdb -i killbad.sql
2) .sql-скрипт, вызываемый из killbad.sh. Он будет либо пустым (при отсутствии конкурирующих блокировок), либо примерно с таким содержанием:
delete from mon$attachments a where exists(select * from mon$transactions t where t.mon$attachment_id=a.mon$attachment_id and t.mon$transaction_id=292); commit;
/* выделенный номер - это транзакция того плохого парня, который блокирует таблицу */

Запускаем скрипт killbad.sh, он отработает без выдачи каких либо сообщений.

SESSION #1 // плохой парень: делаем любой селект
SQL> select * from t for update with lock;
Statement failed, SQLSTATE = 08003
connection shutdown
18 янв 12, 20:08    [11928751]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 32560

Таблоид
**// плохой парень, блокирует таблицу
SQL> select * from t for update with lock;

Какое слово из "делает INSERTы" в сообщении ТСа ты не понял?

Posted via ActualForum NNTP Server 1.5

18 янв 12, 20:10    [11928764]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
Таблоид
Member

Откуда:
Сообщений: 7959
Блог
___Firebird___
с блокировкой всей таблицы.
я смотрел на выделенное слово.
Мне не понятно, как INSERT'ы могут заблокировать ВСЮ таблицу, т.е. существовавшие в ней до этих insert'ов данные. Скорее всего, сначала туда идут инсерты, а дальше что-то оттудова вытаскивается или обновляется (апдейты) с блокировкой.
18 янв 12, 20:13    [11928785]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
dimitr
Member

Откуда: PNZ
Сообщений: 5656
селект всей таблицы с лок-кляузой - это даже не клиника, я бы такое вообще постеснялся вслух предполагать :-)
18 янв 12, 20:39    [11928903]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
Таблоид
Member

Откуда:
Сообщений: 7959
Блог
dimitr
селект всей таблицы с лок-кляузой - это даже не клиника
кто его разберёт, что оно там делает... может, delete 50% записей - это уже вполне можно произносить вслух :-)
18 янв 12, 20:45    [11928923]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 32560

Таблоид
Мне не понятно, как INSERT'ы могут заблокировать ВСЮ таблицу

Сами INSERT-ы - никак. Транзакция, в которой они выполняются - легко.

Posted via ActualForum NNTP Server 1.5

18 янв 12, 20:54    [11928942]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
Таблоид
Member

Откуда:
Сообщений: 7959
Блог
Dimitry Sibiryakov
Сами INSERT-ы - никак. Транзакция, в которой они выполняются - легко.
тогда пусть ТС уточнит, чего ему надо: определить, какими стейтментами глюкавого софта была заблокирована таблица или "найти и обезвредить" того, кто её залочил (ибо софт может ведь на многих машинах работать).
Если первое, то можно FBScanner'ом попробовать. Или трейсом с фильтром на UPDATE+DELETE+MERGE, но там много другой инфы будет (по всем остальным таблицам).
18 янв 12, 21:06    [11928973]     Ответить | Цитировать Сообщить модератору
 Re: чем убивать блокировки таблиц без перезапуска сервера?  [new]
hvlad
Member

Откуда:
Сообщений: 7412
___Firebird___
Причем ПО глючное и может вызывать зависание транзакции (вечный статус ACTIVE)
Вот эти тр-ции и мониторь. Мониторингом.
18 янв 12, 22:42    [11929279]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить