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

Откуда:
Сообщений: 212
Доброго времени суток! прошу совета.

sql 2012 sp3
Задача простая перенести все пользовательские базы на другой сервер с новым расположение файлов через резервные копии. Все хорошо делается через GUi, но на сервере у меня их 42, как это сделать в минимальные сроки?

Как сгененировать скрипты на восстановление? или другие варианты?
17 ноя 17, 07:45    [20962181]     Ответить | Цитировать Сообщить модератору
 Re: Перенос баз на другой сервер.  [new]
Кусочек
Guest
Открываете окно создания бекапа в студии, задаете опции, сохраняете в виде скрипта, копируете и редактируете 41 раз.

Повторить аналогично для восстановления баз.

42 * 10 секунд сделать два раза ~ 15 минут работы + все действия задокументированы для потомков:)
17 ноя 17, 07:55    [20962188]     Ответить | Цитировать Сообщить модератору
 Re: Перенос баз на другой сервер.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
alHaos
Как сгененировать скрипты на восстановление? или другие варианты?
Такой функциональности в SSMS нет, но вы можете написать скрипт, который по метаданным базы (или, как вариант, по метаданным файлов бакапов) генерит скрипты восстановления бакапов, а потом в этих скриптах поправить пути к файлам.
Наверняка такой скрипт легко найти в инете.
А скрипт создания бакапов совсем простой, что там, цикл по базам и формирование команды backup (впрочем, создать бакапы всех баз можно просто в плане обслуживания)
17 ноя 17, 08:54    [20962261]     Ответить | Цитировать Сообщить модератору
 Re: Перенос баз на другой сервер.  [new]
alHaos
Member

Откуда:
Сообщений: 212
Дело ясное, что дело тёмное.

Смирился начал писать скрипты.
С бекапом действительно все просто...
Я конечно тот еще мышевозило, вот так у меня получилось....

DECLARE @dbid int,
		@dbname varchar(1000),
		@physical_name varchar(1000),
		@file_name varchar(1000)

DECLARE c CURSOR LOCAL FOR
   select dbid, name from sys.sysdatabases where dbid > 4

OPEN c
FETCH NEXT FROM c 
INTO @dbid, @dbname

WHILE @@FETCH_STATUS=0
BEGIN
    PRINT 'RESTORE DATABASE [' + @dbname + ']'
	PRINT 'FROM  DISK = N''D:\tmp\' + @dbname + '.bak'' WITH  FILE = 1,'

			DECLARE c2 CURSOR LOCAL FOR
				select physical_name, name from sys.master_files where database_id = @dbid and type = 0

			OPEN c2
			FETCH NEXT FROM c2
			INTO @physical_name, @file_name

			WHILE @@FETCH_STATUS=0
			BEGIN
				PRINT '     MOVE N'''+@file_name+''' TO N''' +replace(@physical_name, 'C:\DATABASE', 'D:\dbfile')+ ''','

				FETCH NEXT FROM c2
				  INTO @physical_name, @file_name
			END
			CLOSE c2
			DEALLOCATE c2

			DECLARE c3 CURSOR LOCAL FOR
				select physical_name, name from sys.master_files where database_id = @dbid and type = 1

			OPEN c3
			FETCH NEXT FROM c3
			INTO @physical_name, @file_name

			WHILE @@FETCH_STATUS=0
			BEGIN
				PRINT '     MOVE N'''+@file_name+''' TO N''' +replace(@physical_name, 'C:\DATABASE', 'F:\dblog')+ ''','

				FETCH NEXT FROM c3
				  INTO @physical_name, @file_name
			END
			CLOSE c3
			DEALLOCATE c3

		PRINT 'NOUNLOAD,  STATS = 5'
    FETCH NEXT FROM c 
      INTO @dbid, @dbname
END
CLOSE c
DEALLOCATE c
17 ноя 17, 09:33    [20962354]     Ответить | Цитировать Сообщить модератору
 Re: Перенос баз на другой сервер.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
alHaos
Я конечно тот еще мышевозило, вот так у меня получилось....
Ну вот, отлично!

Можно собственно написать и как простой селект:
select 'RESTORE DATABASE [' + name + '] 
	FROM  DISK = N''D:\tmp\' + name + '.bak'' WITH  FILE = 1, ' as statement, dbid, 0 as n
from sys.sysdatabases where dbid > 4
union all
select '	MOVE N'''+name+''' TO N''' +replace(physical_name, 'C:\DATABASE', 'D:\dbfile')+ ''',', database_id, 1 as n
from sys.master_files where database_id > 4 and type = 0
union all
select '	MOVE N'''+name+''' TO N''' +replace(physical_name, 'C:\DATABASE', 'F:\dblog')+ ''',', database_id, 2 as n
from sys.master_files where database_id > 4 and type = 1
union all
select '	NOUNLOAD,  STATS = 5', dbid, 3 as n
from sys.sysdatabases where dbid > 4
order by dbid, n, statement
17 ноя 17, 10:19    [20962546]     Ответить | Цитировать Сообщить модератору
 Re: Перенос баз на другой сервер.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
alexeyvg
alHaos
Я конечно тот еще мышевозило, вот так у меня получилось....
Ну вот, отлично!

Можно собственно написать и как простой селект:
ну, только вспомогательные поля не надо выводить, что бы потом можно было вывести всё как текст (или выполнить EXEC).
Но это необязательно, можно ведь скопировать одну колонку.
select statement
from (
	select 'RESTORE DATABASE [' + name + '] 
		FROM  DISK = N''D:\tmp\' + name + '.bak'' WITH  FILE = 1, ' as statement, dbid, 0 as n
	from sys.sysdatabases where dbid > 4
	union all
	select '	MOVE N'''+name+''' TO N''' +replace(physical_name, 'C:\DATABASE', 'D:\dbfile')+ ''',', database_id, 1 as n
	from sys.master_files where database_id > 4 and type = 0
	union all
	select '	MOVE N'''+name+''' TO N''' +replace(physical_name, 'C:\DATABASE', 'F:\dblog')+ ''',', database_id, 2 as n
	from sys.master_files where database_id > 4 and type = 1
	union all
	select '	NOUNLOAD,  STATS = 5', dbid, 3 as n
	from sys.sysdatabases where dbid > 4
) t
order by dbid, n, statement
17 ноя 17, 10:23    [20962560]     Ответить | Цитировать Сообщить модератору
 Re: Перенос баз на другой сервер.  [new]
человек_ниоткуда
Guest
И мои пять копеек... всётаки "бережёного..." сами знаете.
select statement
from (
	select 'RESTORE DATABASE ' + QUOTENAME(name) + ' 
		FROM  DISK = N' + QUOTENAME('D:\tmp\' + name + '.bak', '''') + ' WITH  FILE = 1, ' as statement, dbid, 0 as n
	from sys.sysdatabases where dbid > 4
	union all
	select '	MOVE N'+QUOTENAME(name,'''')+' TO N' +QUOTENAME(replace(physical_name, 'C:\DATABASE', 'D:\dbfile'),'''')+ ',', database_id, 1 as n
	from sys.master_files where database_id > 4 and type = 0
	union all
	select '	MOVE N'+QUOTENAME(name,'''')+' TO N' +QUOTENAME(replace(physical_name, 'C:\DATABASE', 'F:\dblog'),'''')+ ',', database_id, 2 as n
	from sys.master_files where database_id > 4 and type = 1
	union all
	select '	NOUNLOAD,  STATS = 5', dbid, 3 as n
	from sys.sysdatabases where dbid > 4
) t
order by dbid, n, statement
17 ноя 17, 11:12    [20962768]     Ответить | Цитировать Сообщить модератору
 Re: Перенос баз на другой сервер.  [new]
alHaos
Member

Откуда:
Сообщений: 212
Благодарю ребзя, век живи век учить...
Думал подомное можно только через курсоры написать.
Не согласовали перенос, есть неделя подготовиться поосновательнее.
17 ноя 17, 12:51    [20963257]     Ответить | Цитировать Сообщить модератору
 Re: Перенос баз на другой сервер.  [new]
Col
Member

Откуда: Торонто
Сообщений: 180
alHaos,
Я когда-то баловался, надо было каждую неделю обновлять под сотню баз на 4 QA и 2 DEV инстанса с продакшен фермы.

Фулл бакап с удалением 2-х недельной истории:
DECLARE @name VARCHAR(50); -- Database name
DECLARE @path VARCHAR(256); -- Path for backup files
DECLARE @fileName VARCHAR(256); -- Filename for backup
DECLARE @fileDate VARCHAR(20); -- Used for file name
DECLARE @DeleteDate DATETIME = DATEADD(wk,-2,GETDATE()); -- Cutoff date minus 2 weeks on this example

-- Path to backups.
SET @path = 'D:\Backup\';

-- Get date to include in file name.
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112);

-- Dynamically get each database on the server.
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb');

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @name;

-- Loop through the list to backup each database.
WHILE @@FETCH_STATUS = 0
BEGIN 
      -- Build the path and file name.
      SET @fileName = @path + @name + '_' + @fileDate + '.BAK';
      -- Backup the database.
      BACKUP DATABASE @name TO DISK = @fileName WITH INIT;
      -- Loop to the next database.
      FETCH NEXT FROM db_cursor INTO @name;
END 

-- Purge old backup files from disk.
EXEC master.sys.xp_delete_file 0,@path,'BAK',@DeleteDate,0;

-- Clean up.
CLOSE db_cursor;
DEALLOCATE db_cursor;
GO


Рестор всех баз на последний фулл бакап в директории:

declare @dbtable table ( backup_name nvarchar(500) , depth int , [file] int)
DECLARE @fileList TABLE (backupFile NVARCHAR(255)) 
declare @DBname varchar (256)
declare @backup_dir varchar(256) = 'd:\backup\'
DECLARE @lastFullBackup NVARCHAR(500) 
DECLARE @FullBackup NVARCHAR(500) 
declare @cmd varchar (4000)
declare @getdir varchar (1000)

insert into @dbtable
EXEC MASTER.sys.xp_dirtree @backup_dir, 0, 1

--select * from @dbtable --where [file] =0



DECLARE db_cursor CURSOR FOR  
select backup_name from @dbtable where [file] =0

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @DBname   

WHILE @@FETCH_STATUS = 0   
BEGIN   

set  @lastFullBackup =  @backup_dir + @dbName +'\'
--print (@lastFullBackup)
SET @getdir = 'DIR /b ' + @lastFullBackup

--print (@getdir)
INSERT INTO @fileList--(backupFile) 
EXEC master.sys.xp_cmdshell @getdir 

--select * from @fileList

SELECT @FullBackup = MAX(backupFile)  
FROM @fileList  
WHERE backupFile LIKE '%.BAK'  
   AND backupFile LIKE @dbName + '%' 
   --print (@FullBackup)

SET @cmd = 'RESTORE DATABASE ' + @dbName + ' FROM DISK = '''  
       +  @lastFullBackup +''' WITH NORECOVERY, REPLACE' 
PRINT @cmd 
--EXECUTE @cmd
       FETCH NEXT FROM db_cursor INTO @DBname   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor
17 ноя 17, 17:54    [20964554]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить