Oracle DB構築(2ノードRAC)DB構築、プロファイル設定、サービス追加、アプリユーザ追加
DB構築
Oracle 21c(21.3.0.0)のDBCAではデフォルトの”orcl”以外のDB名を指定して先に進むと構築フェーズでASMディスク・グループにそのDB名のディスクが作成されずエラーとなりました。Oracle 26aiのDBCAだとこの問題は解決されている模様です。
ただしPDAの設定をいじることがができないのはこれまでのバージョンと同じなので、今回もDBCAで構築スクリプトを生成、これをよしなに修正・実行という段取りでDBを構築します。
事前準備
新DBサーバのCRSが停止している場合は新DBサーバ#1 -> 新DBサーバ#2の順にCRSを起動します。
【prsdb01 / rootユーザで実行】
-----------------------------------------------------------------------------
# CRS起動
/opt/app/26.0.0/grid/bin/crsctl start crs -wait
※新DBサーバ#1のCRSが完全に起動し終わってから新DBサーバ#2のCRSを起動すること
DB構築スクリプト作成
GUIでDBCAを実行するので新DBサーバ#1のoracleユーザでVNC Serverを起動します。
【prsdb01で実行】
-----------------------------------------------------------------------------
# oracleユーザにスイッチ
su - oracle
# VNC Server起動
vncserver :1
作業PCのVNC Viewerで新DBサーバ#1にログイン、ターミナルを立ち上げて”dbca”と打ち込みDBCAを起動します。
【prsdb01 / VNC Viewerで実行】
-----------------------------------------------------------------------------
dbca
DBCAを以下のように操作してDB構築スクリプトを生成します。
【DBCA操作手順】
| No. | 画面 | 操作 |
| 1 | データベース操作の選択 | 「データベースの作成(C)」を選択 |
| 2 | データベース作成モードの選択 | 「拡張構成(V)」を選択 |
| 3 | データベース・デプロイメント ・タイプの選択 | データベース・タイプ(D):「Oracle Real Application Cluster(RAC)…(C)」を選択 データベース管理ポリシー(M):「自動」を選択 テンプレート名:「カスタム・データベース」を選択 |
| 4 | ノード・リストの選択 | prsdb01、prsdb02にチェックが入っていることを確認 |
| 5 | データベースIDの詳細の指定 | グローバル・データベース名(G):prdb SID接頭辞(S):prdb PDB用のローカルUNDO表領域の使用(L):チェック 「1つ以上のPDBを含むコンテナ・データベースの作成(A)」を選択 PDBの数(U):1 PDB名(P):prpdb |
| 6 | データベース記憶域オプションの選択 | 「データベース記憶域属性に次を使用(F)」選択 データベース・ファイルの記憶域タイプ(D):「自動ストレージ管理(ASM)」選択 データベース・ファイルの位置(L):+DG21/{DB_UNIQUE_NAME} Oracle Managed Files(OMF)の使用(O):チェックしない ※OMFを使用しないことについての確認メッセージには「はい(Y)」クリック |
| 7 | 高速リカバリ・オプションの選択 | すべてチェックしない |
| 8 | データベース・オプションの選択 | コンポーネント選択のチェックをすべて外す |
| 9 | 構成オプションの指定 | 「メモリー(M)」タブ —————————————————– 「自動共有メモリー管理を使用(U)」を選択 SGAサイズ(G):3584 MB PGAサイズ(P):1024 MB —————————————————– 「サイズ設定(S)」タブ —————————————————– ブロック・サイズ(L):8192 処理(P):1000 |
| 10 | 管理オプションの指定 | 「クラスタ検証ユーティリティ(CVU)・チェックを定期的に実行(V)」のみチェック (上記以外はチェックしない) |
| 11 | データベース・ユーザー資格証明の指定 | 「すべてのアカウントに同じ管理パスワードを使用(U)」選択 パスワード(P):<DB管理者パスワード> パスワードの確認(C):<DB管理者パスワード> |
| 12 | データベース作成オプションの選択 | 「データベースの作成(C)」:チェックを外す 「データベース・テンプレートとして保存(T)」:チェックしない 「データベース:作成スクリプトの生成」:チェック 宛先ディレクトリ:{ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/scripys 「記憶幾の場所のカスタマイズ」をクリック |
「データベース作成オプションの選択」の「記憶幾の場所のカスタマイズ」をクリックすると「記憶域のカスタマイズ」画面が表示されます。スクリプト修正の手間を省くためここでDBの構成をざっくり編集します*1。編集内容は以下の通りです。
【記憶域のカスタマイズ画面操作】
| No. | 設定対象 | 設定内容 |
| 1 | Control Files | ファイル名 パス control01.cll +DG11/{DB_UNIQUE_NAME}/ctl/ control02.cll +DG11/{DB_UNIQUE_NAME}/ctl/ |
| 2 | SYSAUX | ファイル名:+DG21/{DB_UNIQUE_NAME}/dbf/sysaux01.dbf ※「オプション」タブ「BIGFAILE表領域の使用(M)」のチェックを外す |
| 3 | SYSTEM | ファイル名:+DG21/{DB_UNIQUE_NAME}/dbf/system01.dbf ※「オプション」タブ「BIGFAILE表領域の使用(M)」のチェックを外す |
| 4 | TEMP | ファイル名:+DG11/{DB_UNIQUE_NAME}/tmp/temp01.dbf |
| 5 | UNDOTBS1 | ファイル名:+DG21/{DB_UNIQUE_NAME}/rbs/undotbs01.dbf |
| 6 | UNDOTBS2 | ファイル名:+DG21/{DB_UNIQUE_NAME}/rbs/undotbs02.dbf |
| 7 | USERS | ファイル名:+DG21/{DB_UNIQUE_NAME}/dbf/users01.dbf ※「オプション」タブ「BIGFAILE表領域の使用(M)」のチェックを外す |
| 8 | Redo log Groups 11 | ※Redo log Groups下の「1」をクリック グループ番号(G):1 -> 11に変更 ファイルサイズ(H):204800KB -> 256 MBに変更 スレッド'(I):1 REDOログ・メンバー / ファイル名: +DG11/{DB_UNIQUE_NAME}/log/redo11_1.log +DG11/{DB_UNIQUE_NAME}/log/redo11_2.log (追加) |
| 9 | Redo log Groups 12 | ※Redo log Groups下の「2」をクリック グループ番号(G):2 → 12に変更 ファイルサイズ(H):204800KB -> 256 MBに変更 スレッド'(I):1 REDOログ・メンバー / ファイル名: +DG11/{DB_UNIQUE_NAME}/log/redo12_1.log +DG11/{DB_UNIQUE_NAME}/log/redo12_2.log (追加) |
| 10 | Redo log Groups 13 | ※Redo log Groups → 「追加(B)」をクリック グループ番号(G):13 ファイルサイズ(H):256 MB スレッド'(I):1 REDOログ・メンバー / ファイル名: +DG11/{DB_UNIQUE_NAME}/log/redo13_1.log +DG11/{DB_UNIQUE_NAME}/log/redo13_2.log |
| 11 | Redo log Groups 21 | ※Redo log Groups下の「3」をクリック グループ番号(G):3 → 21に変更 ファイルサイズ(H):204800KB -> 256 MBに変更 スレッド'(I):2 REDOログ・メンバー / ファイル名: +DG11/{DB_UNIQUE_NAME}/log/redo21_1.log +DG11/{DB_UNIQUE_NAME}/log/redo22_1.log (追加) |
| 12 | Redo log Groups 22 | ※Redo log Groups下の「4」をクリック グループ番号(G):4 → 22に変更 ファイルサイズ(H):204800KB -> 256 MBに変更 スレッド'(I):2 REDOログ・メンバー / ファイル名: +DG11/{DB_UNIQUE_NAME}/log/redo22_1.log +DG11/{DB_UNIQUE_NAME}/log/redo22_2.log (追加) |
| 13 | Redo log Groups 23 | ※Redo log Groups → 「追加(B)」をクリック グループ番号(G):23 ファイルサイズ(H):256 MB スレッド'(I):2 REDOログ・メンバー / ファイル名: +DG11/{DB_UNIQUE_NAME}/log/redo23_1.log +DG11/{DB_UNIQUE_NAME}/log/redo23_.log |
| 14 | – | 「OK(A)」クリック |
「OK」をクリックすると「データベース作成オプションの選択」画面に戻るので「次へ(N)」をクリックして先に進みます。
次の「前提条件チェックの実行」画面では「HugePagesの有無」で警告が出ますがHugePagesはDB構築後に設定するので問題ありません*2。他にエラーや警告が出ていなければ「すべて無視」にチェックを入れて「次へ(N)」をクリックします。
サマリー画面でざっとDBの作成内容確認して問題がなければ「終了(F)」をクリックしてDB構築スクリプトを作成します。
*1:制御ファイルはパスの修正、データファイル&一時ファイルはパスの修正とBIGFILE指定の解除、REDOログはグループ番号、サイズ、パスの修正とグループ及びメンバ追加を実施します。DBCAでデータファイルや一時ファイルのサイズを修正(増加)してしまうとpdbseedのサイズも増加してしまうのでスクリプト側でCreate DB実行後にファイル・サイズの拡張を追加します。
なお、DBCAは制御ファイル・REDOログのパスに{DB_UNIQUE_NAME}、データファイル・制御ファイルのパスに”prdb”をそれぞれデフォルトで設定します。DBCAでファイル位置変数を確認すると{DB_UNIQUE_NAME}には”prdb”が設定されているので一見、どちらも同じに見えますが実際に生成されたスクリプトではDB_UNIQUE_NAMEが大文字の”PRDB”に置き換えられてしまいます。ASMは大文字/小文字を区別しないのでそのままDBを作ることはできますがOracle DB側ではファイル・パスの大文字/小文字はしっかり区別しているのでDB構築スクリプトに”prdb”と”PRDB”が混在していると後々トラブルの原因となりかねません。なのでデータファイル・制御ファイルのパスにある”prdb”はすべて{DB_UNIQUE_NAME}に置き換えます。しかし私、毎々思うんですけど、なんでこんな紛らわしいというか、トラブりそうな仕様にしているんですかね?
*2:事前にHugePagesを設定しておけばこの警告は出ないんでしょうけどマニュアル上はDB構築後にHugePagesを設定する流れになっているんですよね。その通りにやるなら毎回この警告が出てしまいます。紛らわしいんでマニュアルを直すかDBCAからHugePagesの確認を外すか、どっちでもいいんで紛らわしいことはやめて欲しいと心底思います。
DB構築スクリプトの編集と実行
DB構築スクリプトの編集
DBCAによって生成されたDB構築用スクリプトは /opt/app/oracle/prdb/scripts に格納されています。VNC Viewerだと操作が面倒なのでteratermでこのスクリプトを編集します。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
-- DB構築スクリプト格納ディレクトリに移動
cd /opt/app/oracle/admin/prdb/scripts/
-- DB構築スクリプトを編集
vi prdb1.sh
vi mkDir.sql
vi prdb1.sql
vi CreateDB.sql
vi CreateDBFiles.sql
vi postDBCreation.sql
vi plug_prpdb.sql
vi postPDBCreation_prpdb.sql
DB構築スクリプト編集内容
以下、DB構築スクリプトの編集内容です。
なお、この編集は「DB構築スクリプトのコレとコレとコレのここをこう直す」といった感じOracleさんが公式手順的な的なものを出していてそれを参考にしたとかではなくDBCAで生成直後のスクリプト1本1本開いて確かめながら私の個人的見解でよしなにいじったものでございます。編集内容の裏付けとなる公式情報はなにもありませんのであしからず。
prdb1.sh(クリックで表示、編集箇所赤字表記)
#!/bin/sh
################## prdb1.sh edit begin #####################
echo "-------------------- CAUTION !! ------------------------"
echo "This shell script is for building the prdb database."
echo "If resources related to the prdb database exist in the ASM disk group, this script deletes all of them before starting the database creation."
echo "(Running this script by mistake when the official database is already complete would be disastrous.)"
echo "--------------------------------------------------------"
echo ""
read -p "Are you sure you want to start the script? (Y/n):" ans
case "$ans" in [Y]*) ;; *) exit ;; esac
echo ""
# Execution User Check
if [ "$(whoami)" != "oracle" ]; then
echo "This script must be executed as the oracle user."
exit
fi
# Environment variable check
if [ -z "${ORACLE_HOME}" -o ! -d "${ORACLE_HOME}" ];then
echo "ORACLE_HOME is not set correctly. Please set ORACLE_HOME before running the script."
exit
fi
# Remote Node Process Check
if [ $(ssh prsdb02 "ps -ef | grep [o]ra_ | grep -c prdb") -gt 0 ];then
echo "A database background process is running on the remote node."
echo "Before executing the shell script, stop the database background processes as the oracle user."
echo ""
echo "command ex.) "
echo "-------------------------------------"
echo "srvctl stop database -db prdb"
echo "exit"
echo "-------------------------------------"
echo ""
exit
fi
# Local Node Process Check
if [ $( ps -ef | grep [o]ra_ | grep -c prdb ) -gt 0 ];then
echo "A database background process is running on the local node."
echo "Before executing the shell script, stop the database background processes as the oracle user."
echo ""
echo "command ex.) "
echo "-------------------------------------"
echo "export ORACLE_SID=prdb1;sqlplus / as sysdba"
echo "shutdown abort"
echo "exit"
echo "-------------------------------------"
echo ""
exit
fi
# Cluster Resource Deletion
OLD_LANG=${LANG};export LANG=C
if [ $( ${ORACLE_HOME}/bin/srvctl status database -db prdb | grep -c "^Instance prdb" ) -gt 0 ];then
srvctl remove database -db prdb -force
fi
export LANG=${OLD_LANG}
# PRDB Delete existing ASM directoryi
if [ $( ${ORACLE_HOME}/bin/asmcmd --privilege sysdba ls +DG11/ | grep -c PRDB ) -gt 0 ];then
${ORACLE_HOME}/bin/asmcmd --privilege sysdba rm -rf +DG11/PRDB
fi
if [ $( ${ORACLE_HOME}/bin/asmcmd --privilege sysdba ls +DG21/ | grep -c PRDB ) -gt 0 ];then
${ORACLE_HOME}/bin/asmcmd --privilege sysdba rm -rf +DG21/PRDB
fi
# Delete existing directory on the remote node
ssh prsdb02 "rm -Rf /opt/app/oracle/admin/prdb/"
ssh prsdb02 "rm -Rf /opt/app/oracle/diag/rdbms/prdb/"
# Delete existing directory on the local node
rm -Rf /opt/app/oracle/admin/prdb/[d,h,p,w]*
rm -Rf /opt/app/oracle/diag/rdbms/prdb/
# Restore init.ora
sed -i '/cluster_database=true/d' /opt/app/oracle/admin/prdb/scripts/init.ora
# Script backup
zip /home/oracle/create_prdb.zip ./*.*
################## prdb1.sh edit end #######################
DB_HOME=$ORACLE_HOME
ASM_HOME=/opt/app/26.0.0/grid
ORACLE_HOME=$ASM_HOME; export ORACLE_HOME
ORACLE_SID=+ASM1; export ORACLE_SID
PERL5LIB=$ORACLE_HOME/rdbms/admin:$PERL5LIB; export PERL5LIB
/opt/app/26.0.0/grid/bin/sqlplus /nolog @/opt/app/oracle/admin/prdb/scripts/mkDir.sql
ORACLE_HOME=$DB_HOME; export ORACLE_HOME
OLD_UMASK=`umask`
umask 0027
mkdir -p /opt/app/oracle
mkdir -p /opt/app/oracle/admin/prdb/dpdump
mkdir -p /opt/app/oracle/admin/prdb/hdump
mkdir -p /opt/app/oracle/admin/prdb/pfile
mkdir -p /opt/app/oracle/admin/prdb/scripts
mkdir -p /opt/app/oracle/audit
umask ${OLD_UMASK}
### prdb1.sh add begin ###
ssh prsdb02 "umask 0027;mkdir -p /opt/app/oracle/audit"
ssh prsdb02 "umask 0027;mkdir -p /opt/app/oracle/admin"
scp -rp /opt/app/oracle/admin/prdb prsdb02:/opt/app/oracle/admin/
### prdb1.sh add end ###
PERL5LIB=$ORACLE_HOME/rdbms/admin:$PERL5LIB; export PERL5LIB
ORACLE_SID=prdb1; export ORACLE_SID
PATH=$ORACLE_HOME/bin:$ORACLE_HOME/perl/bin:$PATH; export PATH
/opt/app/oracle/product/26.0.0/dbhome_1/bin/sqlplus /nolog @/opt/app/oracle/admin/prdb/scripts/prdb1.sql
シェル冒頭に記述された確認*1を差し替え、DB構築スクリプトの実行が失敗した場合のリラン対策*2とスクリプト一式のバックアップ(/home/oracle/にzipアーカイブ)、2番目のノード(prsdb02)のディレクトリ整備を追記します。
mkDir.sql(クリックで表示、編集箇所赤字表記)
SET VERIFY OFF
connect / as SYSDBA;
-- mkDir.sql add begin
alter diskgroup DG11 add directory '+DG11/PRDB';
alter diskgroup DG11 add directory '+DG11/PRDB/prpdb';
-- mkDir.sql add end
alter diskgroup DG11 add directory '+DG11/PRDB/ctl';
alter diskgroup DG11 add directory '+DG11/PRDB/log';
alter diskgroup DG11 add directory '+DG11/PRDB/tmp';
alter diskgroup DG21 add directory '+DG21/PRDB';
alter diskgroup DG21 add directory '+DG21/PRDB/dbf';
alter diskgroup DG21 add directory '+DG21/PRDB/pdbseed';
alter diskgroup DG21 add directory '+DG21/PRDB/prpdb';
alter diskgroup DG21 add directory '+DG21/PRDB/rbs';
exit;
ASMディスク・グループ”+DG11*3にprdbの親ディレクトリ(+DG11/PRDB)とPDB一時ファイル格納用のサブディレクトリ(+DG11/PRDB/prpdb)の作成を追加します。
prdb1.sql(クリックで表示、編集箇所赤字表記)
set verify off
-- prdb1.sql edit begin
define sysPassword = 'oracle';
define systemPassword = '&&sysPassword';
define dbsnmpPassword = '&&sysPassword';
define pdbAdminPassword = '&&sysPassword';
-- prdb1.sql edit end
host /opt/app/oracle/product/26.0.0/dbhome_1/bin/srvctl add database -d prdb -pwfile +DG11/PRDB/orapwprdb -o /opt/app/oracle/product/26.0.0/dbhome_1 -n prdb -a "DG11,DG21"
host /opt/app/oracle/product/26.0.0/dbhome_1/bin/srvctl add instance -d prdb -i prdb1 -n prsdb01
host /opt/app/oracle/product/26.0.0/dbhome_1/bin/srvctl add instance -d prdb -i prdb2 -n prsdb02
host /opt/app/oracle/product/26.0.0/dbhome_1/bin/srvctl disable database -d prdb
host /opt/app/oracle/product/26.0.0/dbhome_1/bin/orapwd file=+DG11/PRDB/orapwprdb force=y format=12 dbuniquename=prdb password=&&sysPassword
@/opt/app/oracle/admin/prdb/scripts/CreateDB.sql
@/opt/app/oracle/admin/prdb/scripts/CreateDBFiles.sql
@/opt/app/oracle/admin/prdb/scripts/CreateDBCatalog.sql
@/opt/app/oracle/admin/prdb/scripts/CreateClustDBViews.sql
@/opt/app/oracle/admin/prdb/scripts/lockAccount.sql
@/opt/app/oracle/admin/prdb/scripts/postDBCreation.sql
@/opt/app/oracle/admin/prdb/scripts/PDBCreation.sql
@/opt/app/oracle/admin/prdb/scripts/plug_prpdb.sql
@/opt/app/oracle/admin/prdb/scripts/postPDBCreation_prpdb.sql
SQLスクリプト冒頭の管理者アカウントのパスワード入力をスクリプト内でのパスワードベタギリに変更、ついでにパスワード・ファイル作成コマンドにもパスワード指定を追加します。また、パスワード・ファイルのパスが+DG21となっているのでこれを+DG11に直し、クラスタ・リソースの依存先にDG11を追加します。
CreateDB.sql(クリックで表示、編集箇所赤字表記)
SET VERIFY OFF
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool /opt/app/oracle/admin/prdb/scripts/CreateDB.log append
startup nomount pfile="/opt/app/oracle/admin/prdb/scripts/init.ora";
CREATE DATABASE "prdb"
MAXINSTANCES 32
MAXLOGHISTORY 1
MAXLOGFILES 192
MAXLOGMEMBERS 3
MAXDATAFILES 1024
DATAFILE '+DG21/PRDB/dbf/system01.dbf' SIZE 700M REUSE AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE '+DG21/PRDB/dbf/sysaux01.dbf' SIZE 550M REUSE AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '+DG11/PRDB/tmp/temp01.dbf' SIZE 20M REUSE AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE '+DG21/PRDB/rbs/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 11 ('+DG11/PRDB/log/redo11_1.log','+DG11/PRDB/log/redo11_2.log') SIZE 256M,
GROUP 12 ('+DG11/PRDB/log/redo12_1.log','+DG11/PRDB/log/redo12_2.log') SIZE 256M,
GROUP 13 ('+DG11/PRDB/log/redo13_1.log','+DG11/PRDB/log/redo13_2.log') SIZE 256M
USER SYS IDENTIFIED BY "&&sysPassword" USER SYSTEM IDENTIFIED BY "&&systemPassword"
enable pluggable database
seed file_name_convert=('+DG21/PRDB/dbf/system01.dbf','+DG21/PRDB/pdbseed/system01.dbf','+DG21/PRDB/dbf/sysaux01.dbf','+DG21/PRDB/pdbseed/sysaux01.dbf','+DG11/PRDB/tmp/temp01.dbf','+DG21/PRDB/pdbseed/temp01.dbf','+DG21/PRDB/rbs/undotbs01.dbf','+DG21/PRDB/pdbseed/undotbs01.dbf') LOCAL UNDO ON;
spool off
CREATE DATABASEコマンドに記述されたSYSTEM、SYSAUX、TEMP、UNDOTBS1のデータファイル NEXT(エクステント・サイズ)をすべて16Mに設定しなおします*4。
CreateDBFiles.sql(クリックで表示、編集箇所赤字表記)
SET VERIFY OFF
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool /opt/app/oracle/admin/prdb/scripts/CreateDBFiles.log append
CREATE SMALLFILE UNDO TABLESPACE "UNDOTBS2" DATAFILE '+DG21/PRDB/rbs/undotbs02.dbf' SIZE 1024M REUSE AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED;
CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE '+DG21/PRDB/dbf/users01.dbf' SIZE 16M REUSE AUTOEXTEND ON NEXT 4M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
ALTER DATABASE DEFAULT TABLESPACE "USERS";
-- CreateDBFiles.sql add begin
ALTER DATABASE DATAFILE '+DG21/PRDB/dbf/sysaux01.dbf' RESIZE 2048M;
ALTER DATABASE DATAFILE '+DG21/PRDB/dbf/system01.dbf' RESIZE 1024M;
ALTER DATABASE DATAFILE '+DG21/PRDB/rbs/undotbs01.dbf' RESIZE 1024M;
ALTER DATABASE TEMPFILE '+DG11/PRDB/tmp/temp01.dbf' RESIZE 2048M;
-- CreateDBFiles.sql add end
spool off
CDBにUSER表領域と2番目のノードに割り当てるUNDO表領域が追加されるのでそのデータ・ファイルのサイズとエクステント・サイズを設計値に合わせて修正します。またCREATE DATABSEによって作成されたSYSTEM、SYSAUX、TEMP、UNDOTBS1のデータファイルも設計値の値にリサイズします。
postDBCreationl.sql(クリックで表示、編集箇所赤字表記)
SET VERIFY OFF
connect "SYS"/"&&sysPassword" as SYSDBA
alter user DBSNMP identified by "&&dbsnmpPassword" account unlock;
spool /opt/app/oracle/admin/prdb/scripts/postDBCreation.log append
host /opt/app/oracle/product/26.0.0/dbhome_1/OPatch/datapatch -skip_upgrade_check -db prdb1;
select group# from v$log where group# =21;
select group# from v$log where group# =22;
select group# from v$log where group# =23;
ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 21 ('+DG11/PRDB/log/redo21_1.log','+DG11/PRDB/log/redo21_2.log') SIZE 256M,
GROUP 22 ('+DG11/PRDB/log/redo22_1.log','+DG11/PRDB/log/redo22_2.log') SIZE 256M,
GROUP 23 ('+DG11/PRDB/log/redo23_1.log','+DG11/PRDB/log/redo23_2.log') SIZE 256M;
ALTER DATABASE ENABLE PUBLIC THREAD 2;
host echo cluster_database=true >>/opt/app/oracle/admin/prdb/scripts/init.ora;
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
create spfile='+DG11' FROM pfile='/opt/app/oracle/admin/prdb/scripts/init.ora';
connect "SYS"/"&&sysPassword" as SYSDBA
host /opt/app/oracle/product/26.0.0/dbhome_1/perl/bin/perl /opt/app/oracle/product/26.0.0/dbhome_1/rdbms/admin/catcon.pl -n 1 -l /opt/app/oracle/admin/prdb/scripts -v -b utlrp -U "SYS"/"&&sysPassword" /opt/app/oracle/product/26.0.0/dbhome_1/rdbms/admin/utlrp.sql;
select comp_id, status from dba_registry;
shutdown immediate;
host /opt/app/oracle/product/26.0.0/dbhome_1/bin/srvctl enable database -d prdb;
host /opt/app/oracle/product/26.0.0/dbhome_1/bin/srvctl start database -d prdb;
connect "SYS"/"&&sysPassword" as SYSDBA
spool off
select instance from v$thread where instance like 'UNNAMED_INSTANCE%';
SPファイルの出力場所を”+DG21″から”+DG11″に変更します。
plug_prpdb.sql(クリックで表示、編集箇所赤字表記)
SET VERIFY OFF
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool /opt/app/oracle/admin/prdb/scripts/plugDatabase.log append
spool /opt/app/oracle/admin/prdb/scripts/plugDatabase.log append
select d.name||'|'||t.name from v$datafile d,V$TABLESPACE t where d.con_id=2 and d.ts#=t.ts# and d.con_id=t.con_id;
select d.name||'|'||t.name from v$tempfile d,V$TABLESPACE t where d.con_id=2 and d.ts#=t.ts# and d.con_id=t.con_id;
CREATE PLUGGABLE DATABASE "prpdb" ADMIN USER PDBADMIN IDENTIFIED BY "&&pdbadminPassword" ROLES=(CONNECT) PARALLEL file_name_convert=('+DG21/PRDB/pdbseed',
'+DG21/PRDB/prpdb') STORAGE INHERIT;
select name from v$containers where upper(name) = 'PRPDB';
-- plug_prpdb.sql add begin
ALTER PLUGGABLE DATABASE "prpdb" open;
ALTER SESSION SET CONTAINER = "prpdb";
ALTER DATABASE DATAFILE '+DG21/PRDB/prpdb/sysaux01.dbf' RESIZE 2048M;
ALTER DATABASE DATAFILE '+DG21/PRDB/prpdb/system01.dbf' RESIZE 1024M;
ALTER DATABASE DATAFILE '+DG21/PRDB/prpdb/undotbs01.dbf' RESIZE 1024M;
CREATE SMALLFILE UNDO TABLESPACE "UNDOTBS2" DATAFILE '+DG21/PRDB/prpdb/undotbs02.dbf' SIZE 1024M REUSE AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED;
ALTER SYSTEM SET undo_tablespace = 'UNDOTBS1' SID = 'prdb1';
ALTER SYSTEM SET undo_tablespace = 'UNDOTBS2' SID = 'prdb2';
ALTER SESSION SET CONTAINER = CDB$ROOT;
ALTER PLUGGABLE DATABASE "prpdb" close;
-- plug_prpdb.sql add end
alter pluggable database "prpdb" open instances=all;
alter system register;
ALTER SESSION SET CONTAINER = "prpdb";
select con_id from v$pdbs where con_id > 1 and upper(name)=upper('prpdb') ;
SELECT bigfile FROM sys.cdb_tablespaces WHERE tablespace_name='TEMP' AND CON_ID=0;
CREATE SMALLFILE TEMPORARY TABLESPACE TEMP_NON_ENC TEMPFILE '+DG21/PRDB/prpdb/temp01_NON_ENC.dbf' SIZE 20480K REUSE AUTOEXTEND ON NEXT 64M MAXSIZE UNLIMITED;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE "TEMP_NON_ENC";
alter session set container=cdb$root;
ALTER PLUGGABLE DATABASE "prpdb" CLOSE IMMEDIATE instances=all;
alter pluggable database "prpdb" open instances=all;
alter system register;
ALTER SESSION SET CONTAINER = "prpdb";
drop tablespace TEMP including contents and datafiles;
-- plug_prpdb.sql edit begin
CREATE SMALLFILE TEMPORARY TABLESPACE TEMP TEMPFILE '+DG11/PRDB/prpdb/temp01.dbf' SIZE 2048M REUSE AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED;
-- plug_prpdb.sql edit end
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE "TEMP";
alter session set container=cdb$root;
ALTER PLUGGABLE DATABASE "prpdb" CLOSE IMMEDIATE instances=all;
alter pluggable database "prpdb" open instances=all;
alter system register;
ALTER SESSION SET CONTAINER = "prpdb";
drop tablespace TEMP_NON_ENC including contents and datafiles;
PDB(prpdb)作成直後にローカル・ノードでPDBをオープン、セッションをPDBに移動して以下の処理を実行します。
・各表領域のデータ・ファイルを設計値に合わせてリサイズ
・prdb2で使用するUNDO表領域を作成
・各ノードへのUNDO表領域の割り当ての固定
また、Oracle 26aiのplug_prpdb.sqlではPDB用一時表領域の再作成が追加されています*5。新しく作成される一時表領域の属性を設計値に合わせて設定します。
postPDBCreation_prpdb.sql(クリックで表示、編集箇所赤字表記)
SET VERIFY OFF
connect "SYS"/"&&sysPassword" as SYSDBA
alter session set container="prpdb";
set echo on
spool /opt/app/oracle/admin/prdb/scripts/postPDBCreation.log append
-- postPDBCreation_prpdb.sql begin
CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE '+DG21/PRDB/prpdb/users01.dbf' SIZE 16M REUSE AUTOEXTEND ON NEXT 4M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
CREATE SMALLFILE TABLESPACE USERTBL01 LOGGING DATAFILE '+DG21/PRDB/prpdb/usertbl01.dbf' SIZE 10G REUSE AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
CREATE SMALLFILE TABLESPACE USERIDX01 LOGGING DATAFILE '+DG21/PRDB/prpdb/useridx01.dbf' SIZE 5G AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
-- postPDBCreation_prpdb.sql edit end
ALTER DATABASE DEFAULT TABLESPACE "USERS";
host /opt/app/oracle/product/26.0.0/dbhome_1/OPatch/datapatch -skip_upgrade_check -db prdb1 -pdbs prpdb;
connect "SYS"/"&&sysPassword" as SYSDBA
select property_value from database_properties where property_name='LOCAL_UNDO_ENABLED';
connect "SYS"/"&&sysPassword" as SYSDBA
alter session set container="prpdb";
set echo on
spool /opt/app/oracle/admin/prdb/scripts/postPDBCreation.log append
connect "SYS"/"&&sysPassword" as SYSDBA
alter session set container="prpdb";
set echo on
spool /opt/app/oracle/admin/prdb/scripts/postPDBCreation.log append
select TABLESPACE_NAME from cdb_tablespaces a,dba_pdbs b where a.con_id=b.con_id and UPPER(b.pdb_name)=UPPER('prpdb');
connect "SYS"/"&&sysPassword" as SYSDBA
alter session set container="prpdb";
set echo on
spool /opt/app/oracle/admin/prdb/scripts/postPDBCreation.log append
select TABLESPACE_NAME from cdb_tablespaces a,dba_pdbs b where a.con_id=b.con_id and UPPER(b.pdb_name)=UPPER('prpdb');
connect "SYS"/"&&sysPassword" as SYSDBA
alter session set container="prpdb";
set echo on
spool /opt/app/oracle/admin/prdb/scripts/postPDBCreation.log append
Select count(*) from dba_registry where comp_id = 'DV' and status='VALID';
show con_name;
alter session set container="prpdb";
select count(a.username) from cdb_users a, v$pdbs b where a.con_id=b.con_id and a.username=upper('PDBADMIN') and upper(b.name)=upper('prpdb');
show con_name;
alter session set container="CDB$ROOT";
alter session set container=CDB$ROOT;
-- postPDBCreation_prpdb.sql begin
spool /opt/app/oracle/admin/prdb/scripts/DBINFO.log append
set lines 120 pages 9999 trimspool on
-- CDB info
show con_name;
-- control file info
col NAME format a40
select NAME from V$CONTROLFILE;
-- spfile info
col SPFILE format a60
select VALUE SPFILE from V$PARAMETER
where NAME = 'spfile';
-- password file info
col FILE_NAME format a40
select FILE_NAME from V$PASSWORDFILE_INFO;
-- redo log info
col STATUS format a10
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
union
select
TABLESPACE_NAME TS_NAME,FILE_NAME DF_NAME,
BYTES / 1024 / 1024 SIZE_MB,
INCREMENT_BY * 8 / 1024 NEXT_MB
from DBA_TEMP_FILES
order by 1;
alter session set container = prpdb;
-- PDB info
show con_name;
-- 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;
-- 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;
-- 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
union
select
TABLESPACE_NAME TS_NAME,FILE_NAME DF_NAME,
BYTES / 1024 / 1024 SIZE_MB,
INCREMENT_BY * 8 / 1024 NEXT_MB
from DBA_TEMP_FILES
order by 1;
-- postPDBCreation_prpdb.sql end
exit;
PDBのUSER表領域サイズを修正、USERTBL01表領域とUSERIDX01表領域を追加します。また、処理の最後にスクリプトによって作成したCDB,PDBの構成情報一式を出力するSQLを追記します。読まなくてもぜんぜん問題ない注釈
*1:昔からDBCAで作成したDB構築シェル(<インスタンス名>.sh)の冒頭には「スクリプトはすべてのリモートノードで実行されますか? 」という確認がついてます。私にはその質問の必要性がまったく理解できないのでどのDBバージョンのシェルでもバッサリ切り捨てていたんですが、Oracle21c版と同じようにOracle26ai版のシェルにもASMディスク上の既存ディレクトリ削除を組み込もうとして大事なことに気が付きました。
もしDB完成後に誤ってprdb1.sh実行してしまうと、この既存ディレクトリ削除によってせっかく作ったDBがASMディスクから消されてオシャカとなってしまいます。なので26aiのシェルではあのよくわからん確認を削除せず「スクリプトを実行すると既存リソースがあれば全部削除してDBを作成しますけど、実行しちゃっていいですか?」的な内容に差し替えてます。
*2:ぶっちゃけ、どのOracleバージョン、どのシステムだろうとDB構築スクリプトの修正が一発OKとなった記憶って私、ほとんどないんですよねぇ。修正一発目のシェル実行では怒涛の勢いでコマンド&エラーがteraterm画面上を流れて「あ、ミスった」で強制終了、画面をずーっと上までスクロールさせて起点となったエラーを確認・修正・リトライというのがお決まりのパターンです。で、そのリトライの前に毎度環境の復旧(Oracle21cの2ノードRAC構築におまけ的に書いた手順)をやるわけですが、これが地味に面倒くさい。復旧手順のやり漏れが原因でリトライ失敗、復旧手順をまた頭からやり直しなんてこともザラにございます。
そこで今回のOracle26aiのDB構築シェル編集ではシェル内に環境復旧処理を追加してみました。ただ、こうした緩急復旧をシェルに組み込むとDB完成後にprdb1.shを誤実行した場合悲惨な結果になってしまいます。一応、シェル誤実行の防止としてprdb1.shの冒頭にこのシェルを実行するとどうなるかを説明の上、やるやらないの確認を入れましたが世の中にはシェルを誤実行しているクセにここを突破するヤツっているんですよ。そこで環境復旧作業のひとつ、「DBバックグラウンド・プロセス停止」については実際の停止までやらずその前段のプロセス・チェックまで。チェックに引っかかった場合は停止コマンドを表示はしますがそれを実行するかどうかは人間の判断としています。シェルを誤実行して手動でDBの停止まですることはさすがにないかなと。つまりは起動中のDBバック・グラウンド・プロセスを手動停止にしたのはここが最終防衛ラインということです。
*3:DBCAの「記憶域のカスタマイズ」画面で「データベース記憶域オプションの選択」の指定と異なるディスク・グループにサブディレクトリをつけてファイル・パスを設定すると、mkDir.sqlにはそのディスク・グループに親ディレクトリを作成せずいきなりサブディレクトリを作成するコマンドが出力されてしまいます。このままmkDir.sqlを実行すればそのディスク・グループのディレクトリ作成は軒並みエラーとなって後続のDBの作成は失敗してしまいます。なのでmkDir.sqlには対象ディスクグループに対する親ディレクトリ(とPDBの一時ファイル格納用ディレクトリ)の作成を追加しなきゃならないわけですけど、この挙動って以前のバージョンでも同じなんですよね。ぼちぼち直してくれんかな。
*4:CDB各表領域のデータ・ファイルに設定されたエクステント属性はpdbseed -> PDBへと継承されるのでCreate Databaseのタイミングで設定しておきます。なお、ここでデータ・ファイルのサイズも設計値に合わせて設定してしまうとCDBをベースに作られるpdbseedのサイズも増加してしまいます。
まあ、CDBの設計値はそれほど大きなものではなく、またCDBの縮小サイズでpdbseedが作成されるのでpdbseedがやたらとでかくなってしまうようなことはないんですが、pdbseedってPDBの元ネタ以外に使い道がないですよね。わずかとはいえそれで余分な領域を食うのはうれしくないので一旦、小さなデータ・ファイル・サイズ(DBCAのデフォルト設定サイズ)でCDB、pdbseedを作成、次に実行するCreateDBFiles.sqlの中でデータ・ファイルをリサイズしようと思います。
*5:Oracle 21cのplug_prpdb.sqlでは”CREATE PLUGGABLE DATABASE”コマンドで一時表領域を作成したらそれっきりだったんですがOracle 26aiのplug_prpdb.sqlだとPDB作成後にわざわざ新しい一時表領域を追加してpdbseedから作成した一時表領域を再作成(Drop&Create)しています。なんでこんな面倒なことをやっているんですかね? まったく分かりません。
そういえばOracle 21cの”CREATE PLUGGABLE DATABASE”だとfile_name_convertによる一時ファイルのパス変換でマニュアル通りの指定順(優先的にやりたい一時ファイルのパス変換を先)では上手くいかず、逆の指定順(一時ファイルのパス変換を後)だと変換できた、なんてことがありました。Geminiさんによれば一時ファイル作成の仕様(他のデータファイルと違ってseedからのコピーではなくPDBオープンのタイミングで作られる)が関係しているんじゃないかと。Oracle 26aiでPDBの一時表領域を再作成するようになったのもそうしたことが絡んでいるんでしょうかね。
DB構築スクリプトの実行
DB構築スクリプトの編集が終わったらprdb1.shを実行します。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
[oracle@prsdb01 scripts]$ ./prdb1.sh
-------------------- CAUTION !! ------------------------
This shell script is for building the prdb database.
If resources related to the prdb database exist in the ASM disk group, this script deletes all of them before starting the database creation.
(Running this script by mistake when the official database is already complete would be disastrous.)
--------------------------------------------------------
Are you sure you want to start the script? (Y/n):
このスクリプトの実行によってprdbの構築を行う旨、また既存のprdb関連オブジェクトがあればすべて削除するという説明に続けて実行するかどうかの確認が表示されます。”Y”を入力、Enterキー押下でDBの構築を開始します。
prdb1.shの実行を開始してからしばらくの間エラーメッセージが表示されず、Create Dabatabse後にスクリプトの処理が程度ゆっくり進行し始めたらとりあえずまともに動いているので後はプロンプトが戻されるまでの小一時間、そのまま放置します。
すべての処理が終了してプロンプトが戻されたらprdb1.sh実行時点まで出力メッセージを遡り途中でエラーが出ていないことを確認します。DBINFO.logにCDB、PDBの設定内容が出力されているので内容を確認して設計通りであればOK、DBの(ガラの)構築はひとまず完了です。
ORACLE_SID設定
oracleユーザの.bash_prfile(home/oracle.bash_profile)に ORACLE_SIDを設定します。
【新DBサーバ・ORACLE_SID設定】
| 対象サーバ | 対象ファイル | 設定値 |
| prsdb01 | /home/oracle/.bash_profile | export ORACLE_SID=prdb1 |
| prsdb02 | /home/oracle/.bash_profile | export ORACLE_SID=prdb2 |
rootからoracleユーザにスイッチしている場合は一旦抜けて再ログインするなど、oracleユーザの環境変数を最新の状態にしてから内部接続(リスナーを経由しない接続)でDBにログインできることを確認します。
【新DBサーバ・prsdb01、prsdb02 / oracleユーザで実行】
-----------------------------------------------------------------------------
# sqlplusでPRDBに接続
sqlplus / as sysdba
select instance_name from V$INSTANCE;
-- ORACLE_SIDと同じインスタンス名が返されることを確認
exit
デフォルト・プロファイル設定
Oracle DBのデフォルト・プロファイルに設定されているPASSWORD_LIFE_TIME(パスワード有効期限)は 180日です。個人ユーザならともかくシステム・ユーザやアプリケーション・ユーザのパスワードが期限切れになったらマジ洒落にならないのでデフォルト・プロファイルの無制限に変更します。
なお、CDBとPDBではプロファイルが別々です。そのためCDBのデフォルト・プロファイルを設定を変更したらPDBでも同じ作業を繰り返します。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# sqlplusでPRDBに接続
sqlplus / as sysdba
-- CDBで現在のデフォルト・プロファイルの設定を確認
col LIMIT format a20
set pages 999
select RESOURCE_NAME,LIMIT from DBA_PROFILES where PROFILE = 'DEFAULT';
-- CDBでデフォルト・プロファイルのPASSWORD_LIFE_TIME を無期限に変更
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
-- 設定変更後のデフォルト・プロファイルの設定を確認
select RESOURCE_NAME,LIMIT from DBA_PROFILES where PROFILE = 'DEFAULT';
-- セッションをPDBに移動
alter session set container = PRPDB;
-- PDBで現在のデフォルト・プロファイルの設定を確認
select RESOURCE_NAME,LIMIT from DBA_PROFILES where PROFILE = 'DEFAULT';
-- PDBでデフォルト・プロファイルのPASSWORD_LIFE_TIME を無期限に変更
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
-- 設定変更後のデフォルト・プロファイルの設定を確認
select RESOURCE_NAME,LIMIT from DBA_PROFILES where PROFILE = 'DEFAULT';
exit
DBサービス作成
アプリケーションからの接続に使用する DBサービスを追加します。
サービスはオンライン・アプリケーション接続用、バッチ・アプリケーション接続用の2種類を作成する想定です。しかしバッチ・アプリケーション接続用サービスのプライマリ・ノード(新DBサーバ#3)はまだRACに追加していません。なのでここではオンライン・アプリケーション接続用サービスのみ作成します。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# オンライン・アプリケーション接続用サービス追加(1行で記述)
srvctl add service -database prdb -service online_srv -pdb prpdb -preferred prdb1,prdb2 -failback NO -tafpolicy BASIC -policy AUTOMATIC -notification TRUE -clbgoal SHORT -failovertype SESSION -rlbgoal SERVICE_TIME -failoverretry 3 -failoverdelay 5
# オンライン・アプリケーション接続用サービスを起動
srvctl start service -db prdb -service online_srv
# オンライン・アプリケーション接続用サービスの状態を確認
srvctl status service -db prdb -service online_srv
# オンライン・アプリケーション接続用サービスの設定を確認
srvctl config service -db prdb -service online_srv
# prdb1/online_srv接続確認(1行で記述、パスワード要求には共通の管理者パスワード*を入力)
sqlplus pdbadmin@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = prsdb01)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = online_srv)))
-- SQL*Plus終了
exit
# prdb2/online_srv接続確認(1行で記述、パスワード要求には共通の管理者パスワード*を入力)
sqlplus pdbadmin@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = prsdb02)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = online_srv)))
-- SQL*Plus終了
exit
*:共通の管理者パスワードはDB構築スクリプト(prdb1.sql)の”define sysPassword”にベタギリしたアレです。
PDB管理者アカウントへの権限付与、追加ユーザ作成
現行DBだとアプリ用のアプリ用のユーザ作成はSYSで全部やってしまいましたが折角、OracleがPDBの管理者を用意してくれているのにこれを使わないのはどうなのよ、ということでPDBADMINに管理者権限を付与してこのアカウントでアプリ用ユーザを追加しようと思います。
まずはPDBADMINに付与されている権限を確認。
【新DBサーバ・prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# SYSアカウントでDB接続
sqlplus / as sysdba
-- セッションをPDBに移動
alter session set container = prpdb;
-- 現在PDBADMINに付与されている権限を確認
set lines 100
col GRANTEE format a10
col OWNER format a10
col TABLE_NAME format a30
col PRIVILEGE format a30
select GRANTEE,'-' OWNER,'-' TABLE_NAME,GRANTED_ROLE PRIVILEGE
from DBA_ROLE_PRIVS where GRANTEE = 'PDBADMIN'
union
select GRANTEE,'-' OWNER,'-' TABLE_NAME,PRIVILEGE
from DBA_SYS_PRIVS where GRANTEE = 'PDBADMIN'
union
select GRANTEE,OWNER,TABLE_NAME,PRIVILEGE
from DBA_TAB_PRIVS where GRANTEE = 'PDBADMIN';
GRANTEE OWNER TABLE_NAME PRIVILEGE
---------- ---------- ------------------------------ ------------------------------
PDBADMIN - - PDB_DBA
SQL>
で、このPDB_DBAの中身はというと
【新DBサーバ・prsdb01 / oracleユーザで実行(sqlplus画面)】
-----------------------------------------------------------------------------
-- PDB_DBAに付与されている権限を確認
select GRANTEE,'-' OWNER,'-' TABLE_NAME,GRANTED_ROLE PRIVILEGE
from DBA_ROLE_PRIVS where GRANTEE = 'PDB_DBA'
union
select GRANTEE,'-' OWNER,'-' TABLE_NAME,PRIVILEGE
from DBA_SYS_PRIVS where GRANTEE = 'PDB_DBA'
union
select GRANTEE,OWNER,TABLE_NAME,PRIVILEGE
from DBA_TAB_PRIVS where GRANTEE = 'PDB_DBA';
GRANTEE OWNER TABLE_NAME PRIVILEGE
---------- ---------- ------------------------------ ------------------------------
PDB_DBA - - CONNECT
PDB_DBA - - WM_ADMIN_ROLE
PDB_DBA - - CREATE PLUGGABLE DATABASE
PDB_DBA - - CREATE SESSION
PDB_DBA SYS PDB_PLUG_IN_VIOLATIONS SELECT
PDB_DBA SYS PDB_ALERTS SELECT
PDB_DBA SYS DBMS_HCS_LOG EXECUTE
PDB_DBA SYS DBMS_VECTOR_ADMIN EXECUTE
8行が選択されました。
SQL>
PDB_DBAにはいくつか権限は付与されていますがこれだけではPDBADMINにPDB内の管理を任せるには足りません。なのでDBAロールを追加付与します。
【新DBサーバ・prsdb01 / oracleユーザで実行(sqlplus画面)】
-----------------------------------------------------------------------------
-- PDBADMINにDBAロールを付与*1
grant DBA to PDBADMIN;
-- PDBADMINに付与されているロールの最新情報を確認
col GRANTED_ROLE format a10
select GRANTEE,GRANTED_ROLE
from DBA_ROLE_PRIVS where GRANTEE = 'PDBADMIN';
GRANTEE GRANTED_RO
---------- ----------
PDBADMIN PDB_DBA
PDBADMIN DBA
SQL>
これでPDBADMINは一通りの管理作業ができるようになりました。PDBADMINでPDBに接続*2しなおして追加ユーザの作成を行います。
【新DBサーバ・prsdb01 / oracleユーザで実行(sqlplus画面)】
-----------------------------------------------------------------------------
-- PDBADMINでPDBに接続(1行で記述)
conn pdbadmin/oracle@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = prsdb02)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = prpdb)))
-- 追加ユーザ(PDBUSER)作成
create user PDBUSER identified by pdbuser
default tablespace USERTBL01 temporary tablespace TEMP
quota unlimited on USERTBL01
quota unlimited on USERIDX01;
-- PDBUSERに権限付与
grant CREATE SESSION, RESOURCE, SELECT_CATALOG_ROLE to PDBUSER;
-- PDBUSERの付与済み権限確認
select GRANTEE,'-' OWNER,'-' TABLE_NAME,GRANTED_ROLE PRIVILEGE
from DBA_ROLE_PRIVS where GRANTEE = 'PDBUSER'
union
select GRANTEE,'-' OWNER,'-' TABLE_NAME,PRIVILEGE
from DBA_SYS_PRIVS where GRANTEE = 'PDBUSER'
union
select GRANTEE,OWNER,TABLE_NAME,PRIVILEGE
from DBA_TAB_PRIVS where GRANTEE = 'PDBUSER';
GRANTEE OWNER TABLE_NAME PRIVILEGE
---------- ---------- ------------------------------ ------------------------------
PDBUSER - - RESOURCE
PDBUSER - - SELECT_CATALOG_ROLE
PDBUSER - - CREATE SESSION
SQL>
-- PDBUSERの接続テスト(1行で記述)
conn pdbuser/pdbuser@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = prsdb02)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = online_srv)))
-- sqlplus終了
exit
*1:DBAをPDBADMINに直接付与するかPDB_DBAロールに付与するかで迷いましたがGeminiさんに相談したら「権限の最小特権の原則と影響範囲の限定」、「監査と可視性の向上」、「Oracle標準の設計思想への合致」の三点を考慮してPDBADMINに直接付与した方がよろしかろうということでこの設定となりました。
*2:ここまで書いてようやく気付きましたが先にOracle Netサービスを作成してからユーザ関連の設定をやるべきでした。Oracle Netサービスが無いと簡易接続の指定を長々と書かなきゃならないんで面倒です。まあ、今更作業の順番を入れ替えるのもそれはそれで面倒なのでやりませんけども。
ちょっと長くなったんで一旦ここまで。次はアーカイブログ設定、バックアップ設定、HugePages設定、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構築)
コメント