我正在考虑在非高峰时段在生产 Windows 系统上进行基于映像的备份 (Acronis)。我只是想知道它们是否可能导致应用程序数据损坏。假设我有一个受到严重影响的数据库。我是否可以将数据库的起始块提交到映像,将数据插入数据库(这会更改服务器上数据库的起始块,但不更改映像),然后将数据块提交到映像(导致不一致的状态)。
下面是一个我想说明的例子。想象一个简单的数据结构,它前面有一个数字,表示文件中“a”的数量。数字和数据以“-”分隔。例如:
4-ajjjjjjjajuuuuuuuaoffffa
如果“a”发生变化,数据结构将重置文件开头的数字,例如:
3-ajjjjjjjajuuuuuuuboffffa
我假设 acronis 逐块写入一个直接的图像,所以这就是我设想的数据库发生的事情
t0: 4-ajjjjjjjajuuuuuuuaoffffa
^pointer is here
t1: 4-ajjjjjjjajuuuuuuuaoffffa
^pointer is here (all data before this is comitted to the image)
t2: 4-ajjjjjjjajuuuuuuuboffffa
^pointer is here (all data before this is comitted to the image)
Also notice how one of the "a"s change to a b. There are only 3 "a"s now
t3: 4-ajjjjjjjajuuuuuuuboffffa
^pointer is here (all data before this is comitted to the image)
现在,最终的图像显示为“4-ajjjjjjjajuuuuuuuboffffa”,而真实数据为“3-ajjjjjjjajuuuuuuuboffffa”,导致“数据库”损坏。
基本上,区块链下游的变化可以反映在图像中,而重要的标头和同步可能已经提交。过时的标头信息无法准确反映即将出现的区块的结构。
答案1
这里发生的事情是针对 acronis 的,几乎所有备份软件都使用卷影服务。各种应用程序(如 SQL 和 Exchange Server)也有自己的 VSS 编写器。
http://blog.macrium.com/2012/11/backup-internals-what-is-vss-how-does-it-work-and-why-do-we-use-it/对其工作原理有一个很好的概述。
基本上,Acronis 会告诉 Windows 创建快照。从那时起,当程序更改文件时,原始数据将保存到影子存储中。当 Acronis 到达文件的该部分时,Vss 会从影子存储中为其提供原始版本,而不是所有常规程序看到的更新版本。
如果一切正常,您最终会得到一份与断开服务器电源并进行离线备份时完全相同的副本。SQL 等支持 VSS 的应用程序有机会在创建快照之前保存任何需要保存的内容,以帮助避免数据不一致。如果其他程序正在写入文件,则备份中可能会损坏数据,但由于快照发生得很快,这种情况很少见,并且不会比断电和服务器重新启动更糟糕。