1 本文簡介:
通過特意引發問題,聚焦問題,解決問題,並循序漸進
最后總結jdbc連接oracle12c中cdb和pdb的條件.
軟件環境:Redhat7.1+orcacle12c
2 准備階段:
2.1 listener.ora和tnsnames.ora配置:
所有動作前,先貼出listener.ora和tnsnames.ora配置:
2.1.1 listener.ora>>
# listener.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) )
2.1.2 tnsnames.ora>>
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. PDBORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = pdborcl) ) ) LISTENER_ORACLE12C = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = oracle12c) ) ) ORACLE12C = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = oracle12c) ) )
(注意添加PDBORCL)
2.1 用戶創建
2.1.1 用戶創建:
SQL> create user scott identified by scott; create user scott identified by scott * ERROR at line 1: ORA-65096: invalid common user or role name SQL> !oerr ora 65096 65096, 00000, "invalid common user or role name" // *Cause: An attempt was made to create a common user or role with a name // that wass not valid for common users or roles. In addition to // the usual rules for user and role names, common user and role // names must start with C## or c## and consist only of ASCII // characters. // *Action: Specify a valid common user or role name. // SQL> create user c##scott identified by scott; User created.
(公共用戶名注意以c##開頭)
2.1.2 用戶授權:
SQL> grant dba to c##scott; Grant succeeded.
3 開始階段:
3.1 啟動監聽:
LSNRCTL> start Starting /u01/app/oracle/product/12.1.0/dbhome_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 12.1.0.2.0 - Production System parameter file is /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production Start Date 04-JUN-2015 09:17:52 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) The listener supports no services The command completed successfully
遠程機子ping服務機
C:\Users\baby>tnsping 192.168.75.131:1521 TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 04-6月 - 2015 12:30:50 Copyright (c) 1997, 2010, Oracle. All rights reserved.
已使用的參數文件: 已使用 HOSTNAME 適配器來解析別名 嘗試連接 (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))(ADDRESS=(PROTOCOL=TCP)(HOST =192.168.75.131)(PORT=1521))) OK (30 毫秒) 成功啟動監聽,並如上遠程tnsping通監聽,但未啟動數據庫服務時, Jdbc連接時就會報如下錯誤 java.sql.SQLRecoverableException: Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
3.2 啟動數據庫服務:
LSNRCTL> exit [oracle@localhost Desktop]$ sqlplussys/sys_oracle as sysdba SQL*Plus: Release 12.1.0.2.0 Production onThu Jun 4 09:51:07 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to an idle instance. SQL> starttup SP2-0042: unknown command"starttup" - rest of line ignored. SQL> startup ORACLE instance started. Total System Global Area 411041792 bytes Fixed Size 2925024 bytes Variable Size 276827680 bytes Database Buffers 125829120 bytes Redo Buffers 5459968 bytes Database mounted. Database opened.
3.3 查看監聽狀態
SQL> exit Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options [oracle@localhost Desktop]$ lsnrctl status LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 04-JUN-2015 10:06:15 Copyright (c) 1991, 2014, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production Start Date 04-JUN-2015 09:17:52 Uptime 0 days 0 hr. 48 min. 22 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/localhost/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=localhost)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/admin/oracle12c/xdb_wallet))(Presentation=HTTP)(Session=RAW)) Services Summary... Service "oracle12c" has 1 instance(s). Instance "oracle12c", status READY, has 1 handler(s) for this service... Service "oracle12cXDB" has 1 instance(s). Instance "oracle12c", status READY, has 1 handler(s) for this service... Service "pdborcl" has 1 instance(s). Instance "oracle12c", status READY, has 1 handler(s) for this service... The command completed successfully
3.4 Jdbc連接cdb數據庫實例oracle12c過程:
Connection conn = null; Statement stmt = null; Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.75.131:1521/oracle12c", "c##scott", "scott"); stmt = conn.createStatement(); System.out.println("連接對象:"+conn);
3.5 Jdbc連接cdb數據庫實例oracle12c結果:
連接對象:oracle.jdbc.driver.T4CConnection@3d3ee5c4
3.6 Jdbc連接pdb數據庫實例oracle12c過程:
Connection conn = null; Statement stmt = null; Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.75.131:1521/pdborcl", " c##scott ", "scott"); stmt = conn.createStatement(); System.out.println("連接對象:"+conn);
3.7 Jdbc連接pdb數據庫實例oracle12c結果:
(失敗,原因:未啟動名為pdborcl的pdb數據庫)
java.sql.SQLRecoverableException:ORA-01033: ORACLE initialization or shutdown in progress
3.8 啟動名為pdborcl的pdb數據庫:
[oracle@localhost Desktop]$ sqlplus sys/sys_oracle@pdborcl as sysdba; SQL*Plus: Release 12.1.0.2.0 Production on Thu Jun 4 10:09:18 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> show con_name; CON_NAME ------------------------------ PDBORCL SQL> startup Pluggable Database opened.
3.9 再次嘗試jdbc連接pdb數據庫
Connection conn = null; Statement stmt = null; Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.75.131:1521/pdborcl", "c##scott", "scott"); stmt = conn.createStatement(); System.out.println("連接對象:"+conn);
3.10 再次嘗試jdbc連接pdb數據庫結果:
連接對象:oracle.jdbc.driver.T4CConnection@76c20307
4 引發問題集中營:
4.1 pdb數據庫未開啟引發問題:
java.sql.SQLRecoverableException:ORA-01033: ORACLE initialization or shutdown in progress
4.2 防火牆阻擋引發問題:
[root@localhost ~]# systemctl status firewalld firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled) Active: active (running) since Thu 2015-06-04 12:32:06 CST; 8s ago Main PID: 6060 (firewalld) CGroup: /system.slice/firewalld.service └─6060 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid Jun 04 12:32:06 localhost.localdomain systemd[1]: Started firewalld - dynamic...
導致結果:
C:\Users\baby>tnsping 192.168.75.131:1521 TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 04-6月 - 2015 12:33:13 Copyright (c) 1997, 2010, Oracle. All rights reserved.
已使用的參數文件: 已使用 HOSTNAME 適配器來解析別名 嘗試連接 (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))(ADDRESS=(PROTOCOL=TCP)(HOST =192.168.75.131)(PORT=1521))) TNS-12535: TNS: 操作超時
(ps:防火牆命令由iptables迭代為firewalld;防火牆開啟,且沒取消阻擋端口,此時tnsping會等待很久,最后提示" TNS-12535:TNS: 操作超時")
至此,已經完成jdbc連接oracle12c的cdb和pdb數據庫!
4.3 jdbc連接字符串引發問題:
l jdbc連接cdb數據庫時,url兼容2種模式:
ü "jdbc:oracle:thin:@192.168.75.131:1521:oracle12c"
ü "jdbc:oracle:thin:@192.168.75.131:1521/oracle12c"
l jdbc連接pdb數據庫時url必須使用:" jdbc:oracle:thin:@192.168.75.131:1521/oracle12c"格式,若使用傳統格式" jdbc:oracle:thin:@192.168.75.131:1521:oracle12c"則會報一下錯誤:
java.sql.SQLException: Listenerrefused the connection with the following error:
ORA-12505, TNS:listener does notcurrently know of SID given in connect descriptor
5 總結概要:
5.1 tnsping能ping通的條件:
l 監聽配置正確;
l ping [ip] 能ping通,客戶端與服務端網絡互通;
l 關閉防火牆(systemctlstop firewalld);
5.2 jdbc連接oracle12的數據庫需要具備的條件:
l 監聽成功啟用,且tnsping通過(OK (30 毫秒);
l tnsnames.ora配置正確(連接pdb數據庫,注意添加pdb服務項,具體如何配置查看[准備階段]);
l 監聽連帶的相應數據庫成功開啟;
l Jdbc連接字符串迭代更新為”jdbc:oracle:thin:@192.168.75.131:1521/pdborcl”而非" jdbc:oracle:thin:@192.168.75.131:1521:pdborcl"
6 知識補充:
6.1 Oracle12c新特性之cdb&pdb:
Oracle 12C引入了CDB與PDB的新特性,在ORACLE12C數據庫引入的多租用戶環境(Multitenant Environment)中,允許一個數據庫容器(CDB)承載多個可插拔數據庫(PDB)。CDB全稱為ContainerDatabase,中文翻譯為數據庫容器,PDB全稱為Pluggable Database,即可插拔數據庫。在ORACLE 12C之前,實例與數據庫是一對一或多對一關系(RAC):即一個實例只能與一個數據庫相關聯,數據庫可以被多個實例所加載。而實例與數據庫不可能是一對多的關系。當進入ORACLE 12C后,實例與數據庫可以是一對多的關系。下面是官方文檔關於CDB與PDB的關系圖。
6.2 dba更多支持:
http://www.cnblogs.com/dingyingsi/p/3604789.html
http://www.cnblogs.com/kerrycode/p/3386917.html