DBCS/BaseDB自動バックアップから新しいPDBを作成する方法



# はじめに


OCIのDBCSでは便利な自動バックアップ機能があります。これを有効化するとDBAがいなくてもRMANで確実なバックアップをObject Storageにとってくれ、きちんと世代管理してくれます。
このバックアップはCDB単位なので、複数のPDBもまとめてまるっとバックアップします。
OCIからのリストア機能もCDB単位です。

そこで、過去特定時点にどんなデータがあるんだっけ？　という際に特定のPDBを覗きたい。そのための手順がこちらです。

RMANを手で打てばPDB単位のリストアは可能ですが、既存のPDBは利用しているのでリストアはしたくありません。

「バックアップから過去特定時点データで、新しいPDBをつくる」　がこの記事になります。


この内容が、、実に案外面倒くさい、、、
NASなどのディスクデバイスに格納されたデータであれば、RMAN DUPLICATE コマンドで出来ますが、自動バックアップ先はObject Storage(TAPEデバイスに)なので同様のコマンドでは叶わず、補助インスタンスにリストアするという煩わしさが必要です。
また、Object StorageのバックアップデータはRMANからはテープデバイスに存在している影響で、RMANでのバックアップデータ2次コピーもできません。（Disk2Diskや、Disk2TAPEは可能）





# 前提と注意事項※※


- 前提
	- すでにDBCSが稼働しており、自動バックアップによっていくつかのバックアップが存在している

- 注意事項
	- 手順を誤ると既存PDBに対して上書きリストアをしてしまいます。実施前にも手動でバックアップ（スタンドアロンバックアップ）を取得しましょう
	- PDBを新しく作成するという手順ではありますが、既存CDBもShutdown やMount状態にする必要が出てきます。DB稼働中では実施できません
	- この手順では DBCSのASMには、リストアしたいPDBのデータファイル量 × ２　の容量が必要です　（容量を抑える場合、手順４でプラグインする前にデータファイルをファイルストレージサービスなどのNFSに退避します、その際の手順にはなってません）



# 全体作業イメージと手順概要

### 全体作業イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/63046e1e-4de8-e9a3-5b77-7da945dd0847.png)


### 手順概要

1. バックアップからPDBリストアする先として、補助インスタンス起動（元のインスタンスに接続してしまうと稼働中のPDBにリストアしてしまうので）
2. RMANで補助インスタンスにPDBをリストア
3. 補助インスタンスからUnplug
4. 既存CDBにPlug-inする

- 凡例
	- OS>　OSで実行したコマンド
	- SQL>　SQL PLUS/SQLcl 内で実行したコマンド
	- RMAN>　RMAN 内で実行したコマンド
	- ★コードブロック内でのコメント



---
# 作業手順

### １．バックアップからPDBリストアする先として、補助インスタンス起動


補助インスタンス用の初期化パラメータファイルを作成します。
補助インスタンス用の adump ディレクトリは手動で作成します。

```
mkdir -p /u01/app/oracle/admin/AUXCDB/adump/
vi /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/initAUXCDB.ora
```

以下を入力し、保存します。
pga_aggregate_target　と　sga_target　はシェイプに応じて変更した方がいいかもしれません。
大きすぎると既存環境に影響させてしまいます。小さすぎる分には、そもそもインスタンス起動できないエラーで気づくので、小さく始めましょう。

```
*._disable_interface_checking=TRUE 
*._enable_numa_support=FALSE 
*._gc_undo_affinity=TRUE 
*.audit_file_dest='/u01/app/oracle/admin/AUXCDB/adump/' 
*.audit_sys_operations=TRUE 
*.audit_trail='db' 
*.compatible='19.0.0.0' 
#*.control_management_pack_access='DIAGNOSTIC+TUNING' 
*.control_files='+RECO/control01.dbf' 
*.cpu_count=0 
*.cursor_sharing='EXACT' 
#*.db_block_checking='FULL' 
#*.db_block_checksum='FULL' 
*.db_block_size=8192 
*.db_create_file_dest='+DATA' 
*.db_create_online_log_dest_1='+RECO' 
#*.db_domain='subdmz.vcnosa.oraclevcn.com' 
*.db_files=1024 
*.db_lost_write_protect='TYPICAL' 
*.db_name='auxCDB' 
*.db_recovery_file_dest='+RECO' 
*.db_recovery_file_dest_size=100g 
*.db_unique_name='testdb_test' 
*.diagnostic_dest='/u01/app/oracle' 
*.dispatchers='(PROTOCOL=TCP) (SERVICE=auxcdbXDB)' 
*.enable_ddl_logging=TRUE 
*.enable_pluggable_database=true 
*.encrypt_new_tablespaces='ALWAYS' 
*.fast_start_mttr_target=300 
*.filesystemio_options='setall' 
*.global_names=TRUE 
*.log_archive_format='%t_%s_%r.dbf' 
*.log_buffer=3777216 
#*.nls_language='AMERICAN' 
#*.nls_territory='AMERICA' 
*.open_cursors=200 
*.os_authent_prefix='ops$' 
*.pga_aggregate_target=500m 
*.processes=100 
*.remote_login_passwordfile='EXCLUSIVE' 
*.session_cached_cursors=100 
*.sga_target=1g 
*.spatial_vector_acceleration=TRUE 
#*.sql92_security=TRUE 
#*.undo_retention=900 
*.undo_tablespace='UNDOTBS1' 
#*.use_large_pages='only'
```

SQLPLUS/SQLclを起動し、まずは稼働中のCDBをシャットダウンします。
そして、補助インスタンスを NOMOUNTで起動します。

```
OS> sqlplus / as sysdba
SQL> shutdown immediate;　★現行CDBをシャットダウンし、MOUNT状態にしておく
SQL> startup mount;
SQL> exit

OS> ORACLE_SID=AUXCDB　★これを入力して、補助インスタンスのインスタンス名をセット
OS> sqlplus / as sysdba 
SQL> startup nomount pfile='/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/initAUXCDB.ora'

SQL> select instance_name from v$instance; 　★起動させたインスタンスが補助インスタンスであることを確認
 INSTANCE_NAME 
---------------- 
AUXCDB

SQL> show parameter DB_NAME　　★起動させたインスタンスが補助インスタンスであることを確認・再
NAME                                 TYPE        VALUE 
------------------------------------ ----------- ------- 
db_name                              string      auxCDB

SQL> EXIT
```


---

### ２．RMANで補助インスタンスにPDBをリストア


#### 2-1  リストア前のRMAN設定など

RMANを起動し、補助インスタンスと、ターゲットとしては既存DBを指定します
既存DBのカタログ情報を見て、そこからリストア（PDB作成）を行います
まずは以下、リストア前まで。

```
OS> ORACLE_SID=AUXCDB　★念の為再度、補助インスタンスのインスタンス名をセット
OS> rman auxiliary / target sys/<password>@<既存CDBへの接続記述子>　　★既存CDBは自分自身だがOracleNet接続が必要

Recovery Manager: Release 19.0.0.0.0 - Production on Thu Nov 18 14:45:07 2021 
Version 19.11.0.0.0 
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved. 
connected to target database: ORCLD (DBID=3449999919, not open)   ★ターゲットは既存DBであることを確認
connected to auxiliary database: AUXCDB (not mounted)　　　　★auxiliaryとして AUXDBとなっている事を確認　重要！！


RMAN> LIST INCARNATION;　　★過去にバックアップした事があればインカネーションが上がるので、リストアしたいタイミングを確認

using target database control file instead of recovery catalog 
List of Database Incarnations 
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time 
------- ------- -------- ---------------- --- ---------- ---------- 
1       1       ORCLD    3449999919       PARENT  1          30-JUN-21 
2       2       ORCLD    3449999919       PARENT  2572819    20-OCT-21 
3       3       ORCLD    3449999919       CURRENT 4516099    15-NOV-21


RMAN> RESET DATABASE to incarnation 2;　　★今回は「2021-11-10 00:00:00」のデータを取り出すのでインカネーションを変更

database reset to incarnation 2


RMAN> LIST INCARNATION;　　★インカネーションが変わった事を確認 

using target database control file instead of recovery catalog 
List of Database Incarnations 
DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time 
------- ------- -------- ---------------- --- ---------- ---------- 
1       1       ORCLD    3449999919       PARENT  1          30-JUN-21 
2       2       ORCLD    3449999919       CURRENT 2572819    20-OCT-21 
3       3       ORCLD    3449999919       ORPHAN  4516099    15-NOV-21
```

#### 2-2  リストアの実施前のRMAN設定など

最初に制御ファイルをリストアします
その後にRMAN DUPLICATEコマンドでバックアップからPDBを作成しています

```
RMAN> RESTORE CONTROLFILE  TO '+RECO/control01.ora'; 　★DBCSは共通。仮で最後に消すのでどこでもOK

Starting restore at 18-NOV-21 
using channel ORA_DISK_1 
using channel ORA_SBT_TAPE_1 
channel ORA_SBT_TAPE_1: starting datafile backup set restore 
channel ORA_SBT_TAPE_1: restoring control file 
output file name=+RECO/control01.ora 
channel ORA_SBT_TAPE_1: reading from backup piece c-3449999919-20211115-13 
channel ORA_SBT_TAPE_1: piece handle=c-3449999919-20211115-13 tag=TAG20211115T090331 
channel ORA_SBT_TAPE_1: restored backup piece 1 
channel ORA_SBT_TAPE_1: restore complete, elapsed time: 00:00:03 
Finished restore at 18-NOV-21


RMAN> RUN{ 
SET until time "TO_DATE('2021-11-10 00:00:00','yyyy-mm-dd hh24:mi:ss')"; 　　★戻したい日付をセット
DUPLICATE database to 'AUXCDB' pluggable database 'PDBD1'; 　★これで特定のPDBここでは「PDBD1」が補助インスタンスCDBに複製(リストア)される
}


executing command: SET until clause 
Starting Duplicate Db at 18-NOV-21 
allocated channel: ORA_AUX_DISK_1 
channel ORA_AUX_DISK_1: SID=113 device type=DISK 
allocated channel: ORA_AUX_SBT_TAPE_1 
channel ORA_AUX_SBT_TAPE_1: SID=29 device type=SBT_TAPE 
channel ORA_AUX_SBT_TAPE_1: Oracle Database Backup Service Library VER=21.0.0.1 
contents of Memory Script: 
{ 
   sql clone "create spfile from memory"; 
} 
executing Memory Script 
sql statement: create spfile from memory 
contents of Memory Script: 
{ 
   shutdown clone immediate; 
   startup clone nomount; 
} 
executing Memory Script 
Oracle instance shut down 
connected to auxiliary database (not started) 
Oracle instance started 
Total System Global Area    1077932384 bytes 
Fixed Size                     9142624 bytes 
Variable Size                276824064 bytes 
Database Buffers             784334848 bytes 
Redo Buffers                   7630848 bytes 
duplicating Online logs to Oracle Managed File (OMF) location 
duplicating Datafiles to Oracle Managed File (OMF) location 
contents of Memory Script: 
{ 
   set until scn  4057615; 
   sql clone "alter system set  db_name =  
 ''ORCLD'' comment= 
 ''Modified by RMAN duplicate'' scope=spfile"; 
   shutdown clone immediate; 
   startup clone force nomount 
   restore clone primary controlfile; 
   alter clone database mount; 
} 
executing Memory Script 
executing command: SET until clause 
sql statement: alter system set  db_name =  ''ORCLD'' comment= ''Modified by RMAN duplicate'' scope=spfile 
Oracle instance shut down 
Oracle instance started 
Total System Global Area    1077932384 bytes 
Fixed Size                     9142624 bytes 
Variable Size                276824064 bytes 
Database Buffers             784334848 bytes 
Redo Buffers                   7630848 bytes 
Starting restore at 18-NOV-21 
allocated channel: ORA_AUX_DISK_1 
channel ORA_AUX_DISK_1: SID=116 device type=DISK 
allocated channel: ORA_AUX_SBT_TAPE_1 
channel ORA_AUX_SBT_TAPE_1: SID=26 device type=SBT_TAPE 
channel ORA_AUX_SBT_TAPE_1: Oracle Database Backup Service Library VER=21.0.0.1 
channel ORA_AUX_SBT_TAPE_1: starting datafile backup set restore 
channel ORA_AUX_SBT_TAPE_1: restoring control file 
channel ORA_AUX_SBT_TAPE_1: reading from backup piece c-3449999919-20211109-31 
channel ORA_AUX_SBT_TAPE_1: piece handle=c-3449999919-20211109-31 tag=TAG20211109T230259 
channel ORA_AUX_SBT_TAPE_1: restored backup piece 1 
channel ORA_AUX_SBT_TAPE_1: restore complete, elapsed time: 00:00:03 
output file name=+RECO/control01.dbf 
Finished restore at 18-NOV-21 
database mounted 
Skipping pluggable database PDBD2 　　　　　 ★対象外のPDBはSKIPされている
Automatically adding tablespace SYSTEM 
Automatically adding tablespace SYSAUX 
Automatically adding tablespace PDB$SEED:SYSTEM 
Automatically adding tablespace PDB$SEED:SYSAUX 
Automatically adding tablespace UNDOTBS1 
Skipping tablespace USERS 
TARGET database not open, cannot verify that set of tablespaces being duplicated does not have SYS objects 
contents of Memory Script: 
{ 
   set until scn  4057615; 
   set newname for clone datafile  1 to new; 
   set newname for clone datafile  3 to new; 
   set newname for clone datafile  4 to new; 
   set newname for clone datafile  5 to new; 
   set newname for clone datafile  6 to new; 
   set newname for clone datafile  7 to new; 
   set newname for clone datafile  8 to new; 
   set newname for clone datafile  9 to new; 
   set newname for clone datafile  10 to new; 
   set newname for clone datafile  12 to new; 
   restore 
   clone database 
   skip forever tablespace  "USERS", 
 "PDBD2":"USERS", 
 "PDBD2":"UNDOTBS1", 
 "PDBD2":"SYSTEM", 
 "PDBD2":"SYSAUX"   ; 
} 
executing Memory Script 
executing command: SET until clause 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
executing command: SET NEWNAME 
Starting restore at 18-NOV-21 
using channel ORA_AUX_DISK_1 
using channel ORA_AUX_SBT_TAPE_1 
channel ORA_AUX_SBT_TAPE_1: starting datafile backup set restore 
channel ORA_AUX_SBT_TAPE_1: specifying datafile(s) to restore from backup set 
channel ORA_AUX_SBT_TAPE_1: restoring datafile 00001 to +DATA 
channel ORA_AUX_SBT_TAPE_1: restoring datafile 00003 to +DATA 
channel ORA_AUX_SBT_TAPE_1: restoring datafile 00004 to +DATA 
channel ORA_AUX_SBT_TAPE_1: reading from backup piece DBTRegular-L016363576727695Tj_df_ORCLD_3449999919_ck0dm2i0_1428_1_1_20211108_1088096832_set142
・
・
・
・
contents of Memory Script: 
{ 
   sql clone "alter pluggable database all open"; 
} 
executing Memory Script 
sql statement: alter pluggable database all open 
Dropping offline and skipped tablespaces 
Executing: alter database default tablespace system 
Executing: drop tablespace "USERS" including contents cascade constraints 
Cannot remove created server parameter file 
Finished Duplicate Db at 18-NOV-21


RMAN>EXIT
```

これで補助インスタンスのCDBにPDBがリストア作成されました




---

### ３．リストアしたPDBを補助インスタンスからUnplug


```
OS> ORACLE_SID=AUXCDB　★補助インスタンスに接続するので、念の為再度セット

OS> sqlplus / as sysdba

SQL> select instance_name from v$instance; 　★接続先が補助インスタンスであることを確認 

 INSTANCE_NAME 
---------------- 
AUXCDB


SQL> COLUMN NAME FORMAT A8 
SQL> SELECT NAME, CON_ID, DBID, CON_UID, GUID FROM V$CONTAINERS ORDER BY CON_ID;　★リストアされたPDBを確認

NAME         CON_ID       DBID    CON_UID GUID 
-------- ---------- ---------- ---------- -------------------------------- 
CDB$ROOT          1 3449999919          1 C5F9B6AA4B4E6FC1E053BA0A640AF33B 
PDB$SEED          2 3800111630 3800111630 CEC2FDE180FC1373E0535E000A0A6241 
PDBD1             3  541823522  541823522 CEC32562B8743C26E0535E000A0A2CA1　★これがリストアされたもの


SQL> alter pluggable database PDBD1 close;　★PDBをCLOSE
    Pluggable database altered.

★ 次にPDBをアンプラグする。DBCSはTDEで暗号化されているので ENCRYPT USING　が必要。
★ メタデータの pdbd1.xml　は任意の場所、任意の名前で構いません。
★ transport_secret　はパスワードなので、任意の文字列に置き換えてください

SQL> alter pluggable database PDBD1 unplug into '/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/pdbd1.xml'  ENCRYPT USING  transport_secret ;
    Pluggable database altered.


★一度アンプラグされたPDBはDropする他ないため、Dropする。 　keep datafiles 句を忘れずに。忘れたらリストアからやり直し。

SQL> drop pluggable database PDBD1 keep datafiles;
    Pluggable database dropped.

SQL> Shutdown abort;　　★補助インスタンスをシャットダウン　実質の補助インスタンス削除
```




---

### ４．PDBを既存のCDBにPlug-in



```
★一旦 初期ユーザのopc までEXITし、再度 Oracleユーザまできてください ORACLE_SIDをデフォルトに戻すため。

OS> sqlplus / as sysdba;

SQL> alter database open;  ★手順１でマウント状態にした既存のCDBをOPENさせる


★ 以下でPDBをプラグインさせる
★ AS CLONE 句 必須。これがないと、既存PDBとDBIDが重複するため。 ただし、CLONEするのでプラグインに時間がかかるし、容量は２倍必要
★ DECRYPT USING 句で、アンプラグした際のパスワード（ここではtransport_secret）を入力
★ 新しいPDB名は任意　ここでは「PDBD1C」
★ DBCS初期デプロイ時に指定しているTDEのパスワードを KEYSTORE IDENTIFIED BY 句の後に入力。ダブルクォーテーションで囲む

SQL> create pluggable database PDBD1C AS CLONE using '/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/pdbd1.xml' STORAGE UNLIMITED tempfile reuse KEYSTORE IDENTIFIED BY "PASSWORD" DECRYPT USING transport_secret;

    Pluggable database created. 

SQL> alter pluggable database PDBD1C OPEN;　　★プラグインしたPDBをOPENして作業完了です

    Pluggable database altered. 
```




---

### ５．残作業不要ファイルの削除

補助インスタンス作成に使ったファイル、アンプラグしたPDBのデータファイル（クローンしたので不要）を削除します

```
★初期化パラメータの削除
rm /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/initAUX*

★補助インスタンスの為にリストアした制御ファイルを削除　（ASMの場合はWindowsのように稼働中のファイルは削除できません）

OS> su - grid
OS> asmcmd
ASMCMD> cd +RECO
ASMCMD> ls 
ORCLD_IAD1X9/ 
control01.dbf 
control01.ora

ASMCMD> rm -rf control01* 
ASMCMD> ls 
ORCLD_IAD1X9/



★データファイルの削除　（ASMの場合はWindowsのように稼働中のファイルは削除できません）

ASMCMD> cd +DATA 
ASMCMD> ls 
ASM/ 
ORCLD_IAD1X9/ 
AUXCDB/ 
dbSyszfiy4e2q/ 
orapwasm 
orapwasm_backup

ASMCMD> rm -rf AUXCDB
ASMCMD> ls 
ASM/ 
ORCLD_IAD1X9/ 
dbSyszfiy4e2q/ 
orapwasm 
orapwasm_backup
```


以上
---


# ■参考情報


- コンテナデータベースのRMANバックアップからプラガブルデータベースのクローンを作成する方法 (Doc ID 2651949.1)