サーバ起動後は
まずは、リスナーを起動
$ lsnrctl start
・・・
STATUS of the LISTENER
------------------------
・・・
Listener Parameter File /usr/oracle/database/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/******/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=******)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully
次にCDBを起動
$ sqplus /NOLOG
SQL> startup;
*******
プラガブル・データベースの状態をチェック
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ****** READ WRITE NO
とりあえず接続先をチェック。※多分 CDB$ROOTのハズ
SQL> show CON_NAME;
プラガブル・データベースを起動してみよう
SQL> alter pluggable database ****** open;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ****** READ WRITE NO
CDB作成時に作られたPDBは管理者名が不明で表領域もあるのかどうかも判らなかったので、
dbcaコマンドで別途にPDB(PDB1,PDB2)を追加してみた。
PDBの管理者名はpdbadminとか何となく判るものを作っておく。
表領域の作成にチェックを入れれば作ってくれるので便利。※手順は省略。
ここで、lsnrctl status を何度か叩くと、最後に各PDB名っぽいSERVICE_NAMEの情報が拾えるので
※今回はCDBのサービス名のドメイン名のマシン名の部分がPDB名に差し替えられていた。
そこからサーバのtnsnames.oraにPDB用の設定を手で追加。
※サーバで使わないハズだけど、サーバに元ネタとして置いておかないと新しいクライアントを作る時に悩むハズ。
PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ******)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1.******)
)
)
PDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ******)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb2.******)
)
)
本命のクライアントのtnsnames.oraを追記
PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP) (HOST = ******)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1.******)
)
)
PDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP) (HOST = ******)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb2.******)
)
)
どっちもほぼ同じで、HOSTのみ、各環境で判るドメイン名とかIPアドレスとかにしておかないといけない。※IPアドレスにすれば同一になるはず。
dbcaコマンドでは各PDBの管理者にDBA権限が付与されていないので、
$ sqlplus / as sysdba
SQL> alter session set container=${各PDB名}; ※だったかな?
SQL> GRANT DBA TO ${各PDBの管理者名};
で、それぞれのPDBの管理者にDBA権限を付加した後に
それぞれのPDBの管理者でPDBに入り
$ sqlplus ${管理者名}/${パスワード}@${PDB名}
SQL> CREATE TABLE TBL1 か TBL2
(
empno VARCHAR2(10) NOT NULL,
empname VARCHAR2(50),
gender_f NUMBER(1,0)
)
; 2 3 4 5 6 7
Table created.
な感じで、PDB1にTBL1、PDB2にTBL2を作成し、
A5から、
CDB:(接続文字列:orcl、 ユーザ:system)、
PDB1:(接続文字列:pdb1、ユーザ: pdbadmin)
PDB2:(接続文字列:pdb1、ユーザ: pdbadmin)
でORACLE(OCL経由)接続を作った。
※ORACLE直接接続は
それぞれで、
select * from TBL1;
select * from TBL2;
してみたら、
CDBは共に無し
PDB1はTBL1のみ
PDB2はTBL2のみ
と予想通りの結果になった。
改めて、sqlplusでpdb1に接続してみよう
SQL> alter session set container=PDB1;
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
4 PDB1 READ WRITE NO
※もう自分しかみえなくなっている
※CDBに戻ってPDBをこの状態で、自動起動にする
SQL> alter session set container=CDB$ROOT;
SQL> alter pluggable database all save state;
プラガブル・データベースを終了してみよう
SQL> alter pluggable database ****** close;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ****** MOUNTED
CDBも終了、SQLPLUSも終了する
SQL> shutdown;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> quit
これで、startupすれば、今まで通りに使えるはず。
※多分
と、ここまで書いたものの・・・
ネットをググると、多種多様な結果がヒットするので、
- ひたすらSQLPLUSでコマンドを打ち続ける人
- ツールを使いつつSQLPLUSでコマンドを打ち続ける人
- ツールのみの人
それぞれで、
各々データベースの構成も違うし、
設定ファイルの更新の有無も変わるし、
手順やコマンドも変わるし、
ここの内容は極一部の人にしか参考にならない様な気がしてきた。
うーむ、恐るべしは・・・・・・。