SQL Server Express データベースのバックアップをスケジュールして自動化する

元の製品バージョン: SQL Server
元の KB 番号: 2019698

まとめ

SQL Server Express にはSQL Server エージェントが含まれていないため、他のSQL Serverエディションと同じようにバックアップ ジョブやメンテナンス プランをスケジュールすることはできません。 SQL Server Express でのバックアップを自動化するには、sp_BackupDatabases ストアド プロシージャ、sqlcmd コマンド ライン ユーティリティ、タスク スケジューラWindowsの 3 つのコンポーネントを組み合わせます。 この記事では、SQL Server Express データベースのスケジュールされた完全バックアップ、差分バックアップ、トランザクション ログ バックアップを設定する手順について説明します。 また、スケジュールされたバックアップが実行されたことを確認する方法についても説明します。

この記事は、SQL Server Express エディションにのみ適用されます。 SQL Server Express LocalDB には適用されません。

SQL Server Express がSQL Server エージェントを使用してバックアップをスケジュールできない理由

SQL Server エージェントは、スケジュールされたジョブとメンテナンス プランを実行するコンポーネントであり、SQL Server Express には含まれません。 各エディションに含まれる内容の完全な比較については、SQL Serverのエディションとサポートされている機能を参照してください。

SQL Server エージェントを使用しない場合でも、次のいずれかのツールを使用して、SQL Server Express データベースをオンデマンドでバックアップできます。

これらのバックアップをオンデマンドではなくスケジュールで実行するには、次の手順で説明するように、スケジュール エンジンとしてタスク スケジューラWindows使用します。 バックアップの種類と戦略の背景については、「SQL Server データベースのバックアップと復元」を参照してください。

前提条件

開始する前に、次の内容があることを確認します。

  • SQL Server Express の実行中のインスタンス。 この記事の例では、既定の名前付きインスタンス ( .\SQLEXPRESS) を使用します。
  • master データベースにストアド プロシージャを作成するために必要な、そのインスタンスの sysadmin 固定サーバー ロールのメンバーシップ。
  • バックアップ ファイルを保持するのに十分な空き領域を持つローカル フォルダーまたはドライブ。 この例では D:\SQLBackups を使用します。
  • SQL Server Express を実行するコンピューターでスケジュールされたタスクを作成するアクセス許可。

手順 1: sp_BackupDatabases ストアド プロシージャを作成する

sp_BackupDatabasesは、インスタンス上の 1 つのデータベースまたはすべてのオンライン データベースに対して適切なBACKUP コマンドを実行する、Microsoft提供のストアド プロシージャです。 master データベースに 1 回作成します。

SQL_Express_Backups.sqlからスクリプトをダウンロードし、C:\Temp\SQL_Express_Backups.sql など、ローカルに保存します。 次に、SSMS または sqlcmdを使用してストアド プロシージャを作成します。

SSMS を使用してストアド プロシージャを作成する

  1. SSMS を開き、SQL Server Express インスタンスに接続します。 [ サーバー名] に「 .\SQLEXPRESS」と入力し、[ 接続] を選択します。
  2. [ファイル>開く>File] を選択し、保存したSQL_Express_Backups.sqlファイルを選択して、[開く] を選択します。
  3. ツール バーのデータベースリストに masterが表示されていることを確認します。 スクリプトは USE [master]で始まるので、正しいデータベースが自動的にターゲットになります。
  4. [ 実行] を選択します (または F5 キーを押します)。 メッセージ ペインに Commands completed successfully が表示されます。

sqlcmd を使用してストアド プロシージャを作成する

コマンド プロンプトで、次のコマンドを実行します。

sqlcmd -S .\SQLEXPRESS -E -i "C:\Temp\SQL_Express_Backups.sql"

ストアド プロシージャが作成されたことを確認する

インスタンスに対して次のクエリを実行します。 ストアド プロシージャが存在する場合は、1 行が返されます。

SELECT name, create_date
FROM master.sys.procedures
WHERE name = 'sp_BackupDatabases';

sp_BackupDatabases のパラメーター

ストアド プロシージャは、次のパラメーターを受け入れます。

パラメーター Required Description
@backupLocation はい バックアップ ファイルを受け取るフォルダー ( D:\SQLBackups\など)。 フォルダーは既に存在している必要があります。
@backupType はい バックアップの種類: 完全 F 、差分の場合は D 、トランザクション ログの場合は L 。
@databaseName いいえ バックアップ用のデータベース。 このパラメーターを省略すると、ストアド プロシージャは、スクリプトが除外するデータベースを除き、インスタンス上のすべてのオンライン データベースをバックアップします。

ストアド プロシージャは tempdbをバックアップしません。 また、バックアップの種類ごとにサンプル データベースの Northwind、 pubs、 AdventureWorks もスキップされ、差分バックアップとログ バックアップの master はスキップされます。これらのバックアップの種類は、 master データベースではサポートされていないためです。

Important

除外されたデータベース名は、スクリプト内でハードコーディングされます。 これらの名前のいずれかを使用するデータベースがある場合、ストアド プロシージャはエラーを報告せずにスキップします。 このようなデータベースをバックアップするには、ストアド プロシージャを作成する前に、スクリプト内の DELETE @DBs WHERE DBNAME IN (...) リストを編集します。

手順 2: sqlcmd ユーティリティをインストールする

sqlcmd ユーティリティを使用すると、コマンド ラインから Transact-SQL ステートメント、システム ストアド プロシージャ、スクリプト ファイルを実行できます。 SSMS と共にインストールされ、SSMS を持たないコンピューターのスタンドアロン ダウンロードとしても使用できます。 インストールするには、 sqlcmd ユーティリティのダウンロードとインストールに関するページを参照してください。

sqlcmdがインストールされ、使用可能であることを確認するには、コマンド プロンプトからsqlcmd -?を実行します。

sqlcmd実行可能ファイルを含むフォルダーは、通常、SQL Serverまたはスタンドアロン ツールをインストールするときに、Path環境変数に追加されます。 コマンド sqlcmd -? 認識されていないことを報告する場合は、フォルダーを Path 変数に追加するか、バッチ ファイル内のユーティリティへの完全パスを指定します。

手順 3: Sqlbackup.bat バッチ ファイルを作成する

テキスト エディターで、 Sqlbackup.batという名前のバッチ ファイルを作成します。 シナリオに応じて、次のいずれかの例のテキストをそのファイルにコピーします。

例を選択する前に、次の点を考慮してください。

  • すべての例では、プレースホルダーとして D:\SQLBackups を使用します。 環境内で使用するドライブとバックアップ フォルダーへのパスを変更し、フォルダーが存在することを確認します。
  • SQL Server認証を使用する場合、パスワードはバッチ ファイル内のクリア テキストに格納されます。 バッチ ファイルを保持するフォルダーへのアクセスを、承認されたユーザーのみに制限します。

例 1: Windows認証を使用したすべてのデータベースの完全バックアップ

REM Sqlbackup.bat
sqlcmd -S .\SQLEXPRESS -E -b -Q "EXEC sp_BackupDatabases @backupLocation='D:\SQLBackups\', @backupType='F'"

例 2: SQL Server認証を使用したすべてのデータベースの差分バックアップ

REM Sqlbackup.bat
sqlcmd -U <YourSQLLogin> -P <StrongPassword> -S .\SQLEXPRESS -b -Q "EXEC sp_BackupDatabases @backupLocation='D:\SQLBackups\', @backupType='D'"

注意

バックアップを実行するには、バックアップする各データベースの db_backupoperator または固定データベース ロール db_owner のメンバーであるか、 sysadmin 固定サーバー ロールのメンバーである必要があります。 詳細については、「 データベース レベルのロール」を参照してください。

例 3: Windows認証を使用した、すべてのデータベースのトランザクション ログ バックアップ

REM Sqlbackup.bat
sqlcmd -S .\SQLEXPRESS -E -b -Q "EXEC sp_BackupDatabases @backupLocation='D:\SQLBackups\', @backupType='L'"

トランザクション ログ バックアップには、完全復旧モデルまたは一括ログ復旧モデルが必要であり、以前の完全バックアップが少なくとも 1 つ必要です。 詳細については、「復旧モデル (SQL Server)」を参照してください。

例 4: Windows認証を使用した単一データベースの完全バックアップ

REM Sqlbackup.bat
sqlcmd -S .\SQLEXPRESS -E -b -Q "EXEC sp_BackupDatabases @backupLocation='D:\SQLBackups\', @databaseName='USERDB', @backupType='F'"

USERDBの差分バックアップを作成するには、@backupType パラメーターをDに変更します。 トランザクション ログのバックアップを作成するには、 Lに変更します。

-b オプションを指定すると、SQL Server エラーの重大度レベルが 10 を超えた場合に、sqlcmd が終了し、DOS ERRORLEVEL の 1 値を返すようになります。 -bしない場合、sqlcmdはバックアップが失敗した場合でも0を返し、タスク スケジューラはタスクを成功として報告します。

続行する前に、コマンド プロンプト からSqlbackup.bat手動 で実行し、バックアップ ファイルがバックアップ フォルダーに表示されることを確認します。 タスク スケジューラを使用して後でエラーを診断するよりも、エラーを修正する方が簡単になりました。

手順 4: Windows タスク スケジューラでバッチ ファイルをスケジュールする

スケジュールに従って Sqlbackup.bat を実行するには、次の手順に従います。

  1. SQL Server Express を実行しているコンピューターで、 Start を選択し、テキスト ボックスに「 Task Scheduler 」と入力します。

    [Best match]\(最適一致\) の下にタスク スケジューラ デスクトップ アプリが表示されているWindows検索結果のスクリーンショット。

  2. [ Best matchで、 Task Scheduler を選択して起動します。

  3. タスク スケジューラで、タスク スケジューラ (ローカル) を右クリックし、[基本タスクの作成] を選択します。

  4. 新しいタスクの名前 ( SQLBackup など) を入力し、[ 次へ] を選択します。

  5. タスク トリガーの [ 日次 ] を選択し、[ 次へ] を選択します。

  6. 繰り返しを 1 日に設定し、[ 次へ] を選択します。

  7. アクションとして [ プログラムの開始 ] を選択し、[ 次へ] を選択します。

  8. [参照] を選択し、「手順 3: Sqlbackup.bat バッチ ファイルを作成する」で作成したSqlbackup.batファイルを選択し、[開く] を選択します。

  9. [完了] をクリックしたときにこのタスクの [プロパティ] ダイアログを開く チェック ボックスをオンにし、[完了] を選択します。

  10. [ 全般 ] タブで、[ セキュリティ] オプション を確認し、[タスクの実行時に次の ユーザー アカウントを使用する] の下に表示されているアカウントの次の内容を確認します。

    • アカウントには、 sqlcmd ユーティリティを実行するための読み取りと実行のアクセス許可が少なくとも与えられます。
    • バッチ ファイルで Windows 認証を使用する場合、アカウントにはSQL Server データベースをバックアップするアクセス許可があります。
    • バッチ ファイルで SQL Server 認証を使用する場合、バッチ ファイル内のSQL Server ログインには、データベースをバックアップするアクセス許可があります。
  11. 要件に合わせて残りの設定を調整し、[ OK] を選択します。

ヒント

テストとして、タスク を所有する 同じユーザー アカウントで開始したコマンド プロンプトからSqlbackup.batを実行します。 この手順では、スケジュールを実行する前に、アカウントに必要なアクセス許可があることを確認します。

スケジュール オプションの詳細については、「 タスク スケジューラ」を参照してください。

スケジュールされたバックアップが実行されたことを確認する

最初にスケジュールされた実行の後、バックアップが成功したことを確認します。

  • バックアップ フォルダーで、新しい .bak ファイル (完全バックアップと差分バックアップ) または .trn ファイル (トランザクション ログ バックアップ) を確認します。 ストアド プロシージャは、各ファイル名に日付と時刻のスタンプを追加します。

  • タスク スケジューラで、[ タスク スケジューラ ライブラリ] を選択し、タスクを選択して、[ 最終実行結果 ] 列を確認します。 この列には、バッチ ファイルから返された終了コードが表示されます。 例では -b オプションを使用しているため、 0x1 の値はバックアップ コマンドが失敗したことを意味します。 その他の値については、「 タスク スケジューラエラーと成功定数」を参照してください。

  • インスタンスのバックアップ履歴に対してクエリを実行します。

    SELECT database_name, type, backup_start_date, backup_finish_date, physical_device_name
    FROM msdb.dbo.backupset AS bs
    INNER JOIN msdb.dbo.backupmediafamily AS bmf
        ON bs.media_set_id = bmf.media_set_id
    ORDER BY backup_start_date DESC;
    

    これらのテーブルは、msdb データベースで保持SQL Serverバックアップ履歴の一部です。 詳細については、「バックアップ履歴とヘッダー情報 (SQL Server)」を参照してください。

Important

バックアップ ファイルが存在し、バックアップ履歴に最新の行が含まれていることを常に確認します。 タスク スケジューラが成功として報告するタスクは、バックアップが成功したことを証明するわけではありません。

このバックアップ方法の要件と制限事項

この記事の手順を使用する場合は、次の要件と制限事項に注意してください。

  • タスクの開始がスケジュールされている場合は、タスク スケジューラ サービスが実行されている必要があります。 再起動後もサービスが実行されるように、このサービスのスタートアップの種類を [自動 ] に設定することをお勧めします。
  • バックアップを受け取るドライブには、十分な空き領域が必要です。 ディスク領域が不足しないように、バックアップ フォルダー内の古いファイルを定期的にクリーンアップします。 sp_BackupDatabases ストアド プロシージャでは、古いバックアップ ファイルは削除されません。
  • ストアド プロシージャは、オンラインのデータベースのみをバックアップします。 オフライン、復元中、または使用できないデータベースは、警告なしでスキップされます。
  • このメソッドはSQL Server エージェントを置き換えません。 組み込みのジョブ履歴、再試行ロジック、またはエラー アラートはありません。 バックアップ履歴を定期的に確認するか、それらの機能が必要な場合はSQL Server エージェントを含むエディションにアップグレードします。