Aurora MySQL 5.7 でスナップショットの取得/復元をやってみた

Auroraでスナップショットからの復元をやってみました。
2020.09.30

こんにちは。最近秋らしくなってハピネスなコンサル部のYui(@MayForBlue)です。

Aurora MySQL 5.7 でスナップショットの取得と復元を検証する機会があったので、手順を残しておきたいと思います。

準備

前提

Aurora は構築済みとします。
今回は検証用にシングルマスター構成のtest-rds-clusterを用意しました。

テスト用レコードの作成

リストア後に、元のデータベース内のテーブル、レコードが復元されていることを確認するため、まずはテスト用のレコードを1万行ほど作成します。
テスト用レコードの作成はこちらの記事(MySQLで簡単にランダムなテストデータを作成する方法)を参考にさせていただきました。

検証用のデータベースtestdbを作成する

MySQL [(none)]> CREATE DATABASE testdb;
Query OK, 1 row affected (0.02 sec)

データベース一覧を確認する

MySQL [testdb]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

testdbを選択する

MySQL [(none)]> use testdb;
Database changed

検証用のテーブルitemを作成する

MySQL [testdb]> CREATE TABLE item (
    ->   id INT PRIMARY KEY AUTO_INCREMENT,
    ->   name VARCHAR(10),
    ->   description VARCHAR(30),
    ->   price INT UNSIGNED,
    ->   created_at DATETIME
    -> );
Query OK, 0 rows affected (0.03 sec)

検証用のレコードを作成する

MySQL [testdb]> INSERT INTO item () VALUES ();
Query OK, 1 row affected (0.01 sec)

レコードをコピーして作成する(これを16384行になるまで14回繰り返しました)

MySQL [testdb]> INSERT INTO item (id) SELECT 0 FROM item;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

レコードの内容をランダムな値にアップデートする

MySQL [testdb]> UPDATE item SET
    ->   name = CONCAT('商品', id),
    ->   description = SUBSTRING(MD5(RAND()), 1, 30),
    ->   price = CEIL(RAND() * 10000),
    ->   created_at = ADDTIME(CONCAT_WS(' ','2020-01-01' + INTERVAL RAND() * 180 DAY, '00:00:00'), SEC_TO_TIME(FLOOR(0 + (RAND() * 86401))));
Query OK, 16384 rows affected (0.22 sec)
Rows matched: 16384  Changed: 16384  Warnings: 0

コミットする

MySQL [testdb]> COMMIT;
Query OK, 0 rows affected (0.02 sec)

レコード数を確認する

MySQL [testdb]> select count(id) from item;
+-----------+
| count(id) |
+-----------+
|     16384 |
+-----------+
1 row in set (0.01 sec)

1行目のレコードを確認する

MySQL [testdb]> select * from item where id=1;
+----+---------+--------------------------------+-------+---------------------+
| id | name    | description                    | price | created_at          |
+----+---------+--------------------------------+-------+---------------------+
|  1 | 商品1   | 4f72246ec41233a5e4b7b8a9c05dc4 |  4358 | 2020-04-21 18:31:56 |
+----+---------+--------------------------------+-------+---------------------+
1 row in set (0.00 sec)

テーブルの最終レコードを確認する

MySQL [testdb]> select * from item order by id desc limit 1;
+-------+-------------+--------------------------------+-------+---------------------+
| id    | name        | description                    | price | created_at          |
+-------+-------------+--------------------------------+-------+---------------------+
| 24562 | 商品24562   | 5bfa978fc2b84f0cd0d85a66facdf0 |  8727 | 2020-02-14 14:19:20 |
+-------+-------------+--------------------------------+-------+---------------------+
1 row in set (0.00 sec)

これで事前準備は完了です。

手順

スナップショットの取得

書き込みインスタンスを選択して、「アクション」の「スナップショットの取得」をクリックします。

スナップショット名を入力して「スナップショットの取得」をクリックします。

スナップショット一覧から、作成したスナップショットの詳細を確認できます。
スナップショットの作成が始まるとステータスが「作成中」になるので、これが「利用可能」になるとスナップショットからの復元を実行できます。

また、スナップショット作成中はクラスターのステータスが「バックアップ中」になります。

スナップショットを復元

スナップショットのステータスが「利用可能」になったことを確認したら、スナップショットの一覧画面から対象のスナップショットを選択し、「アクション」の「スナップショットを復元」をクリックします。

設定画面にて、DBインスタンス名など必要な値を設定します。

設定が終わったら「DBインスタンスの復元」をクリックします。

中身の確認

設定通りにクラスターが作成され、利用可能になったことを確認したので、ログインして中身を確認してみました。

データベースにログインする

$ mysql -h test-rds-restore-cluster.cluster-xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u xxxx -P 3306 -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.12-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

データベース一覧を確認する

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.01 sec)

testdbを選択する

MySQL [(none)]> use testdb;
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 [testdb]> select count(id) from item;
+-----------+
| count(id) |
+-----------+
|     16384 |
+-----------+
1 row in set (0.16 sec)

1行目のレコードを確認する

MySQL [testdb]> select * from item where id=1;
+----+---------+--------------------------------+-------+---------------------+
| id | name    | description                    | price | created_at          |
+----+---------+--------------------------------+-------+---------------------+
|  1 | 商品1   | 4f72246ec41233a5e4b7b8a9c05dc4 |  4358 | 2020-04-21 18:31:56 |
+----+---------+--------------------------------+-------+---------------------+
1 row in set (0.01 sec)

テーブルの最終レコードを確認する

MySQL [testdb]> select * from item order by id desc limit 1;
+-------+-------------+--------------------------------+-------+---------------------+
| id    | name        | description                    | price | created_at          |
+-------+-------------+--------------------------------+-------+---------------------+
| 24562 | 商品24562   | 5bfa978fc2b84f0cd0d85a66facdf0 |  8727 | 2020-02-14 14:19:20 |
+-------+-------------+--------------------------------+-------+---------------------+
1 row in set (0.00 sec)

レコードの中身が一致していることを確認できました。

最後に

Aurora MySQL 5.7 でスナップショットを取得、復元する手順をご紹介しました。 この記事がどなたかのお役に立てば幸いです。

以上、コンサル部のYuiでした。

参考記事