Oracle 11g不同情形下的登录分析

对于Oracle刚開始学习的人。甚至有些经验的Oracle DBA来说,Oracle的账户登录问题往往非常棘手。即便成功登录oracle也是知其然而不知其所以然。

作者经过系统学习和重复实践,本着打破砂锅问究竟的态度。总算对Oracle的登录原理与操作细节有了较全面的认识。

本文记录下这些体会与经验,希望能帮助Oracle刚開始学习的人自信地顺利登录oracle。

1 学习本文的先决条件

Oracle相关的知识非常多,但一些主要的术语是全部dba都应该熟悉的。为更好的理解本文内容,读者须要理解例如以下术语: Instance和Database。IP/TCP,sqlplus,Oracle 账号与操作系统账号, Oracle DBA。

2 Oracle登录概述

2.1 Oracle的C/S架构与通信协议

Oracle软件的总体架构是基于C/S的,依照功能分为client和server端。

client负责接受用户的输入和接收并显示来自server端的结果。常见client有Sql Developer, SqlPlus;server端则负责解析来自client的SQL请求,并把结果返回给client。



不论什么C/S架构的软件。通信部分都是至关重要的,重中之重就是通信协议的设计了。Oracle也不例外。採用的通信协议被称为oracle net。它是一个应用层协议,眼下oracle net能够执行在非常多底层协议上,如TCP, 安全TCP,命名管道,SDP等。另外,针对不同的底层操作系统平台,oracle net也支持操作系统的本地进程间通信协议。


不管底层是什么平台,不管client软件是什么、执行在哪里,client和server通信仅仅能採用唯一的Oracle net协议。别无它方。

2.2 oracle账户与验证方式

通过账户进行权限控制是非常多软件採取的方法,比如每一个OS都有自己的账户。Oracle也不例外,要想进入Oracle进行操作,必须以某种身份进入,这就是Oracle的账户。Oracle账户依照权限大致分为特权账户和普通账户。特权账户拥有极大的权限。而而普通用户的权限受到非常大限制。典型的特权账户就是SYS,SYSTEM。


那么oracle是怎样对账户进行验证的呢?答案是有非常多种方式,最easy理解的就是本地password验证了,另外还有使用OS账户验证、利用LDAP验证、以及Kerberos等外部验证。

本文仅仅涉及最主要的password验证方式。

3 Oracle侦听与password存放

作为C/S架构程序。账号登录过程分成前后两个部分,一是网络连接,二是账号验证。

3.1 两种server端侦听程序

前面说过Oracle net支持多种底层通信协议,当中包括操作系统本地的进程间通信协议。 不管底层是何种协议,server端程序必须进行某种形式的侦听。以等待来自客户的连接请求。


(1)网络侦听程序tnslsnr

当底层协议是网络协议时,Oracle tnslsnr提供侦听服务。这是一个单独的进程,与其它进程独立。

以下是Oracle专用server工作方式下的侦听器工作示意图。


如上图所看到的,client进程首先与侦听器连接(红色连线)。并验证账户与权限。假设全部验证通过,侦听进程负责产生出一个新的server进程,并让client进程和新产生的server进程直接连接(蓝色连线),称之为一个会话,同一时候自身断开与client的连接,并与新建立的会话不再有不论什么关系。

可见侦听进程起到了一个牵线的作用。

之后,即使侦听器停止了工作,已经建立的会话也丝毫不受影响。

(2)本地侦听程序

本地侦听程序与网络侦听器全然不同,它不须要网络协议栈,详细实现严重依赖于底层OS。

在Oracle中。本地侦听与tnslsnr全然独立。在Linux平台的本地侦听不须要执行不论什么程序。也就是说本地登录不依赖于tnslsnr。这对于dba是非常有用的。当侦听器发生问题不能正常工作时,我们仍然能够通过本地连接来登入oracle进行操作。

3.2 两种password存放方式

本文仅仅关心本地password方式的验证。

(1)password存放在数据字典中

此时要想验证password,数据库必须处于打开状态,大多数普通用户的password都是依照这样的方式存放的。password存放于数据字典中会带来一个问题,那就是数据库打开之前,数据字典不可用。从而账户password也无法得知,导致用户无法登录。这对于DBA来说是个致命的问题。试想某一天数据库出现故障无法载入,此时DBA必须登入系统进行修复,假设DBA账户的password存放在数据字典中,要想登录必须先打开数据库,这岂不是陷入死循环了。所以oracle规定凡是具有DBA特殊权限的账户的password信息会自己主动复制一份存放到外部文件里。

(2)password存放在外部文件里

这个password文件通常的存放位置是@ORACLE_HOME/dbs/orapw$SID。须要注意的是。仅仅有具有DBA权限的账户password才会存放到外部文件里。并且是在授予特殊权限时系统自己主动加入的,不能手工改动外部password文件。

4 Oracle登录的几种情形分析

针对不同的侦听方式和不同的password存放方式。能够排列出例如以下几种登录情形。client进程是依照连接字符串来推断详细採用那种情形的。

4.1 本地侦听+无需password

使用前提:

(1)client与server端执行在同一机器上;

(2)使用安装oracle的OS账户登入OS。

(3)设置了$ORACLE_SID环境变量。


连接字符串:

此时,的连接字符串必须为 connect / as sysdba。


使用场景:

值得说明的是,这样的情况下,登录成功的唯一前提就是须要指定$ORACLE_SID环境变量。不须要侦听器,也不须要数据库载入。甚至不须要实例启动。如上图所看到的。实例没有启动。此时,会默认使用oracle的sys账户登录。

这样的情形的使用情况是,DBA启动数据库。

4.2 本地侦听+外部文件password

使用前提:

(1)client与server端执行在同一机器上;

(2)使用不论什么账户登录OS;

(3)设置了$ORACLE_SID环境变量。


连接字符串:

此时,的连接字符串必须为 connect 特权账户名/password as sysdba。


使用场景:

与4.1相似,仅仅是此时的OS账户仅仅要有权限执行sqlplus就可以,无需是Oracle的安装用户。


4.3 本地侦听+数据字典password

适用前提:
(1)client与server端执行在同一机器上;
(2)数据库已经载入打开。

(3)设置了$ORACLE_SID环境变量。



连接字符串:
connect username/password。


使用场景:
此时适用于本地登录的普通用户。注意,由于password存放在数据字典里,所以数据库必须处于打开状态。

4.4 网络侦听+外部文件password

适用前提:
(1)tnslsnr必须已经正常工作;
(2)数据实例启动;无需载入数据库。


连接字符串:
connect 特权用户名/password@serverIP/servicename as sysdba

使用场景:
dba远程登录进行数据库维护。此时数据库无需载入。须要注意:连接字符串中有服务名,所以侦听程序必须知道这个服务名的信息,然而默认情况下仅仅有数据库载入后才动态向侦听器注冊服务信息。

而如今的情况是。仅仅有数据库实例启动了。没有载入数据库。

此时,要想让侦听器得知服务信息,必须静态注冊服务。方法是改动server端的listener.ora配置文件。例如以下所看到的:




4.5 网络侦听+数据字典password

适用前提:
(1)tnslsnr必须已经正常工作;
(2)数据实例启动。数据库已经载入,并且打开;


连接字符串:
connect 普通用户名/password@serverIP/servicename

使用场景:
这是普通oracle应用最经常使用的情形了,大多数的web程序。应用程序一般都是使用普通账户远程接入oracleserver来读写数据。

5 password中特殊字符的处理

前面说过client是依据连接字符串来确定採用哪种方式向server登录的,连接字符串有特定的语法格式和特殊字符,如/,@。"。

对于oracle账户名来说,一般要尽量避免名字中出现这些特殊字符,防止冲突。

而对于账户的password来说,非常多人都喜欢使用特殊的字符,一旦password中包括了/,@,"。则势必导致与登录字符串的语法冲突。以下看几个样例。


(1)password p@ssw0rd
此时假设连接字符串为 connect username/p@ssw0rd, 那么@会被当做keyword,ssw0rd被当成是侦听地址,从而报错。解决方法是使用双引號把password部分包围起来。

connect username/"p@ssw0rd"。


(2)password 1/2
方法与上面同样, connect username/"1/2"。


(3)password 1"2
password里带有双引號。我还真没见过,也不知道怎么创建这样的password,还请高人不吝赐教。

oracle解析连接字符串时,假设用户名没有使用引號包围。则自己主动转换为大写字符。而对password部分的解析则原样不变。
(4)注意平台shell的元字符转义
sqlplus支持在操作系统的CUI界面直接给出用户名和password參数进行登录。如 
sqlplus username/password@server/service
当password本身中含有bash元字符或者用引號包围password时,都须要进行转义。

以bash为例,如上面的password p@ssw0rd 的情况,此时须要写成:

sqlplus username/\"p@ssw0rd\"
由于"本身在bash中是元字符。要想把"本身作为參数的一部分传递给sqlplus。必须对其进行转义。

最后推荐一本OracleDBA的书籍,该书把非常多的Oracle术语与原理讲述的非常清楚,仅仅是翻译的略显粗糙,建议下载英文版比較阅读。英文版下载链接:http://download.csdn.net/detail/smstong/7534001。
posted @ 2016-04-19 15:47  lcchuguo  阅读(441)  评论(0编辑  收藏  举报