Показать полную графическую версию : Принудительное завершение сессий
Приветствую!
Связка 1C + SQL 2005.
В целях оптимизации (ускорения) работы 1C, решили нарисовать Maintenance Plan с Rebuild Index Task + backup.
Но как я понимаю, для Rebuild Index Task нужен монопольный доступ к таблицам, в отличии от Reorganize Index Task.
Хоть в расписании jobs указано запускаться ночью, но к сожалению правило "уходя гасите свет" не выполняется, у пользователей остается открытой 1С и Rebuild Index Task пишет: Source: Rebuild Index Task Executing query "USE [имя БД] ".: 0% complete End Progress Progress: 2012-01-20 23:08:21.51
Как решить проблему принудительного и правильного закрытия сессий?
Заранее спасибо.
Delirium
21-01-2012, 15:34
принудительного и правильного закрытия сессий »
Принудительно и правильно - вещи несовместимые :)
Один из вариантов - перевести принудительно базу в режим одного пользователя и вернуть обратно скриптом:
http://stackoverflow.com/questions/11620/how-do-you-kill-all-current-connections-to-a-sql-server-2005-database
или ручками:
http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspx
Delirium, спасибо за ваше участие в теме.
Руками отпадает сразу, в виду нескольких баз и позднего времени.
Скажите правильно все таки я понял, что Rebuild Index Task не может выполнится из-за "сидячих" юзеров?
А насчет перевода в single user и наоборот. Ведь у меня получается данная операция будет выполняться каждые сутки. Не будет ли это чревато?
В статье по второй ссылке приводится такой вариант:
DECLARE @DatabaseName nvarchar(50)
DECLARE @SPId int
DECLARE @SQL nvarchar(100)
--SET @DatabaseName = N'AdventureWorks2008'
SET @DatabaseName = DB_NAME()
DECLARE my_cursor CURSOR FAST_FORWARD FOR
SELECT SPId FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId
OPEN my_cursor
FETCH NEXT FROM my_cursor INTO @SPId
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'KILL ' + CAST(@SPId as nvarchar(10))
print @SQL
EXEC sp_executeSQL @SQL
--KILL @SPId -- Causing Incorrect syntax near '@spid'.
FETCH NEXT FROM my_cursor INTO @SPId
END
CLOSE my_cursor
DEALLOCATE my_cursor
На каком методе все таки лучше остановится с вашей стороны?
Delirium
21-01-2012, 17:27
данная операция будет выполняться каждые сутки. Не будет ли это чревато? »
Я такую операцию иногда делаю по 5 раз на день, когда необходимо накатить какое либо обновление, либо провести операцию, требующую монопольного доступа. За последние 5 лет проблем не наблюдал :)
Оба метода по принудительному отключению делают примерно одно и то же:
1. приведенный скрипт просто выбирает все текущие сессии и отключает их командой KILL.
2. Перевод в монопольный доступ делает то же самое, только автоматически.
правильно все таки я понял, что Rebuild Index Task не может выполнится из-за "сидячих" юзеров? »
http://www.sql-server-performance.com/2007/rebuilding-indexes/
When a clustered index is rebuilt, an exclusive table lock is put on the table, preventing any table access by your users. Because of this, you should only run this command when users don’t need access to the tables being reorganized.
Да, правильно.
Вариант с переводом в режим одного пользователя нравится больше всего. Да и скрипт для него простой :)
А раз так, тогда и backup пусть создается в таком режиме.
На ночь поставлю задание, завтра отпишусь о результатах.
А зачем в скрипте перевода use master использовать?
Delirium
22-01-2012, 10:51
Затем, чтобы запустить скрипт, используя подключение к системной базе данных, а не к пользовательской.
Delirium
24-01-2012, 01:23
завтра отпишусь о результатах »
и тишина.... ушел в бекап с головой :)
Лишь бы не в восстановление без бэкапа.
Да не, не тишина. Че то не вышло у меня... Думал не доставать форумчан свои проблемами. Сейчас соберу логи и отпишусь.
Во общем вот последняя версия ошибки :)
Message
Executed as user: T1\система. ... Execute Package Utility Version 9.00.4035.00 for 64-bit Copyright (C) Microsoft Corp 1984-2005. All rights reserved. Started: 23:00:00 Progress: 2012-01-24 23:00:01.97 Source: {22C29C04-1E7B-4226-B58C-00B02C2F4127} Executing query "DECLARE @Guid UNIQUEIDENTIFIER EXECUTE msdb..sp".: 100% complete End Progress Progress: 2012-01-24 23:00:02.52 Source: Execute T-SQL Statement Task 2 Executing query "use master ALTER DATABASE t1 SET SINGLE_USER WI".: 100% complete End Progress Error: 2012-01-24 23:08:13.48 Code: 0xC002F210 Source: Rebuild Index Task Execute SQL Task Description: Executing the query "USE [t1] " failed with the following error: "Database 't1' is already open and can only have one user at a time.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly. End Error DTExec: The package ex. The step failed.
Схема Maintenance Plan выглядит вот так:
http://i28.fastpic.ru/big/2012/0125/8e/dceff4cdc377f97c7a6a4384c5d54a8e.png
Delirium
26-01-2012, 01:10
"Database 't1' is already open and can only have one user at a time." »
Говорит, что база уже открыта пользователем.
Так я же ее перевел в сингл юзер...
armid,
Если не получается прямо, может пойти обходным путём ;)
Если пользователи сидят на терминале, то поможет просто принудительное закрытие сессий или приложения 1С.
Anton04, это не терминальные подключения.
Если не получается прямо »
а почему прямо не получается у меня?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.