对于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工作方式下的侦听器工作示意图。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc21zdG9uZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

如上图所看到的,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)数据实例启动。数据库已经载入,并且打开;

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc21zdG9uZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

连接字符串:
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。

Oracle 11g不同情形下的登录分析的更多相关文章

  1. Oracle 11g 下载|Oracle 11g 官网下载|Oracle 11g 官网下载 带登录用户和密码

    本文转载自 Oracle 11g 下载|Oracle 11g 官网下载|Oracle 11g 官网下载 带登录用户和密码 oracle 下载还需要用户名我自己注册了个方便大家使用下载直接点击提示找不到 ...

  2. Oracle 11g RAC环境下Private IP修改方法及异常处理

    Oracle 11g RAC环境下Private IP修改方法及异常处理 Oracle 11g RAC环境下Private IP修改方法及异常处理 一. 修改方法 1. 确认所有节点CRS服务以启动 ...

  3. oracle_安装_win7+64位+Oracle+11g+64位下使用PLSQL+Developer+的解决办法

    1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0) 下载instantclient-basic-wi ...

  4. win8 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法

    1)安装Oracle 11g 64位2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)下载 instantclient-basic-win ...

  5. win7+64位+Oracle+11g+64位下使用P…

    1)安装Oracle 11g 64位   2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)   下载instantclient-basi ...

  6. Oracle 11g RAC 环境下单实例非缺省监听及端口配置

    如果在Oracle 11g RAC环境下使用dbca创建单实例数据库后,Oracle会自动将其注册到缺省的1521端口及监听器.大多数情况下我们使用的为非缺省监听器以及非缺省的监听端口.而且在Orac ...

  7. 关于oracle 11g 64位与 32位的 plsql、及其他32位应用程序共存的问题

    因为 plsql 不支持 64位 oracle 客户端,所以plsql 必须使用 oracle 的 32位 instanclient 包.  解压缩后放一个目录,例如: D:\Oracle\insta ...

  8. 关于 Oracle 11g r2 Enterprise Manager (EM) 在windows环境无法启动的解决办法

    正确的解决办法是在安装的时候使用emca正确安装 如果已经安装过Enterprise Manager: 请用是如下命令卸载后重装 emca -deconfig dbcontrol db emca -r ...

  9. Windows 10 64位操作系统 下安装、配置、启动、登录、连接测试oracle 11g

    一.下载oracle安装包 1:详细下载安装版本可见官网:https://www.oracle.com/technetwork/database/enterprise-edition/download ...

随机推荐

  1. sklearn,交叉验证中的分层抽样

    StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同. 例子: import numpy as np from sklearn.m ...

  2. 基于react/vue的移动端终极适配方案vw单位(更新css-modules配置)

    传送门:  https://segmentfault.com/a/1190000014185590

  3. vue-router两种模式,到底什么情况下用hash,什么情况下用history模式呢?

    转:https://segmentfault.com/q/1010000010340823/a-1020000010598395 为什么要有 hash 和 history 对于 Vue 这类渐进式前端 ...

  4. STM32应用实例十:简析STM32 I2C通讯死锁问题

    I2C接口是一种使用非常普遍的MCU与外部设备的接口方式,在STM32中也集成了I2C接口,我们也常常使用它来与外围的传感器等设备通讯. 最近在我们使用STM32F1VET6读取压力和温湿度传感器数据 ...

  5. js闭包实例汇总

    本文是通过实例来帮助大家深刻理解js闭包,是篇非常不错的文章,这里推荐给大家,有需要的小伙伴可以参考下 Js闭包 闭包前要了解的知识 1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取 ...

  6. sql基础笔记备忘

    MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型:tinyint smallint medium ...

  7. 配置CenOS网络,并用Xshell链接。

    首先输入 cd /etc/sysconf ig/network-scripts/ 然后回车 输入ls 然后回车 输入 vi ifcfg-eth0  然后回车 按下esc键,然先后按下U,I键把光标用键 ...

  8. js读取xml文件

    假设我们现在要读取下面的 info.xml 文件 <?xml version="1.0" encoding="gb2312"?> <root& ...

  9. .NetCore源码阅读笔记系列之Security (三) Authentication & AddOpenIdConnect

    通过第二篇文章我们已经知道了授权的内部实现通过自定义的授权Handler来的,同样的道理 OpenIdConnect 同样是通过 OpenIdConnectHandler来请求授权的 那么它内部又是怎 ...

  10. Delphi---TServerSocket和TClientSocket发送和接收大数据包

    https://www.cnblogs.com/zhangzhifeng/p/6065244.html TServerSocket和TClientSocket用非阻塞模式发送和接收比较大的数据时,可能 ...