oracle12c解决plsql登录CDB和PDB问题
今天闲来无事,在win10上安装了oracle12c,想着平时可以操作操作,在安装过程中有一个创建为容器数据库的勾选,虽然不明白是什么意思,我还是勾选了。
![oracle12c解决plsql登录CDB和PDB问题 oracle12c解决plsql登录CDB和PDB问题](/default/index/img?u=aHR0cHM6Ly9jYWNoZS55aXN1LmNvbS91cGxvYWQvaW5mb3JtYXRpb24vMjAyMDA3MDMvMTM2LzEyMTAzLnBuZw==)
后来在使用plsql登录的时候,发现没有scott用户,what?难道是12c取消了scott用户吗?网上转了一圈发现,原来12c引入了CDB和PDB的概念,具体内容可以自行去了解一下,这里就再详解了。现在的问题是,我正常连接的数据库是CDB,但是scott用户又是在PDB下的,我也不想去在CDB 下重新新建scott用户和相关表,所以试着去了解了下怎么用plsql直接登录到PDB,网上的方法基本是在sqlplus下切换CDB与PDB,我试了网上的方法:
1.在tns文件里添加
PDBORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdborcl.microdone.cn)
)
)
2.去sqlplus 执行
后来在使用plsql登录的时候,发现没有scott用户,what?难道是12c取消了scott用户吗?网上转了一圈发现,原来12c引入了CDB和PDB的概念,具体内容可以自行去了解一下,这里就再详解了。现在的问题是,我正常连接的数据库是CDB,但是scott用户又是在PDB下的,我也不想去在CDB 下重新新建scott用户和相关表,所以试着去了解了下怎么用plsql直接登录到PDB,网上的方法基本是在sqlplus下切换CDB与PDB,我试了网上的方法:
1.在tns文件里添加
PDBORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdborcl.microdone.cn)
)
)
2.去sqlplus 执行
alter session set container = PDBORCL;
然后sqlplus登录就可以查到scott用户了,但是我们日常使用肯定是plsql用的比较多,plsql登录会报错:
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
3.又按照网上说的方法谢了一个触发器,让pdb自动开启:
CREATE OR REPLACE TRIGGER open_all_pdbs AFTER STARTUP ON DATABASE BEGIN EXECUTE IMMEDIATE 'alter pluggable database all open'; END open_all_pdbs;登录还是报12514,好吧,先来看看这个报错能不能解决。
于是cmd窗口查看监听状态,lsnrctl status
结果是果然没有pdborcl这个监听,怎么办?继续找答案,最后才发现原来我在安装数据库的时候,全局数据库名使用的的是数据库名+域名的形式,比如我的是orcl.microdone.cn, 但是我添加的pdborcl却使用的是pdborcl,于是也改成pdborcl.microdone.cn,最后用plsql登录,perfect,完美登录,查询scott用户,查到了!!
接着我把触发器也删了,登录pdb也是没有问题的,说明直接原因还是tns配置的问题。
总结:我是在 http://www.itpub.net/thread-1847024-1-1.html 这篇文章中得到启发的,个人认为最终的原因还是在建实例的时候,CDB的global db name使用的是db name+domain的形式,而PDB使用的global db name是db name,导致在添加tns配置的时候也是只使用了db name,应该要加上domain。
但是文章中说的要配置listener.ora文件,我没有配置,还是原有的配置,这里到底需不需要配置,不是太明白,往后再研究。
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = C:\app\oracle12c\product\12.1.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle12c\product\12.1.0\dbhome_1\bin\oraclr12.dll") ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )