WindowsバッチでSQL ServerのDBフルバックアップファイルをサクッと採取する


はじめに

Windowsバッチで、SQL Serverのフルバックアップを採取する方法について説明する。

前提

  • 検証環境:Windows10 Home SQL Server 2016 Developer
  • バッチファイルと同一サーバー(localhost)でSQL Server稼働

処理概要

  • Windows認証でDB(DB名:SANDBOX1)に接続
  • フルバックアップのファイルを採取し、D:\SQLServerBackup\DB1.bak に出力

バックアップ処理Windowsバッチ作成

以下のようなバッチを作成する。

SQLSVDBbackup.bat
SET PORT=1433
SET DBSV=localhost
SET INSTANCE=MSSQLSERVER
SET DBNAME=SANDBOX1
REM バックアップ出力先
SET BKUP_DIR=D:\SQLServerBackup

REM バックアップファイル名
SET BKUP_FILE_NAME=DB1.bak

REM フルバックアップ
sqlcmd -S %DBSV%\%INSTANCE%,%PORT% -Q "BACKUP DATABASE %DBNAME% TO DISK='%BKUP_DIR%\%BKUP_FILE_NAME%' WITH INIT, COMPRESSION"
REM バックアップ生成失敗時
IF NOT EXIST %BKUP_DIR%\%BKUP_FILE_NAME% GOTO BKUP_ERR

GOTO END

REM エラー処理
:BKUP_ERR
  ECHO バックアップに失敗
  EXIT /B 9

REM 正常終了
:END
  EXIT /B 0

以下、実行結果抜粋

D:\SQLServerBackup>sqlcmd -S localhost\MSSQLSERVER,1433 -Q "BACKUP DATABASE SANDBOX1 TO DISK='D:\SQLServerBackup\DB1.bak' WITH INIT, COMPRESSION"
データベース 'SANDBOX1' の 384 ページ、ファイル 1 のファイル 'SANDBOX1' を処理しました。
データベース 'SANDBOX1' の 2 ページ、ファイル 1 のファイル 'SANDBOX1_log' を処理しました。
BACKUP DATABASE により 386 ページが 0.052 秒間で正常に処理されました (57.851 MB/秒)。

実行結果確認

以下のようにDB1.bak ファイルができていれば成功。

トラブルシューティング

接続情報もろもろが正しいのに、実行時に以下のエラーが発生する場合、TCP/IPが無効化されている可能性が高い。
SQL Server構成マネージャーの設定を見直すこと。

Sqlcmd: エラー: Microsoft ODBC Driver 13 for SQL Server: TCP Provider: 待ち操作がタイムアウトになりました。
Sqlcmd: エラー: Microsoft ODBC Driver 13 for SQL Server: Login timeout expired。
Sqlcmd: エラー: Microsoft ODBC Driver 13 for SQL Server: A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.。

補足

  • 当サンプルはフルバックアップファイルを採取するのみ。差分バックアップを採取する場合は必要な処理を実装すること。
  • 日次バックアップしたい場合は、当batファイルをタスクスケジューラーなどで毎日実行できるようにしてやればOK。
  • 当バッチはサンプルとして同一サーバーにbakファイルを出力しているが、ファイルサーバー等にコピー・リネームする処理など必要に応じて実装すること。