Amazon RDS for Oracle – POINT IN TIME RECOVERY

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分以上かかる場合があります。

Amazon RDS for ORACLEを作成する

2.ORACLEデータベースへの接続

データベース接続する必要なホスト名、ポート番号、サービス名、データベースユーザー名、パスワードを入力して、接続します。

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 特定時点への復元を選択

復元したい時刻を選択し、データベースサーバ構成を最初から入力してください。

POINT IN TIME RECOVERY インスタンスの起動

※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 を使用して、特定のテーブルのみ任意の時刻に復元する手順を確認していきます。

タイトルとURLをコピーしました