半自動でSQLServerのデータベースをバックアップからリストアする

もし障害が起きたとき用に作ってみたものです。

### なぜ半自動なのか

完全自動でリストアはちょっとコワイ（ビビり）

というのもありますが、作るなら半自動で頼むと言われた為、半自動で動くリストアのバッチファイルを作成しました。（キーボード連打したらほぼ自動だけど）

### 条件
フルバックアップは週一で取得している。
差分バックアップは毎日で取得している。
トランザクションログバックアップは毎日取得している。

Z:\test\FULL\がフルバックアップフォルダ
Z:\test\INC\が差分バックアップフォルダ
Z:\test\TRA\がトランザクションログバックアップフォルダ

### リストア順序
リストア直前のトランザクションログバックアップを取得
　　　　　↓
フルバックアップからリストア
　　　　　↓
差分バックアップからリストア
　　　　　↓
トランザクションログバックアップからリストア

### 実際に作ってみたバッチファイル

```
@echo off

rem --------------------------------------------------------
rem 1.最終トランザクションログバックアップ
rem --------------------------------------------------------

echo --------------------------------------------------------
echo データベース名：test のリストアを開始します。
echo --------------------------------------------------------
echo;
pause
echo;
echo --------------------------------------------------------
echo 最終トランザクションログのバックアップを取得します。
echo --------------------------------------------------------

sqlcmd -S ***** -Q "BACKUP LOG test TO DISK = 'Z:\test\TRA\%DATE:/=%.bak' WITH INIT"
if %errorlevel% neq 0 (
    echo %date% %time% ## 最終トランザクションログのバックアップを取得出来ませんでした。
    exit /b %errorlevel%
)
echo;
echo --------------------------------------------------------
echo 最終トランザクションログバックアップを取得しました。
echo --------------------------------------------------------
echo;
echo --------------------------------------------------------
echo 最新フルバックアップからリストアします。
echo --------------------------------------------------------
echo;
pause
echo;
rem --------------------------------------------------------
rem 2.最新のフルバックアップを選択し、リストアする。
rem --------------------------------------------------------

for %%I in ("Z:\test\FULL\*") do set FULL=%%I
echo %FULL%

sqlcmd -S ***** -Q "RESTORE DATABASE test FROM DISK = '%FULL%' WITH NORECOVERY,REPLACE"
if %errorlevel% neq 0 (
    echo %date% %time% ## フルバックアップからリストア出来ませんでした。
    exit /b %errorlevel%
)
echo;
echo --------------------------------------------------------
echo 最新のフルバックアップからリストアしました。
echo --------------------------------------------------------
echo;
echo --------------------------------------------------------
echo 最新の差分バックアップからリストアします。
echo --------------------------------------------------------
echo;
pause
echo;

rem --------------------------------------------------------
rem 3.最新の差分バックアップを選択し、リストアする。
rem --------------------------------------------------------

for %%J in ("Z:\test\INC\*") do set INC=%%J
echo %INC%

sqlcmd -S ***** -Q "RESTORE DATABASE test FROM DISK = '%INC%' WITH NORECOVERY,REPLACE"
if %errorlevel% neq 0 (
    echo %date% %time% ## 差分バックアップからリストア出来ませんでした。
    exit /b %errorlevel%
)
echo;
echo --------------------------------------------------------
echo 最新差分バックアップからリストアしました。
echo --------------------------------------------------------
echo;
echo --------------------------------------------------------
echo 最終トランザクションログバックアップからリストアします。
echo --------------------------------------------------------
echo;
pause

rem --------------------------------------------------------
rem 4.最新のトランザクションバックアップを選択し、リストアする。
rem --------------------------------------------------------

for %%K in ("Z:\test\TRA\*") do set TRA=%%K
echo %TRA%

sqlcmd -S ***** -Q "RESTORE LOG test FROM DISK = '%TRA%' WITH RECOVERY"
if %errorlevel% neq 0 (
    echo %date% %time% ## トランザクションバックアップからリストア出来ませんでした。
    exit /b %errorlevel%
)
echo;
echo --------------------------------------------------------
echo 最新トランザクションログバックアップからリストアしました。
echo --------------------------------------------------------
echo;
echo --------------------------------------------------------
echo %date% %time% リストアが完了しました。
echo --------------------------------------------------------
echo;
exit /b 0
```

### 簡易説明
改行入れないとコマンドプロンプト上ですごく見にくかったので改行入れたり線入れたりで個人的に見やすくしてます。

毎週バックアップ取ってるのでフォルダにはバックアップ日付のファイルが複数ありますが

```
for %%I in ("Z:\test\FULL\*") do set FULL=%%I
```
上記for文でバックアップフォルダのファイル一覧を取得し、最後に代入されるファイルが最新のファイルなのでここからリストアしています。

ほんとはOpenFileDialogクラスとか使って作ってみたかったけどめんどくさくて全部バッチで済まそうと思いこうなりました。

他にいいやり方があればご教授ください。

### 最後に
なんだかんだでバッチファイル組み始めたりSQLServerを触り始めて2-3か月とかになろうとしているところですが、ちょっとずつ成長してるような気がしてます。
いつまで続くか分からないですけど触ってるうちはもうちょっといろいろ覚えていきたいところです。