Aurora MySQL のバックトラック機能を使ってDROP DATABASEをなかったことにしてみた

秩序のないDBにバックトラック
2020.09.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。コンサル部@心はいつも大阪オフィスのYui(@MayForBlue)です。

ひとつ前のブログ(以下)に引き続き、Aurora MySQL のバックトラック機能を試す機会があったので、DROP DATABASE をなかったことにしてみました。

バックトラックとは

バックトラックとは、指定した時間までDBクラスターを「巻き戻す」機能です。
DBクラスター作成時にバックトラック機能を有効化し、バックトラックウィンドウ(巻き戻せる時間(最大72時間))を設定することで利用できます。

データベースを特定の時点に復元するにはスナップショットからの復元などの方法がありますが、バックトラックは新たなDBクラスターを作成するのではなく、そのデータベース自体を特定の時点に巻き戻すため、スナップショットからの復元よりも迅速に実行することができます。

バックトラック機能を有効化すると変更レコード数、時間による課金が発生します。

Aurora DB クラスターのバックトラック

準備

前提

今回使用したのは Aurora MySQL 5.7 です。
また、バックトラック機能を有効にしたAuroraを作成済みとします。

レコードの確認

前回のブログと同じように、テスト用のレコードを用意しておきます。
テストレコードの作成方法などは前回と同じなので、手順は割愛します。
テストレコード作成後の中身を確認してみました。

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
MySQL [testdb]>
MySQL [testdb]> select count(id) from item;
+-----------+
| count(id) |
+-----------+
|     16384 |
+-----------+
1 row in set (0.00 sec)
MySQL [testdb]>
MySQL [testdb]> select * from item where id=1;
+----+---------+--------------------------------+-------+---------------------+
| id | name    | description                    | price | created_at          |
+----+---------+--------------------------------+-------+---------------------+
|  1 | 商品1   | d2cd8d90b95269b5dab1596e1de9f9 |  2486 | 2020-01-26 22:57:08 |
+----+---------+--------------------------------+-------+---------------------+
1 row in set (0.00 sec)
MySQL [testdb]>
MySQL [testdb]> select * from item order by id desc limit 1;
+-------+-------------+--------------------------------+-------+---------------------+
| id    | name        | description                    | price | created_at          |
+-------+-------------+--------------------------------+-------+---------------------+
| 24562 | 商品24562   | 83a4adff062d07c19f4cce6b8805e5 |   805 | 2020-02-28 08:42:49 |
+-------+-------------+--------------------------------+-------+---------------------+
1 row in set (0.00 sec)

DROP DATABASE しちゃう

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

大事なtestdbをなんとうっかりDROP DATABASE しちゃいました。
一応データベースを一覧してみます。

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

あー!!!やっちゃった!!!どうしようーーーーーあーーーー!!!!!!!!
終わった・・・
・・・
そうだ!!!!!私には!!バックトラックがある!!!そう、Auroraならね!!!

手順

というわけで、バックトラック機能を試してみます。

RDSのコンソールから対象のクラスターを選択し、「アクション」の「バックトラック」をクリックします。

戻したい時刻を設定して「DBクラスターのバックトラック」をクリックします。
注意書きされている通りなのですが、バックトラック中はクラスターが使用できなくなります。

バックトラック中はステータスが「backtracking」となります。
利用可能になるまでしばらく待ちます。

バックトラック後のデータベースを確認する

クラスター、インスタンスが利用可能になったら、DROP DATABASEがなかったことになっているか確認します。ドキドキ・・・

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

キャー!!!吹き飛ばしたはずのデータベースが!!!ある!!!素敵!!!

レコードなども確認してみます。

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

MySQL [testdb]>
MySQL [testdb]> select * from item where id=1;
+----+---------+--------------------------------+-------+---------------------+
| id | name    | description                    | price | created_at          |
+----+---------+--------------------------------+-------+---------------------+
|  1 | 商品1   | d2cd8d90b95269b5dab1596e1de9f9 |  2486 | 2020-01-26 22:57:08 |
+----+---------+--------------------------------+-------+---------------------+
1 row in set (0.00 sec)

MySQL [testdb]>
MySQL [testdb]> select * from item order by id desc limit 1;
+-------+-------------+--------------------------------+-------+---------------------+
| id    | name        | description                    | price | created_at          |
+-------+-------------+--------------------------------+-------+---------------------+
| 24562 | 商品24562   | 83a4adff062d07c19f4cce6b8805e5 |   805 | 2020-02-28 08:42:49 |
+-------+-------------+--------------------------------+-------+---------------------+
1 row in set (0.00 sec)

テーブル、レコードも綺麗に戻っていました。ありがとう、バックトラック。

まとめ

というわけで、Aurora MySQL のバックトラック機能を試してみました。
前述した通り、バックトラック機能を有効化することで料金はかかりますが、本番DBなど破壊的な変更が許容されない環境では有効化しておくのも選択肢のひとつだと思います。

この記事がどなたかのお役に立てば幸いです。

以上、コンサル部@心はいつも大阪オフィスのYuiでした。

参考記事

Aurora DB クラスターのバックトラック