Форум: "Базы";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизПолучение выходного параметра Найти похожие ветки
← →
overstep (2004-06-23 17:24) [0]Добрый день. Подскажите пожалуйста. Выполняю комманду RESTORE VERIFYONLY, в лучшем случае она возвращает "The backup set is valid.", но как мне перехватить это сообщение и обработать, то есть при неудаче повторить резервирование.
← →
Ega23 © (2004-06-23 17:45) [1]А в чём проблема?
If the backup is valid, Microsoft® SQL Server™ returns the message: “The backup set is valid.”
← →
overstep (2004-06-24 11:57) [2]Проблема в том, что я это сообщение вижу, но мне его надо обработать автоматически. То есть обратиться к какой-то переменнной, которая хранит последнее сообщение и сравнить её с “The backup set is valid.” Ну короче говоря если backup окончился неудачей то повторить его заново и не более 3-ех раз.
← →
bushmen © (2004-06-24 13:30) [3]Если есть строка ответа, то заключить ее в цикл и поставить счетчик - не такое уж и сложное дело :)
← →
overstep (2004-06-24 16:22) [4]Я ведь не знаю как это сделать, если кто знает подскажите пожалуйста. А именно я не знаю как определить, что за ответ был после выполнения команды.
← →
Ega23 © (2004-06-24 16:23) [5]Ты откуда её выполняешь? С клиента?
← →
bushmen © (2004-06-24 16:42) [6]>что за ответ был после выполнения команды
какими компонентами пользуешься для доступа?
← →
overstep (2004-06-24 17:26) [7]Команда выполняется как задание SQL Server Agent-а, на сервере. Задача написана на Transact-SQL. Ответ всегда одинаковый в положительном случае. Заранее ответ неизвестен, да и потом я ж не буду сидеть и смотреть какой выдаст ответ. Это (решение дальнейших действий) должно происходить без моего участия.
← →
Ega23 © (2004-06-24 17:42) [8]Стоп, это у тебя job такой написан, так?
← →
Ega23 © (2004-06-24 17:44) [9]Полный текст на TSQL можешь привести?
← →
overstep (2004-06-25 12:51) [10]Далее приведен текст как это все организовано
-----------------------------------------------------------
--full backup all databases to separate archive files "dbname_backup.rar"
DECLARE @DBName varchar(128),
@BackupPath varchar(29)
SET @BackupPath="D:\MSSQL\BACKUP\F_"+CONVERT(varchar(10),GETDATE(),126)+"\"
EXEC("xp_cmdshell ""mkdir "+@BackupPath+"""")
--declare main cursor
DECLARE main_cur CURSOR FOR
SELECT name
FROM sysdatabases
WHERE name<>"tempdb"
ORDER BY name
--backup all databases to archive files in main cursor
OPEN main_cur
FETCH NEXT FROM main_cur INTO @DBName
WHILE @@FETCH_STATUS=0
BEGIN
EXEC("BACKUP DATABASE ["+@DBName+"] TO DISK = N"""+@BackupPath+@DBName+"_backup.BAK"""+" WITH INIT, NOUNLOAD, NAME = N"""+@DBName+" backup"""+", NOSKIP, STATS = 10, NOFORMAT")
-- EXEC("RESTORE VERIFYONLY FROM DISK = N"""+@BackupPath+@DBName+"_backup.BAK""")
-- эта строка забанина потому как не знаю что делать с ответом
EXEC("xp_cmdshell ""C:\Program Files\WinRAR\WinRAR M -rr3p -ep -k "+@BackupPath+@DBName+"_backup.rar "+@BackupPath+@DBName+"_backup.BAK""")
FETCH NEXT FROM main_cur INTO @DBName
END
--close and deallocate main cursor
CLOSE main_cur
DEALLOCATE main_cur
------------------------------------------------------------
Базы backup-ятся в цикле все кроме tempdb, а потом архивируются и удаляются bak-файлы. Впринципе можно сделать, то что я хотел через job в SQL Server Agent, но прийдется переделывать, кучу шагов делать, а так я использовал бы только его шедулер и все. Да и гибкости по более.
← →
Ega23 © (2004-06-25 13:51) [11]Блин, вот ты озадачил! Полчаса бьюсь - и никак!
← →
Ega23 © (2004-06-25 14:01) [12]Слушай, а @@FETCH_STATUS если проверять?
Как в этом примере:
WHILE (@@FETCH_STATUS <> -1)
BEGIN
/* A @@FETCH_STATUS of -2 means that the row has been deleted.
There is no need to test for this because this loop drops all
user-defined tables. */.
EXEC ("DROP TABLE " + @tablename)
FETCH NEXT FROM tables_cursor INTO @tablename
END
← →
bushmen © (2004-06-25 16:07) [13]>Да и гибкости по более.
Напиши скриптом в DTS - вот и гибкость будет :) А потом запускай ее уже из хранимой процедуры, а на выход передавай результат выполнения DTS.
← →
overstep (2004-06-29 12:25) [14]Я нашел одну фичу - @@ERROR (возвращает код ошибки или ноль(если успешно) последнего выполненного Transact-SQL указателя (statement))
После неё проверка выглядет так:
EXEC("BACKUP DATABASE ["+@DBName+"] TO DISK = N"""+@BackupPath+@DBName+"_backup.BAK"""+" WITH INIT, NOUNLOAD, NAME = N"""+@DBName+" backup"""+", NOSKIP, STATS = 10, NOFORMAT")
EXEC("RESTORE VERIFYONLY FROM DISK = N"""+@BackupPath+@DBName+"_backup.BAK""")
IF (@@ERROR <> 0)
BEGIN
...
END
------------------------------------------------
Но становится другая проблема, переменная то глобальная, я не знаю как поведет она себя при многопользовательском режиме.
Смотрел примеры microsoft, так они добавляют @ReturnCode:
EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id.
Опять проблема, не смог получить @ReturnCode от EXEC("RESTORE VERIFYONLY FROM DISK = N"""+@BackupPath+@DBName+"_backup.BAK""").
Стало быть это работает с хранимы процедурами.
------------------------------------------------
А теперь по сути. После удачного RESTORE VERIFYONLY выдается сообщение "The backup set is valid." с кодом error=3262 из master.sysmessages. @@ERROR опять таки возвратит ноль, но как мне узнать, что такое сообщение было. Ведь даже в многопользовательской системе это делает только один пользователь. Вероятность ошибки будет очень мала.
>Напиши скриптом в DTS - вот и гибкость будет
bushmen подкинь пожалуйста ссылку или что нибудь про DTS. Я скрипты в нем никогда не пробовал
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c