非CDBをソースとしたリフレッシュ可能クローンPDB

## はじめに
Oracle Database における CDB構成も浸透し、プラガブル・データベース(以下、PDB)とその可搬性についても認知度が向上していると感じます。とは言え、非CDB構成ではない従来の構成で運用中のデータベースも少なくないのではないでしょうか。
12cR1(12.1.0.2)以降では、非CDB構成のデータベースであってもソースとしてクローンし、PDB化する事が可能です。今回は特に、非CDBをクローン元としたリフレッシュ可能なクローンPDB構成を実装してみます。
## 環境について
今回の環境はOracle Database 19c Version 19.26.0.0.0 で実施しています。

![Q14-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/6e91b75d-bdd1-4be0-a847-08dae0ad9e60.png)


PDBクローンの前提条件を確認します。
19cのマニュアルから読み取れる一般的な条件として以下が挙げられています。
- endiannessが同じ
- 双方のデータベース・オプションは同じか、サブセットである
- 12cリリース1 (12.1.0.2)以上が実行されている
- 同じOracle Databaseリリースが実行されている
- 新しく作成したPDBのデータ・ブロック・サイズはCDBと一致している
- クローン元を読取り/書込みでオープン場合、ARCHIVELOGモード運用

<https://docs.oracle.com/cd/F19136_01/multi/cloning-a-pdb.html#GUID-B5D803D4-939B-4D0A-B684-5A1089EA4618>

## 実装の手順および実行
1.	Single Instance (クローン元)環境確認 : source_node
2.	Single Instance (クローン先)環境確認 : target_node
3.	Clone先からのDatabase Linkの作成
4.	リフレッシュ可能クローンPDBの作成と確認

#### 1.	Single Instance (クローン元)環境確認 : source_node
```
SQL> SELECT CDB FROM V$DATABASE;
CDB
---
NO
```
非CDB(non-CDB)構成である事が確認できます。次にArchive logモードの確認をします。
```
SQL> archive log list
データベース・ログ・モード     アーカイブ・モード
自動アーカイブ                 有効
アーカイブ先                    USE_DB_RECOVERY_FILE_DEST
最も古いオンライン・ログ順序   12
アーカイブする次のログ順序    14
現行のログ順序               14
```
#### 2.	Single Instance (クローン先)環境確認 : target_node
```
QL:orcl19c:SYS@CDB$ROOT> SELECT CDB FROM V$DATABASE;
CDB
---
YES

SQL> show pdbs
CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB                            READ WRITE NO (※)
```
※ dbca実行時に作成したPDBです。

#### 3. Clone先からのDatabase Linkの作成
クローン元non-CDBにユーザ(PDBSYS)を作成し、CREATE PLUGGABLE DATABASE 権限を付与。
(今回は connect および resource ロールも付与済み)
ターゲットCDBからソースnon-CDBへの database link DL2 作成も作成
まずは、tnsnames.ora への ソースDBサービスの追記
```
ORCL19NC =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = source_node)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl19nc)
    )
  )
```
データベース・リンクの作成
```
CREATE DATABASE LINK DL2 CONNECT TO PDBSYS IDENTIFIED BY <パスワード>
USING 'ORCL19NC';
```
作成完了(SQL Developer による確認)

![Q14-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/0ee89b04-fd74-48e0-9b14-827aeb6b1ebc.png)
ソース非CDB (orcl19nc) はOMF設定であることも確認
```
SQL> select name from v$datafile;
NAME
----------------------------------------------------------------------
/u01/app/oracle/oradata/ORCL19NC/datafile/o1_mf_system_mwfwz2wy_.dbf
/u01/app/oracle/oradata/ORCL19NC/datafile/o1_mf_sysaux_mwfx062s_.dbf
/u01/app/oracle/oradata/ORCL19NC/datafile/o1_mf_undotbs1_mwfx0z71_.dbf
/u01/app/oracle/oradata/ORCL19NC/datafile/o1_mf_users_mwfx10bh_.dbf
```
#### 4.	リフレッシュ可能クローンPDBの作成と確認
<作成>
```
CREATE PLUGGABLE DATABASE "PDB1926" FROM "ORCL19NC"@"dl2"
STORAGE UNLIMITED TEMPFILE REUSE
FILE_NAME_CONVERT=('/u01/app/oracle/oradata/ORCL19NC/datafile/','/u01/app/oracle/oradata/ORCL19C2/datafile')
REFRESH MODE MANUAL;

SQL> show pdbs
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB                            MOUNTED
         5 PDB1926                        MOUNTED 👈
```
![Q14-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470713/5a20ef20-c325-496c-8f13-1ab1443cb5f7.png)

作成完了(SQL Developer による確認)
<確認>
- Source_node (orcl19ncインスタンス)でスキーマおよびオブジェクトを作成
```
Create user scott IDENTIFIED BY tiger;
GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO scott IDENTIFIED BY tiger;
ALTER USER scott DEFAULT TABLESPACE USERS;
ALTER USER scott TEMPORARY TABLESPACE TEMP;

conn scott/tiger@source_node/pdb1926

DROP TABLE DEPT;
CREATE TABLE DEPT
       (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
	DNAME VARCHAR2(14) ,
	LOC VARCHAR2(13) ) ;
DROP TABLE EMP;
CREATE TABLE EMP
       (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
	ENAME VARCHAR2(10),
	JOB VARCHAR2(9),
	MGR NUMBER(4),
	HIREDATE DATE,
	SAL NUMBER(7,2),
	COMM NUMBER(7,2),
	DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
INSERT INTO DEPT VALUES
	(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES
	(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES
	(40,'OPERATIONS','BOSTON');
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-6-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-6-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
DROP TABLE BONUS;
CREATE TABLE BONUS
	(
	ENAME VARCHAR2(10)	,
	JOB VARCHAR2(9)  ,
	SAL NUMBER,
	COMM NUMBER
	) ;
DROP TABLE SALGRADE;
CREATE TABLE SALGRADE
      ( GRADE NUMBER,
	LOSAL NUMBER,
	HISAL NUMBER );
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
COMMIT; 


SQL> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80-12-17        800                    20
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30
      7566 JONES      MANAGER         7839 81-04-02       2975                    20
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81-05-01       2850                    30
      7782 CLARK      MANAGER         7839 81-06-09       2450                    10
      7788 SCOTT      ANALYST         7566 87-06-13       3000                    20
      7839 KING       PRESIDENT            81-11-17       5000                    10
      7844 TURNER     SALESMAN        7698 81-09-08       1500          0         30
      7876 ADAMS      CLERK           7788 87-06-13       1100                    20
      7900 JAMES      CLERK           7698 81-12-03        950                    30
      7902 FORD       ANALYST         7566 81-12-03       3000                    20
      7934 MILLER     CLERK           7782 82-01-23       1300                    10
```
- target_node (orcl19cインスタンス)でPDBをリフレッシュ
target_node : pdb1926 をリフレッシュして確認
```
SQL> show pdbs
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB                            MOUNTED
         5 PDB1926                        MOUNTED 👈

SQL> alter pluggable database pdb1926 refresh;
プラガブル・データベースが変更されました。
 
SQL> alter pluggable database PDB1926 open read only;
プラガブル・データベースが変更されました。

SQL> conn scott/tiger@target_node/pdb1926
接続されました。
SQL> select * from emp;
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80-12-17        800                    20
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30
      7566 JONES      MANAGER         7839 81-04-02       2975                    20
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81-05-01       2850                    30
      7782 CLARK      MANAGER         7839 81-06-09       2450                    10
      7788 SCOTT      ANALYST         7566 87-06-13       3000                    20
      7839 KING       PRESIDENT            81-11-17       5000                    10
      7844 TURNER     SALESMAN        7698 81-09-08       1500          0         30
      7876 ADAMS      CLERK           7788 87-06-13       1100                    20
      7900 JAMES      CLERK           7698 81-12-03        950                    30
      7902 FORD       ANALYST         7566 81-12-03       3000                    20
      7934 MILLER     CLERK           7782 82-01-23       1300                    10

```
 - アラートログの内容も確認
```
2025-03-06T05:01:00.129632-05:00
alter pluggable database pdb1926 refresh
2025-03-06T05:01:04.686945-05:00
Applying media recovery for pdb-0 from SCN 3622431 to SCN 3798457
Remote log information: count-3
thr-1,seq-12,logfile-/u01/app/oracle/fast_recovery_area/ORCL19NC/archivelog/2025_03_05/o1_mf_1_12_mwht3kf7_.arc,los-3657086,nxs-3718676,maxblks-344431
thr-1,seq-11,logfile-/u01/app/oracle/fast_recovery_area/ORCL19NC/archivelog/2025_03_04/o1_mf_1_11_mwhd1tt5_.arc,los-2200703,nxs-3657086,maxblks-363722
thr-1,seq-13,logfile-/u01/app/oracle/fast_recovery_area/ORCL19NC/foreign_archivelog/orcl19nc/2025_03_06/o1_mf_1_13_mwlwlz58_.arc,los-3718676,nxs-18446744073709551615,maxblks-329761
PDB1926(5):Media Recovery Start 👈
2025-03-06T05:01:04.690630-05:00
PDB1926(5):Serial Media Recovery started
PDB1926(5):max_pdb is 7
2025-03-06T05:01:04.743611-05:00
PDB1926(5):Media Recovery Log /u01/app/oracle/fast_recovery_area/ORCL19NC/archivelog/2025_03_04/o1_mf_1_11_mwhd1tt5_.arc
PDB1926(5):Resize operation completed for file# 22, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_sysaux_mwfx062s_.dbf, old size 942080K, new size 952320K
2025-03-06T05:01:06.503541-05:00
PDB1926(5):Resize operation completed for file# 22, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_sysaux_mwfx062s_.dbf, old size 952320K, new size 962560K
2025-03-06T05:01:06.711159-05:00
PDB1926(5):Media Recovery Log /u01/app/oracle/fast_recovery_area/ORCL19NC/archivelog/2025_03_05/o1_mf_1_12_mwht3kf7_.arc
2025-03-06T05:01:10.716479-05:00
PDB1926(5):Resize operation completed for file# 21, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_system_mwfwz2wy_.dbf, old size 1146880K, new size 1157120K
2025-03-06T05:01:12.839791-05:00
PDB1926(5):Resize operation completed for file# 22, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_sysaux_mwfx062s_.dbf, old size 962560K, new size 972800K
PDB1926(5):Resize operation completed for file# 22, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_sysaux_mwfx062s_.dbf, old size 972800K, new size 983040K
2025-03-06T05:01:13.595027-05:00
PDB1926(5):Media Recovery Log /u01/app/oracle/fast_recovery_area/ORCL19NC/foreign_archivelog/orcl19nc/2025_03_06/o1_mf_1_13_mwlwlz58_.arc
2025-03-06T05:01:14.054102-05:00
PDB1926(5):Resize operation completed for file# 22, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_sysaux_mwfx062s_.dbf, old size 983040K, new size 993280K
2025-03-06T05:01:14.620598-05:00
PDB1926(5):Resize operation completed for file# 22, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_sysaux_mwfx062s_.dbf, old size 993280K, new size 1003520K
PDB1926(5):Resize operation completed for file# 22, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_sysaux_mwfx062s_.dbf, old size 1003520K, new size 1013760K
2025-03-06T05:01:17.810144-05:00
PDB1926(5):Resize operation completed for file# 22, fname /u01/app/oracle/oradata/ORCL19C/datafileo1_mf_sysaux_mwfx062s_.dbf, old size 1013760K, new size 1024000K
2025-03-06T05:01:19.611674-05:00
PDB1926(5):Incomplete Recovery applied until change 3798457 time 03/06/2025 05:01:00
2025-03-06T05:01:19.617495-05:00
PDB1926(5):Media Recovery Complete (orcl19c) 👈
```
15秒ほどでリカバリが完了したことがわかる。

## 最後に
CDB構成におけるデータベース・クローンの技術はPDBの可搬性を高め、様々なユースケースがあると思います。今回試したリフレッシュ可能クローンPDBも検証・開発目的だけでなく、読取り専用PDBとしても活用できることから集計やレポーティングなどの用途もあると思います。
非CDBからPDBでのリフレッシュ可能クローンPDBの利用は、既存の非CDBからCDB構成への統合・集約など移行の際に停止時間を短縮する手段にも活用できそうです。