web-dev-qa-db-ja.com

バックアップの復元に失敗しました-ディスク容量が不足しています

約6 GBのバックアップがあります。これは、元の(ログテーブルが削除された)の "ライト"バックアップで、約14Gbです。

SQL Expressローカルサーバーにバックアップを復元しようとしています。次のようなメッセージで失敗します:System.Data.SqlClient.Error: insufficient disk space。それは227,891,019,776バイトを要求します。これは完全にクレイジーで、ハードドライブ全体とほぼ同じ大きさです。

他のサイトで見つけたように、私はRESTORE FILELISTONLY FROM DISK = 'backupfile.bak'

データファイル(列Size)のサイズは6,888,226,816ですが、ログファイルは221,006,987,264です。列BackupSizeInBytesは6,259,736,576および0を返します。

したがって、正しく理解している場合、restoreは、実際のログファイルサイズを無視して、続行する前に、ログファイルの「理論的な」サイズを復元するのに十分なスペースがあることを確認します。

どうすればバイパスできますか?バックアップを取得するのは少し難しいので、運用サーバーに戻らなくても問題を解決できればすばらしいと思います。

ありがとうございました !

ところで、SQL Server 2008 R2 Expressを使用しています。

7
thomasb

バックアップサイズには空のページは含まれませんが、実際に復元を実行すると、データファイルとログファイルwillは200 GBを超えることに注意してください。 200 GB以上のログファイル。

データ損失の危険を冒したくない場合は、ソースでそれを修正し(たとえば、ログファイルを適切なものに圧縮し)、別の完全バックアップを作成して、それを復元する必要があります。バックアップを取得するのが難しい理由がよくわかりません。これはかなり標準的な操作であり、Host SQL Serverに料金を支払っている人が提供するサービスでなければなりません。

また、ソースデータベースを修正して、(a)適切な復旧モデルにするか、(b)ログバックアップをより頻繁に実行する必要があります。完全に回復していて、ログのバックアップをとらないため、ログファイルはばかげています。ポイントインタイムリカバリが必要な場合は、ログのバックアップを開始してください。そうでない場合は、シンプルに切り替えます。正しく構成されていれば、ログファイルはそれ自体を管理するはずです。そうしないと、このようになったら、縮小は1回限りの操作であり、構成を修正して、来週これを繰り返さないようにする必要があります...

7
Aaron Bertrand

DBCC TRACEON(3104)は、復元プロセスのディスク容量チェックをバイパスします。

2
Nic

ログを再利用できるようにするため、トランザクションログのバックアップはありませんでした。したがって、回復する必要のあるトランザクションが存在する可能性のある部分に到達するには、その空のログをすべて取得する必要があります。

したがって、データの損失(おそらくはかなりの量)に備える準備ができていると想定すると、ログなしでデータを回復できます。これはお勧めしません。

SQL Serverデータベースのリカバリに関する幅広いトピックへのリンクを以下に示します http://www.sqlskills.com/blogs/paul/category/disaster-recovery/ 。あなただけではありません: http://www.sqlskills.com/blogs/paul/search-engine-qa-23-my-transaction-log-is-full-now-what/ 。最後に、この状況で役立つ可能性があるいくつかのコマンドについては、再度お勧めしません(ほぼ確実にデータが失われます) http://blog.sqlauthority.com/2010/04/26/sql-server-attach -mdf-file-without-ldf-file-in-database /

1
Grignar Grenac

元のデータベースがまだオンラインの場合。また、ログの配布、複製、またはトランザクションログのバックアップを使用していません。次に、ALTER DATABASE {name} SET RECOVERY SIMPLEを実行して、トランザクションログを空にすることができます(後でそのファイルを圧縮できます)。次に、BACKUP DATABASE {name} TO DISK = '{file}'を実行します。ファイルを新しいサーバーにコピーし、データベース{new_name} TO DISK = '{file}'に復元します。 WITH .. MOVE {x} TO {new_file}を使用して、論理ファイルを新しい場所に再マッピングする必要がある場合があります。URLを参照してください http://msdn.Microsoft.com/en-us/library/ms177429 .aspx 構文の詳細。バックアップ後、ALTER DATABASE {name} SET RECOVERY FULLを実行して、元のデータベースを完全復旧モデルを使用するように戻すことができます(新しいコピーに対してもこれを行う必要があります)。これらの手順がうまくいかない場合は、以下も役立ちます: http://www.sqlskills.com/blogs/paul/category/backuprestore/

ディスク上のスペースを解放して新しいバックアップを配置する場合(SET RECOVERYの後、BACKUPの前)。 use {database_name}を実行する必要があります。 EXEC sp_helpdb {database_name}次に、使用法の値が「ログのみ」である列を持つ行の結果を調べます。次に、それをdbccrinkfile( '{filename}'、1024)の{filename}の値として使用します。これにより、.LDFファイルが1GBに縮小されます(つまり、サイズはMBです)。データファイルではshrinkfileを使用しないでください。ログファイルのみです。後者の詳細については、上記のPaul Randallサイトを参照してください。

0
Grignar Grenac