SSMSでリストアを実行すると復元元のデータベースが復元しています…で止まってしまう
こっちが意図したかった設定をしてなくて、そういう状態になっていた
実に正しい
戻し手順
完全復旧のモデルを見直し
データベースの完全バックアップと、必要に応じて差分バックアップ (存在する場合) を
復元し、その後で後続のすべてのログ バックアップを順番に復元する必要があります。
データベースの全体復元を完了するには、最新のログ バックアップを復旧して、
データベースを復元する手順
データベースとの一貫性を維持できるように十分なロールフォワードを行うまでは、
ファイルを復旧してオンラインにすることはできません。
ということは
完了するには最新のログバックアップを復旧して復元(RESTORE WITH RECOVERY) 作業途中はNORECOVERY?
データベースの復元ダイアログ > ログ末尾のバックアップ
☐復元の前にログ末尾のバックアップを実行する
☐ソース データベースを復元中の状態にしておく(WITH NORECOVERY)
これにチェックが入っているとFROMが「復元しています…」で止まる
でもデフォルトで入ってたから…
このチェックが入っていると生成されるスクリプトにこれが加わる
code:sql
DISK = N'FROMのログバックアップ.trnのパス'
WITH
NOFORMAT
, NOINIT
, NAME = N'FROMのログバックアップ.trn'
, NOSKIP
, NOREWIND
, NOUNLOAD
, NORECOVERY
, STATS = 5
NORECOVERYがついているので、復元しています…で正しい!
今回のリストアでほしいのはこれだった
code:restore.sql
DISK = N'FROMの完全バックアップ.trnのパス'
WITH FILE = 1
, MOVE N'FROM' TO N'TO.mdfのパス'
, MOVE N'FROMのlog' TO N'TOのlog.ldfのパス'
, NORECOVERY
, NOUNLOAD
, REPLACE
, STATS = 5;
DISK = N'FROMのログバックアップ.trnのパス'
WITH FILE = 1
, NOUNLOAD
, STATS = 5
GO
復元オプション > 復旧状態 > RESTORE WITH RECOVERYなのでこっちはちゃんと終わるのでOK
RESTORE DATABASE
RESTORE LOG
MOVE logical_file_name_in_backup TO operating_system_file_name [ ...n ]
logical_file_name_in_backupのデータまたはログファイルをoperating_system_file_nameに指定される場所に復元して移動するように指定します
バックアップ セットに含まれる論理ファイルの一覧を取得するには、RESTORE FILELISTONLYを使用します
NORECOVERY
RECOVERY
復元操作に対して、コミットされていないトランザクションをロールバックすることを指定します
復元操作の後、データベースは使用可能な状態になります
NORECOVERY、RECOVERY、または STANDBY のいずれも指定しない場合は、RECOVERYが既定値になります
NORECOVERY
復元操作に対して、コミットされていないトランザクションをロールバックしないことを指定します
別のトランザクション ログを後で適用する必要がある場合は、NORECOVERY または STANDBY オプションのいずれかを指定してください
データベース バックアップと 1 つ以上のトランザクション ログを復元する場合や、複数の RESTORE ステートメントが必要な場合 (データベース全体を復元してからデータベースの差分バックアップを復元する場合など) は、最後の RESTORE ステートメントを除くすべての RESTORE ステートメントに、WITH NORECOVERY オプションを指定する必要があります。
推奨事項としては、複数段階に分かれた復元シーケンスで、すべてのステートメントに WITH NORECOVERY を使用して目的の復旧ポイントまで復旧を行います。
その後で、個別の RESTORE WITH RECOVERY ステートメントを使用して、復旧のみを行うことをお勧めします。
STANDBY
ちょっとまだここまで理解できない
REPLACE
TOが既にあれば上書きするくらいの認識しかまだない
REPLACE句またはWITH STOPAT句が指定されていない場合、
最初にログ末尾のバックアップを行わずに、データベースを復元しようとすると
エラーが発生します。
まだバックアップされていないすべてのログ レコード ( ログの末尾) をキャプチャし、作業内容の消失を防いで、ログ チェーンの完全性を維持します。
指定したデータベースと同じ名前のデータベースが既に存在していても、
この場合、既存のデータベースは削除されます。
REPLACEオプションを指定しない場合、安全性チェックが行われます
これにより、他のデータベースを誤って上書きするのを防止できます。
安全性チェックで次の両方に該当した場合は、RESTORE DATABASEステートメントで
現在のサーバーにデータベースが復元されることはありません。
NOUNLOAD
このオプションはテープ デバイスにのみ適用されます
テープ以外のデバイスが使用される場合、このオプションは無視されます。
STATS
指定したパーセンテージが完了するたびにメッセージを表示します。
5%完了、10%完了…みたいなやつか
中途半端な途中で止まってしまう
オブジェクトエクスプローラーを見るとFROM(復元しています…)と表示されてしまった
開こうとしても開けない
code:cmd.sql
select name, state_desc from sys.databases;
table:state.csv
name state_desc
master ONLINE
tempdb ONLINE
model ONLINE
msdb ONLINE
TO ONLINE
FROM RESTORING ←復元中のまま
FROMがRESTORINGになってるのでなおす
code:cmd.sql
go
restore database FROM with recovery; code:result.txt
RESTORE DATABASE により 0 ページが 0.583 秒間で正常に処理されました
(0.000 MB/秒)。
戻った
code:cmd.sql
select name, state_desc from sys.databases;
table:state.csv
name state_desc
master ONLINE
tempdb ONLINE
model ONLINE
msdb ONLINE
TO ONLINE
FROM ONLINE ←ONLINEに戻った
SSMSの画面で作った処理をスクリプト化しても上記のrestore database [FROM] with recovery;的な記載がない… わからんポイント
そもそもFROMがRESTORING状態で終わっているのが間違っている?
設定ミスで間違っていた!
この戻し方であっているのか
無理やり戻しているだけ?
正しいならスクリプトを書き出してから1行追加すればいいんだけど
SSMSから設定する方法はないのか
あった!
参考
NORECOVERYなのかな
一気にリストアできないのか?わからなくなってきた
ログ
解決した(2019/11/29)