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

Откуда: Москва
Сообщений: 295
ДД, уважаемые коллеги.

К сожалению, поиск не помог. Больше искать нет времени - загружен по полной, поэтому обращаюсь за советом.


Задача такая: есть файл bdk.bak, в который забэкаплено 50 баз.
Руками восстанавливать каждую желания нет, к тому же там никаких спец условий нет на восстановление, только файлы данных и лога в новое место положить.

Всё, что нашел - restore headeronly - чтобы получить список баз. Я бы прошелся по нему курсором, но он возвращает около 20 полей, а описывать 20 переменных, при том, что нужна одна - влом.

Но я не знаю, как использовать получившийся резалтсет в запросе.

Запрос вида
SELECT DatabaseName FROM EXEC ('RESTORE HEADEROLY FROM DISK = N''E:\Backups\bdk.bak''')
не исполняется.
Msg 156, Level 15, State 1, Line 1
Неправильный синтаксис около ключевого слова "EXEC".
INSERT INTO #tmp EXEC ('RESTORE HEADEROLY FROM DISK = N''E:\Backups\bdk.bak''')
также не работает - видимо, напутал в синтаксисе.
Msg 208, Level 16, State 0, Line 1
Недопустимое имя объекта "#tmp".


В связи с этим 2 вопроса:
1. как можно пользоваться resultset от exec @query
2. посоветуйте, как решить проблему.

Посдкажите пожалуйста!
в SQL я intermediate, поэтому просьба по 1 вопросу расширенные комментарии. Или где и что читать.

Спасибо!
9 мар 12, 14:09    [12217689]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Glory
Member

Откуда:
Сообщений: 104751
Eugene_p1
Но я не знаю, как использовать получившийся резалтсет в запросе.

Никак

Eugene_p1
также не работает - видимо, напутал в синтаксисе.
Msg 208, Level 16, State 0, Line 1
Недопустимое имя объекта "#tmp".

И кто создаст таблицу #tmp с нужной структурой ?
9 мар 12, 14:24    [12217712]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Glory
Eugene_p1
Но я не знаю, как использовать получившийся резалтсет в запросе.

Никак

Eugene_p1
также не работает - видимо, напутал в синтаксисе.
Msg 208, Level 16, State 0, Line 1
Недопустимое имя объекта "#tmp".

И кто создаст таблицу #tmp с нужной структурой ?

В этом и проблема: создать таблицу с нужной структурой = описать около 20 полей.

Укорочу вопрос: как выбрать только поле DatabaseName и обработать (вставить в таблицу или загнать в переменную в курсоре)?
11 мар 12, 10:26    [12223899]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Glory
Member

Откуда:
Сообщений: 104751
Eugene_p1
В этом и проблема: создать таблицу с нужной структурой = описать около 20 полей.

А в команде RESTORE нужно написать с десяток ключевых слов.
И в других командах не меньше.
И что теперь ?
11 мар 12, 10:33    [12223926]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Eugene_p1
В этом и проблема: создать таблицу с нужной структурой = описать около 20 полей.
За два дня вы так с этими 20ю полями и не справились?
11 мар 12, 10:53    [12224057]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Eugene_p1
В этом и проблема: создать таблицу с нужной структурой = описать около 20 полей.
Так что вас смущает?

Неоптимальность или трудозатраты?

Первое смешно для такой операции, как восстановение базы из бакапа, второе тоже смешно, учитывая, что это намного менее трудоёмко, чем написать пост с вопросом, как этого избежать.
11 мар 12, 10:53    [12224064]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
alexeyvg
Eugene_p1
В этом и проблема: создать таблицу с нужной структурой = описать около 20 полей.
Так что вас смущает?

Неоптимальность или трудозатраты?


И то, и другое.

Но самое важное - не первый раз сталкиваюсь с ситуацией, когда нужно использовать результат
exec @query


Основной вопрос именно в этом.

Потом, привык всё делать по возможности красиво, а не решать задачу в лоб (~~"В этом году посеем 80 га - пусть подавится!").


Первое смешно для такой операции, как восстановение базы из бакапа, второе тоже смешно, учитывая, что это намного менее трудоёмко, чем написать пост с вопросом, как этого избежать.

А завтра появится 100 полей. Тоже описывать?
А нужно будет использовать в 5 местах - тоже тупо набивать?


Кто- нибудь может сказать - есть решение вопроса? Если есть - на какую тему гуглить? Если напишете готовое - вообще спасибо большое!
11 мар 12, 12:38    [12224742]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Eugene_p1
Кто- нибудь может сказать - есть решение вопроса? Если есть - на какую тему гуглить? Если напишете готовое - вообще спасибо большое!
Как бы вам этого не хотелось, но полениться не получится. Будет 100 полей - значит 100 полей придется создавать.
11 мар 12, 12:44    [12224779]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Eugene_p1,

можно создать loopback linked server и

SELECT backupname
FROM OPENQUERY([mylink], 'set fmtonly off; exec (''restore headeronly from disk = ''''E:\Backups\bdk.bak'''''')')


но скопировать из статьи про restore headeronly столбцы с именами и типами было быстрее и проще
11 мар 12, 13:02    [12224884]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Гавриленко Сергей Алексеевич
Eugene_p1
Кто- нибудь может сказать - есть решение вопроса? Если есть - на какую тему гуглить? Если напишете готовое - вообще спасибо большое!
Как бы вам этого не хотелось, но полениться не получится. Будет 100 полей - значит 100 полей придется создавать.

Ясно.
Из того, что читаю, понимаю, что такой возможности нет, есть только workarounds

Верно?
11 мар 12, 13:06    [12224913]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Eugene_p1
Но самое важное - не первый раз сталкиваюсь с ситуацией, когда нужно использовать результат
exec @query

Основной вопрос именно в этом.
Ну так бы и спрашивали сразу :-)

Нет, такой возможности нет. По большому счёту даже с описаними полей нет (только с очень большими ограничениями).
11 мар 12, 13:58    [12225247]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Теперь другая засада :)

DECLARE @BkpFileName as varchar(200)
DECLARE @Query as varchar(max)
DECLARE @DBName as nvarchar(128)

SET 	@BkpFileName = 'F:\Backup\bdk.bak'

CREATE TABLE #TempRestoreTable (
[... перечисление полей погрызено для сокращения...]
)

		SET @Query = N'RESTORE HEADERONLY FROM DISK = ''' + RTRIM(@BkpFileName) + N''''
		
		INSERT #TempRestoreTable (
			BackupName, BackupDescription, BackupType, ExpirationDate, Compressed, Position,
			DeviceType, UserName, ServerName, DatabaseName, DatabaseVersion, DatabaseCreationDate,
			BackupSize, FirstLSN, LastLSN, CheckpointLSN, DatabaseBackupLSN, BackupStartDate,
			BackupFinishDate, SortOrder, CodePage, UnicodeLocaleId, UnicodeComparisonStyle,
			CompatibilityLevel, SoftwareVendorId, SoftwareVersionMajor, SoftwareVersionMinor,
			SoftwareVersionBuild, MachineName, Flags, BindingID, RecoveryForkID, Collation,
			FamilyGUID, HasBulkLoggedData, IsSnapshot, IsReadOnly, IsSingleUser, HasBackupChecksums,
			IsDamaged, BeginsLogChain, HasIncompleteMetaData, IsForceOffline, IsCopyOnly,
			FirstRecoveryForkID, ForkPointLSN, RecoveryModel, DifferentialBaseLSN,
			DifferentialBaseGUID, BackupTypeDescription, BackupSetGUID, CompressedBackupSize)		
		EXEC (@Query)
		
DECLARE DBases CURSOR 	FOR
		SELECT DatabaseName FROM #TempRestoreTable
		
OPEN DBases
FETCH NEXT FROM DBases INTO @DBName
WHILE @@FETCH_STATUS = 0 
BEGIN
	SET @Query='RESTORE DATABASE '+@DBName+' FROM  DISK = N'''+RTRIM(@BkpFileName)+''' WITH  FILE = 1,  
                           MOVE N''taxesem$Data'' TO N''D:\users\tax_rab\'+@DBName+'.mdf'',  
                           MOVE N''taxesemlog$'' TO N''D:\users\tax_rab\'+@DBName+'.ldf'',  NOUNLOAD,  STATS = 10'
	PRINT @Query
	EXECUTE @Query
	
	FETCH NEXT FROM DBases INTO @DBName
END

CLOSE DBases
DEALLOCATE DBases

DROP TABLE #TempRestoreTable


PRINT пишет строку целиком:
RESTORE DATABASE BDK50745012000010010000003996 FROM  DISK = N'F:\Backup\bdk.bak' WITH  FILE = 1,  
MOVE N'taxesem$Data' TO N'D:\users\tax_rab\BDK50745012000010010000003996.mdf',  
MOVE N'taxesemlog$' TO N'D:\users\tax_rab\BDK50745012000010010000003996.ldf',  
NOUNLOAD,  STATS = 10


А вот при исполнении появляется ошибка:
Msg 7202, Level 11, State 2, Line 86
Не удалось найти сервер " RESTORE DATABASE BDK50745012000010010000003996 FROM DISK = N'F:\Backup\bdk" в таблице sys.servers. Убедитесь, что имя сервера указано правильно. При необходимости выполните хранимую процедуру sp_addlinkedserver, чтобы добавить сервер в таблицу sys.servers.

При этом, если скопировать вывод принта в SSMS, то запрос выполняется нормально.
Смущает пробел перед кавычками и отрезание по точке. Где скрывается косяк?
11 мар 12, 17:03    [12226667]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
EXECUTE ( @Query )
11 мар 12, 17:06    [12226688]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Гавриленко Сергей Алексеевич
EXECUTE ( @Query )

Не помогло :(
11 мар 12, 17:38    [12226950]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Eugene_p1
Не помогло :(
Это новый текст ошибки?
11 мар 12, 17:39    [12226961]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Eugene_p1
Гавриленко Сергей Алексеевич
EXECUTE ( @Query )


Не помогло :(
Не может быть.

Как минимум, должно другое сообщение об ошибке появиться.
11 мар 12, 17:43    [12226995]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Помогло заключение переменных в RTRIM()
	SET @Query='RESTORE DATABASE '+RTRIM(@DBName)+' FROM  DISK = N'''+RTRIM(@BkpFileName)+''' WITH  FILE = 1,  
MOVE N''taxesem$Data'' TO N''D:\users\tax_rab\'+RTRIM(@DBName)+'.mdf'',  
MOVE N''taxesemlog$'' TO N''D:\users\tax_rab\'+RTRIM(@DBName)+'.ldf'',  NOUNLOAD,  STATS = 10'


Спасибо всем участникам.

Если кому-то понадобится, вот скрипт для разворачивания баз из одного файла бэкапа:







DECLARE @BkpFileName as nvarchar(max)
DECLARE @Query as varchar(max)
DECLARE @DBName as nvarchar(128)

SET 	@BkpFileName = 'F:\Backup\bdk.bak'

CREATE TABLE #TempRestoreTable (
		BackupName nvarchar(128),
		BackupDescription nvarchar(255),
		BackupType smallint,
		ExpirationDate datetime,
		Compressed tinyint,
		Position smallint,
		DeviceType tinyint, -- BYTE(1)
		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 -- uint64
)

		SET @Query = N'RESTORE HEADERONLY FROM DISK = ''' + RTRIM(@BkpFileName) + N''''
		
		INSERT #TempRestoreTable (
			BackupName, BackupDescription, BackupType, ExpirationDate, Compressed, Position,
			DeviceType, UserName, ServerName, DatabaseName, DatabaseVersion, DatabaseCreationDate,
			BackupSize, FirstLSN, LastLSN, CheckpointLSN, DatabaseBackupLSN, BackupStartDate,
			BackupFinishDate, SortOrder, CodePage, UnicodeLocaleId, UnicodeComparisonStyle,
			CompatibilityLevel, SoftwareVendorId, SoftwareVersionMajor, SoftwareVersionMinor,
			SoftwareVersionBuild, MachineName, Flags, BindingID, RecoveryForkID, Collation,
			FamilyGUID, HasBulkLoggedData, IsSnapshot, IsReadOnly, IsSingleUser, HasBackupChecksums,
			IsDamaged, BeginsLogChain, HasIncompleteMetaData, IsForceOffline, IsCopyOnly,
			FirstRecoveryForkID, ForkPointLSN, RecoveryModel, DifferentialBaseLSN,
			DifferentialBaseGUID, BackupTypeDescription, BackupSetGUID, CompressedBackupSize)		
		EXECUTE ( @Query )
		
DECLARE DBases CURSOR 	FOR
		SELECT DatabaseName FROM #TempRestoreTable
		
OPEN DBases
FETCH NEXT FROM DBases INTO @DBName
WHILE @@FETCH_STATUS = 0 
BEGIN
	SET @Query='RESTORE DATABASE '+RTRIM(@DBName)+' FROM  DISK = N'''+RTRIM(@BkpFileName)+''' WITH  FILE = 1,  
				MOVE N''taxesem$Data'' TO N''D:\users\tax_rab\'+RTRIM(@DBName)+'.mdf'',  
				MOVE N''taxesemlog$'' TO N''D:\users\tax_rab\'+RTRIM(@DBName)+'.ldf'',  
				NOUNLOAD,  STATS = 10'
	PRINT @Query
	EXECUTE ( @Query )
	
	FETCH NEXT FROM DBases INTO @DBName
END

CLOSE DBases
DEALLOCATE DBases

DROP TABLE #TempRestoreTable
11 мар 12, 17:44    [12227000]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Гавриленко Сергей Алексеевич
Eugene_p1
Не помогло :(
Это новый текст ошибки?

:)
11 мар 12, 17:44    [12227007]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление нескольких баз из одного файла бэкапа  [new]
Eugene_p1
Member

Откуда: Москва
Сообщений: 295
Ан нет, вы правы, меняет дело именно заключение в скобки.

Странно, вроде пробовал оба варианта... посыпаю голову пеплом.
11 мар 12, 17:49    [12227049]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить