玩转Oracle服务器连接

#sms pre { background-color:black; color:white;}
#sms table {border-collapse:collapse; border:3px solid #cad9ea; color:black; }
#sms td {border:2px solid blue; font-size:14px; }
#sms p,ul {font-family:FangSong_GB2312; font-size:18px;}
#sms p{padding:10px 0 10px 0;}

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用户登录。

[[email protected] ~]$ env | grep ORACLE
ORACLE_SID=orcl12c
ORACLE_HOME=/opt/app/oracle/product/12.1.0/dbhome_1
[[email protected] ~]$ sqlplus / as sysdba;

SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 01:55:33 2014

Copyright (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 options

SQL>

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

[[email protected] ~]$ sqlplus randomusername/randompassword as sysdba;

SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 02:28:03 2014

Copyright (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 options

SQL>

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

[[email protected] ~]# sqlplus sys/wrongpassword  as sysdba;

SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 03:49:36 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied

Enter user-name:

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

[[email protected] ~]$ sqlplus system/systempassword;

SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 02:22:48 2014

Copyright (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 options

SQL>

2.2 实例尚未启动时的连接

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

[[email protected] ~]$ sqlplus / as sysdba;

SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 03:59:24 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to an idle instance.

SQL>

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

[[email protected] ~]# sqlplus sys/syspassword as sysdba;

SQL*Plus: Release 11.2.0.3.0 Production on Fri Dec 5 04:19:04 2014

Copyright (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/[email protected]/orcl12c.xy.com

SQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 13:51:39 2014

Copyright (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
ions

SQL>

3.2 实例尚未启动时

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

C:\>sqlplus sys/[email protected]/orcl12c.xy.com as sysdba;

SQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 13:57:16 2014

Copyright (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看到这个服务了。如下图:

[[email protected] ~]$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 05-DEC-2014 04:47:25

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-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...
[[email protected] ~]$

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

C:\>sqlplus sys/[email protected]/orcl12c as sysdba;

SQL*Plus: Release 12.1.0.2.0 Production on 星期五 12月 5 14:07:53 2014

Copyright (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还可以以其他身份登入系统。

时间: 2024-10-09 13:42:47

玩转Oracle服务器连接的相关文章

连接oracle服务器超慢--原因分析

连接oracle服务器超慢:有如下原因可能会影响. 网络不好:oracle服务器跟本地网络不好. oracle服务器内存不足:导致反应超慢 监听日志listener.log太大:导致响应超慢. 所以对监听日志文件(listener.log)进行定期清理是有必要的.   今天:网友反应他们连接oracle服务器超慢:导致业务出现504错误:而且本地连接oracle服务器也超慢. 我先让他ping下oracle服务器 IP: 以及查看内存是否足够.我看他的截图表明:网络正常:内存不存在不足情况.这大

Windows远程连接Oracle服务器

简介 Oracle的SQLPlus是与oracle数据库进行交互的客户端工具,借助SQLPlus可以查看.修改数据库记录.在SQLPlus中,可以运行SQLPlus命令与sql语句. 主要功能 1.数据库的维护,如启动,关闭等,这一般在服务器上操作2.执行sql语句执行PL/sql3.执行sql脚本4.数据的导出,报表5.应用程序开发.测试sql/plsql6.生成新的sql脚本7.供应用程序调用,如安装程序中进行脚本的安装8.用户管理及权限维护等 实验环境 角色 Column 2 Column

mssql通过链接服务器连接oracle

=============================================== 2020/1/17_第1次修改                       ccb_warlock =============================================== 最近2个月在写mssql的存储过程,业务需求需要向第三方oracle写回数据,所以需要解决如何通过mssql连接oracle并写回数据. 一.安装Oracle数据访问组件ODAC 通过SSMS查看,如果Ora

Oracle 服务器启后,无法连接

Oracle 服务器启后,使用Toad 客户端连接oracle 时候,遇到下面的错误: oracle ORA-12514: TNS: no listener TNS: listener does not currently know of SID give in connect descriptor 第一步:启动TNS监听 [[email protected] ~]$ lsnrctl start LSNRCTL for Linux: Version 11.2.0.1.0 - Production

ORACLE会话连接进程三者总结

概念介绍 通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文(Context).这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器.通过哪个应用程序.哪个用户登录等信息. 连接(Connection):连接是从客户端到ORACLE实例的一条物理路径.连接可以在网络上建立,或者在本机通过IPC机制建立.通常会在客户端进程与一个专用服务器或一个调度器之间建立连接. 会话(Session) 是和连接(Connection)是同时建立的,两者是对同一件事情不同层

Oracle的连接与会话

连接并不是会话的同义词,在一条连接上可以建立0个.一个或多个会话.各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此.一个会话中的提交不会影响该连接上的任何其他会话.实际上,一条连接上的各个会话可以使用不同的用户身份! 在Oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接.这条连接可能连接到一个专用服务器进程,也可能连接到调度程序.如前所述,连接上可以有0个或多个会话,这说明可以有连接而无相应的会话.另外 ,一个会话可以有连接也可以没有连接.使用

Oracle远程连接

Oracle远程连接不是直接使用Ip加端口 这种形式,而是使用TNS(个人感觉和ODBC的DSN有点类似,在某个地方保存一些设置,然后给这些设置起个名字,用的时候直接写这个名字就行了) TNS目录位置: 安装目录\Network\Admin\tnsnames.ora ORCL32 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICA

Oracle JDBC 连接卡死后 Connection Reset

坑 这绝对是我碰计算机以来遇到的第一大坑! 症状: 在Linux主机上远程登录,执行一个简单的Oracle的JDBC连接程序(jar包),结果硬生生的卡在了连接建立验证阶段,然后等上几分钟后因为连接超时,连接被远端的Oracle服务器reset,于是报了connection reset exception 原因: 参考:http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrand

oracle远程连接(PLSQL,SQL developement + Oracle数据库 + 客户端 + 远程连接设置

Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍. 第一种情况: 若oracle服务器装在本机上,那就不多说了,连接只是用户名和密码的问题了.不过要注意环境变量%ORACLE_HOME%/network/admin/是否设置. 第二种情况: 本机未安装oracle服务器,也未安装oracle客户端.但是安装了pl sql development.toad sql development.sql navigat