カテゴリ: Azure 更新日: 2026/04/14

Azure SQL Databaseのバックアップと復元を徹底解説!ポイントインタイムリカバリでデータを守る方法

Azure SQL Databaseのバックアップ|ポイントインタイム復元でデータを守る
Azure SQL Databaseのバックアップ|ポイントインタイム復元でデータを守る

先生と生徒の会話形式で理解しよう

生徒

「Azure SQL Database(アジュール・エスキューエル・データベース)を使っているのですが、もし操作ミスでデータを消してしまったらどうすればいいですか?」

先生

「それは心配ですね。でも大丈夫ですよ。Azure SQL Databaseには、ポイントインタイム復元(Point-In-Time Restore)という強力なバックアップ機能が標準で備わっています。」

生徒

「ポイントインタイム復元?それは過去の特定の時間に戻せるということでしょうか?」

先生

「その通りです!まるでタイムマシンのように、数分前の状態へデータベースをまるごと戻すことができるんです。今回はその仕組みと使い方を詳しく解説しますね。」

1. Azure SQL Databaseのバックアップとは?

1. Azure SQL Databaseのバックアップとは?
1. Azure SQL Databaseのバックアップとは?

Azure SQL Database(アジュール・エスキューエル・データベース)は、マイクロソフトが提供するクラウド型のデータベースサービスです。このサービスには、最初から自動(じどう)でバックアップを取る仕組みが組み込まれています。初心者(しょしんしゃ)の方が自分で複雑な設定をしなくても、システムが勝手にデータを保存しておいてくれるのが大きな特徴です。

一般的なデータベース管理では、毎日決まった時間にバックアップを実行するバッチ処理などを組む必要がありますが、Azure(アジュール)ではその手間が一切ありません。これを「フルマネージド」なサービスと呼びます。データは読み取りアクセス地理冗長ストレージ(RA-GRS)などに保存されるため、物理的なサーバーの故障などからも守られています。

2. ポイントインタイム復元の仕組みとメリット

2. ポイントインタイム復元の仕組みとメリット
2. ポイントインタイム復元の仕組みとメリット

ポイントインタイム復元(ふくげん)とは、指定した過去の時点の状態にデータベースを新しく作成して戻す機能のことです。英語では Point-In-Time Restore(ポイント・イン・タイム・リストア)と呼び、頭文字をとって PITR と略されることもあります。

この機能の最大のメリットは、秒単位で復元ポイントを指定できることです。例えば、「今日の午前10時5分に間違えてテーブルを削除してしまった」という場合、10時4分の状態を指定して復元すれば、削除直前のデータを完全に取り戻すことができます。これは、従来の「昨日の夜のバックアップに戻す」といった大まかな復旧とは比較にならないほど便利です。

保持期間(ほじきかん)はサービスのプランによって異なりますが、基本的には7日間から35日間程度、過去にさかのぼることが可能です。これにより、誤操作(ごそうさ)やプログラムのバグによるデータ破損から強力に保護されます。

3. 実際にデータを操作してみる(SQLによる準備)

3. 実際にデータを操作してみる(SQLによる準備)
3. 実際にデータを操作してみる(SQLによる準備)

まずは、復元の実験をするために、簡単なテーブルを作成してデータを挿入してみましょう。ここでは、ユーザー情報を管理する Users テーブルを例にします。

まずは現在のテーブルの状態を確認しましょう。


id | name        | age | email
---+------------+-----+-------------------
1  | 山田太郎    | 25  | taro@example.com
2  | 佐藤花子    | 19  | hanako@example.com
3  | 鈴木一郎    | 30  | ichiro@example.com
4  | 田中次郎    | 22  | jiro@example.com
5  | 伊藤美紀    | 28  | miki@example.com

次に、SQL(エスキューエル)コマンドを使って、新しいユーザーを追加してみます。これは、Structured Query Language(ストラクチャード・クエリ・ランゲージ)の略で、データベースを操作するための言語です。


INSERT INTO Users (id, name, age, email)
VALUES (6, '渡辺健', 35, 'ken@example.com');

SELECT * FROM Users;

実行結果は以下のようになります。


id | name        | age | email
---+------------+-----+-------------------
1  | 山田太郎    | 25  | taro@example.com
2  | 佐藤花子    | 19  | hanako@example.com
3  | 鈴木一郎    | 30  | ichiro@example.com
4  | 田中次郎    | 22  | jiro@example.com
5  | 伊藤美紀    | 28  | miki@example.com
6  | 渡辺健      | 35  | ken@example.com

4. 万が一のミス!データを削除してしまった場合

4. 万が一のミス!データを削除してしまった場合
4. 万が一のミス!データを削除してしまった場合

さて、ここで悲劇が起きたと仮定しましょう。条件指定を忘れて、全データを削除してしまった場合です。初心者が最も恐れるミスの一つですね。これを専門用語で「データ消失(しょうしつ)」と呼びます。


-- 本来は WHERE 句で条件を指定すべきなのに、忘れて実行してしまった!
DELETE FROM Users;

SELECT * FROM Users;

実行結果は空っぽになってしまいます。


id | name | age | email
---+------+-----+------
(0 records)

このような絶望的な状況でも、Azure SQL Databaseのバックアップ機能があれば、数分前の状態へと戻すことができるのです。これがポイントインタイム復元の真価です。

5. C#プログラムからデータベースの状態を確認する

5. C#プログラムからデータベースの状態を確認する
5. C#プログラムからデータベースの状態を確認する

アプリケーション開発では、C#(シーシャープ)などのプログラミング言語を使ってデータベースにアクセスします。復元作業を行う前に、現在のデータが本当に空であることをプログラム側からも確認してみましょう。以下のコードは、.NET(ドットネット)環境で動作するシンプルな接続例です。


using System;
using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Server=tcp:yourserver.database.windows.net;Database=yourdb;User ID=user;Password=pass;";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            string sql = "SELECT COUNT(*) FROM Users";
            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                int count = (int)command.ExecuteScalar();
                if (count == 0)
                {
                    Console.WriteLine("警告:テーブルにデータが存在しません。");
                }
                else
                {
                    Console.WriteLine($"現在のデータ件数: {count} 件");
                }
            }
        }
    }
}

このプログラムを実行すると、データが消えているため以下のような結果になります。


警告:テーブルにデータが存在しません。

6. Azure ポータルでの復元手順

6. Azure ポータルでの復元手順
6. Azure ポータルでの復元手順

データの復元(リストア)は、Azureポータルという管理画面から直感的に行うことができます。以下のステップで進めるのが一般的です。

  • 1. Azureポータルにログインし、対象のSQL Databaseを選択します。
  • 2. 画面上部のメニューから「復元」ボタンをクリックします。
  • 3. 「復元ポイント」で、事故が起きる直前の日時を指定します。
  • 4. 新しいデータベース名を入力します(既存のデータベースに直接上書きはされません)。
  • 5. 「確認および作成」を押すと、復元処理が開始されます。

復元が完了すると、新しいデータベースが作成されます。その中には、削除してしまったはずのデータが完全に残っています。このように、元のデータを壊さずに「別名で戻す」という仕組みになっているため、非常に安全です。

7. Azure CLIを使った復元コマンド

7. Azure CLIを使った復元コマンド
7. Azure CLIを使った復元コマンド

エンジニアの中には、マウス操作ではなく黒い画面(コマンドライン)で操作したい人も多いでしょう。Azure CLI(アジュール・コマンドライン・インターフェース)を使えば、たった一行のコマンドで復元を指示できます。初心者の方も、こうしたコマンドがあることを知っておくと将来役立ちますよ。


az sql db restore --dest-name MyRestoredDB --name MyOriginalDB --resource-group MyResourceGroup --server MyServer --time "2026-03-27T10:00:00"
(しばらく待つと、復元完了のJSONデータが表示されます)

このコマンドでは、--time オプションで戻したい時間を指定しています。ISO 8601形式という世界標準の時間表記を使うのがルールです。自動化(じどうか)スクリプトなどを作成する際にも非常に便利です。

8. 復元後のデータ確認と後処理

8. 復元後のデータ確認と後処理
8. 復元後のデータ確認と後処理

復元が完了したら、新しく作成されたデータベースに接続して、データが戻っているか確認しましょう。SQLで再度中身を見てみます。


id | name        | age | email
---+------------+-----+-------------------
1  | 山田太郎    | 25  | taro@example.com
2  | 佐藤花子    | 19  | hanako@example.com
3  | 鈴木一郎    | 30  | ichiro@example.com
4  | 田中次郎    | 22  | jiro@example.com
5  | 伊藤美紀    | 28  | miki@example.com
6  | 渡辺健      | 35  | ken@example.com

無事にデータが復活しましたね!この後は、アプリケーションの接続先(ConnectionString)を新しいデータベースに書き換えるか、古いデータベースを削除して新しい方の名前を元に戻すといった作業を行います。

注意点として、復元されたデータベースは「新しく作成されたリソース」として扱われるため、サーバーの料金が発生します。確認が終わった後の不要なデータベースは、こまめに削除してコストを節約(せつやく)しましょう。

9. バックアップの保持期間とコストの注意点

9. バックアップの保持期間とコストの注意点
9. バックアップの保持期間とコストの注意点

Azure SQL Databaseのバックアップは非常に強力ですが、いくつか覚えておくべきポイントがあります。まず、バックアップのストレージ料金についてです。標準的な保持期間内のバックアップは基本料金に含まれていることが多いですが、長期間(数年間など)保存する場合は、長期保存(LTR: Long-Term Retention)という別の設定が必要になり、追加の費用がかかります。

また、復元作業そのものには時間はかかりますが、別途の「復元手数料」のようなものは基本的にはありません。ただし、新しいデータベースが立ち上がっている間は、その性能に応じた利用料金が発生します。初心者のうちは、バックアップがあるからといって油断せず、常に丁寧な操作を心がけることが大切です。

まとめ

まとめ
まとめ

Azure SQL Database(アジュール・エスキューエル・データベース)におけるバックアップと復元の仕組みについて、基礎から実践的な操作方法まで詳しく解説してきました。クラウドネイティブなデータベースサービスであるAzure SQL Databaseは、利用者側で複雑なバックアップスケジュールを組む必要がなく、システム側で自動的にデータの保護が行われる点が非常に大きなメリットです。特に「ポイントインタイム復元(PITR)」機能は、誤ってデータを削除してしまった際や、プログラムの予期せぬ挙動によってデータが破損してしまった際の強力な救済策となります。

今回の内容を振り返ると、まずはSQL(エスキューエル)を用いた基本的なデータ操作の重要性を学びました。データベースのテーブル作成やデータの挿入、そして不慮の事故を想定したデータ削除のシミュレーションを通じて、バックアップの必要性を再確認できたはずです。また、C#(シーシャープ)プログラムからデータベースの状態を確認する方法や、Azure CLI(アジュール・コマンドライン・インターフェース)を利用した効率的な復元コマンドの実行など、開発現場で即戦力となる知識についても触れました。

復元作業においては、元のデータベースを直接上書きするのではなく、新しいデータベースとして「別名で作成」されるという安全な設計思想が貫かれています。これにより、復元後のデータを慎重に確認してから本番環境へ反映させることが可能です。ただし、復元されたデータベースには別途利用料金が発生するため、作業完了後のリソース管理には十分注意しましょう。

SQLによるデータ復旧後の確認サンプル

復元が完了した後、改めてSQLを実行してデータが正しく戻っているか確認する手順は非常に重要です。例えば、復元したデータベースに対して以下のクエリを実行し、レコード数が事故前の状態と一致するか、特定の重要なデータが欠落していないかをチェックします。


id | name        | age | email
---+------------+-----+-------------------
1  | 山田太郎    | 25  | taro@example.com
2  | 佐藤花子    | 19  | hanako@example.com
3  | 鈴木一郎    | 30  | ichiro@example.com
4  | 田中次郎    | 22  | jiro@example.com
5  | 伊藤美紀    | 28  | miki@example.com
6  | 渡辺健      | 35  | ken@example.com

-- データの整合性を確認するためのクエリ
SELECT COUNT(*) AS RecordCount, AVG(age) AS AverageAge
FROM Users;

RecordCount | AverageAge
------------+------------
6           | 26

C#での接続文字列の切り替え例

データベースを復元した後は、アプリケーション側で接続先を変更する必要があります。C#のプログラムでは、構成ファイルや環境変数に保持している接続文字列(ConnectionString)を、新しく作成されたデータベースの名前に更新します。以下は、接続確認を行うためのシンプルなコード例です。


using System;
using Microsoft.Data.SqlClient;

class RecoveryCheck
{
    static void Main()
    {
        // 復元された新しいデータベースへの接続文字列
        string connectionString = "Server=tcp:yourserver.database.windows.net;Database=MyRestoredDB;User ID=user;Password=pass;";
        
        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                Console.WriteLine("復元されたデータベースへの接続に成功しました。");

                string sql = "SELECT name FROM Users WHERE id = 6";
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    string name = (string)command.ExecuteScalar();
                    Console.WriteLine($"復旧確認:ID 6 のユーザー名は「{name}」です。");
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"エラーが発生しました: {ex.Message}");
        }
    }
}

復元されたデータベースへの接続に成功しました。
復旧確認:ID 6 のユーザー名は「渡辺健」です。

運用上のベストプラクティス

Azure SQL Databaseを運用する上では、以下のポイントを常に意識しておくことが推奨されます。

  • アクセス権限の最小化: 誤った削除を防ぐため、開発者や運用者に与える権限は必要最小限に留めましょう。
  • 保持期間の確認: ビジネス要件に合わせて、バックアップの保持期間(7日から35日)が適切に設定されているか定期的に確認してください。
  • コスト最適化: 復元テストなどで作成した一時的なデータベースは、確認が終わったら速やかに削除する習慣をつけましょう。
  • 復旧手順の文書化: 万が一の事態に備え、誰でも迷わずに復元作業が行えるよう、手順書を整備しておくことが重要です。

最後に、クラウド技術は日々進化しています。Azureの公式ドキュメントを定期的にチェックし、新しい機能や料金プランの変更について最新の情報を入手するようにしましょう。今回の学習を通じて、データの安全性を守るための確かな一歩を踏み出すことができましたね。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!Azure SQL Databaseのバックアップ機能がこんなに手厚いものだとは知りませんでした。自動でバックアップされているというだけで、精神的な安心感が全然違いますね。」

先生

「そうですね。クラウド以前の環境では、バックアップが失敗していないか毎日ハラハラしながらログを確認していたものです。それが今では数クリック、あるいは一行のコマンドで特定の時間まで戻せるのですから、本当に便利な時代になりました。」

生徒

「ポイントインタイム復元で、秒単位で戻せるというのも驚きでした。でも、復元したあとは『別のデータベース』として立ち上がるから、接続文字列を書き換える必要があるんですよね?」

先生

「その通り!よく理解できていますね。アプリケーション側から見れば、接続先の住所(データベース名)が変わるわけですから、そこを修正しないと古い(空っぽの)データベースを見続けてしまいます。C#のコード例で確認したように、新しい接続先で正しくデータが取れるかテストすることが不可欠です。」

生徒

「なるほど。あと、復元後の料金についても気をつけたいと思います。テストで復元したまま忘れて放置してしまうと、余計なコストがかかってしまいますもんね。Azure CLIを使ったコマンド操作も、自動化に役立ちそうなので練習してみます!」

先生

「素晴らしい意気込みですね。コマンドラインに慣れておくと、将来的にDevOps(デブオプス)などの高度な運用自動化にもスムーズに入っていけますよ。ミスを恐れすぎず、でも慎重に、これからもデータベースの運用を楽しんでくださいね。」

生徒

「はい!まずは自分のテスト環境で、一度あえてデータを消して復元する練習をしてみようと思います。実際にやってみるのが一番の勉強になりますから!」

カテゴリの一覧へ
新着記事
New1
C#
C#のNUnitテスト入門!初心者でもわかる自動テストの書き方とデバッグ方法
New2
Azure
Azure SQL Databaseのバックアップと復元を徹底解説!ポイントインタイムリカバリでデータを守る方法
New3
COBOL
COBOLのコンパイラと開発環境を徹底解説!初心者にもわかりやすい入門ガイド
New4
C#
C#のジェネリックメソッドの定義と使い方を解説!初心者でもわかる基本講座
人気記事
No.1
Java&Spring記事人気No1
Azure
Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続
No.2
Java&Spring記事人気No2
C#
C#のプロパティとは?get/setアクセサの書き方と使い分け
No.3
Java&Spring記事人気No3
C#
C#のデリゲートとは?メソッドを変数のように扱う基本を解説
No.4
Java&Spring記事人気No4
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.5
Java&Spring記事人気No5
Azure
Azure VMサイズの選び方ガイド|Computeからメモリ最適化まで用途別に比較
No.6
Java&Spring記事人気No6
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.7
Java&Spring記事人気No7
C#
C#のRegex.Split完全攻略!正規表現で文字列を自由自在に分割する方法
No.8
Java&Spring記事人気No8
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう