データベースについて調べてみた

データベースについて調べたことのメモ。Oracle要素多めになる予定。

PDBを使ったテスト環境の作り方を調べてみた ~ その2 ~

前回に続き、プラガブルデータベース(PDB)を使って繰り返しテストで使用できる様な環境の構築手順について、纏めてみました。

前回は構築準備として、テスト環境のベースとなるPDBの構築手順で終わっていたので、今回はテスト用に繰り返し利用できるPDBの構築部分を纏めています。

 

1.検討したテスト環境(再掲)

前回掲載した、検討したテスト環境のイメージと手順の流れを再掲します。

 

 

 ①ベースとなるPDBである「PDB01」を複製した「PDB02」を用意

 ②これに対してテーブルやインデックスの作成、試験データのロードなど
  テスト要件に合わせたテスト環境構築を実施

 ③これをテスト開始可能状態の断面PDBとして、「PDB02BK」として保持

 ④「PDB02」を用いてテスト処理を実行

 ⑤テストが終了したら、テスト処理で更新された「PDB02」を破棄し、
  「PDB02BK」を用いて「PDB02」を再作成することで、テスト開始前の状態に復旧  

 ※以降は④と⑤を繰り返しテストを進めていく

 

今回は本題となる、上記手順について記載しますが、②と④はテスト要件やテスト内容でまちまちなので、ここでは記述を割愛します。

なお、構築手順の確認は、OCIのOracle Base Database Serviceで構築したOracle 19c(19.20.0)の非RAC環境を用いて実施しました。

 

2. ①PDB01からPDB02の作成

まず、PDB02を構成するファイルを格納するディレクトリを、ASMディスクグループの中に作成します。

-- DBサーバにログインしたユーザ(opc)からgridユーザへ切り替え
opc$> sudo su - grid

-- ASMディスクグループにPDB02用のディレクトリを作成
grid$> asmcmd mkdir +DATA/PDB02
grid$> asmcmd mkdir +DATA/PDB02/DATAFILE +DATA/PDB02/TEMPFILE

 

次にCDBへ接続して、CREATE PLUGGABLE DATABASE文で、PDB01を基にしてPDB02を作成します。KEYSTORE句ではOracle Base Database Service作成時に指定したsysユーザのパスワードを指定します。

なお、シードPDBからPDB01を作成した際は、FILE_NAME_CONVERT句で1ファイルずつ指定していましたが、PDB01は明示的に指定したファイル格納位置(非OMF)だったためか、ディレクトリレベルの指定だけで作成することができました。

-- DBサーバにログインしたユーザ(opc)からoracleユーザへ切り替え
opc$> sudo su - oracle

-- SQL*Plusでデータベース(CDB)へ接続
oracle$> sqlplus /nolog

SQL> conn / as sysdba
Connected.

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

-- PDB01からPDB02を作成
SQL> CREATE PLUGGABLE DATABASE PDB02 FROM PDB01
  2  FILE_NAME_CONVERT = ('+DATA/PDB01/', '+DATA/PDB02/')
  3  KEYSTORE IDENTIFIED BY "xxxxxxx";  <-- sysユーザのパスワードを指定

Pluggable database created.

-- 作成したPDB02のオープン
SQL> ALTER PLUGGABLE DATABASE PDB02 OPEN;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         4 PDB01                          READ WRITE NO
         7 PDB02                          READ WRITE NO   <--- READ WRITEでオープン

-- PDB02への接続
SQL> ALTER SESSION SET CONTAINER = PDB02;

-- データファイルが指定したディレクトリに作成されているか確認
SQL> SELECT file_name FROM dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
+DATA/PDB02/DATAFILE/system01.dbf
+DATA/PDB02/DATAFILE/sysaux01.dbf
+DATA/PDB02/DATAFILE/undotbs101.dbf
+DATA/PDB02/DATAFILE/users01.dbf

 

3. ③PDB02のテスト開始前断面となるPDB02BKの作成

このPDB02BKの作成手順は、PDB01からPDB02を作成した際とほぼ同じ手順となっています。異なる点を強いて言えば、PDB02BKは断面のPDBなので、更新されることを極力防ぐために、最後はクローズ状態にしておくくらいになっています。

まずは、PDB02BKを構成するファイルを格納するディレクトリを、ASMディスクグループの中に作成します。

-- DBサーバにログインしたユーザ(opc)からgridユーザへ切り替え
opc$> sudo su - grid

-- ASMディスクグループにPDB02BK用のディレクトリを作成
grid$> asmcmd mkdir +DATA/PDB02BK
grid$> asmcmd mkdir +DATA/PDB02BK/DATAFILE +DATA/PDB02BK/TEMPFILE

 

次にCDBへ接続して、CREATE PLUGGABLE DATABASE文で、PDB02を基にしてPDB02BKを作成します。KEYSTORE句ではOracle Base Database Service作成時に指定したsysユーザのパスワードを指定します。

-- DBサーバにログインしたユーザ(opc)からoracleユーザへ切り替え
opc$> sudo su - oracle

-- SQL*Plusでデータベース(CDB)へ接続
oracle$> sqlplus /nolog

SQL> conn / as sysdba
Connected.

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

-- PDB02からPDB02BKを作成
SQL> CREATE PLUGGABLE DATABASE PDB02BK FROM PDB02
  2  FILE_NAME_CONVERT = ('+DATA/PDB02/', '+DATA/PDB02BK/')
  3  KEYSTORE IDENTIFIED BY "xxxxxxx";  <-- sysユーザのパスワードを指定

Pluggable database created.

 

作成したPDB02BKが壊れていないかを簡易的に確認する意味で一度オープンした後に、余計な更新を発生させないようにクローズ(マウント状態)にしておきます。

-- 作成したPDB02BKのオープン
SQL> ALTER PLUGGABLE DATABASE PDB02BK OPEN;

Pluggable database altered.

-- 作成したPDB02BKのクローズ
SQL> ALTER PLUGGABLE DATABASE PDB02BK CLOSE;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         4 PDB01                          READ WRITE NO
         5 PDB02BK                        MOUNTED    <--- MOUNT状態
         7 PDB02                          READ WRITE NO

 

4. ⑤PDB02をテスト開始前の状態へ復旧

テストで更新されたPDB02を一旦削除します。PDBを削除する際は、対象PDBをクローズ(MOUNT)状態にする必要があります。また、削除した後にPDB02を再作成するので、削除時にデータファイルも併せて削除する様に、INCLUDEING DATAFILES句を付与します。

-- DBサーバにログインしたユーザ(opc)からoracleユーザへ切り替え
opc$> sudo su - oracle

-- SQL*Plusでデータベース(CDB)へ接続
oracle$> sqlplus /nolog

SQL> conn / as sysdba
Connected.

-- PDB02のクローズ
SQL> ALTER PLUGGABLE DATABASE PDB02 CLOSE;

Pluggable database altered.

-- PDB02の削除
SQL> DROP PLUGGABLE DATABASE PDB02 INCLUDING DATAFILES;

Pluggable database dropped.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         4 PDB01                          READ WRITE NO
         5 PDB02BK                        MOUNTED
※PDB02が表示されない(=削除されている)

 

次に、テスト開始前の断面となるPDB02BKからPDB02を作成します。このとき、作成のベースとなるPDB(ここではPDB02BK)は、オープン状態である必要があるので、オープンしてからCREATE PLUGGABLE DATABASE文を実行します。

-- PDB02BKのオープン
SQL> ALTER PLUGGABLE DATABASE PDB02BK OPEN;

Pluggable database altered.

-- PDB02BKからPDB02を作成
SQL> CREATE PLUGGABLE DATABASE PDB02 FROM PDB02BK
  2  FILE_NAME_CONVERT = ('+DATA/PDB02BK/', '+DATA/PDB02/')
  3  KEYSTORE IDENTIFIED BY "xxxxxxx";  <-- sysユーザのパスワードを指定

Pluggable database created.

-- 作成したPDB02のオープン
SQL> ALTER PLUGGABLE DATABASE PDB02 OPEN;

Pluggable database altered.

-- PDB02BKのクローズ
SQL> ALTER PLUGGABLE DATABASE PDB02BK CLOSE;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         4 PDB01                          READ WRITE NO
         5 PDB02BK                        MOUNTED        <--- MOUNT状態
         7 PDB02                          READ WRITE NO  <--- オープン状態

 

これでPDB02をテスト開始前の状態に戻すことができました。

 

おまけ: PDB02の断面作成にスナップショットPDBを使いたかったが…

今回PDB02のテスト開始前断面として、PDB02BKを作成していましたが、本当はPDBスナップショットを使おうとしていたのですが、下記の様にORA-00988エラーが発生してしまい、PDBスナップショットの作成ができませんでした。

-- PDBスナップショットの作成対象となるPDB02へ接続
SQL> ALTER SESSION SET CONTAINER = PDB02;

Session altered.

SQL> ALTER PLUGGABLE DATABASE SNAPSHOT pdb02snap01;
ALTER PLUGGABLE DATABASE SNAPSHOT pdb02snap01;
*
ERROR at line 1:
ORA-00988: missing or invalid password(s)

 

色々調べて見たところ、Oracle18cの時点ではTDE暗号化表領域を含んだPDBは、PDBスナップショットが未対応であることが、下記のオラクル社のOracle Database18cに関する資料(p.22)に記載されていました。

https://www.oracle.com/jp/a/ocom/docs/jp-db-technight-content/23-2-mta-18c-newfeatures-dl-final.pdf

 

19cでこの制限が解消されているか少し調べてみたのですが、結局わからなかったため、今回はPDBスナップショットの利用を諦めました。

19cのマニュアルを深く調査したり、23cでは大丈夫なのか実機確認してみたりなど、時間があれば手を出したいと思います。

 

 

次の記事:スタンバイデータベースで統合監査がどうなるか調べてみた

 

前回の記事:PDBを使ったテスト環境の作り方を調べてみた ~ その1 ~