Amazon-RDS

RDSインスタンスをスナップショットから復元してみる

はじめに

皆さんはじめまして。
テクニカルサポートの大野です。

今回はRDSでスナップショットを取って復元する方法について紹介しようと思います。

RDSの停止

AWSで検証している場合の話をします。

EC2のオンデマンドインスタンスの場合、停止中はインスタンスの利用料金は発生しない場合、検証で利用しない場合はインスタンスを停止することでコストを抑えることが出来ます。

一方でRDS。
RDSでも停止は可能ですが、EC2のように半永久的に停止することは出来ず、7日後に自動で起動します。
そのため、7日毎に再度停止する操作が必要となり、それを忘れるとコストが掛かってしまい、停止の手間や管理も考えると検証で利用する場合は非効率と言えます。

どうすれば良いのか。
スナップショットを取って復元することにより、以前の途中から利用することが出来ます。

テスト用のデータベース

まず、RDSインスタンスをMySQLで作成し、テスト用のDBを作成しました。

  • EC2からデータベースへログイン
[root@rds-test ~]# mysql -u root -p -h {RDSインスタンスのエンドポイント}
Enter password:
  • testデータベースにanimal、hotsplingのDBを作成。
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
| test               |
| tmp                |
+--------------------+
7 rows in set (0.00 sec)

MySQL [(none)]> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| animal         |
| hotspring      |
+----------------+
2 rows in set (0.00 sec)
  • テーブルの構造。
MySQL [test]> describe animal;
+------------+-------------+------+-----+-------------------+----------------+
| Field      | Type        | Null | Key | Default           | Extra          |
+------------+-------------+------+-----+-------------------+----------------+
| id         | int(11)     | NO   | PRI | NULL              | auto_increment |
| name       | varchar(50) | YES  |     | NULL              |                |
| class      | varchar(50) | YES  |     | NULL              |                |
| created_at | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
+------------+-------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)

MySQL [test]> describe hotspring;
+------------+-------------+------+-----+-------------------+----------------+
| Field      | Type        | Null | Key | Default           | Extra          |
+------------+-------------+------+-----+-------------------+----------------+
| id         | int(11)     | NO   | PRI | NULL              | auto_increment |
| name       | varchar(50) | YES  |     | NULL              |                |
| prefecture | varchar(50) | YES  |     | NULL              |                |
| created_at | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
+------------+-------------+------+-----+-------------------+----------------+
4 rows in set (0.01 sec)
  • テーブルの内容。
MySQL [test]> select * from animal;
+----+-------+------------+---------------------+
| id | name  | class      | created_at          |
+----+-------+------------+---------------------+
|  1 | cat   | mammals    | 2021-10-20 18:15:49 |
|  2 | eagle | aves       | 2021-10-20 18:15:51 |
|  3 | snake | amphibians | 2021-10-20 18:15:55 |
|  4 | frog  | reptiles   | 2021-10-20 18:15:58 |
|  5 | shark | fish       | 2021-10-20 18:16:02 |
+----+-------+------------+---------------------+
5 rows in set (0.00 sec)

MySQL [test]> select * from hotspring;
+----+-------------+------------+---------------------+
| id | name        | prefecture | created_at          |
+----+-------------+------------+---------------------+
|  1 | beppu       | oita       | 2021-10-20 17:59:02 |
|  2 | noboribetsu | hokkaido   | 2021-10-20 18:00:59 |
|  3 | kusatsu     | gumma      | 2021-10-20 18:01:03 |
|  4 | atami       | shizuoka   | 2021-10-20 18:01:07 |
|  5 | hakone      | kanagawa   | 2021-10-20 18:01:10 |
|  6 | kurokawa    | kumamoto   | 2021-10-20 18:02:43 |
|  7 | takeo       | saga       | 2021-10-20 18:02:50 |
|  8 | gero        | gifu       | 2021-10-20 18:02:53 |
|  9 | naruko      | miyagi     | 2021-10-20 18:02:57 |
| 10 | hakkotsu    | nagano     | 2021-10-20 18:03:36 |
+----+-------------+------------+---------------------+
10 rows in set (0.00 sec)

このデータベースを一旦スナップショットを取って復元します。
そのままのデータで復元できるか、検証用にデータを登録しました。

RDSをスナップショットから復元してみる

削除前のRDSの情報

  • 削除する前に、エンドポイント、VPC、セキュリティグループ、サブネットなどの現在の情報を確認し、控えておきましょう。
  • 復元後も同じ設定で復元できるようにします。

削除する

RDSを削除します。

  • 対象のデータベースを選択し、「アクション」から「削除」をクリックします。
  • 画像のような確認画面が表示されます。
  • 「最終スナップショットを作成しますか?」にチェックを入れると削除前の状態でのスナップショットが作成されるのでチェックを入れます。
  • これで問題無ければ一番下のテキストボックスに「delete me」を入力して「削除」をクリックします。
  • するとデータベースが削除され、スナップショットが作成されます。

スナップショットから復元する

RDSを復元してみます。

  • 「スナップショット」から削除時に作成したスナップショットを選択し、「アクション」から「スナップショットを復元」で復元します。
  • デフォルト設定を見てみます。
    デフォルトではVPCは削除前と同じものが設定されていますが、それ以外はデフォルトになっているので直していきます。
  • サブネットグループ、セキュリティグループ、アベイラビリティゾーンを削除前のものと同じに設定します。
  • インスタンスタイプも設定しましょう。
    削除前に「db.t2.micro」などの旧世代のインスタンスタイプを設定していた場合は新世代のインスタンスがデフォルトで設定されているので、正しく設定していきます。
  • 設定が問題無ければ「DBインスタンスを復元」で復元します。

復元後の動作確認

復元後の動作確認。

  • EC2からデータベースへログイン
    設定が問題無ければ削除前と全く同じエンドポイント、ユーザ名、パスワードでログインできます。
[root@rds-test ~]# mysql -u root -p -h {RDSインスタンスのエンドポイント}
Enter password:
  • データは問題無く保持されていました。
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
| test               |
| tmp                |
+--------------------+
7 rows in set (0.00 sec)

MySQL [(none)]> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [test]> select * from animal;
+----+-------+------------+---------------------+
| id | name  | class      | created_at          |
+----+-------+------------+---------------------+
|  1 | cat   | mammals    | 2021-10-20 18:15:49 |
|  2 | eagle | aves       | 2021-10-20 18:15:51 |
|  3 | snake | amphibians | 2021-10-20 18:15:55 |
|  4 | frog  | reptiles   | 2021-10-20 18:15:58 |
|  5 | shark | fish       | 2021-10-20 18:16:02 |
+----+-------+------------+---------------------+
5 rows in set (0.01 sec)

MySQL [test]> select * from hotspring;
+----+-------------+------------+---------------------+
| id | name        | prefecture | created_at          |
+----+-------------+------------+---------------------+
|  1 | beppu       | oita       | 2021-10-20 17:59:02 |
|  2 | noboribetsu | hokkaido   | 2021-10-20 18:00:59 |
|  3 | kusatsu     | gumma      | 2021-10-20 18:01:03 |
|  4 | atami       | shizuoka   | 2021-10-20 18:01:07 |
|  5 | hakone      | kanagawa   | 2021-10-20 18:01:10 |
|  6 | kurokawa    | kumamoto   | 2021-10-20 18:02:43 |
|  7 | takeo       | saga       | 2021-10-20 18:02:50 |
|  8 | gero        | gifu       | 2021-10-20 18:02:53 |
|  9 | naruko      | miyagi     | 2021-10-20 18:02:57 |
| 10 | hakkotsu    | nagano     | 2021-10-20 18:03:36 |
+----+-------------+------------+---------------------+
10 rows in set (0.01 sec)
  • データも追加してみます。
MySQL [test]> INSERT INTO animal VALUES (0, 'penguin', 'aves' ,CURRENT_TIMESTAMP);
Query OK, 1 row affected (0.00 sec)

MySQL [test]> select * from animal where name='penguin';
+----+---------+-------+---------------------+
| id | name    | class | created_at          |
+----+---------+-------+---------------------+
|  6 | penguin | aves  | 2021-10-24 05:57:33 |
+----+---------+-------+---------------------+
1 row in set (0.00 sec)

削除前と同じように正常に使うことが出来ました。

おわりに

RDSはEC2のように長期間停止し、検証や作業などで必要な時だけ起動するという使い方は出来ず、7日経てば起動してしまいます。

検証環境の場合、暫く使わないという場合はスナップショットを取って削除し、必要な時に復元するという方法で復元できます。

今回やってみましたが、思ったより簡単な操作で復元することが出来ました。

余談ですが、今回は検証用のtest用DBということで、動物(animal)と温泉(hotspring)のDBを作ってみました。


少し前に訪れた北海道の登別温泉の地獄谷です。
旅行が好きなので、やはり温泉は良いですね。

今回は初技術ブログで駄文且つ至らない点が多々あるかと思いますが、今後投稿を重ねるにつれて上達して行ければと思います。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA