Форум FAQ О команде
Поиск по сайту:
 
Sybase
Sybase ASA  
Sybase ASE  
Sybase IQ  
Sybase PowerDesigner  
Sybase PowerBuilder  

Продукты
Наши продукты  
Продукты партнеров портала  

Сообщества
Alef community  

Меню
Регистрация  
Почта  

Вход

Рассылка
Рассылка 'РСУБД Sybase ASA 9 - мощность, легкость и надежность'
Почтовая рассылка
"Технологии обработки данных компании Sybase"


Статистика
Яндекс цитирования

Rambler's Top100
Находится в каталоге Апорт

Главная -> Статьи
Простое средство обнаружения блокировок

Простое средство обнаружения блокировок

Простое средство обнаружения блокировок.

Вот простенький мониторчик блокировок на сервере.

Позволяет отследить ситуации, когда пользователи блокируют друго друга и получить информацию о том, почему это происходит.

Как устанавливать:

0) Взять архив с процедурами здесь
1) залить процедуры в sybsystemprocs (нужно использовать логин с sa_role).
2) сделать файл SQL с содержимым типа:

exec sp__dump_locks '20060226 12:00:00'
go

и запустить ISQL с ним в параметре -i и параметром -o some-file , чтобы вывод шел в файл. ISQL должен наботать все время, на которое вы взводите монитор - процедура будет "висеть" до указанного вами времени, и все это время должен работать ISQL, после чего он сам завершится.

Также возможно использование этих процедур для построения своих
средств мониторинга с использованием других консолей или своих собственных специально написанных утилит.

Описание процедуры sp__dump_locks.

Синтаксис команды sp__dump_locks:
[exec] sp__dump_locks till_time [,min_time_blocked [,min_blocked_spids ,pause_interval]]]

  • @till_time smalldatetime -- Время до которого запускается монитор
    блокировок.
  • @min_time_blocked int -- Минимальное время блокировки в секундах, которое рассматривается как криминальное. (по умолчанию 15 секунд).
  • @min_blocked_spids int -- минимальное кол-во заблокированных процессов (по умолчанию 1)
  • @pause_interval char(8) -- время паузы в работе в формате 'HH:MM:SS' (по
    умолчанию 10 секунд).

    Процедура входит в бесконечный цикл, который оканчивается при наступлении времени @till_time.
    Внутри цикла с паузами в @pause_interval секунд между проверками проверяется наличие процессов, которые блокируют как минимум @min_blocked_spids других процессов в течении более чем @min_time_blocked секунд. Если такие процессы найдены, то вызывается процедура sp__wholocks, которая выдает картину блокировок.

    Описание процедуры sp__wholocks

    Синтаксис:
    [exec] sp__wholocks [[login_name] [,mode]]
    

  • @login varchar(30) = null -- задает имя лоджина, для которого нужно показывать блокировки. Если не указан, показываются блокировки для всех лоджинов.
  • @mode char(2) = null -- Режим показа блокировок null -- сокращенный показ, или 'f' -- полный показ.
    При полном показе выводятся все блокировки вместе с номерами страниц и записей. Если блокировок много, то вывод получается обширный и излишне детальный. Поэтому в режиме null (по умолчанию) блокировки групперуются по объектам, на которые они наложены, а в начале пишется количество таких блокировок

  • spid(fid) - идентификатор серверного процесса (spid), в скобках - идентификатор семейства процессов процесса (family id).
    Идентификатор семейства процессов отсутствует для обычных процессов, а для рабочих процессов он равен идентификатору породившего его
    родительского процесса. Блокировки всегда принадлежат всему семейству процессов.
  • login - имя логина, который владеет данным серверным процессом.
  • status[io/cpu/mem]<<blckd(t) - Статус процесса, потребляемые им ресурсы в формате io/cpu/mem (см. описание sysprocesses), и,
    если данный процесс заблокирован, идентификатор блокирующего процесса и время блокировки, в формате: "<<blocking_spid(blocked_times)".
  • statement - Выполняемый оператор в формате: "<Имя оператора> #Номер_оператора @Номер_строки"
    <Имя оператора> - имя хранимой процедуры или триггера, если они выполняются, или иначе тип запроса или состояние
    или название процесса.
    #Номер_оператора - номер оператора в батче или хранимой процедуре
    @Номер_строки - номер строки оператора в батче или хранимой процедуре
    (ASE довольно своеобразно нумерует строки в TSQL, поэтому следует критически относиться
    к этому номеру. Если вы не найдете в указанной строке нужного оператора, это НЕ ошибка
    данной процедуры, поскольку поле берется напрямую из системной таблицы sysprocesses).
  • lock - Идентификатор блокировки (lock). Формат и состав зависит от режима работы (параметр mode).

    В сокращенном режиме (@mode = null) в каждой строке набора данных
    показывается каждый вид блокировки каждой таблицы.
    !2*Ex_row-blk(dbname.TABLE_NAME)
    ||     \	\	 \------ имя блокируемой таблицы 
    | \     \	 \--- база данных
    |  \     \------ тип блокировки. Суффиксы: -request -запрашиваемая, -blk - блокирующая
     \  \-- количество блокировок
      \------- "!" - признак блокирующей блокировки.
    

    В полном режиме в каждой строке показывается
    отдельная блокировка (lock):
    !Ex_page-blk(dbname.TABLE_NAME[6897.0])
    |  |           |     |         |    \------ номер блокируемой записи внутри страницы (или 0) 
    |  |  	       |     |          \------ Номер блокируемой страницы 
    |  |  	       |     \------ имя блокируемой таблицы 
    |  |            \--- база данных
    |   \------ тип блокировки. Суффиксы: -request -запрашиваемая, -blk - блокирующая
     \------- "!" - признак блокирующей блокировки.
    


    -- Пример вывода в сокращенном режиме
    spid(fid) login status[io/cpu/mem]<<blckd(t) statement      lock                               
    --------- ----- ---------------------------- ---------      ----                               
    18        ziv   lock sleep [0/3/14]<<20(3s)   UPDATE #4 @6   1*Ex_intent(CORE.SALEDOC2)        
    18        ziv   lock sleep [0/3/14]<<20(3s)   UPDATE #4 @6   1*Ex_row(CORE.SALEDOC2_POS)       
    18        ziv   lock sleep [0/3/14]<<20(3s)   UPDATE #4 @6   1*Ex_intent(CORE.SALEDOC2_POS)    
    20        ziv   alarm sleep [0/1/14]          WAITFOR #5 @9  1*Ex_intent(CORE.SALEDOC2)        
    20        ziv   alarm sleep [0/1/14]          WAITFOR #5 @9 !1*Ex_page-blk(CORE.SALEDOC2)      
    20        ziv   alarm sleep [0/1/14]          WAITFOR #5 @9  1*Ex_row(CORE.SALEDOC2_POS)       
    20        ziv   alarm sleep [0/1/14]          WAITFOR #5 @9  1*Ex_intent(CORE.SALEDOC2_POS)    
    
    -- Пример вывода в полном режиме
    spid(fid) login status[io/cpu/mem]<<blckd(t) statement      lock                               
    --------- ----- ---------------------------- ---------      ----                               
    18        ziv   lock sleep [0/3/14]<<20(2s)   UPDATE #4 @6   Ex_intent(CORE.SALEDOC2[0.0])     
    18        ziv   lock sleep [0/3/14]<<20(2s)   UPDATE #4 @6   Ex_intent(CORE.SALEDOC2_POS[0.0]) 
    18        ziv   lock sleep [0/3/14]<<20(2s)   UPDATE #4 @6   Ex_row(CORE.SALEDOC2_POS[265.1])  
    20        ziv   alarm sleep [0/1/14]          WAITFOR #5 @9  Ex_intent(CORE.SALEDOC2[0.0])     
    20        ziv   alarm sleep [0/1/14]          WAITFOR #5 @9 !Ex_page-blk(CORE.SALEDOC2[6897.0])
    20        ziv   alarm sleep [0/1/14]          WAITFOR #5 @9  Ex_intent(CORE.SALEDOC2_POS[0.0]) 
    20        ziv   alarm sleep [0/1/14]          WAITFOR #5 @9  Ex_row(CORE.SALEDOC2_POS[265.0]) 



Дата публикации: Wednesday 29 March 2006 13:11:33
Материал прочитан: 13094 раз(а)
[ Назад ]



Продвижение сайтов
Биржа ссылок

Copyright©2005 phpMS. Все права защищены.
hosted on pets-tree