[Oracle Database] Refreshable Clone PDBを作成してみてみた

Oracle Database 12c Release 2 (12.2) の新機能 リフレッシュ可能なクローンPDB (Refreshable PDB Clone) は、ソースPDBと定期的に同期できる読取り専用クローンです。

<img width="600" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/4006c82e-84b1-6432-25dd-fb46d4372dd6.jpeg">


**・ 同期**
クローンPDBをリフレッシュすると、最後のREDOログの適用以降に蓄積されたREDOでクローンPDBが更新されます。 
REFRESH MODE句で指定した値に応じて、同期は自動または手動で行われます。

**・ アップグレード時間短縮**
リリース・バージョンが異なる CDB 間で リフレッシュ可能な PDB を作成し、最後の瞬間まで同期を保ち、最後に移行するPDBをアップグレードすることでバージョンアップのダウンタイム時間を短縮することができます。

**・ 可用性とロードバランシング(18c新機能)**
リフレッシュ可能なクローンは、読取り専用でOPENでき、ソースPDBとそのリフレッシュ可能なクローンのロールを切り替えることができます。このスイッチオーバーは、CDB 間のロードバランシングや、ソース PDB に障害が発生した場合に役立ちます。

ということで、リフレッシュ可能なクローン (Refreshable Clone) PDBを作成してみてみます。

# ■ 環境
今回は、同一バージョンで Refreshable Clone PDBを作成してみてみます。
|  |Source  |Target  |
|---|---|---|
|Database version  |23.3.0.23.09 |23.3.0.23.09  |
|Host Name  |basedb23c-tokyo |basedb23c-shibuya  |
|PDB Name  |PDB_TOKYO  |REFRESHABLE_CLONE_PDB  |


# ■ 前提条件
次の前提条件を満たしている必要があります。
　・ [リモートPDBのクローニング前提条件](https://docs.oracle.com/cd/F19136_01/multi/cloning-a-pdb.html#GUID-2512C9E9-FD11-4F33-871B-892ED5FC4079)
　・ [リフレッシュ可能なクローンPDBの要件](https://docs.oracle.com/cd/F19136_01/multi/cloning-a-pdb.html#GUID-30E0CC68-4F4C-4E58-9451-6390406D90A1)


# ■ Oracle Database 作成
今回は、Oracle Cloud の [Base Database Service](https://www.oracle.com/jp/database/base-database-service/) を使用します。作成手順は次を参考にできます。

https://qiita.com/shirok/items/4cd7864e29b8888ca866


# ■ Source DB 設定

## ● CDB へ Refreshable Clone用 USER作成

**1) CDB へ Login**
```
[oracle@basedb23c-tokyo ~]$ sql / as sysdba


	SQLcl: Release 23.2 Production on Sat Feb 17 10:33:45 2024

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

	Connected to:
	Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
	Version 23.3.0.23.09

SQL>
```


**2) Create User**
データベース リンクが接続するリモート データベースのユーザーは、CREATE PLUGGABLE DATABASE権限が必要です。

```
SQL> CREATE USER c##refresh IDENTIFIED BY <Password> CONTAINER=ALL;

  User C##REFRESH created.


SQL> GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO c##refresh CONTAINER=ALL;

  Grant succeeded. 
```

## ● Source PDB環境確認

**1) Local UNDO 確認**
Local UNDO は、クローン作成プロセス中にソースが読み取り/書き込み状態を維持できるようにするために必要です。
```
SQL> SELECT property_name, property_value FROM database_properties WHERE property_name = 'LOCAL_UNDO_ENABLED';

 	         PROPERTY_NAME    PROPERTY_VALUE
	  _____________________ _________________
	  LOCAL_UNDO_ENABLED    TRUE
```

**2) 既存 PDB確認**
```
SQL> show pdbs

	   CON_ID     CON_NAME     OPEN MODE    RESTRICTED
	_________ ____________ _____________ _____________
	        2 PDB$SEED     READ ONLY     NO
	        4 PDB_TOKYO    READ WRITE    NO
```


## ● 既存 PDBへテスト・データ作成

```
SQL> alter session set container=PDB_TOKYO;

  Session altered.

SQL> CREATE TABLE test_table1 (id NUMBER(8), now DATE) TABLESPACE USERS;

	Table TEST_TABLE1 created.

SQL> INSERT INTO test_table1 VALUES (1,SYSDATE);

  1 row inserted.

SQL> commit;

  Commit complete.

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';

  Session altered.

SQL> select * from test_table1;

	   ID NOW
	_____ ______________________
	    1 2024/02/17 10:58:26
```



# ■ Target DB 設定

## ● SQL*NET設定
Oracle Cloud の場合、OCIコンソールから 接続文字列を確認し、tnsnames.ora を編集して Sorce CDB 接続文字列を追加します


**1) ソースPDB画面**
PDB画面で [PDB connection]をクリック
![Tnsnames_Connection01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/03f64151-2a86-b1f8-55b6-7e326592caa5.jpeg)


**2) Pluggable Database Connection（接続文字列）確認**
Connection Strings から Long Format をコピー
![Tnsnames_Connection02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/ed488f72-f0de-72eb-37d1-2bd23c92d127.jpeg)


**3) tnsnames.ora 編集**
コピーしたソース PDB の接続文字列 をターゲット データベースの tnsnames.ora に追加します。
```
[oracle@basedb23c-shibuya ~]$ vi $ORACLE_HOME/network/admin/tnsnames.ora
[oracle@basedb23c-shibuya ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora

PDB_TOKYO =
  (DESCRIPTION=(CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=3)(RETRY_COUNT=3)(ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.0.2)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=PDB_Tokyo.publicsubnet.vcnexatokyo.oraclevcn.com)))
```


## ● Create dblink
ターゲット DB 上に ソース DB への DBLink を作成します。

**1) SQLcl 接続**
```
[oracle@basedb19c-shibuya ~]$ sql / as sysdba


  SQLcl: Release 23.2 Production on Sat Feb 17 11:14:45 2024

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

  Connected to:
  Oracle Database 23c EE Extreme Perf Release 23.0.0.0.0 - Production
  Version 23.3.0.23.09


SQL>
```



**2) Public DBLink 作成**
```
SQL> create public database link refresh_pdb connect to c##refresh identified by <Password> using 'PDB_TOKYO';

  Database link REFRESH_PDB created.
```


**3) Public DBLink 作成確認**
データベースリンクがターゲットデータベースで機能しているかどうかを確認します
```
SQL> alter session set global_names=false;

  Session altered.

SQL> select * from dual@refresh_pdb;

  DUMMY
  ________
  X
```





## ● Refreshable Clone PDB作成

**1) 既存PDB確認**
```
SQL> show pdbs

		   CON_ID CON_NAME       OPEN MODE     RESTRICTED
		_________ ______________ _____________ _____________
		        2 PDB$SEED       READ ONLY     NO
		        3 PDB_SHIBUYA    READ WRITE    NO
```

**2) Refreshable Clone PDB作成**
```
SQL> CREATE PLUGGABLE DATABASE Refreshable_Clone_PDB FROM PDB_TOKYO@refresh_pdb REFRESH MODE EVERY 30 MINUTES KEYSTORE IDENTIFIED BY ・・・;

  Pluggable database REFRESHABLE_CLONE_PDB created.


  -- Alert LOG確認
    2024-02-17T11:16:36.808932+00:00
    Opatch validation is skipped for PDB REFRESHABLE_CLONE_PDB (con_id=4)
    2024-02-17T11:16:40.192589+00:00
    ****************************************************************
    Pluggable Database REFRESHABLE_CLONE_PDB with pdb id - 4 is created as UNUSABLE.
    If any errors are encountered before the pdb is marked as NEW,
    then the pdb must be dropped
    local undo-1, localundoscn-0x000000000000011a
    ****************************************************************
    2024-02-17T11:16:43.201120+00:00
    Recovering pdb-4099 from SCN 78504552 to SCN 78504581 trc /u01/app/oracle/diag/rdbms/cdb_shibuya/CDB23c/trace/CDB23c_ora_69906.trc
    REFRESHABLE_CLONE_PDB(4):Media Recovery Start
    REFRESHABLE_CLONE_PDB(4): Started logmerger process under PDB 4
    2024-02-17T11:16:43.279602+00:00
    REFRESHABLE_CLONE_PDB(4):Parallel Media Recovery started with 4 slaves
    2024-02-17T11:16:43.558736+00:00
    REFRESHABLE_CLONE_PDB(4):Incomplete Recovery applied until change 78504581 time 02/17/2024 11:16:40
    2024-02-17T11:16:43.561349+00:00
    REFRESHABLE_CLONE_PDB(4):.... (PID:69906): Media Recovery Complete [dbsdrv.c:15698]
    2024-02-17T11:16:43.678720+00:00
    alter pluggable database REFRESHABLE_CLONE_PDB refresh
    2024-02-17T11:16:46.162368+00:00
    Recovering pdb-4099 from SCN 78504581 to SCN 78504601 trc /u01/app/oracle/diag/rdbms/cdb_shibuya/CDB23c/trace/CDB23c_j000_64390.trc
    REFRESHABLE_CLONE_PDB(4):Media Recovery Start
    REFRESHABLE_CLONE_PDB(4): Started logmerger process under PDB 4
    2024-02-17T11:16:46.241525+00:00
    REFRESHABLE_CLONE_PDB(4):Parallel Media Recovery started with 4 slaves
    2024-02-17T11:16:46.479791+00:00
    REFRESHABLE_CLONE_PDB(4):Incomplete Recovery applied until change 78504601 time 02/17/2024 11:16:43
    2024-02-17T11:16:46.482680+00:00
    REFRESHABLE_CLONE_PDB(4):.... (PID:64390): Media Recovery Complete [dbsdrv.c:15698]
    Completed: alter pluggable database REFRESHABLE_CLONE_PDB refresh
```

**3) Refreshable Clone PDB作成確認**
```
SQL> show pdbs

	   CON_ID CON_NAME                 OPEN MODE     RESTRICTED
	_________ ________________________ _____________ _____________
	        2 PDB$SEED                 READ ONLY     NO
	        3 PDB_SHIBUYA              READ WRITE    NO
	        4 REFRESHABLE_CLONE_PDB    MOUNTED
```



**4) Refreshable Clone PDB Read**
```
SQL> alter pluggable database REFRESHABLE_CLONE_PDB open read only;

  Pluggable database REFRESHABLE_CLONE_PDB altered.

  -- Alert LOG確認
    REFRESHABLE_CLONE_PDB(4):Autotune of undo retention is turned on.
    2024-02-17T11:19:32.828729+00:00
    REFRESHABLE_CLONE_PDB(4):Pluggable database REFRESHABLE_CLONE_PDB dictionary check beginning
    REFRESHABLE_CLONE_PDB(4):Pluggable Database REFRESHABLE_CLONE_PDB Dictionary check complete
    2024-02-17T11:19:34.502683+00:00
    REFRESHABLE_CLONE_PDB(4):Opening pdb with no Resource Manager plan active
    Completed: Pluggable database REFRESHABLE_CLONE_PDB opened read only


SQL> show pdbs

	   CON_ID CON_NAME                 OPEN MODE     RESTRICTED
	_________ ________________________ _____________ _____________
	        2 PDB$SEED                 READ ONLY     NO
	        3 PDB_SHIBUYA              READ WRITE    NO
	        4 REFRESHABLE_CLONE_PDB    READ ONLY     NO
```

**5) テストデータ確認**
```
SQL> alter session set container=REFRESHABLE_CLONE_PDB;

  Session altered.

SQL> select * from test_table1;

	   ID NOW
	_____ ______________________
	    1 2024/02/17 10:58:26
```





# ■ 手動 Refresh確認
RefreshするにはPDBをCLOSEする必要があります。

## ● Source PDB更新
**1) Source PDB接続**
```
[oracle@basedb23c-tokyo ~]$ sql / as sysdba


  SQLcl: Release 23.2 Production on Sat Feb 17 11:23:26 2024

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

  Connected to:
  Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
  Version 23.3.0.23.09


SQL> alter session set container=PDB_TOKYO;

  Session altered.
```

**2) テスト・データINSERT**
```
SQL> INSERT INTO test_table1 VALUES (2,SYSDATE);

	1 row created.

SQL> commit;

	Commit complete.

SQL> select * from test_table1;

	   ID NOW
	_____ ______________________
	    1 2024/02/17 10:58:26
	    2 2024/02/17 11:24:30
```

## ● Target PDB確認
**1) Target PDB接続**
```
[oracle@basedb23c-shibuya ~]$ sql / as sysdba


  SQLcl: Release 23.2 Production on Sat Feb 17 11:25:09 2024

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

  Connected to:
  Oracle Database 23c EE Extreme Perf Release 23.0.0.0.0 - Production
  Version 23.3.0.23.09


SQL> show pdbs

	   CON_ID CON_NAME                 OPEN MODE     RESTRICTED
	_________ ________________________ _____________ _____________
	        2 PDB$SEED                 READ ONLY     NO
	        3 PDB_SHIBUYA              READ WRITE    NO
	        4 REFRESHABLE_CLONE_PDB    READ ONLY     NO
```

**2) Target PDB CLOSE**
```
SQL> ALTER PLUGGABLE DATABASE REFRESHABLE_CLONE_PDB CLOSE IMMEDIATE;

	Pluggable database REFRESHABLE_CLONE_PDB altered.

SQL> show pdbs

	   CON_ID CON_NAME                 OPEN MODE     RESTRICTED
	_________ ________________________ _____________ _____________
	        2 PDB$SEED                 READ ONLY     NO
	        3 PDB_SHIBUYA              READ WRITE    NO
	        4 REFRESHABLE_CLONE_PDB    MOUNTED
```

**3) 手動リフレッシュ**
```
SQL> ALTER PLUGGABLE DATABASE REFRESHABLE_CLONE_PDB REFRESH;

  Pluggable database REFRESHABLE_CLONE_PDB altered.


  -- Alert Log
    2024-02-17T11:26:37.463827+00:00
    Recovering pdb-4099 from SCN 78504601 to SCN 78504939 trc /u01/app/oracle/diag/rdbms/cdb_shibuya/CDB23c/trace/CDB23c_ora_77694.trc
    REFRESHABLE_CLONE_PDB(4):Media Recovery Start
    REFRESHABLE_CLONE_PDB(4): Started logmerger process under PDB 4
    2024-02-17T11:26:37.545713+00:00
    REFRESHABLE_CLONE_PDB(4):Parallel Media Recovery started with 4 slaves
    2024-02-17T11:26:37.917640+00:00
    REFRESHABLE_CLONE_PDB(4):Incomplete Recovery applied until change 78504939 time 02/17/2024 11:26:37
    2024-02-17T11:26:37.920303+00:00
    REFRESHABLE_CLONE_PDB(4):.... (PID:77694): Media Recovery Complete [dbsdrv.c:15698]
```

**4) Target PDB Open Read Only**
```
SQL> alter pluggable database REFRESHABLE_CLONE_PDB open read only;

  Pluggable database REFRESHABLE_CLONE_PDB altered.

  --Alert Log
    REFRESHABLE_CLONE_PDB(4):Autotune of undo retention is turned on.
    2024-02-17T11:27:19.029916+00:00
    REFRESHABLE_CLONE_PDB(4):Pluggable database REFRESHABLE_CLONE_PDB dictionary check beginning
    REFRESHABLE_CLONE_PDB(4):Pluggable Database REFRESHABLE_CLONE_PDB Dictionary check complete
    2024-02-17T11:27:20.614695+00:00
    REFRESHABLE_CLONE_PDB(4):Opening pdb with no Resource Manager plan active
    Completed: Pluggable database REFRESHABLE_CLONE_PDB opened read only
```

**5) refreshable PDB に データ同期(リフレッシュ)されたことを確認**
```
SQL> alter session set container=REFRESHABLE_CLONE_PDB;

  Session altered.

SQL> select * from test_table1;

	   ID NOW
	_____ ______________________
	    1 2024/02/17 10:58:26
	    2 2024/02/17 11:24:30
```




# ■ 自動および手動リフレッシュ・モード設定
## ● 手動リフレッシュ・モード
```
SQL> ALTER PLUGGABLE DATABASE REFRESHABLE_CLONE_PDB REFRESH MODE MANUAL;

	Pluggable database REFRESHABLE_CLONE_PDB altered.
```

## ● 自動リフレッシュ・モード
指定した時間(分単位)の経過後に自動的にリフレッシュします
このリフレッシュ・モード句では、リフレッシュ可能なPDBが1時間(60分)おきに自動的にリフレッシュされることを指定します。

```
SQL> ALTER PLUGGABLE DATABASE REFRESHABLE_CLONE_PDB REFRESH MODE EVERY 60 MINUTES;

	Pluggable database REFRESHABLE_CLONE_PDB altered.
```

## ● リフレッシュ可能でないPDBへ変換
ALTER PLUGGABLE DATABASE文にREFRESH MODE NONE句を含め、PDBを読取り/書込みモードでオープンすることにより、リフレッシュ可能なクローンPDBを通常のPDBに変更できます。
通常のPDBはリフレッシュ可能なクローンPDBに変更できません。リフレッシュ可能なクローンPDBが通常のPDBに変換された後は、リフレッシュ可能なクローンPDBに戻すことができません。
```
SQL> ALTER PLUGGABLE DATABASE REFRESHABLE_CLONE_PDB REFRESH MODE NONE;

	Pluggable database REFRESHABLE_CLONE_PDB altered.
```




# ■ 時間指定の リフレッシュ
時間指定して更新するには、手動リフレッシュ・モードで PROCEDUREを作成し、それをDBMS_SCHEDULERへ登録します。
ここでは、3AM にRefresh するよう設定してみてみます。
 
**1) Create The refresh procedure**
```
SQL> CREATE OR REPLACE PROCEDURE SYS.REFRESHABLE_CLONE_PDB_REFRESH
AS BEGIN
    EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE REFRESHABLE_CLONE_PDB CLOSE IMMEDIATE';
    EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE REFRESHABLE_CLONE_PDB REFRESH';
    EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE REFRESHABLE_CLONE_PDB OPEN READ ONLY';
END;
/

    Procedure REFRESHABLE_CLONE_PDB_REFRESH compiled
```

**2) Create the refresh JOB**
```

SQL> BEGIN
DBMS_SCHEDULER.CREATE_JOB (
        job_name => 'REFRESHABLE_CLONE_PDB',
        job_type => 'STORED_PROCEDURE',
        job_action => 'SYS.REFRESHABLE_CLONE_PDB_REFRESH',
        repeat_interval => 'freq=daily;byday=mon,tue,wed,thu,fri;BYHOUR=3; BYMINUTE=1',
        auto_drop => FALSE,
        enabled => TRUE,
        comments => 'Automatic refresh of the prod PDB clone');
END;
/

    PL/SQL procedure successfully completed.


SQL> SELECT JOB_NAME, START_DATE, STATE, NEXT_RUN_DATE
     from DBA_SCHEDULER_JOBS
     WHERE JOB_NAME = 'REFRESHABLE_CLONE_PDB';

    JOB_NAME              START_DATE                             STATE        NEXT_RUN_DATE
    _____________________ ______________________________________ ____________ ______________________________________
    REFRESHABLE_CLONE_PDB    17-FEB-24 02.46.23.608544000 PM UTC    SCHEDULED    19-FEB-24 03.01.23.608544000 AM UTC

```




# ■ 参考
　・ [リフレッシュ可能なクローンPDBについて](https://docs.oracle.com/ja-jp/iaas/dbcs/doc/pluggable-databases.html)
　・ [Refreshable Clone PDB](http://www.brokedba.com/2021/12/19c-pdb-refreshable-clones.html)
　・ [Minimal Downtime Migration and Upgrade using Refreshable PDB Clones](https://database-heartbeat.com/2021/02/09/minimal-downtime-migration-and-upgrade-using-refreshable-pdb-clones/)
　・ [Upgrade Testing with a Refreshable PDB – does this work?](https://mikedietrichde.com/2020/05/05/upgrade-testing-with-a-refreshable-pdb-does-this-work/)
　・ [Oracle Database 19c の複数のリリースに渡る変更、サポート終了および非推奨リスト](https://docs.oracle.com/cd/F19136_01/upgrd/oracle-database-changes-deprecations-desupports.html#GUID-44E0A12C-2918-4565-BB19-A1CBA4C0FDCD)
　・ [Oracle Database 23ai の複数のリリースに渡る変更、サポート終了および非推奨リスト](https://docs.oracle.com/en/database/oracle/oracle-database/23/upgrd/oracle-database-changes-deprecations-desupports.html#GUID-44E0A12C-2918-4565-BB19-A1CBA4C0FDCD)