Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Принудительное завершение сессий (http://forum.oszone.net/showthread.php?t=225852)

armid 21-01-2012 14:29 1841073

Принудительное завершение сессий
 
Приветствую!

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

Цитата:

Цитата armid
принудительного и правильного закрытия сессий »

Принудительно и правильно - вещи несовместимые :)

Один из вариантов - перевести принудительно базу в режим одного пользователя и вернуть обратно скриптом:
http://stackoverflow.com/questions/1...-2005-database
или ручками:
http://www.kodyaz.com/articles/kill-...-database.aspx

armid 21-01-2012 17:11 1841188

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 1841203

Цитата:

Цитата armid
данная операция будет выполняться каждые сутки. Не будет ли это чревато? »

Я такую операцию иногда делаю по 5 раз на день, когда необходимо накатить какое либо обновление, либо провести операцию, требующую монопольного доступа. За последние 5 лет проблем не наблюдал :)

Оба метода по принудительному отключению делают примерно одно и то же:
1. приведенный скрипт просто выбирает все текущие сессии и отключает их командой KILL.
2. Перевод в монопольный доступ делает то же самое, только автоматически.


Цитата:

Цитата armid
правильно все таки я понял, что Rebuild Index Task не может выполнится из-за "сидячих" юзеров? »

http://www.sql-server-performance.co...lding-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 1841215

Вариант с переводом в режим одного пользователя нравится больше всего. Да и скрипт для него простой :)

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

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

armid 21-01-2012 19:12 1841279

А зачем в скрипте перевода
Код:

use master
использовать?

Delirium 22-01-2012 10:51 1841627

Затем, чтобы запустить скрипт, используя подключение к системной базе данных, а не к пользовательской.

Delirium 24-01-2012 01:23 1843088

Цитата:

Цитата armid
завтра отпишусь о результатах »

и тишина.... ушел в бекап с головой :)

Iska 24-01-2012 02:57 1843111

Лишь бы не в восстановление без бэкапа.

armid 24-01-2012 10:37 1843217

Да не, не тишина. Че то не вышло у меня... Думал не доставать форумчан свои проблемами. Сейчас соберу логи и отпишусь.

armid 25-01-2012 12:30 1844110

Во общем вот последняя версия ошибки :)

Цитата:

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/...84c5d54a8e.png

Delirium 26-01-2012 01:10 1844599

Цитата:

Цитата armid
"Database 't1' is already open and can only have one user at a time." »

Говорит, что база уже открыта пользователем.

armid 28-01-2012 19:01 1846376

Так я же ее перевел в сингл юзер...

armid 01-02-2012 11:35 1849148

Подскажите как быть.

Anton04 01-02-2012 13:47 1849264

armid,

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

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

armid 01-02-2012 13:54 1849268

Anton04, это не терминальные подключения.

Цитата:

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

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


Время: 02:24.

Время: 02:24.
© OSzone.net 2001-