ORACLE データベースに限らず、誤ってテーブルのデータを消したり、変更してしまった場合、RDBMS の POINT IN TIME RECOVERY でデータベースを復元する機能があります。
今回は Amazon Relational Database Service (Amazon RDS) for OracleのPOINT IN TIME RECOVERY について、チュートリアルを中心に説明・紹介したいと思います。
POINT IN TIME RECOVERY
現在 Amazon RDS for ORACLE に搭載されている Flashback 機能の中で Flashback Table , Flashback Query, Flashback Transaction Query がありますが、Flashback Database は使用できません。
そのため、データベース全体を特定時点に復元するには、AWS が提供している POINT IN TIME RECOVERY 機能でデータベースインスタンスをまるごと復元する必要があります。
なお POINT IN TIME RECOVERY は Restoring a DB Instance to a Specified Time と呼ばれることもあります。
チュートリアルの事前準備
Amazon RDS for ORACLEの構成
エディション | Oracle Standard Edition Two |
バージョン | Oracle 12.1.0.2v17 |
ライセンス | license-included |
テンプレート | 本番稼働用 |
DBインスタンス識別子 | awscomt |
DBインスタンスサイズ | db.m5.xlarge (vCPU:4,RAM:16GiB,EBS:3500Mbps) |
ストレージタイプ | プロビジョンドIOPS(SSD) |
ストレージ割り当て | 100GiB |
プロビジョンドIOPS | 1000 |
マルチAZ配置 | スタンバイインスタンスを作成する |
セキュリティグループ | <Oracleクライアントから接続できるように設定してください> |
データベース名 | DB1 |
DBパラメータグループ | デフォルト |
Option Group | デフォルト |
文字セット | AL32UTF8 |
自動バックアップの有効化 | はい |
今回はデータベースへの接続用端末を一台用意しました。
周辺端末・ツール
今回はデータベースの内容 (テーブルなど) を確認するために、SQL 発行ツール(Oracle SQL*Plusなど) を用意して、端末(Windows) にインストールしております。
チュートリアル
このチュートリアルを開始する前に、必ず上記の Amazon RDS for ORACLE と端末に Oracle クライアントをインストールしてください。
チュートリアルでは以下2つ構成(コンポーネント)で実現しています。
- AWS RDS for ORACLE
- Amazon Elastic Compute Cloud (Amazon EC2)
※データベースクライアントツールをインストール済み
1.Amazon RDS for ORACLEを作成
- 上記の構成で作成しても、最小構成で作成しても構いません。
- データベース作成は10分以上かかる場合があります。
2.ORACLEデータベースへの接続
データベース接続する必要なホスト名、ポート番号、サービス名、データベースユーザー名、パスワードを入力して、接続します。
3.Oracleデータベーステーブル作成およびデータ投入
このチュートリアルでは、復元できたかを確認しやすいように、一秒間隔で「現在の時刻の文字列」と「現在の時刻を時刻データ」をデータとしてテーブルに挿入しています。
テーブル名「Table」の作成SQL文サンプル
create table "Table01" (Id NUMBER(19) generated by default on null as identity constraint "PK_Table01" primary key, TableName NVARCHAR2(2000), InsertDateTimeString NVARCHAR2(2000), InsertDateTime TIMESTAMP(7) not null );
一秒間隔でデータを挿入するC# コードのサンプル
// loop 1200 time for( int i = 0 ; i < 1200 ; i++ ) { //insert into Table01 await OracleDbConnection.Table01.AddAsync( new Table01() ); //COMMIT await OracleDbConnection.SaveChangesAsync(); //Sleep one Second Thread.Sleep(1000); }
4.挿入されたデータを確認(一部)
select * from "Table01"; Id TableName InsertDateTimeString InsertDateTime ------- ------------- ------------------------- ---------------------------- ::: 112 Table01 8/15/2019 10:29:50 AM 2019-08-15 10:29:50.4830807 113 Table01 8/15/2019 10:29:51 AM 2019-08-15 10:29:51.5250651 114 Table01 8/15/2019 10:29:52 AM 2019-08-15 10:29:52.5660862 115 Table01 8/15/2019 10:29:53 AM 2019-08-15 10:29:53.6071142 116 Table01 8/15/2019 10:29:54 AM 2019-08-15 10:29:54.6745007 117 Table01 8/15/2019 10:29:55 AM 2019-08-15 10:29:55.7155107 118 Table01 8/15/2019 10:29:56 AM 2019-08-15 10:29:56.7575129 119 Table01 8/15/2019 10:29:57 AM 2019-08-15 10:29:57.7975582 120 Table01 8/15/2019 10:29:58 AM 2019-08-15 10:29:58.8375971 121 Table01 8/15/2019 10:29:59 AM 2019-08-15 10:29:59.9284349 ★ 122 Table01 8/15/2019 10:30:00 AM 2019-08-15 10:30:00.9704357 123 Table01 8/15/2019 10:30:02 AM 2019-08-15 10:30:02.0124255 124 Table01 8/15/2019 10:30:03 AM 2019-08-15 10:30:03.0544300 125 Table01 8/15/2019 10:30:04 AM 2019-08-15 10:30:04.0954498 126 Table01 8/15/2019 10:30:05 AM 2019-08-15 10:30:05.1716260 127 Table01 8/15/2019 10:30:06 AM 2019-08-15 10:30:06.2136436 128 Table01 8/15/2019 10:30:07 AM 2019-08-15 10:30:07.2585555 129 Table01 8/15/2019 10:30:08 AM 2019-08-15 10:30:08.2995733 130 Table01 8/15/2019 10:30:09 AM 2019-08-15 10:30:09.3405906 131 Table01 8/15/2019 10:30:10 AM 2019-08-15 10:30:10.3846636
5.POINT IN TIME RECOVERY 実行
RDSデータベースを選択 > アクション > 特定時点への復元を選択
復元したい時刻を選択し、データベースサーバ構成を最初から入力してください。
※POINT IN TIME RECOVERY操作でデータベースホスト名を新たに作成する必要がありますので、データベースクライアントからの接続文字列も更新する必要があります。
6.POINT IN TIME RECOVERY後のデータ確認
select * from "Table01"; Id TableName InsertDateTimeString InsertDateTime ------- ------------- ------------------------- ---------------------------- ::: 112 Table01 8/15/2019 10:29:50 AM 2019-08-15 10:29:50.4830807 113 Table01 8/15/2019 10:29:51 AM 2019-08-15 10:29:51.5250651 114 Table01 8/15/2019 10:29:52 AM 2019-08-15 10:29:52.5660862 115 Table01 8/15/2019 10:29:53 AM 2019-08-15 10:29:53.6071142 116 Table01 8/15/2019 10:29:54 AM 2019-08-15 10:29:54.6745007 117 Table01 8/15/2019 10:29:55 AM 2019-08-15 10:29:55.7155107 118 Table01 8/15/2019 10:29:56 AM 2019-08-15 10:29:56.7575129 119 Table01 8/15/2019 10:29:57 AM 2019-08-15 10:29:57.7975582 120 Table01 8/15/2019 10:29:58 AM 2019-08-15 10:29:58.8375971 121 Table01 8/15/2019 10:29:59 AM 2019-08-15 10:29:59.9284349 ★
データベースが、復元時に指定した時刻である午前10時30分00秒の状態に戻ったことが確認できました。
まとめ
同一データベースに対して POINT IN TIME RECOVERY 操作するのではなく、事前に作成されたデータベースから取得していたバックアップとREDOログを使って、新たにデータベースを作成する必要があります。
結果的に2つのデータベースが出来上がるので、本番環境では POINT IN TIME RECOVERY 操作の後に不要なデータベースも削除する必要があります。
次回はこの POINT IN TIME RECOVERY を使用して、特定のテーブルのみ任意の時刻に復元する手順を確認していきます。