从备份还原SQL数据库是否重建其索引?


10

从备份还原SQL数据库是否从头开始重建其表和索引?还是将其保持与备份时相同的内部物理顺序?

如果这有任何区别,我们正在将SQL 2000与Quest Lightspeed压缩备份一起使用。

Answers:


16

答案是否定的,无论使用什么备份软件。

备份是一种物理操作,而不是逻辑操作。它读取包含已分配页面的所有扩展数据块(即,即使仅分配了8页扩展数据块中的单个页面,它也会备份整个64K扩展数据块),并按物理顺序进行。

还原是一种物理操作,而不是逻辑操作。它在数据文件中的适当位置放下扩展区。

重建索引(或类似的索引)是一项逻辑操作,必须进行记录。备份和还原无需通过缓冲池即可直接操作数据文件,这是无法完成此操作的原因之一。无法执行此操作的另一个原因是,备份和还原不了解要备份的数据中包含的内容。

但是,无法完成此操作的主要原因是,在还原操作期间移动页面会破坏b树指针。如果页面A指向页面B,但是还原过程移动了页面A,那么页面B如何更新为指向页面A?如果立即更新,则还原过程的其余部分可能会覆盖它。如果延迟更新,如果还原过程还原了删除了页面A或页面B的某些事务日志,该怎么办?根本无法做到。

底线-备份和还原是永远不会更改数据的物理操作。

希望这可以帮助!

PS虽然不能直接解决此问题,但请查阅我为July TechNet杂志撰写的文章,其中解释了各种备份在内部的工作方式:了解SQL Server备份。《九月》杂志将是有关了解还原的系列文章中的下一篇。


2
我喜欢您解释索引是逻辑操作的事实。
Jim B

嗯,那很有道理。备份可获取完整的64k物理盘区,而不是8k数据页。
BradC

这是无稽之谈。备份操作经常压缩它们备份的数据,这就是我们所说的“更改”:毕竟,可以从表中重新创建索引,它们是冗余数据(前提是已备份架构) , 当然)。真正的原因是数据库开发人员的懒惰。
约翰

1
@约翰,你在说什么废话?这里没有在任何地方提到压缩-只是重建索引,这与压缩没有任何不同(压缩在恢复期间不会更改页面或其在数据库中的位置,而重建会更改)。与仅从备份中按原样还原索引相比,在还原过程中从头开始重建索引的速度会非常慢。我认为您在这里误解了一些东西。
Paul Randal

删除和重建索引是一种压缩类型,根据压缩类型的不同,压缩可能会发生任何变化。图像处理中的有损压缩仍称为压缩。在较小空间中表示给定信息的任何机制都是压缩的一种形式,而删除索引就是其中的一个小例子。缓慢的重建时间确实可能是一个真正的争论,至少对于实现是一个值得努力的尝试。
约翰

6

SQL备份只是备份文件的逐页转储,因此答案为“否”。Quest lightspeed备份可能使用某种压缩压缩算法,但是它仍然不会“重建”数据文件或索引,这在大型数据库上将花费大量时间。


是的,但是无论如何它必须将每个页面写入磁盘。为什么不按逻辑顺序而不是零散的顺序编写它们?(也许这更像是一个备份问题,而不是还原问题:备份是以物理顺序还是逻辑顺序写入页面的?)
BradC

假设有一种产品可以按索引顺序写出数据,那么您希望表以什么顺序保存?可以说我有一个包含3列product_id,productname和price的表。正确排序的哪一列可以按索引顺序保存页面?顺便说一句,没有什么可以阻止您对整个表(一个聚集索引)或每一行(复合索引)建立索引。
Jim B

@Jim B:很简单。表将以聚簇索引顺序保存。非聚集索引将按键顺序存储。堆将保持原始(未排序)顺序。(Aaron和Paul提到了备份/还原不执行此操作的正当理由。无法弄清“优先顺序”不是这些原因之一。否则进行完全索引重建将有相同的问题。 )
BradC

数据以与保存在数据库文件中完全相同的物理页面顺序备份。还原数据后,将以与备份时相同的页面顺序还原数据。出于各种原因,SQL不会移动数据。包括事务恢复日志和页面链接问题可能会出现问题,更不用说需要大量的额外时间来整理多TB数据库上的数据。
mrdenny

2

备份是定期进行的,而且非常频繁(我希望如此)。因此,设计人员确保了备份尽可能快。什么是最快的I / O?顺序的。您以精确的物理顺序从磁盘读取数据块,从而获得最佳性能。

为什么在地球上,数据库应该每天晚上执行繁琐的随机I / O操作,从而遍地浪费磁盘的磁头?差异将在两个数量级左右。这是不可能的。


我同意您的总体观点,但是根据底层存储配置,随机I / O可能不会比顺序I / O(例如散布在数十个主轴上的SAN驱动器)差几个数量级。实际上,如果数据文件分散在硬盘驱动器上,那么即使是“顺序” I / O也不是完全顺序的。但是无论如何,Paul的观点仍然可以覆盖这一点(更新指针的问题以及碎片整理应该是已记录的操作)
BradC

0

嗯 BradC,您之前使用过Firebird / Interbase吗-在其中主要的备份/还原实用程序/ API更类似于SSMS / EM的“复制数据库...”?如果是这样,请知道MS SQL Server不喜欢它。

SQLServer Backup更像是一个数据库转储,可以按“ AS-IS”还原-因此,它更像是一个方便的在线快捷方式,用于“在其他位置分离-复制-重新连接”操作。恢复的数据库几乎是原始数据库文件的精确副本(几乎是因为您可以更改恢复的数据库的数据库文件的位置)...

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.