SQLデータベースをバックアップから復元すると、インデックスが再構築されますか?


10

SQLデータベースをバックアップから復元すると、テーブルとインデックスが最初から再構築されますか?または、バックアップ時と同じ内部の物理的な順序で保持されますか?

SQL 2000とQuest Lightspeed圧縮バックアップを使用しています(違いがある場合)。

回答:


16

答えはノーです、どんなバックアップソフトウェアが使われているからです。

バックアップは物理的な操作であり、論理的な操作ではありません。割り当てられたページを含むすべてのエクステントを読み取り(つまり、8ページのエクステントから1ページだけが割り当てられている場合でも、64Kエクステント全体をバックアップします)、物理的な順序で実行します。

復元は物理的な操作であり、論理的な操作ではありません。データファイルの正当な場所にエクステントを配置します。

インデックス(またはそれに似たもの)の再構築は論理的な操作であり、ログに記録する必要があります。バックアップと復元では、バッファープールを経由せずにデータファイルを直接操作します。これが、これが実行できない理由の1つです。これが実行できないもう1つの理由は、バックアップと復元が、バックアップされるデータに何が含まれているかを理解できないためです。

ただし、これを実行できない主な理由は、復元操作中にページを移動すると、Bツリーポインターが壊れるためです。ページAがページBを指しているが、ページAが復元プロセスによって移動された場合、ページBはページAを指すように更新されますか?すぐに更新されると、残りの復元プロセスによって上書きされる可能性があります。遅延更新されている場合、復元プロセスでページAまたはページBを削除したトランザクションログが復元されたらどうなるでしょうか。それは単に行うことはできません。

結論-バックアップと復元は、データを変更することのない物理的な操作です。

お役に立てれば!

PSこの質問には直接対応していませんが、さまざまなバックアップが内部でどのように機能するかを説明している、7月のTechNet Magazineで私が書いた記事(SQL Serverバックアップについて)を確認してください。9月のマガジンは、復元の理解に関するシリーズの次の記事になります。


2
索引付けは論理的な操作であると説明していただいたのが気に入っています。
ジムB

ああ、それは理にかなっています。バックアップは、8kのデータページではなく、64kの物理エクステント全体を取得します。
BradC 2009年

これはナンセンスです。バックアップ操作は、バックアップするデータを頻繁に圧縮します。これは、私たちが話している「変更」の一種です。結局のところ、インデックスはテーブルから再作成でき、冗長なデータです(スキーマがバックアップされている場合)。 、 もちろん)。本当の理由は、データベース開発者側の怠惰です。
John

1
@ジョンは何を言っているのはナンセンスですか?圧縮についてはここでは触れていません-インデックスを再構築するだけで、圧縮とはまったく同じではありません(復元中にページやデータベース内の場所が変更されることはありませんが、再構築は行われます)。復元中にインデックスを最初から再作成すると、バックアップからそのまま復元する場合に比べて非常に時間がかかります。ここで何かを誤解していると思います。
ポールランダル2017年

インデックスの削除と再構築は圧縮の一種であり、圧縮の種類によっては、圧縮によって何も変更されない場合があります。画像処理における不可逆圧縮は、依然として圧縮と呼ばれます。与えられた情報を小さなスペースで表すメカニズムは圧縮の一種であり、インデックスの削除はその簡単な例です。遅い再構築時間は、実際には、少なくとも実装が価値ある努力であることに反対して、実際の議論かもしれません。
John

6

ネイティブ SQLのバックアップは、バックアップファイルのちょうどページ単位ダンプなので、答えは「ノー」があります。Quest lightspeedバックアップは、ある種の圧縮圧縮アルゴリズムを使用している可能性がありますが、それでもデータファイルまたはインデックスを「再構築」しないため、大きなデータベースでは非常に長い時間がかかります。


ええ、でもとにかくすべてのページをディスクに書き込む必要があります。それらを断片化された順序ではなく、論理的な順序で記述してみませんか?(たぶん、これは復元の質問ではなく、バックアップの質問のほうが多いでしょう。バックアップはページを物理的な順序で書き込みますか、それとも論理的な順序で書き込みますか?)
BradC

インデックス順にデータを書き込んだ製品があった場合、テーブルをどの順序で保存しますか?product_id、productname、priceの3つの列を持つテーブルがあるとします。インデックス順にページを保存するためにソートする正しい列はどれですか?ところで、テーブル全体(クラスター化インデックス)または各行(複合インデックス)のインデックス作成を妨げるものは何もありません。
ジムB

@ジムB:それは簡単です。テーブルはクラスター化インデックス順に保存されます。非クラスター化インデックスはキーの順序で格納されます。ヒープは元の(ソートされていない)順序で保持されます。(AaronとPaulは、バックアップ/復元がこれを行わない正当な理由について述べています。「優先順序」を理解できないことはこれらの理由の1つではありません。それ以外の場合は、完全なインデックスの再構築を行うと同じ問題が発生します。 )
BradC、2009年

データは、データベースファイル内に保存されているのとまったく同じ物理ページ順序でバックアップされます。データが復元されると、バックアップされたときと同じページ順序で復元されます。SQLは、さまざまな理由でデータを移動しません。マルチTBデータベースでデータをシャッフルするために必要な追加の時間の膨大な量は言うまでもなく、ログの復元トランザクションとページチェーンの問題がある可能性があることを含みます。
mrdenny、2009

2

バックアップは定期的かつ頻繁に行われます(私はそう思います)。したがって、設計者はバックアップが可能な限り迅速であることを確認しました。最も速いI / Oは何ですか?一連の。正確な物理順序でディスクからブロックを読み取り、最高のパフォーマンスを発揮します。

なぜ地球上では、データベースが毎晩厄介なランダムI / O操作を実行して、ディスクの頭をあちこちに破壊する必要があるのでしょうか。違いはおよそ2桁です。これには可能な利益はありません。


あなたの全体的な点に同意しますが、基盤となるストレージ構成によっては、ランダムI / OがシーケンシャルI / O(たとえば、数十のスピンドルに分散されているSANドライブ)よりも桁違いに劣らない場合があります。実際、データファイルがハードドライブ上で断片化されている場合、「シーケンシャル」I / Oでも実際にはシーケンシャルではありません。しかし、Paulのポイントはとにかくこれを上書きします(ポインタの更新に関する問題、およびその最適化はログに記録された操作であるべきです)
BradC

0

うーん。BradC、以前にFirebird / Interbaseを使用したことがありますか?メインのバックアップ/復元ユーティリティ/ APIは、SSMS / EMの「データベースのコピー...」に似ていますか?もしそうなら、MS SQL Serverはそれが好きではないことを知っています。

SQLServerバックアップは、「現状のまま」で復元されるデータベースダンプです。したがって、「他の場所での切り離し、コピー、再接続」操作の快適なオンラインショートカットに似ています。復元されたデータベースは、元のデータベースファイルのほぼ正確なコピーです(復元されたデータベースのデータベースファイルの配置を変更できるためです)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.