web-dev-qa-db-ja.com

SQL Serverデータベースを復元すると同時にそのファイルを圧縮する方法は?

たとえば、SQL Serverデータベースのデータファイルが初期サイズ100 GBで作成されているとしますが、そこには10 GBのデータしか含まれていません。その場合、データベースバックアップのサイズはわずか10 GBになります。

このバックアップを別のサーバー(または同じサーバー上の別のデータベース)に復元したいのですが、元のバックアップ(100 GB)と同じディスク領域を使用したくありません。これはデフォルトで行われます。

バックアップを作成する前に元のデータベースを圧縮することはできません(これは本番データベースであり、必要事前に割り当てられたスペースが必要です)。私could復元が完了した後、復元されたデータベースを縮小しますが、実際にそれを望んでいますnot実行中に100 GBを消費します。さらに、この特定のシナリオでは、ディスクに十分な空き容量がないため、復元はどこにも行われません。

データベースを復元する方法はありますかそして、データベースに含まれている実際のデータと同じだけのスペースを占めるようにします

9
Massimo

いいえ、申し訳ありません-方法はありません。 Restoreは、バックアップ時のファイルを復元します。シンキングは、その後またはバックアップを取る前に行う必要があります。

6
TomTom

ディスク容量が不足している場合は、.bakファイルをネットワーク共有に配置して、そこから復元できます。実行中のSQLサーバーがドメインアカウントで動作し、共有にファイルを読み取るための十分な権限を与える場合に機能するはずです。

以前にナットバスケットを使用していたもう1つのオプション(ただし、実行中のSQL Server 2008 R2の場合にのみ役立ちます)は、SQL Serverがトレースフラグを使用せずに直接共有にデータベースファイルを作成できることです。個人的な経験から、それは機能します!したがって、共有へのWITH MOVEを使用した復元を実行できます。

2
Nick Kavadias

一般的に、いいえ。役立つかもしれない、または役に立たないかもしれないいくつかのランダムなアイデア:

  • その特定のバックアップからのデータが絶対に必要でない限り、ターゲットサイズの新しい(空の)データベースを作成し、一括コピー(またはSSIS)を使用して現在の(ライブ)からすべてのテーブルをプッシュできます。あなたのコピーにデータベース。
  • これが1回限りの操作ではない場合、この種のことを自動化するのに役立つサードパーティツール(Redgate Compareなど)があります。
  • 一部のサードパーティバックアップソフトウェア(Quest Litespeedなど)には、「オブジェクトレベルのリカバリ」を実行する機能があり、個々のテーブルやその他のオブジェクトを新しい(空の)データベースに復元できます。バックアップがLitespeedを使用して作成されていない場合でも、この製品はネイティブSQLバックアップで動作するはずです。

最後に、本番データベースの「エルボールーム」も好きですが、合計100 GBから90 GBを解放すると少し極端になります。次の手順は、必要なものを提供する可能性があり、生産に影響を与えるべきではありません。

  1. プロダクションデータファイルでDBCC SHRINKFILE ('myfile.MDF', TRUNCATEONLY)を実行して、ファイルの終わりにある空き領域を一時的に解放します(TRUNCATEONLYはIO集約的ではなく、インデックスを断片化しません)。
  2. ログファイルも大きい場合は、DBCC SHRINKFILEログのバックアップをとった直後の、アクティビティが少ない時間帯に本番ログファイルで。
  3. バックアップを実行する
  4. ALTER DATABASE MODIFY FILEプロダクションデータファイルを元のサイズに再成長させます。

これらの手順を使用しても、本番環境への影響はありません。唯一のリスクは、データの一部がたまたま100GBのデータファイルの最後にある場合です。この場合、ステップ(1)でスペースがほとんど解放されません。

1
BradC