1. Цель
При обслуживании базы данных SQL Server, когда наш начальник просит нас переместить десятки гигабайт файлов данных на другие серверы и требует минимального времени простоя, есть ли у нас планы удовлетворить эти требования?
Здесь мы предполагаем, что две машины не находятся в одном компьютерном зале, поэтому наше решение кажется более осмысленным. Если вам повезет и две машины находятся в одной локальной сети, то поздравляю, вы можете иметь гораздо больше возможностей. сделай это.
2. Анализ и дизайнерские идеи
Фактически, предполагаемая нами среда имеет две характеристики: первая заключается в том, что файл базы данных относительно велик; вторая заключается в том, что скорость передачи файлов может быть относительно низкой. Возможно, мы ничего не можем поделать со скоростью передачи, но мы можем начать с проблемы размера файла и объединить ее с характеристиками SQL Server, чтобы у нас было следующее решение.
Чтобы свести к минимуму время простоя, мы используем полное резервное копирование и дифференциальное резервное копирование для миграции базы данных. В течение дня делайте полную резервную копию (XXX_full.bak) базы данных, которую необходимо перенести, и копируйте файл резервной копии (можно использовать). Программное обеспечение FTP здесь) Выполните возобновление точки останова) на целевой сервер для восстановления, подождите, пока закончится рабочее время, и выполните дифференциальное резервное копирование (XXX_diff.bak), затем скопируйте эту дифференциальную резервную копию на целевой сервер и выполните дифференциальное восстановление на основе полного восстановления. .
Время простоя здесь = время дифференциального резервного копирования + время передачи файла дифференциальной резервной копии + время восстановления файла дифференциальной резервной копии. Вызывает ли это время простоя, что это время очень короткое?
3. Справочный сценарий
Обратите внимание на изменение имени базы данных в приведенном ниже скрипте, а также на абсолютный путь.
--1: полное резервное копирование
объявить @dbname varchar(100)
объявить @sql nvarchar(макс)
set @dbname = 'DataBaseName'
установить @sql = '
РЕЗЕРВНАЯ БАЗА ДАННЫХ ['+@dbname+']
TO DISK = ''D:DBBackup'+@dbname+'_full.bak''
С NOFORMAT, NOINIT, NAME = '''+@dbname+' -Полное резервное копирование базы данных'',
ПРОПУСК, NOREWIND, NOUNLOAD, STATS = 10
ИДТИ'
PRint @sql
--Сгенерированный SQL
--DataBaseName_full
РЕЗЕРВНАЯ БАЗА ДАННЫХ [DataBaseName]
НА ДИСК = 'D:DBBackupDataBaseName_full.bak'
With NOFORMAT, NOINIT, NAME = 'DataBaseName-полное резервное копирование базы данных',
ПРОПУСК, НОРВИНД, NOUNLOAD, СТАТИСТИКА = 10
ИДТИ
--2: Полное резервное копирование и восстановление.
объявить @dbname varchar(100)
объявить @sql nvarchar(макс)
set @dbname = 'DataBaseName'
установить @sql = '
--RESTORE '+@dbname+'_full
ВОССТАНОВИТЬ БАЗУ ДАННЫХ ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_full.bak'' With FILE = 1,
ПЕРЕМЕЩЕНИЕ N''DataBase_Name'' В N''D:DataBase'+@dbname+'.mdf'',
ПЕРЕМЕЩИТЕ N''DataBase_Name_log'' В N''D:DataBase'+@dbname+'_log.ldf'',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
ИДТИ'
распечатать @sql
--Сгенерированный SQL
--RESTORE имя_базы_данных_full
ВОССТАНОВИТЬ БАЗА ДАННЫХ [DataBaseName]
FROM DISK = 'D:DBBackupDataBaseName_full.bak' С ФАЙЛОМ = 1,
ПЕРЕМЕЩИТЬ N'DataBase_Name' В N'D:DataBaseDataBaseName.mdf',
ПЕРЕМЕЩИТЕ N'DataBase_Name_log' В N'D:DataBaseDataBaseName_log.ldf',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
ИДТИ
--3: Дифференциальное резервное копирование
объявить @dbname varchar(100)
объявить @sql nvarchar(макс)
set @dbname = 'DataBaseName'
установить @sql = '
РЕЗЕРВНАЯ БАЗА ДАННЫХ ['+@dbname+']
TO DISK = N''D:DBBackup'+@dbname+'_diff.bak''
С DIFFERENTIAL, NOFORMAT, NOINIT, NAME = N'''+@dbname+' -Дифференциальное резервное копирование базы данных'',
ПРОПУСК, НОРВИНД, NOUNLOAD, СТАТИСТИКА = 10
ИДТИ
'
распечатать @sql
--Сгенерированный SQL
--DataBaseName_diff
РЕЗЕРВНАЯ БАЗА ДАННЫХ [DataBaseName]
НА ДИСК = N'D:DBBackupDataBaseName_diff.bak'
С DIFFERENTIAL, NOFORMAT, NOINIT, NAME = N'DataBaseName-дифференциальная резервная копия базы данных',
ПРОПУСК, НОРВИНД, NOUNLOAD, СТАТИСТИКА = 10
ИДТИ
--4: Дифференциальное резервное копирование и восстановление.
объявить @dbname varchar(100)
объявить @sql nvarchar(макс)
set @dbname = 'DataBaseName'
установить @sql = '
--RESTORE '+@dbname+'_full
ВОССТАНОВИТЬ БАЗУ ДАННЫХ ['+@dbname+']
FROM DISK = ''D:DBBackup'+@dbname+'_diff.bak'' With FILE = 1,
NOUNLOAD, СТАТИСТИКА = 10
ИДТИ'
распечатать @sql
--Сгенерированный SQL
--RESTORE имя_базы_данных_full
ВОССТАНОВИТЬ БАЗА ДАННЫХ [DataBaseName]
FROM DISK = 'D:DBBackupDataBaseName_diff.bak' С ФАЙЛОМ = 1,
NOUNLOAD, СТАТИСТИКА = 10
ИДТИ
4. Постскриптум
Возможно, это должно быть здесь, но это часто приводит к обратным результатам. Иногда размер файла нашей базы данных не превышает десятков гигабайт, так что же нам делать? Есть ли другие решения?
Раньше я перемещал файл данных 700G, но мне было предоставлено достаточно времени для его перемещения. Я переместил данные на новый сервер с помощью задания базы данных. Преимущество этого заключается в оптимизации предыдущей базы данных, например, установке параметров базы данных. в виде разделов таблиц и переносить данные с минимальным воздействием на предыдущую базу данных. Подробно процесс напишу в следующий раз.
(Автор: Слушайте ветер и дождь. Источник: http://gaizai.cnblogs.com/ )