我正在寻找一种方法来将 Windows 中所有待处理的写入刷新到磁盘,然后缓冲所有未来的写入,直到命令发出批准。
我想刷新 SQL Server 写入和 Windows 系统写入,然后缓冲两者。
为了清楚我在做什么:
我在 EC2 上使用 Windows 2008 R2 和 SQL Server 2008 R2。我对这些驱动器运行每小时快照。当没有重大变化时,这些快照会正常生成 - 但时不时我会得到一个坏快照。最坏的情况是,如果发生驱动器故障(技术上是 EBS 故障),如果我有 3 个坏的每小时快照,我将丢失 4 小时的数据。
快照已经解决了快速、差异备份和快速、轻松恢复的问题 - 所以我所寻找的只是一种方法来刷新所有内容,使其在磁盘上处于一致状态,然后暂停所有写入,直到快照完成。我很乐意为调用的服务编写一些代码来实现这一点,但我需要知道我需要编写哪些 API/命令才能完成任务。
我知道我可以创建一个单独的卷,并不断在其中运行 Windows 备份,然后对其进行快照,但这会大大延长备份过程,而且感觉像是黑客行为。我知道 Windows 和 SQL Server 都非常擅长缓冲写入,所以这似乎是我应该能够就地完成的事情。
有想法吗?
答案1
您可以选择利用 Windows 中的 Shadow Copy。Shadow Copy 进程本身会在提交自己的快照之前耗尽所有写入缓冲区。安排它在 EC2 快照前一两分钟拍摄快照。这样,当 EC2 快照触发时,系统中已经有一份最新的、一致的副本。
答案2
我无法回答如何锁定磁盘以便 Windows 不会写入或强制刷新,所以这只是一个半答案,但是您的问题没有注意到一个相关信息:
ec2-snapshot 过程是即时的。您不必等待它完成!一旦启动它,您就可以再次开始使用磁盘,快照仍将获取快照时的数据,而不是当前状态。发生这种情况的原因是,一旦您将其标记为进行快照,写入磁盘的所有新数据都会在某种覆盖磁盘中排队,并且您请求快照时的数据会被保留。
这应该可以让你的其他问题更容易解决。你需要做的就是刷新到磁盘以使所有内容保持一致,然后暂停几秒钟,确保快照 API 返回成功代码,这样你就知道进程已启动,然后你就可以继续写入了。
答案3
我将添加一个单独的答案来回复您的一些评论。如果您尝试让数据静止,VSS 是一个不错的选择。事实上,据我所知,MSFT DPM 将该子系统与 SQL 结合使用效果很好。当然,他们有专门的团队来解决问题。
VSS 不会搞砸 SQL,但它可以(并且已经)干扰 SQL 的本机备份方法(请参阅我对问题的回答这里以获得更多见解)。您需要非常清楚自己要完成的任务、VSS 正在执行的任务以及这两者是否一致。
您可以编写一些程序来本地调用 VSS API(不要问我怎么做,我不是开发人员),或者您可以使用 vshadow.exe 之类的程序来为您创建和操作卷影副本。Vshadow.exe 在 MSFT SDK 中可用;请确保您获得适合您操作系统的正确版本。
根据您的 SQL 恢复模型,调用 VSS 时 SQL 的反应会有所不同。我已经有一段时间没有处理 SQL 和 VSS 的细节问题了,但据我记得,如果您设置了简单恢复模型,则调用 VSS 时日志会被截断。在完整和批量日志中,情况并非如此,您需要采取一些措施来管理日志的大小。
您可能知道这一点,但请测试、测试、再测试。只有您能够真正从快照中恢复,快照才是有用的。
答案4
自动化云正是您正在寻找的。它有一个可选的 VSS 代理,该代理使用 MS-SQL、MS-Exchange 或其他提供的 VSS 快照提供程序。
在备份期间,它会冻结/重定向磁盘上的 I/O,触发 EC2 快照,然后再次允许 I/O。
整个过程由易于使用的 Windows GUI 控制,无需任何脚本。