AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 49006
Accepted
paulH
paulH
Asked: 2013-08-31 02:54:29 +0800 CST2013-08-31 02:54:29 +0800 CST 2013-08-31 02:54:29 +0800 CST

检查是否正在手动执行 SQL 代理作业

  • 772

我有一个执行数据库备份的存储过程。因为我正在查看 SQL Server 2012 中的可用性组,所以我想利用该脚本中的 *sys.fn_hadr_backup_is_preferred_replica* 函数来测试脚本是否应该生成备份。

如果脚本是手动运行而不是作为计划的 SQL 代理作业的一部分,或者如果 SQL 代理作业是手动执行而不是通过计划执行,那么我希望作业失败并显示错误消息以允许用户看到由于不在首选副本上,备份未成功。如果作业按计划运行,那么我显然不希望它失败,因为它会产生错误并整天在不是首选副本的服务器上发送警报。

我不知道该怎么做的唯一一点是检查作业是按计划执行还是手动执行。这可能吗?

如果做不到这一点,有没有其他方法可以提醒用户脚本没有生成备份,同时不会导致计划任务失败并产生警报?

sql-server-2012 availability-groups
  • 3 3 个回答
  • 6614 Views

3 个回答

  • Voted
  1. Best Answer
    paulH
    2013-08-31T07:27:30+08:002013-08-31T07:27:30+08:00

    使用 Kenneth 的代码以及我整理的其他一些零碎的代码,我想出了以下代码,我认为它应该可以完成这项工作。如果有人对此有任何潜在问题,我会很想知道!

    -- Check if this server is the preferred replica for backups.
        If sys.fn_hadr_backup_is_preferred_replica( @DatabaseName ) <> 1
        BEGIN
    
            -- Check whether the script is running from SQL Agent.  If it is not then raise an error so that the user knows that the backup hasn't completed.
            -- (If the job is run from the agent then there should be an equivalent job running on the preferred replica, so no need to alert).
            declare @AgentAccount varchar(100)
            set @AgentAccount = (select cast(value_data as varchar(100)) as [AccountName]
                                    FROM sys.dm_server_registry
                                    WHERE registry_key LIKE '%SQLSERVERAGENT%' --For named instance change to SQLAgent$<instanceName>
                                    AND value_name = 'ObjectName'
                                )
    
    
            if @AgentAccount = SYSTEM_USER
            begin
    
                declare @jobSource tinyint
                SELECT  @jobSource = ja.run_requested_source
                        --WHEN 1 THEN 'SOURCE_SCHEDULER'
                        --WHEN 2 THEN 'SOURCE_ALERTER'
                        --WHEN 3 THEN 'SOURCE_BOOT'
                        --WHEN 4 THEN 'SOURCE_USER'  -- This one is manual
                        --WHEN 6 THEN 'SOURCE_ON_IDLE_SCHEDULE'
                        --ELSE 'UNKNOWN' END
                FROM msdb.dbo.sysjobactivity ja
                WHERE ja.session_id = @@SPID
                AND start_execution_date is not null
                AND stop_execution_date is null;
    
                if @jobSource = 4   -- Job was run manually.
                begin
                    RAISERROR ('No backup produced as this server is not the preferred replica for backups.  Please run the script again from the preferred replica.', 16, 1)
                    return 1
                end
                else
                begin
                    print 'No backup produced as this server is not the preferred replica for backups.'
                    return 0
                end
            end
            else
            begin
                RAISERROR ('No backup produced as this server is not the preferred replica for backups.  Please run the script again from the preferred replica.', 16, 1)
                return 1
            end
        END
    
    • 2
  2. Kenneth Fisher
    2013-08-31T04:30:18+08:002013-08-31T04:30:18+08:00

    这是你的一个开始。

    SELECT j.name as jobname, 
        CASE ja.run_requested_source
            WHEN 1 THEN 'SOURCE_SCHEDULER'
            WHEN 2 THEN 'SOURCE_ALERTER'
            WHEN 3 THEN 'SOURCE_BOOT'
            WHEN 4 THEN 'SOURCE_USER'  -- This one is manual
            WHEN 6 THEN 'SOURCE_ON_IDLE_SCHEDULE'
            ELSE 'UNKNOWN' END AS job_source
    FROM msdb.dbo.sysjobactivity ja
    JOIN msdb.dbo.sysjobs j
        ON ja.job_id = j.job_id
    WHERE ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC)
    AND start_execution_date is not null
    AND stop_execution_date is null;
    

    这应该为您提供所有当前正在运行的作业的列表以及启动该作业的源。

    • 1
  3. Kin Shah
    2013-08-31T07:29:42+08:002013-08-31T07:29:42+08:00

    如果脚本是手动运行而不是作为计划的 SQL 代理作业的一部分,或者如果 SQL 代理作业是手动执行而不是通过计划执行,那么我希望作业失败并显示错误消息以允许用户看到由于不在首选副本上,备份未成功。如果作业按计划运行,那么我显然不希望它失败,因为它会产生错误并整天在不是首选副本的服务器上发送警报。

    我认为没有必要过度复杂化。

    只需测试它是否是首选副本,然后进行备份。

    declare @DBNAME sysname
    set @DBNAME = 'mydatabaseName'
    
    IF  sys.fn_hadr_backup_is_preferred_replica(@DBNAME) <> 1
    BEGIN
          print 'This is not the preferred replica, exiting with success';
          RETURN 0 -- This is a normal, expected condition, so the script returns success
    END
    else
    begin
    print 'The is the the preferred replica ... moving further ....'
    BACKUP DATABASE @DBNAME TO DISK='D:\backups\dbname_full.bak'
       -- WITH COPY_ONLY
    end
    
    • 1

相关问题

  • SQL Server 2012 在 TempDb 中使用排序创建索引 - 获得 False?

  • SQL Server AlwaysOn 故障转移透明度

  • 为什么 Denali 序列应该比标识列表现更好?

  • SQL Server 不应该支持范围吗?

  • 什么是 SQL Server“德纳利”?什么是新的?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve