はじめに
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のデータファイル量 × 2 の容量が必要です (容量を抑える場合、手順4でプラグインする前にデータファイルをファイルストレージサービスなどのNFSに退避します、その際の手順にはなってません)
全体作業イメージと手順概要
全体作業イメージ
手順概要
- バックアップからPDBリストアする先として、補助インスタンス起動(元のインスタンスに接続してしまうと稼働中のPDBにリストアしてしまうので)
- RMANで補助インスタンスにPDBをリストア
- 補助インスタンスからUnplug
- 既存CDBにPlug-inする
- 凡例
- OS> OSで実行したコマンド
- SQL> SQL PLUS/SQLcl 内で実行したコマンド
- RMAN> RMAN 内で実行したコマンド
- ★コードブロック内でのコメント
作業手順
1.バックアップから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
2.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がリストア作成されました
3.リストアした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; ★補助インスタンスをシャットダウン 実質の補助インスタンス削除
4.PDBを既存のCDBにPlug-in
★一旦 初期ユーザのopc までEXITし、再度 Oracleユーザまできてください ORACLE_SIDをデフォルトに戻すため。
OS> sqlplus / as sysdba;
SQL> alter database open; ★手順1でマウント状態にした既存のCDBをOPENさせる
★ 以下でPDBをプラグインさせる
★ AS CLONE 句 必須。これがないと、既存PDBとDBIDが重複するため。 ただし、CLONEするのでプラグインに時間がかかるし、容量は2倍必要
★ 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.
5.残作業不要ファイルの削除
補助インスタンス作成に使ったファイル、アンプラグした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)