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.
ちなみに、データベースの画面にある「リストア」ボタンでも同様のリストアが実施できます。
以上。