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

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

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

現在携わっている案件で、テスト環境のデータベース(Oracle Database)部分を設計することになり、プラガブルデータベース(PDB)を使って繰り返しテストで使用できる様な構成を検討した際に、OCI環境を使って構築手順を試したので、その結果を纏めてみました。

 

1.検討したテスト環境

検討したテスト環境のイメージは以下の通りです。

 

 

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

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

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

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

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

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

 

2.ベースとなるPDBの構築手順

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

今回は①~⑤の手順に入る前に、思っていたより手数が多かった、ベースとなるPDBである「PDB01」を構築する手順について記載します。

 

PDB02のベースとなるPDB01は、シードPDB(PDB$SEED)からPDBを生成し、必要な表領域およびユーザを追加することで作成しました。なお、後続のオペレーションや管理を考え、PDB01を構成するデータファイルの格納ディレクトリを明示的に指定して作成することにしました。手順の流れは以下の通りです。

  1. シードPDBを構成しているファイルパスの確認
  2. PDB01を構成するファイルを格納するディレクトリの作成
  3. PDB01の作成
  4. PDB01用のTDE表領域用暗号化キーの作成
  5. PDB01へ表領域&テスト用ユーザの作成

 

2.1 シードPDBを構成しているファイルパスの確認

PDB01を作成する際に必要となるため確認します。また、PDBをローカルUNDOモードで作成したいので、シードPDBがローカルUNDOで構成されているかも合わせて確認します。

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

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

SQL> conn / as sysdba
Connected.

-- シードPDBへ接続
SQL> ALTER SESSION SET CONTAINER = PDB$SEED;

Session altered.

SQL> show con_name

CON_NAME
------------------------------
PDB$SEED   <--- シードPDBに接続された

-- シードPDBのデータファイルパスを確認
SQL> SELECT file_name FROM dba_data_files ORDER BY 1;

FILE_NAME
--------------------------------------------------------------------------------
+DATA/TESTDB_982_NRT/02A979CA24559A30E0630706F40AB807/DATAFILE/sysaux.265.1150708159
+DATA/TESTDB_982_NRT/02A979CA24559A30E0630706F40AB807/DATAFILE/system.264.1150708159
+DATA/TESTDB_982_NRT/02A979CA24559A30E0630706F40AB807/DATAFILE/undotbs1.266.1150708159

-- シードPDBの一時ファイルパスを確認
SQL> SELECT file_name FROM dba_temp_files ORDER BY 1;

FILE_NAME
--------------------------------------------------------------------------------
+DATA/TESTDB_982_NRT/081BB150196B050DE063A10AA8C0764B/TEMPFILE/temp.267.1150708197

-- ローカルUNDOが有効になっているかの確認
SQL> SELECT property_value FROM database_properties WHERE property_name = 'LOCAL_UNDO_ENABLED';

PROPERTY_VALUE
-------------------
TRUE  <--- TRUEなのでローカルUNDOが有効

 

2.2 PDB01を構成するファイルを格納するディレクトリの作成

データベースを構成するファイルは全てASMのDATAディスクグループ内に格納するため、PDB01用のディレクトリを作成します。PDBを作成する前に作成しておかないと、ORA-15173エラーが出てディレクトリがないと怒られます。

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

-- ASMディスクグループ内にディレクトリを作成
grid$> asmcmd mkdir +DATA/PDB01
 → ※親ディレクトリを先に作成しないと後続がエラーとなったため実施
grid$> asmcmd mkdir +DATA/PDB01/DATAFILE +DATA/PDB01/TEMPFILE

 

2.3 PDB01の作成

シードPDBからPDB01をCREATE PLUGGABLE DATABASE文で作成します。PDB01を構成するファイルの格納先を指定するために、file_name_convert句を用いてシードPDBの各ファイルについて、PDB01での変換先を指定しています。

-- 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の作成
SQL> CREATE PLUGGABLE DATABASE PDB01 ADMIN USER pdb01admin IDENTIFIED BY xxxxxxx
  2  file_name_convert = 
  3  ('+DATA/TESTDB_982_NRT/02A979CA24559A30E0630706F40AB807/DATAFILE/sysaux.265.1150708159', '+DATA/PDB01/DATAFILE/sysaux01.dbf',
  4   '+DATA/TESTDB_982_NRT/02A979CA24559A30E0630706F40AB807/DATAFILE/system.264.1150708159', '+DATA/PDB01/DATAFILE/system01.dbf',
  5   '+DATA/TESTDB_982_NRT/02A979CA24559A30E0630706F40AB807/DATAFILE/undotbs1.266.1150708159', '+DATA/PDB01/DATAFILE/undotbs101.dbf',
  6   '+DATA/TESTDB_982_NRT/081BB150196B050DE063A10AA8C0764B/TEMPFILE/temp.267.1150708197', '+DATA/PDB01/TEMPFILE/temp01.dbf')
  7  ;

-- 作成したPDB01をオープンする
SQL> ALTER PLUGGABLE DATABASE PDB01 OPEN;

 

ファイル名はあまりこだわっていなかったので、file_name_convert句で全ファイルを指定せず、ディレクトリレベルだけ指定したかったのですが、下記のようにORA-65180エラーとORA-15113エラーが発生してしまったため、1ファイルずつ指定しました。

SQL> CREATE PLUGGABLE DATABASE PDB01 ADMIN USER pdb01admin IDENTIFIED BY xxxxxxx
  2  file_name_convert = 
  3  ('+DATA/TESTDB_982_NRT/02A979CA24559A30E0630706F40AB807/DATAFILE/', '+DATA/PDB01/DATAFILE',
  4   '+DATA/TESTDB_982_NRT/081BB150196B050DE063A10AA8C0764B/TEMPFILE/', '+DATA/PDB01/TEMPFILE')
  5  ;

CREATE PLUGGABLE DATABASE PDB01 ADMIN USER pdb01admin IDENTIFIED BY xxxxxxx
*
ERROR at line 1:
ORA-65180: duplicate file name encountered -
+DATA/TESTDB_982_NRT/02A979CA24559A30E0630706F40AB807/DATAFILE/sysaux.265.1150708159
ORA-15113: alias name 'DATAFILE' refers to a directory
ORA-15113: alias name 'DATAFILE' refers to a directory
…

 

2.4 PDB01用のTDE表領域用暗号化キーの作成

Oracle Base Database Serviceでは、デフォルトで透過的データ暗号化(TDE)が有効となっていることもあり、PDB01へ表領域を作成する前に、PDB用の暗号化マスターキーを有効にする必要があります。有効にしないと、以下のようにORA-28361エラーが出て怒られます。

SQL> CREATE TABLESPACE USERS DATAFILE '+DATA/PDB01/DATAFILE/users01.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO;
CREATE TABLESPACE USERS DATAFILE '+DATA/PDB01/DATAFILE/users01.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO
*
ERROR at line 1:
ORA-28361: master key not yet set

 

というわけで、暗号化キーを作成していきます。これを実施するために、Oracle Base Database Serviceで提供されているdbcliを使用します。まずは暗号化キー作成対象のID情報をdbcli list-databaseで取得します。

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

-- 暗号化キー作成対象DBのID情報の取得
root$> cd /opt/oracle/dcs/bin
root$> ./dbcli list-database

ID                                       DB Name    DB Type  DB Version           CDB        Class    Shape    Storage    Status        DbHomeID
---------------------------------------- ---------- -------- -------------------- ---------- -------- -------- ---------- ------------ ----------------------------------------
123456ab-7890-1c23-de4f-a567b8901234     TESTDB     Si       19.20.0.0.0          true       Oltp              ASM        Configured   ab012cd3-e45f-6a78-bc90-de12fab3c4d5

次にdbcli update-tdekeyで、暗号化キーを作成します。このとき、先程確認したID情報(-i)と、対象のPDB名(-n)を指定します。また、-pを引数なしで指定することで、TDE管理ウォレッットパスワードの入力を要求されるので、Oracle Base Database Service作成時に指定したsysユーザのパスワードを入力します。

dbcli update-tdekeyを実行すると、暗号化キーを作成するジョブが起動されるので、dbcli list-jobsで暗号化キー作成ジョブのID(jobIdの値)を頼りに、ジョブのstatusがSuccessになっていることを確認します。

-- TDE表領域用暗号化キーの作成処理の実行 
root$> ./dbcli update-tdekey -i 123456ab-7890-1c23-de4f-a567b8901234 -n PDB01 -p 
TDE Admin wallet password: <-- sysユーザのパスワードを入力
{
  "jobId" : "1a2345b6-789c-0123-d456-ef78ab9c01c2",
  "status" : "Created",
  "message" : null,
  "errorCode" : "",
  "reports" : [ ],
  "createTimestamp" : "October 21, 2023 23:27:43 PM JST",
  "resourceList" : [ ],
  "description" : "TDE update TESTDB - PDBs: [PDB01]",
  "updatedTime" : "October 21, 2023 23:27:44 PM JST",
  "percentageProgress" : "0%",
  "cause" : null,
  "action" : null
}

-- 作成処理の完了確認 
root$> ./dbcli list-jobs
ID                                       Description                                                                 Created                             Status    
---------------------------------------- --------------------------------------------------------------------------- ----------------------------------- ----------
…   
1a2345b6-789c-0123-d456-ef78ab9c01c2     TDE update TESTDB - PDBs: [PDB01]                                           Saturday, October 21, 2023, 23:27:43 JST Success   

 

2.5 PDB01へ表領域&テスト用ユーザの作成

準備が整ったので、PDB01へ表領域とテスト用ユーザを作成します。テストユーザには権限付与も実施しますが、付与した全権限を記載すると長いので、一部のみの記載としました。

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

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

SQL> conn / as sysdba
Connected.

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

Session altered.

SQL> show con_name

CON_NAME
------------------------------
PDB01   <--- PDB01に接続された

-- 表領域の作成
SQL> CREATE TABLESPACE users DATAFILE '+DATA/PDB01/DATAFILE/users01.dbf' SIZE 100M AUTOEXTEND OFF
  2  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO;

Tablespace created.

-- テスト用ユーザの作成と権限付与
SQL> CREATE USER test IDENTIFIED BY xxxxxxxxx DEFAULT TABLESPACE users;

User created.

SQL> grant create session to test;

Grant succeeded.

SQL> grant unlimited tablespace to test;

Grant succeeded.
…(以下略)

 

これでベースとなるPDBがようやくできました。本来の目的だった、テストで繰り返し使用できるPDB02の構築手順は次回に。

 

 

おまけ:PDBのサービス名の確認方法

PDBのローカルユーザを用いて接続する場合、リスナー経由でPDBへ接続する必要があります。tnsnames.oraに接続定義を追加して接続するにしろ、簡易接続ネーミングメソッドで接続するにしろ、PDBのサービス名を把握する必要があります。

手っ取り早くPDBのサービス名を調べるために、lsnrctlコマンドを使うことができます。

-- サービス名の確認
oracle$> lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 03-NOV-2023 22:46:46

Copyright (c) 1991, 2023, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                03-NOV-2023 22:42:43
Uptime                    0 days 0 hr. 4 min. 3 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/19.0.0.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/grid/diag/tnslsnr/testdb02/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.xxx.xxx)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...

(中略)

Service "pdb01.test.example" has 1 instance(s).
  Instance "TESTDB", status READY, has 2 handler(s) for this service...

(中略)

The command completed successfully


-- 簡易接続ネーミングメソッドでの接続
oracle$> sqlplus test@192.168.xxx.xxx:1521/pdb01.test.example

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Nov 3 23:41:57 2023
Version 19.20.0.0.0

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

Enter password:
Last Successful login time: Fri Nov 03 2023 23:23:40 +09:00

Connected to:
Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.20.0.0.0

SQL>

 

 

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

 

前回の記事:Oracle19cと23cの隠しパラメータの差分について調べてみた ~その6~