|
Написал программу для получения списка блокировок | ☑ | ||
---|---|---|---|---|
0
dcvetkov
11.06.15
✎
10:11
|
Программа берет список блокировок с сервера 1С8, смотрит идентификаторы соединений с базой данных (MS SQL), сводит это всё вместе и показывает, кто кого блокирует.
http://rghost.ru/8GwxTwgz4 В архиве два варианта программы для 1С82 и 1С83. Вот пример вывода в упрощенном режиме: 2015.06.11 09:38:02 70 Юдникова Светлана Николаевна (14091-0) blocking 136 2015.06.11 09:38:02 136 Кривоногова Наталья Александровна (96121-0) blocked by 70 2015.06.11 09:38:09 88 Левинская Ольга Николаевна (1C8SRV) blocking 88 2015.06.11 09:38:11 70 Юдникова Светлана Николаевна (14091-0) blocking 136 2015.06.11 09:38:11 136 Кривоногова Наталья Александровна (96121-0) blocked by 70 2015.06.11 09:38:12 130 Левинская Ольга Николаевна (37121-1) blocking 136 2015.06.11 09:38:12 136 Кривоногова Наталья Александровна (96121-0) blocked by 130 В конфиге можно выставить "long = yes", будет показывать доп. инф-ию, включая текст SQL запроса. Если нужно показывать ещё какую-то информацию - говорите, постараюсь доработать. Чтобы программа заработала, надо зарегистрировать в системе COM-компонент. Идёте в каталог своего клиента: C:\Program Files\1cv82\...версия...\bin\ Выполняете команду: regsvr32.exe comcntr.dll Ещё у меня была ошибка про лицензию, пока не прописал "UseHWLicenses=1" в файле C:\Users\user\AppData\Roaming\1C\1CEStart\1CEStart.cfg Извините, если изобрёл велосипед :) |
|||
1
Вася Чез
11.06.15
✎
10:16
|
(0) хвастаетесь?
|
|||
2
palpetrovich
11.06.15
✎
10:16
|
норм чё ... "кто" - понятно, где "кого"?
зы а для кюшек такое-же мона? :) |
|||
3
aka AMIGO
11.06.15
✎
10:17
|
(1) дарит..
|
|||
4
palpetrovich
11.06.15
✎
10:18
|
+(2) а , эт типа Кривоногова блокирует Юдникову и наоборот?
|
|||
5
dcvetkov
11.06.15
✎
10:19
|
(2)
blocking - значит этот процесс блокирует того-то.. blocked by - заблокировано тем-то (по ид смотрим кем в соседних строчках) |
|||
6
MadHead
11.06.15
✎
10:26
|
(0) Вполне возможно, что данная прога будет жить. Так как избыточные блокировки проблема часто возникающая, а настраивать цуп дорого и трудоемко. Но как я понимаю прога будет работать только для управляемых блокировок?
|
|||
7
Гёдза
11.06.15
✎
10:29
|
(6) У Гилева есть бесплатный сервис по сбору. Анализ - за бабло
|
|||
8
Гёдза
11.06.15
✎
10:29
|
(7) Конечно же все инфа берется из ТЖ и трэйсов SQL
|
|||
9
dcvetkov
11.06.15
✎
10:32
|
(6) почему для управляемых? Нет такого ограничения. У нас на предприятии управляемые блокировки вообще не используются пока.
Программа берет с сервера 1с список блокировок. Для каждой сессии смотрит поле "Соединение с БД". По этому идентификатору смотрит на SQL-сервере, кто кого блокирует. |
|||
10
Aistovich
11.06.15
✎
10:35
|
вот так вот, одной простой вещью можно утопить половину функционала какой конфигурации и сэкономить полгода жизни саппортщика, уменьшить количество седых волос на его голове.
(0) спасибо, брат |
|||
11
ИС-2
naïve
11.06.15
✎
11:05
|
(0) спасибо, скачал как раз куча блокировок висит
|
|||
12
DarkWater
11.06.15
✎
11:07
|
(0) Скачал, спасибо!
|
|||
13
Господин ПЖ
11.06.15
✎
11:09
|
скачал на всякой
автору +1 в карму |
|||
14
Маратыч
11.06.15
✎
11:10
|
(0) Отлично, респектище.
|
|||
15
Jonny_Khomich
11.06.15
✎
11:15
|
давай исходный код
|
|||
16
y22-k
11.06.15
✎
11:18
|
(0)Круто , молодец
|
|||
17
чувак
11.06.15
✎
11:20
|
||||
18
Маратыч
11.06.15
✎
11:20
|
Не то чтобы я автора считаю злодеем, но... кто-нибудь уже проверил на вирусы и на тестовой платформе?
З.Ы. ТС, ничего личного. |
|||
19
NikVars
11.06.15
✎
11:27
|
(17) И как это понимать?! У тебя нет нужного фрейворка или он есть и это ошибка у автора?!
|
|||
20
NikVars
11.06.15
✎
11:27
|
(0) Респект! Спасибо!
|
|||
21
Kvant1C
11.06.15
✎
11:28
|
(17) Ну так он тебе русским по белому пишет, что фреймворк установить надо...
|
|||
22
NikVars
11.06.15
✎
11:29
|
(18) То есть ты автору не веришь, а поверишь другому, кто скажет - да, проверял?!
|
|||
23
dcvetkov
11.06.15
✎
11:30
|
(17)
Поставьте Framework 4.5 (18) Прогоните на virustotal.com Но, конечно, в идеале надо запустить на тестовой среде и посмотреть, не отсылается ли куда-нить налево секретная информация. |
|||
24
Попытка1С
11.06.15
✎
11:32
|
А не проще на скл сервере все это посмотреть?
|
|||
25
Попытка1С
11.06.15
✎
11:41
|
Вот не плохо скрипт например.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED DECLARE @dbid AS smallint; use [s2008]; SET @dbid=DB_ID(); /*кто кого*/ SELECT DB_NAME(pr1.dbid) AS 'DB' ,pr1.spid AS 'ID жертвы' ,RTRIM(pr1.loginame) AS 'Login жертвы' ,pr2.spid AS 'ID виновника' ,RTRIM(pr2.loginame) AS 'Login виновника' ,pr1.program_name AS 'программа жертвы' ,pr2.program_name AS 'программа виновника' ,txt.[text] AS 'Запрос виновника' FROM MASTER.dbo.sysprocesses pr1(NOLOCK) JOIN MASTER.dbo.sysprocesses pr2(NOLOCK) ON (pr2.spid = pr1.blocked) OUTER APPLY sys.[dm_exec_sql_text](pr2.[sql_handle]) AS txt WHERE pr1.blocked <> 0 /* Кто что блокирует */ SELECT s.[nt_username] ,request_session_id ,tran_locks.[request_status] ,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')' [Object] ,txt_blocked.[text] ,COUNT(*) [COUNT] FROM sys.dm_tran_locks AS tran_locks WITH (NOLOCK) JOIN sys.sysprocesses AS s WITH (NOLOCK) ON tran_locks.request_session_id = s.[spid] JOIN ( SELECT 'KEY' AS sResource_type ,p.[hobt_id] AS [id] ,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description] FROM sys.partitions p JOIN sys.objects o ON p.object_id = o.object_id JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id UNION ALL SELECT 'RID' AS sResource_type ,p.[hobt_id] AS [id] ,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description] FROM sys.partitions p JOIN sys.objects o ON p.object_id = o.object_id JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id UNION ALL SELECT 'PAGE' ,p.[hobt_id] ,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) FROM sys.partitions p JOIN sys.objects o ON p.object_id = o.object_id JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id UNION ALL SELECT 'OBJECT' ,o.[object_id] ,QUOTENAME(o.name) FROM sys.objects o ) AS RD ON RD.[sResource_type] = tran_locks.resource_type AND RD.[id] = tran_locks.resource_associated_entity_id OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt_Blocked WHERE ( tran_locks.request_mode = 'X' AND tran_locks.resource_type = 'OBJECT' ) OR tran_locks.[request_status] = 'WAIT' GROUP BY s.[nt_username] ,request_session_id ,tran_locks.[request_status] ,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')' ,txt_blocked.[text] ORDER BY 6 DESC IF EXISTS ( SELECT Name FROM tempdb..sysobjects WHERE name LIKE '#LOCK_01_01%' ) DROP TABLE #LOCK_01_01 CREATE TABLE #LOCK_01_01 ( spid INT, dbid INT, ObjId INT, IndId SMALLINT, Type VARCHAR(20), Resource VARCHAR(50), Mode VARCHAR(20), Status VARCHAR(20) ) INSERT INTO #LOCK_01_01 EXEC sp_lock select OBJECT_NAME(ObjId) as [Имя объекта], Mode [Тип блокировки (код)], CASE WHEN Mode='Sch-S' THEN 'Блокировка стабильности схемы. Гарантирует, что элемент схемы, такой как таблица или индекс, не будет удален до тех пор, пока сеанс связи удерживает блокировку стабильности схемы на данный элемент схемы;' WHEN Mode='Sch-М' THEN '= Блокировка изменения схемы. Должен поддерживаться любым сеансом связи, во время которого предполагается изменить схему данного ресурса. Гарантирует, что другие сеансы не имеют ссылок на обозначенный объект;' WHEN Mode='S' THEN 'S = Коллективная блокировка. Удерживающему сеансу предоставлен коллективный доступ к ресурсу;' WHEN Mode='U' THEN 'U = Блокировка обновления. Указывает блокировку обновления, полученную на ресурсы, которые со временем могут быть обновлены. Используется для предотвращения общей формы взаимоблокировки, которая возникает, когда множество сеансов блокируют ресурсы для потенциального обновления в последующее время;' WHEN Mode='X' THEN 'X = Монопольная блокировка. Удерживающему сеансу предоставлен исключительный доступ к ресурсу;' WHEN Mode='IS' THEN 'IS = Блокировка с намерением коллективного доступа. Указывает намерение поместить S блокировки на некоторые подчиненные ресурсы в иерархии блокировок;' WHEN Mode='IU' THEN 'IU = Блокировка с намерением обновления. Указывает намерение поместить U блокировки на некоторые подчиненные ресурсы в иерархии блокировок;' WHEN Mode='IX' THEN 'IX = Блокировка с намерением монопольного доступа. Указывает намерение поместить X блокировки на некоторые подчиненные ресурсы в иерархии блокировок;' WHEN Mode='SIU' THEN 'SIU = Коллективная блокировка с намерением обновления. Указывает коллективный доступ к ресурсу с намерением получения блокировок обновления на подчиненные ресурсы в иерархии блокировок;' WHEN Mode='SIX' THEN 'SIX = Коллективная блокировка с намерением монопольного доступа. Указывает коллективный доступ к ресурсу с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;' WHEN Mode='UIX' THEN 'UIX = Блокировка обновления с намерением монопольного доступа. Указывает блокировку обновления ресурса с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;' WHEN Mode='BU' THEN 'BU = Блокировка массового обновления. Используется для массовых операций;' --[ ELSE else_result_expression ] END as [Тип блокировки] ,syspr.spid, syspr.dbid, syspr.open_tran, syspr.status, syspr.hostprocess, syspr.loginame, syspr.hostname From #LOCK_01_01 inner join master.dbo.sysprocesses as syspr on syspr.spid = #LOCK_01_01.spid and syspr.dbid = #LOCK_01_01.dbid where #LOCK_01_01.Type = 'TAB' and #LOCK_01_01.dbid = @dbid /* Чем занят сервер*/ SELECT s.[spid] ,s.[loginame] ,s.[open_tran] ,s.[blocked] ,s.[waittime] ,s.[cpu] ,s.[physical_io] ,s.[memusage] INTO #sysprocesses FROM sys.[sysprocesses] s WAITFOR DELAY '00:00:01' SELECT txt.[text] ,s.[spid] ,s.[loginame] ,s.[hostname] ,DB_NAME(s.[dbid]) [db_name] ,SUM(s.[waittime] -ts.[waittime]) [waittime] ,SUM(s.[cpu] -ts.[cpu]) [cpu] ,SUM(s.[physical_io] -ts.[physical_io]) [physical_io] ,s.[program_name] FROM sys.[sysprocesses] s JOIN #sysprocesses ts ON s.[spid] = ts.[spid] AND s.[loginame] = ts.[loginame] OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt WHERE s.[cpu] -ts.[cpu] + s.[physical_io] -ts.[physical_io] > 500 OR (s.[waittime] -ts.[waittime]) > 3000 GROUP BY txt.[text] ,s.[spid] ,s.[loginame] ,s.[hostname] ,DB_NAME(s.[dbid]) ,s.[program_name] ORDER BY [physical_io] DESC DROP TABLE #sysprocesses |
|||
26
Одинесю
11.06.15
✎
11:46
|
(25) Этим скриптом обычно и смотрел, но судя по всему обработка поудобнее.
|
|||
27
dcvetkov
11.06.15
✎
11:49
|
(25) Какай бы ни был скрипт для SQL, он ведь не покажет поименно пользователей 1С.
|
|||
28
Попытка1С
11.06.15
✎
11:56
|
(27) Да там будет id процесса 1ски на терминале.
С пользователями конечно удобнее. |
|||
29
tridog
11.06.15
✎
12:00
|
(0) От понимания того, доступ к какому ресурсу защищен блокировкой, пользы стало бы сильно больше.
Я это не к тому, что "туфта бесполезная", а к тому, что можно улучшить ;) Но это надо ТЖ парсить. |
|||
30
dcvetkov
11.06.15
✎
12:05
|
(29) Я уже двигаюсь в этом направлении. На сервере SQL я вижу, какую таблицу заблочил юзер. Осталось превратить имя таблицы "AccumRgTn29591" вот что-то человеческое.
|
|||
31
D_E_S_131
11.06.15
✎
12:16
|
(0) Большое спасибо и респект.
|
|||
32
tridog
11.06.15
✎
12:27
|
(30) Превратить такое имя во что-то человеческое можно, вызвав ПолучитьСтруктураХраненияБазыДанных().
Например, через то же COM-соединение. Но это будет работать только с блокировками на уровне СУБД. А вот чтобы получить детальную информация по управляемым блокировкам - таки придется парсить ЖР. Учитывая, что первое и так умеет делать ЦУП, а второе нет (во всяком случае когда смотрел на него) - второе кажется более интересным. |
|||
33
D_E_S_131
11.06.15
✎
12:30
|
Почему-то к SQL пытается залогиниться от имени доменного пользователя, а не указанного в ini.
|
|||
34
чувак
11.06.15
✎
12:33
|
(0) А где можно увидет результат?
|
|||
35
чувак
11.06.15
✎
12:42
|
(33) та же фигня
|
|||
36
qeos
11.06.15
✎
13:01
|
(0) по-моему в консоли все видно.. или не?
|
|||
37
D_E_S_131
11.06.15
✎
13:22
|
(36) Консоль это "вчерашний день". "Командную строку" возраждаем! :)
|
|||
38
D_E_S_131
11.06.15
✎
13:29
|
И еще СОМ-соединение с сервером 1С идет с помощью последней установленной платформы, а на серваке может быть ниже релиз. Хотя это скорее всего никак не поборешь.
|
|||
39
dcvetkov
11.06.15
✎
13:35
|
(36) Покажите мне пож-та, где в консоли видно _кто кого_ блокирует. С именами пользователей, на одном экране.
|
|||
40
dcvetkov
11.06.15
✎
13:36
|
(38) борется вроде тем, что делаем "regsvr32.exe comcntr.dll " для нужного релиза.
|
|||
41
чувак
11.06.15
✎
13:41
|
(40) В логе не видно слов blocking и blocked by
|
|||
42
dcvetkov
11.06.15
✎
13:46
|
(41) значит на этот момент нет конфликта блокировок
|
|||
43
чувак
11.06.15
✎
14:11
|
(42) Ище один вопрос.
Не пускает в СКЛ потомучто авторизация идет через доменного юзера |
|||
44
Aprobator
11.06.15
✎
16:44
|
(0) Технологический журнал не катит? Или там не тот уровень описания блокировки? Вроде указывается - кто и кого блокирует.
|
|||
45
bolobol
11.06.15
✎
16:53
|
Консоль сервера предприятия не аналогичную ли информацию показывает?
|
|||
46
dcvetkov
13.06.15
✎
08:04
|
(33) (43)
Действительно, нашёл ошибку в методе подключения к SQL-серверу. На неделе обновлю программу, как оттестирую. Реализовал отображение заблокированных таблиц. Вопрос - тут нельзя менять свои сообщения? Т.е. если обновил программу, надо новую тему начать, чтобы все увидели? |
|||
47
Web00001
13.06.15
✎
08:53
|
(46)Это миста, тут еще много чего нельзя. Но ВР это не волнует. И так работает, пользователи они че, им бежать некуда.
|
|||
48
dcvetkov
15.06.15
✎
12:05
|
Эту тему можно закрыть.
Новая версия программы выложена тут: Написал программу для получения списка блокировок, версия 2 |
|||
49
Demiurg
15.06.15
✎
14:32
|
(7) это не так, анализ в инструменте бесплатный
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |