Войти

Показать полную графическую версию : Принудительное завершение сессий


armid
21-01-2012, 14:29
Приветствую!

Связка 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

armid
21-01-2012, 17:11
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.
Да, правильно.

armid
21-01-2012, 17:41
Вариант с переводом в режим одного пользователя нравится больше всего. Да и скрипт для него простой :)

А раз так, тогда и backup пусть создается в таком режиме.

На ночь поставлю задание, завтра отпишусь о результатах.

armid
21-01-2012, 19:12
А зачем в скрипте перевода use master использовать?

Delirium
22-01-2012, 10:51
Затем, чтобы запустить скрипт, используя подключение к системной базе данных, а не к пользовательской.

Delirium
24-01-2012, 01:23
завтра отпишусь о результатах »
и тишина.... ушел в бекап с головой :)

Iska
24-01-2012, 02:57
Лишь бы не в восстановление без бэкапа.

armid
24-01-2012, 10:37
Да не, не тишина. Че то не вышло у меня... Думал не доставать форумчан свои проблемами. Сейчас соберу логи и отпишусь.

armid
25-01-2012, 12:30
Во общем вот последняя версия ошибки :)

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
28-01-2012, 19:01
Так я же ее перевел в сингл юзер...

armid
01-02-2012, 11:35
Подскажите как быть.

Anton04
01-02-2012, 13:47
armid,

Если не получается прямо, может пойти обходным путём ;)

Если пользователи сидят на терминале, то поможет просто принудительное закрытие сессий или приложения 1С.

armid
01-02-2012, 13:54
Anton04, это не терминальные подключения.

Если не получается прямо »
а почему прямо не получается у меня?




© OSzone.net 2001-2012