Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
ДОбрый день, коллеги.

Подскажите пожалуйста как узнать что именно за рессурс заблокирован?


select WaitResource
from sysprocesses


Показывает вот что:


KEY: 7:72057596157820928 (5edf23479f65)     



Иногда ещё показывает что-то типа TABLE: 7:4837589347598:0



Версия сервера: Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
13 дек 12, 11:29    [13624238]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
Вот такое иногда ещё пишет:


PAG: 7:1:7922350       
13 дек 12, 11:31    [13624254]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
SELECT * from sysobjects WHERE id='7922350' ничего в контексте БД в которой блокировка не выводит
13 дек 12, 11:34    [13624276]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
Узанть бы в какой именно таблице заблокирован KEY этот ...
13 дек 12, 11:35    [13624288]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Spartakich
Member

Откуда: Riga
Сообщений: 380
Добрый_Чэ,


select TABLE_NAME(7922350)

?
13 дек 12, 11:38    [13624306]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
нязнайка
Guest
7922350 - это id страницы.
Чтобы узнать какой таблице эта страница принадлежит можно воспользоваться DBCC PAGE.
13 дек 12, 11:39    [13624314]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Spartakich
Member

Откуда: Riga
Сообщений: 380
Spartakich
Добрый_Чэ,


select TABLE_NAME(7922350)

?


Pardon,
select object_name (7922350)
13 дек 12, 11:39    [13624317]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
Spartakich
Spartakich
Добрый_Чэ,


select TABLE_NAME(7922350)

?


Pardon,
select object_name (7922350)




NULL пишет
13 дек 12, 11:45    [13624362]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
нязнайка
7922350 - это id страницы.
Чтобы узнать какой таблице эта страница принадлежит можно воспользоваться DBCC PAGE.



Хм... интересно, сйчас попробую :)
13 дек 12, 11:46    [13624365]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
нязнайка
7922350 - это id страницы.
Чтобы узнать какой таблице эта страница принадлежит можно воспользоваться DBCC PAGE.




Сделал так:
dbcc traceon(3604) 
dbcc page(7, 1, 7922350,0 ) 
dbcc traceoff(3604)




Получили вот что:


Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.

PAGE: (1:7922350)


BUFFER:


BUF @0x0000000111FA3480

bpage = 0x000000011108C000           bhash = 0x0000000000000000           bpageno = (1:7922350)
bdbid = 7                            breferences = 0                      bcputicks = 0
bsampleCount = 0                     bUse1 = 7946                         bstat = 0xc00009
blog = 0xbb797979                    bnext = 0x0000000000000000           

PAGE HEADER:


Page @0x000000011108C000

m_pageId = (1:7922350)               m_headerVersion = 1                  m_type = 1
m_typeFlagBits = 0x4                 m_level = 0                          m_flagBits = 0x200
m_objId (AllocUnitId.idObj) = 30443  m_indexId (AllocUnitId.idInd) = 256  
Metadata: AllocUnitId = 72057596033040384                                 
Metadata: PartitionId = 72057596051914752                                 Metadata: IndexId = 1
Metadata: ObjectId = 1138923229      m_prevPage = (1:7922349)             m_nextPage = (1:7929012)
pminlen = 175                        m_slotCnt = 44                       m_freeCnt = 88
m_freeData = 8016                    m_reservedCnt = 0                    m_lsn = (26060:798174:548)
m_xactReserved = 0                   m_xdesId = (0:0)                     m_ghostRecCnt = 0
m_tornBits = -1324008405             

Allocation Status

GAM (1:7668480) = ALLOCATED          SGAM (1:7668481) = NOT ALLOCATED     
PFS (1:7918152) = 0x40 ALLOCATED   0_PCT_FULL                             DIFF (1:7668486) = CHANGED
ML (1:7668487) = NOT MIN_LOGGED      


Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.
Выполнение DBCC завершено. Если DBCC выдает сообщения об ошибках, обратитесь к системному администратору.






Только что-то не пойму что дальше с этим делать :)

Как узнать какой таблице принадлежит?
13 дек 12, 11:49    [13624392]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
нязнайка
Guest
SELECT OBJECT_NAME(p.[object_id]), i.name AS [IndexName]
FROM sys.allocation_units au
JOIN sys.partitions p
  ON au.container_id = p.hobt_id
LEFT JOIN sys.indexes i
       ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id   
WHERE au.allocation_unit_id = 30443
13 дек 12, 11:55    [13624460]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
нязнайка
Guest
Вернее вот так :

SELECT OBJECT_NAME(p.[object_id]), i.name AS [IndexName]
FROM sys.partitions p 
LEFT JOIN sys.indexes i
       ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id 
WHERE p.partition_id = 72057596051914752
13 дек 12, 11:58    [13624478]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
gang
Member

Откуда:
Сообщений: 1394
нязнайка, Metadata: ObjectId = 1138923229 ?
13 дек 12, 12:48    [13624910]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
mike909
Member

Откуда:
Сообщений: 662
Добрый_Чэ,

Так Вам ресурс или таблица ?
См. BOL->sys.dm_tran_locks
+ от балды:
select quotename(s.name) + '.' + quotename(t.name), L.*
from (
  select resource_associated_entity_id, request_mode, request_owner_id
  from sys.dm_tran_locks as t
  where resource_type = 'OBJECT' and resource_database_id = DB_ID() 
  group by resource_associated_entity_id, request_mode, request_owner_id
) as L
inner join sys.tables as T ON
  T.object_id = L.resource_associated_entity_id
inner join sys.schemas as s ON
  t.schema_id = s.schema_id
13 дек 12, 13:36    [13625352]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
mike909
Добрый_Чэ,

Так Вам ресурс или таблица ?
См. BOL->sys.dm_tran_locks
+
+ от балды:
select quotename(s.name) + '.' + quotename(t.name), L.*
from (
  select resource_associated_entity_id, request_mode, request_owner_id
  from sys.dm_tran_locks as t
  where resource_type = 'OBJECT' and resource_database_id = DB_ID() 
  group by resource_associated_entity_id, request_mode, request_owner_id
) as L
inner join sys.tables as T ON
  T.object_id = L.resource_associated_entity_id
inner join sys.schemas as s ON
  t.schema_id = s.schema_id



Там может быть таблица заблокирована, может KEY, может ещё что-то... охото для всего )
13 дек 12, 14:16    [13625683]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать о том, какая именно таблица заблокирована?  [new]
Добрый_Чэ
Member

Откуда:
Сообщений: 4125
нязнайка
Вернее вот так :

SELECT OBJECT_NAME(p.[object_id]), i.name AS [IndexName]
FROM sys.partitions p 
LEFT JOIN sys.indexes i
       ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id 
WHERE p.partition_id = 72057596051914752



Спасибо :)


Сейчас дух немного переведу - буду дальше разбираться.
13 дек 12, 14:16    [13625689]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить