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

Откуда: Днепропетровск
Сообщений: 24
Есть ли простой путь?

Создал архив
BACKUP DATABASE MyDB1 TO DISK ='C:\MyDB1.BAK'

Хочу восстановить ее как MyDB1Test которая уже существует
RESTORE DATABASE MyDB1Test FROM DISK = 'C:\MyDB1.BAK'
The backup set holds a backup of a database other than the existing

Если так
RESTORE DATABASE MyDB1Test FROM DISK = 'C:\MyDB1.BAK' WITH REPLACE
'*.mdf' cannot be overwritten. It is being used by database 'MyDB1'

Про MOVE знаю, но каждый раз писать что во что писать надоело
Подскажите команду чтобы просто заменить бд бэкапом другой бд.
18 июл 12, 16:53    [12884597]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37056
Alexandr Sulimov
Подскажите команду чтобы просто заменить бд бэкапом другой бд.
Т.е. надо было еще одну команду типа restore сделать что ли?
18 июл 12, 16:56    [12884620]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Alexandr Sulimov
Member

Откуда: Днепропетровск
Сообщений: 24
Гавриленко Сергей Алексеевич
Alexandr Sulimov
Подскажите команду чтобы просто заменить бд бэкапом другой бд.
Т.е. надо было еще одну команду типа restore сделать что ли?


Не понял вопроса.
Меня бы устроило если
RESTORE DATABASE MyDB1Test FROM DISK = 'C:\MyDB1.BAK' WITH REPLACE
Заменяло и файлы базы MyDB1Test
А она пытается восстановить как базу MyDB1Test но в файлы MyDB1
18 июл 12, 16:58    [12884635]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Alexandr Sulimov
Про MOVE знаю, но каждый раз писать что во что писать надоело
Подскажите команду чтобы просто заменить бд бэкапом другой бд.


попробуйте удалять затираемую базу перед поднятием бэкапа
18 июл 12, 16:59    [12884648]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37056
Alexandr Sulimov
Гавриленко Сергей Алексеевич
пропущено...
Т.е. надо было еще одну команду типа restore сделать что ли?


Не понял вопроса.
Меня бы устроило если
RESTORE DATABASE MyDB1Test FROM DISK = 'C:\MyDB1.BAK' WITH REPLACE
Заменяло и файлы базы MyDB1Test
А она пытается восстановить как базу MyDB1Test но в файлы MyDB1
Т.е. чтобы сервер сам придумывал имена файлов и пути, в которые надо восстановить базу?
18 июл 12, 17:03    [12884672]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37056
И да. Если скрипт на рестор сохранить в файл, то его не придется писать "каждый раз".
18 июл 12, 17:04    [12884681]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Shakill
попробуйте удалять затираемую базу перед поднятием бэкапа
не пробуйте, ерунду сказал :)
18 июл 12, 17:07    [12884706]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Alexandr Sulimov
Member

Откуда: Днепропетровск
Сообщений: 24
Гавриленко Сергей Алексеевич
Т.е. чтобы сервер сам придумывал имена файлов и пути, в которые надо восстановить базу?

Достаточно взять имена файлов существующей БД MyDB1Test
18 июл 12, 17:11    [12884735]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
Alexandr Sulimov,
Использую такую процедуру для рестора баз.
Может сгодится.
Используется в таких вариантах
sp_RestoreManual 'Имя Базы' -- рестор с текущей базы на 'Имя Базы' , при условии что это не она же
sp_RestoreManual 'Имя Базы','Пусть к бекапу' -- рестор с указаного файла бекапа
sp_RestoreManual 'Имя Базы1',null,'Имя Базы2' -- рестор с 'Имя Базы2' берется последний сделаный бекап и ретсорит на 'Имя Базы1'

Единственное что это то что работаем с моделью Full и диф бекапы тут не обыгрываются.
+

create procedure [dbo].[sp_RestoreManual] @DestDBName sysname,
										 @RestorePath varchar(256)= null,
										 @SourceDBName sysname = null
as						   
set nocount on;
declare @BackupFullPath varchar(256),
		@SQL nvarchar(max)

	
if @RestorePath='' set @RestorePath=null		
if @SourceDBName='' set @SourceDBName=null
if @RestorePath is null and @SourceDBName is null 
begin
	if @DestDBName=DB_NAME()
	begin
		raiserror('Incorrect parameters. Source and destination DB must be different bases', 16, 1)
		return
	end	
	else 
		set @SourceDBName=DB_NAME()
end
	
if @RestorePath is not null and @SourceDBName is not null
begin
	raiserror('Incorrect parameters. Path to backup file and source DB can be declared one time', 16, 1)
	return
end
if DB_ID(@DestDBName)<=4
begin
	raiserror('You can''t restore to system DB', 16, 1)
	return
end
set @DestDBName=REPLACE(REPLACE(@DestDBName,'[',''),']','')
set @SourceDBName=REPLACE(REPLACE(@SourceDBName,'[',''),']','')

if @RestorePath is not null
begin
	declare @Error int
	exec xp_fileexist @RestorePath, @Error output
	IF @ERROR<>1
	begin
		raiserror('File "%s" doen''t exists', 16, 1,@RestorePath)
		return
	end
	set @BackupFullPath = @RestorePath
	
	if OBJECT_ID('tempdb..#tmpHeaderOnly') is not null drop table #tmpHeaderOnly
	create table #tmpHeaderOnly(
	Code1 varchar(100),Code2 varchar(100),Code3 varchar(100),Code4 varchar(100),Code5 varchar(100),
	Code6 varchar(100),Code7 varchar(100),Code8 varchar(100),Code9 varchar(100),Code10 varchar(100),
	Code11 varchar(100),Code12 varchar(100),Code13 varchar(100),Code14 varchar(100),Code15 varchar(100),
	Code16 varchar(100),Code17 varchar(100),Code18 varchar(100),Code19 varchar(100),Code20 varchar(100),
	Code21 varchar(100),Code22 varchar(100),Code23 varchar(100),Code24 varchar(100),Code25 varchar(100),
	Code26 varchar(100),Code27 varchar(100),Code28 varchar(100),Code29 varchar(100),Code30 varchar(100),
	Code31 varchar(100),Code32 varchar(100),Code33 varchar(100),Code34 varchar(100),Code35 varchar(100),
	Code36 varchar(100),Code37 varchar(100),Code38 varchar(100),Code39 varchar(100),Code40 varchar(100),
	Code41 varchar(100),Code42 varchar(100),Code43 varchar(100),Code44 varchar(100),Code45 varchar(100),
	Code46 varchar(100),Code47 varchar(100),Code48 varchar(100),Code49 varchar(100),Code50 varchar(100),
	Code51 varchar(100),Code52 varchar(100))
	SET @SQL = 'RESTORE HEADERONLY 
				FROM DISK = N'''+@RestorePath+'''
				WITH NOUNLOAD;'
	begin try
		insert into #tmpHeaderOnly
		exec (@SQL)				
	end try
	begin catch
		SET @SQL='Error: '+cast(ERROR_NUMBER() as varchar)+'('+ERROR_MESSAGE()+')'
		raiserror('%s', 16, 1,@SQL)
		return
	end catch	
end
if @SourceDBName is not null
begin
	select @BackupFullPath=physical_device_name from (
	select a.database_name,c.physical_device_name,
	ROW_NUMBER() over(partition by a.database_name order by a.backup_finish_date desc) as rn
	from msdb.dbo.backupset a join msdb.dbo.backupmediafamily c 
		on a.media_set_id=c.media_set_id and a.database_name=@SourceDBName) bkp
	where bkp.rn=1
end
else 
	set @SourceDBName = (select code10 from #tmpHeaderOnly) -- Source DBName from SQL Backup

if OBJECT_ID('tempdb..#tmpFileListOnly') is not null drop table #tmpFileListOnly
create table #tmpFileListOnly(
Code1 varchar(100),Code2 varchar(100),Code3 varchar(100),Code4 varchar(100),Code5 varchar(100),
Code6 varchar(100),Code7 varchar(100),Code8 varchar(100),Code9 varchar(100),Code10 varchar(100),
Code11 varchar(100),Code12 varchar(100),Code13 varchar(100),Code14 varchar(100),Code15 varchar(100),
Code16 varchar(100),Code17 varchar(100),Code18 varchar(100),Code19 varchar(100),Code20 varchar(100),
Code21 varchar(100))


SET @SQL = 'RESTORE FILELISTONLY 
			FROM DISK = N'''+@BackupFullPath+'''
			WITH NOUNLOAD;'
begin try
	insert into #tmpFileListOnly
	exec (@SQL)				
end try
begin catch
	SET @SQL='Error: '+cast(ERROR_NUMBER() as varchar)+'('+ERROR_MESSAGE()+')'
	raiserror('%s', 16, 1,@SQL)
	return
end catch	
if (select COUNT(*) from master.sys.master_files where database_id=DB_ID(@DestDBName))!=(select COUNT(*) from #tmpFileListOnly)
begin
	raiserror('Source and destination DB have different files count', 16, 1)
	return
end

set @SQL = 'alter DATABASE ['+@DestDBName+'] set SINGLE_USER with ROLLBACK IMMEDIATE;'
exec (@SQL)

set @SQL = 'alter DATABASE ['+@DestDBName+'] set MULTI_USER with ROLLBACK IMMEDIATE;'
exec (@SQL)

declare @MoveList varchar(max)=''
select @MoveList += 'MOVE N'''+b.Code1+''' TO N'''+a.physical_name+''','+CHAR(13)+CHAR(10)
from master.sys.master_files a join #tmpFileListOnly b on a.file_id=b.Code7
where a.database_id=db_id(@DestDBName)

set @SQL = 
'RESTORE DATABASE ['+@DestDBName+'] FROM 
DISK = N'''+@BackupFullPath+'''
WITH  FILE = 1,
'+@MoveList+'NOUNLOAD,  REPLACE,  STATS = 10;'
exec (@SQL)

set nocount off;

18 июл 12, 17:14    [12884761]     Ответить | Цитировать Сообщить модератору
 Re: Простое восстановление бэкапа одной базы в другую  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37056
Alexandr Sulimov
Гавриленко Сергей Алексеевич
Т.е. чтобы сервер сам придумывал имена файлов и пути, в которые надо восстановить базу?

Достаточно взять имена файлов существующей БД MyDB1Test
Ага. В существующей бд, к примеру, 2 файла, а у восстанавливаемой - десять. Откуда сервер должен придумать недостающие восемь?
18 июл 12, 17:20    [12884790]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить