1 Oracle服务器的两类连接方式

Oracle数据库连接有多种方式,按照客户端和服务器端是否同机运行可分成两大类,一是本地连接,二是通过网络连接。

  • 本地连接。顾名思义,就是客户端程序和服务器程序运行在同一台机器上。安装Oracle时,客户端程序sqlplus自动伴随安装在了服务器机器上,所以这种方式总是可用。

  • 远程连接。客户端程序和服务器端程序运行于不同的机器上。

另外,Oracle在连接方面还有一个独特的特点,那就是Oracle实例尚未运行时,仍然可以通过客户端连接。其中的原因在于,服务器端负责侦听的并不是Oracle实例本身,而是另一个独立的侦听器程序tnslsnr。

2 本地连接

本地连接不需要侦听器工作。本地连接可以连接到已经运行的实例,也可以连接到空实例(实例尚未运行)。本地连接时,sqlplus首先根据$ORACLE_HOME找到oracle可执行文件,然后启动一个专用服务器进程,并运行这个程序。然后依据$ORACLE_HOME和$ORACLE_SID这两个环境变量来确定要连接的实例,所以连接之前必须要设定号它们.

2.1 连接到已经运行的实例

目前一个SID为orcl12c的实例正在运行,此时sqlplus以ORACLE安装用户oracle运行,此用户属于OSDBA组,所以oracle不需要验证用户名密码。而 "as sysdba" 则会强制以SYS用户登录。

[oracle@centos192 ~]$ env | grep ORACLE
ORACLE_SID=orcl12c
ORACLE_HOME=/opt/app/oracle/product/12.1.0/dbhome_1
[oracle@centos192 ~]$ sqlplus / as sysdba;SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 01:55:33 2014Copyright (c) 1982, 2011, 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 optionsSQL>

以sysdba身份连接时,ORACLE根本不理会命令行上提供的用户名和密码,而是直接以SYS账户登录。而此时又是oracle这个操作系统账户执行sqlplus,导致不需要验证密码,所以可以正常登录。如下所示:

[oracle@centos192 ~]$ sqlplus randomusername/randompassword as sysdba;SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 02:28:03 2014Copyright (c) 1982, 2011, 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 optionsSQL>

如果使用了 as sysdba,而又不是oracle这个操作系统账户运行sqlplus,那么就必须提供正确的SYS账户密码了,否则登录不上。

[root@centos192 ~]# sqlplus sys/wrongpassword  as sysdba;SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 03:49:36 2014Copyright (c) 1982, 2011, Oracle.  All rights reserved.ERROR:
ORA-01017: invalid username/password; logon deniedEnter user-name:

如下是不使用as sysdba的连接。使用system用户连接。

[oracle@centos192 ~]$ sqlplus system/systempassword;SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 02:22:48 2014Copyright (c) 1982, 2011, 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 optionsSQL>

2.2 实例尚未启动时的连接

这种情况其实是比较特殊的,无论是tnslsnr侦听器还是instance都没有启动,也就是说目前oracle相关的软件完全没有运行。这样建立服务器连接的任务就完全落在了sqlplus身上。其实实例是否运行与sqlplus本地连接关系不大,sqlplus照样还是首先启动一个专用服务器进程,只是这个进程无法与实例通信(实例还没有运行)。

[oracle@centos192 ~]$ sqlplus / as sysdba;SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 03:59:24 2014Copyright (c) 1982, 2011, Oracle.  All rights reserved.Connected to an idle instance.SQL>

如果此时不是以oracle用户运行,那么就必须提供正确的用户名和密码了,问题是数据库实例尚未启动,当然无法自身验证此用户密码。解决办法就是服务器进程会根据密码文件来验证用户。默认安装后的密码文件位于$ORACLE_HOME/dbs/目录中,里只有SYS这一个用户,所以只有SYS才能登陆。

[root@centos192 ~]# sqlplus sys/syspassword as sysdba;SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 04:19:04 2014Copyright (c) 1982, 2011, Oracle.  All rights reserved.Connected to an idle instance.SQL>

3 远程连接

远程连接与本地连接的最大区别就是,必须启动tnslsnr这个侦听器程序,而且此时的专用服务器进程也是有这个侦听器负责产生了。再一个区别就是如何找到指定实例,本地连接确定实例的依据是$ORACLE_SID,而远程连接时则是靠侦听器公布的服务名(tnslsnr内部负责服务名与实例SID的对应)。另外,由于是远程连接,所以不存在操作系统安装用户免验证了,所有登录必须验证用户名和密码。

下面给出几个例子。

3.1 实例已经启动时

为了明显起见,这次从一台Windows机器上运行sqlplus.

C:\>sqlplus system/systempassword@172.16.2.192/orcl12c.xy.comSQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 13:51:39 2014Copyright (c) 1982, 2014, Oracle.  All rights reserved.上次成功登录时间: 星期五 12月 05 2014 03:37:41 +08:00连接到:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
ionsSQL>

3.2 实例尚未启动时

实例尚未启动时,密码验证还是要通过密码文件,这个与本地连接相同。

C:\>sqlplus sys/syspassword@172.16.2.192/orcl12c.xy.com as sysdba;SQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 13:57:16 2014Copyright (c) 1982, 2014, Oracle.  All rights reserved.ERROR:
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务请输入用户名:

这次登录失败了,原因就是tnslsnr侦听器并没有公开orcl12c.xy.com这个服务。这是因为这个服务是实例启动后自动向侦听器动态注册的,现在实例还没有启动,当然也就没有注册这个服务。解决办法就是提前静态注册,具体做法是修改$ORACLE_HOME/network/admin/listener.ora这个文件,添加静态服务项,如下:

# listener.ora Network Configuration File: /opt/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))(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))))SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(ORACLE_HOME = /opt/app/oracle/product/12.1.0/dbhome_1)(SID_NAME = orcl12c)))

如此一来,侦听器已启动就会自动想外公布这个名为orcl12c的服务,并对应到orcl12c这个SID的实例上。通过lsnrctl stop; lsnrctl start;重新启动tnslsnr之后,就会通过lsnrctl status看到这个服务了。如下图:

[oracle@centos192 ~]$ lsnrctl statusLSNRCTL for Linux: Version 12.1.0.2.0 - Production on 05-DEC-2014 04:47:25Copyright (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-DEC-2014 14:23:19
Uptime                    0 days 14 hr. 24 min. 6 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/app/oracle/diag/tnslsnr/centos192/listener/alert/log.xml
Listening Endpoints Summary...(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "orcl12c" has 1 instance(s).Instance "orcl12c", status UNKNOWN, has 1 handler(s) for this service...
[oracle@centos192 ~]$

尽管SID为orcl12c的实例并没有启动,但是侦听器已经把它提供的服务对外发布了。此时就可以通过远程连接它了,尽管还是一个空实例。

C:\>sqlplus sys/syspassword@172.16.2.192/orcl12c as sysdba;SQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 14:07:53 2014Copyright (c) 1982, 2014, Oracle.  All rights reserved.已连接到空闲例程。SQL>

4 总结

为清楚起见,总结本地连接和远程连接的特点为如下表格。

连接方式 谁负责产生专用服务器进程 如何确定要连接的实例 如何验证登录用户
本地连接 sqlplus $ORACLE_HOME和$ORACLE_SID环境变量 1 运行sqlplus的操作系统账户是否是安装oracle软件拥有者 2 密码文件 3 数据库自身
远程连接 tnslsnr侦听进程 客户端提供的服务名 1 密码文件 2 数据库自身

另一个需要注意的就是 SYS 这个特殊账户和 as sysdba这个特殊身份。只要是 as sysdba身份,必须是SYS这个账户名,反过来这不成立,因为SYS还可以以其他身份登入系统。

登录验证流程图:

2014年12月6日更正:

按照Oracle文档说明,使用具有管理权限的身份登录时(as sysdba, as sysoper, as syskm, as sysbackup, as sysdg),根本不会去数据库字典验证,只能通过密码文件、操作系统等外部验证手段。下面是官网给出的认证流程图。

这些特殊管理权限身份特殊,使用它们连接时,会话用户和当前schema都是特定的。

然而通过实际实验,我发现如果实例已经启动,那么远程连接的话,认证首先是数据库字典而不是密码文件。我做的简单实验就是sqlplus sysbackup/systembackuppassword@172.16.2.192/orcl12c as sysbackup; 如果实例是启动的,那么这个连接将会失败,因为sysbackup账户是被锁定的,而如果实例尚未启动,这个连接将会成功。所以官方的文档也许有不正确的地方,还希望大家继续探讨。

转载于:https://blog.51cto.com/10704296/1694528

Oracle服务器连接相关推荐

  1. 玩转Oracle服务器连接

    1 Oracle服务器的两类连接方式 Oracle数据库连接有多种方式,按照客户端和服务器端是否同机运行可分成两大类,一是本地连接,二是通过网络连接. 本地连接.顾名思义,就是客户端程序和服务器程序运 ...

  2. oracle杀连接服务器,玩转Oracle服务器连接

    1 Oracle服务器的两类连接方式Oracle数据库连接有多种方式,按照客户端和服务器端是否同机运行可分成两大类,一是本地连接,二是通过网络连接.本地连接.顾名思义,就是客户端程序和服务器程序运行在 ...

  3. pl/sql远程连接oracle服务器问题(各种情况) .,plsql远程连接oracle服务器问题(各种情况).docx...

    plsql远程连接oracle服务器问题(各种情况).docx PLSQL远程连接oracle服务器问题(各种情况)1.病毒软件的防火墙可以关闭试试在连接.2.环境变量path里面没有加上%ORACL ...

  4. ftp无法与服务器建立连接_建立与Oracle数据库服务器连接的两种连接模式

    建立与Oracle数据库服务器连接的两种连接模式(专用服务器与共享服务器) 在建立Oracle数据库的时候,应该会在数据库建立助手向导上面看到这么一个选项,就是数据库的连接模式采用什么方式.在Orac ...

  5. sql 链接到oracle数据库,通过MSSQL连接服务器连接至Oracle数据库

    前言 有很多时候,我们需要MSSQL与Oracle进行跨库查询或数据交互.本篇随笔将阐述如何通过MSSQL的连接服务器连接至Oracle数据库,并且读取数据的示例. 具体步骤 首先需要到Oracle的 ...

  6. Linux oci连接oracle服务器

    因公司需要,开发MES将其迁移到Linux平台,使用oracle数据库,现在oracle服务器已经配置好,如果没有配置成功的请参考另一篇博客Linux下安装oracle,即可安装! 转载请附上链接,禁 ...

  7. oracle 11g 连接远程服务器 数据库

    有需要连接远程服务器上的oracle服务,针对遇到的问题进行记录,以下是关于客户端配置,服务器端配置进行了记录. 前提必须做的是 如果要连接远程服务器,服务器上的监听文件listener.ora文件中 ...

  8. oracle 没有数据库服务器,本地没有oracle数据库 连接远程服务器上的oracle数据库...

    由于项目开发测试,需要在本地连接远程的Oracle数据库 连接远程Oracle需要两个软件: 一个Oracle客户端,instantclient-basic-win32-11.2.0.1.0.zip ...

  9. Oracle JDBC连接服务名、SID和tnsnames.ora配置的多种方式

    昨天,领导安排去新服务器上部署项目,给了我数据库地址,服务名称,端口,用户名和密码.结果数据库一直连接不上,日志中的错误提示是监听未找到SID,我才明白原来我jdbc.properties中需要的是S ...

最新文章

  1. 非root用户挂载NFS
  2. Python中操作MySQL/Oracle
  3. 全备份失败后,如何手工清除exchange日志文件,附微软KB
  4. Java面向对象编程(中级)
  5. 判断一个数的二进制形式是否只有一个1,是的话就输出
  6. xenserver 安装新硬盘_给Xenserver添加新硬盘
  7. Confluence 6 针对大数据量备份
  8. 易用宝项目记录day1-springdatajpa
  9. docker-comose入门到实战
  10. 张量处理单元(TPU)
  11. csapp attack lab
  12. 家用NAS安装大礼包:PVE+OMV+常用soft详细安装教程
  13. 火狐开发----Web开发者工具
  14. 家庭计算机如何共享打印机共享,win7系统怎么设置家庭组共享打印机
  15. 微信小程序上传图片(前端+PHP后端)
  16. 如果电脑蓝屏0xc000021a怎么办
  17. ROS学习笔记publisher的编程实现c++详解
  18. 怎么把电脑上大于4G的文件移动到U盘?
  19. 58同城、安居客发布《2022春节返城租房调查报告》:超三成租客月薪过万
  20. 微信支付V3平台证书本地生成的坑

热门文章

  1. UVA 12298——Super Poker II
  2. linux兴趣小组2017面试题浅析
  3. 6174问题 --ACM解决方法
  4. yii html 添加下拉框,php – Yii2下拉列表:在我的选项中添加像data-food =“…”这样的html标记...
  5. 搜matlab代码的网站,LTE小区搜索matlab仿真
  6. Linux系统编程--1(进程和程序,CPU和MMU,PCB,进程状态)
  7. C++总结8——shared_ptr和weak_ptr智能指针
  8. sys/queue.h
  9. Eclipse可以执行jsp文件却无法访问Tomcat主页
  10. [AlwaysOn Availability Groups] 健康模型 Part 2 ——扩展