[23c] PDBのRELOCATE(再配置)を試す

# PDBのRELOCATE(再配置)を試す

PDBの再配置を試してみます。
機能自体は12cから使用可能ですが、23c(Cloud)環境ということで
多少気にする部分がでてきます。

### 再配置の動作イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/409f7ea8-4337-fb56-35ba-2d1a638d497e.png)

再配置の目的
・PDBの停止時間なし、または停止時間最小で移動する最速の方法です
・特にCLONEやCOPYを行うと大規模データベースではデータファイルのコピーに時間がかかるため、それらを簡略化できます

再配置の仕組み
・事前にPDBをコピーし、RELOCATE時にUNDO,REDOを含めたデータを同期します

詳しくはマニュアルを参照してください。
[Oracle Database 23c 管理者（Multitenant）マニュアル](https://docs.oracle.com/cd/F82042_01/multi/relocating-a-pdb.html#GUID-75519361-3DA2-4558-A7E5-64BC16FAFC7D)

# RELOCATE実装例

# ①ソースDBでの設定
ソースPDBがあるCDBに接続して、リンク用DBユーザを作成します。
SYSTEMユーザーを使用することも可能ですが、下記権限は付与してください。


:::note info
・create user c##relocateuser1 identified by Test#1Test#1;
・grant create session , create pluggable database , sysoper to c##relocateuser1 container=all;
:::

実行例
```
[oracle@db23c1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Fri Jan 26 04:58:40 2024
Version 23.3.0.23.09

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


Connected to:
Oracle Database 23c Enterprise Edition Release 23.0.0.0.0 - Production
Version 23.3.0.23.09


SQL> create user c##relocateuser1 identified by Test#1Test#1;

User created.

SQL> grant create session , create pluggable database , sysoper to c##relocateuser1 container=all;

Grant succeeded.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
SQL>
```



# ②ターゲットDBでの設定
再配置先のCDBに接続して、ソースDBに向けたDBリンクを作成します。
その後、RELOCATEのPDBを作成します。


:::note info
・TNSの定義
・alter session set  global_names = FALSE;
・create database link relocatelink1 connect to  c##relocateuser1 identified by Test#1Test#1 using 'CDB1';
・create pluggable database pdb1 from pdb1@relocatelink1 keystore identified by Test#2Test#2 relocate AVAILABILITY MAX;

:::


実行例

```
★ソースPDBがあるCDBに対して接続識別子を定義します★

[oracle@db23c2 ~]$ cd $ORACLE_HOME/network/admin
[oracle@db23c2 admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/23.0.0.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_CDB2 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = db23c2)(PORT = 1521))


CDB2_ZSX_NRT =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = db23c2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = CDB2_zsx_nrt.xxx.xxx.oraclevcn.com)
    )
  )

[oracle@db23c2 admin]$ vi tnsnames.ora


CDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 111.222.111.222)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)                                                            (SERVICE_NAME = CDB1_8hk_nrt.xxx.xxx.oraclevcn.com)
    )
  )



[oracle@db23c2 admin]$ tnsping cdb1

TNS Ping Utility for Linux: Version 23.0.0.0.0 - Production on 26-JAN-2024 04:41:01

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

Used parameter files:
/u01/app/oracle/product/23.0.0.0/dbhome_1/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 111.222.111.222)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = CDB1_8hk_nrt.xxx.xxx.oraclevcn.com)))
OK (0 msec)
[oracle@db23c2 admin]$


★ターゲットCDBにDBリンクを作成し、それを使ってリロケートPDBを作成します★

[oracle@db23c2 admin]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Fri Jan 26 04:41:16 2024
Version 23.3.0.23.09

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


Connected to:
Oracle Database 23c Enterprise Edition 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 PDB2                           READ WRITE NO

SQL> alter session set  global_names = FALSE;

Session altered.


SQL> create database link relocatelink1 connect to  c##relocateuser1 identified by Test#1Test#1 using 'CDB1';

Database link created.

SQL> select * from dual@relocatelink1;

D
-
X

★　Cloud環境ではkeystoreでTDEパスワードが必要になってきます。CDB2側のパスワードです。　★
SQL> create pluggable database pdb1 from pdb1@relocatelink1 keystore identified by Test#2Test#2 relocate AVAILABILITY MAX;

Pluggable database created.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB2                           READ WRITE NO
         4 PDB1                           MOUNTED
SQL>


```

# ③テスト用データ挿入
テスト用のデータ挿入した例です。
RELOCATE用のPDBを作成した後にユーザやテーブルを作成し、
データが引き継がれるかを確認します。

実行例

```


SQL> create user test identified by Test#1Test#1;

User created.


SQL> grant create session,create table ,unlimited tablespace to test;

Grant succeeded.
SQL> conn test/Test#1Test#1@PDB1
Connected.
SQL> create table t1 ( id number );

Table created.

SQL> insert into t1 values(1);
c
1 row created.

SQL>
SQL> commit;

Commit complete.

SQL> select * from t1;

        ID
----------
         1

```


# ④PDBのリロケート（再配置）実行

ターゲット側のPDBをOPENすると、RELOCATEが実行されます。
ソース側のPDBはMOUNTとなります。

:::note info
・alter pluggable database pdb1 open;
:::

実行例

```

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB2                           READ WRITE NO
         4 PDB1                           MOUNTED
SQL> alter pluggable database pdb1 open;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB2                           READ WRITE NO
         4 PDB1                           READ WRITE NO
SQL> alter session set container=pdb1;

Session altered.

SQL> select * from test.t1;

        ID
----------
         1

SQL>
```
ソース側の確認（PDBがMOUNTになった）
```
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           MOUNTED
SQL>
```