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

Откуда:
Сообщений: 116
Каждую ночь делается полный бэкап, в течение дня каждые три часа делается разность в этот же файл с полной копией. Часто требуется восстановить из такого файла бэкапа в тестовую базу. Мне приходится каждый раз руками кликать на базу правой -> восстановить, указывать файл, отмечать галочками полный и разностный бэкап, и только после этого жму кнопку "Скрипт" и выполняю.
Хочу избавиться от этой рутины. Причина повторения этих действий заключается в том, что мне неизвестен номер разностной копии в заданном файле, в этом и вопрос.
Например, выполняю я такой скрипт:
USE [master]
RESTORE DATABASE [test1] FROM  DISK = N'D:\Backups\backup20180708.bak' WITH  FILE = 1,  
MOVE N'OneC_ECM' TO N'G:\MSSQLDB\test1.mdf',  
MOVE N'OneC_ECM_log' TO N'E:\Logs\test1_log.ldf',  
NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 5

RESTORE DATABASE [test_ECM_CorpSoft] FROM  DISK = N'D:\Backups\backup20180708.bak' 
WITH  FILE = 9,  NOUNLOAD,  STATS = 5

Первый набор - это полный бэкап, 9й - это разность (как видите, в этом же файле, но с другим номером 9).
Как мне получить это число 9?

Перед тем как задать вопрос, поискал, конечно же, в интернете - не нашел своего вопроса. Поискал на этом форуме, нашел лишь:
[url=]http://www.sql.ru/forum/1110606/vostanovlenie-bd-iz-differencialnoy-rezervnoy-kopii[/url]
Почитал вот эти ссылки:
1)[url=]https://docs.microsoft.com/ru-ru/sql/relational-databases/backup-restore/restore-files-and-filegroups-over-existing-files-sql-server?view=sql-server-2017[/url]
2) [url=]https://docs.microsoft.com/ru-ru/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-2017[/url]
В последней ссылке, кстати, есть мой пример, но также указываются конкретные номера резервных наборов.

Как узнать максимальный (а точнее последний актуальный) номер резервного набора разностной копии внутри одного файла?
11 июл 18, 19:29    [21563834]     Ответить | Цитировать Сообщить модератору
 Re: Как программно в MS SQL Server узнать номер последней разности в файле бэкапа?  [new]
SERG1257
Member

Откуда:
Сообщений: 2559
okwell5
Как мне получить это число 9?

Полагаю анализируя результат
RESTORE HEADERONLY FROM DISK = 'D:\Backups\backup20180708.bak'
GO

Position smallint Position of the backup set in the volume (for use with the FILE = option).

https://docs.microsoft.com/en-us/sql/t-sql/statements/restore-statements-headeronly-transact-sql?view=sql-server-2017
11 июл 18, 20:06    [21563913]     Ответить | Цитировать Сообщить модератору
 Re: Как программно в MS SQL Server узнать номер последней разности в файле бэкапа?  [new]
okwell5
Member

Откуда:
Сообщений: 116
SERG1257, Спасибо за подсказку! Это действительно то, что мне нужно. Только как я могу управлять этой информацией? Например, в какую-то переменную или таблицу?
select * from 
(
RESTORE HEADERONLY   
FROM DISK = N'D:\Backups\backup20180708.bak'   
WITH NOUNLOAD
)

Сообщение 156, уровень 15, состояние 1, строка 3
Неправильный синтаксис около ключевого слова "RESTORE".
Сообщение 102, уровень 15, состояние 1, строка 6
Неправильный синтаксис около конструкции ")"
Может, я что-то делаю не так, прошу еще одну подсказку.
11 июл 18, 20:36    [21563976]     Ответить | Цитировать Сообщить модератору
 Re: Как программно в MS SQL Server узнать номер последней разности в файле бэкапа?  [new]
SERG1257
Member

Откуда:
Сообщений: 2559
> Например, в какую-то переменную или таблицу?

declare @BackupInfo table
(
BackupName nvarchar(128),
BackupDescription nvarchar(255),
BackupType smallint,
ExpirationDate datetime,
Compressed bit,
Position smallint,
DeviceType tinyint,
UserName nvarchar(128),
ServerName nvarchar(128),
DatabaseName nvarchar(128),
DatabaseVersion int,
DatabaseCreationDate datetime,
BackupSize numeric(20,0),
FirstLSN numeric(25,0),
LastLSN numeric(25,0),
CheckpointLSN numeric(25,0),
DatabaseBackupLSN numeric(25,0),
BackupStartDate datetime,
BackupFinishDate datetime,
SortOrder smallint,
[CodePage] smallint,
UnicodeLocaleId int,
UnicodeComparisonStyle int,
CompatibilityLevel tinyint,
SoftwareVendorId int,
SoftwareVersionMajor int,
SoftwareVersionMinor int,
SoftwareVersionBuild int,
MachineName nvarchar(128),
Flags int,
BindingID uniqueidentifier,
RecoveryForkID uniqueidentifier,
Collation nvarchar(128),
FamilyGUID uniqueidentifier,
HasBulkLoggedData bit,
IsSnapshot bit,
IsReadOnly bit,
IsSingleUser bit,
HasBackupChecksums bit,
IsDamaged bit,
BeginsLogChain bit,
HasIncompleteMetaData bit,
IsForceOffline bit,
IsCopyOnly bit,
FirstRecoveryForkID uniqueidentifier,
ForkPointLSN numeric(25,0),
RecoveryModel nvarchar(60),
DifferentialBaseLSN numeric(25,0) ,
DifferentialBaseGUID uniqueidentifier,
BackupTypeDescription nvarchar(60),
BackupSetGUID uniqueidentifier,
CompressedBackupSize bigint,
containment tinyint,
KeyAlgorithm nvarchar(32),
EncryptorThumbprint varbinary(20),
EncryptorType nvarchar(32)
)

insert into @BackupInfo
exec ('RESTORE HEADERONLY FROM DISK = ''D:\Backups\backup20180708.bak''')

select * from @BackupInfo
11 июл 18, 20:59    [21564016]     Ответить | Цитировать Сообщить модератору
 Re: Как программно в MS SQL Server узнать номер последней разности в файле бэкапа?  [new]
okwell5
Member

Откуда:
Сообщений: 116
SERG1257, Круто! Теперь я смогу это заскриптовать в агенте по расписанию. Спасибо за помощь!
11 июл 18, 21:07    [21564035]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить