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

Откуда:
Сообщений: 536
Всегда считал, что команда
RESTORE DATABASE [dbname] FROM DISK = N'backup.bak' WITH FILE = 1, MOVE 'file1' TO N'D:\DBData\file1.mdf', MOVE 'file_log' TO N'db_log.ldf', NOUNLOAD, REPLACE, STATS = 5

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

Вчера же столкнулся с ситуацие, когда в бекапе лежало 2 версии, одна из них трёхнедельной давности. Она-то и развернулась.
Почитал документацию и не обнаружил параметра, отвечающего за то, чтобы разворачивалась база на дату последнего таймлайна.

Как же всё-таки этого достичь?
26 ноя 14, 09:00    [16905915]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
With file
26 ноя 14, 09:14    [16905962]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
Glory
Member

Откуда:
Сообщений: 104760
MGR
должна восстанавивать последний бекап из файла.

Не последний
FILE ={ backup_set_file_number | @backup_set_file_number }
Supported by: RESTORE, RESTORE FILELISTONLY, RESTORE HEADERONLY, and RESTORE VERIFYONLY.

Identifies the backup set to be restored. For example, a backup_set_file_number of 1 indicates the first backup set on the backup medium and a backup_set_file_number of 2 indicates the second backup set. You can obtain the backup_set_file_number of a backup set by using the RESTORE HEADERONLY statement.

MGR
Как же всё-таки этого достичь?

Решаете, на каком устройстве какой именно бэкап для вас является "последним таймлайном" и восстанавливает именно этот бэкап именно с этого устройства
26 ноя 14, 09:27    [16906045]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
MGR
Member

Откуда:
Сообщений: 536
BKV88,

А подробнее? Можно опустить?
Если я пишу - WITH RECOVERY, получаю тоже самое.
Если напишу WITH FILE = 2, То работает в данном случае, но я же не знаю обычно содержимое бекапа, а нужен всегда последний.
26 ноя 14, 09:34    [16906085]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
Glory
Member

Откуда:
Сообщений: 104760
MGR
но я же не знаю обычно содержимое бекапа,

И что вам мешает узнать содержимое устройства архифирования ?
26 ноя 14, 09:40    [16906113]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
MGR
Member

Откуда:
Сообщений: 536
Glory,

Похоже я ступил, либо до сих пор это не влияло или не попадалось.
Проблема в том, что никогда не знаешь, сколько же там файлов. Потому и получается загвоздка.
Хочется эмулировать работу SSMS, который по умолчанию берёт последний сет.
26 ноя 14, 09:40    [16906114]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
Glory
Member

Откуда:
Сообщений: 104760
MGR
Проблема в том, что никогда не знаешь, сколько же там файлов.

Где "там" ? И почему "никогда не знаешь" ?
26 ноя 14, 09:41    [16906120]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
MGR
Member

Откуда:
Сообщений: 536
Glory
MGR
но я же не знаю обычно содержимое бекапа,

И что вам мешает узнать содержимое устройства архифирования ?


Я подробней опишу.
В день приходится восстанавливать довольно большое количество баз (иногда до десятка), приходящих от разных людей.
Чтобы не заморачиваться с SSMS, написали скриптик, который готовит "RESTORE DATABASE" команду, имея 2 параметра - локейшен бекапа и имя БД, которое нам надо.

В результате не учли, что бывают несколько сетов.

Значит надо докрутить скрипт, но тогда неясно, как получить правильную команду. Я бегло пробежал по RESTORE HEADERONLY и не вижу, как она мне поможет.
Ведь там может быть несколько полных бекапов и потом диффы.
26 ноя 14, 09:45    [16906144]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
Glory
Member

Откуда:
Сообщений: 104760
MGR
Я бегло пробежал по RESTORE HEADERONLY и не вижу, как она мне поможет.

Пробегите не бегло, а обстоятельно

MGR
Ведь там может быть несколько полных бекапов и потом диффы.

Заголовки бэкапов содержат все метаданные, которые нужны для определения всего, что нужно.
26 ноя 14, 09:47    [16906153]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
MGR
Member

Откуда:
Сообщений: 536
Glory
MGR
Я бегло пробежал по RESTORE HEADERONLY и не вижу, как она мне поможет.

Пробегите не бегло, а обстоятельно

MGR
Ведь там может быть несколько полных бекапов и потом диффы.

Заголовки бэкапов содержат все метаданные, которые нужны для определения всего, что нужно.


Да я пробегу и не бегло.
Только я хочу понять, если вы знаете - можете сберечь мне время.
Мне придётся пробегать и составлять список сетов для рестора (типа 1 фул, потом 10 дифов), и вариант эмулировать работу SSMS (последнее состояние) сделать скриптом невозможно?
26 ноя 14, 10:03    [16906233]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
Glory
Member

Откуда:
Сообщений: 104760
MGR
Только я хочу понять, если вы знаете - можете сберечь мне время.

Знаю что ?
Что придется прочитать заголовки всех бэкапов в поисках нужных вам ?

MGR
и вариант эмулировать работу SSMS (последнее состояние) сделать скриптом невозможно?

SMS может читать историю бэкапов, если она еще есть в вашей базе msdb.
Но история бэкапов не гарантирует физического наличия этих бэкапов на устройствах

MGR
Мне придётся пробегать и составлять список сетов для рестора (типа 1 фул, потом 10 дифов),

Если вы намерены построить механизм восстановления, опираясь на имеющиеся в наличии бэкапы, то именно так и придется сделать
26 ноя 14, 10:10    [16906267]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
MGR
Мне придётся пробегать и составлять список сетов для рестора (типа 1 фул, потом 10 дифов), и вариант эмулировать работу SSMS (последнее состояние) сделать скриптом невозможно?
Да, пробегать и составлять. Почему невозможно? Прямо скриптом пробегать и выбрать нужный.

Вам что нужно сделать в итоге, восстановить последний полный бакап, или у вас какой то более сложный алгоритм? Если первое, то это несложно, всего то выбрать из списка последний бакап типа "полный бакап базы"
26 ноя 14, 10:13    [16906279]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
MGR
Мне придётся пробегать и составлять список сетов для рестора (типа 1 фул, потом 10 дифов)
И вообще непонятна терминология "пробегать и составлять список сетов"

Какой "список сетов"?
Что бы получить номар последнего полного бакапа, нужно сделать запрос
select max(Position) from #header where BackupType = 1
, из таблички #header, в которую вы вставите результат выполнения RESTORE HEADERONLY

Если алгоритм более сложный, то запрос будет посложнее, то тоже не неподъёмный.
26 ноя 14, 10:22    [16906326]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
MGR
Member

Откуда:
Сообщений: 536
alexeyvg,

Да, но если после этого последнего были 10 дифф бекапов? Мне придётся вытащить последний полный, добавить его в свою команду, потом 10 дифф, добавить их в строку и всё это вместо одной команды, которая взяла бы последнее возможное состояние...
Конечно, задача не неподъёмная, но кажется мне странно сложной.
26 ноя 14, 10:41    [16906447]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
MGR
alexeyvg,

Да, но если после этого последнего были 10 дифф бекапов? Мне придётся вытащить последний полный, добавить его в свою команду, потом 10 дифф, добавить их в строку и всё это вместо одной команды, которая взяла бы последнее возможное состояние...
Конечно, задача не неподъёмная, но кажется мне странно сложной.

А с рестором бэкапов лога не путаете ? Если набор резервного копирования(он так называется, а не придуманный вами сет) содержит полную резервную копию и последовательность дифференциальных, то восстановление на конечный момент времени определяется восстановлением полной резервной копии + последней дифференциальной !!!
26 ноя 14, 10:51    [16906509]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
MGR
Да, но если после этого последнего были 10 дифф бекапов? Мне придётся вытащить последний полный, добавить его в свою команду, потом 10 дифф, добавить их в строку и всё это вместо одной команды, которая взяла бы последнее возможное состояние...
Ну у сиквела нету такой команды, что теперь поделать, нужно программировать.

Напишите предложение в МС, пусть сделают. Но вряд ли сделают, ситуация сильно нестандартная, потому что нормальному человеку не придёт в голову хранить несколько бакапов в одном файле, это противоречит всем стратегиям резервного копирования.
Это в общем унаследованная функциональность времён магнитных лент.

Сложного, повторю, ничего нет. Вы алгоритм получения нужных номеров файлов сначала напишите по русски, а потом уже начинайте программировать. Получится тот же один запрос, только посложнее.

Я не понимаю терминов "добавить в строку" и т.п. Если человеку нужно сложить два числа и взять из них корень, он не говорит "придётся вытащить последний полный, добавить его в свою команду, потом 10 дифф, добавить их в строку и всё это вместо одной команды", он просто пишет формулу на используемом языке программирования. Вот и вы напишите запрос на T-SQL.

И освежите в памяти, как делаются и восстанавливаются бакапы у сиквела, и что вообще означает понятия "полный" и "дифф." бакап, а то желание получить список дифф. бакапов настораживает, он же вам не нужен по идее.
26 ноя 14, 10:56    [16906540]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
MGR
Member

Откуда:
Сообщений: 536
alexeyvg,

Спасибо, почитаю.
Сейчас прошерстил по имеющимся бекапам, оказалось, что последние 100 бекапов содержали по одному бекап сету. И только вот один пример такой. Дальше копаться не стал.

Что касается строки - ну вот динамически создается стетмент для восстановления бекапа и разворачивания базы. Писал даже не я, я скорее пользователь. Придётся докрутить. В общем ничего сложного, конено, но меня просто удивило отсутствие такой фичи.

А про писать МС - я им писал с описанием проблемы (импорт азуровских пакаджей падает при недостаточности памяти на клиенте), был долго пинаем и послан в конце-концов. Типа пользуйтесь консольной утилитой. Веры в человечество это не прибавило :)
26 ноя 14, 11:22    [16906705]     Ответить | Цитировать Сообщить модератору
 Re: Как восстановить последний бекап из файла?  [new]
MGR
Member

Откуда:
Сообщений: 536
Короче, всем спасибо. Переписал для последнего бекапа.
Оставлю скрипт тут - вдруг кому-то потом пригодится.
Он немного под мою инфраструктуру заточен, но всё-таки

use master

DECLARE @RestoreFileName nvarchar(max), @Exec nvarchar(max), @DB nvarchar(500), @FileID int

SELECT 
@DB = '<destination db name>',
@RestoreFileName = '\\share\backup file name'


DECLARE @Files 
TABLE
(
 LogicalName nvarchar(255),
 PhysicalName nvarchar(255),
 Type nvarchar(10),
 FileGroupName nvarchar(255),
 Size numeric,
 MaxSize numeric,
 Field numeric,
 CreateLSN bit,
 DropLSN bit,
 UniqueID uniqueidentifier,
 ReadOnlyLSN bit,
 ReadWriteLSN bit,
 BackupSizeInBytes numeric,
 SourceBlockSize numeric,
 FileGroupId bit,
 LogGroupGUID uniqueidentifier,
 DifferentialBaseLSN nvarchar(255), 
 DifferentialBaseGUID uniqueidentifier, 
 IsReadonly bit,
 IsPresent bit,
 TDE nvarchar(255)
 )

SET @Exec = 'RESTORE FILELISTONLY FROM  DISK = N''' +@RestoreFileName + ''' WITH FILE = 1'


INSERT INTO @Files EXEC(@Exec)


DECLARE @HeaderInfo 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) NULL,
            RecoveryModel  nvarchar(60) ,
            DifferentialBaseLSN  numeric(25,0) NULL,
            DifferentialBaseGUID  uniqueidentifier ,
            BackupTypeDescription  nvarchar(60) ,
            BackupSetGUID  uniqueidentifier NULL,
            CompressedBackupSize  numeric(20,0),
		  containment tinyint
      )



INSERT INTO @HeaderInfo EXEC('RESTORE HEADERONLY FROM DISK = N''' +@RestoreFileName + ''' WITH NOUNLOAD')

SELECT * FROM @HeaderInfo

select @FileID =  max(Position) from @HeaderInfo where BackupType = 1

SET @Exec = 'ALTER DATABASE [' + @DB + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE'
EXEC(@Exec)

SET @Exec = 
'RESTORE DATABASE ['+@Db + '] FROM  DISK = N''' +@RestoreFileName +''' WITH  FILE = '+LTrim(Str(@FileID))+', '

SELECT @Exec = @Exec + ' MOVE '''  + LogicalName + ''' TO N''D:\DBData\' + @DB + '_site.mdf'',' FROM @Files WHERE PhysicalName LIKE '%.mdf'
SELECT @Exec = @Exec + ' MOVE '''  + LogicalName + ''' TO N''D:\DBData\' + @DB + '_log.ldf'',' FROM @Files WHERE PhysicalName LIKE '%.ldf'
SELECT @Exec = @Exec + ' MOVE '''  + LogicalName + ''' TO N''D:\DBData\' + @DB + '_ft.ndl'',' FROM @Files WHERE PhysicalName LIKE '%.ndf'
SET @Exec = @Exec + ' NOUNLOAD,  REPLACE,  STATS = 5'

SELECT * FROM @Files 
SELECT * FROM @Files WHERE PhysicalName LIKE '%.ndf'
select @exec
EXEC (@Exec)
SET @Exec = 'ALTER DATABASE  [' + @DB + '] SET MULTI_USER'
EXEC(@Exec)
go
26 ноя 14, 14:38    [16908219]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить