NTNX>日記

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

NDB の Oracle Database クローンでデータ マスキングしてみる。

この投稿は、Nutanix Advent Calendar 2022 の 14日目です。

adventar.org

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.

以上。

 

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