当12C PDB遇上JDBC (r10笔记第59天)

最近整合了几个测试环境,都放入了12c的容器数据库中。今天本来计划再整合几个测试库进来,结果因为碰到了JDBC的问题给耽搁了。 迁移数据库的步骤,因为数据量不大,数据结构较为复杂,所以直接采用了DataPump来做,而且因为测试环境,所以很多问题有充足的时间去排除和分析。 首先我创建了一个PDB CREATE PLUGGABLE DATABASE tbillmob ADMIN USER pdb_mgr IDENTIFIED BY oracle file_name_convert=('/home/U01/app/oracle/oradata/testdb/pdbseed','/home/U01/app/oracle/oradata/testdb/pdb/tbillmob'); 然后切换到这个容器 SQL> alter session set container=tbillmob; SQL> grant dba to pdb_mgr; 查看数据文件的情况 SQL> select file_name from dba_data_files; FILE_NAME -------------------------------------------------------------------------------- /home/U01/app/oracle/oradata/testdb/pdb/tbillmob/system01.dbf /home/U01/app/oracle/oradata/testdb/pdb/tbillmob/sysaux01.dbf 创建数据文件USERS,就不要那么多细小的表空间文件了。 SQL> create tablespace users datafile '/home/U01/app/oracle/oradata/testdb/pdb/tbillmob/users01.dbf' size 4G; 创建目录: SQL> create directory dp_dir as '/home/oracle/dp_dir'; 然后在源库中导出一个parfile SQL> select 'remap_tablespace='||tablespace_name||':'||'USERS'from dba_tablespaces; 在目标端的PDB中导入即可。 impdp pdb_mgr/oracle@tbillmob directory=dp_dir dumpfile=tbillmob.dmp full=y logfile=impdp.log EXCLUDE=SCHEMA:\"IN \(\'OUTLN\', \'ANONYMOUS\',\'OLAPSYS\',\'SYSMAN\',\'MDDATA\',\'MGMT_VIEW\',\'APEX_030200\',\'SYSTEM\',\'SCOTT\'\)\" parfile=remap_ts.par 整个步骤都是轻车熟路,但是过了一会开发的同学给我反馈,说应用连接报错了。 org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux-x86_64 Error: 2: No such file or directory

一看这个错误我就想,开发的同学应该是把迁移后的IP改过来。这个很明显看出来数据库是没启动。我把源端的数据库已经停了,自然是连不进去了。 但是开发的同学反馈说,IP已经修改了。那么这个问题就和DB层面的配置有关了。 比如我配置了一个1525的端口。listener.ora的文件内容如下: LISTENER_12c_1525= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=teststd.oracle.com)(PORT=1525) ) ) ) SID_LIST_LISTENER_12c_1525= (SID_LIST= (SID_DESC= (GLOBAL_DBNAME=testdb) (ORACLE_HOME=/home/U01/app/oracle/product/12c/db_1) (SID_NAME=testdb) ) (SID_DESC= (GLOBAL_DBNAME=tbillmob) (ORACLE_HOME=/home/U01/app/oracle/product/12c/db_1) (SID_NAME=tbillmob) ) ) 如上的配置加粗的部分是错误的,SID_NAME应该testdb,GLOBAL_DBNAME是PDB的名称。 tnsnames.ora的配置如下: tbillmob = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = teststd.oracle.com)(PORT = 1525)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = tbillmob) ) ) 如此一来,发现原来是我这边的配置问题,修改之后以为就万事大吉了,但是查看v$session没有对应的会话,开发同学说这次错误变了。

SQLNestedException: Cannot create PoolableConnectionFactory (Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 如此一来,我就感到有些奇怪了,服务端的配置是没有任何问题了,是不是开发的同学哪里没有配置好。 和他们确认,他们说只修改了配置文件中IP的部分,其它的都没有改动。 那么这个问题怎么进一步分析确认呢,我和开发的同学聊了下,因为是测试环境,就建议她先切换IP到源数据库,看看是否正常,如果不正常,说明他们的配置文件有问题。 结果很快就得到了开发的确认和反馈,修改IP到原来的服务器IP就没有任何错误了。 这个问题就开始有些困扰我了,我从开发那里得到的连接信息如下: jdbc:oracle:thin:@10.127.xx.xx:tbillmob --连接串信息 app_accmobxxx --用户名信息 app_R#m^accmob02@abcdef --密码信息

从提供的信息来看没有发现问题。那我来你自己测试一下。 使用TNS的方式来连接没有问题 SQL> conn app_accmobxxx/"app_R#m^accmob02@abcdef"@tbillmob Connected 使用直连的方式,也没有问题 SQL> conn app_accmobxxx/"app_R#m^accmob02@abcdef"@10.127.xxx:1525/tbillmob Connected. 所以从上面的测试可以看出这个网络配置应该是没有问题的。 但是这样一来问题就陷入了僵局,DBA没有发现问题,开发的配置文件也经过确认没有问题,那么问题到底出在哪里了呢。 我回过头来开始查看监听日志,可以明显看到TNS-12505的错误,和开发反馈的是一致的。 21-OCT-2016 13:55:46 * (CONNECT_DATA=(SID=tbillmob)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=mrdTomcat))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.127.1.xxx)(PORT=52574)) * establish * tbillmob * 12505 TNS-12505: TNS:listener does not currently know of SID given in connect descriptor 21-OCT-2016 13:55:49 * (CONNECT_DATA=(SID=tbillmob)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=mrdTomcat))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.127.1.xxx)(PORT=52606)) * establish * tbillmob * 12505 TNS-12505: TNS:listener does not currently know of SID given in connect descriptor 由此可见可能我们的测试还是有一些欠缺之处,但是问题到底在哪里还是无法定位。 我已经打算下一个Java程序来进行验证了。但是程序写完之后,先查看了一下是否有相关的文章,还真找到一篇。原来是url兼容性导致。 jdbc连接cdb数据库时,url兼容2种模式: "jdbc:oracle:thin:@192.168.xx:1521:oracle12c" "jdbc:oracle:thin:@192.168.xx:1521/oracle12c"

重点在后面,一个是 :oracle12c 一个是/oracle12c 带着一丝的惊喜和开发的同学进行沟通,他们带着疑惑的态度进行了修改和测试,从我的监控来看,连接正常了。他们很快反馈问题的原因还确实是这个,但是疑问就出来了,之前一直是使用jdbc:oracle:thin:@192.168.75.131:1521:oracle12c的形式,也一直没有问题,为什么这种就出问题呢。和开发的同学大体聊了下,这是一个12c的数据库,使用了容器的方式,连接方式上会有一些差别,当然这种方式应该对低版本也是可行的,建议开发的同学也这样测试一番,他们也蛮配合,确实测试了一把,发现这种方式"jdbc:oracle:thin:@192.168.75.131:1521/oracle12c"也是可行的。对于低版本也是兼容的。 所以明白这一点之后,对于PDB的数据迁移也更加有底。问题的解决也不是一方拍板,还是需要多方配合,缺少任何一环,都会使得问题的解决周期加长。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2016-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

预警揭秘:倒计时炸弹11.2.0.4前版本DB Link必须在2019年4月升级真相

在 Oracle 官方支持站点 MOS 上,最近发布了两篇告警文章,引发了用户的广泛关注,这两篇文章分别是: Oracle Databases Need to ...

42880
来自专栏杨建荣的学习笔记

通过shell绑定系统进程调优 (r4笔记第34天)

数据库的性能调优,需要基于操作系统的性能指标,如果操作系统级发生了一些状况,那么会潜移默化的影响到数据库层面。而数据库中对应的进程和操作系统级也有一定的映射关系...

32350
来自专栏沃趣科技

Oracle 12c系列(八)|RMAN (FROM SERVICE)

相信大家在Dataguard环境中遇到过主库丢失归档日志,而备库也没有及时接收,导致备库出现了GAP的现象。因为日志的中断,备库无法再去应用之后的日志,就无法起...

16240
来自专栏杨建荣的学习笔记

海量数据迁移之sqlldr和datapump的缺点分析(r4笔记第74天)

在数据迁移中,sql*loader和datapump总是作为一些常用的数据迁移方案,自己在经历了一些项目之后,优点就不说了,说点这些方案的缺点,批评不自由,则赞...

42260
来自专栏杨建荣的学习笔记

ADG备库批量查询失败的原因分析(r8笔记第33天)

目前线上有一套环境是10gR2的,采用了一主两备的架构。在其中一个备库上每天凌晨会开放一个窗口运行一些批量的查询,目前使用dg broker会在指定的时间把备库...

37580
来自专栏更流畅、简洁的软件开发方式

细分主键

  主键本身是很简单的,但是围绕他产生的故事就不是那么简单了。 1、 管理 这个是最重要的,没有规矩不成方圆,主键要如何管理一定要实现确定好了,甚至有必要为此写...

20960
来自专栏微信公众号:Java团长

Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解)

本教程详细介绍了如何使用ssm框架实现支付宝支付功能。本文章分为两大部分,分别是「支付宝测试环境代码测试」和「将支付宝支付整合到ssm框架」,详细的代码和图文解...

27910
来自专栏好好学java的技术栈

java实现沙箱测试环境支付宝支付和整合微信支付和支付宝支付到ssm(附源码)

下载地址:https://docs.open.alipay.com/270/106291/

59070
来自专栏杨建荣的学习笔记

动态创建MySQL Group Replication的节点(r11笔记第84天)

前几天分享了下搭建MySQL Group Replication的脚本, 分分钟搭建MySQL Group Replication测试环境(r11笔记第82天)...

32860
来自专栏数据和云

深入剖析:update pk会发生什么?

张大朋(Lunar)Oracle 资深技术专家 Lunar 拥有超过十年的 ORACLE SUPPORT 从业经验,曾经服务于ORACLE ACS部门,现就职于...

30680

扫码关注云+社区

领取腾讯云代金券