时间:2021-07-01 10:21:17 帮助过:2人阅读
Oracle相关的知识非常多,但一些主要的术语是全部dba都应该熟悉的。为更好的理解本文内容,读者须要理解例如以下术语: Instance和Database。IP/TCP,sqlplus,Oracle 账号与操作系统账号, Oracle DBA。
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协议。别无它方。
通过账户进行权限控制是非常多软件採取的方法,比如每一个OS都有自己的账户。Oracle也不例外,要想进入Oracle进行操作,必须以某种身份进入,这就是Oracle的账户。Oracle账户依照权限大致分为特权账户和普通账户。特权账户拥有极大的权限。而而普通用户的权限受到非常大限制。典型的特权账户就是SYS,SYSTEM。
那么oracle是怎样对账户进行验证的呢?答案是有非常多种方式,最easy理解的就是本地password验证了,另外还有使用OS账户验证、利用LDAP验证、以及Kerberos等外部验证。
本文仅仅涉及最主要的password验证方式。
前面说过Oracle net支持多种底层通信协议,当中包括操作系统本地的进程间通信协议。 不管底层是何种协议,server端程序必须进行某种形式的侦听。以等待来自客户的连接请求。
(1)网络侦听程序tnslsnr
当底层协议是网络协议时,Oracle tnslsnr提供侦听服务。这是一个单独的进程,与其它进程独立。
以下是Oracle专用server工作方式下的侦听器工作示意图。
如上图所看到的,client进程首先与侦听器连接(红色连线)。并验证账户与权限。假设全部验证通过,侦听进程负责产生出一个新的server进程,并让client进程和新产生的server进程直接连接(蓝色连线),称之为一个会话,同一时候自身断开与client的连接,并与新建立的会话不再有不论什么关系。
可见侦听进程起到了一个牵线的作用。
之后,即使侦听器停止了工作,已经建立的会话也丝毫不受影响。
(2)本地侦听程序
本地侦听程序与网络侦听器全然不同,它不须要网络协议栈,详细实现严重依赖于底层OS。
在Oracle中。本地侦听与tnslsnr全然独立。在Linux平台的本地侦听不须要执行不论什么程序。也就是说本地登录不依赖于tnslsnr。这对于dba是非常有用的。当侦听器发生问题不能正常工作时,我们仍然能够通过本地连接来登入oracle进行操作。
本文仅仅关心本地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文件。
使用前提:
(1)client与server端执行在同一机器上;
(2)使用安装oracle的OS账户登入OS。
(3)设置了$ORACLE_SID环境变量。
连接字符串:
此时,的连接字符串必须为 connect / as sysdba。
使用场景:
值得说明的是,这样的情况下,登录成功的唯一前提就是须要指定$ORACLE_SID环境变量。不须要侦听器,也不须要数据库载入。甚至不须要实例启动。如上图所看到的。实例没有启动。此时,会默认使用oracle的sys账户登录。
这样的情形的使用情况是,DBA启动数据库。
使用前提:
(1)client与server端执行在同一机器上;
(2)使用不论什么账户登录OS;
(3)设置了$ORACLE_SID环境变量。
连接字符串:
此时,的连接字符串必须为 connect 特权账户名/password as sysdba。
使用场景:
与4.1相似,仅仅是此时的OS账户仅仅要有权限执行sqlplus就可以,无需是Oracle的安装用户。
而如今的情况是。仅仅有数据库实例启动了。没有载入数据库。
此时,要想让侦听器得知服务信息,必须静态注冊服务。方法是改动server端的listener.ora配置文件。例如以下所看到的:
对于oracle账户名来说,一般要尽量避免名字中出现这些特殊字符,防止冲突。
而对于账户的password来说,非常多人都喜欢使用特殊的字符,一旦password中包括了/,@,"。则势必导致与登录字符串的语法冲突。以下看几个样例。
connect username/"p@ssw0rd"。
以bash为例,如上面的password p@ssw0rd 的情况,此时须要写成:
sqlplus username/\"p@ssw0rd\"由于"本身在bash中是元字符。要想把"本身作为參数的一部分传递给sqlplus。必须对其进行转义。Oracle 11g不同情形下的登录分析
标签: