データベースをバックアップしました。
BACKUP DATABASE MyDatabase
TO DISK = 'MyDatabase.bak'
WITH INIT --overwrite existing
それからそれを復元しようとしました:
RESTORE DATABASE MyDatabase
FROM DISK = 'MyDatabase.bak'
WITH REPLACE --force restore over specified database
そして今、データベースは復元中の状態のままです。
バックアップにログファイルがないため、次のようにロールフォワードする必要があると考える人もいます。
RESTORE DATABASE MyDatabase
WITH RECOVERY
それ以外は、もちろん失敗します。
Msg 4333, Level 16, State 1, Line 1
The database cannot be recovered because the log was not restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.
そして、壊滅的な状況であなたが望んでいるのは、まさにうまくいかない復元です。
バックアップにはデータとログファイルの両方が含まれます。
RESTORE FILELISTONLY
FROM DISK = 'MyDatabase.bak'
Logical Name PhysicalName
============= ===============
MyDatabase C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf
MyDatabase_log C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF
データベースのRESTORE
コマンドでWITH RECOVERY
オプションを使用して、復元プロセスの一環としてデータベースをオンラインにする必要があります。
これは、トランザクションログのバックアップを復元するつもりがない場合、つまりデータベースのバックアップを復元してからデータベースにアクセスできるようにする場合に限り、もちろん可能です。
あなたの命令はこのように見えるべきです、
RESTORE DATABASE MyDatabase
FROM DISK = 'MyDatabase.bak'
WITH REPLACE,RECOVERY
SQL Server Management Studioのデータベースの復元ウィザードを使用すると、さらに成功する可能性があります。このようにして、特定のファイルの場所、上書きオプション、およびWITH Recoveryオプションを選択できます。
Symantec Backup Exec 11dを使ってデータベースをSQL Server 2005 Standard Editionインスタンスに復元する状況がありました。復元ジョブが完了した後、データベースは「復元中」の状態のままです。ディスク容量の問題はありませんでした - データベースは単に「復元中」状態から出ていませんでした。
SQL Serverインスタンスに対して次のクエリを実行したところ、データベースがすぐに使用可能になったことがわかりました。
RESTORE DATABASE <database name> WITH RECOVERY
これを行う方法は次のとおりです。
私は、ログ配布のセカンダリサーバーを停止することで同様の事件を起こしました。ログ配布からサーバーを削除し、プライマリサーバーからのログ配布を停止するコマンドを実行した後、セカンダリサーバー上のデータベースがコマンド実行後に復元ステータスで停止しました
RESTORE DATABASE <database name> WITH RECOVERY
データベースメッセージ:
RESTORE DATABASEは18.530秒で0ページを正常に処理しました(0.000 MB /秒)。
データベースはそれらの18秒後に再び使用可能になりました。
SQL Management Studioを使用した復元でも同様の問題がありました。データベースのバックアップを別の名前の新しいバックアップに復元しようとしました。最初はこれが失敗し、新しいデータベースのファイル名を修正した後に正常に実行されました。いずれにせよ、私が説明した問題は、最初からこの権利を得たとしても再発しました。したがって、復元後、元のデータベースの名前の横に(Restoring ...)が残りました。上記のフォーラム(Bhusan's)の回答を考慮して、私は以下の側のクエリエディタで実行してみました:
RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"
これで問題は解決しました。データベース名に特殊文字が含まれているため、最初は問題がありました。二重引用符を前後に追加することでこれを解決しました - 一重引用符では「構文が正しくありません...」というエラーが表示されません。
これは私がこの問題を解決しようと試みた最小の解決策であり(データベースを復元中の状態で動かなくしている)、それがより多くのケースに適用できることを私は望んでいる。
OK、私はPaukの場合と全く同じ問題を抱えています。それは復元中にサーバがディスクスペースを使い果たしたために発生したため、永久的な復元状態を引き起こしました。 SQL Serverサービスを停止せずにこの状態を終了する方法
解決策が見つかりました:)
Drop database *dbname*
RESTORE DATABASE/RESTORE LOGコマンドが実行されると、WITH RECOVERYオプションがデフォルトで使用されます。 「復元」プロセスで動けなくなった場合は、次のコマンドを実行してデータベースをオンライン状態に戻すことができます。
RESTORE DATABASE YourDB WITH RECOVERY
GO
複数のファイルを復元する必要がある場合、CLIコマンドにはそれぞれWITH NORECOVERYおよびWITH RECOVERYが必要です。データベースをオンラインに戻すには、command内の最後のファイルだけにWITH RECOVERYが必要です。
RESTORE DATABASE YourDB FROM DISK = 'Z:\YourDB.bak'
WITH NORECOVERY
GO
RESTORE LOG YourDB FROM DISK = 'Z:\YourDB.trn'
WITH RECOVERY
GO
SQL Server Management Studioウィザードも使用できます。
仮想復元プロセスもありますが、サードパーティのソリューションを使用する必要があります。通常、データベースのバックアップをオンラインのライブデータベースとして使用できます。 ApexSQLとIderaには独自のソリューションがあります。 SQL Hammerによるレビュー ApexSQL復元について 。大量のバックアップを処理している場合は、仮想リストアが優れた解決策です。復元プロセスははるかに高速であり、またディスクドライブ上のスペースを大幅に節約することができます。比較のために infographic を見てください。
これはかなり明白かもしれませんが、それは今私をつまずきました:
ログ末尾のバックアップを取っている場合は、SSMSの復元ウィザードでこのオプションをオンにして「ソースデータベースを復元状態のままにしておく(WITH NORECOVERY)」の場合もあります。
私はその理由を考え出しました。
RESTORE DATABASE
コマンドを発行したクライアントが復元中に切断した場合、復元は停止します。
クライアント接続によってデータベースを復元するように指示されたときに、クライアントがずっと接続されたままでない限り、サーバーが復元を完了しないことは奇妙です。
これはうまくいった:
データベースに復元状態が表示され、クエリを実行できず、ソフトウェアに接続できないという状況がありました。
この状況から抜け出すために私がしたことは、
WindowsサービスからすべてのSQL関連サービスを停止します。
LdfファイルとMdfファイルがSQLディレクトリにあるDATAフォルダを開きました。通常は "C:\ Program Files ***********\MSSQL\DATAです。
その後、データベースのLdfファイルとMdfファイルの両方をコピーしました。[db name] .mdfと[db name] _log.ldf
両方のファイルを別のフォルダにコピーしました。
それから私は(ステップ1で)すべてのSQL関連サービスをWindowsサービスから再開しました。
通常のログインで私のMS SQL Management studioを始めました。
原因となるデータベースを右クリックしてDELETEを押します(データベースを完全に削除します)。
このデータベースに関連するすべてのLDFファイルとMDFファイルは、DATAフォルダから取得されています(手順2で説明)。
同じ名前の新しいデータベースを作成しました(手順6で削除したデータベースと同じ名前 - 原因データベース)。
それから[データベース名] - >右クリック - >タスク - >オフラインにする。
次に、両方のファイルを(手順3から)DATAフォルダにコピーして戻しました(手順2)。
[データベース名] - >右クリック - >タスク - >オンラインにする。
持っていた 。私のデータベース名では、そのためにクエリが機能しませんでした( '。'の近くに不正確な構文を言って)そして、私は名前のための括弧が必要であることに気づきました:
RESTORE DATABASE [My.DB.Name] WITH RECOVERY
私の場合は、 データベースを削除するだけで十分でした 状態で停止していました "復元しています..." SQLコマンドで
drop database <dbname>
クエリウィンドウで。
次に、 データベース を右クリックし、 更新 を選択してManagement Studioのエントリを削除しました。その後、私はうまくいった新しい復元をしました(それをオフラインにしてもうまくいきませんでした、SQLサービスの再起動はうまくいきませんでした、サーバー再起動もうまくいきませんでした)。
デフォルトでは、すべてのRESTORE DATABASE
にRECOVERY
が設定されています。 'NORECOVERY'オプションは、基本的にSQL Serverに、データベースがもっと多くのリストアファイル(DIFFファイルとLOGファイル、そしてtailを含めることができる)を待っていることを伝えます。可能であれば、-logバックアップファイル)。 'RECOVERY'オプションは、すべてのトランザクションを終了し、データベースがトランザクションを実行できるようにします。
そう:
NORECOVERY
オプションで実行できます。 _バックアップ。 SIMPLEリカバリモデルデータベースでは、LOGバックアップは許可されません。NORECOVERY
オプションを実行します。 DIFFに続けてNORECOVERY
を実行し、最後にRECOVERY
オプションを指定してLOG restoreを実行します。覚えておいて、最後の復元クエリはRECOVERY
オプションを持たなければならない。それは明示的な方法でもそうでなくてもかまいません。 T-SQLの問題では、
USE [master] GO RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak WITH FILE = 1, [REPLACE],NOUNLOAD, RECOVERY -- This option could be omitted. GO
WITH REPLACEオプションはデータの損失につながる可能性があるため注意して使用する必要があります
あるいは、FULLおよびDIFFバックアップを実行する場合は、これを使用できます。
USE [master]
GO
RESTORE DATABASE Database_name
FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1,
NOUNLOAD,NORECOVERY
GO
RESTORE DATABASE Database_name
FROM DISK =N'\\path_of_**diff**backup_file.bak' WITH FILE = 1,
NOUNLOAD, RECOVERY
GO
USE [master] GO -- Perform a Tail-Log backup, if possible. BACKUP LOG Database_name GO -- Restoring a FULL backup RESTORE DATABASE Database_name FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, NOUNLOAD,NORECOVERY GO -- Restore the last DIFF backup RESTORE DATABASE Database_name FROM DISK = N'\\path_of_DIFF_backup_file.bak' WITH FILE = 1, NORECOVERY,NOUNLOAD GO -- Restore a Log backup RESTORE LOG Database_name FROM DISK = N'path_of_LOG_backup_file.trn' WITH FILE = 2, RECOVERY, NOUNLOAD GO
もちろん、オプションSTATS = 10を使用して復元を実行することもできます。これは、10%完了ごとに報告するようにSQL Serverに指示します。
お望みであれば、プロセスを観察したり、リアルタイムのクエリで復元したりできます。次のように:
USE[master]
GO
SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time
FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO
この助けを願っています。
イベントログにTCPエラーが記録されたときにも、この問題が発生しています...
SQLでDBを削除するか、マネージャの「削除」でそれを右クリックして、再度復元します。
私は実際にこれをデフォルトで始めました。 DBドロップをスクリプト化し、再作成してから復元します。
スナップショットが有効になっていると、動かなくなったデータベースの削除に問題が生じる可能性もあります。私にとってこれはうまくいった:
あなたは唯一の検証を実行してみましたか?それが確実なバックアップであることを確認するためだけに。
素晴らしい議論。最大ユーザーが行う最も一般的な間違いは、複数のバックアップを持つリカバリオプションを使用してデータベースを復元することです。これにより、データベースはRESTORING状態になります。
ポイントインタイムリカバリを実行している場合は、最初にRestore with NoRecovery
を実行してください。最後のバックアップオプションでは、Restore with Recovery
を使用する必要があります。
バックアップと復元について reference1 と reference2 を読んでください。
私は同じ問題を抱えていました...私のドライブがいっぱいでなかったので私のデータベースがなぜこの問題を経験したかわかりませんが…それはそれが破損したか何かになったようです。上記のすべてを試してみましたが、どれも完全にはうまくいきませんでした。特に、サービスを停止してmdfファイルとldfファイルを削除するという提案はうまくいくと思いました。
前述のようにファイルを削除することでこの問題を解決しましたが、再度DBを復元するのではなく、新しい.mdfファイルと.ldfファイルを上書きコピーし、フロントエンド添付ファイルウィザードを使用してこれらを添付しました。安心、うまくいった!
私が仮想マシンを使用しているときに新しいファイルをコピーするのにFOREVERがかかりました...そのため、クリップボードを使用したコピーと貼り付けには1時間かかるので、最後の試みとしてのみお勧めします。
SQL Expressライセンスの制限により、MyDbName(Restoring ...)のケースがあります。
ログファイルで、これを見つけました。
CREATE DATABASEまたはALTER DATABASE 失敗したため結果の累積データベースサイズは10240 MBのライセンス制限を超えるデータベースごとになります。
したがって、より大きなデータベースを復元しようとしている場合は、たとえば、SQL ExpressサーバーをDeveloperエディションに切り替える必要がありますなどです。
WITH RECOVERYベースのオプションはすべて私にとってはうまくいきませんでした。
Management Studioから完全に復元することでした。
USE [master]
RESTORE DATABASE Sales_SSD
FROM DISK = N'D:\databaseBackups02\Daily_Sales_20150309_0941.bak'
WITH FILE = 1,
MOVE N'Sales_Data' TO N'C:\Data\SSD\Sales.mdf',
MOVE N'Sales_Log' TO N'C:\Data\SSD\Sales_1.ldf',
NOUNLOAD, REPLACE, STATS = 5
以下のT-SQLを使用します。
ファイル名をmaster.sys.sysaltfilesから選択します。WHERE dbid = DB_ID( 'db_name');
T-SQLを継続的に使用する
RESTART、REPLACEを使用してDISK = 'DB_path'からデータベースを復元します。
この助けを願っています!
RESTORE DATABASE {DatabaseName}
FROM DISK = '{databasename}.bak'
WITH REPLACE, RECOVERY
私にとってそれを直したのは