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 / 问题 / 318405
Accepted
MSKH
MSKH
Asked: 2022-10-20 05:13:14 +0800 CST2022-10-20 05:13:14 +0800 CST 2022-10-20 05:13:14 +0800 CST

根据从另一个表获得的状态备份数据库的策略

  • 772

我正在寻找一种基于数据库表中存储的状态备份数据库的解决方案(非活动数据库也保持在线),即使用获取活动数据库的状态

SELECT dbName from DBMain.TableWithDatabaseStatus where activeStatus=1

并且仅对这些数据库的结果执行完整/差异/事务性备份,例如,如果不存在最近的备份,则执行完整备份,否则执行差异和增量备份。

我目前正在查看Ola Halengren 的维护解决方案,在那里我找到了一个不错的选项 @ChangeBackupType = 'Y' -> 如果不存在完整备份,请先使用它。查询是这样的..

EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'LOG',
@ChangeBackupType = 'Y'

但是有没有一种方法可以在运行备份脚本之前在 -> @Databases = 'USER_DATABASES' 中手动添加/更新数据库名称(基于使用 activeStatus 的查询结果)?

主要目标是

  • 在周末对所有活动数据库进行完整备份
  • 在工作日执行 diff 和 transactional
  • 如果一个新的数据库在周末不活动,则该数据库变为活动状态,请对该数据库进行完整备份,并按正常程序检查其余数据库。

ADBA 在这里,所以对 Ola halengren 的脚本的任何指示或帮助表示赞赏!

backup
  • 1 1 个回答
  • 40 Views

1 个回答

  • Voted
  1. Best Answer
    Jonathan Fite
    2022-10-20T06:25:13+08:002022-10-20T06:25:13+08:00

    这很容易实现,你只需要一个 Ola 脚本的包装器来实现你的逻辑,它应该很好。

    这是执行此操作的示例方法,如脚本所示,这将对任何处于活动状态的数据库进行 LOG 备份(我使用了一个临时表,#TableStatus)。

    要完全实现您的逻辑,您将需要四个作业来运行这个带有变体的脚本。

    • 周末运行的一项作业,对任何
      具有活动标志的数据库进行完整备份。

    • 在一周内运行的一项作业(无论您想要什么时间间隔),
      它对具有活动标志的任何数据库进行 DIFF 备份。

    • 在一周内(以所需的时间间隔)运行的一项作业,它对具有活动标志的任何数据库进行 LOG 备份。

    • 以不同间隔运行以捕获
      标记为活动的任何新(或重新激活)数据库的作业。这个
      有点棘手。

    您需要一种方法来跟踪数据库何时变为“活动”以及是否对其进行了完整备份。您可以通过多种不同的方式做到这一点,其中一些方式比其他方式更免维护。我做了最简单的方法,添加了一个字段“FullBackupTaken”,当数据库 ActiveStatus 设置为 1 时,它应该设置为 NULL。然后你需要一个对任何具有 FullBackupTaken 为 NULL 的活动数据库执行完整备份的作业。

    更复杂的方法可能有一个“DateMadeActive”,然后您可以深入到 msdb 表中查看是否已为它获取 FULL。

    DROP TABLE IF EXISTS #TableStatus 
    
    CREATE TABLE #TableStatus
        (
        DatabaseName NVARCHAR(200) NOT NULL
        , ActiveStatus INT NOT NULL
        , FULLBackupTaken DATETIME2(7) NULL
        )
    
    /** Specify desired backup type here, LOG, FULL, DIFF **/
    DECLARE @BackupType NVARCHAR(20) = N'LOG'
    
    DECLARE @BackupDirectory NVARCHAR(512) = 'C:\backup'
    
    DECLARE @ChangeBackupType NCHAR(1) = N'Y'
    
    DECLARE @DatabaseName NVARCHAR(200)
    
    DECLARE curDBLoop CURSOR LOCAL STATIC FORWARD_ONLY
    FOR (   SELECT T.DatabaseName 
            FROM #TableStatus AS T
                INNER JOIN sys.databases AS D ON D.[name] = T.DatabaseName 
                       AND D.state_desc = N'ONLINE'
                      WHERE T.ActiveStatus = 1
            )
    
    OPEN curDBLoop 
    
    FETCH NEXT FROM curDBLoop
    INTO @DatabaseName
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
        PRINT 'Taking backup of ' + COALESCE(@DatabaseName, '??')
    
        EXEC dbo.DatabaseBackup @Databases = @DatabaseName, 
                                @Directory = @BackupDirectory, 
                                @BackupType = @BackupType, 
                                @ChangeBackupType = @ChangeBackupType;
    
        IF @BackupType = N'FULL'
        BEGIN
            UPDATE #TableStatus
            SET FULLBackupTaken = SYSUTCDATETIME()
        END
    
        FETCH NEXT FROM curDBLoop
        INTO @DatabaseName
    
    END
    
    CLOSE curDBLoop 
    DEALLOCATE curDBLoop
    
    • 0

相关问题

  • SQL Server 备份策略的优缺点及其合适的使用场景

  • 更改了 max_allowed_pa​​cket 并仍然收到“数据包太大”错误

  • SQL Server Express 的任务计划程序

  • 我可以在使用数据库后激活 PITR 吗?

  • 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