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

создал джоб на резервном сервере с примерно такими шагами:
1. del d:\backups\*.bak -- удаляем старые бекапы. Не беспокойтесь, все копии лежат в хранилищах.
2. copy \\work\backups\*.bak d:\backups\ -- копируем все бекапы с рабочего на резервный сервер
3. dir d:\backups\*.bak /B > d:\backups\DBList.txt -- сохраняем список бекапов в текстовый файл
4. -- копирую bulkinsert'ом список бекапов (соот-но и список баз) во временную таблицу базы tempdb
5. -- курсором перебираю значения из таблицы, восстанавливая базы из бекапов

вот проблема на 5-м шаге. Делаю примерно так:
RESTORE DATABASE <DBName>
   FROM disk = 'd:\backups\<DBName>_db_201505280100.bak'
   WITH RECOVERY, 
      MOVE '<DBName>_Data' TO 'd:\Data\<DBName>.mdf', -- проблема тут
      MOVE '<DBName>_Log' TO 'd:\Data\<DBName>.ldf' -- ... и тут

если в MOVE указать произвольные значения логических имен (LogicalName), то сервер начинает ругаться:
автор
Server: Msg 3234, Level 16, State 2, Line 1
Logical file '<DBName>_Data' is not part of database '<DBName>'. Use RESTORE FILELISTONLY to list the logical file names.
Server: Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

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

т.е. если руками все делать, то понятно: запускаем RESTORE FILELISTONLY FROM DISK = '<путь к бекапу>', смотрим в табличке на поле LogicalName и подставляем значения в RESTORE DATABASE.
а в скрипте это как сделать?

ПС. SQL2000 на обоих серверах
28 май 15, 23:16    [17704461]     Ответить | Цитировать Сообщить модератору
 Re: восстановление базы с изменением путей к данным и логам  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
create table #db_files
(
    [LogicalName] nvarchar(128),
    [PhysicalName] nvarchar(260),
    [Type] char(1),
    [FileGroupName] nvarchar(128),
    [Size] numeric(20,0),
    [MaxSize] numeric(20,0),
    [FileID] bigint,
    [CreateLSN] numeric(25,0),
    [DropLSN] numeric(25,0) NULL,
    [UniqueID] uniqueidentifier,
    [ReadOnlyLSN] numeric(25,0) NULL,
    [ReadWriteLSN] numeric(25,0) NULL,
    [BackupSizeInBytes] bigint,
    [SourceBlockSize] int,
    [FileGroupID] int,
    [LogGroupGUID] uniqueidentifier NULL,
    [DifferentialBaseLSN] numeric(25,0) NULL,
    [DifferentialBaseGUID] uniqueidentifier,
    [IsReadOnly] bit,
    [IsPresent] bit,
    [TDEThumbprint] varbinary(32)
);
 
insert into #db_files
exec (N'restore filelistonly from disk = ''' + @full_bkp_file + '''');
 
declare
    @restore_move nvarchar(max) = 
    (
        select
            N', ' + N'move N''' + LogicalName + N''' to N''' + @restore_path + reverse(substring(reverse(PhysicalName), 1, charindex(N'\', reverse(PhysicalName)) - 1)) + N''''
        from 
            #db_files
        for xml path('')
    );
 
drop table #db_files;
 
declare
    @restore_from_full_backup_cmd nvarchar(max) =
        N'restore database ' + quotename(@restore_db) + N' from disk = N''' + @full_bkp_file + N''' ' +
            N'with norecovery, stats = 5' + @restore_move;
 
print @restore_from_full_backup_cmd;
28 май 15, 23:25    [17704490]     Ответить | Цитировать Сообщить модератору
 Re: восстановление базы с изменением путей к данным и логам  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+ выдрал из контекста. но например так.
28 май 15, 23:25    [17704491]     Ответить | Цитировать Сообщить модератору
 Re: восстановление базы с изменением путей к данным и логам  [new]
нуб987
Guest
churupaha
insert into #db_files
exec (N'restore filelistonly from disk = ''' + @full_bkp_file + '''');

спасибо :)

у меня правда ругнулся, т.к. нет столько полей:
автор
Server: Msg 213, Level 16, State 7, Line 1
Insert Error: Column name or number of supplied values does not match table definition.
Server: Msg 3013, Level 16, State 1, Line 1
RESTORE FILELIST is terminating abnormally.


написал так:
insert into #db_files
(LogicalName, PhysicalName, Type, FileGroupName, Size, MaxSize)
exec (N'restore filelistonly from disk = ''d:\backups\<DBName>_db_201505280100.bak''');
28 май 15, 23:34    [17704516]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить