Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 "Универсальный" скрипт востановления БД из последнего полного бэкапа  [new]
85sergu
Member

Откуда: Винница
Сообщений: 137
Моя предыдущая тема "Универсальный скрипт для копирования BackUp-ов на сетевой диск копировала бэкапи на сетевой диск '\\XXX.XXX.XXX.XXX\SWBackUp'
А эта востанавливает нужную мне БД из бэкапа
Эсть сервер MsSQL1 который бэкапит базы локально, а потом копирует базы на сетевой диск '\\XXX.XXX.XXX.XXX\SWBackUp'
и есть втрой сервер MsSQL2, который связаный с MsSQL1, выполняю скрипт на сервер MsSQL2 и востанавливаю нужную мне базу из бэкапа!
Это все нужно для того что б главныы сервер MsSQL1 был "практически незадействован" в этом процессе
--скрипт для востановления БД с последней полной резервной копии
DECLARE @NameDB NVARCHAR(100)
DECLARE @NameBackUp NVARCHAR(100)
DECLARE @SQL NVARCHAR(300)

SELECT @NameDB=bs.[database_name], 
@NameBackUp=substring(bmf.[physical_device_name],len(rtrim(bmf.[physical_device_name])) - patindex('%\%',reverse(rtrim(bmf.[physical_device_name])))+2,len(bmf.[physical_device_name]))
FROM [MsSQL1].[msdb].[dbo].[backupset] bs, [MsSQL1].[msdb].[dbo].[backupmediafamily] bmf
WHERE bs.[media_set_id]=bmf.[media_set_id] AND bs.[backup_finish_date] IN 
(SELECT max ([backup_finish_date]) FROM [MsSQL1].[dbo].[backupset] WHERE [type]='D') 
SET @SQL='RESTORE DATABASE '+@NameDB+ ' FROM DISK=''\\XXX.XXX.XXX.XXX\SWBackUp\'+@NameDB+'\'+@NameBackUp+ ''''
--print @SQL 
--если выполнить print @SQL то получим  RESTORE DATABASE portal2 FROM DISK='\\XXX.XXX.XXX.XXX\SWBackUp\portal2\portal2_backup_200903270315.bak'
execute sp_executesql @SQL
А если развивать эту тему, можно поменять условие и выбрать последний дифференцыальный бэкап. Тогда скрипт немного поменяеться
Сначала востанавливаем БД portal2 из последнего полного бэкапа скриптом->
DECLARE @NameDB NVARCHAR(100)
DECLARE @NameBackUp NVARCHAR(100)
DECLARE @SQL NVARCHAR(300)

SELECT @NameDB=bs.[database_name], 
@NameBackUp=substring(bmf.[physical_device_name],len(rtrim(bmf.[physical_device_name])) - patindex('%\%',reverse(rtrim(bmf.[physical_device_name])))+2,len(bmf.[physical_device_name]))
FROM [MsSQL1].[msdb].[dbo].[backupset] bs, [MsSQL1].[msdb].[dbo].[backupmediafamily] bmf
WHERE bs.[media_set_id]=bmf.[media_set_id] AND bs.[backup_finish_date] IN 
(SELECT max ([backup_finish_date]) FROM [MsSQL1].[msdb].[dbo].[backupset] WHERE [type]='D' and [database_name]='portal2') 
SET @SQL='RESTORE DATABASE '+@NameDB+ ' FROM DISK=''\\XXX.XXX.XXX.XXX\SWBackUp\'+@NameDB+'\'+@NameBackUp+ ''' WITH NORECOVERY'
--print @SQL
execute sp_executesql @SQL
А потом накатываем последнюю дифференциальную резервную копию этой же базы->
DECLARE @NameDB NVARCHAR(100)
DECLARE @NameBackUp NVARCHAR(100)
DECLARE @SQL NVARCHAR(300)

SELECT @NameDB=bs.[database_name], 
@NameBackUp=substring(bmf.[physical_device_name],len(rtrim(bmf.[physical_device_name])) - patindex('%\%',reverse(rtrim(bmf.[physical_device_name])))+2,len(bmf.[physical_device_name]))
FROM [MsSQL1].[msdb].[dbo].[backupset] bs, [MsSQL1].[msdb].[dbo].[backupmediafamily] bmf
WHERE bs.[media_set_id]=bmf.[media_set_id] AND bs.[backup_finish_date] IN 
(SELECT max ([backup_finish_date]) FROM [MsSQL1].[msdb].[dbo].[backupset] WHERE [type]='I' and [database_name]='portal2') 
SET @SQL='RESTORE DATABASE '+@NameDB+ ' FROM DISK=''\\XXX.XXX.XXX.XXX\SWBackUp\'+@NameDB+'\'+@NameBackUp+ ''' WITH RECOVERY'
--print @SQL
execute sp_executesql @SQL
своего рода "мини репликация":-)
Да только одно НО, нужно выполнять 2 и 3 скрипты очень осторожно!)) Нужно ТОЧНО знать что до выполнения етих скриптов осуществлялось полное и дифференцыальное копирование нужной базы -)
27 мар 09, 13:55    [6984330]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: "Универсальный" скрипт востановления БД из последнего полного бэкапа  [new]
85sergu
Member

Откуда: Винница
Сообщений: 137
День добрый коллеги!
Сегодня утром проверял историю выполнения job-ов по восстановлению базы, и обнаружил ошибку "The job failed"
Оказывается ""Универсальный" скрипт восстановления БД из последнего полного бэкапа" - не совсем "универсальный"
В плане обслуживания было указана полная копия нескольких "маленьких" баз, у которых время окончания выполнения копии базы
поле[backup_finish_date]
таблицы [msdb].[dbo].[backupset]
одинаковые
соответственно дальнейшее восстановление базы было некорректно.
Поэтому привязку к полю
[backup_finish_date]
нужно заменить на
[backup_set_id]

В результате получим скрипт
DECLARE @NameDB NVARCHAR(100)
DECLARE @NameBackUp NVARCHAR(100)
DECLARE @SQL NVARCHAR(300)

SELECT @NameDB=bs.[database_name], 
@NameBackUp=substring(bmf.[physical_device_name],len(rtrim(bmf.[physical_device_name])) - patindex('%\%',reverse(rtrim(bmf.[physical_device_name])))+2,len(bmf.[physical_device_name]))
FROM [MsSQL1].[msdb].[dbo].[backupset] bs, [MsSQL1].[msdb].[dbo].[backupmediafamily] bmf
WHERE bs.[media_set_id]=bmf.[media_set_id] AND bs.[backup_set_id] IN 
(SELECT max ([backup_set_id]) FROM [MsSQL1].[dbo].[backupset] WHERE [type]='D') 
SET @SQL='RESTORE DATABASE '+@NameDB+ ' FROM DISK=''\\XXX.XXX.XXX.XXX\SWBackUp\'+@NameDB+'\'+@NameBackUp+ ''''
--print @SQL 
--если выполнить print @SQL то получим  RESTORE DATABASE portal2 FROM DISK='\\XXX.XXX.XXX.XXX\SWBackUp\portal2\portal2_backup_200903270315.bak'
EXECUTE sp_executesql @SQL

Если полная копия базы находится на локальном сервере и нужно каждое утро восстанавливать базу DB_name в базу DB_name_test то можно использовать следующий скрипт
DECLARE @NameDB NVARCHAR(100)
DECLARE @NameBackUp NVARCHAR(100)
DECLARE @SQL NVARCHAR(500)
--///
SELECT @NameDB=bs.[database_name], 
@NameBackUp=substring(bmf.[physical_device_name],len(rtrim(bmf.[physical_device_name])) - patindex('%\%',reverse(rtrim(bmf.[physical_device_name])))+2,len(bmf.[physical_device_name]))
FROM [msdb].[dbo].[backupset] bs, [msdb].[dbo].[backupmediafamily] bmf
WHERE bs.[media_set_id]=bmf.[media_set_id] AND bs.[backup_set_id] IN 
(SELECT max ([backup_set_id]) FROM [msdb].[dbo].[backupset] WHERE [type]='D' AND [database_name]='DB_name') 
--SELECT @NameDB
SET @SQL='RESTORE DATABASE DB_name_test FROM DISK=''e:\BackUpMSQL\'+@NameDB+'\'+@NameBackUp+ '''' + ' WITH FILE = 1,
MOVE N''DB_name'' TO N''d:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\DB_name_test.mdf'',
MOVE N''DB_name_log'' TO N''d:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\DB_name_test_log.ldf'',
NOUNLOAD, REPLACE, STATS = 10'
--print @SQL
EXECUTE sp_executesql @SQL
24 апр 15, 11:59    [17558130]     Ответить | Цитировать Сообщить модератору
 Re: "Универсальный" скрипт востановления БД из последнего полного бэкапа  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
некроманты (филы)
24 апр 15, 15:04    [17559569]     Ответить | Цитировать Сообщить модератору
 Re: "Универсальный" скрипт востановления БД из последнего полного бэкапа  [new]
zasandator
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 4887
85sergu,

Нас-рать
24 апр 15, 15:12    [17559645]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить