NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

NDB で DB を PIT リカバリしてみる。(Oracle)

Nutanix Database Service(NDB)で、Oracle Database の DB を Point in Time(PIT)リカバリしてみます。

今回の内容です。

今回の環境

下記の投稿でプロビジョニングした DB を利用します。

ちなみに、さりげなく DB はアーカイブログ モードを有効化してあります。(NDB 登録前に・・・)

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     22
Next log sequence to archive   24
Current log sequence           24

構成のイメージです。

1. NDB でのタイムマシンの SLA 設定

NDB の PIT リカバリでは、タイムマシンという機能が利用されます。そして、タイムマシンでは、リカバリやクローンで使用するスナップショットやログの取得タイミングや保持期間を、SLA というポリシーで管理しています。

PIT リカバリを実行するには、「継続的なログの保存期間」の日数が設定されている必要があります。今回は、DB のプロビジョニング(と同時のタイムマシンの作成)の時点でデフォルトの「DEFAULT_OOB_BRASS_SLA」を割り当てていたので、「継続的なログの保存期間」が 指定されている「DEFAULT_OOB_GOLD_SLA」を割り当てなおします。ちなみに、タイムマシンの SLA を変更するとこれまで取得していた NDB 管理によるスナップショットやログは削除されます。

NDB の Web UI の「タイムマシン」画面で、DB に対応するタイムマシンの「アクション」→「更新」をクリックします。

SLA を「DEFAULT_OOB_GOLD_SLA」に変更して、「更新」をクリックします。

ちなみにこの SLA は、「継続的なログの保存期間」が 30日に設定されています。

しばらく待つと、タイムマシンの SLA 変更が完了します。

「データベース」画面などでも、タイムマシンの SLA 割り当てが変更されたことがわかります。

2. 検証用データの準備

下記の投稿と同様に、Oracle Database の HR サンプル スキーマを利用します。

2-1. 検証用スキーマの用意

プロビジョニングした DB サーバに SSH 接続します。

[root@lab-linux-02 ~]# ssh root@192.168.11.114

HR スキーマをインストールします。SQL ファイルのあるディレクトリに移動しておきます。

[oracle@ndb-oracle-02 ~]$ cd $ORACLE_HOME/demo/schema/human_resources
[oracle@ndb-oracle-02 human_resources]$ sqlplus / as sysdba

sqlplus で DB インスタンスに接続します。

[oracle@ndb-oracle-02 human_resources]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 15 15:17:27 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

PDB(pdb1)にセッションを切り替えます。

SQL> alter session set container = pdb1;

Session altered.

SQL> show con_name

CON_NAME
------------------------------
PDB1

HR スキーマのテーブルなどを作成する SQL スクリプトを実行します。

SQL> @hr_main.sql

specify password for HR as parameter 1:
Enter value for 1: nutanix4u

specify default tablespeace for HR as parameter 2:
Enter value for 2: USERS

specify temporary tablespace for HR as parameter 3:
Enter value for 3: TEMP

specify log path as parameter 4:
Enter value for 4: /home/oracle/

これで検証用のテーブルが作成できました。

SQL> select TABLE_NAME from DBA_TABLES where OWNER = 'HR';

TABLE_NAME
--------------------------------------------------------------------------------
REGIONS
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
COUNTRIES

7 rows selected.

いったん DB インスタンスから抜けておきます。

SQL> exit

2-2. 検証用テーブルの疑似操作ミス

PIT リカバリの結果をわかりやすく確認するために、検証用テーブルのデータを微妙に更新しておきます。

スクリプトで作成した HR ユーザで DB インスタンスの PDB に接続します。このときのタイムスタンプは Thu Dec 15 15:36:39 2022(JST で 2022/12/15 0:36:39)です。

[oracle@ndb-oracle-02 ~]$ sqlplus HR/nutanix4u@192.168.11.114/PDB1

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 15 15:36:39 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Thu Dec 15 2022 15:33:26 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL>

このデータを・・・

SQL> select EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY from HR.EMPLOYEES where rownum <= 10;

EMPLOYEE_ID FIRST_NAME           LAST_NAME                     SALARY
----------- -------------------- ------------------------- ----------
        100 Steven               King                           24000
        101 Neena                Kochhar                        17000
        102 Lex                  De Haan                        17000
        103 Alexander            Hunold                          9000
        104 Bruce                Ernst                           6000
        105 David                Austin                          4800
        106 Valli                Pataballa                       4800
        107 Diana                Lorentz                         4200
        108 Nancy                Greenberg                      12008
        109 Daniel               Faviet                          9000

10 rows selected.

うっかり全件 update してしまいます。

SQL> update HR.EMPLOYEES set SALARY = 500000;

107 rows updated.

SQL> select EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY from HR.EMPLOYEES where rownum <= 10;

EMPLOYEE_ID FIRST_NAME           LAST_NAME                     SALARY
----------- -------------------- ------------------------- ----------
        100 Steven               King                          500000
        101 Neena                Kochhar                       500000
        102 Lex                  De Haan                       500000
        103 Alexander            Hunold                        500000
        104 Bruce                Ernst                         500000
        105 David                Austin                        500000
        106 Valli                Pataballa                     500000
        107 Diana                Lorentz                       500000
        108 Nancy                Greenberg                     500000
        109 Daniel               Faviet                        500000

10 rows selected.

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@ndb-oracle-02 ~]$ date
2022年 12月 15日 木曜日 15:41:25 UTC

3. タイムマシンでの PIT リカバリ

それでは、NDB の Web UI で、タイムマシンの PIT リカバリを実行してみます。

3-1. ログのキャッチアップ

リカバリ対象のデータベースの画面で、タイムマシンの名前をクリックします。

定期的に実行されている DB ログのキャッチアップ(最終ログ キャッチアップ)が、テーブル更新タイミングよりだいぶ前なので、手動でログのキャッチアップをしておきます。

「アクション」→「ログ キャッチアップ」をクリックします。

確認画面が表示されるので「Yes」をクリックすると処理が開始されます。

少し待ってから、「オペレーション」画面などでキャッチアップの完了を確認しておきます。

3-2. PIT リカバリの実行

タイムマシンの画面に戻り、「アクション」→「ソース データベースのリストア」をクリックします。

データを復元したいタイミングを「ポイント イン タイム」で指定して、「リストア」をクリックします。

今回はデータの update を実行した sqlplus でログイン直後に表示されていたタイムスタンプ(JST で 2022/12/15 0:36:39)をたよりに、その直前の時間(12:36:30)を指定しています。12時というより 0時な気もしますが、0時で入力しても自動的に12時に置き換えられてしまうのでそのまま0時にしています。

確認画面が表示されるので、対象 DB の名前を入力して「リストア」をクリックします。

少し待つと、DB の PIT リカバリが完了します。

4. データの確認

更新ミス直前のタイミングに PIT リカバリした DB に接続してテーブルのデータを確認すると、無事に元に戻っています。

[oracle@ndb-oracle-02 ~]$ sqlplus HR/nutanix4u@192.168.11.114/PDB1

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 15 15:59:12 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Thu Dec 15 2022 15:33:26 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> select EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY from HR.EMPLOYEES where rownum <= 10;

EMPLOYEE_ID FIRST_NAME           LAST_NAME                     SALARY
----------- -------------------- ------------------------- ----------
        100 Steven               King                           24000
        101 Neena                Kochhar                        17000
        102 Lex                  De Haan                        17000
        103 Alexander            Hunold                          9000
        104 Bruce                Ernst                           6000
        105 David                Austin                          4800
        106 Valli                Pataballa                       4800
        107 Diana                Lorentz                         4200
        108 Nancy                Greenberg                      12008
        109 Daniel               Faviet                          9000

10 rows selected.

ちなみに、データベースの画面にある「リストア」ボタンでも同様のリストアが実施できます。

以上。

 

©2023 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。