更频繁地备份 SQL DB

RSo*_*erg 11 sql-server backup

我目前有一个计划任务,它在每晚凌晨 2 点触发,调用 SQLCMD.exe 并将其传递给 .sql 脚本以运行备份(如下所示)。我们是一家非常小的公司,由于业务方面的重大增长,需求不断增长。此时丢失 1 天的数据将花费数万美元,而去年此时则为几百美元。在我可以将这个数据库平台迁移到一个不同的解决方案,其中数据镜像发生在 SQL Azure 等主要冗余的情况下,我能做的最好的事情是获得更频繁的备份吗?下面的这个脚本是否强制数据库脱机?我可以在用户与数据库交互的情况下运行此脚本吗?

USE CompanyCRM;
GO
BACKUP DATABASE CompanyCRM
TO DISK = 'D:\CRMBackups\CompanyCRMCRM.Bak'
   WITH FORMAT,
      MEDIANAME = 'CompanyCRM_Backup',
      NAME = 'Full Backup of CompanyCRM';
GO
Run Code Online (Sandbox Code Playgroud)

更新

哇,显然这里有一个比 SO 更专注的 DBA 社区。感谢您到目前为止的反馈。唯一缺少的是“如何”。我已经展示了上面我用来做每日备份的 SQL 命令,但增量日志备份示例是 MIA。这不是一个大型数据库,它目前在 SQLExpress 上运行。当我说 HA 或 SQL Azure 时,我特别指的是我们作为小型企业没有的现有架构。此实例目前正在我们唯一的服务器上运行。如果该服务器崩溃,我们的恢复时间将成为一个症结所在。这就是 SQL Azure 变得有吸引力的原因。

Tom*_*Tom 8

  • SQL Server 中的备份不会中断。即数据库保持运行。阅读文档。
  • 每天做一次完整备份,然后更定期地发送(复制)日志备份(同样,文档有……文档)——比如每 15 分钟左右。

  • 我认为备份是你不需要操作方法的东西,但完整阅读文档 - 它是业务关键并且它 - 非常 - 重要。不是煮鸡蛋的风格。聘请专业人士。 (4认同)
  • 太糟糕了,我不能在这个网站上投票答案...... (2认同)
  • @RSolberg:抱歉让你生气了。这不是故意的。但是这个社区怎么没有帮助呢?你有好的和有效的答案(和评论)。您自己的信息是:“此时丢失 1 天的数据将花费数万美元,而去年此时则为几百美元。” 所以你需要一个可靠的备份和恢复策略,这样你就不会到达那里。一个可靠的策略来自于非常了解基础知识。这来自阅读和理解手册。对不起,如果你理解其他任何东西! (2认同)
  • 我同意@RSolberg 的观点,这里的大多数答案都没有显示“如何”做到这一点,但这也是因为这个问题缺少一些您不了解罗素的“什么”细节。您必须更多地告诉我们您需要什么,但我同意您的观点,这里的网站不应该是关于“RTFM n00b”的。此外,正如您所指出的,您在 [so] 上有 10k,所以您肯定理解标记粗鲁或破坏性的评论。将来,你应该早点这样做,而不是沮丧地沸腾。 (2认同)

mrd*_*nny 6

您需要做的第一件事是弄清楚您可以承受丢失多少数据。在此之前,您将不知道备份数据库的频率。这不是你应该想出的数字。这是企业(或小公司的 CEO)需要决定的事情。他们要返回的第一个数字是 0 分钟。这可以做到,但这样做会非常昂贵。实际上,您可以备份的最小数据量大约是每 2 分钟一次。如果系统中变化的数据量足够小,您可以每分钟进行一次备份。

为了进行事务日志备份,这是您需要做的,您需要将数据库置于完全恢复模式。

如果您可以承受丢失 5 分钟的数据,那么您可能希望每天进行完整备份,并且每 5 分钟进行一次事务日志备份。如果您可能会丢失 15 分钟的数据,那么您需要每 15 分钟进行一次完整备份和事务日志备份。

另一种选择是每x分钟进行一次每周完整备份、每日差异备份和事务日志备份,正如我上面所说。

请记住,您需要备份的次数越多,在发生数据库故障或数据删除时需要恢复的文件就越多。全天进行差异备份以缩短恢复数据库所需的时间可能是有意义的。

所有使用 BACKUP 数据库和 BACKUP LOG 语句的备份都是在线完成的,不会阻止用户访问数据库。


小智 5

编辑,从您的更新

正如您所说,您可以丢失 1 天的数据,然后我会将数据库置于简单恢复模式。然后你可以每天早上和/或晚上做一个完整的。如果你想在白天保护自己,你可以通过数据库的差异备份,以防万一。这将捕获自完整备份以来所做的任何更改。如果我知道发生大量输入的时间范围,我可能会在完成后将这种类型的备份放入其中。它可以节省人们的恢复时间,因此他们不必进行额外的数据输入。

由于这是您唯一的服务器,我会确保您针对数据库运行 DBCC CHECKDB。当您发现备份已损坏时,备份没有任何好处(我想有人也提到过这一点)。您可能会找到一些脚本来设置计划任务以检查 DBCC 消息的 SQL 错误日志以捕获任何错误。SQL Server 本身不会警告您从 DBCC 消息返回的错误,因此除非您每次都手动检查执行此操作的脚本会有所帮助。

差异备份命令:


USE CompanyCRM; 
GO 
BACKUP DATABASE CompanyCRM 
   TO DISK = 'D:\CRMBackups\CompanyCRMCRM_diff.Bak'    
WITH FORMAT, DIFFERENTIAL,
MEDIANAME = 'CompanyCRM_Backup',       
NAME = 'Full Backup of CompanyCRM'; 
GO 
Run Code Online (Sandbox Code Playgroud)