DB-hub Technology Oracle 教程 Creating Database

Oracle 教程 Creating Database

1. ORACLE中NAME

Oracle中的各种NAME会在各种配置文件中经常出现,大致有以下这些:

  • 在init.ora中有DB_NAME,INSTANCE_NAME,SERVICE_NAME
  • 配置DataGuard的时,使用DB_UNIQUE_NAME区分主库和备库
  • 在操作系统中配置环境变量:ORACLE_SID
  • listener.ora中: SID_NAME,GLOBAL_DBNAME
  • tnsname.ora中: SERVICE_NAME,SID,NET SERVICE NAME

这些名字到底有哪些区别呢?
有些是初始化参数,如DB_NAME,DB_QUNIQUE_NAME,DB_DOMAIN,GLOBAL_NAME;有些则只是一种叫法或者说是概念(并没有一个地方可以去设置它),如NET SERVICE NAME;有些则是某些表/视图中的字段名,如V$INSTANCE视图的INSTANCE_NAME;有些则是环境变量中的叫法,如ORACLE_SID 亦或是监听或客户端配置文件中设置的参数,如SID,SID_NAME,SERVICE_NAME,GLOBAL_DBNAME

1.1 INSTANCE_NAME

INSTANCE_NAME Oracle实例名称,用来区分不通的实例。在Oracle9i之前,该名字存储在两个地方:参数文件和数据库的内部试图(V$INSTANCE),而在Oracle10g之后的版本中,该名字不再出现在参数文件中,而是动态从系统中获得,默认是取自ORACLE_SID。INSTANCE_NAME的作用除了区别不同实例之外,在监听器动态注册时,还会用于向监听器注册。比如:INSTANCE_NAME=HR, 监听中将动态注册Instance “HR”,status READY信息。

INSTANCE_NAME就是管理数据库(由SGA、PGA、服务器进程、用户进程、后台进程等组成)的内存结构的名字。
数据库(DB_NAME或GLOBAL_NAME),就是实际的磁盘上的文件(数据文件、日志文件、控制文件等),负责保存数据,由对应的实例来操作它的数据。
服务名(SERVICE_NAME),就是对外公布的名称,为网络监听服务。SERVICE_NAMES主要用在监听器中。

1、一个Oracle数据库系统中可以同时安装多个数据库,每一个数据库对应一个唯一的实例(1:1),但是OPS系统除外,可以多个实例同时对一个数据库操作,称为并行服务器(1:N),还有RAC架构,也是多个实例为一个数据库实例服务(1:N),另外还有ASM磁盘组实例,用于管理ASM这种OMF存储结构而诞生的实例,这些都是很容易混淆的概念。
2、SID即是INSTANCE_NAME,在listener.ora中有SID_NAME,GLOBAL_DBNAME。listener.ora中的SID_NAME指数据库的运行的实例名,应该是和instance_name一致

可以在listener.ora中手工配置数据库实例的监听配置。也可以通过pmon进程自动注册,自动注册的对外网络连接名称就会用到init.ora文件中SERVICE_NAME,有多个值的话就会注册多个监听服务,如HR_SN,HR_SN2。如果手工配置了一个GLOBAL_DBNAME=HR_SN3的监听服务,那么对于实例INSTANCE_NAME=HR就会有三个监听服务。也就是说,通常GLOBAL_DBANME可以设置成和SERVICE_NAME一致,但不要求在tnsname.ora中必须设置SERVICE_NAME,用SID 配置客户端的tnsname.ora时,必须设置连接的数据库的IP及其连接的实例或服务在监听配置中配置的对外网络连接名称,如果用SERVICE_NAME的话,就需要设置SERVICE_NAME=GLOBAL_DBNAME或者SERVICE_NAME=HR_SN,HR_SN可以替换成HR_SN2,HR_SN3,要求oracle已经自动注册到了监听器中,或者不写SERVICE_NAME=…. ,而是写成SID=HR。

1.2 ORACLE_SID

ORACLE_SID(ORACLE SYSTEM IDENTIFIER)是操作系统中用的,指定要默认连接的数据库实例. INSTANCE_NAME是oracle数据库参数。而ORACLE_SID是操作系统的环境变量, ORACLE_SID必须与INSTANCE_NAME的值一致.对于一个机器上有多个实例的情况下,要修改后ORACLE_SID等于要连接的INSTANCE_NAME之后,才能通过 conn / as sysdba连接,如,SET ORACLE_SID=XXX。
ORACLE_SID是以环境变量的形式出现的。Oracle实例是由SGA和一组后台进程组成的,实例的创建和启动需要一个参数文件,而参数文件的名称就是由ORACLE_SID决定的。对于init文件,缺省的文件名称是init.ora,对于spfile文件,缺省的文件名称是spfile.ora。
设置不同的ORACLE_SID值,就可以默认使用不同的参数文件启动不同的数据库实例。另外,ORACLE_SID的作用远远不是作为一个实例入口这么简单的,在实例启动后,实例名称INSTANCE_NAME也是从ORACLE_SID得到的。

1.3 DB_NAME

DB_NAME是数据库(Oracle database)的唯一标识。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命名数据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这个问题,引入了db_domain参数,这样在数据库的标识是由db_name和db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将db_name和db_domain两个参数用’.’连接起来表示一个数据库,并将该数据库的名称称为Global_name,即它扩展了db_name。db_name参数只能由字母、数字、’_’、’#’、’\$’组成,而且最多8个字符。

1.4 DB_DOMAIN

定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。

1.5 GLOBAL_NAME

数据库(Oracle database)的唯一标识,oracle建议用此种方法命名数据库。GLOBAL_NAME是在创建数据库是指定的,缺省值为db_name.db_domain。在以后对参数文件中db_name与db_domain参数的任何修改不影响GLOBAL_NAME的值,如果要修改GLOBAL_NAME,只能用ALTER DATABASE RENAME GLOBAL_NAME TO <db_name.db_domain>命令进行修改,然后修改相应参数。
GLOBAL_DBNAME出现在listener.ora文件中,是服务器提供的服务名,可以通过show paramerer service_names查看,并可以通过alter systemset service_name=’servicename’ scope=both来修改。

1.6 SERVICE_NAME

SERVICE_NAME和GLOBAL_DBNAME 往往是成对出现的。SERVICE_NAME出现在tnsnames.ora文件中,是客户端要请求的服务名。SERVICE_NAME和GLOBAL_DBNAME对应,实现了listerner.ora 和 tnsnames.ora的重要功能:监听、请求与验证。
SERVICE_NAME是oracle8i新引进的。在8i以前,用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了SERVICE_NAME,SERVICE_NAME对应一个数据库,而不是一个实例,而且SERVICE_NAME有许多其它的好处。SERVICE_NAME的缺省值为db_name. db_domain,即等于GLOBAL_NAME。一个数据库可以对应多个SERVICE_NAME,以实现更灵活的配置。SERVICE_NAME与SID没有直接关系,即SERVICE_NAME不必与SID一样。

例如:可以在设置环境变量的时候,设置ORACLE_SID=HR,那么这个时候SID就是HR,而在tnsnames.ora中,我可以把SERVICE_NAME改成HR_SN

##tnsnames.ora
HR = ## HR 为 NET SERVICE NAME
(DESCRIPTION =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.88)(PORT = 1521))
  )
  (CONNECT_DATA =
    (SERVICE_NAME = HR_SN) ## SERVICE_NAME为HR_SN,而SID为HR
  )
)

SERVICE_NAME使用在netca中配置的HR_SN,SID是ORACLE_SID设置的HR,并且把tnsnames.ora里系统自动添加的NET SERVICE NAME相关的内容删除了(即由pmon进程自动注册的2个动态监听),只留下自己配置的部分。
这里使用了netmgr配置的静态监听(status UNKNOWN),静态监听的目的,除了简化配置外,还可以提供在数据库未启动前仍能连接的功能,而不是等数据库实例启动后,由pmon进程负责动态向监听注册服务,动态监听通常会滞后,启动监听后,需要等几分钟后才能看到服务被监听。

##listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/12.2.0.1/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = HR_SN)
(ORACLE_HOME = /u01/app/oracle/product/12.2.0.1/db_1)
(SID_NAME = HR)
)
)

经过以上配置,查看监听状态就会发现区别:

lsnrctl status
...... Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "HR_SN" has 1 instance(s).
Instance "HR", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

Service "HR_SN" has 1 instance(s).## 表示对应的SERVICE_NAME为HR_SN
Instance "HR", status UNKNOWN, has 1 handler(s) for this service... ##表示对应的INSTANCE_NAME为HR,也就是SID和ORACLE_SID

通常情况下,设置SERVICE_NAME和INSTANCE_NAME一致。虽然SERVICE_NAME可以脱离INSTANCE_NAME设置别名,但是必须对应listener.ora里配置的GLOBAL_DBNAME,否则就算配好了静态监听,也注册不了服务。
注意,数据库数据文件存放的路径,是根据DB_NAME来确定的,而对于单实例数据库而言,默认是与SID和INSTANCE_NAME一致,当然,也可以不一致(有DB_DOMAIN的情况下),运行DBCA命令的时候可以选择,通常这3个参数在运行DBCA创建数据库指定值之后,就不再修改了,那么数据文件路径也就确定下来了,如:数据文件放在目录/u01/app/oracle/oradata/hr,跟踪日志就放在目录/u01/app/oracle/admin/hr/bdump。

过了片刻以后,再查看监听状态,发现自动还是会去动态注册一个和INSTANCE_NAME(SID)一致的SERVICE_NAME

Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.91)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "hr" has 1 instance(s).
Instance "hr", status READY, has 1 handler(s) for this service...
Service "hrXDB" has 1 instance(s).
Instance "hr", status READY, has 1 handler(s) for this service...
Service "HR_SN" has 1 instance(s).
Instance "hr", status UNKNOWN, has 1 handler(s) for this service...
Service "hr_XPT" has 1 instance(s).
Instance "hr", status READY, has 1 handler(s) for this service...
The command completed successfully

如果不配置静态监听的话,pmon进程始终会去LISTENER那里注册一个名字和INSTANCE_NAME(SID)一致的SERVICE_NAME,即便是已经在tnsnames.ora中修改了SERVICE_NAME=HR_SN,而只有通过静态监听强制注册一个与INSTANCE_NAME(SID)不一致的SERVICE_NAME,才会被监听到。

1.7 NET SERVICE NAME

网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需,屏蔽了客户端如何连接到服务器端的细节,实现了数据库位置的透明。用DBLINK连接数据库时,使用的就是这个名字,由USING关键字指定,USING ‘connect_string’这里connect_string其实就是NET SERVICE NAME。
关于DBLINK,当源数据库GLOBAL_NAME=TRUE时,link_name必须与远程数据库的全局数据库名(global_name)相同;否则,可以任意命名。同样地,当我们用sqlplus system/oracle@xxx来连接DB SERVER时,这个xxx就是NET SERVICE NAME,例如:

HR =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.88)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = HR_SN)
)
)

HR就是HR_SN这个SERVICE_NAME所对应的NET SERVICE NAME。必须用sqlplus system/oracle@HR才能连接数据库。

sqlplus system/oracle@HR_SN

SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jul 29 14:48:39 2014

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

ERROR:
ORA-12560: TNS:protocol adapter error

Enter user-name:
[oracle@centos]$ sqlplus system/oracle@HR

SQL*Plus: Release 12.2.0.1.0 - Production on Tue Jul 29 01:50:06 2016

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

用@NET SERVICE NAME方式登录,必须保证数据库是open的,否则即便是用对了名字,也会出现这种情况:

sqlplus system/oracle@HR

SQL*Plus: Release 12.2.0.1.0 - Production on Tue Jul 29 02:03:06 2016

Copyright (c) 1982, 2010, Oracle. All Rights Reserved.

ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory

Enter user-name:

1.8 startup命令和各种NAME

startup命令,究竟是如何启动oracle数据库的呢?
下面我们来贯穿起整个启动流程,一探究竟:
nomount状态
系统接收到startup命令,立刻取得环境变量ORACLE_SID的值,开始分配SGA内存,启动第一阶段–实例创建。系统根据找到的参数文件启动ORACLE数据库实例,实例启动后,一切由实例接管:注册INSTANCE_NAME,往往INSTANCE_NAME就是来自ORACLE_SID,接着向监听器动态注册实例自己,并将INSTANCE_NAME写入系统数据字典表。
mount状态
实例进一步读取参数文件,取得DB_NAME、控制文件、检查点等信息,进入第二阶段–挂载数据库。实例从控制文件中取得DB_NAME,并取得数据文件、日志文件等信息,进行DB_NAME的一致性检验、文件的存在性判断等工作之后,实例将挂载数据库,挂载的数据库就是DB_NAME指定的数据库。
open状态
实例进入第三阶段–启动数据库。这一阶段,实例进行了两项检查:检查点和更改点检查,之后启动数据库。
总结:现在,了解了那么多oracle中出现的各种NAME以后会发现名称很多,概念也很容易混淆,如,SERVICE_NAME设置错误,就会造成服务无法正确注册到监听,客户端连接不到数据库服务器等等,为了方便不出错,建议能设置的成一样的名字,尽量都用同一个,如:SID,ORACLE_SID,SID_NAME,INSTANCE_NAME,SERVICE_NAME,NET SERVICE NAME,DB_NAME,GLOBAL_DBNAME这些名字,都可以设置成HR,DB_DOMAIN能不用就尽量不设置,除非生产环境中有很多库,为了惟一标识,如果设置了,那么GLOBAL_NAME就不再是DB_NAME了,而是DB_NAME.DB_DOMAIN,而当使用DBLINK的时候,LINK的名字也必须使用DB_NAME.DB_DOMAIN了,会带来不小麻烦。

1.9.总结

SID是对内的,是实例级别的一个名字,用于内部之间称呼。SERVICE_name是对外的,
是数据库级别的一个名字,用于告诉数据库外部使用者,标识数据库为”SERVICE_NAME”。可以通过service_name参数指定这个名字是什么,可以有多个名字,名字随便起,叫狗蛋,翠花都没关系。如果不指定,默认的是Db_name. Db_domain,也就是global_name。
ORACLE_SID,是用于OS系统,标识实例的名字,可以通过sqlplus登录,启动这个实例。
这些易混淆的名字,它门不是指数据库,就是指实例,别无其它。具体用哪个名字,是要看对谁而言,是什么场合。是对数据库,还是对操作系统,还是对外部链接。就像你对父母而言,你有小名叫幺儿;对同学而言,你有外号叫灯泡;对办事机构,你有正规的名字叫王小明。

2. Creating Database Steps

Step 1: Specify an Instance Identifier (SID)
Step 2: Ensure that the required environment variables are set
Setp 3: Choose a Database administrator authentication method
Step 4: Create the initialization parameter file
Step 5: (Windows Only) Create an instance
Step 6: Connect to the Instance
Step 7: Create a server parameter file(PFILE SPFILE)
Step 8: Start the instance
Step 9: Issue the CREATE DATABASE statement
Step 10: Create additional tablespaces
Step 11: Run scripts to build data dictionary views
Step 12: Run scripts to install additional options(optional)
Step 13: Back up the database
Step 14: (Optional) Enable automatic instance startup

2.1 设置环境变量

ORACLE_BASE
ORACLE_HOME
ORACLE_SID
ORA_NLS33
PATH
LD_LIBRARY_PATH

env | grep ORACLE
ORACLE_SID=HAMSTER
ORACLE_BASE=/oracle/app/oracle
ORACLE_HOME=/oracle/app/oracle/product/12.2.0.1/dbhome_1

2.2 创建目录

cd /oradata
mkdir HAMSTER
cd $ORACLE_BASE/admin
mkdir HAMSTER
cd HAMSTER
mkdir adump  dpdump  pfile

2.3 创建密码文件

orapwd file=orapwsurrey password=oracle entries=10

2.3 创建初始化文件

cd $ORACLE_HOME/dbs
vi initHAMSTER.ora

********************************************************
--数据库名
 db_name='HAMSTER'
 --11G中,内存管理将pga和sga用memory_target这一个参数表示
 memory_target=300M

--控制文件路径 ,注意中文字符会出错
 control_files='/oradata/HAMSTER/control01.ctl','/oradata/HAMSTER/control02.ctl','/oradata/HAMSTER/control03.ctl'

--undo表空间信息 
undo_management='auto'
undo_tablespace='undotbs01'

--dump文件
audit_file_dest='/oracle/app/oracle/admin/HAMSTER/adump'

--自动诊断信息库文件 ADR Automatic Diagnostic Repository
diagnostic_dest='/oracle/app/oracle'

db_block_size=8192
processes=150
remote_login_passwordfile='EXCLUSIVE'
**********************************************************

2.4 创建数据库

编写创建数据库脚本

cd $ORACLE_HOME/dbs
vi createdb.sql

spool createdb.log
CREATE DATABASE surrey
    CONTROLFILE REUSE
    LOGFILE
      GROUP 1 (
        '/oradata/HAMSTER/redo01a.log',
        '/oradata/HAMSTER/redo01b.log'
      )SIZE 50M,
      GROUP 2 (
        '/oradata/HAMSTER/redo02a.log',
        '/oradata/HAMSTER/redo02b.log'
      )SIZE 50M,
      GROUP 3 (
        '/oradata/HAMSTER/redo03a.log',
        '/oradata/HAMSTER/redo03b.log'
        )SIZE 50M
    MAXLOGFILES 16
    MAXDATAFILES 10
    MAXINSTANCES 8
    ARCHIVELOG
    CHARACTER SET AL32UTF8
    NATIONAL CHARACTER SET AL16UTF16
    SYSAUX DATAFILE '/oradata/HAMSTER/sysaux01.dbf' size 50M
    DATAFILE '/oradata/HAMSTER/system01.dbf'
      SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
      EXTENT MANAGEMENT LOCAL
    DEFAULT TABLESPACE usertbs01
      DATAFILE '/oradata/HAMSTER/usertbs01.dbf'
      SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
      EXTENT MANAGEMENT LOCAL
    DEFAULT TEMPORARY TABLESPACE temptbs01
      TEMPFILE '/oradata/HAMSTER/temptbs01.dbf'
      SIZE 20M EXTENT MANAGEMENT LOCAL
    UNDO TABLESPACE undotbs01
      DATAFILE '/oradata/HAMSTER/undotbs01.dbf'
      SIZE 50M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
;
spool off

2.5 数据库启动到nomount状态

cd $ORACLE_HOME/dbs
startup nomount;

运行脚本

SQL> SET SQLBL ON -- 允许在执行脚本的时候脚本中有空白行SET SQLBL[ANKLINES] {ON | OFF}
SQL>@$ORACLE_HOME/dbs/createdb.sql

2.6 创建数据字典视图

Run scripts to build data dictionary views
SQL> @?/rdbms/admin/catalog.sql
SQL> @?/rdbms/admin/catproc.sql
SQL> @?/sqlplus/admin/pupbld.sql

2.7. 测试

检查状态

SQL> conn /as sysdba
SQL> select instance_name,status from v$instance; --检查状态,此时数据库应该是open状态
SQL> quit

创建用户

create user Tom identified by Tom1234
default tablespace usertbs01
temporary tablespace temptbs01

grant create session,create table, connect,resource to Tom;
grant select any table to Tom;
grant update any table to Tom;
grant insert any table to Tom;

创建表

2.8. 数据库大小

SELECT SUM(GB) AS GB
FROM(
     SELECT SUM(BYTES)/1024/1024/1024 AS GB 
     FROM DBA_DATA_FILES
     UNION ALL
     SELECT SUM(BYTES)/1024/1024/1024
     FROM DBA_TEMP_FILES
     UNION ALL
     SELECT SUM(BYTES)/1024/1024/1024
     FROM V$LOG
     );

3. orapwd命令

ORACLE有两种方式可以认证sysdba/sysoper用户:操作系统级认证-dba权限组(linux /unix)和ORA_DBA组(win);口令文件认证。 两种方式有各自的开关:sqlnet.ora中AUTHENTICATION_SERVICES参数;spfile/pfile中 remote_login_passwordfile参数。并且这两个开关互不矛盾,可以同时打开同时关闭或者只开一个。

3.1 命令说明

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

        file - name of password file (required),
        password - password for SYS will be prompted if not specified at command line,
        entries - maximum number of distinct DBA (optional),
        force - whether to overwrite existing file (optional),
        ignorecase - passwords are case-insensitive (optional),
        nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only).

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

3.2 使用范例

orapwd file=orapwmercury password=passwd123 entries=10

    file:    orapwmercury为'orapwORACLE_SID'格式,如sid为test则命令文件为orapwtest,密码文件要放置在ORACLE_HOME/dbs/目录下。
    password:passwd123为sys用户的密码
    entries: 10表明可以有10个sysdba权限用户,不可超过10个,目前已经定义了sys一个。

注:改动生效需要重启数据库。

3.3 为什么需要口令文件

在数据库没有启动之前,数据库内建用户是无法通过数据库来验证身份的。口令文件中存放sysdba/sysoper 用户的用户名及口令,允许用户通过口令文件验证,在数据库未启动之前登陆,从而启动数据库。如果没有口令文件,在数据库未启动之前就只能通过操作系统认证。 使用Rman,很多时候需要在nomount,mount等状态对数据库进行处理。所以通常要求sysdba权限如果属于本地DBA组,可以通过操作系统认证登陆。如果是远程sysdba登陆,需要通过password file认证。

3.4 口令文件损坏或者丢失

口令文件就是sysdba/sysoper用户的唯一口令文件,丢了就进不来,不管数据库启动没有。连接报错…

SQL> connect sys/oracle@sfjsklfj as sysdba
ERROR:
ORA-01031: insufficient privileges

只能用操作系统级权限验证登陆,即oracle/oracle登陆,然后orapwd重建口令文件:
orapwd file=orcl.ora password=orclsys entries=2

orapwd命令第二个参数是指定sys的密码。为什么要指定sys密码? 因为口令文件里面必须要有用户密码,否则怎么验证啊?但此时数据库如果没启动的话就根本取不到sys密码,所以只能强行指定了,启动后数据库里面sys的密码会被改成此时指定的。另外重建口令文件的工作只能由系统验证用户完成,或者具有dba权限的用户也可以,其他用户执行orapwd命令都会失败。

3.5 把sysdba或者sysoper用户加到口令文件中

再执行一遍grant sysdba/sysoper to 用户,oracle会自动在口令文件中增加一个条目,并且把密码copy过来。

    SQL> show user;
    USER is "SYS"
    --察看口令文件的内容:
    SQL> select * from v$pwfile_users;
    no rows selected

    SQL> grant sysdba to scott;
    grant succeeded

    SQL> select * from vpwfile_users;
    USERNAME        SYSDBA  SYSOPER
    --------------- ------- -------
    SYS             TRUE    TRUE
    SCOTT           TRUE    FALSE

3.6 没有口令文件启动数据库

9i及以下mount过程中会报错,然后手动open就可以了。因为只要用本地验证用户照样可以做sysdba的事情,没有理由让数据库启动不了。10g已经不会报错了。
没有口令文件为什么是mount阶段报错而不是nomount阶段报错?因为只有到了alter mount阶段才验证各种文件,nomount只读spfile/pfile创建进程。

3.7 修改sysdba/sysoper用户密码时,能否同步到口令文件?

可以同步。alter user xxx identified by yyy
所有密码忘记都没关系,但至少要记住sys用户密码。

3.8 spfile/pfile中remote_login_passwordfile

三种设定模式:可以通过show parameter pass命令查看当前模式

  • remote_login_passwordfile = EXCLUSIVE 一个实例专用;
  • remote_login_passwordfile = SHARE 可以多个实例共享(用于OPS/RAC环境);
  • remote_login_passwordfile = NONE 不启用口令文件,此时任何sysdba/sysoper都无法连接进来。

remote_login_passwordfile = shared Oracle9i文档中的说明:
More than one database can use a password file. However, the only user recognized by the password file is SYS.
意思是说多个数据库可以共享一个口令文件,但是只可以识别一个用户:SYS。在用SPFILE的情况下,remote_login_passwordfile参数怎么改呢?SPFILE是不可以强行编辑的,否则数据库不认的。用alter system set remote_login_passwordfile=none scope=spfile。

改成NONE以后怎么改回来呢?

用os级认证登陆,然后alter system set remote_login_passwordfile=none scope=spfile,或者直接create spfile from pfile;

remote_login_passwordfile=’none’意味着禁用口令文件,有也不能用。等于可以 disable所有sysdba/sysoper,此时只能用oracle/oracle用户来启动和关闭数据库,也就是只有os认证,没有口令文件认 证,这就是此参数的意义-口令文件验证的开关。

3.9 sqlnet.ora中SQLNET.AUTHENTICATION_SERVICES=(NTS/NONE)有

NTS=NT Security 即采用OS优先认证登陆,NONE为不可以,必须采用usr/pwd as sysdba/sysoper 登陆。这里是操作系统级验证的开关。如果SQLNET.AUTHENTICATION_SERVICES=(NONE)并且 remote_login_passwordfile=’none’,即两个开关都关闭,那么神仙也进不了数据库,我指的是 sysdba/sysoper用户,普通用户可以照常使用的。当然,有物理权限的人也除外,即你可以物理地打开这台计算机操作。

3.10 常见问题

(1)尝试使用sysdba权限用户远程登录的时候提示,尤其是pl/sql使用 “sys/密码 as sysdba”登录时

ORA-01031: insufficient privileges

可能原因是:
1:口令文件的缺失,造成没有找到口令
2:REMOTE_LOGIN_PASSWORDFILE值没有指定或是指定了none。

(2)select * from v$pwfile_users; 结果为 no rows select如

    SQL> show user;
    USER is "SYS"
    SQL> select * from v$pwfile_users;

    no rows selected

说明口令文件不存在或是不起作用,创建口令文件,重启数据库。