首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于从另一个表获得的数据库状态备份数据库的策略

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

Database Administration用户
提问于 2022-10-19 13:13:14
回答 1查看 44关注 0票数 0

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

代码语言:javascript
运行
复制
SELECT dbName from DBMain.TableWithDatabaseStatus where activeStatus=1

并且只对这些数据库的结果执行完整/ diff /事务性备份,例如,如果没有最近的备份,则执行完全备份,否则执行diff和增量备份。

目前,我正在研究Ola的维护解决方案,在这里我找到了一个很好的选项@ChangeBackupType = 'Y‘->,如果不存在完全备份,请先考虑这个选项。查询是这样的。

代码语言:javascript
运行
复制
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'LOG',
@ChangeBackupType = 'Y'

但是,在运行备份脚本之前,我是否可以在activeStatus@ -> = 'USER_DATABASES‘中手动添加/更新DB名称(基于->查询的结果)?

主要目标是

  • 周末对所有活动的DBs进行完全备份。
  • 在工作日执行diff和事务性操作
  • 如果一个新DB在周末没有激活,则对该DB进行完全备份,并在正常例程中遍历其余的DB。

ADBA在这里,所以任何指点或帮助Ola halengren的脚本是非常感谢的!

EN

回答 1

Database Administration用户

回答已采纳

发布于 2022-10-19 14:25:13

这是非常简单的,您只需要为Ola的脚本编写一个包装器来实现您的逻辑,它应该是好的。

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

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

  • 周末运行的作业之一是对任何具有活动标志的数据库进行完全备份。
  • 一项在一周内运行的作业(无论您想要什么时间间隔),会对任何具有活动标志的数据库进行不同的备份。
  • 一项在一周内运行的作业(以所需的间隔运行),它对任何具有活动标志的数据库进行日志备份。
  • 以不同时间间隔运行的作业,以捕获标记为Active的任何新数据库(或重新激活)。这一个让a变得有点棘手。

您需要一种方法来跟踪数据库何时“激活”,以及是否已经对数据库进行了完全备份。你可以用很多不同的方式来做这件事,有些比其他的更免费。我做了最简单的工作,添加了一个字段" FullBackupTaken ",当数据库ActiveStatus设置为1时,应该将其设置为NULL。然后,您需要对任何具有FullBackupTaken为NULL的活动数据库执行完整备份。

一种更复杂的方法可能有一个"DateMadeActive“,然后您可以深入到msdb表,看看是否已经为它取满了。

代码语言:javascript
运行
复制
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
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/318405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档