Oracle RAC DBインスタンスの追加 (2)
DBインスタンス追加(スクリプト使用)
現行DB(oracle 21c)では2ノードRAC構築でDBCAが生成したスクリプトをコピってDBインスタンス追加に必要そうなところを残し、よしなに手を加えて実行しています。
しかし今になってその投稿を読み返してみると、DBインスタンスの追加に使用したスクリプトはDB構築スクリプトから2ノード目のインスタンス追加部分を抜き出して3ノード目のDBインスタンスに直しただけ。さすがにこれはちょっと乱暴だったと反省してます。
なので今回新DBにDBインスタンスを追加するにあたり、何をどう処理しなきゃならないかをかなり真面目に整理してそれをベースにゼロからDBインスタンス追加用のスクリプトを作成する方針でございます。
で、その整理した結果というのがこちら。
| No. | 処理対象 | 処理内容 | 補足 |
| 1 | 追加ノード | PRDB用ディレクトリ作成 | |
| 2 | 作業ノード | DBインスタンス起動 | 作業ノード(prsdb01)のDBインスタンスが停止状態の場合 |
| 3 | DB | 初期化パラメータ設定(SPファイル) | 追加するDBインスタンス用のパラメータを設定 |
| 4 | 既存ノード | DB停止 | 既存ノード(prsdb01、prsdb2)のDBインスタンスを停止 |
| 5 | クラスタ | DBインスタンス・リソース(prdb3)追加 | DBリソースの下にDBインスタンス・リソースを追加 |
| 6 | クラスタ | DBインスタンス・リソース(prdb3)無効化 | |
| 7 | 既存ノード | DB起動 | 既存ノード(prsdb01、prsdb2)のDBインスタンスを起動 |
| 8 | 既存ノード | PDB起動 | PDBが起動していない場合 |
| 9 | 追加インスタンス | CDB用UNDO表領域作成 | |
| 10 | 追加インスタンス | REDOログ(スレッド、グループ、メンバ)作成 | |
| 11 | 追加インスタンス | PDB用UNDO表領域作成、割り当て | |
| 12 | クラスタ | DBインスタンス・リソース(prdb3)有効化 | DBリソースのDISABLE/ENABLEでDBインスタンス・リソースを有効化 |
| 13 | 追加ノード | DBインスタンス(prdb3)起動 | |
| 14 | 追加ノード | DBインスタンス(prdb3)・PDBオープン |
これらの処理に前提条件チェックやDBインスタンス追加後の構成情報出力を追加して1本のシェル(DBインスタンス追加シェル)にまとめます。
なお、ここにあげた処理内容は一応GeminiさんにチェックしてもらっていますがDBインスタンス追加の公式手順はDBCAを使用します*1。この処理でDBインスタンス追加OKという(Oracleサポートの見解とかナレッジとかの)裏付けは何もありません*2。
しかしながらこのブログの目的の一つにやってみたらどうなるかをいろいろ試して見るというのもあるのでとりあえずこれでDBインスタンスを追加してしまおうと思います。
*1:私が探した限りではDBCA以外のDBインスタンス追加について書かれたOracleさんの公式ドキュメントは見つかりませんでした。もしかしたら手動によるDBインスタンス追加のナレッジがあるかもしれませんが確かめようがありません。
*2:公式以外の手順でDBインスタンスを追加しようというんですからもし仮にOracleサポートにこのやり方でOKか尋ねることができても「DBCA使えや」のひとことで終わりだと思います(たぶん)。
DBインスタンス追加シェルの準備
新DBサーバ#1のoracleユーザで作業用のディレクトリを作成してそこにDBインスタンス追加シェルを配置します。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# ノード追加作業用のディレクトリを作成
mkdir -p /opt/app/oracle/admin/prdb/scripts_addnode/
# ノード追加用シェル・スクリプトを作成
vi /opt/app/oracle/admin/prdb/scripts_addnode/addinst.sh
# 作成したスクリプトに実行権限付与
chmod u+x /opt/app/oracle/admin/prdb/scripts_addnode/addinst.sh
DBインスタンス追加シェルの中身はコレ。
#!/bin/bash
#----------------------------------------------
# Variable settings
#----------------------------------------------
# Execution-related variables
EXE_USER="oracle"
EXE_NODE="prsdb01"
ADD_NODE="prsdb03"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE:-$0}")" && pwd)"
# DB-related variables
CDB_NAME="prdb"
PDB_NAME="prpdb"
EXE_INST_NO=1
ADD_INST_NO=3
EXE_INST="${CDB_NAME}${EXE_INST_NO}"
ADD_INST="${CDB_NAME}${ADD_INST_NO}"
UNDO_TBS="UNDOTBS${ADD_INST_NO}"
CDB_UDBF="+DG21/PRDB/rbs/undotbs0${ADD_INST_NO}.dbf"
PDB_UDBF="+DG21/PRDB/prpdb/undotbs0${ADD_INST_NO}.dbf"
BKUP_DIR="${ORACLE_BASE}/admin/prdb/pfile"
# REDO-related variables
REDO_SQL=${SCRIPT_DIR}/redo_create.sql
GRP_CNT=3
REDO_SIZE=256M
ADD_GRP=()
REDO_M1=()
REDO_M2=()
for ((i=1;i<=${GRP_CNT};i++));do
ADD_GRP+=(${ADD_INST_NO}${i})
REDO_M1+=("+DG11/PRDB/log/redo${ADD_INST_NO}${i}_1.log")
REDO_M2+=("+DG11/PRDB/log/redo${ADD_INST_NO}${i}_2.log")
done
# Logs
LOG_DIR="${SCRIPT_DIR}/log"
LOG_PARA_ADD="${LOG_DIR}/SQL_PARA_ADD.log"
LOG_NODE_ADD="${LOG_DIR}/SQL_NODE_ADD.log"
LOG_DB_INFO="${LOG_DIR}/DB_INFO.log"
#----------------------------------------------
# Environment Check
#----------------------------------------------
# Execution user check
if [ "`whoami`" != "${EXE_USER}" ];then
echo "[00] The user executing this script must be ${EXE_USER}."
exit 1
fi
# ORACLE_BASE check
if [ -z "${ORACLE_BASE}" -o ! -d "${ORACLE_BASE}" ];then
echo "[00] ORACLE_BASE is either not set or is an invalid path."
exit 1
fi
# Backup directory check
if [ ! -d "${BKUP_DIR}" ];then
echo "[00] The directory for initialization parameter backups does not exist."
exit 1
fi
# Log directory check
if [ ! -d "${LOG_DIR}" ];then
mkdir -p ${LOG_DIR}
fi
# Generate SQL for REDO log creation
echo "ALTER DATABASE ADD LOGFILE THREAD ${ADD_INST_NO}" > ${REDO_SQL}
for ((i=0;i<${GRP_CNT};i++));do
if [ ${i} -eq $( expr ${GRP_CNT} - 1 ) ];then
LINE_END=";"
else
LINE_END=","
fi
echo " GROUP ${ADD_GRP[${i}]} ('${REDO_M1[${i}]}','${REDO_M2[${i}]}') SIZE ${REDO_SIZE} REUSE${LINE_END}" >> ${REDO_SQL}
done
#----------------------------------------------
# 1. Create a directory for the additional node
#----------------------------------------------
echo "1. Create a directory for the additional node"
ssh ${ADD_NODE} "umask 0027;mkdir -p ${ORACLE_BASE}/admin/${CDB_NAME}/dpdump"
ssh ${ADD_NODE} "umask 0027;mkdir -p ${ORACLE_BASE}/admin/${CDB_NAME}/hdump"
ssh ${ADD_NODE} "umask 0027;mkdir -p ${ORACLE_BASE}/admin/${CDB_NAME}/pfile"
ssh ${ADD_NODE} "umask 0027;mkdir -p ${ORACLE_BASE}/admin/${CDB_NAME}/scripts"
ssh ${ADD_NODE} "umask 0027;mkdir -p ${ORACLE_BASE}/audit"
#----------------------------------------------
# 2. Launch work instance
#----------------------------------------------
echo "2. Launch work instance"
if [ $(LANG=C;srvctl status instance -db ${CDB_NAME} -node ${EXE_NODE}|grep -c "is running on node") -eq 0 ] ; then
srvctl start instance -db ${CDB_NAME} -node ${EXE_NODE}
if [ $? -ne 0 ];then
echo "[02] Failed to start the worker instance."
exit 1
fi
fi
#----------------------------------------------
# 3. Parameter settings for additional nodes
#----------------------------------------------
echo "3. Parameter settings for additional nodes"
sqlplus -S / as sysdba <<EOF
whenever sqlerror exit 1
whenever oserror exit 1
spool ${LOG_PARA_ADD}
-- Initialization parameter backup (before)
create pfile='${BKUP_DIR}/init_${CDB_NAME}_bef.ora' from spfile;
-- Add initialization parameters
alter system set instance_number=${ADD_INST_NO} sid='${ADD_INST}' scope=spfile;
alter system set thread=${ADD_INST_NO} sid='${ADD_INST}' scope=spfile;
alter system set undo_tablespace=${UNDO_TBS} sid='${ADD_INST}' scope=spfile;
spool off
exit
EOF
if [ $? -ne 0 ] ; then
echo "[03] Failed to back up initialization parameters or to configure parameters for an additional node."
exit 1
fi
#----------------------------------------------
# 4. Stop all node DB instances
#----------------------------------------------
echo "4. Stop all node DB instances"
srvctl stop database -db ${CDB_NAME}
if [ $? -ne 0 ];then
echo "[04] DB instance stop failed."
exit 1
fi
#----------------------------------------------
# 5. Adding a DB instance
#----------------------------------------------
echo "5. Adding a DB instance"
srvctl add instance -db ${CDB_NAME} -instance ${ADD_INST} -node ${ADD_NODE}
# -> No status check, to account for potential re-execution.
#----------------------------------------------
# 6. Disabling the added DB instance
#----------------------------------------------
echo "6. Disabling the added DB instance"
srvctl disable instance -db ${CDB_NAME} -instance ${ADD_INST}
# -> No status check, to account for potential re-execution.
# Status check for additional DB instances
if [ $( LANG=C;srvctl config database -db ${CDB_NAME} -all|grep "^Database is individually disabled on nodes" | grep -c "${ADD_NODE}" ) -eq 0 ] ; then
echo "[05-06] Failed to add or disable an added DB instance."
exit 1
fi
#----------------------------------------------
# 7. DB startup
#----------------------------------------------
echo "7. DB startup"
srvctl start database -db ${CDB_NAME}
if [ $( LANG=C;srvctl status instance -db ${CDB_NAME} -node ${EXE_NODE}|grep -c "is running on node" ) -eq 0 ] ; then
echo "[07] Failed to start instance on worker node!"
exit 1
fi
#----------------------------------------------
# 8. PDB open
#----------------------------------------------
echo "8. PDB open"
if [ $( LANG=C;srvctl status pdb -db ${CDB_NAME} -pdb ${PDB_NAME} | grep "is running on nodes" | grep -c "${EXEC_NODE}" ) -eq 0 ] ; then
srvctl start pdb -db ${CDB_NAME} -pdb ${PDB_NAME}
if [ $? -ne 0 ];then
echo "[08] Failed to start the PDB."
exit 1
fi
fi
#----------------------------------------------
# Add Node: DB Operation
#----------------------------------------------
sqlplus -S / as sysdba <<EOF
whenever sqlerror exit 1
whenever oserror exit 1
spool ${LOG_NODE_ADD}
-----------------------------------------------------------------
-- 9. Creating an UNDO tablespace for a CDB on an additional node
-----------------------------------------------------------------
! echo "9. Creating an UNDO tablespace for a CDB on an additional node"
CREATE SMALLFILE UNDO TABLESPACE "${UNDO_TBS}"
DATAFILE '${CDB_UDBF}' SIZE 1024M REUSE
AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED;
-----------------------------------------------------------------
-- 10. Creating Redo Log Groups for Additional Nodes
-----------------------------------------------------------------
! echo "10. Creating Redo Log Groups for Additional Nodes"
@${REDO_SQL}
ALTER DATABASE ENABLE PUBLIC THREAD ${ADD_INST_NO};
-----------------------------------------------------------------
-- 11. Creation and assignment of an UNDO tablespace
-- for the PDB on an additional node
-----------------------------------------------------------------
! echo "11. Creation and assignment of an UNDO tablespace for the PDB"
ALTER SESSION SET CONTAINER = "${PDB_NAME}";
CREATE SMALLFILE UNDO TABLESPACE "${UNDO_TBS}"
DATAFILE '${PDB_UDBF}' SIZE 1024M REUSE
AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED;
ALTER SYSTEM SET undo_tablespace = '${UNDO_TBS}' SID = '${ADD_INST}';
spool off
exit
EOF
if [ $? -ne 0 ];then
echo "[09-11] The database operation to add a node failed."
echo "Please check this log for details.[ ${LOG_NODE_ADD} ]"
exit 1
fi
#----------------------------------------------
# 12. DB instance resource (${ADD_INST}) enable
#----------------------------------------------
echo "12. DB instance resource (${ADD_INST}) enable"
# DB instance resource activation
# - Configured via DB resources to clear the operation history
# - for individual instances.
srvctl disable database -db ${CDB_NAME}
srvctl enable database -db ${CDB_NAME}
#----------------------------------------------
# 13. DB instance (${ADD_INST}) startup
# - Launch an instance at the DB resource level to verify
# - that instance resources are enabled.
#----------------------------------------------
echo "13. DB instance (${ADD_INST}) startup"
srvctl start database -db ${CDB_NAME}
if [ $(LANG=C;srvctl status instance -db ${CDB_NAME} -node ${ADD_NODE}|grep -c "is running on node" ) -eq 0 ] ; then
echo "[12-13] The DB instance (${ADD_INST}) failed to start."
exit 1
fi
#----------------------------------------------
# 14. Opening the PDB on an additional node
#----------------------------------------------
echo "14. Opening the PDB on an additional node"
srvctl start pdb -db ${CDB_NAME} -pdb ${PDB_NAME} -node ${ADD_NODE}
if [ $(LANG=C;srvctl status pdb -db ${CDB_NAME} -pdb ${PDB_NAME} |grep "is running on nodes" | grep -c "${ADD_NODE}") -eq 0 ] ; then
echo "[14] Failed to open the PDB on the additional node."
exit 1
fi
#----------------------------------------------
# A1. PFILE backup and collection of DB configuration information
#----------------------------------------------
echo "Last, PFILE backup and collection of DB configuration information"
sqlplus -S / as sysdba <<EOF
spool ${LOG_DB_INFO}
set lines 120 pages 9999 trimspool on
-- CDB info
show con_name;
-- redo log info
col STATUS format a10
col SIZE_MB format 99999
col MEMBER format a30
select a.GROUP#,a.THREAD#,a.SEQUENCE#,a.STATUS
,a.BYTES / 1024 / 1024 SIZE_MB,b.MEMBER
from V\$LOG a,V\$LOGFILE b
where a.GROUP# = b.GROUP# order by THREAD#,GROUP#,MEMBER;
-- datafile info
col TS_NAME format a10
col DF_NAME format a40
col CID format 999
col NEXT_MB format 9999
select TABLESPACE_NAME TS_NAME,FILE_NAME DF_NAME,
BYTES / 1024 / 1024 SIZE_MB,INCREMENT_BY * 8 / 1024 NEXT_MB
from DBA_DATA_FILES order by 1;
-- undo parameter info (from memory)
col NAME format a16
col VALUE format a30
select INST_ID,NAME,VALUE from GV\$PARAMETER
where NAME = 'undo_tablespace' order by INST_ID;
alter session set container = ${PDB_NAME};
-- PDB info
show con_name;
-- undo parameter info (from memory)
select INST_ID,NAME,VALUE from GV\$PARAMETER
where NAME = 'undo_tablespace' order by INST_ID;
-- undo parameter info (from spfile)
col SID format a10
select INST_ID,SID,NAME,VALUE from GV\$SPPARAMETER
where NAME = 'undo_tablespace' order by INST_ID,SID;
-- datafile info
select TABLESPACE_NAME TS_NAME,FILE_NAME DF_NAME,
BYTES / 1024 / 1024 SIZE_MB,INCREMENT_BY * 8 / 1024 NEXT_MB
from DBA_DATA_FILES order by 1;
-- Initialization parameter backup (after)
alter session set container = CDB\$ROOT;
create pfile='${BKUP_DIR}/init_${CDB_NAME}_aft.ora' from spfile;
spool off
exit;
EOF
#----------------------------------------------
# A2. Check DB resources
#----------------------------------------------
srvctl config database -db ${CDB_NAME} -all
srvctl status database -db ${CDB_NAME}
echo "---------------------------------------------------------"
echo "The addition of the DB instance(${ADD_INST}) is complete."
echo "---------------------------------------------------------"
exit
DBインスタンス追加シェルの実行
DBインスタンス追加シェルを実行します。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# ノード追加作業用のシェル・スクリプトを実行
/opt/app/oracle/admin/prdb/scripts_addnode/addinst.sh
DBインスタンス追加シェル実行結果(クリックで表示)
[oracle@prsdb01 ~]$ /opt/app/oracle/admin/prdb/scripts_addnode/addinst.sh
1. Create a directory for the additional node
2. Launch work instance
3. Parameter settings for additional nodes
ファイルが作成されました。
システムが変更されました。
システムが変更されました。
システムが変更されました。
4. Stop all node DB instances
5. Adding a DB instance
6. Disabling the added DB instance
7. DB startup
8. PDB open
9. Creating an UNDO tablespace for a CDB on an additional node
表領域が作成されました。
10. Creating Redo Log Groups for Additional Nodes
データベースが変更されました。
データベースが変更されました。
11. Creation and assignment of an UNDO tablespace for the PDB
セッションが変更されました。
表領域が作成されました。
システムが変更されました。
12. DB instance resource (prdb3) enable
13. DB instance (prdb3) startup
14. Opening the PDB on an additional node
Last, PFILE backup and collection of DB configuration information
CON_NAME
------------------------------
CDB$ROOT
GROUP# THREAD# SEQUENCE# STATUS SIZE_MB MEMBER
---------- ---------- ---------- ---------- ------- ------------------------------
11 1 130 CURRENT 256 +DG11/PRDB/log/redo11_1.log
11 1 130 CURRENT 256 +DG11/PRDB/log/redo11_2.log
12 1 128 INACTIVE 256 +DG11/PRDB/log/redo12_1.log
12 1 128 INACTIVE 256 +DG11/PRDB/log/redo12_2.log
13 1 129 INACTIVE 256 +DG11/PRDB/log/redo13_1.log
13 1 129 INACTIVE 256 +DG11/PRDB/log/redo13_2.log
21 2 127 INACTIVE 256 +DG11/PRDB/log/redo21_1.log
21 2 127 INACTIVE 256 +DG11/PRDB/log/redo21_2.log
22 2 128 CURRENT 256 +DG11/PRDB/log/redo22_1.log
22 2 128 CURRENT 256 +DG11/PRDB/log/redo22_2.log
23 2 126 INACTIVE 256 +DG11/PRDB/log/redo23_1.log
23 2 126 INACTIVE 256 +DG11/PRDB/log/redo23_2.log
31 3 75 INACTIVE 256 +DG11/PRDB/log/redo31_1.log
31 3 75 INACTIVE 256 +DG11/PRDB/log/redo31_2.log
32 3 76 CURRENT 256 +DG11/PRDB/log/redo32_1.log
32 3 76 CURRENT 256 +DG11/PRDB/log/redo32_2.log
33 3 0 UNUSED 256 +DG11/PRDB/log/redo33_1.log
33 3 0 UNUSED 256 +DG11/PRDB/log/redo33_2.log
18行が選択されました。
TS_NAME DF_NAME SIZE_MB NEXT_MB
---------- ---------------------------------------- ------- -------
SYSAUX +DG21/PRDB/dbf/sysaux01.dbf 2048 16
SYSTEM +DG21/PRDB/dbf/system01.dbf 1024 16
UNDOTBS1 +DG21/PRDB/rbs/undotbs01.dbf 1024 16
UNDOTBS2 +DG21/PRDB/rbs/undotbs02.dbf 1024 16
UNDOTBS3 +DG21/PRDB/rbs/undotbs03.dbf 1024 16
USERS +DG21/PRDB/dbf/users01.dbf 16 4
6行が選択されました。
INST_ID NAME VALUE
---------- ---------------- ------------------------------
1 undo_tablespace UNDOTBS1
2 undo_tablespace UNDOTBS2
3 undo_tablespace UNDOTBS3
セッションが変更されました。
CON_NAME
------------------------------
PRPDB
INST_ID NAME VALUE
---------- ---------------- ------------------------------
1 undo_tablespace UNDOTBS1
2 undo_tablespace UNDOTBS2
3 undo_tablespace UNDOTBS3
INST_ID SID NAME VALUE
---------- ---------- ---------------- ------------------------------
1 prdb1 undo_tablespace UNDOTBS1
1 prdb2 undo_tablespace UNDOTBS2
1 prdb3 undo_tablespace UNDOTBS3
2 prdb1 undo_tablespace UNDOTBS1
2 prdb2 undo_tablespace UNDOTBS2
2 prdb3 undo_tablespace UNDOTBS3
3 prdb1 undo_tablespace UNDOTBS1
3 prdb2 undo_tablespace UNDOTBS2
3 prdb3 undo_tablespace UNDOTBS3
9行が選択されました。
TS_NAME DF_NAME SIZE_MB NEXT_MB
---------- ---------------------------------------- ------- -------
SYSAUX +DG21/PRDB/prpdb/sysaux01.dbf 2048 16
SYSTEM +DG21/PRDB/prpdb/system01.dbf 1024 16
UNDOTBS1 +DG21/PRDB/prpdb/undotbs01.dbf 1024 16
UNDOTBS2 +DG21/PRDB/prpdb/undotbs02.dbf 1024 16
UNDOTBS3 +DG21/PRDB/prpdb/undotbs03.dbf 1024 16
USERIDX01 +DG21/PRDB/prpdb/useridx01.dbf 5120 16
USERS +DG21/PRDB/prpdb/users01.dbf 16 4
USERTBL01 +DG21/PRDB/prpdb/usertbl01.dbf 10240 16
8行が選択されました。
セッションが変更されました。
ファイルが作成されました。
一意のデータベース名: prdb
データベース名: prdb
Oracleホーム: /opt/app/oracle/product/26.0.0/dbhome_1
Oracleユーザー: oracle
spfile: +DG11/PRDB/PARAMETERFILE/spfile.264.1245626911
パスワード・ファイル: +DG11/PRDB/orapwprdb
ドメイン:
開始オプション: open
停止オプション: immediate
データベース・ロール: PRIMARY
管理ポリシー: AUTOMATIC
サーバー・プール:
ディスク・グループ: DG11,DG21
マウント・ポイントのパス:
サービス: online_srv
タイプ: RAC
開始の同時実行性:
停止の同時実行性:
データベースは有効です
データベースはノード: で個別に有効になっています
データベースはノード: で個別に無効になっています
OSDBAグループ: dba
OSOPERグループ:
データベース・インスタンス: prdb1,prdb2,prdb3
構成されたノード: prsdb01,prsdb02,prsdb03
CSSクリティカル: no
CPU数: 0
メモリー・ターゲット: 0
最大メモリー: 0
データベース・サービスのデフォルト・ネットワーク番号:
データベースは管理者によって管理されています
インスタンスprdb1はノードprsdb01で実行中です。
インスタンスprdb2はノードprsdb02で実行中です。
インスタンスprdb3はノードprsdb03で実行中です。
---------------------------------------------------------
The addition of the DB instance(prdb3) is complete.
---------------------------------------------------------
[oracle@prsdb01 ~]$
シェルを実行すると最後にDBインスタンス追加に関する構成情報が表示されます*1。その内容が設計通りであればDBインスタンスの追加は完了です。
*1:<作業ディレクトリ>/log/DB_INFO.logにも構成情報が保存されています。
DBインスタンス追加シェルが失敗した場合の対応
DBインスタンス追加シェルが失敗した場合は作成途中のDBインスタンスを削除したりクラスタからリソースを削除したりといった原状回復が必要です。
もしある程度処理が進行してシェルが異常終了(あるいはシェルを強制終了)したのであればDBCAを使って原状回復ができます。
DBCAを起動して「Oracle RACデータベース・インスタンスの管理(I)」->「インスタンスの削除(D)」を選択、よしなに操作すると追加に失敗したDBインスタンスやクラスタ・リソースを削除してくれます。
ただしDBCAはシェルによるPDBの変更(UNDO表領域の追加、割り当て)を削除(解除)することができません。PDBの原状回復は手動で実行する必要があります。
また、DBインスタンス追加シェルが異常終了した状況によってはDBCAによる原状回復ができない可能性があります。
そのような場合の対応として何をどうするかは状況次第なので細かい説明は省略、代わりにすべての原状回復を手動で実行したときの証跡を記載しておきます。
ノード追加作業の手動による原状回復(クリックで表示)
[oracle@prsdb01 ~]$ export LANG=C;export NLS_LANG=American_America.AL32UTF8
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ # Stopping the DB instance to be deleted
[oracle@prsdb01 ~]$ srvctl stop instance -db prdb -node prsdb03
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ sqlplus / as sysdba
SQL*Plus: Release 23.26.1.0.0 - Production on Fri Oct 23 18:27:40 2026
Version 23.26.1.0.0
Copyright (c) 1982, 2025, Oracle. All rights reserved.
Connected to:
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0
SQL> -- Archive log output
SQL> alter system archive log current;
System altered.
SQL> alter system checkpoint;
System altered.
SQL>
SQL> -- Resetting parameters for the DB instance to be deleted
SQL> alter system reset instance_number sid ='prdb3' scope = spfile;
System altered.
SQL> alter system reset undo_tablespace sid ='prdb3' scope = spfile;
System altered.
SQL> alter system reset thread sid ='prdb3' scope = spfile;
System altered.
SQL>
SQL>
SQL> -- Deletion of threads and redo log groups for the target instance
SQL> alter database disable thread 3;
Database altered.
SQL> alter database drop logfile group 31;
Database altered.
SQL> alter database drop logfile group 32;
Database altered.
SQL> alter database drop logfile group 33;
Database altered.
SQL>
SQL> -- Deletion of the UNDO tablespace for the target instance
SQL> drop tablespace UNDOTBS3 including contents and datafiles;
Tablespace dropped.
SQL>
SQL> -- Change the session to the PDB
SQL> alter session set container = prpdb;
Session altered.
SQL> -- Deletion of UNDO tablespace assignment for the target instance (PDB)
SQL> alter system reset undo_tablespace sid ='prdb3';
System altered.
SQL> -- Deletion of the UNDO tablespace for the target instance
SQL> drop tablespace UNDOTBS3 including contents and datafiles;
Tablespace dropped.
SQL> exit
Disconnected from Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ # Deletion of target DB instance/resource
[oracle@prsdb01 ~]$ srvctl stop database -db prdb
[oracle@prsdb01 ~]$ srvctl remove instance -db prdb -instance prdb3
Remove instance from the database prdb? (y/[n]) y
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ # Check DB resource status
[oracle@prsdb01 ~]$ srvctl status database -db prdb
Instance prdb1 is not running on node prsdb01
Instance prdb2 is not running on node prsdb02
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ # DB start
[oracle@prsdb01 ~]$ srvctl start database -db prdb
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ # Check DB resource status
[oracle@prsdb01 ~]$ srvctl status database -db prdb
Instance prdb1 is running on node prsdb01
Instance prdb2 is running on node prsdb02
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ # Check REDO log files (for the target instance)
[oracle@prsdb01 ~]$ # REDO log deletion
[oracle@prsdb01 ~]$ asmcmd --privilege sysdba rm -f +DG11/PRDB/log/redo3*_*.log
[oracle@prsdb01 ~]$ asmcmd --privilege sysdba ls +DG11/PRDB/log/
redo11_1.log
redo11_2.log
redo12_1.log
redo12_2.log
redo13_1.log
redo13_2.log
redo21_1.log
redo21_2.log
redo22_1.log
redo22_2.log
redo23_1.log
redo23_2.log
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ sqlplus / as sysdba
SQL*Plus: Release 23.26.1.0.0 - Production on Fri Oct 23 18:33:24 2026
Version 23.26.1.0.0
Copyright (c) 1982, 2025, Oracle. All rights reserved.
Connected to:
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0
SQL> -- Deletion of automatically configured parameters for the target instance
SQL> create pfile='/tmp/init_prdb_tmp.ora' from spfile;
File created.
SQL> ! grep "^prdb3\." /tmp/init_prdb_tmp.ora | awk -F[.=] '{print "alter system reset \""$2"\" sid='\'prdb3\'';"}' > /tmp/del_init_prdb3.sql
SQL>
SQL> ! cat /tmp/del_init_prdb3.sql
alter system reset "__data_transfer_cache_size" sid='prdb3';
alter system reset "__datamemory_area_size" sid='prdb3';
alter system reset "__db_cache_size" sid='prdb3';
alter system reset "__inmemory_ext_roarea" sid='prdb3';
alter system reset "__inmemory_ext_rwarea" sid='prdb3';
alter system reset "__java_pool_size" sid='prdb3';
alter system reset "__large_pool_size" sid='prdb3';
alter system reset "__oracle_base" sid='prdb3';
alter system reset "__pga_aggregate_target" sid='prdb3';
alter system reset "__sga_target" sid='prdb3';
alter system reset "__shared_io_pool_size" sid='prdb3';
alter system reset "__shared_pool_size" sid='prdb3';
alter system reset "__streams_pool_size" sid='prdb3';
alter system reset "__unified_pga_pool_size" sid='prdb3';
alter system reset "_instance_recovery_bloom_filter_size" sid='prdb3';
SQL> @/tmp/del_init_prdb3.sql
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
System altered.
SQL> create pfile='/tmp/init_prdb_tmp2.ora' from spfile;
File created.
SQL> ! grep "^prdb3\." /tmp/init_prdb_tmp2.ora
SQL> exit
Disconnected from Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ # Deletion of DB instance-related directories on the target node
[oracle@prsdb01 ~]$ srvctl stop database -db prdb
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ ssh prsdb03 "rm -Rf ${ORACLE_BASE}/admin/prdb"
[oracle@prsdb01 ~]$ ssh prsdb03 "rm -Rf ${ORACLE_BASE}/diag/rdbms/prdb"
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ srvctl start database -db prdb
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ srvctl status database -db prdb
Instance prdb1 is running on node prsdb01
Instance prdb2 is running on node prsdb02
[oracle@prsdb01 ~]$
[oracle@prsdb01 ~]$ rm /tmp/init_prdb_tmp.ora /tmp/init_prdb_tmp2.ora /tmp/del_init_prdb3.sql
[oracle@prsdb01 ~]$
※最初に言語を英語(US)に設定していますが作業中に書き込んだコメント(英語)に合わせているだけで他に何か必要性があってそうしたわけではありません。
DBインスタンス・リソースの無効化について
DBインスタンス追加シェルはDBリソースの下にDBインスタンス・リソースを追加します。また、必要な処理がすべて完了するまで追加したDBインスタンスが起動しないよう、DBインスタンス・リソースを無効化(disable)しています(DBインスタンス追加シェル・コメント6の処理)。
このDBインスタンス・リソースの無効化にちょっとした注意点というか、クセがあるのでそのことを書いておきたいと思います。
DBインスタンス・リソースを無効化(disable)すると(上位の)DBリソースにとってこのDBインスタンスのノードは「(DBリソースの設定に従わず)個別にDBが無効化されている」状態となります。
また、無効化したDBインスタンス・リソースを有効化(enable)しても「個別にDBが有効化されている」ノードとなるだけで「個別にDBが…されている」状態は解除されません。
【新DBサーバ・prsdb01 DBインスタンス・リソース設定変更結果】
-----------------------------------------------------------------------------
[oracle@prsdb01 ~]$ srvctl disable instance -db prdb -instance prdb3
[oracle@prsdb01 ~]$ srvctl config database -db prdb -all
・・・
データベースは有効です
データベースはノード: で個別に有効になっています
データベースはノード: prsdb03で個別に無効になっています
・・・
データベース・インスタンス: prdb1,prdb2,prdb3
構成されたノード: prsdb01,prsdb02,prsdb03
・・・
[oracle@prsdb01 ~]$ srvctl enable instance -db prdb -instance prdb3
[oracle@prsdb01 ~]$ srvctl config database -db prdb -all
・・・
データベースは有効です
データベースはノード: prsdb03で個別に有効になっています <- enableに戻しても個別管理状態
データベースはノード: で個別に無効になっています
・・・
データベース・インスタンス: prdb1,prdb2,prdb3
構成されたノード: prsdb01,prsdb02,prsdb03
・・・
[oracle@prsdb01 ~]$
# (LANG=C)
[oracle@prsdb01 ~]$ LANG=C
[oracle@prsdb01 ~]$ srvctl disable instance -db prdb -instance prdb3
[oracle@prsdb01 ~]$ srvctl config database -db prdb -all
Database is enabled
Database is individually enabled on nodes:
Database is individually disabled on nodes: prsdb03
...
Database instances: prdb1,prdb2,prdb3
Configured nodes: prsdb01,prsdb02,prsdb03
...
[oracle@prsdb01 ~]$ srvctl enable instance -db prdb -instance prdb3
[oracle@prsdb01 ~]$ srvctl config database -db prdb -all
...
Database is enabled
Database is individually enabled on nodes: prsdb03
Database is individually disabled on nodes:
...
Database instances: prdb1,prdb2,prdb3
Configured nodes: prsdb01,prsdb02,prsdb03
...
[oracle@prsdb01 ~]$
なんだかちょっと気持ち悪い状況ですが、さらに気持ち悪いのがこのDBインスタンス・リソースを削除したとしてもDBリソースから「個別にDBが…されている」情報は消えずに残ったままとなってしまいます。
【新DBサーバ・prsdb01 DBインスタンス・リソース設定変更結果】
-----------------------------------------------------------------------------
[oracle@prsdb01 ~]$ srvctl remove instance -db prdb -instance prdb3
データベースprdbからインスタンスを削除しますか。 (y/[n]) y
[oracle@prsdb01 ~]$ srvctl config database -db prdb -all
・・・
データベースは有効です
データベースはノード: prsdb03で個別に有効になっています <--インスタンス削除でも残ったまま
データベースはノード: で個別に無効になっています
・・・
データベース・インスタンス: prdb1,prdb2 <-- DBを構成するインスタンス、ノードのリスト
構成されたノード: prsdb01,prsdb02 <-- からは削除インスタンスの情報はクリア
・・・
[oracle@prsdb01 ~]$
# (LANG=C)
[oracle@prsdb01 ~]$ LANG=C
[oracle@prsdb01 ~]$ srvctl config database -db prdb -all
...
Database is enabled
Database is individually enabled on nodes: prsdb03
Database is individually disabled on nodes:
...
Database instances: prdb1,prdb2,prdb3
Configured nodes: prsdb01,prsdb02,prsdb03
...
[oracle@prsdb01 ~]$
存在しないDBインスタンスのノードがDBリソースの構成情報に残っているというのはクラスタの構成に不整合が生じているわけで、それが直接トラブルの原因*1となるかどうかはともかくよろしい状態ではありません。
この「個別云々」の状態を解消するにはどうするかというと、DBインスタンス・リソースをいじってもどうにもならないのでその上位のDBリソースを一旦無効化します。それからまたDBリソースを有効化すると「個別云々」は解消されます。
【新DBサーバ・prsdb01 DBインスタンス・リソース設定変更結果】
-----------------------------------------------------------------------------
[oracle@prsdb01 ~]$ srvctl disable database -db prdb
[oracle@prsdb01 ~]$ srvctl enable database -db prdb
[oracle@prsdb01 ~]$ srvctl config database -db prdb -all
・・・
データベースはノード: で個別に有効になっています <-- ノードの個別設定がクリア
データベースはノード: で個別に無効になっています
・・・
データベース・インスタンス: prdb1,prdb2
構成されたノード: prsdb01,prsdb02
・・・
[oracle@prsdb01 ~]$
# (LANG=C)
[oracle@prsdb01 ~]$ LANG=C
[oracle@prsdb01 ~]$ srvctl config database -db prdb -all
...
Database is individually enabled on nodes:
Database is individually disabled on nodes:
...
Database instances: prdb1,prdb2
Configured nodes: prsdb01,prsdb02
...
[oracle@prsdb01 ~]$
*1:私はこの投稿ページの作成にあたり3日かけてスクリプトによるDBインスタンスの作成と削除をうんざりするほど繰り返しておりました。で、最終的に作成したDBインスタンスをプライマリ・ノードとするサービスを追加して接続テストをしたらなんとエラー。原因は追加ノードのローカル・リスナーが起動していなかったからでございます。なぜローカル・リスナーが起動していなかったのかといえば無効に設定されてたから。つまりDBインスタンス追加シェル作成の初日か2日目のどこかでローカル・リスナーが無効化されて3日目のCRS起動では立ち上がらなかったというわけです。
ローカル・リスナーはRAC(Grid Infrastructure)へのノード追加で作られgridユーザが管理します。oracleユーザが触ることは無く、いくらDBインスタンスの追加&削除を繰り返してもそれで無効化されるとは思えない。そうなった結局原因はわからずじまいだったのですが、おそらくDBインスタンス・リースを削除した後でもDBリソースに「個別云々」が残り、その不整合が原因でクラスタが追加ノードのローカル・リスナーを無効化してしまったんじゃなかろうか、というのがGeminiさんの推測です。
*2:DBインスタンス追加シェルの「12. DB instance resource enable」ではこのやり方でDBインスタンスを有効化しています。
Oracleユーザの環境変数設定
新DBサーバ#3のoracleユーザの.bash_profileに環境変数設定を追記します。
【新DBサーバ・prsdb03で実行】
-----------------------------------------------------------------------------
# oracleユーザにスイッチ
su - oracle
# .bash_profileに環境変数を追記
cat <<EOF >> .bash_profile
export LANG=ja_JP.UTF-8
export ORACLE_BASE=/opt/app/oracle
export ORACLE_HOME=\${ORACLE_BASE}/product/26.0.0/dbhome_1
export LD_LIBRARY_PATH=\${ORACLE_HOME}/lib
export NLS_LANG=Japanese_Japan.AL32UTF8
export PATH=\${ORACLE_HOME}/bin:\${PATH}
export ORACLE_SID=prdb3
EOF
# 追記した.bash_profileの内容を確認
cat .bash_profile
再ログインまたはsourceで新DBサーバ#3のoracleユーザに.bash_profileに追記した環境変数を反映させてから内部接続でローカル・ノードのDBインスタンスに接続できることを確認します。
【新DBサーバ・prsdb03 / oracleユーザで実行】
-----------------------------------------------------------------------------
# oracleユーザのスイッチからrootユーザに復帰
exit
# oracleユーザに再度スイッチ
su - oracle
# 内部接続で新DBサーバ#3のDBインスタンスに接続
sqlplus / as sysdba
-- 接続しているDBインスタンスを確認
select INSTANCE_NAME from V$INSTANCE;
-- sqlplus終了
exit
以上でスクリプトによるDBインスタンスの追加は終了です。ちょっと長くなったのでここで一旦切って、次は追加ノードのDBインスタンスをプライマリに指定したバッチ用サービスの追加とOracle Netの設定です。
DBサーバ構築(Oracle 26ai)・関連ページ
DBサーバ構築、Oracle 26ai(1)概要
DBサーバ構築、Oracle 26ai(2)OS、N/W、ストレージ
DBサーバ構築、Oracle 26ai(3)Gridインストール1
DBサーバ構築、Oracle 26ai(4)Gridインストール2
DBサーバ構築、Oracle 26ai(5)DBインストール
DBサーバ構築、Oracle 26ai(6)2ノードRAC構築 1 (DB設計)
DBサーバ構築、Oracle 26ai(6)2ノードRAC構築 2 (DB構築)
DBサーバ構築、Oracle 26ai(6)2ノードRAC構築 3 (アーカイブログ、HugePages他)
DBサーバ構築、Oracle 26ai(7)RACノード追加 1(Gridノード追加、Oracleホーム拡張)
DBサーバ構築、Oracle 26ai(7)RACノード追加 2(DBインスタンス追加・DBCA版)
DBサーバ構築、Oracle 26ai(7)RACノード追加 3(DBインスタンス追加・スクリプト版)
コメント