Предлагаю вашему вниманию несколько SQL-скриптов (для MS SQL-Server) для автоматизации процесса резервного копирования и восстановления баз данных. Скрипты для восстановления позволяют "перезаливать" базы данных, т. е. восстанавливать одну базу из копий другой базы данных. Все скрипты формируют лог для вывода и при необходимости могут отправлять результат работы по электронной почте.
Еще частый сценарий это создание резервной копии БД на одном сервере и восстановление в БД на другом сервере.
Например, рабочие базы на своих серверах, а тестовые на отдельном. И надо загрузить копию рабочей базы в тестовую базу.
(21) у нас это был один скрипт + хранимая процедура. В скрипте было создание резервной копии и копирование ее на тестовый сервер, а там вызывалась хранимая процедура, в которой были шаги по восстановлению, очистка объемных таблиц и что-то ещё. Но в принципе можно было и одним сделать, просто это не за один присест рождалось.
Блин, ну это вообще детский сад какой-то...
Где например определение имени последнего бэкапа, если бэкапы идут с разными именами?
SEL ECT @@Servername AS ServerName ,
d.Name AS DBName ,
b.Backup_finish_date , b.[type],
bmf.Physical_Device_name
FR OM sys.databases d
INNER JOIN msdb..backupset b ON b.database_name = d.name AND b.[type] = 'D'
INNER JOIN msdb.dbo.backupmediafamily bmf ON b.media_set_id = bmf.media_set_id
ORDER BY d.NAME , b.Backup_finish_date DESC;
В секции, где восстановление базы - неплохо бы отключить существующие подключения
DECLARE @SQLString1 NVARCHAR(4000)
-------------------------------------------
BEGIN TRY
set @SQLstring1= 'alt er database [' +@DBName_To+ '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE'
exec @SQLstring1
EXEC sp_executesql @SQLString
set @SQLstring1= 'alt er database [' +@DBName_To+ '] SET MULTI_USER '
exec @SQLstring1
END TRY
(8) Ваш вариант нерабочий, но спасибо за наводку. Я его немного исправил и теперь действительно можно перезаливать базу, если в ней есть активные сеансы (они будут завершены)
P.S. форма кода почему-то автоматически разделяет команду "ALTER" на "ALT ER" - нужно удалить пробел при копировании кода!
-- tweak: ЗАВЕРШЕНИЕ АКТИВНЫХ СЕАНСОВ В БАЗЕ путем перевода в однопользовательский режим и обратно
BEGIN TRY
SET @SQLstring= 'ALT ER DATABASE ' +@DBName_To+ ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;'
EXEC sp_executesql @SQLString
SET @SQLstring= 'ALT ER DATABASE ' +@DBName_To+ ' SET MULTI_USER;'
EXEC sp_executesql @SQLString
END TRY
BEGIN CATCH
-- Ошбика выполнения операции
SET @subject = 'ОШИБКА ВОССТАНОВЛЕНИЯ базы данных ' + @DBName_To
SET @finalmassage = 'Ошибка перевода базы в одно- или многопользовательский режим ' + @DBName_To + CHAR(13) + CHAR(13)
+ 'Код ошибки: ' + CAST(ERROR_NUMBER() as nvarchar(10)) + CHAR(13) + CHAR(13)
+ 'Текст ошибки: ' + ERROR_MESSAGE() + CHAR(13) + CHAR(13)
+ 'Текст T-SQL:' + CHAR(13) + @SQLString
END CATCH;
Сообщение 102, уровень 15, состояние 1, строка 1
Incorrect syntax near '-'.
Сообщение 319, уровень 15, состояние 1, строка 2
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Кстати, автор, почему у тебя в условиях стоит какая-то двойка ?
IF @subject = '2'
Эти блоки кода ведь просто игнорируются, нигде не нашел, чтобы в переменной subject присваивалась цифра 2
Для успешного выполнения условия нужно указывать:
Сам писал скрипты по восстановлению. Сейчас жалею что не нашел тогда вашу статью. Всё четко, лаконично и именно так как надо. Хочу сказать спасибо большое автору за проделанную работу.