热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

作业迁移

背景:数据库服务器更换,1、数据库迁移(BACKUPRESTORE);2、数据库登录名用户迁移(注意孤立用户);3、作业迁移数据库迁移,备份数据库、拷贝备份文件到新服务器,还原数据

背景:数据库服务器更换,1、数据库迁移(BACKUP/RESTORE);2、数据库登录名/用户迁移(注意孤立用户);3、作业迁移
数据库迁移,备份数据库、拷贝备份文件到新服务器,还原数据库

技术分享技术分享
--还原示例
USE [master]
RESTORE DATABASE [DBA_Monitor] FROM  DISK = ND:\rsyncroot\PLAY_DBA_Monitor_F_20150630_1.bak 
WITH  FILE = 1
,  MOVE NDBA_Monitor TO ND:\LoveGame\Data\DBA_Monitor\DBA_Monitor.mdf
,  MOVE NDBA_Monitor_log TO ND:\LoveGame\Data\DBA_Monitor\DBA_Monitor_log.ldf
,  NOUNLOAD,  REPLACE,  STATS = 5
GO
View Code

数据库登录名迁移,新实例中创建同名数据库登录名,待数据库还原后,使用以下语句处理孤立用户

技术分享技术分享
--孤立用户
USE DBA_Monitor
GO
exec sp_change_users_login REPORT
exec sp_change_users_login UPDATE_ONE,用户名,登录名--更新库下用户的sid成登录名的sid
GO
View Code

创建数据库登录名时带上sid可避免孤立用户的产生。
作业迁移,如果数据库版本与原数据库版本保持一致,则可直接还原msdb数据库;如果数据库版本不一致,且迁移的作业比较多,可使用以下语句进行迁移

技术分享技术分享
/******************************************************************
【概要说明】
    <创建时间>    2015/6/8 11:14
    <中文名称>    作业迁移
    <功能说明>    通过insert、update语句导入作业信息,目的是将实例A中的作业迁移到实例B中
    <调用方式>    手动执行
    <执行说明>    先决条件:还原前请先备份两边的msdb数据库,将实例A中的msdb还原到实例B的msdbnew
                 出错处理:如果出错,请还原原备份文件
                 注意事项:此代码适用用于数据库版本不一致,且迁移的作业比较多的情况;如果版本号相同,可直接还原数据库
【修订记录】
-------------------------------------------------------------------
    <2015/6/8 11:14>  : 创建
******************************************************************/
--作业Job
insert into [msdb].[dbo].[sysjobs]
SELECT a.[job_id]
      ,a.[originating_server_id]
      ,109Job_+a.[name]--作业名称加前缀区分
      ,a.[enabled]
      ,a.[description]
      ,a.[start_step_id]
      ,a.[category_id]
      ,suser_sid()--将所有者更新为当前登录用户
      ,a.[notify_level_eventlog]
      ,a.[notify_level_email]
      ,a.[notify_level_netsend]
      ,a.[notify_level_page]
      ,a.[notify_email_operator_id]
      ,a.[notify_netsend_operator_id]
      ,a.[notify_page_operator_id]
      ,a.[delete_level]
      ,a.[date_created]
      ,a.[date_modified]
      ,a.[version_number]
  FROM [msdbnew].[dbo].[sysjobs] a
  left join [msdb].[dbo].[sysjobs] b
  on a.job_id=b.job_id
  where a.enabled=1
  and b.job_id is null
order by date_created
go
--步骤jobsteps
insert into [msdb].[dbo].[sysjobsteps]
SELECT a.[job_id]
      ,a.[step_id]
      ,a.[step_name]
      ,a.[subsystem]
      ,a.[command]
      ,a.[flags]
      ,a.[additional_parameters]
      ,a.[cmdexec_success_code]
      ,a.[on_success_action]
      ,a.[on_success_step_id]
      ,a.[on_fail_action]
      ,a.[on_fail_step_id]
      ,a.[server]
      ,a.[database_name]
      ,a.[database_user_name]
      ,a.[retry_attempts]
      ,a.[retry_interval]
      ,a.[os_run_priority]
      ,a.[output_file_name]
      ,a.[last_run_outcome]
      ,a.[last_run_duration]
      ,a.[last_run_retries]
      ,a.[last_run_date]
      ,a.[last_run_time]
      ,a.[proxy_id]
      ,a.[step_uid]
  FROM [msdbnew].[dbo].[sysjobsteps] a
  inner join [msdb].[dbo].[sysjobs] b
  on a.job_id=b.job_id
  left join [msdb].[dbo].[sysjobsteps] c
  on a.job_id=c.job_id
  where c.job_id is null
go
--调度schedules
insert into [msdb].[dbo].[sysschedules]
SELECT a.[schedule_uid]
      ,a.[originating_server_id]
      ,a.[name]
      ,suser_sid()--将所有者更新为当前登录用户
      ,a.[enabled]
      ,a.[freq_type]
      ,a.[freq_interval]
      ,a.[freq_subday_type]
      ,a.[freq_subday_interval]
      ,a.[freq_relative_interval]
      ,a.[freq_recurrence_factor]
      ,a.[active_start_date]
      ,a.[active_end_date]
      ,a.[active_start_time]
      ,a.[active_end_time]
      ,a.[date_created]
      ,a.[date_modified]
      ,a.[version_number]
  FROM [msdbnew].[dbo].[sysschedules] a
  inner join [msdbnew].[dbo].[sysjobschedules] b
  on a.schedule_id=b.schedule_id
  inner join [msdb].[dbo].[sysjobs] c
  on b.job_id=c.job_id
  left join [msdb].[dbo].[sysschedules] d
  on a.schedule_uid=d.schedule_uid
  where d.schedule_uid is null
go
--关联job_id和schedule_id
insert into [msdb].[dbo].[sysjobschedules]
SELECT c.schedule_id
      ,a.[job_id]
      ,a.[next_run_date]
      ,a.[next_run_time]
  FROM [msdbnew].[dbo].[sysjobschedules] a
  inner join [msdbnew].[dbo].[sysschedules] b
  on a.schedule_id=b.schedule_id
  inner join [msdb].[dbo].[sysschedules] c
  on b.schedule_uid=c.schedule_uid
  left join [msdb].[dbo].[sysjobschedules] d
  on a.job_id=d.job_id
  where d.job_id is null
go
--指定目标服务器
insert into [msdb].[dbo].[sysjobservers]
SELECT a.[job_id]
      ,a.[server_id]
      ,a.[last_run_outcome]
      ,a.[last_outcome_message]
      ,a.[last_run_date]
      ,a.[last_run_time]
      ,a.[last_run_duration]
  FROM [msdbnew].[dbo].[sysjobservers] a
  inner join [msdb].[dbo].[sysjobs] b
  on a.job_id=b.job_id
  left join [msdb].[dbo].[sysjobservers] c
  on a.job_id=c.job_id
  where c.job_id is null
go

/********如果对作业的所有者有特殊要求,参考下面代码进行修改********/
--Start
--原实例下获取作业所有者
select sj.name,sj.date_created,sj.date_modified,ssp.name OwnName,sj.owner_sid
from msdb.dbo.sysjobs sj
inner join sys.server_principals ssp
on sj.owner_sid=ssp.sid
where ssp.name=USER_JOB
order by sj.name

--新实例下更新需要修改的所有者
update msdb.dbo.sysjobs 
set owner_sid=suser_sid(user_job)
where job_id in(
select job_id from msdbnew.dbo.sysjobs
where owner_sid=convert(varbinary,0x047EC52E6005D241932C0DC5F0827615))--原作业所有者

update [msdb].[dbo].[sysschedules]
set owner_sid=suser_sid(user_job)
where schedule_id in(
select schedule_id from [msdbnew].[dbo].[sysschedules]
where owner_sid=convert(varbinary,0x047EC52E6005D241932C0DC5F0827615))--原作业所有者
--End

--上面操作完成后,作业并不会按计划执行作业。可用下面方式中的任意一种使作业按计划运行
--1重启代理服务;2禁用作业再启用作业;3修改并保存作业
--应该可以直接执行某个语句(暂时没找到)
View Code

如果创建数据库登录名时指定了sid,则以此登录名为所有者的作业对应的[sysjobs]、[sysschedules]表中的owner_sid可以直接从原表获取。

作业迁移


推荐阅读
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
author-avatar
手机用户2502917141
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有