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 / 问题 / 152500
Accepted
James Rhoat
James Rhoat
Asked: 2016-10-18 07:29:16 +0800 CST2016-10-18 07:29:16 +0800 CST 2016-10-18 07:29:16 +0800 CST

设置警报以监控备份数据库的位置/时间

  • 772

我正在阅读谁在备份该数据库?由 Kendra little 撰写,特别是“如果备份成功,您可以尝试另一个技巧”部分。

我一直在研究监控我的数据库,以便在数据库备份到我的备份路径之外的另一个位置时发送电子邮件。到目前为止,我想出的是设置一个每 5 分钟触发一次的作业,其中包含以下脚本:

BEGIN
IF (SELECT COUNT (bmf.physical_device_name)
FROM [msdb].[dbo].[backupset] bs inner join [msdb].[dbo].[backupmediafamily] bmf
on bs.media_set_id = bmf.media_set_id
where bs.[database_name] = 'logbackuptest'
and bmf.physical_device_name not like 'D:\backups\%') > 0

EXEC msdb.dbo.sp_send_dbmail  
    @profile_name = 'DBA Profile',  
    @recipients = '[email protected]',  
    @body = 'The database was backed up to a different location',  
    @subject = 'A database was backed up to a different location' ; 
END

还有其他人有好的博客文章或任何其他想法吗?我不会在我不知情的情况下在非默认位置进行备份;这个问题纯粹是学术性的。

sql-server backup
  • 2 2 个回答
  • 299 Views

2 个回答

  • Voted
  1. Best Answer
    Scott Hodgin - Retired
    2016-10-29T03:52:39+08:002016-10-29T03:52:39+08:00

    您可以使用BackupRestore Event Notification 来监视备份事件,此解决方案甚至适用于 Sql Express(Sql 代理不存在)。此链接向您展示了如何为 SQL Server Express 设置 SQL Mail。

    我创建了一个名为 Test 的数据库。

    我从跟踪自动增长的 Jonathan Kehayias 修改了这个示例,改为审计备份/恢复事件。

    这是我从乔纳森的例子中调整而来的例子:

    -- Using msdb prevents the need for certificate signing the 
    -- activation procedure to execute sp_send_dbmail across
    -- databases
    USE [msdb];
    GO
    
    -- Drop the notification if it exists
    IF EXISTS (
            SELECT *
            FROM sys.server_event_notifications
            WHERE NAME = N'CaptureDatabaseBackupEvent'
            )
    BEGIN
        DROP EVENT NOTIFICATION CaptureDatabaseBackupEvent ON SERVER;
    END
    
    -- Drop the route if it exists
    IF EXISTS (
            SELECT *
            FROM sys.routes
            WHERE NAME = N'DatabaseBackupEventRoute'
            )
    BEGIN
        DROP ROUTE DatabaseBackupEventRoute;
    END
    
    -- Drop the service if it exists
    IF EXISTS (
            SELECT *
            FROM sys.services
            WHERE NAME = N'DatabaseBackupEventService'
            )
    BEGIN
        DROP SERVICE DatabaseBackupEventService;
    END
    
    -- Drop the queue if it exists
    IF EXISTS (
            SELECT *
            FROM sys.service_queues
            WHERE NAME = N'DatabaseBackupEventQueue'
            )
    BEGIN
        DROP QUEUE DatabaseBackupEventQueue;
    END
    
    --  Create a service broker queue to hold the events
    CREATE QUEUE [DatabaseBackupEventQueue]
        WITH STATUS = ON;
    GO
    
    --  Create a service broker service receive the events
    CREATE SERVICE [DatabaseBackupEventService] ON QUEUE [DatabaseBackupEventQueue] ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
    GO
    
    -- Create a service broker route to the service
    CREATE ROUTE [DatabaseBackupEventRoute]
        WITH SERVICE_NAME = 'DatabaseBackupEventService'
            ,ADDRESS = 'LOCAL';
    GO
    
    -- Create the event notification to capture the events
    CREATE EVENT NOTIFICATION [CaptureDatabaseBackupEvent] ON SERVER
        WITH FAN_IN
    FOR AUDIT_BACKUP_RESTORE_EVENT TO SERVICE 'DatabaseBackupEventService'
        ,'current database';
    GO
    
    --  Alter the queue to use the activation procedure
    ALTER QUEUE [DatabaseBackupEventQueue]
       WITH STATUS=ON, 
          ACTIVATION 
             (STATUS=ON,
              PROCEDURE_NAME = [ProcessDatabaseBackupEvents],
              MAX_QUEUE_READERS = 1,
              EXECUTE AS OWNER);
    GO
    

    然后我调整了他使用事件的示例存储过程。

    确保将存储过程中的这一行更改为您的电子邮件地址

    @recipients = '你的邮箱地址'

    DROP PROCEDURE [dbo].[ProcessDatabaseBackupEvents];
    GO
    
    CREATE PROCEDURE [dbo].[ProcessDatabaseBackupEvents]
        WITH EXECUTE AS OWNER
    AS
    DECLARE @message_body XML;
    DECLARE @message_sequence_number INT;
    DECLARE @dialog UNIQUEIDENTIFIER;
    DECLARE @email_message NVARCHAR(MAX);
    
    WHILE (1 = 1)
    BEGIN
        BEGIN TRANSACTION;
    
        -- Receive the next available message FROM the queue
        WAITFOR (
                RECEIVE TOP (1) -- just handle one message at a time
                @message_body = CAST(message_body AS XML) FROM dbo.DatabaseBackupEventQueue
                )
            ,TIMEOUT 1000;-- if queue empty for 1 sec, give UPDATE AND GO away
    
        -- If we didn't get anything, bail out
        IF (@@ROWCOUNT = 0)
        BEGIN
            ROLLBACK TRANSACTION;
    
            BREAK;
        END
    
        DECLARE @EventType VARCHAR(128);
        DECLARE @ServerName VARCHAR(128);
        DECLARE @PostTime VARCHAR(128);
        DECLARE @DatabaseName VARCHAR(128);
        DECLARE @TextData VARCHAR(max);
        DECLARE @GrowthPages INT;
    
        SELECT @EventType = @message_body.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(128)')
            ,@TextData = @message_body.value('(/EVENT_INSTANCE/TextData)[1]', 'varchar(128)')
            ,@ServerName = @message_body.value('(/EVENT_INSTANCE/ServerName)[1]', 'varchar(128)')
            ,@PostTime = CAST(@message_body.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime') AS VARCHAR)
            ,@DatabaseName = @message_body.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(128)');
    
        -- Generate formatted email message
        SELECT @email_message = 'The following DatabaseBackup event                                      occurred:' + CHAR(10) + CAST('ServerName: ' AS CHAR(25)) + @ServerName + CHAR(10) + CAST('PostTime: ' AS CHAR(25)) + @PostTime + CHAR(10) + CAST('DatabaseName: ' AS CHAR(25)) + @DatabaseName + @TextData
    
        -- Send email using Database Mail
        EXEC msdb.dbo.sp_send_dbmail @profile_name = 'SqlServerEmailProfile'
            ,
            -- your defined email profile 
            @recipients = 'YourEmailAddress'
            ,-- your email
            @subject = 'DatabaseBackup Event Notification'
            ,@body = @email_message;
    
        --  Commit the transaction.  At any point before this, we could roll 
        --  back. The received message would be back on the queue AND the 
        --  response wouldn't be sent.
        COMMIT TRANSACTION;
    END
    GO
    

    然后,我运行了一个简单的备份

    BACKUP DATABASE [Test] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\test.bak'
    WITH NOFORMAT
        ,INIT
        ,NAME = N'Test-Full Database Backup'
        ,SKIP
        ,NOREWIND
        ,NOUNLOAD
        ,STATS = 10
    GO
    

    大约一分钟后,我收到了包含事件数据的电子邮件。您可以修改使用事件的存储过程以捕获您需要的任何信息并在电子邮件中发送该信息。

    • 3
  2. Andy Jones
    2016-11-02T08:55:21+08:002016-11-02T08:55:21+08:00
    • 如果应用了 SQL Server跟踪标志-3226,请将其关闭。我通常建议打开 3226,这样所有成功的备份都不会写入 SQL Server 日志。然而,在这种情况下,这就是我们想要的行为
    • 通过 SQL Agent 或 Windows Scheduler 安排以下 PowerShell:

    获取 SqlErrorLog -ServerInstance 'YourInstanceName' | ?{ ($ .Text -match '数据库备份' -and $ .Text -notmatch 'D:\\')}

    • 双 \\ 对上面的工作很重要
    • 将 PoSh 输出通过管道发送给感兴趣的各方
    • 0

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

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

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 4 个回答
  • 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
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • 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
    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