Копирование баз данных на другие серверы
В некоторых случаях можно скопировать базу данных с одного компьютера на другой и использовать ее для тестирования, проверки согласованности данных, разработки ПО, выполнения отчетов, создания зеркальной базы данных или предоставления доступа к базе данных сотрудникам удаленного филиала.
Скопировать базу данных можно одним из следующих способов.
- Использование мастера копирования баз данных Мастер копирования баз данных можно использовать для копирования или перемещения баз данных между серверами или обновления базы данных SQL Server до более поздней версии. Дополнительные сведения см. в статье Use the Copy Database Wizard.
- Восстановление базы данных из резервной копии Для копирования всей базы данных можно использовать инструкции BACKUP и RESTORE Transact-SQL. Выбор методики восстановления базы данных из полной резервной копии для копирования базы данных с одного компьютера на другой может быть мотивирован разными причинами. Сведения о копировании базы данных путем восстановления из резервной копии см. в статье Копирование баз данных путем создания и восстановления резервных копий.
Заметка Чтобы настроить зеркальную базу данных для зеркального отображения базы данных, необходимо восстановить базу данных на зеркальном сервере с помощью restore DATABASE WITH NORECOVERY. Дополнительные сведения см. в статье Подготовка зеркальной базы данных к зеркальному отображению (SQL Server).
Процесс переноса для сервера MS SQL Server
Процесс переноса серверов Microsoft SQL Server и Microsoft SQL Server Express одинаков.
Дополнительные сведения см. в следующей статье базы знаний Майкрософт: https://msdn.microsoft.com/ru-ru/library/ms189624.aspx.
Необходимые условия
• Нужно установить исходные и целевые экземпляры сервера SQL Server. Они могут быть размещены на разных компьютерах.
• Целевой экземпляр сервера SQL Server должен по крайней мере иметь ту же версию, что и исходный экземпляр. Восстановление предыдущей версии не поддерживается.
• Нужно установить SQL Server Management Studio . Если экземпляры сервера SQL Server находятся на разных компьютерах, то SQL Server Management Studio нужно установить на обоих.
Процесс переноса с помощью SQL Server Management Studio
1. Остановите службу сервера ESET PROTECT Server (или службу сервера ESMC Server) или службу ESET PROTECT MDM.
Не запускайте сервер ESET PROTECT или ESET PROTECT MDM, пока не будут завершены все описанные ниже действия.
2. Войдите в исходный экземпляр сервера SQL Server через SQL Server Management Studio.
3. Создайте полную резервную копию базы данных, которую нужно перенести. Рекомендуем указать новое имя набора резервных копий. В противном случае если набор резервных копий уже использовался, к нему будет добавлен новый набор, и в результате файл резервной копии станет слишком большим.
4. Переведите исходную базу данных в автономный режим. Для этого последовательно щелкните элементы Задачи > Перевести в автономный режим .
5. Скопируйте файл резервной копии ( .bak ), созданный на третьем этапе, в расположение, доступное из целевого экземпляра SQL Server. Вам может понадобиться настроить права доступа к файлу резервной копии базы данных.
6. Войдите в целевой экземпляр сервера SQL Server через SQL Server Management Studio.
7. Восстановите базу данных в целевом экземпляре сервера SQL Server.

8. Укажите имя новой базы данных в поле В базу данных . Вы можете использовать то же имя, что и для старой базы данных.
9. Выберите элемент «Из устройства» в разделе Указание источника и расположения наборов резервных копий, которые нужно восстановить , а затем нажмите кнопку с многоточием («…»).

10. Нажмите кнопку Добавить, перейдите к файлу резервной копии и откройте его .
11. Выберите самую последнюю резервную копию, которую нужно восстановить (набор может содержать несколько резервных копий).
12. Откройте страницу Параметры мастера восстановления. При необходимости выберите элемент Перезаписать существующую базу данных и убедитесь, что папки для восстановления базы данных ( .mdf ) и журнала ( .ldf ) указаны правильно. Если не изменить значения по умолчанию, то будут использованы пути из исходного сервера SQL Server, поэтому проверьте эти значения.
• Если вы не уверены, где в целевом экземпляре сервера SQL Server хранятся файлы базы данных, щелкните существующую базу данных правой кнопкой мыши, выберите элемент свойства и перейдите на вкладку Файлы . Каталог, в котором хранится база данных, отображен в столбце Путь приведенной ниже таблицы.

13. В окне мастера восстановления нажмите кнопку ОК .
14. Щелкните правой кнопкой мыши базу данных era_db , выберите пункт Создать запрос и выполните указанный ниже запрос, чтобы удалить содержимое таблицы tbl_authentication_certificate (иначе при подключении агентов к новому серверу может произойти ошибка):
delete from era_db.dbo.tbl_authentication_certificate where certificate_id = 1;
15. Убедитесь, что в новом сервере базы данных включена проверка подлинности SQL Server . Щелкните сервер правой кнопкой мыши и выберите пункт Свойства . Перейдите к элементу Безопасность и убедитесь, что выбран режим проверки подлинности SQL Server и Windows .

16. Создайте имя для входа в SQL Server (для ESET PROTECT Server или ESET PROTECT MDM) в целевом сервере SQL Server, на котором включена проверка подлинности SQL Server , и в восстановленной базе данных привяжите к пользователю имя для входа.
o Не задавайте срок окончания действия пароля.
o Рекомендуемые символы для имен пользователей:
▪ Малые буквы ASCII, числа и подчеркивание «_».
o Рекомендуемые символы для паролей:
▪ ТОЛЬКО символы ASCII, включая большие и малые буквы ASCII, числа, пробелы и специальные символы.
o Не используйте символы, не относящиеся к стандарту ASCII, фигурные скобки (<>) и символ @.
o Обратите внимание, что если не следовать приведенным выше рекомендациям по использованию символов, у вас могут возникнуть проблемы с подключением к базе данных или в последующих шагах вам придется использовать специальные escape-символы во время изменения строк подключения к базе данных. Этот документ не содержит правила использования escape-символов.

17. В целевой базе данных привяжите имя для входа к пользователю. На вкладке сопоставления пользователей назначьте пользователю роль в базе данных: db_datareader , db_datawriter или db_owner .

18. Чтобы включить последние компоненты сервера базы данных, укажите для восстановленной базы данных самый новый уровень совместимости . Щелкните новую базу данных правой кнопкой мыши и выберите пункт Свойства .

Решение SQL Server Management Studio не может задавать уровни совместимости, которые старше используемой версии. Например, решение SQL Server Management Studio 2014 не может задать уровень совместимости для SQL Server 2019.
19. Убедитесь, что протокол подключения TCP/IP включен для «db_instance_name» (например, SQLEXPRESS или MSSQLSERVER), а TCP/IP- порту назначен номер 1433 . Для этого откройте диспетчер конфигурации SQL Server и перейдите к разделу Конфигурация сети SQL Server > Протоколы для db_instance_name , щелкните правой кнопкой мыши TCP/IP и выберите Включено . Дважды щелкните TCP/IP , откройте вкладку Протоколы , прокрутите вниз до элемента IPAll и в поле Порт TCP введите 1433. Щелкните OK и перезапустите службу SQL Server .
Перенос базы данных на другой компьютер
Привет.
Я хочу перенести базу данных, созданную на этом компьютере на другой сервер.
Здесь стоит 2008 сервер, переносить буду тоже на 2008. Хотя если получиться совместить с 2005 будет вообще идеально (где-то видел такую настройку).
Как правильно это делать? Я может совсем ку-ку конечно, но я почему-то интуитивно решил делать это через восстановление/резервирование баз данных.
1. Резервируем нашу базу данных (она запишется в файл *.bak).
2. Берем этот файл, несем на другой компьютер.
3. Запускаем сервер, создаем новую базу, правой кнопкой по ней — Восстановить. Выбираем наш файл, выбираем назначение — только созданная нами база.
4. Жмем ОК, ждем пол минуты. После ожидания выдается ошибка о том, что база данных видимо не может получить монопольный режим.
Что я делаю не так? Посоветуйте. Месяц делал проект, теперь не могу его перенести — смешно.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Перенос базы на другой компьютер.
Народ помогите разобраться как сохранить базу MS SQL на магнитном носителе и затем восстановить на.
Перенос базы данных на другой ПК. (с SQL2005->SQL2008)
Нужно перенести базу на другой пк, к тому же там стоит SQL2008. Помогите плиз. Заранее благодарен.

Перенос базы данных Access на другой ПК
Всем привет! Прошу помощи. Создал несложный проект в Visual Basic 2010 Exspress по работе с БД.
Создание и перенос базы данных на другой ПК
Всем добрый день) Недавно мой знакомый по просил меня написать ему небольшую базу данных, но.
3363 / 2059 / 736
Регистрация: 02.06.2013
Сообщений: 5,044
Сообщение от VladSharikov 
совместить с 2005 будет вообще идеально (где-то видел такую настройку)
Нет таких настроек.
Сообщение от VladSharikov 
3. Запускаем сервер, создаем новую базу, правой кнопкой по ней — Восстановить. Выбираем наш файл, выбираем назначение — только созданная нами база.
Лишний пункт. Просто Databases -> Restrore database. без всяких созданий БД.
ЗЫ: Если действительно есть желание чему-то научиться и понимать что и как нужно делать, то не стоит пользоваться GUI. Клацая мышкой вы может и освоите некоторые типовые вещи, но не более того.
Регистрация: 02.12.2010
Сообщений: 824
по поводу вашего совета. на компе с чистым сервером, где нет этой базы — все прошло супер. все есть. но, странно, почему то нет диаграмм. на этом же компе, где стояла уже база выдает ошибку, что такой *.mdf уже есть нельзя клонировать базу. спасибо.
invm, я бы с удовольствием делал бы все через запросы, как в mysql, только я не понимаю как это все делать в sql server.
сейчас нужно все просто сдать, а не запариватся с пониманием!(
Заблокирован
А не проще ли, временно остановить службу, скопировать базу из папки с сервером или где она у Вас лежит, и снова ее запустить?
3363 / 2059 / 736
Регистрация: 02.06.2013
Сообщений: 5,044
Сообщение от VladSharikov 
на этом же компе, где стояла уже база выдает ошибку, что такой *.mdf уже есть нельзя клонировать базу
А как вы себе представляете сосуществование одноименных БД да еще с одноименными файлами в одной папке?
На вкладке Options диалога восстановления есть возможность указать пути и имена файлов для восстанавливаемой БД.
1312 / 944 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
а так же при восстановлении есть возможность перезаписать существующую базу данных из резервной копии
(при условии, что к базе данных никто не подключен на момент восстановления)
Регистрация: 02.12.2010
Сообщений: 824
cygapb-007,
invm,
inv.DS, спасибо.
в какой папке лежат эти mdf? пока что хватило варианта из 1 поста. позже разберусь получше.
Заблокирован
VladSharikov, В папке куда ставили сервер. По умолчанию C:\Program Files\SQL как-то так не помню точно. По поиску сделайте на локальной диске по расширению .MDF файлы.
![]()
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,545
Сообщение от VladSharikov 
Привет.
Я хочу перенести базу данных, созданную на этом компьютере на другой сервер.
Здесь стоит 2008 сервер, переносить буду тоже на 2008. Хотя если получиться совместить с 2005 будет вообще идеально (где-то видел такую настройку).
Как правильно это делать? Я может совсем ку-ку конечно, но я почему-то интуитивно решил делать это через восстановление/резервирование баз данных.
1. Резервируем нашу базу данных (она запишется в файл *.bak).
2. Берем этот файл, несем на другой компьютер.
3. Запускаем сервер, создаем новую базу, правой кнопкой по ней — Восстановить. Выбираем наш файл, выбираем назначение — только созданная нами база.
4. Жмем ОК, ждем пол минуты. После ожидания выдается ошибка о том, что база данных видимо не может получить монопольный режим.
Что я делаю не так? Посоветуйте. Месяц делал проект, теперь не могу его перенести — смешно.
Суда посмотрите и поймете Что вы делаю не так http://tavalik.ru/index.php/so. r-2008-r2/
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
BDE перенос базы данных на другой пк
Здравствуйте, да такая тема поднималась много раз, перечитал кучу постов не могу понть что куда.
Перенос базы данных на другой комп(dBase, ADO)
Добрый день, товарищи специалисты! Говорю сразу, в базах данных я ламер. Сделал небольшое.
Перенос базы данных с одного локального сервера на другой
Как перенести базу данных MySQL с Денвера на OpenServer?
Установка приложения и базы данных на другой компьютер
Всем привет! Подскажите как можно собрать установщик из приложения wpf, в котором выполняются.
Перенос всех баз данных MS SQL Server на другую машину
Недавно возникла необходимость переноса всех БД (>50 на одном экземпляре SQL Server) из dev-окружения на другой экземпляр SQL Server, который располагался на другом железе. Хотелось минимизировать ручной труд и сделать всё как можно быстрее.
Disclaimer
Скрипты написаны для одной конкретной ситуации: это dev-окружение, все базы в простой модели восстановления, файлы данных и журналы транзакций лежат в одной куче.
Всё, что написано дальше относится только к этой ситуации, но вы можете без особых усилий допилить их под себя (свои условия).
В скриптах не используются новомодные STRING_AGG и прочие приятные штуки, поэтому работать всё должно начиная с SQL Server 2008 (или 2008 R2, не помню где появилось сжатие бэкапов). Для более старых версий нужно убрать WITH COMPRESSION из команды бэкапа, но тогда разницы по времени с копированием файлов может уже и не быть.
Это не инструкция — «как надо» делать такой перенос. Это демонстрация того, как можно использовать метаданные в dynamic SQL.
Конечно, самым быстрым способом было бы просто переподключить полку с дисками к новому серверу, но это был не наш вариант. Detach — копирование — Attach рассматривался, но не подошёл, поскольку канал был довольно узким и перенос БД в несжатом виде занял бы довольно большой промежуток времени.
В итоге, решили, что будем делать бэкап с компрессией на шару на новом сервере, а там уже восстанавливать. Железо и на старой, и на новой локации неплохое, бэкап жмётся неплохо, выигрыш по времени тоже неплохой.
Так был написан «генератор скриптов»:
DECLARE @unc_backup_path AS varchar(max) = '\\newServer\backup_share\' , @local_backup_path AS varchar(max) = 'E:\Backup\' , @new_data_path as varchar(max) = 'D:\SQLServer\data\'; SELECT name , 'BACKUP DATABASE [' + name + '] TO DISK = ''' + @unc_backup_path + name + '.bak'' WITH INIT, COPY_ONLY, STATS = 5;' AS backup_command , 'ALTER DATABASE [' + name + '] SET OFFLINE WITH ROLLBACK IMMEDIATE;' AS offline_command , 'RESTORE DATABASE [' + name + '] FROM DISK = ''' + @local_backup_path + name + '.bak'' WITH ' + ( SELECT 'MOVE ''' + mf.name + ''' TO ''' + @new_data_path + REVERSE(LEFT(REVERSE(mf.physical_name), CHARINDEX('\', REVERSE(mf.physical_name))-1)) + ''', ' FROM sys.master_files mf WHERE mf.database_id = d.database_id FOR XML PATH('') ) + 'REPLACE, RECOVERY, STATS = 5;' AS restore_command FROM sys.databases d WHERE database_id > 4 AND state_desc = N'ONLINE';
На выходе получаем готовые команды для создания бэкапов в нужное место, перевода БД в offline, чтобы их пользователи не могли с ними работать на старом сервере и скрипты для восстановления полученных бэкапов на новом сервере (с автоматическим перемещением всех файлов данных и журналов транзакций в указанное место).
Проблема с этим такая — либо кто-то должен сидеть и по очереди выполнять все скрипты (бэкап-офлайн-восстановление), либо кто-то должен сначала запустить все бэкапы, потом отключить все базы, потом всё восстановить — действий меньше, но нужно сидеть и отслеживать.
Хотелось автоматизировать все эти операции. С одной стороны, всё просто — уже есть готовые команды, заворачивай в курсор и выполняй. И, в принципе, я так и сделал, добавил новый сервер как linked server на старом и запустил. На локальном сервере команда выполнялась через EXECUTE (@sql_text);, на linked server — EXECUTE (@sql_text) AT [linkedServerName].
Таким образом, последовательно выполнялись операции — бэкап локально, перевод локальной БД в офлайн, восстановление на Linked server. Всё завелось, ура, но мне показалось, что можно немного ускорить процесс, если бэкапы и восстановления выполнять независимо друг от друга.
Тогда придуманный курсор был разделён на две части — на старом сервере в курсоре каждая база бэкапится и переводится в офлайн, после чего второй сервер-таки должен понять, что появилось новое задание и выполнить восстановление БД. Для реализации этого механизма я использовал запись в таблицу на linked server и бесконечный цикл (мне было лень придумывать критерий остановки), который смотрит не появилось ли новых записей и пытается восстановить что-нибудь, если появились.
Решение
На старом сервере создаётся и заполняется глобальная временная таблица ##CommandList, в которой собираются все команды и там же можно будет отслеживать статус выполнения бэкапов. Таблица глобальная, чтобы в любой момент из другой сессии можно было посмотреть — что там сейчас происходит.
DECLARE @unc_backup_path AS varchar(max) = 'D:\SQLServer\backup\' --путь к шаре для бэкапа на новом сервере , @local_backup_path AS varchar(max) = 'D:\SQLServer\backup\' --локальный путь на новом сервере к папке с бэкапами , @new_data_path as varchar(max) = 'D:\SQLServer\data\'; --локальный путь на новом сервере к папке, где должны оказаться данные SET NOCOUNT ON; IF OBJECT_ID ('tempdb..##CommandList', 'U') IS NULL CREATE TABLE ##CommandList ( dbName sysname unique --имя БД , backup_command varchar(max) --сгенерированная команда для бэкапа , offline_command varchar(max) --сгенерированная команда для перевода БД в офлайн после бэкапа , restore_command varchar(max) --сгенерированная команда для восстановления БД на новом сервере , processed bit --признак обработки: NULL - не обработано, 0 - обработано успешно, 1 - ошибка , start_dt datetime --когда начали обработку , finish_dt datetime --когда закончили обработку , error_msg varchar(max) --сообщение об ошибке, при наличии ); INSERT INTO ##CommandList (dbname, backup_command, offline_command, restore_command) SELECT name , 'BACKUP DATABASE [' + name + '] TO DISK = ''' + @unc_backup_path + name + '.bak'' WITH INIT, COPY_ONLY, STATS = 5;' AS backup_command --включает INIT - бэкап в месте назначения будет перезаписываться , 'ALTER DATABASE [' + name + '] SET OFFLINE WITH ROLLBACK IMMEDIATE;' AS offline_command , 'RESTORE DATABASE [' + name + '] FROM DISK = ''' + @local_backup_path + name + '.bak'' WITH ' + ( SELECT 'MOVE ''' + mf.name + ''' TO ''' + @new_data_path + REVERSE(LEFT(REVERSE(mf.physical_name), CHARINDEX('\', REVERSE(mf.physical_name))-1)) + ''', ' FROM sys.master_files mf WHERE mf.database_id = d.database_id FOR XML PATH('') ) + 'REPLACE, RECOVERY, STATS = 5;' AS restore_command FROM sys.databases d WHERE database_id > 4 AND state_desc = N'ONLINE' AND name NOT IN (SELECT dbname FROM ##CommandList) AND name <> 'Maintenance'; --у меня linked server - это тот же экземпляр, поэтому исключаю БД, которая используется на "linked server"
Посмотрим что там оказалось (SELECT * FROM ##CommandList):

Отлично, там собираются все команды для бэкапа/восстановления всех нужных БД.
На новом сервере была создана БД Maintenance и в ней таблица CommandList, которая будет содержать в себе информацию о восстановлении баз:
USE [Maintenance] GO CREATE TABLE CommandList ( dbName sysname unique --имя БД , restore_command varchar(max) --команда для восстановления , processed bit --статус выполнения , creation_dt datetime DEFAULT GETDATE() --время добавления записи , start_dt datetime --время начала обработки , finish_dt datetime --время окончания обработки , error_msg varchar(max) --текст ошибки, при наличии );
На старом сервере был настроен linked server, смотрящий на новый экземпляр SQL Server. Скрипты, которые приведены в этом посте, я писал дома и не заморачивался с новым экземпляром, использовал один и его же подключил как linked server сам к себе. Поэтому тут у меня и пути одинаковые и unc-path локальный.
Теперь можно объявлять курсор, в котором бэкапить базы, отключать их и писать на linked server команду для восстановления:
DECLARE @dbname AS sysname , @backup_cmd AS varchar(max) , @restore_cmd AS varchar(max) , @offline_cmd AS varchar(max); DECLARE MoveDatabase CURSOR FOR SELECT dbName, backup_command, offline_command, restore_command FROM ##CommandList WHERE processed IS NULL; OPEN MoveDatabase; FETCH NEXT FROM MoveDatabase INTO @dbname, @backup_cmd, @offline_cmd, @restore_cmd; WHILE @@FETCH_STATUS = 0 BEGIN --имя БД и команды получены, теперь нужно: -- сделать бэкап -- добавить в таблицу-приёмник на новом экземпляре команду для восстановления -- перевести БД в офлайн, чтобы к ней не могли подключиться -- получить следующую БД из списка --делаем отметку о начале работ UPDATE ##CommandList SET start_dt = GETDATE() WHERE dbName = @dbname; BEGIN TRY RAISERROR ('Делаем бэкап %s', 0, 1, @dbname) WITH NOWAIT; --сообщения на вкладке messages будут появляться сразу -- делаем бэкап EXEC (@backup_cmd); RAISERROR ('Добавляем команду на восстановления %s', 0, 1, @dbname) WITH NOWAIT; -- добавляем запись в таблицу-приёмник на linked server INSERT INTO [(LOCAL)].[Maintenance].[dbo].[CommandList] (dbName, restore_command) VALUES (@dbname, @restore_cmd); RAISERROR ('Переводим %s в OFFLINE', 0, 1, @dbname) WITH NOWAIT; -- переводим БД в офлайн EXEC (@offline_cmd); --Ставим успешный статус, проставляем время окончания работы UPDATE ##CommandList SET processed = 0 , finish_dt = GETDATE() WHERE dbName = @dbname; END TRY BEGIN CATCH RAISERROR ('ОШИБКА при работе с %s. Необходимо проверить error_msg в ##CommandList', 0, 1, @dbname) WITH NOWAIT; -- если что-то пошло не так, ставим ошибочный статус и описание ошибки UPDATE ##CommandList SET processed = 1 , finish_dt = GETDATE() , error_msg = ERROR_MESSAGE(); END CATCH FETCH NEXT FROM MoveDatabase INTO @dbname, @backup_cmd, @offline_cmd, @restore_cmd; END CLOSE MoveDatabase; DEALLOCATE MoveDatabase; --выводим результат SELECT dbName , CASE processed WHEN 1 THEN 'Ошибка' WHEN 0 THEN 'Успешно' ELSE 'Не обработано' END as Status , start_dt , finish_dt , error_msg FROM ##CommandList ORDER BY start_dt; DROP TABLE ##CommandList;
Каждое действие «логируется» на вкладке Messages в SSMS — там можно наблюдать за текущим действием. Если использовать WITH LOG в RAISERROR, в принципе, можно засунуть это всё в какой-нибудь job и потом смотреть логи.
Во время выполнения курсора можно обращаться к ##CommandList и смотреть в табличном виде что и как происходит.
На новом сервере, параллельно, крутился бесконечный цикл:
SET NOCOUNT ON; DECLARE @dbname AS sysname , @restore_cmd AS varchar(max); WHILE 1 = 1 --можно придумать условие остановки, но мне было лень BEGIN SELECT TOP 1 @dbname = dbName, @restore_cmd = restore_command FROM CommandList WHERE processed IS NULL; --берём случайную БД из таблицы, среди необработанных IF @dbname IS NOT NULL BEGIN --добавляем сообщение о начале обработки UPDATE CommandList SET start_dt = GETDATE() WHERE dbName = @dbname; RAISERROR('Начали восстановление %s', 0, 1, @dbname) WITH NOWAIT; BEGIN TRY --пробуем восстановить БД, если что-то не так, в CATCH запишем что не так EXEC (@restore_cmd); --добавляем информацию в журнал UPDATE CommandList SET processed = 0 , finish_dt = GETDATE() WHERE dbName = @dbname; RAISERROR('База %s восстановлена успешно', 0, 1, @dbname) WITH NOWAIT; END TRY BEGIN CATCH RAISERROR('Возникла проблема с восстановлением %s', 0, 1, @dbname) WITH NOWAIT; UPDATE CommandList SET processed = 1 , finish_dt = GETDATE() , error_msg = ERROR_MESSAGE(); END CATCH END ELSE --если ничего не выбрали, то просто ждём BEGIN RAISERROR('waiting', 0, 1) WITH NOWAIT; WAITFOR DELAY '00:00:30'; END SET @dbname = NULL; SET @restore_cmd = NULL; END
Всё что он делает — смотрит в таблицу CommandList, если там есть хотя бы одна необработанная запись — берёт имя БД и команду для восстановления и пытается выполнить с помощью EXEC (@sql_text);. Если записей нет, ждёт 30 секунд и пробует снова.
И курсор, и цикл обрабатывают каждую запись только один раз. Не получилось? Пишем сообщение об ошибке в таблицу и больше сюда не возвращаемся.
Про условие остановки — мне на самом деле было лень. Пока набирал текст, придумал минимум три решения — как вариант — добавление флагов «Готов к восстановлению \ Не готов к восстановлению \ Завершён», заполнение списка БД и команд сразу, при заполнении ##CommandList на старом сервере и обновление флага внутри курсора. Останавливаемся, когда не осталось «готовых к восстановлению» записей, так как нам сразу известен весь объём работ.
Выводы
А нет никаких выводов. Подумал, что кому-то может быть полезно/интересно посмотреть как использовать метаданные для формирования и выполнения dynamic sql. Приведённые в посте скрипты в том виде, как есть, мало пригодны для использования на проде, однако, их можно немного допилить под себя и использовать, например, для массовой настройки log shipping / database mirroring / availability groups.
При выполнении бэкапа на шару, у учётной записи, под которой запущен SQL Server, должны быть права для записи туда.
В посте не раскрыто создание Linked Server’a (мышкой в GUI интуитивно настраивается за пару минут) и перенос логинов на новый сервер. Те, кто сталкивался с переносом пользователей знают, что простое пересоздание sql-логинов не очень помогает, поскольку у них есть sid’ы, с которыми и связаны пользователи БД. Скрипты для генерации sql-логинов с текущими паролями и корректными sid’ами есть на msdn.
- Microsoft SQL Server
- Администрирование баз данных
