MS SQL Server Создать Job
Что необходимо: перенести данные из основной базы в хранилище. Что хочется: создать Job, который будет переносить данные.
Нашёл, как обращаться к другому серверу, но в моей таблице sys.servers сервер один. Вопрос: есть ли в принципе такая возможность переноса данных, или нужно это делать кодом?
Отслеживать
задан 10 дек 2018 в 21:20
718 3 3 серебряных знака 14 14 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вам нужно прилинковать все сервера к которым вы собираетесь обращаться. Есть два способа создания связанного сервера:
Через UI SSMS
Здесь все сводится к тому что надо открыть SSMS, найти в обозревателе объектов пункт Linked Servers, и заполнять поля следуя инструкции из статьи ниже.
Скриптами
1) Пример скрипта для создания свзянного сервера с экземпляром SRVTEST\SQLTEST .
USE [master] GO EXEC master.dbo.sp_addlinkedserver @server = N'SRVTEST\SQLTEST', @srvproduct=N'SQL Server' ; GO
2) Дальше если вы используюте виндовую авторизацию вам необходимо прокинуть логин входа на связанный сервер
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'SRVTEST\SQLTEST', @locallogin = NULL , @useself = N'True' ; GO
Если авторизация SQL Server то просто создаем такой же логин на сязанном сервере.
EXEC sp_addlinkedsrvlogin @rmtsrvname = N'SRVTEST\SQLTEST', -- имя должно быть таким же как в sp_addlinkedserver @useself = N'False', @rmtuser = 'MyUsername' @rmtpassword = 'MyPassword';
Перенос заданий Агента SQL Server в ADF с помощью SSMS
Область применения:
Фабрика данных Azure
Azure Synapse Analytics
Попробуйте использовать фабрику данных в Microsoft Fabric, решение для аналитики с одним интерфейсом для предприятий. Microsoft Fabric охватывает все, от перемещения данных до обработки и анализа данных в режиме реального времени, бизнес-аналитики и отчетности. Узнайте, как бесплатно запустить новую пробную версию !
Перенося локальные рабочие нагрузки SQL Server Integration Services (SSIS) в службы SSIS в ADF, можно после переноса пакетов служб SSIS выполнить пакетную миграцию заданий Агента SQL Server с типом шага задания, определенным как перенос пакета SQL Server Integration Services в конвейеры, действия или триггеры по расписанию Фабрики данных Azure (ADF), используя Мастер миграции заданий служб SSIS SQL Server Management Studio (SSMS).
Как правило, для выбранных заданий агента SQL с поддерживаемыми типами шагов заданий Мастер миграции заданий SSIS позволяет:
-
сопоставить локальное расположение пакета SSIS с расположением, куда будут переноситься пакеты, доступные SSIS в ADF;
Примечание. Поддерживаются только пакеты, располагающиеся в файловой системе.
| Объект задания Агента SQL | Ресурс ADF | Примечания. |
|---|---|---|
| Задание Агента SQL | конвейер | Конвейеру будет присвоено имя Создан для . |
- создать шаблоны Azure Resource Manager (ARM) в локальной выходной папке и развернуть их в Фабрике данных напрямую или позднее вручную (дополнительные сведения о шаблонах ADF Resource Manager см. на странице типов ресурсов Microsoft.DataFactory).
Необходимые компоненты
Для использования функции, описываемой в этой статье, требуется SQL Server Management Studio версии 18.5 или более поздней. Чтобы получить последнюю версию SSMS, перейдите на страницу скачивания SQL Server Management Studio (SSMS).
Миграция заданий SSIS в ADF
- В обозревателе объектов SSMS выберите Агент SQL Server, далее выберите папку «Задания», а затем щелкните ее правой кнопкой мыши и выберите пункт Перенести задания SSIS в ADF.

- Войдите в Azure и выберите подписку Azure, Фабрику данных и среду выполнения интеграции. Службу хранилища Azure выбирать необязательно — она используется на этапе сопоставления расположений пакетов, если у подлежащих переносу заданий служб SSIS есть пакеты SSIS в файловой системе.

- Сопоставьте пути к пакетам SSIS и файлам конфигурации в заданиях SSIS с путями назначения, к которым могут получить доступ перенесенные конвейеры. На этом шаге сопоставления можно выполнить следующие действия:
- Выбрать исходную папку, а затем нажать кнопку Добавить сопоставление.
- Обновить путь к исходной папке. Допустимы пути к папкам пакетов или их родительским папкам.
- Обновить путь к конечной папке. Изначально используется относительный путь к учетной записи хранения по умолчанию, которая была выбрана на шаге 1.
- Удалить выбранное сопоставление, нажав кнопку Удалить сопоставление.


- Выберите поддерживаемые задания для миграции и настройте параметры соответствующих действий «Выполнить пакет SSIS».
- Параметры по умолчанию — это параметры, которые применяются по умолчанию ко всем выбранным шагам. Дополнительные сведения о каждом свойстве см. на вкладке Параметрыдействия «Выполнить пакет SSIS» в случае, когда расположение пакета задано как Файловая система (пакет).

- Параметры шага — настройка параметров выбранного шага. Применить параметры по умолчанию — изначально этот флажок установлен. Снимите его, чтобы настроить параметры только для выбранного шага.
Дополнительные сведения о других свойствах см. на вкладке Параметрыдействия «Выполнить пакет SSIS» в случае, когда расположение пакета задано как Файловая система (пакет).
- Параметры по умолчанию — это параметры, которые применяются по умолчанию ко всем выбранным шагам. Дополнительные сведения о каждом свойстве см. на вкладке Параметрыдействия «Выполнить пакет SSIS» в случае, когда расположение пакета задано как Файловая система (пакет).
- Создайте и разверните шаблон ARM.
- Выберите или введите выходной путь к шаблонам ARM перенесенных конвейеров ADF. Если папки не существует, она будет создана автоматически.
- Выберите вариант развертывания шаблонов ARM в фабрике данных:
- По умолчанию он снят, и созданные шаблоны ARM можно развернуть позже вручную.
- Чтобы сразу развернуть созданные шаблоны ARM в фабрике данных, установите этот флажок.

- Выполните миграцию, а затем проверьте результаты.

Перенос заданий и расписаний с одного экземпляра MS SQL Server на другой средствами T-SQL
Довольно часто бывает необходимо перенести задания Агента на другой экземпляр MS SQL Server. Восстановление базы данных msdb невсегда именно то решение, которое подойдет, т к нередки случаи, когда нужно перенести именно только задания Агента, а также при переходе на более новую версию MS SQL Server. Так как же можно перенести задания Агента без восстановления базы данных msdb?
В данной статье будет разобран пример реализации скрипта T-SQL, который копирует задания Агента с одного экземпляра MS SQL Server на другой. Данное решение было опробовано при переносе заданий Агента с MS SQL Server 2012-2016 на MS SQL Server 2017.
Решение
Опишем сначала саму последовательность действий:
1) создать список заданий, который переносить не нужно
2) перенести сами задания
3) перенести шаги перенесенных заданий
4) перенести расписания перенесенных заданий
5) перенести связку расписания-задания для перенесенных заданий
6) перенести целевые сервера для перенесенных заданий
7) регистрируем задания и активизируем их расписания, переведя в неактивный режим эти задания (выключением заданий)
8) назначаем владельца для всех перенесенных заданий (например, sa)
Теперь для каждого пункта приведем реализацию на T-SQL.
Все 8 шагов должны выполняться одним блоком. Но для лучшего понимания, опишем каждый блок отдельно. Перед выполнением этих 8-ми шагов также необходимо связать экземпляр MS SQL Server, на который будут скопированы задания.
1) собираем те задания, которые переносить не нужно:
Запрос
select ss.[schedule_uid] ,js.[job_id] into #tbl_notentity from [msdb].[dbo].[sysjobschedules] as js inner join [msdb].[dbo].[sysschedules] as ss on js.[schedule_id]=ss.[schedule_id] where [job_id] in ( )
Таким образом, получили таблицу непереносимых заданий #tbl_notentity, в которой содержится пара GUID расписания задания и GUID самого задания.
2) перенести сами задания:
Запрос
select *, 0 as IsAdd into #tbl_jobs from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobs]; ;with src as ( select * from [msdb].[dbo].[sysjobs] as src where not exists ( select top(1) 1 from #tbl_notentity as t where t.[job_id]=src.[job_id] ) ) merge #tbl_jobs as trg using src on trg.[job_id]=src.[job_id] when not matched by target then INSERT ([job_id] ,[originating_server_id] ,[name] ,[enabled] ,[description] ,[start_step_id] ,[category_id] ,[owner_sid] ,[notify_level_eventlog] ,[notify_level_email] ,[notify_level_netsend] ,[notify_level_page] ,[notify_email_operator_id] ,[notify_netsend_operator_id] ,[notify_page_operator_id] ,[delete_level] ,[date_created] ,[date_modified] ,[version_number] ,[IsAdd]) VALUES (src.[job_id] ,src.[originating_server_id] ,src.[name] ,src.[enabled] ,src.[description] ,src.[start_step_id] ,src.[category_id] ,src.[owner_sid] ,src.[notify_level_eventlog] ,src.[notify_level_email] ,src.[notify_level_netsend] ,src.[notify_level_page] ,src.[notify_email_operator_id] ,src.[notify_netsend_operator_id] ,src.[notify_page_operator_id] ,src.[delete_level] ,src.[date_created] ,src.[date_modified] ,src.[version_number] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobs]([job_id] ,[originating_server_id] ,[name] ,[enabled] ,[description] ,[start_step_id] ,[category_id] ,[owner_sid] ,[notify_level_eventlog] ,[notify_level_email] ,[notify_level_netsend] ,[notify_level_page] ,[notify_email_operator_id] ,[notify_netsend_operator_id] ,[notify_page_operator_id] ,[delete_level] ,[date_created] ,[date_modified] ,[version_number]) select [job_id] ,[originating_server_id] ,[name] ,[enabled] ,[description] ,[start_step_id] ,[category_id] ,[owner_sid] ,[notify_level_eventlog] ,[notify_level_email] ,[notify_level_netsend] ,[notify_level_page] ,[notify_email_operator_id] ,[notify_netsend_operator_id] ,[notify_page_operator_id] ,[delete_level] ,[date_created] ,[date_modified] ,[version_number] from #tbl_jobs where IsAdd=1;
Сначала собираем все имеющиеся задания на сервере-получателе в таблицу #tbl_jobs. Затем с помощью инструкции MERGE производим слияние по полю [job_id] в эту таблицу всех недостающих заданий с сервера-источника, которых нет в таблице #tbl_notentity из п.1 алгоритма. Вставленные строки помечаем как 1 в столбце IsAdd. И далее, добавляем все задания в таблицу [msdb].[dbo].[sysjobs] сервера-получателя из таблицы #tbl_jobs по условию IsAdd=1. Таким образом, выполнен перенос тех заданий на сервер-получатель, которых нет в таблице #tbl_notentity из п.1 алгоритма.
3) перенести шаги перенесенных заданий:
Запрос
select *, 0 as IsAdd into #tbl_jobsteps from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobsteps]; ;with src as ( select * from [msdb].[dbo].[sysjobsteps] as src where not exists ( select top(1) 1 from #tbl_notentity as t where t.[job_id]=src.[job_id] ) ) merge #tbl_jobsteps as trg using src on trg.[job_id]=src.[job_id] and trg.[step_id]=src.[step_id] when not matched by target then INSERT ([job_id] ,[step_id] ,[step_name] ,[subsystem] ,[command] ,[flags] ,[additional_parameters] ,[cmdexec_success_code] ,[on_success_action] ,[on_success_step_id] ,[on_fail_action] ,[on_fail_step_id] ,[server] ,[database_name] ,[database_user_name] ,[retry_attempts] ,[retry_interval] ,[os_run_priority] ,[output_file_name] ,[last_run_outcome] ,[last_run_duration] ,[last_run_retries] ,[last_run_date] ,[last_run_time] ,[proxy_id] ,[step_uid] ,[IsAdd]) VALUES (src.[job_id] ,src.[step_id] ,src.[step_name] ,src.[subsystem] ,src.[command] ,src.[flags] ,src.[additional_parameters] ,src.[cmdexec_success_code] ,src.[on_success_action] ,src.[on_success_step_id] ,src.[on_fail_action] ,src.[on_fail_step_id] ,src.[server] ,src.[database_name] ,src.[database_user_name] ,src.[retry_attempts] ,src.[retry_interval] ,src.[os_run_priority] ,src.[output_file_name] ,src.[last_run_outcome] ,src.[last_run_duration] ,src.[last_run_retries] ,src.[last_run_date] ,src.[last_run_time] ,src.[proxy_id] ,src.[step_uid] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobsteps]([job_id] ,[step_id] ,[step_name] ,[subsystem] ,[command] ,[flags] ,[additional_parameters] ,[cmdexec_success_code] ,[on_success_action] ,[on_success_step_id] ,[on_fail_action] ,[on_fail_step_id] ,[server] ,[database_name] ,[database_user_name] ,[retry_attempts] ,[retry_interval] ,[os_run_priority] ,[output_file_name] ,[last_run_outcome] ,[last_run_duration] ,[last_run_retries] ,[last_run_date] ,[last_run_time] ,[proxy_id] ,[step_uid]) select [job_id] ,[step_id] ,[step_name] ,[subsystem] ,[command] ,[flags] ,[additional_parameters] ,[cmdexec_success_code] ,[on_success_action] ,[on_success_step_id] ,[on_fail_action] ,[on_fail_step_id] ,[server] ,[database_name] ,[database_user_name] ,[retry_attempts] ,[retry_interval] ,[os_run_priority] ,[output_file_name] ,[last_run_outcome] ,[last_run_duration] ,[last_run_retries] ,[last_run_date] ,[last_run_time] ,[proxy_id] ,[step_uid] from #tbl_jobsteps where IsAdd=1; drop table #tbl_jobsteps;
Сначала собираем все имеющиеся шаги заданий на сервере-получателе в таблицу #tbl_jobsteps. Затем с помощью инструкции MERGE производим слияние по полям [job_id] и [step_id] в эту таблицу всех недостающих шагов заданий с сервера-источника, которых нет в таблице #tbl_notentity из п.1 алгоритма. Вставленные строки помечаем как 1 в столбце IsAdd. И далее, добавляем все шаги заданий в таблицу [msdb].[dbo].[sysjobsteps] сервера-получателя из таблицы #tbl_jobsteps по условию IsAdd=1. Затем удаляем таблицу #tbl_jobsteps, т к далее она нам больше не нужна.
Таким образом, выполнен перенос всех шагов тех заданий на сервер-получатель, которых нет в таблице #tbl_notentity из п.1 алгоритма.
4) перенести расписания перенесенных заданий:
Запрос
select *, 0 as IsAdd into #tbl_sysschedules from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysschedules]; ;with src as ( select * from [msdb].[dbo].[sysschedules] as src where not exists ( select top(1) 1 from #tbl_notentity as t where t.[schedule_uid]=src.[schedule_uid] ) ) merge #tbl_sysschedules as trg using src on trg.[schedule_uid]=src.[schedule_uid] when not matched by target then INSERT ([schedule_id] ,[schedule_uid] ,[originating_server_id] ,[name] ,[owner_sid] ,[enabled] ,[freq_type] ,[freq_interval] ,[freq_subday_type] ,[freq_subday_interval] ,[freq_relative_interval] ,[freq_recurrence_factor] ,[active_start_date] ,[active_end_date] ,[active_start_time] ,[active_end_time] ,[date_created] ,[date_modified] ,[version_number] ,[IsAdd]) VALUES (src.[schedule_id] ,src.[schedule_uid] ,src.[originating_server_id] ,src.[name] ,src.[owner_sid] ,src.[enabled] ,src.[freq_type] ,src.[freq_interval] ,src.[freq_subday_type] ,src.[freq_subday_interval] ,src.[freq_relative_interval] ,src.[freq_recurrence_factor] ,src.[active_start_date] ,src.[active_end_date] ,src.[active_start_time] ,src.[active_end_time] ,src.[date_created] ,src.[date_modified] ,src.[version_number] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysschedules]([schedule_uid] ,[originating_server_id] ,[name] ,[owner_sid] ,[enabled] ,[freq_type] ,[freq_interval] ,[freq_subday_type] ,[freq_subday_interval] ,[freq_relative_interval] ,[freq_recurrence_factor] ,[active_start_date] ,[active_end_date] ,[active_start_time] ,[active_end_time] ,[date_created] ,[date_modified] ,[version_number]) select [schedule_uid] ,[originating_server_id] ,[name] ,[owner_sid] ,[enabled] ,[freq_type] ,[freq_interval] ,[freq_subday_type] ,[freq_subday_interval] ,[freq_relative_interval] ,[freq_recurrence_factor] ,[active_start_date] ,[active_end_date] ,[active_start_time] ,[active_end_time] ,[date_created] ,[date_modified] ,[version_number] from #tbl_sysschedules where IsAdd=1; drop table #tbl_sysschedules;
Сначала собираем все имеющиеся расписания на сервере-получателе в таблицу #tbl_sysschedules. Затем с помощью инструкции MERGE производим слияние по полю [schedule_uid] в эту таблицу всех недостающих расписаний с сервера-источника, которых нет в таблице #tbl_notentity из п.1 алгоритма. Вставленные строки помечаем как 1 в столбце IsAdd. И далее, добавляем все расписания в таблицу [msdb].[dbo].[sysschedules] сервера-получателя из таблицы #tbl_sysschedules по условию IsAdd=1. Затем удаляем таблицу #tbl_sysschedules, т к далее она нам больше не нужна.
Таким образом, выполнен перенос всех расписаний на сервер-получатель, которых нет в таблице #tbl_notentity из п.1 алгоритма.
5) перенести связку расписания-задания для перенесенных заданий:
Запрос
select js.*, ss.[schedule_uid], 0 as IsAdd into #tbl_jobschedules from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobschedules] as js inner join [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysschedules] as ss on js.[schedule_id]=ss.[schedule_id]; ;with src as ( select js.[job_id] ,js.[next_run_date] ,js.[next_run_time] ,ss.[schedule_uid] ,serv.[schedule_id] from [msdb].[dbo].[sysjobschedules] as js inner join [msdb].[dbo].[sysschedules] as ss on js.[schedule_id]=ss.[schedule_id] inner join [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysschedules] as serv on serv.[schedule_uid]=ss.[schedule_uid] where not exists ( select top(1) 1 from #tbl_notentity as t where t.[schedule_uid]=ss.[schedule_uid] ) ) merge #tbl_jobschedules as trg using src on trg.[job_id]=src.[job_id] and trg.[schedule_uid]=src.[schedule_uid] when not matched by target then INSERT ([schedule_id] ,[schedule_uid] ,[job_id] ,[next_run_date] ,[next_run_time] ,[IsAdd]) VALUES (src.[schedule_id] ,src.[schedule_uid] ,src.[job_id] ,src.[next_run_date] ,src.[next_run_time] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobschedules]([schedule_id] ,[job_id] ) select [schedule_id] ,[job_id] from #tbl_jobschedules where IsAdd=1; drop table #tbl_jobschedules;
Сначала собираем все имеющиеся связи расписания-задания на сервере-получателе в таблицу #tbl_jobschedules. Затем с помощью инструкции MERGE производим слияние по полям [job_id] и [schedule_uid] в эту таблицу всех недостающих связок с сервера-источника, которых нет в таблице #tbl_notentity из п.1 алгоритма. Вставленные строки помечаем как 1 в столбце IsAdd. И далее, добавляем все расписания в таблицу [msdb].[dbo].[sysjobschedules] сервера-получателя из таблицы #tbl_jobschedules по условию IsAdd=1. Затем удаляем таблицу #tbl_jobschedules, т к далее она нам больше не нужна.
Таким образом, выполнен перенос всех связок расписаний-заданий на сервер-получатель, которых нет в таблице #tbl_notentity из п.1 алгоритма.
6) перенести целевые сервера для перенесенных заданий:
Запрос
select *, 0 as IsAdd into #tbl_sysjobservers from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobservers]; ;with src as ( select * from [msdb].[dbo].[sysjobservers] as src where not exists ( select top(1) 1 from #tbl_notentity as t where t.[job_id]=src.[job_id] ) ) merge #tbl_sysjobservers as trg using src on trg.[job_id]=src.[job_id] and trg.[server_id]=src.[server_id] when not matched by target then INSERT ([job_id] ,[server_id] ,[last_run_outcome] ,[last_outcome_message] ,[last_run_date] ,[last_run_time] ,[last_run_duration] ,[IsAdd]) VALUES (src.[job_id] ,src.[server_id] ,src.[last_run_outcome] ,src.[last_outcome_message] ,src.[last_run_date] ,src.[last_run_time] ,src.[last_run_duration] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobservers]([job_id] ,[server_id] ,[last_run_outcome] ,[last_outcome_message] ,[last_run_date] ,[last_run_time] ,[last_run_duration]) select [job_id] ,[server_id] ,[last_run_outcome] ,[last_outcome_message] ,[last_run_date] ,[last_run_time] ,[last_run_duration] from #tbl_sysjobservers where IsAdd=1; drop table #tbl_sysjobservers; drop table #tbl_notentity;
Сначала собираем все имеющиеся связи задания-целевые сервера на сервере-получателе в таблицу #tbl_sysjobservers. Затем с помощью инструкции MERGE производим слияние по полям [job_id] и [server_id] в эту таблицу всех недостающих связок с сервера-источника, которых нет в таблице #tbl_notentity из п.1 алгоритма. Вставленные строки помечаем как 1 в столбце IsAdd. И далее, добавляем все связи в таблицу [msdb].[dbo].[sysjobservers] сервера-получателя из таблицы #tbl_sysjobservers по условию IsAdd=1. Затем удаляем таблицы #tbl_sysjobservers и #tbl_notentity, т к далее они нам больше не нужны.
Таким образом, выполнен перенос всех связок задания-целевые сервера на сервер-получатель, которых нет в таблице #tbl_notentity из п.1 алгоритма.
Важно отметить, что если в заданиях присутствуют целевые сервера, отличные от локального (т е идентификатор не равен нулю), то необходимо сначала перенести сами определения этих целевых серверов, а потом уже производить п.6 алгоритма.
7) регистрируем задания и активизируем их расписания, переведя в неактивный режим эти задания (выключением заданий)
8) назначаем владельца для всех перенесенных заданий (например, sa)
Запрос
declare @job_id uniqueidentifier; --делаем владельца новых заданий sa update sj set sj.[owner_sid]=0x01 from #tbl_jobs as t inner join [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobs] as sj on t.[job_id]=sj.[job_id] where [IsAdd]=1; while(exists(select top(1) 1 from #tbl_jobs where [IsAdd]=1)) begin select top(1) @job_id=[job_id] from #tbl_jobs where [IsAdd]=1; EXEC [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].sp_update_job @job_id=@job_id, @enabled=0 delete from #tbl_jobs where [job_id]=@job_id; end drop table #tbl_jobs;
Сначала всем перенесенным заданиям назначаем владельца sa (определяем перенесенные задания по таблице #tbl_jobs). Затем производим регистрацию каждого перенесенного задания и активизируем их расписания с помощью вызова системной хранимой процедуры [msdb].[dbo].sp_update_job на сервере-получателе для выключения перенесенных заданий. И далее, удаляем таблицу #tbl_jobs, т к больше она не нужна.
Таким образом, всем перенесенным заданиям назначен владелец sa, и все эти задания были зарегистрированы (и активированы их расписания) через их выключение.
Далее необходимые задания нужно включить скриптом или вручную.
Приведем код всего скрипта:
Запрос
--собираем те задания, которые переносить не нужно select ss.[schedule_uid] ,js.[job_id] into #tbl_notentity from [msdb].[dbo].[sysjobschedules] as js inner join [msdb].[dbo].[sysschedules] as ss on js.[schedule_id]=ss.[schedule_id] where [job_id] in ( ) --переносим задания select *, 0 as IsAdd into #tbl_jobs from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobs]; ;with src as ( select * from [msdb].[dbo].[sysjobs] as src where not exists ( select top(1) 1 from #tbl_notentity as t where t.[job_id]=src.[job_id] ) ) merge #tbl_jobs as trg using src on trg.[job_id]=src.[job_id] when not matched by target then INSERT ([job_id] ,[originating_server_id] ,[name] ,[enabled] ,[description] ,[start_step_id] ,[category_id] ,[owner_sid] ,[notify_level_eventlog] ,[notify_level_email] ,[notify_level_netsend] ,[notify_level_page] ,[notify_email_operator_id] ,[notify_netsend_operator_id] ,[notify_page_operator_id] ,[delete_level] ,[date_created] ,[date_modified] ,[version_number] ,[IsAdd]) VALUES (src.[job_id] ,src.[originating_server_id] ,src.[name] ,src.[enabled] ,src.[description] ,src.[start_step_id] ,src.[category_id] ,src.[owner_sid] ,src.[notify_level_eventlog] ,src.[notify_level_email] ,src.[notify_level_netsend] ,src.[notify_level_page] ,src.[notify_email_operator_id] ,src.[notify_netsend_operator_id] ,src.[notify_page_operator_id] ,src.[delete_level] ,src.[date_created] ,src.[date_modified] ,src.[version_number] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobs]([job_id] ,[originating_server_id] ,[name] ,[enabled] ,[description] ,[start_step_id] ,[category_id] ,[owner_sid] ,[notify_level_eventlog] ,[notify_level_email] ,[notify_level_netsend] ,[notify_level_page] ,[notify_email_operator_id] ,[notify_netsend_operator_id] ,[notify_page_operator_id] ,[delete_level] ,[date_created] ,[date_modified] ,[version_number]) select [job_id] ,[originating_server_id] ,[name] ,[enabled] ,[description] ,[start_step_id] ,[category_id] ,[owner_sid] ,[notify_level_eventlog] ,[notify_level_email] ,[notify_level_netsend] ,[notify_level_page] ,[notify_email_operator_id] ,[notify_netsend_operator_id] ,[notify_page_operator_id] ,[delete_level] ,[date_created] ,[date_modified] ,[version_number] from #tbl_jobs where IsAdd=1; --drop table #tbl_jobs; --переносим шаги заданий select *, 0 as IsAdd into #tbl_jobsteps from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobsteps]; ;with src as ( select * from [msdb].[dbo].[sysjobsteps] as src where not exists ( select top(1) 1 from #tbl_notentity as t where t.[job_id]=src.[job_id] ) ) merge #tbl_jobsteps as trg using src on trg.[job_id]=src.[job_id] and trg.[step_id]=src.[step_id] when not matched by target then INSERT ([job_id] ,[step_id] ,[step_name] ,[subsystem] ,[command] ,[flags] ,[additional_parameters] ,[cmdexec_success_code] ,[on_success_action] ,[on_success_step_id] ,[on_fail_action] ,[on_fail_step_id] ,[server] ,[database_name] ,[database_user_name] ,[retry_attempts] ,[retry_interval] ,[os_run_priority] ,[output_file_name] ,[last_run_outcome] ,[last_run_duration] ,[last_run_retries] ,[last_run_date] ,[last_run_time] ,[proxy_id] ,[step_uid] ,[IsAdd]) VALUES (src.[job_id] ,src.[step_id] ,src.[step_name] ,src.[subsystem] ,src.[command] ,src.[flags] ,src.[additional_parameters] ,src.[cmdexec_success_code] ,src.[on_success_action] ,src.[on_success_step_id] ,src.[on_fail_action] ,src.[on_fail_step_id] ,src.[server] ,src.[database_name] ,src.[database_user_name] ,src.[retry_attempts] ,src.[retry_interval] ,src.[os_run_priority] ,src.[output_file_name] ,src.[last_run_outcome] ,src.[last_run_duration] ,src.[last_run_retries] ,src.[last_run_date] ,src.[last_run_time] ,src.[proxy_id] ,src.[step_uid] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobsteps]([job_id] ,[step_id] ,[step_name] ,[subsystem] ,[command] ,[flags] ,[additional_parameters] ,[cmdexec_success_code] ,[on_success_action] ,[on_success_step_id] ,[on_fail_action] ,[on_fail_step_id] ,[server] ,[database_name] ,[database_user_name] ,[retry_attempts] ,[retry_interval] ,[os_run_priority] ,[output_file_name] ,[last_run_outcome] ,[last_run_duration] ,[last_run_retries] ,[last_run_date] ,[last_run_time] ,[proxy_id] ,[step_uid]) select [job_id] ,[step_id] ,[step_name] ,[subsystem] ,[command] ,[flags] ,[additional_parameters] ,[cmdexec_success_code] ,[on_success_action] ,[on_success_step_id] ,[on_fail_action] ,[on_fail_step_id] ,[server] ,[database_name] ,[database_user_name] ,[retry_attempts] ,[retry_interval] ,[os_run_priority] ,[output_file_name] ,[last_run_outcome] ,[last_run_duration] ,[last_run_retries] ,[last_run_date] ,[last_run_time] ,[proxy_id] ,[step_uid] from #tbl_jobsteps where IsAdd=1; drop table #tbl_jobsteps; --переносим расписания заданий select *, 0 as IsAdd into #tbl_sysschedules from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysschedules]; ;with src as ( select * from [msdb].[dbo].[sysschedules] as src where not exists ( select top(1) 1 from #tbl_notentity as t where t.[schedule_uid]=src.[schedule_uid] ) ) merge #tbl_sysschedules as trg using src on trg.[schedule_uid]=src.[schedule_uid] when not matched by target then INSERT ([schedule_id] ,[schedule_uid] ,[originating_server_id] ,[name] ,[owner_sid] ,[enabled] ,[freq_type] ,[freq_interval] ,[freq_subday_type] ,[freq_subday_interval] ,[freq_relative_interval] ,[freq_recurrence_factor] ,[active_start_date] ,[active_end_date] ,[active_start_time] ,[active_end_time] ,[date_created] ,[date_modified] ,[version_number] ,[IsAdd]) VALUES (src.[schedule_id] ,src.[schedule_uid] ,src.[originating_server_id] ,src.[name] ,src.[owner_sid] ,src.[enabled] ,src.[freq_type] ,src.[freq_interval] ,src.[freq_subday_type] ,src.[freq_subday_interval] ,src.[freq_relative_interval] ,src.[freq_recurrence_factor] ,src.[active_start_date] ,src.[active_end_date] ,src.[active_start_time] ,src.[active_end_time] ,src.[date_created] ,src.[date_modified] ,src.[version_number] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysschedules]([schedule_uid] ,[originating_server_id] ,[name] ,[owner_sid] ,[enabled] ,[freq_type] ,[freq_interval] ,[freq_subday_type] ,[freq_subday_interval] ,[freq_relative_interval] ,[freq_recurrence_factor] ,[active_start_date] ,[active_end_date] ,[active_start_time] ,[active_end_time] ,[date_created] ,[date_modified] ,[version_number]) select [schedule_uid] ,[originating_server_id] ,[name] ,[owner_sid] ,[enabled] ,[freq_type] ,[freq_interval] ,[freq_subday_type] ,[freq_subday_interval] ,[freq_relative_interval] ,[freq_recurrence_factor] ,[active_start_date] ,[active_end_date] ,[active_start_time] ,[active_end_time] ,[date_created] ,[date_modified] ,[version_number] from #tbl_sysschedules where IsAdd=1; drop table #tbl_sysschedules; --переносим связи между расписаниями и их заданиями select js.*, ss.[schedule_uid], 0 as IsAdd into #tbl_jobschedules from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobschedules] as js inner join [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysschedules] as ss on js.[schedule_id]=ss.[schedule_id]; ;with src as ( select js.[job_id] ,js.[next_run_date] ,js.[next_run_time] ,ss.[schedule_uid] ,serv.[schedule_id] from [msdb].[dbo].[sysjobschedules] as js inner join [msdb].[dbo].[sysschedules] as ss on js.[schedule_id]=ss.[schedule_id] inner join [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysschedules] as serv on serv.[schedule_uid]=ss.[schedule_uid] where not exists ( select top(1) 1 from #tbl_notentity as t where t.[schedule_uid]=ss.[schedule_uid] ) ) merge #tbl_jobschedules as trg using src on trg.[job_id]=src.[job_id] and trg.[schedule_uid]=src.[schedule_uid] when not matched by target then INSERT ([schedule_id] ,[schedule_uid] ,[job_id] ,[next_run_date] ,[next_run_time] ,[IsAdd]) VALUES (src.[schedule_id] ,src.[schedule_uid] ,src.[job_id] ,src.[next_run_date] ,src.[next_run_time] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobschedules]([schedule_id] ,[job_id] ) select [schedule_id] ,[job_id] from #tbl_jobschedules where IsAdd=1; drop table #tbl_jobschedules; --переносим целевые сервера select *, 0 as IsAdd into #tbl_sysjobservers from [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobservers]; ;with src as ( select * from [msdb].[dbo].[sysjobservers] as src where not exists ( select top(1) 1 from #tbl_notentity as t where t.[job_id]=src.[job_id] ) ) merge #tbl_sysjobservers as trg using src on trg.[job_id]=src.[job_id] and trg.[server_id]=src.[server_id] when not matched by target then INSERT ([job_id] ,[server_id] ,[last_run_outcome] ,[last_outcome_message] ,[last_run_date] ,[last_run_time] ,[last_run_duration] ,[IsAdd]) VALUES (src.[job_id] ,src.[server_id] ,src.[last_run_outcome] ,src.[last_outcome_message] ,src.[last_run_date] ,src.[last_run_time] ,src.[last_run_duration] ,1); insert into [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobservers]([job_id] ,[server_id] ,[last_run_outcome] ,[last_outcome_message] ,[last_run_date] ,[last_run_time] ,[last_run_duration]) select [job_id] ,[server_id] ,[last_run_outcome] ,[last_outcome_message] ,[last_run_date] ,[last_run_time] ,[last_run_duration] from #tbl_sysjobservers where IsAdd=1; drop table #tbl_sysjobservers; drop table #tbl_notentity; --регистрируем задания и активизируем их расписания, переведя в неактивный режим эти задания (выключение заданий) declare @job_id uniqueidentifier; --делаем владельца новых заданий sa update sj set sj.[owner_sid]=0x01 from #tbl_jobs as t inner join [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].[sysjobs] as sj on t.[job_id]=sj.[job_id] where [IsAdd]=1; while(exists(select top(1) 1 from #tbl_jobs where [IsAdd]=1)) begin select top(1) @job_id=[job_id] from #tbl_jobs where [IsAdd]=1; EXEC [СЕРВЕР-ПОЛУЧАТЕЛЬ].[msdb].[dbo].sp_update_job @job_id=@job_id, @enabled=0 delete from #tbl_jobs where [job_id]=@job_id; end drop table #tbl_jobs;
Результат
В данной статье был рассмотрен пример реализации T-SQL скрипта, который позволяет перенести задания и расписания Агента с одного экземпляра MS SQL Server на другой. Также данный подход можно реализовать и с помощью других средств. Например, PowerShell или C#.
Как перенести job с одного SQL сервера на другой

Перенос job’ов с одного SQL сервера на другой весьма распространенная задача, которая возникает в процессе смены серверов или обновления программного обеспечения. В этой статье мы рассмотрим пошаговую инструкцию по переносу job’ов с одного SQL сервера на другой.
Первым шагом необходимо создать резервную копию всех job’ов на исходном SQL сервере. Для этого мы можем использовать команду BACKUP JOB. При создании резервной копии job’ов, сохраняется информация о расписании выполнения, параметрах job’ов и других важных деталях.
Далее, необходимо подключиться к целевому SQL серверу и восстановить резервную копию job’ов с помощью команды RESTORE JOB. При восстановлении job’ов, все сохраненные настройки, расписание выполнения и другие параметры будут восстановлены.
Последним шагом является проверка работоспособности job’ов на новом SQL сервере. Для этого зайдите в редактор job’ов и убедитесь, что все job’ы успешно перенесены и готовы к выполнению.
Важно помнить, что при переносе job’ов могут возникнуть ситуации, связанные с различиями версий SQL серверов и настроек окружения. Поэтому, перед переносом job’ов, рекомендуется ознакомиться с документацией и провести тестирование на тестовом сервере.
Теперь вы знаете, как перенести job с одного SQL сервера на другой. Следуя этой пошаговой инструкции, вы сможете успешно перенести все job’ы и сохранить настройки и расписание выполнения.
Подготовка данных
Перед переносом job с одного SQL сервера на другой необходимо выполнить несколько подготовительных шагов, чтобы убедиться в целостности и правильности данных.
Вот некоторые ключевые действия, которые необходимо выполнить:
- Создание резервной копии базы данных: Перед внесением изменений в текущую базу данных, рекомендуется создать резервную копию для возможности восстановления данных в случае непредвиденных событий.
- Проверка прав доступа: Убедитесь, что у пользователя, который будет выполнять перенос job, есть необходимые права доступа к обоим SQL серверам.
- Идентификация всех job, которые нужно перенести: Определите список всех job, которые вы хотите перенести, и сделайте соответствующие пометки о каждом из них, чтобы не забыть ни одного задания.
- Экспорт информации о job: Выполните экспорт информации о каждом job, который вы хотите перенести. Это позволит вам иметь все необходимые данные о каждом задании для последующего переноса.
- Проверка наличия зависимостей: Проверьте, есть ли у заданий какие-либо зависимости от других объектов в базе данных, таких как таблицы, представления или функции. Если есть зависимости, убедитесь, что они будут учтены при переносе job.
После выполнения всех вышеперечисленных шагов вы будете готовы к переносу job с одного SQL сервера на другой. Перейдите к следующему этапу — «Перенос job».
Экспорт базы данных
Экспорт базы данных – процесс создания резервной копии данных из базы данных и сохранения их в файл. Это важная процедура, которая позволяет сохранить ценные данные и обеспечить их восстановление в случае сбоя или потери информации.
Существует несколько способов экспорта базы данных в SQL сервере:
- Использование команды BACKUP – SQL сервер предоставляет команду BACKUP, с помощью которой можно создать резервную копию базы данных. Команда BACKUP позволяет сохранить данные в формате бэкапа (.bak). Такой формат обеспечивает полное восстановление данных с сохранением структуры и содержимого.
- Использование экспортных инструментов – такие инструменты, как SQL Server Management Studio (SSMS) и SQL Server Import and Export Wizard, предоставляют графический интерфейс для экспорта базы данных. Они позволяют выбрать нужные таблицы, установить фильтры и сохранить данные в различных форматах, например, .csv или .xlsx.
Рассмотрим процесс экспорта базы данных с помощью команды BACKUP:
- Откройте SQL Server Management Studio и подключитесь к серверу, на котором находится база данных, которую вы хотите экспортировать.
- Выберите нужную базу данных в Object Explorer.
- Щелкните правой кнопкой мыши на базе данных и выберите пункт «Tasks» в контекстном меню, а затем «Backup».
- В открывшемся окне «Backup Database» выберите тип резервной копии и задайте имя и расположение файла бэкапа.
- Установите необходимые параметры резервной копии, такие как сжатие данных или шифрование.
- Нажмите кнопку «OK», чтобы начать процесс создания резервной копии базы данных.
После завершения процесса создания резервной копии вы получите файл с расширением .bak, который можно использовать для восстановления данных на другом SQL сервере.
Запомните, что экспорт базы данных – это важная часть ее управления. Регулярные резервные копии позволят вам сохранить данные и обеспечить их восстановление в случае необходимости.
Создание новой базы данных
Перед тем, как перенести job с одного SQL сервера на другой, необходимо создать новую базу данных на втором сервере. Для этого выполни следующие шаги:
- Открой SQL Server Management Studio (SSMS) и подключись к серверу, на котором необходимо создать новую базу данных.
- Щелкни правой кнопкой мыши на папке «Базы данных» и выбери в контекстном меню пункт «Создать новую базу данных».
- В появившемся окне «Создание новой базы данных» введи имя новой базы данных в поле «Имя базы данных».
- Опционально, можешь изменить путь для хранения данных базы данных, указав новое расположение в поле «Имя файла базы данных». По умолчанию, база данных будет создана в папке по умолчанию для SQL Server.
- Щелкни на кнопке «ОК», чтобы создать новую базу данных.
Теперь у тебя есть новая база данных, в которой можно создавать и настраивать job’ы для выполнения запланированных задач. Далее можно переходить к процессу переноса job’а с одного сервера на другой.
Импорт данных
Для успешного переноса работы с одного SQL-сервера на другой, необходимо импортировать данные из исходной базы данных на новый сервер. Ниже представлена пошаговая инструкция, как выполнить эту операцию:
- Составьте полный список всех таблиц, представлений и хранимых процедур, которые необходимо импортировать. Это поможет вам при обзоре всех объектов, которые требуется переместить.
- Создайте целевую базу данных на новом SQL-сервере. Убедитесь, что она имеет необходимую структуру, т.е. таблицы, представления, обязательные индексы и ограничения, которые существуют в исходной базе данных.
- На новом сервере откройте SQL Server Management Studio (SSMS) и подключитесь к целевой базе данных.
- Используйте Import and Export Wizard (Мастер импорта и экспорта) для импорта данных. Этот инструмент обеспечивает интуитивно понятный интерфейс для перемещения данных между разными серверами и форматами файлов.
- Введите исходные данные для подключения к исходной базе данных, включая адрес сервера, имя пользователя, пароль и имя базы данных.
- Выберите объекты, которые вы хотите импортировать, включая таблицы, представления и хранимые процедуры, с использованием предоставленного графического интерфейса.
- Выберите целевую таблицу (или создайте новую) для каждого выбранного объекта.
- Настройте сопоставление полей между исходными и целевыми таблицами.
- Подтвердите параметры импорта и начните процесс перемещения данных. Проверьте результаты, чтобы убедиться, что импорт данных прошел успешно.
- При необходимости повторите процесс для других объектов, которые также требуется импортировать.
В результате этих шагов вы успешно импортируете данные с одного SQL-сервера на другой. Убедитесь, что все результирующие данные соответствуют ожидаемым результатам и корректно отображаются на новом сервере.
Вопрос-ответ
Как перенести job с одного SQL сервера на другой?
Перенос job с одного SQL сервера на другой можно выполнить следующими шагами:
Какой SQL командой можно экспортировать job?
Для экспорта job существует команда sp_add_job, которая позволяет создать его на новом сервере.
Какую информацию необходимо знать перед переносом job?
Перед переносом job необходимо знать его имя, расписание выполнения, скрипты, которые он выполняет, а также используемые ресурсы и зависимости.
Что делать, если job использует Linked Server?
Если job использует Linked Server, необходимо убедиться, что Linked Server на новом сервере настроен и настроены нужные учетные данные для доступа к удаленному серверу.