Назад | Перейти на главную страницу

Как перенести 100 БД с одного сервера MS-SQL 2008 на другой? (ищу автоматизацию)

Позвольте мне начать с того, что я не администратор баз данных, но я нахожусь в положении, когда я отвечаю за перемещение чуть менее 100 баз данных MS-SQL 2008 с нашего текущего сервера разработки на новый / лучший / более быстрый сервер разработки.

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

Я знаю, что могу взять по баку каждого и восстановить его на новом сервере, но, учитывая объем БД, я ищу более эффективный способ.

Я не против изучения нового программного обеспечения, написания кода или любых других требований, если это ускоряет процесс.

1) Следующий скрипт сгенерирует T-SQL для создания баз данных после перемещения файлов. Важно сделать этот шаг прежде всего.

SELECT 'create database ' + QUOTENAME(DB_NAME(d.database_id)) + ' on ' + 
STUFF((
    SELECT ',(name = ''' + name + ''', filename = ''' + [physical_name] + ''')'
    FROM sys.[master_files] AS mf
    WHERE [mf].[database_id] = d.[database_id]
    FOR XML PATH('')
), 1, 1, '') + ' for attach'
FROM sys.[databases] AS d
WHERE d.name NOT IN ('master', 'model', 'tempdb', 'msdb')

Если путь к файлам данных на новом сервере не такой, как на старом сервере, вы можете изменить имена файлов в скрипте (или сделать что-нибудь более интересное в запросе, чтобы сделать это автоматически).

2) Следующий код сгенерирует сценарий T-SQL, чтобы установить состояние базы данных в автономном режиме для всех несистемных баз данных. Если вы планируете отключить исходный сервер (что было бы неплохо), этот шаг не нужен, поскольку файлы базы данных не будут использоваться сервером.

select 'alter database ' + quotename(name) + ' set offline'
from sys.[databases] as d
WHERE d.name NOT IN ('master', 'model', 'tempdb', 'msdb')

3) Переведите базы данных в автономный режим, выключив исходный сервер или выполнив T-SQL с шага 2 на исходном сервере.

4) Переместите файлы на новый сервер

5) Выполните сценарий из шага 2 на новом сервере.

Поскольку вы собираетесь выполнить восстановление до той же версии SQL Server, я сделал следующее в своей среде, когда возникла эта задача:

1) Восстановите резервную копию главной базы данных от источника к месту назначения, оставив этот сервер в режиме только ведущего с помощью флага T-3608.

2) После восстановления мастера вы должны убедиться, что новый сервер разработки имеет ту же структуру папок, что и старый сервер. например. если файлы mdf должны перейти в 'e: \ data', убедитесь, что вы установили эту папку на новом сервере. Обязательно заранее запишите пути к каждой базе данных, чтобы вы могли размещать файлы mdf и ldf в одинаковых местах на новом сервере.

3) Теперь выключите старый сервер разработки. Скопируйте и вставьте mdf и ldf для всех баз данных, включая модель и msdb (tempdb будет воссоздан).

4) После того, как вы вставите файлы в идентичное место на новом сервере, удалите флаг tace и запустите службу sql в обычном режиме.

5) Вероятность того, что sql не запустится, будет невозможна, проверьте программу просмотра событий на наличие ошибок.

6) Если вы обнаружите, что одна база данных находится в неправильном месте, но sql ожидает ее в каком-то другом месте, вам нужно снова использовать флаг трассировки и изменить местоположение файла, чтобы указать его на новый каталог.

Если описанные выше шаги вам легче понять, продолжайте и опубликуйте любые проблемы, иначе используйте метод резервного копирования и восстановления (длинный, но простой).

Спасибо Чандан

Если версии баз данных совпадают, вы можете физически переместить файлы после отключения баз данных; сначала соберите все имена баз данных:

SELECT Name FROM sys.databases WHERE owner_sid <> 1

Затем отключите их:

EXEC sp_msforeachdb 'ALTER DATABASE ? SET OFFLINE'

Теперь переместите физические файлы mdf и ldf на новый сервер и создайте сценарий того же набора баз данных для CREATE:

CREATE DATABASE $foo ON 
  (FILENAME = 'mdf_location'), 
  (FILENAME = 'log_location') FOR ATTACH

Примечание: не делайте этого для базы данных master, это не сработает.
Сделайте обычный бэкап и восстановите.