将多个数据库备份到同一时间点


10

通常,当我们开始备份时,我们不允许提交更改,否则将无法访问数据库。我的意思是数据库将处于单用户模式,但是我想开始备份并释放数据库以供使用。另外,一旦开始备份,我就不想将正在进行的更改写入备份文件。我想知道如何在Microsoft SQL Server 2012中实现此目标。请帮助我。

好吧,让我先解释我的问题。目前,我正在将数据库设置为单用户模式,直到备份完成。我的目的是为了避免备份过程中的数据更改。但是我的应用程序与多个数据库绑定在一起(每个数据库相互链接,并且有var dbs不断按月创建)。因此,备份所有这些数据库已成为一个繁琐的过程,更重要的是,在备份过程中,我必须将用户排除在系统之外。

因此,我正在寻找可以满足以下要求的备份机制。

  1. 一次启动所有数据库的备份,然后释放该数据库以供使用。
  2. 由于数据库相互链接,因此我希望在备份文件中保持数据一致性。因此,由于这种数据一致性要求,我不想将正在进行的更改提交到备份文件中。

我想要的是-在给定时间备份所有数据库。


2
进行备份时,不必将数据库设置为单用户模式。SQL Server将永远不会在备份中包括未提交的事务。要获得更完整的答案,请编辑您的帖子以包括恢复模型的详细信息,无论您是指事务日志备份,完整备份还是增量备份,以及遇到什么问题。就目前而言,您的问题尚不清楚。
Daniel Hutmacher

1
您想通过此备份实现什么?到现在为止完全可恢复-还是其他?换句话说...如果您必须从此备份中还原,则应还原什么-DDL的任何更改?数据更改还是什么?
seventyeightist

在SQL 2012中无法实现所需的功能。回到SQL 7.0天,数据库备份集用于重新创建数据库,就像BACKUP语句启动时一样。从SQL 2000及更高版本开始,将使用数据库备份集来重新创建数据库,就像BACKUP语句完成时一样。
stacylaray

@DanielHutmacher我正在寻找完整的备份。
Praveen

Answers:


13

我假设您的任务是创建一组备份,您可以在其中将所有备份还原到单个静态(无未清事务)点(全部同步)。类似于停顿点将为您在DB2中完成的工作。不幸的是,SQL Server中没有任何功能可以做到这一点。但是,假设您的数据库处于完全恢复模式,则可以执行类似的操作。

您可以一次MARKED在所有数据库中创建一个事务。然后对每个数据库进行事务日志备份。假设您跟上了日志备份的时间(无论如何应该如此),日志备份不会花费很长时间。并且无需阻止任何人进入系统(除非足够长的时间,您可以创建标记的交易)。

此时,如果您需要执行还原,则RESTORE STOPBEFOREMARK对每个数据库都执行一次。这会将所有数据库还原到同一点(基于您的事务)。注意:如果要包括该事务,也有一个STOPATMARK。

如果您想举个例子,我在上面的链接中有一个例子,还有很多其他的读物。

我意识到这并不能完全回答您的问题,但希望可以解决您的问题。


2
这就是BizTalk如何管理多个数据库的时间点备份的方式。如果它适用于Microsoft BizTalk,则它是一项经过充分测试的功能。
Max Vernon

在更改为alwaysOn的日志传送中,我们将其用于TFS数据库。
Kin Shah

1
一个(暗示但未说的)细节可以帮助Ken解答:您不能在多个DB上拥有完整的完整备份。最接近的方法是进行完整备份,然后立即进行标记的事务,然后再进行日志备份。第一轮日志备份将“调整”到时间点的一致性。
AMtwo

@AMtwo从技术上讲,您可以使用OPs方法。将所有人锁定在系统之外,确保没有活动的连接(也许将数据库标记为只读/受限),然后对每个数据库进行完整备份。但是,正如OP所说,这不是世界上最好的方法。
肯尼斯·费舍尔

7

您的问题与我已回答的问题类似- 将10-20个SQL Server数据库备份和还原到〜同步状态?

假设您的数据库恢复模型为FULL,则应进行完全备份,然后使用Marked Transactions

让我们揭穿你的神话...

一次启动所有数据库的备份,然后释放该数据库以供使用。

备份的神话 (强烈建议您阅读所有备份的神话)

备份操作不会锁定用户对象。备份的确在I / O子系统上造成了非常重的读取负载,因此看起来工作负载似乎已被阻止,但实际上并非如此。它只是被放慢了。在一种特殊情况下,必须提取大容量日志范围的备份将获得文件锁定,这可能会阻止检查点操作-但DML从未被阻止。

由于数据库相互链接,因此我希望在备份文件中保持数据一致性。因此,由于这种数据一致性要求,我不想将正在进行的更改提交到备份文件中。

标记为“事务”的文件将帮助您进行一致的LOG备份,并且可以使用来还原它们 RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

请记住,实例上所有数据库的标记事务也记录在数据库的dbo.logmarkhistory表中MSDB


-1
--]---- Begin Code ----[
--–declaring variables
DECLARE @dbname VARCHAR(100) -- database name
DECLARE @bupath VARCHAR(100) -- path for backup location
DECLARE @filename VARCHAR(100) -- filename used for backup files
DECLARE @datestamp VARCHAR(25) -- date used for backup file timestamp
-- specify database backup directory
SET @bupath = 'D:\DB Bkp\'
-- file date formatting
SELECT @datestamp = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE
(CONVERT(VARCHAR(20),GETDATE(),108),':','')
--specify databases to backup
DECLARE db_cursor CURSOR for
SELECT name
FROM master.dbo.sysdatabases
WHERE name not IN ('tempdb') -- excludes these databases, if excluding multiple databases, seprate them by a comma
--backup process
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @filename = @bupath + @dbname + '_' + @datestamp + '.bak'
   BACKUP DATABASE @dbname TO DISK = @filename WITH INIT,
   CHECKSUM; --init overwrites existing files with the same name, and checksum verifies the backup
       FETCH NEXT from db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor

有关更多详细信息:https : //blogs.technet.microsoft.com/letsdothis/2013/11/06/backup-multiple-sql-databases-in-a-single-swoop/


不能保证相同时间点的备份。这只是连续备份的序列。
vonPryz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.