Вопрос по sql, sql-server-2008 – Присоединение нескольких баз данных с использованием T-SQL

3

Мы переносим один из наших серверов с SQL Server 2005 на SQL Server 2008. Этот сервер имеет около 50 небольших баз данных на нем.

Путь миграции, который мы выбираем, выглядит следующим образом:

Create new server with SQL 2008 Shutdown SQL Services on old server and copy databases to new one Shutdown old server and rename new server to the same name as the old one. Attach the 50 databases

Есть ли быстрый способ с помощью t-sql присоединить 50 баз данных к новому серверу?

Все файлы данных будут расположены в E: \ DATA, а журналы транзакций - в E: \ TLOG.

Настоятельно рекомендуем рассмотреть другой подход, чем отсоединение / присоединение. Вот почему:dba.stackexchange.com/questions/18593/… Aaron Bertrand

Ваш Ответ

2   ответа
2

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

И хотя мне нравится подход SQLCMD @ marc_s, я предпочитаю извлекать эти вещи из метаданных напрямую. Таким образом, я могу проверять все выходные данные, копировать и вставлять части, которые я хочу выполнить партиями, а не все сразу и т. Д. Что-то вроде:

DECLARE @bl VARCHAR(512) = '\\fileshare\folder\'; -- 'backup location

SET NOCOUNT ON;

SELECT 'BACKUP DATABASE ' + QUOTENAME(name) 
  + ' TO DISK = ''' + @bl + name + '.BAK'' WITH INIT;
  ALTER DATABASE ' + QUOTENAME(name) + ' SET OFFLINE;'
FROM sys.databases WHERE database_id > 4 -- AND other filter criteria

SELECT 'RESTORE DATABASE ' + QUOTENAME(d.name) + ' FROM DISK=''' + @bl +  d.name 
  + '.BAK'' WITH ' + STUFF((SELECT ',MOVE ''' + f.name + ''' 
    TO ''E:\DATA\' + f.name + '.mdf''' FROM master.sys.master_files AS f 
    WHERE f.database_id = d.database_id AND type_desc = 'ROWS'
    FOR XML PATH('')), 1, 1, '')
  +', '+ STUFF((SELECT ',MOVE ''' + f.name + ''' TO ''E:\TLOG\' + f.name + '.mdf'''
    FROM master.sys.master_files AS f 
    WHERE f.database_id = d.database_id AND type_desc = 'LOG'
    FOR XML PATH('')), 1, 1, '') + ';
  ALTER DATABASE ' + QUOTENAME(d.name) + ' SET COMPATIBILITY_LEVEL = 100;'
FROM sys.databases AS d WHERE database_id > 4 -- AND other filter criteria

(Это предполагает, что у вас есть только файлы данных / журналов, нет файлового потока и т. Д., И вы можете выполнять резервное копирование / восстановление из общего расположения, доступного для обоих экземпляров.)

Чтобы уточнить, вы должны сгенерировать оба набора команд на сервере 2005, скопировать и amp; выполните там команды резервного копирования (и, возможно, сразу после этого установите их в автономный режим), затем скопируйте & amp; Запустите команды восстановления на сервере 2008.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsys.databasesError: User Rate Limit Exceeded
5

Используя режим SQLCMD, вы можете легко написать это:

:setvar dbname YourDatabaseName
:setvar dbfile N'E:\DATA\YourDatabase.mdf'
:setvar logfile N'E:\TLOG\YourDatabase_log.ldf'
USE [master]
GO

CREATE DATABASE $(dbname) ON 
( FILENAME = $(dbfile) ),
( FILENAME = $(logfile) )
FOR ATTACH
GO

Это работает либо изsqlcmd.exe из командной строки (вы даже можете предоставить значения для переменныхdbname, dbfile, logfile из командной строки тоже), или он работает в SQL Server Management Studio, если вы включилиTools > Options > Query Execution > by default, open new queries in SQLCMD mode .

Узнайте больше оУтилита SQLCMD и все ее параметры на MSDN.

PS: конечно, этот подход с включенным сценарием SQLCMD также работает для циклов BACKUP / RESTORE :-) (как рекомендовано Aaron)

PPS: если у вас хорошее соглашение об именах, и файл данных всегда$(dbname).mdf и файл журнала всегда$(dbname)_log.ldfВы также можете использовать этот сокращенный скрипт SQLCMD:

:setvar dbname YourDatabaseName
USE [master]
GO

CREATE DATABASE $(dbname) ON 
( FILENAME = N'E:\DATA\$(dbfile).mdf' ),
( FILENAME = N'E:\TLOG\$(logfile)_log.ldf' )
FOR ATTACH
GO

а затем просто вызовите это из командной строки:

C:\>  sqlcmd.exe -S yourserver -E -i attach.sql -v dbname=YourDb1

и так далее, один раз для каждой базы данных вам нужно повторно присоединить.

PPPS: если вы хотите восстановить резервные копии, это немного сложнее:

:setvar dbname YourDatabaseName
USE [master]
GO

RESTORE DATABASE $(dbname)
FROM DISK = N'E:\Backup\$(dbname).bak' 
WITH FILE = 1,  
MOVE N'$(dbname)' TO N'E:\DATA\$(dbname).mdf',  
MOVE N'$(dbname)_Log' TO N'E:\TLOG\$(dbname)_Log.ldf',  
NOUNLOAD, REPLACE
GO

Это работает, пока вы называете.bak файлы совпадают с именем вашей базы данных, и вы помещаете их в фиксированное место (я предположил,E:\Backup здесь - адаптируйся по мере необходимости).

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Neil Hoff

Похожие вопросы