この投稿は、Nutanix Advent Calendar 2022 の 14日目です。
Nutanix Database Service(NDB)では、DB のプロビジョニングやクローンの際にプリ/ポスト コマンドを実行できます。今回はその機能を利用して、Oracle Databaes の DB をクローンでデータをマスキングしてみます。
今回の内容です。
今回の環境
NDB とクローン元の Oracle Database ソース DB は、下記のようにプロビジョニングしてあります。
構成のイメージです。
1. テスト データの用意
HR スキーマのインストール
今回は、Oracle Database に同梱されているサンプル スキーマの HR(Human Resources)がもつテーブルを利用します。
ソース DB の DB サーバにログインして下記のディレクトリにある SQL ファイルでインストールします。
[oracle@ndb-oracle-01 ~]$ cd $ORACLE_HOME/demo/schema/human_resources [oracle@ndb-oracle-01 human_resources]$ pwd /u02/app/oracle/product/19.0.0/dbhome_1/demo/schema/human_resources [oracle@ndb-oracle-01 human_resources]$ ls -1 hr_analz.sql hr_code.sql hr_comnt.sql hr_cre.sql hr_drop.sql hr_drop_new.sql hr_idx.sql hr_main.sql hr_main_new.sql hr_popul.sql
sqlplus で DB インスタンスに接続します。
[oracle@ndb-oracle-01 human_resources]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Tue Dec 13 17:22:25 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 SQL>
スクリプト実行中に指定する必要があるので、作成されている一時表領域の名前を確認しておきます。
SQL> select TABLESPACE_NAME from DBA_TEMP_FILES; TABLESPACE_NAME ------------------------------ TEMP
SQL スクリプト(hr_main.sql)を実行します。パラメータは下記のように入力しています。
- HR ユーザのパスワード: nutanix4u(スラッシュは避けた)
- スキーマ オブジェクトを作成する表領域: USERS
- 一時表領域: TEMP
- SQL 実行の出力ログ ファイルを出力するフォルダ: /home/oracle/
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/
HR スキーマに含まれるテーブルの一覧です。
SQL> select TABLE_NAME from DBA_TABLES where OWNER = 'HR'; TABLE_NAME -------------------- REGIONS COUNTRIES LOCATIONS DEPARTMENTS JOBS EMPLOYEES JOB_HISTORY 7 rows selected.
マスキング前のデータ確認
今回は、EMPLOYEES テーブルをマスキングしてみます。
SQL> desc HR.EMPLOYEES Name Null? Type ----------------------------------------- -------- ---------------------------- EMPLOYEE_ID NOT NULL NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME NOT NULL VARCHAR2(25) EMAIL NOT NULL VARCHAR2(25) PHONE_NUMBER VARCHAR2(20) HIRE_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) SALARY NUMBER(8,2) COMMISSION_PCT NUMBER(2,2) MANAGER_ID NUMBER(6) DEPARTMENT_ID NUMBER(4)
このテーブルには、下記のようなデータが格納されています。
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.
2. NDB タイムマシン でのスナップショット作成
クローンしたい DB でデータの準備ができたので、NDB のタイムマシンでスナップショットを作成します。
NDB の Web UI で、「データベース」→「ソース」を開きます。
DB の名前をクリックします。
「スナップショット」をクリックします。
スナップショット名を入力して「作成」をクリックします。
スナップショット作成の処理が開始されるので、赤枠のあたりをクリックしてステータスを確認します。
少し待つと、スナップショット作成が完了します。
「タイムマシン」画面を開いて、ソース DB に割り当てられているタイムマシン(今回は orandb2_TM)をクリックします。
タイムマシンの「スナップショット」をクリックすると、作成されたスナップショットを確認できます。
3. クローン DB の作成
それでは、DB をクローンしつつ、データをマスキングしてみます。
タイムマシンの「概要」画面で、「アクション」→「シングル インスタンス データベース クローンの作成」をクリックします。
スナップショットを作成した日(12月14日)と、スナップショットを選択して「次へ」をクリックします。
「新しいサーバーの作成」を選択したまま、以下のパラメータを入力して「次へ」をクリックします。
- データベース サーバー名(仮想マシン名。ホスト名もここから生成)
- コンピュート プロファイル
- ネットワーク プロファイル
データベースの設定を入力します。
- データベースの(NDB に登録する)名前
- Oracle SID
- SYS と SYSTEM のパスワード
- データベース パラメータのプロファイル
そして、「プリ/ポスト コマンド」をクリックします。
「クローン実行前のコマンド」と「クローン実行後のコマンド」を入力して「クローン」をクリックします。
マスキング スクリプトの内容
クローン実行前のコマンド(プリ コマンド)
今回はデータをマスキングする SQL スクリプトファイル(masking.sql)を、curl で外部からをダウンロードします。
- ポスト コマンドで末尾が「~.sql」になっているとシェルで実行されない(自動的に sqlplus で実行される)ため、とりあえず実行されるプリ コマンドで実行しています。
- ダウンロードせず、あらかじめソース DB サーバに配置しておくこともできます。
curl -L -o /tmp/masking.sql https://gist.githubusercontent.com/gowatana/90ad3da6c7714ffd165e885d128257ac/raw/masking.sql
クローン実行後のコマンド(ポスト コマンド)
プリ / ポスト コマンドでは、入力したコマンドの末尾が「~.sql」の場合は自動的に sqlplus で実行されるので、SQL ファイル名のみ入力しておきます。
/tmp/masking.sql
クローンが開始されるので、「オペレーション」画面でステータスを確認しつつ完了を待ちます。「Clone Database」のステータスを開いてみます。
プリ コマンド(Pre-Script)とポスト コマンド(Post-Script)も実行されたことがわかります。
4. クローン DB の確認
「データベース」を開くと、「クローン済み DB」の数が増えているのでクリックして開きます。
クローン DB の名前を開きます。
DB インスタンスの Oracle SID と、DB サーバの IP アドレスを確認しておきます。
クローンで作成された DB サーバに SSH でログインします。ちなみにログイン元の Linux マシンと SSH 秘密鍵は 以前の投稿 で用意したものを流用しています。
[root@lab-linux-02 ~]# ssh -i $HOME/.ssh/id_rsa oracle@192.168.11.141
sqlplus で、クローン作成された DB インスタンスに接続します。
[oracle@ndb-oracle-01-c ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Dec 14 00:38:49 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 SQL>
接続した DB のインスタンス名(SID)を確認しておきます。
SQL> select instance_name,status from v$instance; INSTANCE_NAME STATUS ---------------- ------------ orandb2 OPEN
HR スキーマの EMPLOYEES テーブルを確認すると、データがマスキングされています。
SQL> select EMPLOYEE_ID,FIRST_NAME,LAST_NAME,SALARY from HR.EMPLOYEES where rownum <= 10; EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY ----------- -------------------- ------------------------- ---------- 100 Merry X-mas 24000 101 Merry X-mas 17000 102 Merry X-mas 17000 103 Merry X-mas 9000 104 Merry X-mas 6000 105 Merry X-mas 4800 106 Merry X-mas 4800 107 Merry X-mas 4200 108 Merry X-mas 12008 109 Merry X-mas 9000 10 rows selected.
以上。