专栏首页杨建荣的学习笔记一个看似诡异的Oracle连接问题

一个看似诡异的Oracle连接问题

我们知道Oracle在启动的时,fork进程会根据ORACLE_SID来创建相关后台进程,而在Unix和Linux系统中,ORACLE SID和ORACLE_HOME在一起哈希后会得到一个唯一的值作为SGA的key。

所以我抛出一个蛮有意思的问题,在同一台服务器上,存在10g,11g多个ORACLE_HOME,是可以创建多个同名的Oracle实例,而如果在同一个用户下(比如操作系统用户是oracle),是否可能创建出两个同名的实例来?

我想你的脑海中已经有了答案。我换一个角度来说明是否可以。通过一个蛮有意思的DG配置问题。

我在使用RMAN的duplicate搭建备库的时候抛出了下面的一个错误。

RMAN> duplicate target database for standby from active database nofilenamecheck; Starting Duplicate Db at 2017-08-03 10:40:42 RMAN-03002: failure of Duplicate Db command at 08/03/2017 10:40:42 RMAN-05501: aborting duplication of target database RMAN-06403: could not obtain a fully authorized session RMAN-04006: error from auxiliary database: ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux-x86_64 Error: 2: No such file or directory

看错误很明显,备库是被启动,找不到内存结构了。

但是实际上查看数据库进程,是没有问题的。

而我根据服务名尝试连接,下面的结果让我大跌眼镜。

sqlplus sys@s2Queuedb as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Thu Aug 3 10:41:53 2017 Copyright (c) 1982, 2013, Oracle. All rights reserved. Enter password: Connected to an idle instance.

这是哪里的问题呢,是不是实例名有大小写的拆吧呢,在我的印象中似乎没有。那我索性就在这个窗口下尝试启动,没想到还真起来了一个新的实例。

SQL> startup nomount ORACLE instance started. Total System Global Area 9620525056 bytes Fixed Size 2261368 bytes Variable Size 2248150664 bytes Database Buffers 7348420608 bytes Redo Buffers 21692416 bytes

你看这下同一个用户下有两个同名的实例了。

$ ps -ef|grep smon|grep -v grep oracle 43259 1 0 10:39 ? 00:00:00 ora_smon_Queuedb oracle 43337 1 0 10:44 ? 00:00:00 ora_smon_Queuedb

到了这里,不要以为是bug,也不要认为以前的这些基础知识都不奏效了。我们梳理一下思路。

首先ORACLE_SID是统一的,是同一个,而不同之处就是ORACLE_HOME了。而这个数据库环境我只安装了一个版本的数据库环境,所以不存在多个ORACLE_HOME,所以这个问题让我很纠结,我们继续来看看ORACLE_HOME的情况,可以查看环境变量的值。

$ cat /proc/43259/environ |xargs -0 -n1 |grep ORACLE_HOME ORACLE_HOME=/U01/app/oracle/product/11.2.0.4

查看另外一个实例的ORACLE_HOME变量的值。

$ cat /proc/43337/environ |xargs -0 -n1 |grep ORACLE_HOME ORACLE_HOME=/home/U01/app/oracle/product/11.2.0.4

到了这里,似乎有了眉目,原来是ORACLE_HOME不一样。

而问题到了这里还是有些奇怪,因为/home/U01和/U01是指向的同一个目录。他们代表的含义是一样的。

lrwxrwxrwx 1 root root 9 Aug 1 17:53 U01 -> /home/U0

这个问题到了这里该这么解释呢,我们继续理一下思路。我们在RMAN使用duplicate的时候是使用TNS连接方式的,那么TNS连接在连接本地实例的时候指向了另外一个实例(尽管刚开始这个实例不存在),那么本地的连接配置其实还是在listener.ora里面。

打开静态注册的内容,这样一看就很清楚了。

SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = Queuedb) (ORACLE_HOME = /home/U01/app/oracle/product/11.2.0.4) (SID_NAME = Queuedb) ) )

所以了解了这个问题,我们可以换个思路想想有什么场景可以把这个特点发扬光大,在一些特定的场景中起到神助攻的作用。

至少在之前的数据迁移中,我是使用多个版本的ORACLE_HOME来达到同服务器多实例的切换,能够极大的提高数据迁移的效率。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r13笔记第41天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-03

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL root用户登录的几个小问题(r12笔记第67天)

    今天和同事聊了聊技术的事情,聊到BAT里面的一些高大上的系统和设计,相比总是会有些差距,不过像那样体量的公司知识沉淀很深,所以能够做好我们力所能及的事情,把...

    jeanron100
  • 10g,11g中的数据库克隆安装(r6笔记第7天)

    有时候在很多工作环境中,如果彼此几个机器的配置相似,我们就可以不用一遍又一遍的安装数据库软件了,我们可以为了更快的完成安装工作,在静默安装,图形安装的选择之外,...

    jeanron100
  • sqlplus无法启动的问题及解决(2) (25天)

    今天性能测试部门的同事问我一个问题,说他跑一个shell脚本调用sqlplus 结果报错 Error 6 initializing SQL*Plus SP2-...

    jeanron100
  • MyCat启动失败 Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name un

    在使用Nactive连接MyCat的时候发现怎么连接都不ok,明明已经启动了(实际上启动失败了)!

    Arebirth
  • CSS画出一个爱心的案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <titl...

    botkenni
  • 修改Centos服务器主机名称

    Centos服务器安装好之后,默认的主机名为:localhost.localdomain,为了便与管理,我们需要对服务器主机名称进行修改,此修改生效涉及到两个配...

    似水的流年
  • 修改Centos服务器主机名称

    Centos服务器安装好之后,默认的主机名为:localhost.localdomain,为了便与管理,我们需要对服务器主机名称进行修改,此修改生效涉及到两个配...

    似水的流年
  • Redis类型之lists类型

    9、rpoplpush 从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的,如果第一个list是空或者不存在...

    人生不设限为梦想时刻准备着
  • PHP 到底是不是宇宙第一?TIOBE 排行榜来证明!

    做为一名程序员,都比较关注其使用编程语言的热度,一方面编程语言的热度决定了它拥有多大的市场,另一方面也关系到行业内程序员选择机会有多大。

    用户6543014
  • PHP 到底是不是宇宙第一?TIOBE 排行榜来证明!

    做为一名程序员,都比较关注其使用编程语言的热度,一方面编程语言的热度决定了它拥有多大的市场,另一方面也关系到行业内程序员选择机会有多大。

    纯洁的微笑

扫码关注云+社区

领取腾讯云代金券