首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.2.6 Oracle的口令文件

继续前面的脚本,在创建和启动了实例之后,Oracle开始调用eygle.sql脚本,我们将这个脚本分开来介绍。

这个脚本的最初部分是要求定义用户口令,然后使用定义的sys用户口令创建口令文件:

C:\Oracle\admin\eygle\scripts>type eygle.sql

set verify off

PROMPT specify a password for sys as parameter 1;

DEFINE sysPassword = &1

PROMPT specify a password for system as parameter 2;

DEFINE systemPassword = &2

PROMPT specify a password for sysman as parameter 3;

DEFINE sysmanPassword = &3

PROMPT specify a password for dbsnmp as parameter 4;

DEFINE dbsnmpPassword = &4

host C:\oracle\10.2.0\bin\orapwd.exe file=C:\oracle\10.2.0\database\PWDeygle.ora

 password=&&sysPassword force=y

这里又引入了另外一个工具orapwd,这个工具在Linux/UNIX上同样存在,当口令文件丢失或损坏之后,可以通过这个工具重建口令文件,这个工具的语法为:

C:\>orapwd

Usage: orapwd file=<fname> password=<password> entries=<users> force=<y/n>

  where

    file - name of password file (mand),

    password - password for SYS (mand),

    entries - maximum number of distinct DBA and     force - whether to overwrite existing file (opt),

OPERs (opt),

  There are no spaces around the equal-to (=) character.

注意:force参数是Oracle 10g中新增加的。

Oracle在启动过程中,会在$ORACLE_HOME/dbs(Windows下相应的目录则是$ORACLE_HOME\database)目录下查找口令文件,查找的顺序是首先检查orapw<ORACLE_SID>文件,如果不存在则查找orapwd文件,如果orapwd文件也不存在,就会报出如下错误:

SQL> startup force;

ORACLE instance started.

Total System Global Area 131142648 bytes

Fixed Size 451576 bytes

Variable Size 104857600 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

ORA-01990: error opening password file '/opt/oracle/product/9.2.0/dbs/orapw'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

口令文件丢失或损坏后,通常可以通过如下命令重建口令文件:

[oracle@jumper dbs]$ orapwd file=orapwhsjf password=oracle entries=5

在数据库没有启动之前,数据库内建用户是无法通过数据库来验证身份的,此时口令文件的作用就体现了出来。口令文件中存放了具有sysdba / sysoper身份用户的用户名及口令,Oracle允许用户通过口令文件验证,在数据库未启动之前登录,从而启动实例进而加载并打开数据库;而如果没有口令文件,在数据库未启动之前就只能通过操作系统认证方式来启动实例。

Oracle通过一个初始化参数remote_login_passwordfile来限制口令文件的使用,通过这个参数可以设置用户登录时是否检查口令文件,以及有多少个数据库可以使用口令文件。这个参数有3个选项:EXCLUSIVE、SHARED和NONE。

当remote_login_passwordfile设置为NONE时,远程用户将不能通过sysdba/sysoper身份登录数据库:

SQL> show parameter pass

NAME                      TYPE        VALUE

------------------------- ----------- ------------------------------

remote_login_passwordfile string      NONE

此时通过远程连接会收到如下错误:

E:\Oracle\ora92\bin>sqlplus /nolog

SQL*Plus: Release 9.2.0.4.0 -

Production on 星期四 4月 15 09:39:22 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

SQL> connect sys/oracle@hsjf as sysdba

ERROR:ORA-01017: invalid username/password; logon denied

此处实际上是无法通过口令文件验证。

缺省的remote_login_passwordfile参数设置为exclusive,支持远程sysdba的登录操作:

SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;

System altered.

这个参数是静态参数,修改后重起数据库才能生效。当remote_login_passwordfile参数设置为exclusive时可以通过远程以sysdba身份登录数据库:

E:\Oracle\ora92\bin>sqlplus /nolog

SQL*Plus: Release 9.2.0.4.0 -

Production on 星期四 4月 15 09:47:11 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

SQL> connect sys/oracle@hsjf as sysdba

已连接。

SQL> show user

USER 为"SYS"

当remote_login_passwordfile参数设置为shared时,则多个数据库可以共享一个口令文件,但是此时口令文件中只能存储SYS用户的口令,此时其他用户不能被授予sysdba身份:

SQL> select * from v$pwfile_users;

USERNAME  SYSDB  SYSOP

--------- ----- -----

SYS       TRUE   TRUE

SQL> grant sysdba to eygle;

grant sysdba to eygle

*

ERROR at line 1:

ORA-01994: GRANT failed: cannot add users to public password file

SQL> show parameter password

NAME                           TYPE   VALUE

----------------------------   ------ ------------------------------

remote_login_passwordfile      string SHARED

此时的口令文件中是不能添加用户的。

很多朋友的疑问在于:口令文件的缺省名称是orapw<ORACLE_SID>,怎么能够共享?

前面已经提到,Oracle数据库在启动时,首先查找的是orapw<ORACLE_SID>的口令文件,如果该文件不存在,则开始查找orapw的口令文件;如果同一主机上的多个数据库同时使用orapw文件,则口令文件就可以共享(当然通过其他方式,如符号链接等也可以实现共享)。

来看一下测试,首先移动缺省的口令文件:

[oracle@jumper dbs]$ mv orapweygle orapweygle.b

此时启动数据库会出现如下错误:

SQL> startup force;

ORACLE instance started.

<...ignore SGA info here...>

ORA-01990: error opening password file '/opt/oracle/product/9.2.0/dbs/orapw'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

拷贝一个orapw口令文件,这时候再启动数据库就不会出现这个错误:

SQL> ! cp orapweygle.b orapw

SQL> startup force;

ORACLE instance started.

<...ignore SGA info here...>

Database mounted.

Database opened.    

SQL> show parameter password

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

remote_login_passwordfile            string      SHARED

那么你可能会有这样的疑问:多个Exclusive的数据库是否可以共享一个口令文件(orapw)呢?继续这个测试:

[oracle@jumper dbs]$ strings orapw

]\[Z

ORACLE Remote Password file

INTERNAL

AB27B53EDC5FEF41

8A8F025737A9097A

注意这里仅记录着INTERNAL/SYS的口令。

当REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE时:

SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;

System altered.

SQL> startup force;

ORACLE instance started.

<...ignore SGA info here...>

Database mounted.

Database opened.

SQL> ! strings orapw

]\[Z

ORACLE Remote Password file

EYGLE

INTERNAL

AB27B53EDC5FEF41

8A8F025737A9097A

注意:这里以EXCLUSIVE方式启动以后,实例名称信息被写入口令文件。

此时如果有其他实例以Exclusive模式启动,仍然可以使用这个口令文件,口令文件中的实例名称同时被改写,也就是说,数据库只在启动过程中才读取口令文件,数据库运行过程中并不锁定该文件,类似于pfile/spfile文件。

进一步地,如果对其他用户授予SYSDBA的身份:

SQL> select * from v$pwfile_users;

USERNAME          SYSDB    SYSOP

----------------- -------- --------

SYS               TRUE    TRUE

SQL> grant sysdba to eygle;

Grant succeeded.

SQL> select * from v$pwfile_users;

USERNAME          SYSDB         SYSOP

------------------------------ ----- -----

SYS          TRUE          TRUE

EYGLE TRUE FALSE

SQL> ! strings orapw

]\[Z

ORACLE Remote Password file

EYGLE

INTERNAL

AB27B53EDC5FEF41

8A8F025737A9097A

>EYGLE

B726E09FE21F8E83

注意此时增加的SYSDBA用户,其相关信息可以被写入到口令文件,一旦口令文件中增加了其他SYSDBA用户,此文件就不再能够被其他Exclusive的实例共享。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论