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

Откуда: Самара
Сообщений: 64
Есть такой вот скрипт

RESTORE DATABASE [mydb2] 
FROM  DISK = N'G:\Microsoft SQL Server\Backup\mydb1\FULL\mydb1_backup_2014_05_05_000552_7055242.bak' 
WITH  FILE = 1,  MOVE N'mydb1' TO N'E:\Microsoft SQL Server\Data\mydb2.mdf', 
MOVE N'mydb1_log' TO N'D:\Microsoft SQL Server\Log\mydb2_log.LDF', NOUNLOAD, REPLACE, STATS = 10
GO


Затык в следующем. Бекапы mydb1 делаются каждый день. Каждый день mydb2 должна быть в актуальном состоянии.
Как надо поправить скрипт, чтобы не указывать явно имя файла (mydb1_backup_2014_05_05_000552_7055242.bak) каждый раз вручную?
5 май 14, 01:22    [15971246]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Как-то надо поправить. А вы сами думаете, как его надо поправить?
5 май 14, 01:55    [15971314]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
M1chA77
Member

Откуда: Самара
Сообщений: 64
Гавриленко Сергей Алексеевич,

Пробую заменить путь на mydb1_backup_DATE_TIME.bak но не получается :(
подскажите пожалуйста как правильно реализовать данную фишку.
5 май 14, 02:03    [15971321]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
mag2000
Member

Откуда:
Сообщений: 182
M1chA77,
"Правильность" зависит от ваших требований к задаче.
Как варианты:
1. Делать бэкап всегда с одним и тем же именем файла (предварительно удаляя старый)
2. Копировать последний бэкап в с переименованием файла.
3. Написать скрипт, анализирующий каталог с бэкапами и, выбирающий из него последний по дате и времени (выполнить анализ имени файла)
5 май 14, 05:55    [15971421]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
M1chA77
Member

Откуда: Самара
Сообщений: 64
mag2000,

Во, пункт 3 мне и нужен )))
5 май 14, 06:58    [15971447]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
mag2000
Member

Откуда:
Сообщений: 182
M1chA77,
На скорую руку, как вариант для редактирования.
Имя файла не анализируем, а просто берем последний созданный:
DECLARE @DirInput nvarchar(400)
	, @DirOutput nvarchar(400)
	, @cmd_str nvarchar(500)
	, @FName nvarchar(250)


SET @DirInput = N'F:\Backup\';
SET @DirOutput = N'\\ИМЯ_СЕРВЕРА\BACKUP\';

IF OBJECT_ID(N'tempdb..#BackupFiles') IS NOT NULL
		DROP TABLE #BackupFiles

	CREATE TABLE #BackupFiles 
	(
		ID INT NOT NULL IDENTITY (1,1),
		FileName NVARCHAR(400),
		depth INT NOT NULL, 
		is_file INT NOT NULL,
		PRIMARY KEY (ID)
	)
	
	INSERT #BackupFiles ([FileName], [depth], is_file)
	exec master.dbo.xp_dirtree 
			@DirInput, 
			1, -- отображать текущий уровень
			1 -- отображать файлы


	-- удаляем все "не файлы"
	DELETE FROM #BackupFiles 
	WHERE 
		--FileName IS NULL 
		NOT (is_file = 1)
		OR NOT FileName LIKE '%.bak'

SELECT @FName = FileName FROM #BackupFiles
  WHERE ID = 
     (SELECT MAX(ID) FROM #BackupFiles
     );

-- Предварительная очистка папки от BAK-файлов
SET @cmd_str = N'DEL /Q ' + @DirOutput + '\*.BAK'
exec master..xp_cmdshell @cmd_str

-- Копируем найденный файл по другому пути

SET @cmd_str = N'COPY ' + @DirInput + '\' + @FName + ' ' + @DirOutput + '\' + @FName;
exec master..xp_cmdshell @cmd_str
5 май 14, 07:16    [15971457]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
M1chA77
Member

Откуда: Самара
Сообщений: 64
mag2000,

SET @DirInput = N'F:\Backup\';
Здесь должны лежать БД (mdf и ldf)?
5 май 14, 07:23    [15971463]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
mag2000
Member

Откуда:
Сообщений: 182
M1chA77,
автор
SET @DirInput = N'F:\Backup\';
Здесь должны лежать БД (mdf и ldf)?

Нет,
в переменных @DirInput и @DirOutput предполагаются файлы бэкапов базы данных (BAK-файлы).
Предлагаемый пример скрипта можно выполнять как отдельный шаг задания (агентом MS SQL) уже после создания бэкапа базы.
5 май 14, 07:51    [15971503]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Имя файла последнего полного бекапа:
select top (1)
 bs.name
from
 msdb..backupset bs
where
 bs.type = 'D' and
 bs.database_name = 'Моя БД'
order by
 bs.backup_start_date desc;
5 май 14, 08:40    [15971555]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
mag2000
Member

Откуда:
Сообщений: 182
invm,
Да, так даже более "правильно" будет.
Не нужно возиться с master.dbo.xp_dirtree
(добавил имя физического файла):

select top (1)
 bs.name
 , bf.physical_device_name
from
 msdb..backupset bs
 join msdb.dbo.backupmediafamily bf on bs.media_set_id = bf.media_set_id
where
 bs.type = 'D' and
 bs.database_name = ''Моя БД''
order by
 bs.backup_start_date desc;
5 май 14, 09:00    [15971590]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
mag2000
Member

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

Только вместо ''Моя БД'' нужно 'Моя БД'.
Поторопился
5 май 14, 09:05    [15971606]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
M1chA77
Member

Откуда: Самара
Сообщений: 64
mag2000,

Так, уточняю, правильно ли я понял.
У меня есть одна основная база. Есть клон основной базы но с другим именем.
Мне нужно, чтобы резервная копия основной БД, назовем ее bd1 разворачивалась в клон,назовем ее bd2.
Файл базы (mdf) лежит на диске E, а файл журнала транзакций лежит на диске D.

Для того, чтобы мне развернуть резервную копию bd1 в bd2 мне надо создать "Задание",
где на вкладке "Шаги" создаю шаг и в поле "База данных" выбираю bd2.

В поле "Команда" я ввожу:

select top (1)
 bs.name
 , bf.physical_device_name
from
 msdb..backupset bs
 join msdb.dbo.backupmediafamily bf on bs.media_set_id = bf.media_set_id
where
 bs.type = 'D' and
 bs.database_name = 'db2'
order by
 bs.backup_start_date desc;


Все правильно?
Единственное что я не пойму, откуда скрипт знает где лежат бекапы...
5 май 14, 09:26    [15971674]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
mag2000
Member

Откуда:
Сообщений: 182
M1chA77,
1. Приводимые мной и invm скрипты позволяют ТОЛЬКО определить нужный вам файл бэкапа базы, который вы уже можете использовать для восстановления ДРУГОЙ базы данных.
2. Бэкап базы делается комадой BACKUP.
Восстановление другой базы делается командой RESTORE (вы приводили свой пример этой команды).
3. Процесс от команды BACKUP --> скрипты из пункта 1 --> до комады RESTORE
вы можете оформить как одним скриптом и выполнять в шаге задания MS SQL Agent,
так и оформить разными заданиями и выполнять в разное время.
5 май 14, 09:36    [15971721]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
M1chA77
Member

Откуда: Самара
Сообщений: 64
mag2000,

Спасибо огромное за скриптик.
Попробую соединить свой и ваш в одно целое.
Только начал осваивать T-SQL поэтому еще слабо представляю как и что работает.
5 май 14, 10:19    [15971902]     Ответить | Цитировать Сообщить модератору
 Re: Разворачивание из копии одной базы в другую  [new]
M1chA77
Member

Откуда: Самара
Сообщений: 64
invm, mag2000

Спасибо огромное за скриптик.
Попробую соединить свой и ваш в одно целое.
Только начал осваивать T-SQL поэтому еще слабо представляю как и что работает.
5 май 14, 10:21    [15971916]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить