Oracle数据库连接有多种方式,依照客户端和服务器端是不是同机运行可分成两大类,1是本地连接,2是通过网络连接。
另外,Oracle在连接方面还有1个独特的特点,那就是Oracle实例还没有运行时,依然可以通过客户端连接。其中的缘由在于,服务器端负责侦听的其实不是Oracle实例本身,而是另外一个独立的侦听器程序tnslsnr。
本地连接不需要侦听器工作。本地连接可以连接到已运行的实例,也能够连接到空实例(实例还没有运行)。本地连接时,sqlplus首先根据$ORACLE_HOME找到oracle可履行文件,然后启动1个专用服务器进程,并运行这个程序。然后根据$ORACLE_HOME和$ORACLE_SID这两个环境变量来肯定要连接的实例,所以连接之前必须要设定号它们.
目前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 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,致使不需要验证密码,所以可以正常登录。以下所示:
[oracle@centos192 ~]$ 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账户密码了,否则登录不上。
[root@centos192 ~]# 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用户连接。
[oracle@centos192 ~]$ 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>
这类情况实际上是比较特殊的,不管是tnslsnr侦听器还是instance都没有启动,也就是说目前oracle相干的软件完全没有运行。这样建立服务器连接的任务就完全落在了sqlplus身上。其实实例是不是运行与sqlplus本地连接关系不大,sqlplus照样还是首先启动1个专用服务器进程,只是这个进程没法与实例通讯(实例还没有运行)。
[oracle@centos192 ~]$ 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这1个用户,所以只有SYS才能登陆。
[root@centos192 ~]# 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>
远程连接与本地连接的最大区分就是,必须启动tnslsnr这个侦听器程序,而且此时的专用服务器进程也是有这个侦听器负责产生了。再1个区分就是如何找到指定实例,本地连接肯定实例的根据是$ORACLE_SID,而远程连接时则是靠侦听器公布的服务名(tnslsnr内部负责服务名与实例SID的对应)。另外,由因而远程连接,所以不存在操作系统安装用户免验证了,所有登录必须验证用户名和密码。
下面给出几个例子。
C:>sqlplus system/systempassword@172.16.2.192/orcl12c.xy.com SQL*Plus: Release 12.1.0.2.0 Production on 星期5 12月 5 13:51:39 2014 Copyright (c) 1982, 2014, Oracle. All rights reserved. 上次成功登录时间: 星期5 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>
实例还没有启动时,密码验证还是要通过密码文件,这个与本地连接相同。
C:>sqlplus sys/syspassword@172.16.2.192/orcl12c.xy.com as sysdba; SQL*Plus: Release 12.1.0.2.0 Production on 星期5 12月 5 13:57:16 2014 Copyright (c) 1982, 2014, Oracle. All rights reserved. ERROR: ORA⑴2514: 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) ) )
如此1来,侦听器已启动就会自动想外公布这个名为orcl12c的服务,并对应到orcl12c这个SID的实例上。通过lsnrctl stop; lsnrctl start;重新启动tnslsnr以后,就会通过lsnrctl status看到这个服务了。以下图:
[oracle@centos192 ~]$ lsnrctl status LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 05-DEC⑵014 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⑵014 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的实例并没有启动,但是侦听器已把它提供的服务对外发布了。此时就能够通过远程连接它了,虽然还是1个空实例。
C:>sqlplus sys/syspassword@172.16.2.192/orcl12c as sysdba; SQL*Plus: Release 12.1.0.2.0 Production on 星期5 12月 5 14:07:53 2014 Copyright (c) 1982, 2014, Oracle. All rights reserved. 已连接到空闲例程。 SQL>
为清楚起见,总结本地连接和远程连接的特点为以下表格。
连接方式 | 谁负责产生专用服务器进程 | 如何肯定要连接的实例 | 如何验证登录用户 |
---|---|---|---|
本地连接 | sqlplus | $ORACLE_HOME和$ORACLE_SID环境变量 | 1 运行sqlplus的操作系统账户是不是是安装oracle软件具有者 2 密码文件 3 数据库本身 |
远程连接 | tnslsnr侦听进程 | 客户端提供的服务名 | 1 密码文件 2 数据库本身 |
另外一个需要注意的就是 SYS 这个特殊账户和 as sysdba这个特殊身份。只要是 as sysdba身份,必须是SYS这个账户名,反过来这不成立,由于SYS还可以以其他身份登入系统。
登录验证流程图: