对于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. python中type、object与class之间关系(一切皆对象)

    object是最顶层基类 object是type的实例,而type又继承object type是自身的实例 >>> class Student: ... pass ... >& ...

  2. CNN卷积核计算

    作者:十岁的小男孩 目录 单层卷积核计算 三维卷积核计算 Padding=Valid&&Same 总结

  3. poj2739 poj2100 尺取法基础(二)

    都是很简单的题目 poj2739素数打表+单点推移 #include<iostream> #include<cstring> #include<cstdio> us ...

  4. 如何用命令将本地项目上传到git,git基本使用

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  5. PTA之求单链表结点的阶乘和

    本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int ...

  6. hdu 1548 升降梯

    题目大意:有一个升降机,它有两个按钮UP和DOWN,给你一些数i表示层数,并且每层对应的Ki,如果按UP按钮,会从第i层升到第i+Ki层:如果按了DOWN则会从第i层降到第i-Ki层:并规定能到的层数 ...

  7. (第2篇)一篇文章教你轻松安装hadoop

    摘要: 这篇文章将会手把手教你安装hadoop,只要你细心按照文章中的步骤操作,hadoop肯定能正确安装,绝对不会让你崩溃 博主福利 给大家赠送一套hadoop视频课程 授课老师是百度 hadoop ...

  8. otter部署【原创】

    环境IP:10.10.6.171 部署:mysql源库IP:10.10.6.172 部署:mysql目标库IP:10.10.6.173 部署:zookeeper,manager,node,canal ...

  9. [HDU] 5306 Gorgeous Sequence [区间取min&求和&求max]

    题解: 线段树维护区间取min求和求max 维护最小值以及个数,次小值 标记清除时,分情况讨论 当lazy>max1 退出 当max1>lazy>max2(注意不要有等号) 更新 否 ...

  10. 胜利大逃亡 HDU1429 (bfs)

    最后两题算是这个专题最难的两题了 这题关键是标记数组 我一开始设置的是 四维的  第三维是朝向  第四维是钥匙个数 但是 不同的取法钥匙个数可能会重复   如:取ab钥匙和取ac钥匙都是两枚  导致w ...