初裝oracle 12.2 rac數據庫。
登錄RAC數據庫中第1節點
$ sqlplus '/as sysdba' SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ------------------------------ ---------- PDB$SEED READ ONLY DB12PDB1 MOUNTED DB12PDB2 MOUNTED PLUG_TEST MOUNTED 打開PDB(plug_test) SQL> alter pluggable database plug_test open; Pluggable database altered. SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ------------------------------ ---------- PDB$SEED READ ONLY DB12PDB1 MOUNTED DB12PDB2 MOUNTED PLUG_TEST READ WRITE SQL>
嘗試通過scan ip連接pdb(plug_test),有時候能登錄數據庫plug_test;但是有時候會無法登錄,並報以下錯誤:
$ sqlplus robert/robert@plug_test SQL*Plus: Release 12.2.0.1.0 Production on Thu Apr 13 19:04:18 2017 Copyright (c) 1982, 2016, Oracle. All rights reserved. ERROR: ORA-01033: ORACLE initialization or shutdown in progress Process ID: 0 Session ID: 0 Serial number: 0 Enter user-name: ERROR: ORA-01017: invalid username/password; logon denied Enter user-name: ERROR: ORA-01017: invalid username/password; logon denied SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
困惑從這里開始。不明白為何有時能登錄,有時又不能登錄。
登錄第二節點查看pdb狀態:
SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ------------------------------ ---------- PDB$SEED READ ONLY DB12PDB1 MOUNTED DB12PDB2 MOUNTED PLUG_TEST MOUNTED SQL>
從這里可以看出,在第二節點上,實例plug_test處於mounted狀態
查看gv$pdbs:
SQL> select inst_id,name,open_mode from gv$pdbs; INST_ID NAME OPEN_MODE ---------- ------------------------------ ---------- 1 PDB$SEED READ ONLY 1 DB12PDB1 MOUNTED 1 DB12PDB2 MOUNTED 1 PLUG_TEST READ WRITE 2 PDB$SEED READ ONLY 2 DB12PDB1 MOUNTED 2 DB12PDB2 MOUNTED 2 PLUG_TEST MOUNTED 8 rows selected. SQL>
這里可以看出,出現上面的問題是因為只在節點1開啟了pdb(plug_test)實例。而通過scan ip連接該pdb的時候,scan ip會隨機路由,如果路由到第二節點的時候,就會報錯無法連接。
為了驗證這個問題,增加了一個測試環節。直接通過節點1的vip連接,就不會報上面的錯誤。
通過查看alter pluggable database 語法可以看出,使用該命令的時候,還要指定參數instances。如果不加,默認是本地實例。
所以,從第二節點啟動plug_test實例即可。
alter pluggable database plug_test open instances=('DB12C2');
如果想啟動所有實例,可以使用一下命令:
SQL> alter pluggable database plug_test close instances=all;
或者
SQL> alter pluggable database plug_test OPEN instances=('DB12C1','DB12C2');