oracle 11g中的 oracle restart特性

oracle restart性特
在oracle 11g r2 以前对于单实例一般都是写脚本为自动启动oracle,在oracle 11g r2中使用oracle restart功能来配置在硬件或软件出现故障或者数据库所在主机重启之后自动重新启动数据库,监听和其它oracle组件对于非集群环境,只需要安装OracleGrid Infrastructure,在安装的时候选择“仅安装网格基础结构软件”,然后运行如下脚本
来安装Oracle Restart:$GRID_HOME/crs/install/roothas.pl

[root@jyrac1 install]# ./roothas.pl
2014-05-28 12:11:54: Checking for super user privileges
2014-05-28 12:11:54: User has super user privileges
2014-05-28 12:11:54: Parsing the host name
Using configuration parameter file: ./crsconfig_params
Creating trace directory
LOCAL ADD MODE
Creating OCR keys for user 'grid', privgrp 'oinstall'..
Operation successful.
CRS-4664: Node jyrac1 successfully pinned.
Adding daemon to inittab
CRS-4123: Oracle High Availability Services has been started.
ohasd is starting

jyrac1     2014/05/28 12:12:47     /grid/11.2.0/grid/cdata/jyrac1/backup_20140528_121247.olr
Successfully configured Oracle Grid Infrastructure for a Standalone Server
[root@jyrac1 install]# srvctl
-bash: srvctl: command not found
[root@jyrac1 install]# su - grid
[grid@jyrac1 ~]$ srvctl
Usage: srvctl   []
    commands: enable|disable|start|stop|status|add|remove|modify|getenv|setenv|unsetenv|config
    objects: database|service|asm|diskgroup|listener|home|ons|eons
For detailed help on each command and object and its options use:
  srvctl  -h or
  srvctl   -h

oracel restart提高了数据库的可用性.当你安装oracle restart之后在硬件或软件出现故障或者数据库所在主机重启之后各种
oracle组件能够自动重启.
表: 通过oracle restart自动重启的oracle组件

------------------------------------------------------------------------------------------------------------
组件                           说明
------------------------------------------------------------------------------------------------------------
实例                           oracle restart能够用于单主机上的多个数据库实例

监听程序

数据库服务                     不包括默认创建的缺省服务因为它是由oracle数据库来管理的且不包括在数据库创建时
                               所创建的缺省服务

oracle asm实例

oracle asm磁盘组               重新启动磁盘组并加载磁盘组

oracle ONS通知服务             在单独的环境中,ONS在data guard安装中被用来在主库和备库之间通过
                               fast application notification(fan)来自动进行故障切换.ONS是一个服务用来发送
                               FAN事件被集成到客户端的故障转移功能中.

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

oracle restart会定期运行检查操作来监控这些组件的健康.如果对一个组件的检查操作失败,那么这个组件会被关闭然后再重新启动.

oracle restart只能用于独立的服务器环境(非集群).对于oracle rac来说是由oracle clusterware来提供自动重启组件的功能.

oracle restart是在oracle grid 架构目录之外的目录运行的它的安装目录是与oracle数据库的home目录分开的.

关于启动的依赖性
oracle restart能确保oracle组件根据组件之间的依赖性以合适的顺序被启动.例如,如果数据文件被存储在oracle asm磁盘组中,那么在启动数据库实例之前,oracle restart会确保oracle asm实例被启动且被要求的磁盘组会被加载.同样的如果一个组件必须被关闭,oracle restart会确保依赖组件首先会被关闭.

oracle restart也管理数据库实例和oracle监听之间的弱依赖:当一个数据库实例被启动时,oracle restart会试图启动监听.如果监听启动失败,数据库仍然处于启动状态.如果监听后启动失败,oracle restart不会关闭实例然后再重启实例.

并于使用oracle restart启动和停止组件
当有需要时oracle restart会自动重启各种oracle组件,当你手动关闭你的操作系统时oracle restart会以合理的顺序来停止oracle组件.可能有时候你想手动启动或者停止单个的oracle组件.oracle restart包括服务控制工具(srvctl)可以用它来手动启动和停止由oracle restart管理的组件.当使用oracle restart时,oracle强烈建议使用srvctl来手动启动和停止组件.

在你使用srvctl停止一个组件,如果出现故障oracle restart不会自动重启这个组件.如果你使用srvctl启动这个组件,那么这个组件对于自动重启又再次可以使用.

oracle工具象SQL*Plus,监听控制工具(LSNRCTL)和ASMCMD都被集成到oracle restart中.如果使用SQL*Plus关闭数据库,oracle restart不会把数据库看作是故障不会试图重新启动数据库.类似地如果你使用SQL*Plus或ASMCMD关闭oracle asm实例,oracle restart不会试图重启它.

使用srvctl启动一个组件和使用SQL*Plus(或者其它工具)启动有以下重要的不同:
.当你使用srvctl启动一个组件时,这个组件所依赖的任何组件都会首先以合理的顺序自动启动.

.当你使用SQL*Plus(或其它工具)启动一个组件该组件所依赖的其它组件是不会自动启动的,你必须确保它所依赖的组件已经被启动.

另外通过在指定的oracle home目录中oracle restart使用单个命令能够让你启动和停止所有的组件.这个oracle home目录可以是一个数据库home目录或者oracle grid infrastructure home目录.这个功能在打补丁时是非常有用的.

关于启动和停止oracle restart
crsctl工具用来启动和停止oracle restart.也可以使用crsctl工具来启用或禁用oracle高可用服务.oracle restart使用高可用服务来自动启动和停止由oracle restart管理的组件.例如,oracle高可用服务守护进程会自动启动数据库,监听和oracle asm实例.当oracle高可用服务被禁用时,当一个节点被重启时不会有通过oracle restart来管理的组件被自动启动.

通常来说在oracle安装时当要停止所有运行的oracle软件时可以使用crsctl工具.例如,录正在打补丁或者执行操作系统维护操作时可能需要停止oracle restart.当维护操作完成后可以使用crsctl工具启动oracle restart.

oracle restart配置
oracle restart维护了一个由它管理的所有oracle组件的一个组件列表和每一个组件的配置信息.所有这些配置信息是一个集合被称作oracle restart配置.当oracle restart启动一个组件时它将根据这个组件的配置信息来启动这个组件.例如,oracle restart配置包含数据库的一个本地服务器参数文件(spfile)和监听程序的监听端口.

如果你先安装oracle restart然后再使用DBCA创建数据库那么DBCA会自动将数据库添加到oracle restart配置中.当DBCA启动 数据库时,在数据库和其它组件之间要求的依赖关系(例如存储数据的磁盘组)会被创建,oracle restart将开始管理数据库.

可以使用srvctl命令来向oracle restart配置中手动增加或删除组件.例如,如果你在运行数据库的主机上安装了oracle restart 可以使用srvctl来向oracle restart配置增加一个数据库.当你手动向oracle restart配置中增加一个组件后可以使用srvctl 来启动它.oracle restart就会开始管理这个组件当有需要时重启这个组件.

注意:向oracle restart配置增加一个组件也可以称作使用oracle restart注册一个组件

其它的srvctl命令可以用来查看oracle restart管理组件的状态和配置信息,如临时禁用和重新启用组件管理等等.

当安装oracle restart后许多创建oracle组件的操作会自动将组件增加到oracle restart配置中.

表:创建操作和oracle restart配置

---------------------------------------------------------------------------------------------------------
创建操作                                                     创建组件并自动增加到oracle restart配置中?
---------------------------------------------------------------------------------------------------------
使用OUI或DBCA创建数据库                                          yes

使用create database语句创建数据库                                no

使用OUI,DBCA或ASMCA创建oracle asm实例                            yes

使用任何方法创建磁盘组                                           yes

使用netca添加一个监听                                            yes

使用srvctl创建一个数据库服务                                     yes

通过修改service_name初始化参数创建一个数据库服务                 no

使用dbms_service.create_service创建一个数据库服务                no

创建一个备份数据库                                               no
---------------------------------------------------------------------------------------------------------

下在的表格列出了一些delete/drop/remove操作是否会自动从oracle restart配置中删除组件
表: Delete/Drop/Remove Operations and the Oracle Restart Configuration

---------------------------------------------------------------------------------------------------------
操作                                                                自动从oracle restart配置中删除组件?
---------------------------------------------------------------------------------------------------------
使用DBCA删除一个数据库                                               yes

使用操作系统命令删除数据文件来删除数据库                             no

使用netca删除监听                                                    yes

使用任何方法来删除一个磁盘组                                         yes

使用srvctl删除数据库服务                                             yes

通过其它方法来删除数据库服务                                         no
---------------------------------------------------------------------------------------------------------

配置oracle restart
如果对单机环境通过安装oracle grid infrastructure安装了oracle restart然后再创建数据库,数据库会自动被增加到oracle restart配置中,然后在需要时自动重启.然而如果在创建数据库之后才安装oracle restart,那么就需要手动向oracle restart配置中增加数据库,监听,oracle asm管理实例,和其它要用的组件.

在配置oracle restart来管理数据库后能够做以下事情:
.向oracle restart配置中增加组件

.从oracle restart配置中删除组件

.临时暂停oracle restart对一个或多个组件管理

.对单个组件修改oracle restart的配置选项.

准备运行srvctl
要确保从正确的oracle home目录中运行srvctl,且使用正确的用户登录主机.表4-6列出了使用srvctl能配置的组件列表.对于每一个组件列出了运行srvctl所要求的oracle home目录.

表: 判断从哪个oracle home目录中运行srvctl

-------------------------------------------------------------------------------------------------------------
被配置的组件                                      运行srvctl的oracle home目录
-------------------------------------------------------------------------------------------------------------
database,database service                         database home
oracle asm instance,disk group,                   oracle grid infrastructure home
listener,ONS
-------------------------------------------------------------------------------------------------------------
假设监听不是从oracle grid infrastructure home目录中启动的.如果你对一个存在的数据库安装oracle restart,那么监听可能要从database home目录中启动,在这种情况下从database home目录中运行srvctl

为了运行srvctl
1.判断应该从哪个oracle home目录运行srvctl

2.如果打算运行srvctl命令来修改oracle restart配置(add,remove,enable,disable等等),那么可以按以下步骤来操作:
.在unix和linux中,使用安装你所判断运行srvctl命令的oracle home目录用户登录到数据库所在主机

.在windows上使用管理员登录系统
否则使用任何用户登录到系统

3.打开命令窗口输入要使用的srvctl命令.为了输入命令,要确保在path环境变理中设置了srvctl程序.否则要输入srvctl程序
的完全路径.


获取srvctl帮助
srvctl工具的联机帮助文档是可用的:
为了获取srvctl的帮助:
1.准备运行srvctl

2.输入以下命令:
srvctl

为了获取更详细的帮助输入以下命令:
srvctl -h

为了获取特定命令的帮助输入以下命令:
srvctl command -h

例如为了获取每一个组件类型的不同选项和add命令的帮助信息输入:
srvctl add -h

为了获取特定组件的组件类型的特定命令输入:
srvctl command object -h

为了获取关于增加一个数据库服务的帮助信息输入以下命令:
srvctl add service -h

向oracle restart配置中增加组件
在大多数情况下,在正在运行oracle restart的主机上创建一个oracle组件会自动向oracle restart配置中增加这个组件

下面是你要使用srvctl手动向oracle restart配置增加组件的情况:
.在创建数据库之后才安装oracle restart

.在相同主机上使用create database语句创建另外的数据库.

.使用dbms_service.create_service过程创建一个数据库服务

注意:向oracle restart配置中增加一个组件也叫作使用oracle restart注册一个组件

向oracle restart配置中增加组件后不会启动这个组件.必须使用srvctl start命令来启动它.

你也可以使用oracle企业管理数据库控制台来向oracle restart配置增加一个数据库或监听.

注意:当你手动向oracle restart配置增加一个数据库时,必须将oracle grid infrastructure software的所有者(用户)
加到数据库的osdba组中.这是因为grid infrastructure组件必须能够以sysdba角色连接到数据库启动和停止数据库.

例如,如果安装grid infrastructure软件的用户是grid,数据库的osdba组是dba,那么用户grid必须是dba组的一员.

使用srvctl增加组件
当使用srvctl向oracle restart配置中增加一个组件时,你能对这个组件指定配置选项.
1.准备运行srvctl的环境

2.输入下面的命令:
srvctl add object options
这里的object是一个组件.

增加一个数据库
这个例子使用db_unique_name=jycs来增加一个数据库组件.这个强制的-o选项用来指定oracle home目录的位置
oracle@jyrac1 ~]$ srvctl add database -d jycs -o /u01/app/oracle/11.2.0/db


增加一个数据库服务
对于db_unique_name=jycs的数据库创建一个新的数据库服务名jytest并将这个数据库服务增加到oracle restart配置中
[oracle@jyrac1 ~]$ srvctl add service -d jycs -s jytest

增加缺省的监听程序
向oracle restart配置中增加一个缺省的监听程序:(注意增加监听程序时要使用grid_home目录
那么在添加监听的时候应该指定GI_HOME,而非ORACLE_HOME)
[grid@jyrac1 ~]$ srvctl add listener -o /grid/11.2.0/grid/

现在来验证数据库会不会在主机重启时自动启动

[root@jyrac1 ~]# reboot
Broadcast message from root (pts/2) (Wed Jun  4 10:30:32 2014):

The system is going down for reboot NOW!

在主机重启之后通过下面的命令来检查发现数据库和监听程序也自动启动了
[root@jyrac1 ~]# ps -ef | grep pmon
oracle    3451     1  0 10:32 ?        00:00:00 ora_pmon_jycs
root      3563  3530  0 10:32 pts/1    00:00:00 grep pmon
[root@jyrac1 ~]# ps -ef | grep tns
grid      3438     1  0 10:32 ?        00:00:00 /grid/11.2.0/grid/bin/tnslsnr LISTENER -inherit
root      3565  3530  0 10:33 pts/1    00:00:00 grep tns

[grid@jyrac1 ~]$ crs_stat -t
Name           Type           Target    State     Host
------------------------------------------------------------
ora....ER.lsnr ora....er.type ONLINE    ONLINE    jyrac1
ora.cssd       ora.cssd.type  OFFLINE   OFFLINE
ora.diskmon    ora....on.type OFFLINE   OFFLINE
ora.jycs.db    ora....se.type ONLINE    ONLINE    jyrac1

从oracle restart配置中删除组件
当使用oracle推荐的方法来删除一个组件时这个组件会自动从oracle restart配置中删除.例如,如果使用DBCA来删除一个数据库,
DBCA会从oracle restart配置中删除数据库.同样的如果使用netca来删除监听,netca会从oracle restart配置中删除监听.

如果使用非建议的或手动删除方法来删除组件,必须首先使用srvctl从oracle restart配置中删除组件.不这样做可能会出现错误

从oracle restart配置中删除一个组件:
srvctl remove object [options]

例如下面删除一个db_unique_name为dbcrm的数据库
srvctl remove database -d dbcrm

对一个组件禁用或启用oracle restart配置
可以临时对一个组件禁用oracle restart配置.一种原因就是当对组件执行维护任务时.例如,如果一个组件必须被修复,那么可能想让它在出现故障或者主机重启时不自动启动.

当维护任务完成后可以重新对组件启用管理

当禁用一个组件时:
.它将不再自动重启
.通过依赖组件它将不再自动启动
.使用srvctl不能启动
.任何依赖于这个资源的组件不再自动启动或者自动重启

禁用或启动一个组件的自动重启执行以下操作之一:
.禁用一个组件输入以下命令:
srvctl disable object [options]

启动一个组件输入以下命令:
srvctl enable object [options]

例如:对一个db_unique_name为dbcrm的数据库禁用自动重启
srvctl disable database -d dbcrm

对一个asm磁盘组名为recovery的磁盘组禁用自动重启
srvctl disable diskgroup -g recovery

查看组件状态
可以使用srvctl来查看任命由oracle restart管理的组件的运行状态.对于有些组件还会显示额外的信息.

查看组件的状态:
srvctl status object [options]

例如查看db_unique_name为jycs的数据库的状态
[oracle@jyrac1 ~]$ srvctl status database -d jycs
Database is running.

查看一个组件的oracle restart配置信息
可以使用srvctl来查看任何组件的oracle restart配置.oracle restart对于每种组件类型维护不同的配置信息.使用srvctl 命令
可以获得由oracle restart所管理的组件列表.

查看组件配置:
srvctl config object options

例如:查看由oracle restart所管理的所有数据库列表
[oracle@jyrac1 ~]$ srvctl config database
jycs

查看一个特定数据库的配置信息:
下面的例子查看db_unique_name为jycs的数据库的配置:
[oracle@jyrac1 ~]$ srvctl config database -d jycs
Database unique name: jycs
Database name:
Oracle home: /u01/app/oracle/11.2.0/db
Oracle user: grid
Spfile:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Disk Groups:
Services:

修改组件的oracle restart配置
可以使用srvctl来修改组件的oracle restart配置.例如可以修改当oracle重启动时的监听程序的监听端口或者在启动数据库时oracle restart所指示的服务器参数文件(SPFILE)

修改组件的oracle restart配置
srvctl modify object options

例如:对于db_unique_name为dbcrm的数据库使用下面的命令将管理策略修改为manual启动选项修改为nomount:
srvctl modify database -d dbcrm -y manual -s nomount

使用manual管理策略,当数据库主机重启时数据库不会自动重启.然而,oracle restart将会继续监控数据库如果出现故障将会重启.

[oracle@jyrac1 ~]$ srvctl modify database -h

Modifies the configuration for the database.

Usage: srvctl modify database -d [-n ] [-o ] [-u ] [-m ] [-p ] [-r {PRIMARY | PHYSICAL_STANDBY | LOGICAL_STANDBY | SNAPSHOT_STANDBY}] [-s ] [-t ] [-y {AUTOMATIC | MANUAL}] [-a ““|-z]
-d Unique name for the database
-n Database name (DB_NAME), if different from the unique name given by the -d option
-o ORACLE_HOME path
-u Oracle user
-m Domain for database. Must be set if database has DB_DOMAIN set.
-p Server parameter file path
-r Role of the database (primary, physical_standby, logical_standby, snapshot_standby)
-s Startup options for the database. Examples of startup options are open, mount, or nomount.
-t Stop options for the database. Examples of shutdown options are normal, transactional, immediate, or abort.
-y Management policy for the database (AUTOMATIC or MANUAL)
-a “” Comma separated list of disk groups
-z To remove database’s dependency upon disk groups
-h Print usage

管理oracle restart配置中的环境变量.
在oracle restart配置中可以存储环境变量的名值对.如果你通常在启动数据库之前设置环境变量(除了oracle_home和oracle_sid
之外),你可以在oracle restart配置中设置其它的环境变量.可以在下面的组件的单个配置中存储任何数量的环境变量.
.database实例
.监听
.oracle asm实例

当oracle restart启动一个组件时它首先会使用存储在组件配置中的的值来设置组件的环境变量.尽管可以通过oracle组件这种方式
来设置环境变量,这个功能主要是倾向于设置操作系统环境变量.

设置和取消环境变量
使用srvctl来对oracle restart配置中的组件来进行设置或者取消环境变量.

对组件设置或取消环境变量:
.为了设置环境变理使用以下命令:
srvctl setenv {asm|database|listener} options

从配置中删除环境变量输入以下命令:
srvctl unsetenv {asm|database|listener} options

例如设置数据库环境变量
对db_unique_name为dbcrm的数据库在oracle restart配置中设置NLS_LANG和AIX AIXTHREAD_SCOPE环境变量:
srvctl setenv database -d dbcrm -t “NLS_LANG=AMERICAN_AMERICA.AL32UTF8,AIXTHREAD_SCOPE=S”

查看环境变量
使用srvctl来查看oracle restart配置中组件的环境变量.
查看环境变量的配置:
srvctl getenv {database|listener|asm} options

例如查看数据库的所有环境变量
查看db_unique_name为dbcrm的数据库在oracle restart配置中的环境变量:
srvctl getenv database -d dbcrm
dbcrm:
NLS_LANG=AMERICAN_AMERICA
AIXTHREAD_SCOPE=S
GCONF_LOCAL_LOCKS=1

例如查看数据库的特定环境变量
查看数据库的NLS_LANG和AIXTHREAD_SCOPE环境变量:
srvctl getenv database -d dbcrm -t “NLS_LANG,AIXTHREAD_SCOPE”
dbcrm:
NLS_LANG=AMERICAN_AMERICA
AIXTHREAD_SCOPE=S

使用srvctl来创建和删除数据库服务
当使用oracle restart来管理数据库时,oracle建议使用srvctl来创建来删除数据库服务.当使用srvctl来增加一个数据库服务时,
这个服务会自动增加到oracle restart配置中,而且在服务与数据库之间的依赖关系会被建立.因此如果启动服务当数据库没有
启动时oracle restart首先会启动数据库.

当使用srvctl删除一个数据库服务时这个服务也会从oracle restart配置中删除

使用srvctl来创建一个数据库服务:
srvctl add service -d db_unique_name -s service_name [options]

例如创建一个数据库服务

对db_unique_name为dbcrm的数据库创建一个名叫crmbatch的数据库服务名

srvctl add service -d dbcrm -s crmbatch

例如创建一个基于角色的数据库服务
创建一个名叫crmbatch的数据库服务并指定它的data guard角色为physical_standby.只有dbcrm数据库的当前角色为物理备库时
这个服务才会自动启动.

srvctl add service -d dbcrm -s crmbatch -l PHYSICAL_STANDBY

使用srvctl删除数据库服务:
srvctl remove service -d db_unique_name -s service_name [-f]

数据库服务将会从oracle restart配置中被删除掉.如果-f强制标示出现即使服务正在运行也会被删除.如果没有-f标示如果服务
正在运行会报错.

与oracle restart相关的crsctl命令

crsctl命令的语法如下:
crsctl command has
这里command是start,stop或enable,disable等命令的简称.而has对象是指示oracle高可用服务.

check显示oracle restart的状态.
[grid@jyrac1 ~]$ crsctl check has
CRS-4638: Oracle High Availability Services is online

config显示oracle restart配置
CRS-4622: Oracle High Availability Services autostart is enabled.

disable禁用oracle restart的自动重启
[grid@jyrac1 ~]$crsctl disable has

enable启用oracle restart的自动重启
[grid@jyrac1 ~]$crsctl enable has

start启动oracle restart
[grid@jyrac1 ~]$crsctl start has

stop停止oracle restart
[grid@jyrac1 ~]$crsctl stop has [-f]

-f选项:如果任何由oracle restart管理的资源仍然在运行.然后试图停止这些资源.如果资源不能被停止那么试图强制停止.

个人觉得对于单个实例使用oracle restart与写脚本来启动也没有什么优势

oracle 9i删除public用户造成数据字典损坏所有sql语句不能操作的故障处理

操作系统sun,oracle 9.2.0.8.一开始维护人员新建一个用户只授予connect权限.用新建用户登录后发现能查询生产用户的数据.然后从dba_sys_privs视图将public用户给删除了.然后应用程序执行sql语句就报ORA-06553:PLS-213:Standard包不可访问的问题,解决这个问题的方法是执行catalog.sql和catproc.sql重建数据字典.
SQL>sqlplus /nolog
SQL> conn sys/密码 as sysdba
SQL>@$ORACLE_HOME/rdbms/admin/catalog.sql
SQL>@$ORACLE_HOME/rdbms/admin/catproc.sql
SQL>@$ORACLE_HOME/rdbms/admin/dbmsutil.sql
SQL>alter package standard compile
SQL>alter package dbms_standard compile
ORA-04020: deadlock detected while trying to lock object SYS.CDC_ALTER_CTABLE_BEFORE
在执行alter package dbms_standard compile语句时出错了

在MOS上有一篇关于oracle 9.2.0.8中关于ORA-04020错误的bug,信息如下:
Researching the issue on ora-4020 and SYS.CDC_CREATE_CTABLE_BEFORE lead to BUG 3228083 which was
experiencing similar problems on the same object. This bug was closed as a duplicate of bug 3017048.
Internal BUG:3228083 – Appsst10g:R8:Utlrcmp Error: Ora-04045: Sys.Cdc_Create_Ctable_Before

解决方法, 用spfile 创建pfile, 在pfile里添加如下内容,然后用修改之后的pfile启动数据库,在执行脚本。
_system_trig_enabled=false
aq_tm_processes=0
job_queue_processes=0
脚本执行完后,在去掉这些参数,正常启动数据库即可

在成功执行alter package dbms_standard compile语句后再执行下面的脚本来编译无效对象:
SQL>@$ORACLE_HOME/rdbms/admin/utlrp.sql
然而再次遇到bug
ORA-00600: internal error code, arguments: [4412], [0x8BAA483C], [0x0], [], [], [], [], []

在mos上ORA-00600 [4406] or ORA-00600 [4412] in alert Log (文档 ID 742118.1)是关于这个bug的描述
In this Document
Symptoms
Cause
Solution
References
APPLIES TO:

Oracle Server – Enterprise Edition – Version 9.2.0.1 to 9.2.0.8 [Release 9.2]
Information in this document applies to any platform.
***Checked for relevance on 10-Aug-2012***
SYMPTOMS

On Oracle 9i, the following errors could be reported in the alert log

ORA-00600: internal error code, arguments: [4412], [0x8BAA483C], [0x0], [], [], [], [], []
ORA-00600: internal error code, arguments: [4406], [0x8BAA483C], [0x0], [], [], [], [], []

The Call Stack should look something like:

ktcrcm ktcsod kssdch_stage ksuxds ksudel opilof opiodr ttcpip opitsk opiino opiodr opidrv sou2o

CAUSE

Unpublished Bug 2628920 ORA-600 [4412] AND [4406] WHEN EXITING SESSION AFTER CANCELLING DELETESCHEMA.

The bug explains that the problem may occur when the user terminates or cancels a ‘Delete schema’ operation using CTRL + C for example. The function opilof in the Call Stack above is an indication that the error is only seen at session log off.

SOLUTION

1. Upgrade to 10g where the bug is fixed.

OR

2. Ignore the error as it is completely harmless, the error is generated at session log off.

Note that in some cases the errors have also been encountered on Oracle 10.2 releases. These may be related to a different bug, but remain harmless.
REFERENCES

@ BUG:2628920 – ORA-600:[4412] AND [4406] WHEN EXITING SESSION AFTER CANCELLING DELETESCHEMA

解决方法是升级到oracle 10g.这里选择手工对无效对象进行编译.

诊断oracle high version count(高版本游标)问题

什么是high version cursor(高版本游标)?
对于一个特定的游标有多少个版本就属于高版本游标是没有明确定义的.对于不同的系统有不同的数量界定.然而在awr报告中对于一个父游标超过20个子游标个数时就会被报告出来
1

然而当一个游标的版本数据达到成百上千,那么这些绝对是高版本游标.所以要检查这些sql有高版本的原因要尽量使用这些sql能够被共享.

什么是共享sql?
首先要记住的是所有sql语句都是式共享的.当一个sql语句被输入时,oracle将会对一个语句的文本创建一个hash value,oracle将使用这个hash value很容易地在共享池中查找是否已经存在有相同hash value的sql存在.

例如:select count*) from emp语句有一个hash value为 4085390015
那么oracle就会对这个sql语句创建一个父游标和一个子游标.如果一个sql语句永远也不会被共享也没关系-当它第一次被解析时会创建一个父游标和一个子游标.可以简单地认为这个父游标代表这个hash value,子游标代表sql的元数据.

什么是元数据?
元数据是能让sql语句运行的所有信息.例如,在上面的例子中给定的emp表属于scott用户,因此它有一个object_id来指示这个emp表.当scott用户登录时,对于运行这个语句的会话优化器参数会被初始化,所以优化器的使用也属于元数据.

当scott用户重新登录后运行相同的命令(相同的sql语句),这时在共享池中已经存在相同的sql,(但是我们是不知道的),将对这个sql生成hash value并且在共享池搜索这个hash value.如果找到这个hash value,就会通过子游标来进行搜索来判断是否存在子游标可以被重用(元数据相同).如果是那么就可以共享这个sql语句.

现在在共享池中这个sql语句只有一个子游标,因为元数据相同能让我们使用已经存在的子游标来共享sql语句.父游标不是判断能不能共享的基础子游标才能决定是否共享.

现在如果另一个用户test也有一个emp表.如果这个用户也运行上面的查询语句将会发生什么:
1. 会对这个语句创建一个hash value.它的hash value为4085390015
2. 这个sql在共享池中被找到
3. 搜索子游标(在这时已经有一个子游标了)
4. 因为test用户的emp表的object_id与scott用户的emp表的object_id是不同的所以会有一个’mismatch’
(本质上这里会依次搜索子游标链表,使用所有的子游标与当前sql的元数据进行比较.如果已经搜索了100个子游标直到找到一个可以共享的子游标为止.如果没有找到可以共享的子游标那么就会重新创建一个子游标

5. 因此创建一个新的子游标所以现在有1个父游标和2个子游标.

为什么要关注high version cursor(高版本游标)
可以共享但没有被共享的sql和合成版本的sql是造成library cache竞争的主要原因.竞争会降低数据库的性能.在极端情况下会使用数据库hang住.当一个游标有太多个不必要的版本时,每次游标被执行时,这个解析引擎为了找到你所想要的游标不得不搜索整个游标链表.这是非常消耗CPU资源的.

怎样查看high version cursor(高版本游标)以及为何不能被共享
一种最简单查看high version cursor(高版本游标)的方法是使用脚本High SQL Version Counts – Script to determine reason(s) (文档 ID 438755.1)
现在这个脚本的版本为 version_rpt3_23.sql
下载这个脚本后需要进行安装
SQ>conn / as sysdba
SQL>@F:\ version_rpt3_23.sql
使用方法如下:
对于10g及以后的版本来收集version超过100的所有游标

SQL> set pages 2000 lines 100
SQL> 
SQL> SELECT b.*
  2  FROM v$sqlarea a ,
  3    TABLE(version_rpt(a.sql_id)) b
  4  WHERE loaded_versions >=100;
 
COLUMN_VALUE
---------------------------------------------------------------------

根据hash value来收集version超过100的所有游标

SQL> set pages 2000 lines 100
SQL> SELECT b.*
  2  FROM v$sqlarea a ,
  3    TABLE(version_rpt(NULL,a.hash_value)) b
  4  WHERE loaded_versions>=100;
 
COLUMN_VALUE
---------------------------------------------------------------------

使用sql_id来收集游标报告

SQL> set pages 2000 lines 100
SQL> SELECT * FROM TABLE(version_rpt('g7vpupcuqd9zz'));
 
COLUMN_VALUE
--------------------------------------------------------------------------------
Note:438755.1 Version Count Report Version 3.2.3 -- Today's Date 22-4月 -14 15:44
RDBMS Version :10.2.0.4.0 Host: IBMP740-1 Instance 1 : RLZY
==================================================================
Addr: 070000066F6659E8  Hash_Value: 895920127  SQL_ID g7vpupcuqd9zz
Sharable_Mem: 135775 bytes   Parses: 110924   Execs:621954
Stmt:
0 insert into mt_fee( hospital_id,serial_no,serial_fee,stat_type,f
1 ee_batch,medi_item_type,item_code,item_name,his_item_code,his_it
2 em_name,serial_apply,fee_date,model,factory,standard,unit,price,
3 dosage,money,reduce_money,usage_flag,usage_days,opp_serial_fee,i
4 nput_staff,input_man,input_date,calc_flag,frozen_flag,frozen_ser
5 ial_fee,trans_date,recipe_no,hos_serial,doctor_no,doctor_name,au
6 dit_flag,trans_flag,defray_type ) values ( :1,:2,:3,:4,:5,:6,:7,
7 :8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:2
8 4,:25,:26,:27,:28,:29,:30,:31,:32,:33,:34,:35,:36,:37)
9
Versions Summary
----------------
AUTH_CHECK_MISMATCH :1
BIND_MISMATCH :13
TRANSLATION_MISMATCH :1
ROLL_INVALID_MISMATCH :3
Total Versions:12
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cursor_sharing = exact
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Plan Hash Value Summary
-----------------------
Plan Hash Value Count
=============== =====
              0 8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Details for AUTH_CHECK_MISMATCH :
  # of Ver PARSING_USER_ID PARSING_SCHEMA_ID PARSING_SCHEMA_NAME
========== =============== ================= ===================
         8              211               211 INSUR_CHANGDE
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Details for BIND_MISMATCH :
Consolidated details for BIND* columns:
BIND_MISMATCH,USER_BIND_PEEK_MISMATCH,BIND_UACS_DIFF,BIND_LENGTH_UPGRADEABLE,etc
BIND_EQUIV_FAILURE (Mislabled as ROW_LEVEL_SEC_MISMATCH BY bug 6964441 in 11gR1)
from v$sql_bind_capture
COUNT(*) POSITION MIN(MAX_LENGTH) MAX(MAX_LENGTH) DATATYPE BIND GRADUATION (PREC
======== ======== =============== =============== ======== =============== =====
      13        1              32              32        1     No           (,)
      13        2              32              32        1     No           (,)
      13        3              32              32        1     No           (,)
      13        4              32              32        1     No           (,)
      13        5              32              32        1     No           (,)
      13        6              32              32        1     No           (,)
      13        7              32              32        1     No           (,)
      13        8              32             128        1     Yes          (,)
      13        9              32             128        1     Yes          (,)
      13       10              32             128        1     Yes          (,)
      13       11              32              32        1     No           (,)
      13       12              11              11      180     No           (,)
      13       13              32              32        1     No           (,)
      13       14              32             128        1     Yes          (,)
      13       15              32             128        1     Yes          (,)
      13       16              32             128        1     Yes          (,)
       9       17              32             128        1     Yes          (,)
       4       17              22              22        2     No           (,)
      13       18              32             128        1     Yes          (,)
      13       19              32              32        1     No           (,)
      13       20              32              32        1     No           (,)
      13       21              32              32        1     No           (,)
      13       22              32              32        1     No           (,)
      13       23              32              32        1     No           (,)
      13       24              32              32        1     No           (,)
      13       25              32              32        1     No           (,)
      13       26              11              11      180     No           (,)
      13       27              32              32        1     No           (,)
      13       28              32              32        1     No           (,)
      13       29              32              32        1     No           (,)
      13       30               7               7       12     No           (,)
      13       31              32              32        1     No           (,)
      13       32              32             128        1     Yes          (,)
      13       33              32              32        1     No           (,)
      13       34              32              32        1     No           (,)
      13       35              32              32        1     No           (,)
      13       36              32              32        1     No           (,)
      13       37              32              32        1     No           (,)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Details for TRANSLATION_MISMATCH :
No objects in the plans with same name and different owner were found.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Details for ROLL_INVALID_MISMATCH :
No details available
####
To further debug Ask Oracle Support for the appropiate level LLL.
alter session set events
 'immediate trace name cursortrace address 895920127, level LLL';
To turn it off do use address 1, level 2147483648
================================================================

如果不能使用这个脚本可以使用下面的方法从基本视图中来查询相同的信息
下面使用scott用户来运行select count(*) from emp 语句,并运行下面的查询来查看这个语句的父游标和它的hash value和address

SQL>select sql_text, hash_value,address from v$sqlarea where sql_text like 'select count(*) from emp%'; 

SQL_TEXT                 HASH_VALUE    ADDRESS 
------------------------ ------------ ---------------- 
select count(*) from emp 4085390015   0000000386BC2E58

为了查看子游标:
对于oracle 9.2.x.x及以下版本
SQL>select * from v$sql_shared_cursor where kglhdpar = ‘0000000386BC2E58’;
对于oracle 10.0.x.x及以上版本
SQL> select * from v$sql_shared_cursor where address = ‘0000000386BC2E58’;
对于oracle 9.2.x.x及以下版本查询的输出如下:

ADDRESS          KGLHDPAR         U S O O S L S E B P I S T A B D L T R I I R L I O S M U T N F 
---------------- ---------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
0000000386BC2D08 0000000386BC2E58 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N 

可以看到有一个子游标(address: 0000000386BC2D080).mismatch信息都为N因为这是第一个子游标.如果另一个用户运行相同的语句(select count(*) from emp)再次执行上面查询输出如下:

ADDRESS          KGLHDPAR         U S O O S L S E B P I S T A B D L T R I I R L I O S M U T N F 
---------------- ---------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
0000000386BC2D08 0000000386BC2E58 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N 
0000000386A91AA0 0000000386BC2E58 N N N N N N N N N N N N N Y N N N Y N N N N N N N N N N N N N 

现在可以看到第二个子游标(address: 0000000386A91AA0)且为什么与第一个子游标不能共享(‘Y’表示不匹配).原因如下:
(1) AUTH_CHECK_MISMATCH and (2) TRANSLATION_MISMATCH
这是因为新用户下的emp对象与scott用户下的emp对象不匹配.当不能访问scott用户的对象时且因为在每个用户方案下有一个emp对象而object_id不同所以翻译失败发生了一次mismatch.

在v$SQL_SHARED_CURSOR中给出了不能共享游标的原因
下面介绍一些游标不能共享的原因:
.UNBOUND_CURSOR–现有的子游标没有完全创建(换句话说不能被优化)
.SQL_TYPE_MISMATCH—sql类型与现有的子游标不匹配
.OPTIMIZER_MISMATCH—优化器环境与现有的子游标不匹配
例如:
SQL>select count(*) from emp; ->> 1 PARENT, 1 CHILD
SQL>alter session set optimizer_mode=ALL_ROWS
SQL>select count(*) from emp; ->> 1 PARENT, 2 CHILDREN
因为 optimizer_mode被改变,因为现有的子游标不能被共享
如果使用10046跟踪事件将会得到optimizer_mismatch和第三个子游标
使用cursortrace将会看到更详细的原因比如:
Optimizer mismatch(12)
其中括号内的数字给出了原因

1 = Degree used is not the default DOP
2 = In (RAC) cases where instance count is not the same, or session CPU count is not the same, or thread count is not the same
3 =  _parallel_syspls_obey_force is FALSE
4 = The PQ mode does not match.
5 = The degree does not match.
6 = The parallel degree policy does not match.
7 = The session limit is not the same as the cursor limit but the cursor limit is the same as the degree used.
8 = The cursor limit is greater than the degree used and the session limit is less than the cursor limit
9 = The cursor limit is less than the degree used and the session limit is not the same as the cursor limit
10 = Optimizer mode difference
11 =  Materialized View mismatch
12 = Optimizer environment mismatch (ie an optimizer parameter is different)
13 = Cardinality Feedback is use
.OUTLINE_MISMATCH—The outlines do not match the existing child cursor 

If my user had created stored outlines previously for this command and they were stored in seperate categories (say "OUTLINES1" and "OUTLINES2") running:-
SQL>alter session set use_stored_outlines = OUTLINES1; 
SQL>select count(*) from emp; 
SQL>alter session set use_stored_oulines= OUTLINES2; 
SQL>select count(*) from emp;

.STATS_ROW_MISMATCH—The existing statistics do not match the existing child cursor. Check that 10046/sql_trace is not set on all sessions as this can cause this.
.LITERAL_MISMATCH—Non-data literal values do not match the existing child cursor
.SEC_DEPTH_MISMATCH—Security level does not match the existing child cursor
.EXPLAIN_PLAN_CURSOR—The child cursor is an explain plan cursor and should not be shared. Explain plan statements will generate a new child by default - the mismatch will be this
.BUFFERED_DML_MISMATCH—Buffered DML does not match the existing child cursor
.PDML_ENV_MISMATCH—PDML environment does not match the existing child cursor
.INST_DRTLD_MISMATCH—Insert direct load does not match the existing child cursor
.SLAVE_QC_MISMATCH—The existing child cursor is a slave cursor and the new one was issued by the coordinator (or, the existing child cursor was issued by the coordinator and the new one is a slave cursor).
.TYPECHECK_MISMATCH—The existing child cursor is not fully optimized
.AUTH_CHECK_MISMATCH— Authorization/translation check failed for the existing child cursor 
The user does not have permission to access the object in any previous version of the cursor. A typical example would be where each user has it's own copy of a table
.BIND_MISMATCH—The bind metadata does not match the existing child cursor. For example:
SQL>variable a varchar2(100); 
SQL>select count(*) from emp where ename = :a ->> 1 PARENT, 1 CHILD 
SQL>variable a varchar2(400); 
SQL>select count(*) from emp where ename = :a ->> 1 PARENT, 2 CHILDREN 

.DESCRIBE_MISMATCH—The typecheck heap is not present during the describe for the child cursor
.LANGUAGE_MISMATCH—The language handle does not match the existing child cursor
.TRANSLATION_MISMATCH—The base objects of the existing child cursor do not match. 
The definition of the object does not match any current version. Usually this is indicative of the same issue as "AUTH_CHECK_MISMATCH" where the object is different.
.ROW_LEVEL_SEC_MISMATCH—The row level security policies do not match
.INSUFF_PRIVS— Insufficient privileges on objects referenced by the existing child cursor
.INSUFF_PRIVS_REM-- Insufficient privileges on remote objects referenced by the existing child cursor
.REMOTE_TRANS_MISMATCH—The remote base objects of the existing child cursor do not match  
USER1: select count(*) from table@remote_db 
USER2: select count(*) from table@remote_db 

  (Although the SQL is identical, the dblink pointed to 
   by remote_db may be a private dblink which resolves 
   to a different object altogether)
.LOGMINER_SESSION_MISMATCH
.INCOMP_LTRL_MISMATCH
.OVERLAP_TIME_MISMATCH—error_on_overlap_time_msimatch
.SQL_REDIRECT_MISMATCH—sql redirection mismatch
.MV_QUERY_GEN_MISMATCH—materialized view query generation
.USER_BIND_PEEK_MISMATCH—user bind peek mismatch
.TYPCHK_DEP_MISMATCH—cursor has typecheck dependencies
.NO_TRIGGER_MISMATCH— no trigger mismatch
.FLASHBACK_CURSOR—No cursor sharing for flashback
.ANYDATA_TRANSFORMATION - anydata transformation change
.INCOMPLETE_CURSOR - incomplete cursor.
When bind length is upgradeable (i.e. we found a child cursor that matches everything
else except that the bind length is not long enough), we mark the old cursor is not usable
and build a new one.  This means the version can be ignored.
.TOP_LEVEL_RPI_CURSOR - top level/rpi cursor 
In a Parallel Query invocation this is expected behaviour (we purposely do not share)
.DIFFERENT_LONG_LENGTH - different long length
.LOGICAL_STANDBY_APPLY - logical standby apply mismatch
.DIFF_CALL_DURN - different call duration
.BIND_UACS_DIFF - bind uacs mismatch
.PLSQL_CMP_SWITCHS_DIFF - plsql compiler switches mismatch
.CURSOR_PARTS_MISMATCH - cursor-parts executed mismatch
.STB_OBJECT_MISMATCH - STB object different (now exists)
.ROW_SHIP_MISMATCH - row shipping capability mismatch
.PQ_SLAVE_MISMATCH - PQ slave mismatch 
Check you want to be using PX with this reason code, as the problem could be caused by running lots of small SQL statements which do not really need PX. If you are on < 11i you may be hitting Bug:4367986
.TOP_LEVEL_DDL_MISMATCH - top-level DDL cursor
.MULTI_PX_MISMATCH - multi-px and slave-compiled cursor
.BIND_PEEKED_PQ_MISMATCH - bind-peeked PQ cursor
.MV_REWRITE_MISMATCH - MV rewrite cursor
.ROLL_INVALID_MISMATCH - rolling invalidation window exceeded
.OPTIMIZER_MODE_MISMATCH - optimizer mode mismatch
.PX_MISMATCH - parallel query mismatch 
If running 11.1.0.6 and RAC see Bug:7352775. Check that if (on each instance) parallel_instance_groups is set then instance_groups is set to the same.
.MV_STALEOBJ_MISMATCH - mv stale object mismatch
.FLASHBACK_TABLE_MISMATCH - flashback table mismatch
.LITREP_COMP_MISMATCH - literal replacement compilation mismatch 
New in 11g :
PLSQL_DEBUG - debug mismatch Session has debugging parameter plsql_debug set to true
.LOAD_OPTIMIZER_STATS  - Load optimizer stats for cursor sharing
.ACL_MISMATCH   -  Check ACL mismatch
.FLASHBACK_ARCHIVE_MISMATCH  - Flashback archive mismatch
.LOCK_USER_SCHEMA_FAILED  - Failed to lock user and schema
.REMOTE_MAPPING_MISMATCH  - Remote mapping mismatch
.LOAD_RUNTIME_HEAP_FAILED  - Runtime heap mismatch
.HASH_MATCH_FAILED  - Hash mismatch
Set to "Y" if sharing fails due to a hash mismatch, such as the case with mismatched histogram data or a range predicate marked as unsafe by literal replacement (See Bug 3461251)
New in 11.2  :
PURGED_CURSOR - cursor marked for purging
         The cursor has been marked for purging with dbms_shared_pool.purge

.BIND_LENGTH_UPGRADEABLE - bind length upgradeable
          Could not be shared because a bind variable size was smaller than the new value beiing inserted    (marked as BIND_MISMATCH in earlier versions).

.USE_FEEDBACK_STATS - cardinality feedback
         Cardinality feedback is being used and therefore a new plan could be formed for the current execution.

.BIND_EQUIV_FAILURE - The bind value's selectivity does not match that used to optimize the existing child cursor. When adaptive cursor sharing is used and the cursor is bind aware, then if the selectivity is outside of the current ranges and a new plan is desirable then a new child is raised with this as the reason code for non-sharing of the previous plan. For an example, see Document 836256.1. After each execution in the example, run:
select sql_id, address, child_address, child_number, BIND_EQUIV_FAILURE from v$sql_shared_cursor where sql_id='19sxt3v07nzm4';
         ... once the cursor is marked as bind aware and a second plan is seen then the following will be the resultant output:

SQL_ID         ADDRESS          CHILD_ADDRESS    CHILD_NUMBER     B
------------- ---------------- ---------------- ------------ -
19sxt3v07nzm4 000000007A1C0DE0 000000007A1BF980            0    N
19sxt3v07nzm4 000000007A1C0DE0 000000007A10DDB0            1    Y

       As can be seen, the new version is created due to BIND_EQUIV_FAILURE

There is no longer  ROW_LEVEL_SEC_MISMATCH in 11.2.

可以进一步跟踪
在oracle10g及以上版本中可以使用cursortrace来查找游标不能被共享的原因.

SQL>alter system set events 
'immediate trace name cursortrace level 577, address hash_value';

其中可以使用三个level,level 1为577,level 2为578,level 3为580
当重用这个游标时将会向user_dump_dest目录中写一个跟踪文件.
关闭cursortrace:

SQL>alter system set events 
'immediate trace name cursortrace level 2147483648, address 1';

注意在10.2.0.4以下版本存在Bug 5555371导致cursortrace无法彻底关闭的情况.最终导致其trace文件不停的增长,从而可能导致oracle文件系统被撑爆的现象

在11.2中有了cursordump可以使用如下方式进行cursor dump:

SQL>alter system set events ‘immediate trace name cursordump level 16’;

这种方式收集的信息比较全:例如它可以采集部分别的方式无法看到的px_mismatch以及它会进一步展开optimizer_mismatch的信息等

尽管使用绑定变量还是会存在high version cursor
当cursor_sharing为similar时
select /* TEST */ * from emp where sal > 100;
select /* TEST */ * from emp where sal > 101;
select /* TEST */ * from emp where sal > 102;
select /* TEST */ * from emp where sal > 103;
select /* TEST */ * from emp where sal > 104;

SELECT sql_text,version_count,address
FROM V$SQLAREA
WHERE sql_text like ‘select /* TEST */%’;

SELECT * FROM V$SQL_SHARED_CURSOR WHERE kglhdpar = ‘&my_addr’;
将会出现多个子游标
Cursor_sharing设置为similar或force都可能导致high version count可以参考:
High Version Count with CURSOR_SHARING=SIMILAR or FORCE(文档ID 261020.1)

在11g中引入的adaptive cursor sharing特性很容易导致high version count的问题
可以参考:Bug 12334286 High version count with CURSOR_SHARING=FORCE(BIND_MISMATCH and INCOMP_LTRL_MISMATCH)
Document 740052.1 Adaptive Cursor Sharing Overview
Document 7213010.8 Bug 7213010 – Adaptive cursor sharing generates lots of child cursors

Document 8491399.8 Bug 8491399 – Adaptive Cursor Sharing does not match the correct cursor version for queries using CHAR datatype

在oracle 11g中可以通过其它的一些手段限制child cursor的数量
Document 10187168.8 Enhancement to obsolete parent cursors if Version Count exceeds a threshold
引入了一个隐含参数_cursor_obsolete_threshold该参数用来限制单个parent cursor下的child cursor的数量,默认值为100.如果child cursor的数量超过这个阈值就会触发cursor obsolescence特性.这个时候parent cursor就会被丢弃并同时重新创建一个新的parent cursor.

1. If 11.2.0.3 and above, set the following parameters:
“_cursor_obsolete_threshold” to 100 (this is the number of child cursor after which we obsolete it)
2. If 11.2.0.2.2, then set:
SQL>alter system set “_cursor_features_enabled”=1026 scope=spfile;
SQL>alter system set event=’106001 trace name context forever,level 1024’ scope=spfile;

3.If 11.2.0.1:
SQL>alter system set “_cursor_features_enabled”=34 scope=spfile;
SQL>alter system set event=’106001 trace name context forever,level 1024’ scope=spfile;

oracle数据库enq: TX – allocate ITL entry性能诊断

朋友公司的某铁路集团医保系统出现性能问题业务不能正常办理,下面是出现性能问题时的awr报告
1

2

3

4

从等待事件来看主要是出现了多处锁竞争.其中enq: TX – allocate ITL entry等待事件是由于缺省情况下创建的表的INITRANS参数为1,索引的INITRANS参数值为2.当有太多的并发DML操作同时操作相同的数据块或索引块就会出现这个等待事件,可以通过查看Segments by ITL Waits部分的信息来了解出现大量并发DML操作的对象
5

从下面的信息可以看出消耗时间最长的语句都是数据更新操作
6

Enq:TX – row lock contention 等待事件,主要是由于要修改的记录已经被其它会话所持有排他锁产生的.通过查看Segments by Row Lock Waits信息可以看出主要是由sys_serial表产生的.
7
这是一个手工维护各业务表的主键序列的表.而不是选择由序列生成器来生成主键造成的.语句为
select cur_num_no from SYS_SERIAL where serial_type=:”SYS_B_0″ for update
8

由上面的信息可知产生enq: TX – allocate ITL entry 和Enq:TX – row lock contention等待的主要对象是:
表:
KC19
KC21
KC40
KCE1
KC24
kcd9
kcd4
索引:
PK_KC24
IDX_KC40
PK_KC19
IDX_KC21
PK_KCE1
PK_KC21

知道主要原因了就有解决方法:
对于enq: TX – allocate ITL entry等待事件对主要竞争对象执行以下语句来修改INITRANS参数值:
Alter table kc19 initrans 50;
Alter table kc21 initrans 50;
Alter table kc40 initrans 50;
Alter table kce1 initrans 50;
Alter table kc24 initrans 50;
Alter table kcd9 initrans 50;
Alter table kcd4 initrans 50;

Alter table kc19 move;
Alter table kc21 move;
Alter table kc40 move;
Alter table kce1 move;
Alter table kc24 move;
Alter table kcd9 move;
Alter table kcd4 move;

Alter index pk_kc24 rebuild initrans 50 online;
Alter index idx_kc40 rebuild initrans 50 online;
Alter index pk_kc19 rebuild initrans 50 online;
Alter index idx_kc21 rebuild initrans 50 online;
Alter index pk_kce1 rebuild initrans 50 online;
Alter index pk_kc21 rebuild initrans 50 online;
对于Enq:TX – row lock contention等待事件主要是由
select cur_num_no from SYS_SERIAL where serial_type=:”SYS_B_0″ for update
所以要解决这个问题需要修改各业表主键的生成方式不要使用上面的这种方法.

下面的图表是在执行上面的修改操作之后下午业务高峰期的awr报告如下
9

10

现在主要的就是enq: TX – row lock contention等待的这个需要修改程序结构

下面的图表是在执行上面的修改操作之后第二天上午业务高峰期8点到9点的awr报告如下
11

12

下面的图表是在执行上面的修改操作之后第二天上午业务高峰期9点到10点的awr报告如下

13

14

下面的图表是在执行上面的修改操作之后第二天上午业务高峰期10点到11点的awr报告如下
15

16

现在数据库运行较好.

问题原因有以下两个
1.由于并发更新的对象的initrans参数过小当出现大量并发插入,更新操作时出现了enq: TX – allocate ITL entry等待事件.
2.由于各业务表的主键序列值是由程序SYS_SERIAL表来维护的,每次生成主键值是都要执行
select cur_num_no from SYS_SERIAL where serial_type=:”SYS_B_0″ for update
产生了Enq:TX – row lock contention等待事件

解决方法:
1.对enq: TX – allocate ITL entry等待事件对主要竞争对象执行以下语句来TRANS参数值
2.所以要解决Enq:TX – row lock contention这个问题需要修改各业表主键的生成方式比如使用序列生成器.

oracle 11G参数文件之服务器参数文件(spfile)与实例启动的关系

在数据库启动时需要读取参数文件来分配内存区域并定位控制文件的位置,oracle数据库中的初始化参数传统上是存储在一个文本初始化参数文件中的.为了更好地管理,可以选择使用一个二进制的服务器参数文件来管理初始化参数对它的修改在数据库重启后仍然生效.下面来介绍如何使用这种方法来管理初始化参数.

什么是服务器参数文件
服务器参数文件可以被认为是一个初始化参数档案库它被存储在运行oracle数据库服务器的系统中.它被设计为服务端初始化参数文件.存储在服务器参数文件中的初始化参数是永久生效的.当实例运行时对参数的任何改变在数据库重启之后是仍然有效的.这消除了为了使alter system语句的改变永久生效而要手工修改初始化参数的需要.它也提供了对数据库服务器自动调整的基础.

一个服务器参数文件是通过使用create spfile语句从文本初始化参数文件来初始化创建.(也可以通过DBCA来直接创建).服务器参数文件是一个二进制文件不能使用文本编辑器来修改.oracle数据库提供了其它的接口来查看和修改服务器参数文件中的参数.

注意:虽然你能使用一个文本编辑器来打开一个二进制服务器参数文件但不能手工修改它.如果修改会损坏文件.你将不能重启实例,如果实例正在运行那么它会终止运行.

当执行没有pfile子句的startup命令,oracle实例会在操作系统特定的缺省位置来搜索一个服务器参数文件并从文件中读取初始化参数.如果没有找到服务器参数文件,实例将搜索一个文本初始化参数.如果服务器参数文件存在但你想使用一个文本初始化参数来覆盖那么在执行startup命令时指定pfile子句.
下面来举例说明:
1.执行不带pfile子句的startup命令,从下面的输出可以看出启动时自动搜索了服务器参数文件spfilejycs.ora

SQL> startup
ORACLE instance started.

Total System Global Area  630501376 bytes
Fixed Size                  2215984 bytes
Variable Size             385880016 bytes
Database Buffers          234881024 bytes
Redo Buffers                7524352 bytes
Database mounted.
Database opened.
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/11.2.0/db/dbs/
                                                 spfilejycs.ora

2.删除服务器参数文件spfilejycs.ora,再执行执行不带pfile子句的startup命令,从下面的输出可以看出在启动时
在搜索不到服务器参数文件时就会搜索文本初始化参数文件initjycs.ora

[oracle@jyrac1 dbs]$ mv spfilejycs.ora spfilejycs.ora.bak

SQL> startup
ORACLE instance started.

Total System Global Area  630501376 bytes
Fixed Size                  2215984 bytes
Variable Size             385880016 bytes
Database Buffers          234881024 bytes
Redo Buffers                7524352 bytes
Database mounted.
Database opened.
SQL> show parameter spfile   

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string

3.删除文本初始化参数文件initjycs.ora,再执行执行不带pfile子句的startup命令,从下面的输出可以看出在启动时
在搜索不到服务器参数文件时就会搜索文本初始化参数文件initjycs.ora,但是因为我们删除了文本初始化参数文件
initjycs.ora所以提示找不到这个文件

[oracle@jyrac1 dbs]$ mv initjycs.ora initjycs.ora.bak

SQL> startup
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/11.2.0/db/dbs/initjycs.ora'

4.执行带pfile子句的startup命令,将使用文本初始化参数文件来替代服务器参数文件,可以看到spfile参数值为空说明是使用文本初始化参数来启动的实例

SQL> startup pfile='/u01/app/oracle/11.2.0/db/dbs/initjycs.ora'
ORACLE instance started.

Total System Global Area  630501376 bytes
Fixed Size                  2215984 bytes
Variable Size             385880016 bytes
Database Buffers          234881024 bytes
Redo Buffers                7524352 bytes
Database mounted.
Database opened.
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string

迁移到服务器参数文件
如果你当前正使用一个文本初始化参数文件那么使用下面的步骤来迁移到服务器参数文件:
1.如果初始化参数文件在一个客户端系统中,那么可以使用ftp将这个文件从客户端系统传输到服务器系统.
注意:如果你从一个oracle rac环境中迁移一个服务器参数文件,你必须合并所有实例特定的初始化参数文件为一个单独的初始化参数文件.这样做是为了使用oracle rac中的所有实例共同使用一个服务器参数文件.

2.使用create spfile from pfile命令在缺省位置创建一个服务器参数文件.
这个语句将读取一个文本初始化参数来创建一个服务器参数文件.

3.启动或重启实例
这个实例将会在缺省位置查找一个新的spfile文件来启动

创建服务器参数文件
可以使用create spfile语句来创建一个服务器参数文件.必须有sysdba或sysoper系统权限来执行这个语句.
注意:当使用dbca创建数据库时它会自动的创建一服务器参数文件

create spfile语句可以在实例启动之前或之后执行.然而如果实例已经使用一个服务器参数文件启动了执行这个创建服务器参数文件的语句就会报错.

SQL> create spfile from memory;  
create spfile from memory
*
ERROR at line 1:
ORA-32002: cannot create SPFILE already being used by the instance

可以从一个存在的文本初始化参数文件或从内存来创建一个服务器参数文件(spfile).从内存来创建服务器参数文件这意味着复制初始化参数的当前值到服务器参数文件中.

下面的例子从一个文本初始化参数文件/u01/oracle/dbs/init.ora来创建服务器参数文件.在这个例子中没有指定spfile文件名所以这个被创建的文件将会使用平台特定的缺省名和位置.

SQL>CREATE SPFILE FROM PFILE='/u01/oracle/dbs/init.ora';

下面的例子在创建服务器参数文件时提供了文件名和存储的位置:

SQL>CREATE SPFILE='/u01/oracle/dbs/test_spfile.ora' FROM PFILE='/u01/oracle/dbs/test_init.ora';

下面的例子将在缺省位置将用内存中的初始化参数的当前值来创建服务器参数文件:

SQL>CREATE SPFILE FROM MEMORY;

SQL> create spfile from memory;  
create spfile from memory
*
ERROR at line 1:
ORA-32002: cannot create SPFILE already being used by the instance

SQL> create spfile from memory;

File created.

下面将用内存中的初始化参数的当前值来创建文本初始化参数文件将与用spfile文件创建的文本初始化参数文件进行比较可以明显看到从内存来创建的文件中多了以_开头的参数

SQL> create pfile from memory;

File created.

[oracle@jyrac1 dbs]$ cat initjycs.ora
jycs.__db_cache_size=234881024
jycs.__java_pool_size=4194304
jycs.__large_pool_size=4194304
jycs.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
jycs.__pga_aggregate_target=209715200
jycs.__sga_target=633339904
jycs.__shared_io_pool_size=0
jycs.__shared_pool_size=373293056
jycs.__streams_pool_size=4194304
*.audit_file_dest='/u01/app/oracle/admin/jycs/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/jycs/control01.ctl','/u01/app/oracle/flash_recovery_area/jycs/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='jycs'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4070572032
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=jycsXDB)'
*.open_cursors=300
*.pga_aggregate_target=209715200
*.processes=150
*.remote_login_passwordfile='exclusive'
*.sga_target=631242752
*.undo_tablespace='UNDOTBS1'
[oracle@jyrac1 dbs]$ cat initjycs.ora
# Oracle init.ora parameter file generated by instance jycs on 04/14/2014 10:33:22
__db_cache_size=224M
__java_pool_size=4M
__large_pool_size=4M
__oracle_base='/u01/app/oracle' # ORACLE_BASE set from environment
__pga_aggregate_target=200M
__sga_target=604M
__shared_io_pool_size=0
__shared_pool_size=356M
__streams_pool_size=4M
_aggregation_optimization_settings=0
_always_anti_join='CHOOSE'
_always_semi_join='CHOOSE'
_and_pruning_enabled=TRUE
_b_tree_bitmap_plans=TRUE
_bloom_filter_enabled=TRUE
_bloom_folding_enabled=TRUE
_bloom_pruning_enabled=TRUE
_complex_view_merging=TRUE
_compression_compatibility='11.2.0.0.0'
_connect_by_use_union_all='TRUE'
_convert_set_to_join=FALSE
_cost_equality_semi_join=TRUE
_cpu_to_io=0
_dimension_skip_null=TRUE
_eliminate_common_subexpr=TRUE
_enable_type_dep_selectivity=TRUE
_fast_full_scan_enabled=TRUE
_first_k_rows_dynamic_proration=TRUE
_gby_hash_aggregation_enabled=TRUE
_generalized_pruning_enabled=TRUE
_globalindex_pnum_filter_enabled=TRUE
_gs_anti_semi_join_allowed=TRUE
_improved_outerjoin_card=TRUE
_improved_row_length_enabled=TRUE
_index_join_enabled=TRUE
_ksb_restart_policy_times='0'
_ksb_restart_policy_times='60'
_ksb_restart_policy_times='120'
_ksb_restart_policy_times='240' # internal update to set default
_left_nested_loops_random=TRUE
_local_communication_costing_enabled=TRUE
_minimal_stats_aggregation=TRUE
_mmv_query_rewrite_enabled=TRUE
_new_initial_join_orders=TRUE
_new_sort_cost_estimate=TRUE
_nlj_batching_enabled=1
_optim_adjust_for_part_skews=TRUE
_optim_enhance_nnull_detection=TRUE
_optim_new_default_join_sel=TRUE
_optim_peek_user_binds=TRUE
_optimizer_adaptive_cursor_sharing=TRUE
_optimizer_better_inlist_costing='ALL'
_optimizer_cbqt_no_size_restriction=TRUE
_optimizer_coalesce_subqueries=TRUE
_optimizer_complex_pred_selectivity=TRUE
_optimizer_compute_index_stats=TRUE
_optimizer_connect_by_combine_sw=TRUE
_optimizer_connect_by_cost_based=TRUE
_optimizer_connect_by_elim_dups=TRUE
_optimizer_correct_sq_selectivity=TRUE
_optimizer_cost_based_transformation='LINEAR'
_optimizer_cost_hjsmj_multimatch=TRUE
_optimizer_cost_model='CHOOSE'
_optimizer_dim_subq_join_sel=TRUE
_optimizer_distinct_agg_transform=TRUE
_optimizer_distinct_elimination=TRUE
_optimizer_distinct_placement=TRUE
_optimizer_eliminate_filtering_join=TRUE
_optimizer_enable_density_improvements=TRUE
_optimizer_enable_extended_stats=TRUE
_optimizer_enhanced_filter_push=TRUE
_optimizer_extend_jppd_view_types=TRUE
_optimizer_extended_cursor_sharing='UDO'
_optimizer_extended_cursor_sharing_rel='SIMPLE'
_optimizer_extended_stats_usage_control=224
_optimizer_fast_access_pred_analysis=TRUE
_optimizer_fast_pred_transitivity=TRUE
_optimizer_filter_pred_pullup=TRUE
_optimizer_fkr_index_cost_bias=10
_optimizer_group_by_placement=TRUE
_optimizer_improve_selectivity=TRUE
_optimizer_join_elimination_enabled=TRUE
_optimizer_join_factorization=TRUE
_optimizer_join_order_control=3
_optimizer_join_sel_sanity_check=TRUE
_optimizer_max_permutations=2000
_optimizer_mode_force=TRUE
_optimizer_multi_level_push_pred=TRUE
_optimizer_native_full_outer_join='FORCE'
_optimizer_new_join_card_computation=TRUE
_optimizer_null_aware_antijoin=TRUE
_optimizer_or_expansion='DEPTH'
_optimizer_order_by_elimination_enabled=TRUE
_optimizer_outer_to_anti_enabled=TRUE
_optimizer_push_down_distinct=0
_optimizer_push_pred_cost_based=TRUE
_optimizer_rownum_bind_default=10
_optimizer_rownum_pred_based_fkr=TRUE
_optimizer_skip_scan_enabled=TRUE
_optimizer_sortmerge_join_inequality=TRUE
_optimizer_squ_bottomup=TRUE
_optimizer_star_tran_in_with_clause=TRUE
_optimizer_system_stats_usage=TRUE
_optimizer_table_expansion=TRUE
_optimizer_transitivity_retain=TRUE
_optimizer_try_st_before_jppd=TRUE
_optimizer_undo_cost_change='11.2.0.1'
_optimizer_unnest_corr_set_subq=TRUE
_optimizer_unnest_disjunctive_subq=TRUE
_optimizer_use_cbqt_star_transformation=TRUE
_optimizer_use_feedback=TRUE
_or_expand_nvl_predicate=TRUE
_ordered_nested_loop=TRUE
_parallel_broadcast_enabled=TRUE
_partition_view_enabled=TRUE
_pivot_implementation_method='CHOOSE'
_pre_rewrite_push_pred=TRUE
_pred_move_around=TRUE
_push_join_predicate=TRUE
_push_join_union_view=TRUE
_push_join_union_view2=TRUE
_px_minus_intersect=TRUE
_px_pwg_enabled=TRUE
_px_ual_serial_input=TRUE
_query_rewrite_setopgrw_enable=TRUE
_remove_aggr_subquery=TRUE
_replace_virtual_columns=TRUE
_right_outer_hash_enable=TRUE
_selfjoin_mv_duplicates=TRUE
_sql_model_unfold_forloops='RUN_TIME'
_sqltune_category_parsed='DEFAULT' # parsed sqltune_category
_subquery_pruning_enabled=TRUE
_subquery_pruning_mv_enabled=FALSE
_table_scan_cost_plus_one=TRUE
_union_rewrite_for_gs='YES_GSET_MVS'
_unnest_subquery=TRUE
_use_column_stats_for_function=TRUE
audit_file_dest='/u01/app/oracle/admin/jycs/adump'
audit_trail='DB'
compatible='11.2.0.0.0'
control_files='/u01/app/oracle/oradata/jycs/control01.ctl'
control_files='/u01/app/oracle/flash_recovery_area/jycs/control02.ctl'
core_dump_dest='/u01/app/oracle/diag/rdbms/jycs/jycs/cdump'
db_block_size=8192
db_domain=''
db_name='jycs'
db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
db_recovery_file_dest_size=3882M
diagnostic_dest='/u01/app/oracle'
dispatchers='(PROTOCOL=TCP) (SERVICE=jycsXDB)'
log_buffer=7192576 # log buffer update
open_cursors=300
optimizer_dynamic_sampling=2
optimizer_mode='ALL_ROWS'
pga_aggregate_target=200M
plsql_warnings='DISABLE:ALL' # PL/SQL warnings at init.ora
processes=150
query_rewrite_enabled='TRUE'
remote_login_passwordfile='EXCLUSIVE'
result_cache_max_size=3104K
sga_target=604M
skip_unusable_indexes=TRUE
undo_tablespace='UNDOTBS1'

如果使用缺省的spfile文件名和缺省位置或者指定一个spfile文件名和位置.如果存在一个同名的spfile文件名它将覆盖这个文件而不会有警告信息.

当从一个文本初始化参数文件创建服务器参数文件spfile时,在初始化参数文件中在相同行的特定注释会作为参数设置在spfile文件中被维护.所有其它的注释会被忽略.

oracle建议你允许数据库给spfile使用缺省名和缺省存储位置.这简化的数据库的管理.比如使用startup命令就会从缺省位置读取spfile文件.

下面的表格显示了在UNIX,Linux和Windows平台上的文本初始化参数文件pfile和服务器参数文件spfile的缺省文件名和存储位置.

PFILE and SPFILE Default Names and Locations on UNIX, LInux, and Windows
-------------------------------------------------------------------------------------------------------------
platform      pfile default name    spfile default name     pfile default location   spfile default location
-------------------------------------------------------------------------------------------------------------
unix,linux    initORACLE_SID.ora    spfileORACLE_SID.ora    ORACLE_HOME/dbs或者       不使用oracle asm:
                                                            与数据文件在同一个目录    ORACLE_HOME/dbs或者与
                                                                                      数据文件在同一个目录
                                                                                      使用oracle asm:与数据文件
                                                                                      在同一个磁盘组


windows       initORACLE_SID.ora    spfileORACLE_SID.ora    ORACLE_HOME\database      不使用oracle asm:
                                                                                      ORACLE_HOME\database
                                                                                      使用oracle asm:与数据文件
                                                                                      在同一个磁盘组

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

注意:在启动时,实例首先搜索一个名叫spfileORACLE_SID.ora的spfile文件,如果没有找到就会搜索spfile.ora文件.
使用spfile.ora能让所有的oracle rac实例使用相同的服务器参数文件.

如果spfile没找到实例将搜索文本初始化参数文件initORACLE_SID.ora.

如果你不是在缺省位置创建一个spfile文件那么你必须创建一个缺省的pfile在pfile文件的根部指示这个服务器参数文件.

当使用dbca创建数据库且使用oracle asm时,dbca将会把spfile存储在一个oracle asm磁盘组也会在pfile文件的部指示这个服务器参数文件.

spfile初始化参数
spfile初始化参数包含了当前服务器参数文件的名字.当数据库使用缺省的服务器参数文件时,也就是执行没有pfile参数的startup命令时–这个spfile的值由服务器内部指定.在SQL*Plus中执行show parameter spfile(或任何其它的方法来查询参数的值)来显示当前使用的服务器参数文件名.

改变初始化参数值
使用alter system语句来设置,修改或还原初始化参数值.如果你正使用一个文本初始化参数文件,alter system语句就只能对当前实例改变参数的值.因为没有机制可以自动更新磁盘上的文本初始化参数文件.你必须手工更新.使用服务器参数文件可以克服这个问题.

有两种类型的初始化参数文件
.动态初始化参数对于当前oracle实例是可以修改的.这种改变会立即生效.
.静态初始化参数对于当前实例是不能修改的.必须修改文本初始化参数文件或者服务器参数文件中的参数然后重新启动实例使修改生效

设置或修改初始化参数值
使用有set子句的alter system的语句来设置或修改初始化参数的值.可选scope子句用来指定修改的范围:

----------------------------------------------------------------------------------------------------
scope clause                       description
----------------------------------------------------------------------------------------------------
scope=spfile                      这种修改只应用于服务器参数文件.它的效果如下:
                                  .对当前实例不会生效
                                  .对于动态和静态参数只有在重启实例之后才会生效
                                  这是唯一可以修改静态参数的scope范围级别

scope=memory                      这种修改只应用于内存.它的效果如下:
                                  .这种改变只应用于当前实例且会立即生效
                                  .对于动态参数会立即生效.但是不是永久生效因为没有更新spfile文件
                                  对于静态参灵数不能在这个范围级别进行修改

scope=both                        这种修改应用于服务器参数文件和内存,它的效果如下:
                                  .对于当前实例这种改变会立即生效
                                  .对于动态参数会永久生效因为修改了服务器参数文件.
                                  对于静态参灵数不能在这个范围级别进行修改
----------------------------------------------------------------------------------------------------

如果设置scope=spfile或scope=both有错误实例使用服务器参数文件是不能启动的.如果实例是使用服务器参数文件启动的那么缺省的参数修改范围级别为scope=both.如果实例是使用文本初始化参数文件来启动的那么缺省的参数修改范围级别为scope=memory

对于动态参数,还可以指定deferred关键字.当指定这个关键字后改变只对以后的会话生效.

当你设置scope为spfile或both时可以选择comment子句来对参数使用一个文本字符串作为注释.这个注释也会被写入服务器参数文件中.

下面的语句将修改在连接被删除之前允许的登录失败的最大次数.它包含了一注释且明确地指出了修改只对服务器参数文件生效.

SQL>ALTER SYSTEM SET SEC_MAX_FAILED_LOGIN_ATTEMPTS=3 COMMENT='Reduce from 10 for tighter security.' SCOPE=SPFILE;

下面的例子介绍了如何对复杂初始化参数进行设置这个参数有一个列表属性.下面的语句可以改变已经存在的设置或者使用一个新的归档目录

SQL>ALTER SYSTEM
2 SET LOG_ARCHIVE_DEST_4='LOCATION=/u02/oracle/rbdb1/',MANDATORY,'REOPEN=2'
3 COMMENT='Add new destination on Nov 29'
4 SCOPE=SPFILE;

当一个参数值是由列表值组成你不能通过位置或者次序数字来统计图单个属性.在每次修改这个参数时必须指定一个完全列表值.新的完全列表可以替换旧的参数列表值.

清除初始化参数值
可以使用alter system reset命令来清除(删除)实例启动时所用的spfile文件中的任何参数设置.scope=memory和scope=both是不被允许的.scope=spfile子句不被要求但可以包含.

你可能想清除spfile文件中的一个参数使其在下次启动时使用缺省参数值.这样做可能有以下几种原因:
.为了诊断列出当前实例的所有参数值.可以使用show parameters命令或者查询v$parameter或v$parameter2视图
.为了修改服务器参数文件首先要将其导出创建成文本初始化参数文件再修改,修改后再使用create spfile命令从文本初始化参数文件来重新创建服务器参数文件.

导出的文本初始化参数文件pfile可以使用startup pfile命令来启动实例.

为了执行create pfile语句必须要有sysdba或sysoper系统权限.导出的文件在数据库服务器端生成.它可能包含了参数的注释并一起作为参数被设置.

下面的语句用来从spfile文件来创建pfile

SQL>create pfile from spfile;

因为没有指定文件名,数据库将使用一个平台特定的文件名来创建一个文本初始化参数文件pfile,而且它是使用平台特定的缺省的服务器参数文件spfile来创建的

下面的语句用来从spfile文件来创建pfile,但是指定了文件名:

SQL>CREATE PFILE='/u01/oracle/dbs/test_init.ora' FROM SPFILE='/u01/oracle/dbs/test_spfile.ora';

注意:可以使用内存中的当前参数值来创建一个pfile文件.例如:

SQL>CREATE PFILE='/u01/oracle/dbs/test_init.ora' FROM MEMORY;

备份服务器参数文件
可以通过导出的形式来备份服务器参数文件.如果你的数据库使用rman来实例备份和恢复策略那么可以使用rman来创建一个spfile文件的备份.当使用rman备份数据库时spfile文件会自动备份,但是rman也能让你指定对当前活动的spfile创建一个备份.

恢复丢失或者损坏的服务器参数文件
如果服务器参数文件(spfile)丢失或者损坏了,那么当前实例可能会出现故障或者在下次启动实例时会失败.有下面几种方法来恢复spfile:
.如果实例正在运行可以使用下面的命令从内存中使用当前参数值来重新创建一个服务器参数文件spfile

SQL>create spfile from memory;

这个命令将在缺省位置使用缺省文件名来创建一个spfile文件.也可以指定新的目录和文件名.

.如果你有一个有效的文本初始化参数文件(pfile),可以使用下面的命令从pfile文件来创建spfile:

SQL>create spfile from pfile;

这个命令将在缺省位置使用缺省文件名来创建一个spfile文件,或者不使用缺省位置的缺省的pfile来创建的语句如下:

SQL>CREATE SPFILE='/u01/oracle/dbs/test_spfile.ora' FROM PFILE='/u01/oracle/dbs/test_init.ora';

.从备份中还原spfile

.如果你的情况以上方法都不能使用,那么执行以下步骤来创建:
1.从告警日志(alert.log)中所列出的参数值来创建一个文本初始化参数文件(pfile)
当实例启动时所使用的初始化参数将会写入告警日志文件中.可以将这些参数信息复制到新的pfile文件中.

2.使用pfile文件来创建spfile

在参数更新时出现读/写错误
在参数被更新时如果读取或者写服务器参数文件出错那么这个错误报告会被写入告警日志文件且后继的对服务器参数文件的
更新将会忽略.这时可以执行下面的操作:
1.关闭实例,恢复服务器参数文件后再重新启动实例.

2.如果不关心后继的参数修改是不是永久生效可以继续运行数据库

查看参数设置
可以使用以下几种方法来查看参数设置

--------------------------------------------------------------------------------------------------------
方法                                   描述
--------------------------------------------------------------------------------------------------------
show parameters                       这个命令将会显示影响当前会话的初始化参数值

show spparameters                     这个命令将会显示服务器参数文件中的初始化参数值

create pfile                          这个命令将使用服务器参数文件或者内存中当前参数的值
                                      来创建一个文本初始化参数文件.可以使用任何文本编辑器
                                      来查看pfile

v$parameter                           这个视图将显示影响当前会话的初始化参数.使用视图更容易
                                      区分列表参数值因为每一个列表参数值显示为一行

v$system_parameter                    这个视图显示影响当前实例的初始化参数.一个新的会话会继承
                                      实例级别的参数值

v#system_parameter2                   这个视图显示影响当前实例的初始化参数.一个新的会话会继承
                                      实例级别的参数值,使用视图更容易区分列表参数值因为每一个
                                      列表参数值显示为一行

v$spparameter                         这个视图显示了spfile的当前内容.如果实例没有使用spfile启动
                                      这个视图在isspecified列返回false.


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

使用create database语句创建数据库的详细操作步骤

使用create database语句创建数据库的步骤如下:
1.指定一个实例标识符SID
2.确保设置了必要的环境变量
3.选择一个数据库管理员验证方法
4.创建一个初始化参数文件
5.(只用于windows平台)创建一个实例
6.连接实例
7.创建一个服务器参数文件
8.启动实例
9.执行create database
10.创建额外的表空间
11.运行脚本来创建数据字典视图
12.(可选项)运行脚本来安装可选项
13.备份数据库
14.(可选项)启用自动实例启动

步骤1:指定一个实例标识符(SID)
对于你的实例定义一个唯一的oracle系统标识符(SID),打开一个命令窗口并设置ORACLE_SID环境变量.ORACLE_SID用来与相同主机上其它的实例进行区分.ORACLE_SID在特定平台上有些字符是被限制使用的.在有些平台上,SID是区分大小写的.注意:最常见的做法是将SID设置为与数据库名称相同.数据库的最大字符个数是8

在UNIX和Linux操作系统中设置SID的语法如下:
如果是Bourne, Bash, or Korn shell
ORACLE_SID=mynewdb
export ORACLE_SID

如果是C shell
setenv ORACLE_SID mynewdb

在windows操作系统中设置SID的语法如下:
set ORACLE_SID=mynewdb

步骤2:确保设置了必要的环境变量
依赖于你的操作系统,在你启动SQL*Plus之前,必须要设置环境变量或者至少要验证设置的正确性

例如,在大多数平台中,ORACLE_SID和ORACLE_HOME必须要设置.另外建议设置PATH变量包含ORACLE_HOME/bin目录.
在UNIX和Linux平台上必须手工设置这些环境变量.在windows平台中,OUI自动在windows注册表中指定ORACLE_HOME
和ORACLE_SID的值.如果在安装时不创建数据库,OUI不会在注册表中设置ORACLE_SID,当在以后创建数据库时要设置
ORACLE_SID环境变量.

步骤3:选择一个数据库管理员验证方法
为了能创建一个数据库你必须被验证且被授予合适的系统权限.作为一个管理员可以用以下几种方式来验证
.使用密码文件来验证
.使用操作来验证
在这一步你要决定一个验证方法

为了使用密码文件来进行验证需要创建一个密码文件.为了使用操作系统来进行验证你要确保你登录主机的用户是一个
合适的操作系统用户组的成员.在UNIX和Linux平台中通常是dba用户组,在windows平台上安装软件的用户会自动的添加到所要求的用户组中.

步骤4:创建初始化参数文件
当oracle实例启动时会读取一个初始化参数文件.这个文件可以是文本文件它可以使用文本编辑器来编辑,也可以是二进制文件它是由数据库创建和动态修改的.二进制文件也叫服务器参数文件.在这一步你可以创建一个文本参数文件.在最后一步通过文本文件创建服务器参数文件.

如果手工创建初始化参数文件,确保它包含下面列表中的参数,所有其它没有列出的参数都有缺省值

---------------------------------------------------------------------------------------------
参数值                        强制             注意
---------------------------------------------------------------------------------------------
DB_NAME                       Yes              数据库标识符.它的值必须与create database
                                               语句中的值相对应.最大长度为8个字符

CONTROL_FILES                 No               强烈建议设置这个参数.如果没有提供,那么数据库
                                               实例将在初始化参数文件相同的目录创建一个控制
                                               文件.提供这个参数可以多路复用控制文件

MEMORY_TARGET                 No               启用自动内存管理设置实例使用的内存总量.可以选
                                               择其它的初始化参数来手工控制内存的使用
---------------------------------------------------------------------------------------------

为了方便起见,在oracle数据库的缺省值位置存储初始化参数文件且使用缺省的文件名.在启动数据库时,它将不需要
在执行startup命令时指定pfile子句.因为oracle数据库会自动在缺省位置查找初始化参数文件.

步骤5:(只适用于windows)创建一个实例
在windows平台上在你连接到一个实例之前如果这个实例不存在你必须手工创建它.使用oradim命令将创建一个oracle
实例

为了创建一个实例:
在一个windows命令提示符处输入下面的命令:
oradim -NEW -SID sid -STARTMODE MANUAL -PFILE pfile
sid是期待的SID(例如newdb),pfile是完全路径的文本初始化参数文件.这个命令只会创建实例不会启动实例.

注意:在这里没有将-startmode参数设置为auto是因为它会让新的实例启动并试图挂载数据库.

步骤6:连接实例
启动SQL*Plus并使用sysdba系统权限来连接到oracle实例.
.使用密码文件验证输入下面的命令且输入sys密码:

[oracle@jyrac1 ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 9 09:59:55 2014

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

SQL> conn sys as sysdba
Enter password:
Connected to an idle instance.

.使用操作系统验证输入下面命令:

[oracle@jyrac1 ~]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 9 09:59:08 2014

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

SQL> conn / as sysdba
Connected to an idle instance.

SQL*Plus输出下面信息:
Connected to an idle instance

注意:SQL*Plus可能输出类似于下面的信息:

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

如果是这样,实例已经启动了.你可能连接到一个错误的实例了.执行exit命令退出SQL*Plus,检查ORACLE_SID的值
然后重复这个步骤

步骤7:创建服务器参数文件
服务器参数文件能让你使用alter system命令来修改初始化参数且让改变在数据库重新启动后仍然生效.可以通过
一个文本参数文件来创建一个服务器参数文件.

下面的SQL*Plus命令将从缺省位置使用缺省名称来读取一个文本初始化参数文件(pfile),通过文本初始化参数文件
来创建一个服务器参数文件(spfile)并将spfile使用缺省的spfile名称写到缺省位置.
create spfile from pfile;

如果不使用缺省的名字和位置也可以对pfile和spfile提供文件名和路径

注意:在服务器参数文件起作用之前必须要重启数据库.虽然在这里创建一个服务器参数文件是一个可选项,但是建议
创建一个服务器参数文件.如果不创建服务器参数文件那么实例在启动时将继续读取文本初始化参数文件

更重要的:如果正使用oracle管理文件功能且初始化参数文件不包含control_files参数,那么在执行create database语句时就必须创建一个服务器参数文件数据库能保存控制文件的名字和位置.

步骤8:启动实例
启动实例不加载数据库.通常只在数据库创建或者执行数据库维护操作时使用.使用带有nomount子句的startup命令.
在下面的例子中,因为初始化参数文件或服务器参数文件存放在缺省位置所以不需要指定pfile子句.

SQL> startup nomount
ORACLE instance started.

Total System Global Area  217157632 bytes
Fixed Size                  2211928 bytes
Variable Size             159387560 bytes
Database Buffers           50331648 bytes
Redo Buffers                5226496 bytes

步骤9:执行create database语句
为了创建一个新的数据库使用create database语句
例1:
下面的语句创建数据库jy.这个数据库名必须与初始化参数文件中的db_name相同.这个例子假设下面的条件成立:
.初始化参数文件使用control_files参数指定了控制文件的数量和位置
.存在目录/u01/app/oracle/oradata/jy

SQL> CREATE DATABASE jy
  2  USER SYS IDENTIFIED BY "zzh_2046"
  3  USER SYSTEM IDENTIFIED BY "zzh_2046"
  4  LOGFILE GROUP 1 ('/u01/app/oracle/oradata/jy/redo01a.log','/u01/app/oracle/oradata/jy/redo01b.log') SIZE 50M BLOCKSIZE 512,
  5  GROUP 2 ('/u01/app/oracle/oradata/jy/redo02a.log','/u01/app/oracle/oradata/jy/redo02b.log') SIZE 50M BLOCKSIZE 512,
  6  GROUP 3 ('/u01/app/oracle/oradata/jy/redo03a.log','/u01/app/oracle/oradata/jy/redo03b.log') SIZE 50M BLOCKSIZE 512
  7  MAXLOGFILES 5
  8  MAXLOGMEMBERS 5
  9  MAXLOGHISTORY 1
 10  MAXDATAFILES 100
 11  CHARACTER SET ZHS16GBK
 12  NATIONAL CHARACTER SET AL16UTF16
 13  EXTENT MANAGEMENT LOCAL
 14  DATAFILE '/u01/app/oracle/oradata/jy/system01.dbf' SIZE 325M REUSE
 15  SYSAUX DATAFILE '/u01/app/oracle/oradata/jy/sysaux01.dbf' SIZE 325M REUSE
 16  DEFAULT TABLESPACE users
 17  DATAFILE '/u01/app/oracle/oradata/jy/users01.dbf'
 18  SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
 19  DEFAULT TEMPORARY TABLESPACE tempts1
 20  TEMPFILE '/u01/app/oracle/oradata/jy/temp01.dbf'
 21  SIZE 20M REUSE
 22  UNDO TABLESPACE undotbs
 23  DATAFILE '/u01/app/oracle/oradata/jy/undotbs01.dbf'
 24  SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

Database created.

创建的数据库有以下特征:
.数据库名为jy.

.由于在参数文件中没有指定control_files参数,数据库自动地在参数文件位置创建了一个控制文件

.sys和system用户的密码为指定的zzh_2046.从oracle11g开始密码是区分大小写的.两个指定sys和
system用户的密码的子句不是强制性的.然而如果你指定子句就必须对它们都指定.

.新创建的数据库有三组重做日志文件,每一组有两个成员由logfile子句指定.maxlogfiles,maxlogmembers和
maxloghistory指定了重做日志的限制.重做日志文件的块大小被设置为了512 bytes.和磁盘上的物理块大小相同.
如果块大小与物理块大小相同(缺省值)那么blocksize子句是一个可选项.物理块的大小通常是512,1024和4096.
对于磁盘使用4K的块大小可以选择指定blocksize为4096

.maxdatafiles指定了在数据库中能打开的数据文件的最大个数.这个值的大小会影响控制文件的大小.
注意:在创建数据库时可以设置多个限制.有些限制通过操作系统限制来实现的.例如,如果设置了maxdatafiles,
oracle数据库会在控制文件中分配足够的空间来存储maxdatafiles参数所指定个数的文件名.即使数据库一开始
只有一个数据文件.然而因为控制文件的最大大小与操作系统相关,在create database的参数中可能无法设置为
理论上的最大值.

.字符集ZHS16GBK用来在数据库中存储数据

.字符集AL16UTF16用来指定national character set,用来存储nchar,nclob或nvarchar2类型的数据

.system表空间由操作系统文件组成/u01/app/oracle/oradata/jy/system01.dbf由datafile子句来创建.如果已经
存在一个相同的文件名那么它将会被覆盖.

.system表空间创建为本地管理表空间

.sysaux表空间由操作系统文件组成/u01/app/oracle/oradata/jy/sysaux01.dbf由sysaux datafile子句来创建

.default tablespace子句对数据库创建和命名一个缺省的永久表空间

.default temporary tablespace了句对数据库创建和命名一个缺省的临时表空间

.如果在初始化参数文件中指定了undo_management=auto,unod tablespace子句创建和命名一个undo表空间用来
存储数据库的undo数据.如果忽略这个参数缺省值就是auto.

.重做日志文件在初始化时不进行归档,因为archivelog子句在create database语句中没有指定.在创建数据库时
这是常见的行为.可以在创建数据库之后使用alter database语句来切换到archivelog模式.在初始化参数文件中
与归档有关的初始化参数为log_archive_dest_1和log_archive_format.

注意:
.确保在create database语句的所用的所有目录都已经创建好.create database语句不会创建目录
.如果没有使用oracle管理文件,那么每一个子句必须包括一个datafile或tempfile子句
.如果数据库创建失败,那么可以查看告警日志来判断失败的原因且修正.
.为了在失败后重新提交create database语句你必须首先关闭实例且删除之前create database语句所创建的任何
文件

示例2
这个例子将使用oracle管理文件来创建一个数据库.它能让你使用一个更简单的create database语句来创建一个
数据库.为了使用oracle管理文件必须指定初始化参数db_create_file_dest.这个参数定义了在创建数据库各种
文件的存储目录和名称.下面的语句就是在初始化参数文件中设置这个参数:
db_create_file_dest=’/u01/app/oracle/oradata’

使用oracle管理文件和下面的create database语句,数据库将创建system和syaaux表空间,还可以创建语句中所
指定的额外的表空间,且会对所有数据文件,控制文件和重做日志文件使用缺省的大小和属性.注意这些属性和其它
缺省的数据库属性通过这种方法进行设置可能不能满足你生产环境的要求,所以建议你根据需要修改配置.

SQL> startup nomount
ORACLE instance started.

Total System Global Area  217157632 bytes
Fixed Size                  2211928 bytes
Variable Size             159387560 bytes
Database Buffers           50331648 bytes
Redo Buffers                5226496 bytes
SQL> show parameter db_create_file_dest

NAME                                 TYPE                    VALUE
------------------------------------ ----------------------  ------------------------------
db_create_file_dest                  string                  /u01/app/oracle/oradata

SQL> CREATE DATABASE cs
  2  USER SYS IDENTIFIED BY "zzh_2046"
  3  USER SYSTEM IDENTIFIED BY "zzh_2046"
  4  EXTENT MANAGEMENT LOCAL
  5  DEFAULT TEMPORARY TABLESPACE temp
  6  UNDO TABLESPACE undotbs1
  7  DEFAULT TABLESPACE users;

Database created.

使用oracle管理文件时会将控制文件,数据文件,重做日志文件以不同的目录来存储

[oracle@jyrac1 CS]$ pwd
/u01/app/oracle/oradata/CS

[oracle@jyrac1 CS]$ ls
controlfile  datafile  onlinelog

[oracle@jyrac1 datafile]$ ls -lrt
total 318828
-rw-r----- 1 oracle oinstall 104865792 Apr  9 11:40 o1_mf_temp_9n9jb02z_.tmp
-rw-r----- 1 oracle oinstall 104865792 Apr  9 11:41 o1_mf_users_9n9jb08d_.dbf
-rw-r----- 1 oracle oinstall 104865792 Apr 10 08:31 o1_mf_system_9n9j9p4h_.dbf
-rw-r----- 1 oracle oinstall  10493952 Apr 10 08:41 o1_mf_undotbs1_9n9j9y6l_.dbf
-rw-r----- 1 oracle oinstall 104865792 Apr 10 08:41 o1_mf_sysaux_9n9j9tj4_.dbf

[oracle@jyrac1 controlfile]$ ls -lrt
total 7676
-rw-r----- 1 oracle oinstall 7847936 Apr 10 08:46 o1_mf_9n9j9lxs_.ctl

[oracle@jyrac1 onlinelog]$ ls
o1_mf_1_9n9j9m5x_.log  o1_mf_2_9n9j9mfv_.log

注意:如果create database语句失败且如果不能完成步骤7,那么确保对于这个实例这里不存在服务器参数文件(spfile)
例如,一个spfile包含了所有控制文件的完全路径,如果create database语句失败,如果这些控制文件不存在,确保你在重启实例之后删除一个你不使用的spfile文件

步骤10:创建额外的表空间
为了使用数据库的功能你必须为你的应用数据创建额外的表空间.下面的脚本用来创建额外的表空间:

SQL> CREATE TABLESPACE apps_tbs LOGGING
  2  DATAFILE '/u01/app/oracle/oradata/jy/apps01.dbf'
  3  SIZE 50M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED
  4  EXTENT MANAGEMENT LOCAL;

Tablespace created.

SQL> CREATE TABLESPACE indx_tbs LOGGING
2 DATAFILE '//u01/app/oracle/oradata/jy/indx01.dbf'
3 SIZE 50M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITED
4 EXTENT MANAGEMENT LOCAL;

Tablespace created.

步骤11:运行脚本创建数据字典视图
运行必要的脚本来创建数据字典视图,同义词,PL/SQL包

SQL> @$ORACLE_HOME/rdbms/admin/catalog.sql
SQL> @$ORACLE_HOME/rdbms/admin/catproc.sql
SQL> @$ORACLE_HOME/sqlplus/admin/pupbld.sql

catalog.sql脚本创建数据字典表的视图,动态性能视图和许多视图的公共同义词.授予public来访问同义词
catproc.sql运行所有要使用的PL/SQL的创建脚本
pupbld.sql SQL*Plus所要求的脚本

步骤12:(可选项)运行脚本来安装额外的选项
你可能想运行其它的脚本.这些脚本是由你选择使用或安装的功能所决定的.如果你想安装其它的oracle产品与
数据库一起工作那么你将要运行其它的脚本来创建一些额外的数据字典表.

步骤13:备份数据库
对数据库执行一个完全备份来确保如果出现介质故障能够有一个完整的文件备份.可以使用rman进行备份

步骤14:(可选项)启用自动实例启动
你可能想配置oracle实例在操作系统重启之后自动启动.可以查看操作系统相关的文档.例如对于windows平台
可以使用下面的命令来配置数据库根据操作系统重启而重启实例:
ORADIM -EDIT -SID sid -STARTMODE AUTO -SRVCSTART SYSTEM [-SPFILE]
如果想让实例在自动重启时使用spfile必须指定-spfile参数

指定create database语句的子句
当执行create database语句时,oracle数据库会执行一些操作.实际操作的执行依赖于在create database语句中指定的子句和你设置的初始化参数.oracle数据库至少执行以下操作:
创建数据库的数据文件
创建数据库的控制文件
创建数据库的重做日志文件和建立archivelog模式
创建system表空间
创建sysaux表空间
创建数据字典
设置数据库存储数据的字符集
设置数据库的时区
加载数据库和打开数据库

指定sys和system用户的密码来保护数据库
create database语句中有子句可以指定sys和system用户的密码:
.user sys identified by password
.user system identified by password
如果忽略这些子句那么这些用户将会使用缺省的密码change_on_install和manager,且会在告警日志文件中写入一条记录来指示缺省密码已经被使用.为了保持数据库你必须在数据库创建之后使用alter user语句来修改密码.

oracle建议你指定这些子句即使它们是可选项.缺省的密码是通用的,如果你忘记了修改那么你的数据库处于很容易攻击的状态.

当你选择密码时要注意在oracle 11g中密码是区分大小写的.也可能数据库对密码有格式要求.

创建本地管理的system表空间
在create database语句中指定extent management local子句来创建一个本地管理的system表空间.初始化参数compatible必须设置为10.0.0或都更高的值这个创建语句才能执行成功.如果你不指定extent management local子句,那么缺省情况下会创建一个字典管理system表空间.字典管理表空间已经被弃用.

如果你使用本地管理的system表空间来创建数据库而不使用oracle管理文件那么要确保满足下面的条件:
.在create database语句中指定default temporary tablespace子句
.在create database语句中指定undo tablespace子句

sysaux表空间
sysaux表空间总是在数据库创建时被创建的.sysaux表空间作为system表空间的辅助表空间来使用的.因为它是许多数据库的功能和产品所要求的缺省表空间,它减少了数据库要求的表空间数.它还会减少system表空间的负载.

可以在create database语句中使用sysaux datafile子句来指定sysaux表空间的数据文件属性.在数据库中sysaux表空间的强制属性包括:
permanent
read write
extent management local
segment space management auto

不能使用alter tablespace语句来修改这些属性任何试图修改的操作都会返回一个错误信息.不能对sysaux表空间重命名也不能删除sysaxu表空间.

sysaux表空间的大小取决于数据库组件占用sysaux表空间的大小.可以通过查询v$sysaux_occupants视图来查看这些组件.基于这些组件的初始大小,sysaux表空间在数据库创建时至少在400MB以上.在数据库完全部署后依赖于它的使用和工作负载对sysaux表空间的所要求的大小会增加.

SQL> select sum(space_usage_kbytes)/1024 MB from v$sysaux_occupants;

        MB
----------
   623.875

如果对system表空间包含了datafile子句那么必须指定sysaux datafile子句否则create database语句将会失败.这个要求如果使用oracle管理文件就不是必须的.sysaux表空间与system表空间有相同的安全属性.

使用自动undo管理:创建一个undo表空间
自动undo管理需要使用一个undo表空间.为了启用自动undo管理需要将初始化参数undo_management设置为auto.或者忽略这个参数数据库缺省值就是使用自动undo管理是.

SQL> show parameter undo_management

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO

在自动undo管理模式下,undo数据被存储在undo表空间中由oracle数据库来管理.为了定义和命名一个undo表空间必须在create database语句中包含一个undo tablespace子句.如果忽略这个子句自动undo管理会被启用那么数据库会创建一个缺省undo表空间名叫sys_undotbs

创建一个缺省的永久表空间
create database语句中的default tablespace子句用来对数据库指定一个缺省的永久表空间.oracle数据库对非system用户指定到这个表空间不用显式的指定不同的永久表空间.如果你不指定这个子句,那么对于非system用户来说system表空间是缺省的永久表空间.oracle建议创建一个缺省的永久表空间.

创建一个缺省临时表空间
create database语句中的default temporary tablespace子句用来创建一个缺省的临时表空间.oracle将这个表空间指定为用户的临时表空间而不用再显式的来指定临时表空间.例如我们在创建数据库jy的语句中指定了缺省永久表空间users和临时表空间temp.下面来创建一个新的用户并查看它的永久表空间和临时表空间是不是为users和temp.

SQL> create user test identified by test;

User created.

SQL> select username,default_tablespace,temporary_tablespace from dba_users where username='TEST';

USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
------------------------------ ------------------------------ ------------------------------
TEST                           USERS                          TEMP

可以看到我们创建一个用户test,没有显式地指定永久表空间和临时表空间,数据库自动指定了永久表空间和临时表空间.

在create user语句中可以显式的指定一个临时表空间或表空间组给用户.然而如果你不这样做且没有对数据库指定缺省的临时表空间,那么数据库会对这些用户指定system表空间来作为它们的临时表空间.在system表空间中存储临时数据不是一种可取的方法.而且给每一个用户单独指定临时表空间的很麻烦的.因此oracle建议在create database语句中使用default temporary tablespace子句.
注意:当指定system表空间为本地管理表空间后,system表空间不能用作临时表空间.在这种情况下你必须创建一个缺省的临时表空间.

在创建数据库时指定oracle管理文件
通过使用oracle管理文件这个功能可以在使用create database语句时使用最少数量的子句和参数.可以对由oracle数据库创建和管理的文件指定一个目录或者一个oracle asm磁盘组.

在你的初始化参数文件中通过db_create_file_dest,db_create_online_log_dest_n或db_recovery_file_dest参数中的任何一个来指示oracle数据库来创建和管理数据库的底层操作系统文件.oracle数据库将按照你指定的初始化参数和create database语句中指定的子句所指定的数据库结构来创建和管理操作系统文件.
.表空间和它们的数据文件
.临时表空间和它们的临时文件
.控制文件
.重做日志文件
.归档重做日志文件
.闪回日志
.块改变跟踪文件
.rman备份

下面的create database语句在假设你已经指定必要的初始化参数后oracle管理文件是怎样工作的情况

CREATE DATABASE cs
USER SYS IDENTIFIED BY "zzh_2046"
USER SYSTEM IDENTIFIED BY "zzh_2046"
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE temp
UNDO TABLESPACE undotbs1
DEFAULT TABLESPACE users;

.system表空间创建为本地管理表空间.如果不使用extent management local子句,system表空间将创建为字典管理表空间这是不建议的

.没有指定datafile子句,所以数据库对system表空间创建一个oracle管理数据文件

.没有指定logfile子句,所以数据库将创建两组oracle管理的重做日志组.

SQL> select  group# from v$log;

    GROUP#
----------
         1
         2
[oracle@jyrac1 onlinelog]$ ls -lrt
total 205016
-rw-r----- 1 oracle oinstall 104858112 Apr  9 11:40 o1_mf_2_9n9j9mfv_.log
-rw-r----- 1 oracle oinstall 104858112 Apr 10 10:22 o1_mf_1_9n9j9m5x_.log

.没有包括sysaux datafile子句,所以数据库将对sysaux表空间创建一个oracle管理的数据文件

.对于undo tablespace和default tablespace子句没有指定datafile子句,所以数据库对这些表空间中的每一个都创建一个oracle管理的数据文件.

.对于default temporaray tablespace子句没有指定tempfile子句,所以数据库将会创建一个oracle管理的临时文件.

.如果在初始化参数文件中没有指定control_files参数那么数据库也会创建一个oracle管理的控制文件

.如果你正在使用一个服务器参数文件那么数据库将会自动设置适当的初始化参数

在创建数据库时支持大数文件表空间
oracle数据库为了简化表空间的管理通过创建大文件表空间来支持超大型数据库的管理.大文件表空间只包含一个数据文件,但是这个数据文件最多可以包含4G个数据块.在oracle数据库中最多的数据文件个数被限制了(通常是64K个文件).因此大文件表空间可能显著的增加一个oracle数据库的存储容量.

下面将介绍在create database语句中如何支持大文件表空间
指定缺省的表空间类型在create database语句中的set default … tablespace子句将决定后续的create tablespace语句的缺省表空间类型.可以设置为set default bigfile tablespacea或者set default smallfile tablespace.如果你忽略这个子句,那么缺省的是小文件表空间,它是传统的oracle数据库表空间类型.一个小文件表空间最多能包含1022个数据文件,每个数据文件最多能包含4M个数据块.

下面的create database语句被修改为使用大文件表空间:

SQL> startup nomount
ORACLE instance started.

Total System Global Area  217157632 bytes
Fixed Size                  2211928 bytes
Variable Size             159387560 bytes
Database Buffers           50331648 bytes
Redo Buffers                5226496 bytes
SQL> CREATE DATABASE cs
  2  USER SYS IDENTIFIED BY "zzh_2046"
  3  USER SYSTEM IDENTIFIED BY "zzh_2046"
  4  EXTENT MANAGEMENT LOCAL
  5  SET DEFAULT BIGFILE TABLESPACE
  6  DEFAULT TEMPORARY TABLESPACE temp
  7  UNDO TABLESPACE undotbs1
  8  DEFAULT TABLESPACE users;

Database created.

SQL> select name,bigfile from v$tablespace;

NAME                                                         BIGFIL
------------------------------------------------------------ ------
SYSTEM                                                       YES
SYSAUX                                                       YES
UNDOTBS1                                                     YES
TEMP                                                         YES
USERS                                                        YES

从上面信息可以看到数据库cs中的表空间都是大文件表空间

在数据库创建之后可以使用带有set default tablespace了句的alter database语句来动态的改变缺省的表空间类型

SQL> ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;

Database altered

可以通过查询database_properties数据字典视图来查询数据库当前的缺省表空间类型

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TBS_TYPE';

PROPERTY_VALUE
--------------------------------------------------------------------------------
BIGFILE

覆盖缺省的表空间类型
system和sysaux表空间总是使用缺省的表空间类型来创建的.然而对于create database操作中的undo和default temporary表空间可以显式的覆盖缺省的表空间类型.

例如,可以在缺省表空间类型为小文件表空间的情况下创建一个大文件类型的undo表空间:

SQL> startup nomount
ORACLE instance started.

Total System Global Area  217157632 bytes
Fixed Size                  2211928 bytes
Variable Size             159387560 bytes
Database Buffers           50331648 bytes
Redo Buffers                5226496 bytes
SQL> CREATE DATABASE cs
  2  USER SYS IDENTIFIED BY "zzh_2046"
  3  USER SYSTEM IDENTIFIED BY "zzh_2046"
  4  EXTENT MANAGEMENT LOCAL
  5  DEFAULT TEMPORARY TABLESPACE temp
  6  BIGFILE UNDO TABLESPACE undotbs1
  7  DEFAULT TABLESPACE users;

Database created.

也可以在缺省表空间类型为大文件表空间的情况下创建一个小文件类型的缺省临时表空间:

SQL> startup nomount
ORACLE instance started.

Total System Global Area  217157632 bytes
Fixed Size                  2211928 bytes
Variable Size             159387560 bytes
Database Buffers           50331648 bytes
Redo Buffers                5226496 bytes
SQL> CREATE DATABASE cs
  2  USER SYS IDENTIFIED BY "zzh_2046"
  3  USER SYSTEM IDENTIFIED BY "zzh_2046"
  4  EXTENT MANAGEMENT LOCAL
  5  SET DEFAULT BIGFILE TABLESPACE
  6  DEFAULT TEMPORARY TABLESPACE temp
  7  UNDO TABLESPACE undotbs1
  8  SMALLFILE DEFAULT TABLESPACE users;

Database created.

oracle 11g使用DBCA以非交互(静默)方式创建数据库

使用DBCA以非交互(静默)方式创建数据库
通过执行dbca -h | -help来查看帮助选项
[oracle@jyrac1 ~]$ dbca -help

dbca  [-silent | -progressOnly | -customCreate] {  }  | { [ [options] ] -responseFile   } [-continueOnNonFatalErrors ]
Please refer to the manual for details.
You can enter one of the following command:
创建数据库的参数如下:
Create a database by specifying the following parameters:
        -createDatabase
                -templateName  现有模板的名称
                [-cloneTemplate]
                -gdbName   全局数据库名
                [-policyManaged | -adminManaged ]
                        [-createServerPool ]
                        [-force ]
                        -serverPoolName 
                        -[cardinality ]
                [-sid ] 数据库系统标识符
                [-sysPassword ]
                [-systemPassword ]
                [-emConfiguration 
                        -dbsnmpPassword 
                        -sysmanPassword 
                        [-hostUserName 
                         -hostUserPassword 
                         -backupSchedule ]
                        [-smtpServer 
                         -emailAddress ]
                        [-centralAgent ]]
                [-disableSecurityConfiguration 
                [-datafileDestination  所有数据文件的目标位置 |  -datafileNames ]
                [-redoLogFileSize ]
                [-recoveryAreaDestination ]
                [-datafileJarLocation  ] 数据文件 jar 的位置, 只用于复制数据库的创建
                [-storageType < FS | ASM >
                        [-asmsnmpPassword     ]
                         -diskGroupName   
                         -recoveryGroupName       
                [-characterSet ] 数据库的字符集
                [-nationalCharacterSet  ] 数据库的国家字符集
                [-registerWithDirService 
                        -dirServiceUserName     目录服务的用户名
                        -dirServicePassword     目录服务的口令
                        -walletPassword    ]
                [-listeners  ] 监听程序列表, 该列表用于配置具有如下对象的数据库
                [-variablesFile   ]] 用于模板中成对变量和值的文件名
                [-variables  ]
                [-initParams ]
                [-memoryPercentage ]
                [-automaticMemoryManagement ]
                [-totalMemory ]
                [-databaseType ]]

Configure a database by specifying the following parameters:
        -configureDatabase
                -sourceDB    
                [-sysDBAUserName     
                 -sysDBAPassword     ]
                [-registerWithDirService|-unregisterWithDirService|-regenerateDBPassword 
                        -dirServiceUserName    
                        -dirServicePassword    
                        -walletPassword    ]
                [-disableSecurityConfiguration 
                [-enableSecurityConfiguration 
                [-emConfiguration 
                        -dbsnmpPassword 
                        -symanPassword 
                        [-hostUserName 
                         -hostUserPassword 
                         -backupSchedule ]
                        [-smtpServer 
                         -emailAddress ]
                        [-centralAgent ]]

使用现有数据库创建模板的参数如下:
Create a template from an existing database by specifying the following parameters:
        -createTemplateFromDB
                -sourceDB    ::> < 服务采用 :: 格式
                -templateName         新的模板名
                -sysDBAUserName         具有SYSDBA权限的用户名
                -sysDBAPassword      具有SYSDBA权限的用户名的口令
                [-maintainFileLocations ]

使用现有数据库创建复制模板的参数如下:
Create a clone template from an existing database by specifying the following parameters:
        -createCloneTemplate
                -sourceSID      源数据库 sid
                -templateName        新的模板名
                [-sysDBAUserName      具有SYSDBA权限的用户名
                 -sysDBAPassword     ] 具有SYSDBA权限的用户名的口令
                [-maintainFileLocations ]
                [-datafileJarLocation       ] 存放压缩格式数据文件的目录

Generate scripts to create database by specifying the following parameters:
        -generateScripts
                -templateName 
                -gdbName 
                [-scriptDest       ]
通过指定以下参数来删除数据库
Delete a database by specifying the following parameters:
        -deleteDatabase
                -sourceDB    
                [-sysDBAUserName     
                 -sysDBAPassword     ]

使用silent模式可以通过数据库创建模析和通过模板来创建数据库

通过模板来创建数据库

[oracle@jyrac1 ~]$ dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbname ora11g -sid ora11g -responseFile NO_VALUE -characterSet AL32UTF8 -memoryPercentage 30 -emConfiguration LOCAL
Enter SYS user password:

Enter SYSTEM user password:

Enter DBSNMP user password:

Enter SYSMAN user password:

Copying database files
1% complete
3% complete
11% complete
18% complete
26% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
50% complete
55% complete
56% complete
60% complete
62% complete
Completing Database Creation
66% complete
70% complete
73% complete
85% complete
96% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/ora11g/ora11g.log" for further details.
[oracle@jyrac1 ~]$ cat /u01/app/oracle/cfgtoollogs/dbca/ora11g/ora11g.log
Copying database files
DBCA_PROGRESS : 1%
DBCA_PROGRESS : 3%
DBCA_PROGRESS : 11%
DBCA_PROGRESS : 18%
DBCA_PROGRESS : 26%
DBCA_PROGRESS : 37%
Creating and starting Oracle instance
DBCA_PROGRESS : 40%
DBCA_PROGRESS : 45%
DBCA_PROGRESS : 50%
DBCA_PROGRESS : 55%
DBCA_PROGRESS : 56%
DBCA_PROGRESS : 60%
DBCA_PROGRESS : 62%
Completing Database Creation
DBCA_PROGRESS : 66%
DBCA_PROGRESS : 70%
DBCA_PROGRESS : 73%
DBCA_PROGRESS : 85%
DBCA_PROGRESS : 96%
DBCA_PROGRESS : 100%
Database creation complete. For details check the logfiles at:
 /u01/app/oracle/cfgtoollogs/dbca/ora11g.
Database Information:
Global Database Name:ora11g
System Identifier(SID):ora11gThe Database Control URL is https://jyrac1:5500/em

Management Repository has been placed in secure mode wherein Enterprise Manager data will be encrypted.  The encryption key has been placed in the file: /u01/app/oracle/11.2.0/db/jyrac1_ora11g/sysman/config/emkey.ora.   Please ensure this file is backed up as the encrypted data will become unusable if this file is lost.

数据库创建成功执行下面命令查看ora11g的进程信息

[oracle@jyrac1 ~]$ ps -ef | grep ora11g
oracle    6014     1  0 09:42 pts/1    00:00:00 /u01/app/oracle/11.2.0/db/perl/bin/perl /u01/app/oracle/11.2.0/db/bin/emwd.pl dbconsole /u01/app/oracle/11.2.0/db/jyrac1_ora11g/sysman/log/emdb.nohup
oracle    6032  6014  4 09:42 pts/1    00:00:44 /u01/app/oracle/11.2.0/db/jdk/bin/java -server -Xmx384M -XX:MaxPermSize=400M -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -DORACLE_HOME=/u01/app/oracle/11.2.0/db -Doracle.home=/u01/app/oracle/11.2.0/db/oc4j -Doracle.oc4j.localhome=/u01/app/oracle/11.2.0/db/jyrac1_ora11g/sysman -DEMSTATE=/u01/app/oracle/11.2.0/db/jyrac1_ora11g -Doracle.j2ee.dont.use.memory.archive=true -Djava.protocol.handler.pkgs=HTTPClient -Doracle.security.jazn.config=/u01/app/oracle/11.2.0/db/oc4j/j2ee/OC4J_DBConsole_jyrac1_ora11g/config/jazn.xml -Djava.security.policy=/u01/app/oracle/11.2.0/db/oc4j/j2ee/OC4J_DBConsole_jyrac1_ora11g/config/java2.policy -Djavax.net.ssl.KeyStore=/u01/app/oracle/11.2.0/db/sysman/config/OCMTrustedCerts.txt-Djava.security.properties=/u01/app/oracle/11.2.0/db/oc4j/j2ee/home/config/jazn.security.props -DEMDROOT=/u01/app/oracle/11.2.0/db/jyrac1_ora11g -Dsysman.md5password=true -Drepapi.oracle.home=/u01/app/oracle/11.2.0/db -Ddisable.checkForUpdate=true -Doracle.sysman.ccr.ocmSDK.websvc.keystore=/u01/app/oracle/11.2.0/db/jlib/emocmclnt.ks -Dice.pilots.html4.ignoreNonGenericFonts=true -Djava.awt.headless=true -jar /u01/app/oracle/11.2.0/db/oc4j/j2ee/home/oc4j.jar -config /u01/app/oracle/11.2.0/db/oc4j/j2ee/OC4J_DBConsole_jyrac1_ora11g/config/server.xml
oracle    6083     1  1 09:42 ?        00:00:11 oracleora11g (LOCAL=NO)
oracle    6132     1  0 09:42 ?        00:00:02 oracleora11g (LOCAL=NO)
oracle    6220     1  0 09:43 ?        00:00:00 oracleora11g (LOCAL=NO)
oracle    6466     1  0 09:43 ?        00:00:00 oracleora11g (LOCAL=NO)
oracle    6468     1  0 09:43 ?        00:00:00 oracleora11g (LOCAL=NO)
oracle    6480     1  0 09:43 ?        00:00:02 oracleora11g (LOCAL=NO)
oracle    6658     1  0 09:43 ?        00:00:01 oracleora11g (LOCAL=NO)
oracle    6664     1  1 09:43 ?        00:00:12 oracleora11g (LOCAL=NO)
oracle    6718     1  0 09:43 ?        00:00:00 oracleora11g (LOCAL=NO)
oracle    6720     1  0 09:43 ?        00:00:00 oracleora11g (LOCAL=NO)
oracle    8954     1  0 09:58 ?        00:00:00 ora_j000_ora11g
oracle    8956     1  0 09:58 ?        00:00:00 ora_j001_ora11g
oracle    8962 29918  0 09:59 pts/1    00:00:00 grep ora11g
oracle   31058     1  0 09:40 ?        00:00:00 ora_pmon_ora11g
oracle   31060     1  0 09:40 ?        00:00:00 ora_vktm_ora11g
oracle   31064     1  0 09:40 ?        00:00:00 ora_gen0_ora11g
oracle   31066     1  0 09:40 ?        00:00:00 ora_diag_ora11g
oracle   31068     1  0 09:40 ?        00:00:00 ora_dbrm_ora11g
oracle   31070     1  0 09:40 ?        00:00:00 ora_psp0_ora11g
oracle   31072     1  0 09:40 ?        00:00:00 ora_dia0_ora11g
oracle   31074     1  0 09:40 ?        00:00:00 ora_mman_ora11g
oracle   31076     1  0 09:40 ?        00:00:00 ora_dbw0_ora11g
oracle   31078     1  0 09:40 ?        00:00:00 ora_lgwr_ora11g
oracle   31080     1  0 09:40 ?        00:00:00 ora_ckpt_ora11g
oracle   31082     1  0 09:40 ?        00:00:00 ora_smon_ora11g
oracle   31084     1  0 09:40 ?        00:00:00 ora_reco_ora11g
oracle   31086     1  0 09:40 ?        00:00:00 ora_mmon_ora11g
oracle   31088     1  0 09:40 ?        00:00:00 ora_mmnl_ora11g
oracle   31090     1  0 09:40 ?        00:00:00 ora_d000_ora11g
oracle   31092     1  0 09:40 ?        00:00:00 ora_s000_ora11g
oracle   31161     1  0 09:40 ?        00:00:00 ora_qmnc_ora11g
oracle   31177     1  0 09:40 ?        00:00:00 ora_cjq0_ora11g
oracle   31262     1  0 09:40 ?        00:00:00 ora_q000_ora11g
oracle   31264     1  0 09:40 ?        00:00:00 ora_q001_ora11g
oracle   31344     1  0 09:41 ?        00:00:00 ora_smco_ora11g
oracle   31346     1  0 09:41 ?        00:00:00 ora_w000_ora11g

以silent方式来删除数据库

[oracle@jyrac1 ~]$ dbca -silent -deleteDatabase -sourceDB ora11g -sysDBAUserName sys -sysDBAPassword zzh_2046
Connecting to database
4% complete
9% complete
14% complete
19% complete
23% complete
28% complete
47% complete
Updating network configuration files
48% complete
52% complete
Deleting instance and datafiles
76% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/ora11g.log" for further details.

[oracle@jyrac1 ~]$ cat /u01/app/oracle/cfgtoollogs/dbca/ora11g.log
The Database Configuration Assistant will delete the Oracle instance and datafiles for your database. All information in the database will be destroyed. Do you want to proceed?
Connecting to database
DBCA_PROGRESS : 4%
DBCA_PROGRESS : 9%
DBCA_PROGRESS : 14%
DBCA_PROGRESS : 19%
DBCA_PROGRESS : 23%
DBCA_PROGRESS : 28%
DBCA_PROGRESS : 47%
Updating network configuration files
DBCA_PROGRESS : 48%
DBCA_PROGRESS : 52%
Deleting instance and datafiles
DBCA_PROGRESS : 76%
DBCA_PROGRESS : 100%
Database deletion completed.

删除数据库后执行下面的命令来查看ora11g进程信息发现没有了

[oracle@jyrac1 ~]$ ps -ef | grep ora11g
oracle   11194 29918  0 10:05 pts/1    00:00:00 grep ora11g



[oracle@jyrac1 ~]$ ps -ef | grep pmon
oracle    9288     1  0 Apr04 ?        00:00:07 ora_pmon_jycs
oracle   11285 29918  0 10:06 pts/1    00:00:00 grep pmon

使用现有数据库jycs来创建模板

[oracle@jyrac1 ~]$ dbca -silent -createTemplateFromDB -sourceDB jycs -templateName jycstemplate -sysDBAUserName sys -sysDBAPassword zzh_2046
Creating a template from the database
10% complete
20% complete
30% complete
40% complete
50% complete
60% complete
70% complete
80% complete
90% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/silent.log" for further details.
[oracle@jyrac1 ~]$ cat /u01/app/oracle/cfgtoollogs/dbca/silent.log
Creating a template from the database
DBCA_PROGRESS : 10%
DBCA_PROGRESS : 20%
DBCA_PROGRESS : 30%
DBCA_PROGRESS : 40%
DBCA_PROGRESS : 50%
DBCA_PROGRESS : 60%
DBCA_PROGRESS : 70%
DBCA_PROGRESS : 80%
DBCA_PROGRESS : 90%
DBCA_PROGRESS : 100%
The template "jycstemplate" creation completed.

[oracle@jyrac1 templates]$ cd /u01/app/oracle/11.2.0/db/assistants/dbca/templates
[oracle@jyrac1 templates]$ ls -lrt
total 285632
-rw-r--r-- 1 oracle oinstall     11492 Feb 25  2009 New_Database.dbt
-rw-r--r-- 1 oracle oinstall      5106 Aug 15  2009 Data_Warehouse.dbc
-rw-r--r-- 1 oracle oinstall      4986 Aug 15  2009 General_Purpose.dbc
-rwxr-xr-x 1 oracle oinstall 258654208 Aug 15  2009 Seed_Database.dfb
-rwxr-xr-x 1 oracle oinstall   9748480 Aug 15  2009 Seed_Database.ctl
-rwxr-xr-x 1 oracle oinstall   1179648 Aug 15  2009 example.dmp
-rwxr-xr-x 1 oracle oinstall  22544384 Aug 15  2009 example01.dfb
-rw-r----- 1 oracle oinstall      5124 Mar 24 13:31 jycs.dbc
-rw-r----- 1 oracle oinstall     13476 Apr  8 10:12 jycstemplate.dbt

使用现有数据库jycs创建带数据文件的模板

[oracle@jyrac1 ~]$ dbca -silent -createCloneTemplate -sourceDB jycs -templateName jycsCloneTemplate -sysDBAUserName sys -sysDBAPassword  zzh_2046 -datafileJarLocation /u01/app/oracle/11.2.0/db/assistants/dbca/templates
Gathering information from the source database
4% complete
8% complete
13% complete
17% complete
22% complete
Backup datafiles
28% complete
88% complete
Creating template file
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/silent0.log" for further details.
[oracle@jyrac1 ~]$ cat /u01/app/oracle/cfgtoollogs/dbca/silent0.log
Gathering information from the source database
DBCA_PROGRESS : 4%
DBCA_PROGRESS : 8%
DBCA_PROGRESS : 13%
DBCA_PROGRESS : 17%
DBCA_PROGRESS : 22%
Backup datafiles
DBCA_PROGRESS : 28%
DBCA_PROGRESS : 88%
Creating template file
DBCA_PROGRESS : 100%
The generation of the clone database template "jycsCloneTemplate" is successful.

查看生成的模板文件

[oracle@jyrac1 templates]$ ls -lrt
total 621628
-rw-r--r-- 1 oracle oinstall     11492 Feb 25  2009 New_Database.dbt
-rw-r--r-- 1 oracle oinstall      5106 Aug 15  2009 Data_Warehouse.dbc
-rw-r--r-- 1 oracle oinstall      4986 Aug 15  2009 General_Purpose.dbc
-rwxr-xr-x 1 oracle oinstall 258654208 Aug 15  2009 Seed_Database.dfb
-rwxr-xr-x 1 oracle oinstall   9748480 Aug 15  2009 Seed_Database.ctl
-rwxr-xr-x 1 oracle oinstall   1179648 Aug 15  2009 example.dmp
-rwxr-xr-x 1 oracle oinstall  22544384 Aug 15  2009 example01.dfb
-rw-r----- 1 oracle oinstall      5124 Mar 24 13:31 jycs.dbc
-rw-r----- 1 oracle oinstall     13476 Apr  8 10:12 jycstemplate.dbt
-rw-r----- 1 oracle oinstall 333955072 Apr  8 10:24 jycsCloneTemplate.dfb
-rw-r----- 1 oracle oinstall   9748480 Apr  8 10:24 jycsCloneTemplate.ctl
-rw-r----- 1 oracle oinstall      4903 Apr  8 10:24 jycsCloneTemplate.dbc

利用带数据文件的模板jycsCloneTemplate生成克隆数据库

[oracle@jyrac1 ~]$ dbca -silent -createDatabase -templateName jycsCloneTemplate.dbc -gdbName test -sid test -datafileJarLocation /u01/app/oracle/11.2.0/db/assistants/dbca/templates -datafileDestination /u01/app/oracle/oradata -responseFile NO_VALUE -characterset ZHS16GBK
Enter SYS user password:

Enter SYSTEM user password:

Copying database files
1% complete
3% complete
11% complete
18% complete
26% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
50% complete
55% complete
56% complete
60% complete
62% complete
Completing Database Creation
66% complete
70% complete
73% complete
85% complete
96% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/test/test.log" for further details.
[oracle@jyrac1 ~]$ cat /u01/app/oracle/cfgtoollogs/dbca/test/test.log
Copying database files
DBCA_PROGRESS : 1%
DBCA_PROGRESS : 3%
DBCA_PROGRESS : 11%
DBCA_PROGRESS : 18%
DBCA_PROGRESS : 26%
DBCA_PROGRESS : 37%
Creating and starting Oracle instance
DBCA_PROGRESS : 40%
DBCA_PROGRESS : 45%
DBCA_PROGRESS : 50%
DBCA_PROGRESS : 55%
DBCA_PROGRESS : 56%
DBCA_PROGRESS : 60%
DBCA_PROGRESS : 62%
Completing Database Creation
DBCA_PROGRESS : 66%
DBCA_PROGRESS : 70%
DBCA_PROGRESS : 73%
DBCA_PROGRESS : 85%
DBCA_PROGRESS : 96%
DBCA_PROGRESS : 100%
Database creation complete. For details check the logfiles at:
 /u01/app/oracle/cfgtoollogs/dbca/test.
Database Information:
Global Database Name:test
System Identifier(SID):test
[oracle@jyrac1 ~]$ ps -ef  | grep pmon
oracle   12381     1  0 10:22 ?        00:00:00 ora_pmon_jycs
oracle   14396     1  0 10:39 ?        00:00:00 ora_pmon_test
oracle   14689 29918  0 10:41 pts/1    00:00:00 grep pmon

利用不带数据文件的模板生成新的数据库

[oracle@jyrac1 ~]$ dbca -silent -createDatabase -templateName New_Database.dbt -gdbname jytest  -sid jytest -datafileDestination /u01/app/oracle/oradata -responseFile NO_VALUE -characterset ZHS16GBK
Enter SYS user password:

Enter SYSTEM user password:

Creating and starting Oracle instance
1% complete
3% complete
Creating database files
4% complete
7% complete
Creating data dictionary views
8% complete
9% complete
10% complete
11% complete
12% complete
13% complete
14% complete
16% complete
17% complete
18% complete
19% complete
Adding Oracle JVM
25% complete
30% complete
36% complete
38% complete
Adding Oracle Text
40% complete
41% complete
Adding Oracle XML DB
43% complete
44% complete
45% complete
49% complete
Adding Oracle Multimedia
50% complete
60% complete
Adding Oracle OLAP
61% complete
62% complete
63% complete
64% complete
Adding Oracle Spatial
65% complete
66% complete
67% complete
71% complete
Adding Enterprise Manager Repository
73% complete
75% complete
Adding Oracle Application Express
78% complete
82% complete
Adding Oracle Warehouse Builder
86% complete
90% complete
Completing Database Creation
91% complete
92% complete
93% complete
96% complete
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/jytest/jytest.log" for further details.
[oracle@jyrac1 ~]$ cat /u01/app/oracle/cfgtoollogs/dbca/jytest/jytest.log
Creating and starting Oracle instance
DBCA_PROGRESS : 1%
DBCA_PROGRESS : 3%
Creating database files
DBCA_PROGRESS : 4%
DBCA_PROGRESS : 7%
Creating data dictionary views
DBCA_PROGRESS : 8%
DBCA_PROGRESS : 9%
DBCA_PROGRESS : 10%
DBCA_PROGRESS : 11%
DBCA_PROGRESS : 12%
DBCA_PROGRESS : 13%
DBCA_PROGRESS : 14%
DBCA_PROGRESS : 16%
DBCA_PROGRESS : 17%
DBCA_PROGRESS : 18%
DBCA_PROGRESS : 19%
Adding Oracle JVM
DBCA_PROGRESS : 25%
DBCA_PROGRESS : 30%
DBCA_PROGRESS : 36%
DBCA_PROGRESS : 38%
Adding Oracle Text
DBCA_PROGRESS : 40%
DBCA_PROGRESS : 41%
Adding Oracle XML DB
DBCA_PROGRESS : 43%
DBCA_PROGRESS : 44%
DBCA_PROGRESS : 45%
DBCA_PROGRESS : 49%
Adding Oracle Multimedia
DBCA_PROGRESS : 50%
DBCA_PROGRESS : 60%
Adding Oracle OLAP
DBCA_PROGRESS : 61%
DBCA_PROGRESS : 62%
DBCA_PROGRESS : 63%
DBCA_PROGRESS : 64%
Adding Oracle Spatial
DBCA_PROGRESS : 65%
DBCA_PROGRESS : 66%
DBCA_PROGRESS : 67%
DBCA_PROGRESS : 71%
Adding Enterprise Manager Repository
DBCA_PROGRESS : 73%
DBCA_PROGRESS : 75%
Adding Oracle Application Express
DBCA_PROGRESS : 78%
DBCA_PROGRESS : 82%
Adding Oracle Warehouse Builder
DBCA_PROGRESS : 86%
DBCA_PROGRESS : 90%
Completing Database Creation
DBCA_PROGRESS : 91%
DBCA_PROGRESS : 92%
DBCA_PROGRESS : 93%
DBCA_PROGRESS : 96%
DBCA_PROGRESS : 100%
Database creation complete. For details check the logfiles at:
 /u01/app/oracle/cfgtoollogs/dbca/jytest.
Database Information:
Global Database Name:jytest
System Identifier(SID):jytest

oracle 11g数据库软件静默安装

一.准备文件
1. 拷贝文件 linux.x64_11gR2_database_1of2.zip
linux.x64_11gR2_database_2of2.zip 到 /oracle目录下;

2. 解压(可用鼠标右击解压,或用口令, cd /oracle)

[root@jyrac1 /]# uzip linux.x64_11gR2_database_1of2.zip
[root@jyrac1 /]# uzip linux.x64_11gR2_database_2of2.zip

3. 在/etc目录下创建一个名为 oraInst.loc 的文件,文件中的内容(两行代码)如下:
inventory_loc=ORACLE_BASE/oraInventory
inst_group= oinstall

[root@jyrac1 /]# vi /etc/oraInst.loc
nventory_loc=ORACLE_BASE/oraInventory
inst_group= oinstall
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"/etc/oraInst.loc" [New] 2L, 59C written

4. 输入下面的命令在oraInst.loc文件上设置合适的拥有者,组和权限:

[root@jyrac1 /]# cd /etc
[root@jyrac1 etc]# chown oracle:oinstall oraInst.loc
[root@jyrac1 etc]# chmod 664 oraInst.loc

二.检查硬件需求
1. 查看系统物理内存,以下输出可以看出,有2G的内存,内存最低要求1G

[root@jyrac1 etc]# grep MemTotal /proc/meminfo
MemTotal:      2059568 kB

2. 查看交换空间大小,以下输出可以看出,有2G的交换空间,交换空间的最优设置与你物理内存大小相关,详细说明请参考安装文档

[root@jyrac1 etc]# grep SwapTotal /proc/meminfo
SwapTotal:     2096472 kB

3.查看可用物理内存和交换空间

[root@jyrac1 etc]# free
             total       used       free     shared    buffers     cached
Mem:       2059568     856296    1203272          0      59336     574832
-/+ buffers/cache:     222128    1837440
Swap:      2096472     120740    1975732

4.查看挂载的临时分区空间情况

[root@jyrac1 etc]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             16246428  10361032   5046808  68% /
/dev/sda2              2030768   1124784    801160  59% /tmp
tmpfs                  1029784         0   1029784   0% /dev/shm
/dev/sdb              10321208    162284   9634636   2% /u01

三.检查软件需求
1.查看Linux版本

[root@jyrac1 etc]# cat /etc/issue
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel \r on an \m

2.查看内核版本

[root@jyrac1 etc]# uname -a
Linux jyrac1 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

四.配置内核及其他参数
1.vi /etc/sysctl.conf

kernel.shmall = 4294967296
kernel.shmmni=4096
kernel.sem=250 32000 100 128
fs.file-max=6815744
net.ipv4.ip_local_port_range =9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.aio-max-nr= 3145728

[root@jyrac1 /]# /sbin/sysctl -p

2.vi /etc/security/limits.conf

oracle soft nproc  2047
oracle hard nproc  16384
oracle soft nofile 1024
oracle hard nofile 65536

3.vi /etc/pam.d/login

session    required     pam_selinux.so open
session    optional     pam_keyinit.so force revoke
session required pam_limits.so

4. vi /etc/selinux/config

SELINUX=disabled

五.添加用户组和用户,并为oracle用户设置密码

[root@lym Server]# groupadd oinstall
[root@lym Server]# groupadd dba
[root@lym Server]# groupadd oper
[root@lym Server]# useradd -g oinstall -G dba oracle
[root@lym Server]# passwd oracle
Changing password for user oracle.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

六.创建安装Oracle的文件夹,并设置其相应权限给Oracle用户

[root@jyrac1 /]# mkdir -p  /u01/app/oracle/11.2.0/db
[root@jyrac1 /]# chown -R oracle.oinstall /u01
[root@jyrac1 /]# chmod 775 /u01

七.设置Oracle环境变量

[oracle@jyrac1 ~]$ vi .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
TEMP=/u01/tmp
TMPDIR=/u01/tmp
export TEMP TMPDIR
export LD_ASSUME_KERNEL=2.6.9
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/11.2.0/db
export ORACLE_SID=jycs
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
export PATH=$PATH:$ORACLE_HOME/bin
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH

八.注销root用户,并登录oracle用户,在/home/oracle目录下建立一个名为enterprisejy.rsp的文件,里面的具体内容如下(参考/oracle/database/response目录下面的db_install.rsp文件.

[oracle@jyrac1 ~]$ vi enterprisejy.rsp

#以下参数不要更改
racle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
DECLINE_SECURITY_UPDATES=false
#以下参数根据实际情况更改
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/oraInventory
SELECTED_LANGUAGES=en,zh_CN,zh_TW
ORACLE_HOME=/u01/app/oracle/11.2.0/db
ORACLE_BASE=/u01/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.isCustomInstall=true
oracle.install.db.customComponents=oracle.rdbms.partitioning:11.2.0.1.0,oracle.oraolap:11.2.0.1.0,oracle.rdbms.lbac:11.2.0.1.0,oracle.rdbms.dm:11.2.0.1.0,oracle.rdbms.dv:11.2.0.1.0,oracle.rdbms.rat:11.2.0.1.0
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oinstall
~
~
~
~
~
"enterprisejy.rsp" [New] 15L, 679C written

各参数含义如下:
-silent 表示以静默方式安装,不会有任何提示
-force 允许安装到一个非空目录
-noconfig 表示不运行配置助手netca
-responseFile 表示使用哪个响应文件,必需使用绝对路径
oracle.install.responseFileVersion 响应文件模板的版本,该参数不要更改
oracle.install.option 安装选项,本例只安装oracle软件,该参数不要更改
DECLINE_SECURITY_UPDATES 是否需要在线安全更新,设置为false,该参数不要更改
ORACLE_HOSTNAME 安装主机名
UNIX_GROUP_NAME oracle 用户用于安装软件的组名
INVENTORY_LOCATION oracle产品清单目录
SELECTED_LANGUAGES oracle运行语言环境,一般包括引文和简繁体中文
ORACLE_HOME Oracle 安装目录
ORACLE_BASE oracle 基础目录
oracle.install.db.InstallEdition 安装版本类型,一般是企业版
oracle.install.db.isCustomInstall 是否定制安装,默认Partitioning,OLAP,RAT都选上了
oracle.install.db.customComponents 定制安装组件列表:除了以上默认的,可加上Label Security和Database Vault
oracle.install.db.DBA_GROUP oracle用户用于授予OSDBA权限的组名
oracle.install.db.OPER_GROUP oracle用户用于授予OSOPER权限的组名

九.执行静默安装

oracle@jyrac1 database]$ ./runInstaller -silent -force -responseFile /home/oracle/enterprisejy.rsp
Starting Oracle Universal Installer...

Checking Temp space: must be greater than 120 MB.   Actual 9408 MB    Passed
Checking swap space: must be greater than 150 MB.   Actual 1929 MB    Passed
Preparing to launch Oracle Universal Installer from /u01/tmp/OraInstall2014-04-08_03-35-12PM. Please wait ...

在root账户下运行下面两个脚本:
/u01/oraInventory/orainstRoot.sh
/u01/oracle/root.sh

十.静默配置监听
通过response文件运行netca, 生成sqlnet.ora和listener.ora文件, 位于$ORACLE_HOME/network/admin目录下:
# su – oracle
$ $ORACLE_HOME/bin/netca /silent /responsefile /u01/database/netca.rsp
$ ll $ORACLE_HOME/network/admin/*.ora
$ lsnrctl status

oracle中用户登录的验证方法

oracle数据库中用户登录数据库时可以使用以下两种用户审计方法:
1.操作系统审计
2.密码文件审计

操作系统审计
在osdba和osper两个特定操作系统组中的成员能让dba通过操作系统来审计数据库而不用使用用户名和密码.这就是操作系统审核.这些操作系统组通常指osdba和osoper.这些组在数据库安装过程中被创建.他们的名字根据操作系统的不同有所不同

Operating System Group   UNIX User Group      Windows User Group
OSDBA                    dba                  ORA_DBA
OSOPER                   oper                 ORA_OPER

当oracle universal Installer使用这些缺省的名字,但是可以覆盖它们.覆盖它们的一个理由是在相同的主机上运行多个实例.如果每一个实例有一个不同的人作为dba,可以通过对每一个实例创建一个不同的osdba组来提高每一个实例的安全性.例如,在相同主机上有两个实例,第一个实例的osdba组叫dba1,第二个实例的osdba组叫dba2.第一个dba是dba1的成员,第二个dba是dba2的成员.因此使用操作系统审计每一个dba将能够只连接到指派给它的实例.

在osdba或osoper组中的成员用以下方法来影响连接数据库方式:
如果你是osdba组的成员,当连接数据库时可以指定as sysdba,然后将以sysdba系统权限连接到数据库

如果你是osoper组的成员,当连接数据库时可以指定as sysoper,然后将以sysoper系统权限连接到数据库

如果你不是这些操作系统组中的成员当你试图以sysdba或者sysoper进行连接时connect命令会失败

为了对一个管理用户启用操作系统审计:
1.对这个用户创建一个操作系统账号
2.将这个账号添加到osdba或osoper操作系统组中

使用操作系统审计进行连接
一个用户作为管理员通过操作系统审计来连接到本地数据库可以通过以下命令来实现:
connect / as sysdba
connect / as sysoper
对于windows平台,远程操作系统审计是一个安全连接被支持.但是必须指定远程数据库的网络服务名
CONNECT /@net_service_name AS SYSDBA
CONNECT /@net_service_name AS SYSOPER
而且客户端计算机和数据库主机必须在一个windows域中

密码文件审计
为了对一个管理用户启用密码文件审计必须执行以下操作:
1.如果没有创建密码文件使用orapwd工具创建一个密码文件:
orapwd file=filename entries=max_users
注意:
当使用DBCA来作为数据库安装的一部分时dbca将会创建一个密码文件
从oracle 11gR1开始,密码文件中的密码是区分大小写的除非你在命令行参数加入IGNORECASE=Y

2.将初始化参数remote_login_passwordfile设置为exclusive(这是缺省值)

3.使用sys用户连接到数据库(或者其它有管理权限的用户)

4.如果数据库中这个用户不存在,可以创建用户并指定密码
注意从oracle11gR1开始,数据库密码是区分大小写的(可以将sec_case_sensitive_logon设置为false来禁用区分大小写的功能)

5.给用户授予sysdba或sysoper系统权限
grant sysdba to oe;
这具语句将用户加入到密码文件中因此启用了as sysdba连接选项

管理员用户通过使用SQL*Plus connect命令可以连接到一个本地或远程数据库.它们必须使用它们的用户名和密码以及as sysdba或as sysoper子句来连接.从oracle11gR1开始密码是区分大小写的,只有在创建密码文件时使用IGNOECASE=Y选项才能禁用密码区分大小写这个功能

例如,用户已经被授予了sysdba权限,所以oe可以以下面的形式进行连接:
connect os as sysdba

SQL> grant sysdba to oe;

Grant succeeded.

SQL> conn oe as sysdba
Enter password:
Connected.

然而用户oe没用被授予sysoper权限所以下面的命令将会失败:
CONNECT oe AS SYSOPER

注意:操作系统审计优先于密码文件审计.尤其如果你是osdba或osoper操作系统组的成员而以sysdba或sysoper连接时,你将以管理权限进行连接而不管你指定的username/password

如果你不是osdba或osoper组的成员且在密码文件中也不存在,那么试图以sysdba或sysoper连接时会失败

创建和管理密码文件
可以使用密码文件创建工具orapwd来创建一个密码文件.对于有些操作系统可以创建密码文件作为标准安装的一部分

使用orapwd工具来创建一个密码文件
orapwd命令的语法如下:
ORAPWD FILE=filename [ENTRIES=numusers] [FORCE={Y|N}] [IGNORECASE={Y|N}]

file:指定密码文件名称,必须提供完全路径.如果只提供文件名,这个文件将会写在当前目录下.

entries:密码文件中允许的最大的条目数(用户账号)

force:如果为y允许覆盖已经存在的密码文件
ignorecase:如果为y密码将会是大小写敏感的
在(=)字符周围不允许空隔
这个命令会提示输入sys密码并将密码存储在密码文件.

下面的命令创建一个名为orapworcl密码文件允许有30个密码不同的权限用户
orapwd file=orapworcl entries=30

[oracle@jyrac1 ~]$ ls -lrt
total 4
drwxr-x--- 3 oracle oinstall 4096 Mar 24 13:27 oradiag_oracle
[oracle@jyrac1 ~]$ orapwd file=orapworcl entries=30

Enter password for SYS:
[oracle@jyrac1 ~]$ ls -lrt
total 12
drwxr-x--- 3 oracle oinstall 4096 Mar 24 13:27 oradiag_oracle
-rw-r----- 1 oracle oinstall 5120 Apr  4 08:49 orapworcl

orapwd命令行参数的描述
file:这个参数设置将要创建的密码文件名称.对这个文件必须指定完全路径.这个文件的内容被加密存储且文件不能直接被读取.这个参数是强制性参数

密码文件的文件名是操作系统特定的.有些操作系统要求密码文件坚持一种特定格式并存储在特定目录.其它的操作系统允许使用环境变理来指定密码文件的名称和位置

下面的表格列出了在unix,linux和windows平台下密码文件所要求的名称和位置.
表1-1

-------------------------------------------------------------
平台             要求的名称          要求的位置
-------------------------------------------------------------
unix and linux   orapwORACL_SID      ORACLE_HOME/dbs
Windows          PWDORACLE_SID.ora   ORACLE_HOME\database
-------------------------------------------------------------

例如,对于一个sid为orcldw的数据库实例,密码文件在linux平台下名称必须为orapworcldw,在windows平台上名称必须为PWDorcldw.ora

在oracle rac环境中要求设置一个环境变量来设置密码文件的路径,每一个实例的环境变量指向相同的密码文件

注意:保护密码文件和标识密码文件位置的环境变量对于系统安全至关重要.任何用户可能会执行威胁安全的连接

entries:这个参数指定密码文件可以接受的最大条目数.这个数字对应允许以sysdba或sysoper权限连接到数据库的不同用户的个数.可以通过v$pwfile_users视图来查看数据库中可以以sysdba或sysoper权限连接到数据库的用户个数

SQL> select * from v$pwfile_users;

USERNAME                       SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS                            TRUE  TRUE  FALSE
OE                             TRUE  FALSE FALSE

密码文件中实际允许存储的密码条目数可能比指定的数大,因为orapwd工具会继续存储密码条目直到一个操作系统块被填满为止.例如,如果操作系统块大小是512字节,它将存储四个密码条目.允许的密码条目数总是4的倍数.

当用户被添加到密码文件中或从密码文件中删除用户时条目可以重用.如果打算指定remote_login_passwordfile=exclusive且允许给用户授予sysdba和sysoper权限那么这个参数是必须要指定的.

注意:当你超过允许的密码条目数时你必须创建一个新的密码文件.为了避免这个问题你允许分配的密码条目数必须比你期望的密码条目数大.

force:这个参数如果说设置为y将能够覆盖一个已经存在的密码文件.当这个参数被忽略或者被设置为n时如果已经存在一个同名的密码文件就会返回一个错误信息.

[oracle@jyrac1 ~]$ orapwd file=orapworcl entries=30

Enter password for SYS:

OPW-00005: File with same name exists - please delete or rename
[oracle@jyrac1 ~]$ orapwd file=orapworcl entries=30 force=n

Enter password for SYS:

OPW-00005: File with same name exists - please delete or rename
[oracle@jyrac1 ~]$ orapwd file=orapworcl entries=30 force=y

Enter password for SYS:

ignorecase:如果这个参数设置为y,密码是不区分大小写的.也就是说在使用密码文件中的密码与用户在登录时提供的密码进行比较时会忽略大小写.

共享和禁用密码文件
可以通过初始化参数remote_login_passwordfile来控制一个密码文件在多个oracle数据库实例之间是否共享.也可以使用这个参数来禁用密码文件审计.remote_login_passwordfile参数允许的参数值如下:
none:这个参数设置为none时oracle数据库认为密码文件不存在.也就是说在不安全连接的情况下不允许进行特权连接,或者说不能远程登录数据库

exclusive:(缺省值)一个exclusive密码文件只能被一个数据库实例使用.只有一个exclusive文件能被修改.使用一个exclusive密码文件能让你添加,修改和删除用户.也能使用alter user命令来修改sys用户的密码.

shared:一个shared的密码文件能被一个主机上的多个数据库或一个rac中的多个实例来使用.一个shared密码文件不能被修改.因此你不能向一个shared的密码文件中添加用户.任何试图修改sys用户的密码或者其它用户的sysdba或sysoper权限的操作都会生成一个错误.所有需要sysdba或sysoper系统权限的用户必须在remote_login_passwordfile设置为exclusive时被添加到密码文件中.在所有的用户被添加到密码文件之后再修改remote_login_passwordfile为shared再共享密码文件.

这个选项在管理多个数据库或oracle rac数据库时是非常有用的.

如果remote_login_passwordfile设置为exclusive或shared且密码文件丢失这就等价于remote_login_passwrodfile为none.
当remote_login_passwordfile为none时

SQL> show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------
remote_login_passwordfile            string      NONE
SQL> SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != 'SYS' AND SYSDBA='TRUE';

no rows selected

SQL> select * from  V$PWFILE_USERS;

no rows selected

当remote_login_passwordfile为none时查询v$pwfile_users视图是查询不到被授予sysdba权限的用户记录
密码文件orapwjycs存在

[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 10:15:06 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
ERROR:
ORA-01017: invalid username/password; logon denied

远程登录是不能连接到数据库

当remote_login_passwordfile为exclusive时

SQL> show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------
remote_login_passwordfile            string      EXCLUSIVE
[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 2560 Apr  4 09:56 spfilejycs.ora
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs

将密码文件orapwjycs删除

[oracle@jyrac1 dbs]$ mv orapwjycs orapwjycs.bak
[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 2560 Apr  4 09:56 spfilejycs.ora
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs.bak

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 09:59:46 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
ERROR:
ORA-01031: insufficient privileges

远程登录时是连接不了数据库的
现在恢复密码文件orapwjycs

[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 09:58:49 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
已连接。

远程登录是能连接数据库

当remote_login_passwordfile为shared时

SQL> show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------
remote_login_passwordfile            string      SHARED

删除密码文件orapwjycs

[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora
[oracle@jyrac1 dbs]$ mv orapwjycs orapwjycs.bak
[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs.bak
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 10:10:56 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
ERROR:
ORA-01031: insufficient privileges

远程登录时是连接不了数据库

现在恢复密码文件orapwjycs

[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs.bak
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora
[oracle@jyrac1 dbs]$ mv orapwjycs.bak orapwjycs
[oracle@jyrac1 dbs]$ ls -lrt
total 24
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:27 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Mar 24 13:31 hc_jycs.dat
-rw-r----- 1 oracle oinstall   24 Mar 24 13:32 lkJYCS
-rw-r----- 1 oracle oinstall 1536 Apr  4 10:01 orapwjycs
-rw-r----- 1 oracle oinstall 2560 Apr  4 10:08 spfilejycs.ora

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 4 10:12:24 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn sys/zzh_2046@231_jycs as sysdba
已连接。

远程登录能连接到数据库

注意:如果remote_login_passwordfile设置为shared是不能修改sys用户的密码的如果你试图修改就会返回错误信息.

SQL> show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------
remote_login_passwordfile            string      SHARED
SQL> alter user sys identified by "zzh_2046";
alter user sys identified by "zzh_2046"
*
ERROR at line 1:
ORA-28046: Password change for SYS disallowed

保持管理员密码与数据字典同步
如果你将remote_logic_passwordfile初始化参数从none改成exclusive或shared或者使用不同的sys用户的密码来重新创建密码文件,那么必须要确保sys用户在数据字典中的密码与密码文件中的密码是相同的.

为了同步sys用户密码可以使用alter user语句来改变sys用户密码.alter user语句会更新和同步数据字典和密码文件中的密码

为了同步以sysdba或sysoper权限来登录数据库的非sys用户的密码,必须先回收这些权限然后再重新授权:
1.找到所有已经被授予sysdba权限的所有用户

SQL> select * from  V$PWFILE_USERS;

USERNAME                       SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS                            TRUE  TRUE  FALSE
OE                             TRUE  FALSE FALSE

SQL> SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != 'SYS' AND SYSDBA='TRUE';

USERNAME
------------------------------
OE

2.回收这些非sys用户的sysdba权限然后再重新授予sysdba权限

SQL> revoke sysdba from oe;

Revoke succeeded.

SQL> SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != 'SYS' AND SYSDBA='TRUE';

no rows selected

SQL> grant sysdba to oe;

Grant succeeded.

SQL> SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != 'SYS' AND SYSDBA='TRUE';

USERNAME
------------------------------
OE

3.找出所有已经被授予sysoper权限的所有用户
SELECT USERNAME FROM V$PWFILE_USERS WHERE USERNAME != ‘SYS’ AND SYSOPER=’TRUE’;

4.回收非sys用户的sysoper权限然后再重新授予sysoper权限
REVOKE SYSOPER FROM non-SYS-user;
GRANT SYSOPER TO non-SYS-user;

向密码文件添加用户
当你给用户授予sysdba或sysoper权限后,这个用户的用户名和权限信息将被添加到密码文件中.如果服务器没有一个exclusive密码文件(也就是说初始化参数remote_login_passwordfile被设置为none或shared,或者密码文件丢失),如果你试图授予这些权限时oracle数据库会返回一个错误信息.

只要用户有这两个权限中一个这个用户的用户名就会保留在密码文件中.如果你回收这些权限,那么oracle数据库会从密码文件中删除这些用户.

创建一个密码文件并向密码文件中添加用户
1.使用orapwd工具创建密码文件
orapwd命令的语法如下:
ORAPWD FILE=filename [ENTRIES=numusers] [FORCE={Y|N}] [IGNORECASE={Y|N}]

2.设置初始化参数remote_login_passwordfile为exclusive(这是缺省值)
注意:remote_login_passwordfile是一个静态初始化参数因此在不重新启动数据库的情况下是不能修改这个参数的.

3.使用有sysdba权限的用户连接到数据库

SQL>conn sys/zzh_2046 as sysdba

4.启动数据库

SQL> startup
ORACLE instance started.

Total System Global Area  630501376 bytes
Fixed Size                  2215984 bytes
Variable Size             385880016 bytes
Database Buffers          234881024 bytes
Redo Buffers                7524352 bytes
Database mounted.
Database opened.

5.创建必要的用户授予sysdba或sysoper权限

SQL> create user test identified by test;

User created.

SQL> grant sysdba to test;

Grant succeeded.

SQL> grant sysoper to test;

Grant succeeded.

SQL> select * from  V$PWFILE_USERS;

USERNAME                       SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS                            TRUE  TRUE  FALSE
OE                             TRUE  FALSE FALSE
TEST                           TRUE  TRUE  FALSE

授予和回收sysdab和sysoper权限
如果你的服务器使用一个exclusive密码文件,使用grant语句给用户授予sysdba或sysoper系统权限,例如:
SQL>grant sysdba to oe;

使用revoke语句来回收用户的sysdba或sysoper系统权限,例如:
SQL>revoke sysdba from oe;

因为sysdba和sysoper是最强大的数据库权限,在grant语句中没有使用with admin option选项.也就是被授予权限的用户不能给其它的用户授予sysdba或sysoper权限.只能有一个以sysdba权限的用户连接到数据库能授予或回收其它用户的sysdba或sysoper系统权限.这些权限不能被授予角色,因为角色只能在数据库启动后才可用.不要将sysdba和sysoper数据库权限与操作系统角色混淆.

查看密码文件成员
使用v$pwfile_users视图来查看哪些被授予sysdba或sysoper或sysasm系统权限的用户.这个视图会显示以下信息:
username:这个列包含了由密码文件识别的用户的用户名
sysdba:如果这个列为true那么用户可以使用sysdba系统权限来登录数据库
sysoper:如果这个列为true那么用户可以使用sysoper系统权限来登录数据库
sysasm:如果这个列为true那么用户可以使用sysasm系统权限来登录数据库
注意:sysasm只用于oracle asm实例

维护密码文件
维护密码文件包括以下操作:
1.如果密码文件填充满后扩展密码文件用户数
2.删除密码文件

扩展密码文件用户数
当你向用户授予sysdba或sysoper系统权限因为密码文件已经填充满了而返回一个错误信息那么必须创建一个更大的密码文件并重新给用户授予权限.

替换密码文件
使用一面的过程来替换密码文件:
1.通过查询v$pwfile_users视图来识别哪些用户有sysdba或sysoper权限

2.删除已经存在的密码文件

3.使用orapwd工具来创建一个新的密码文件.确保entries参数的值比你认为将来使用的值要大

4.向密码文件中添加用户

删除密码文件
如果你判断你将不需要使用密码文件来审计用户,可以删除密码文件,然后重新设置remote_login_passwordfile初始化参数为none.在删除密码文件之后,只有哪些由操作系统验证的用户能执行sysdba或sysoper数据库管理操作.

oracle优化器之执行计划

什么是执行计划
执行计划显示了执行一个sql语句所需步骤的详细信息.这些步骤代表了一组数据库操作它们会消费和生产行数据.这些操作的顺序以及它们的实现取决于查询优化器对查询转换和物理优化技术的联合使用.执行计划通常是以表格形式来显示,这个执行计划实际上是一个树形结构.例如下面是一个基于sh方案的查询:
SELECT prod_category, AVG(amount_sold)
FROM sales s, products p
WHERE p.prod_id = s.prod_id
GROUP BY prod_category;
下面的表格是上面语句的执行计划:
1

树形结构形式的执行计划如下:
2

上面的表格代表了一个自上而下,从左到右遍历的执行树.当读取一个执行计划树时你应该从底部的左边开始然后自下而上.在上面的这个例子中从查看树的叶子块开始.在这种情况下树的叶子块是对products和sales表进行全表扫描来实现的.由这些表扫描产生的行数据将被连接操作来消费使用.这里连接操作是一个哈希连接.最后group-by操作使用哈希来实现的它将消费由连接操作产生的行数据并将最终结果返回给终端用户.

显示执行计划
有两种常用的方法来显示一个sql语句的执行计划:
Explain plan命令—它能不用实际执行sql语句就能显示出其执行计划

V$sql_plan—在oracle9i中引入的一个动态性能视图它显示一个sql语句已经被编译成游标并存储在游标缓存中的执行计划.在特定条件下使用explain plan显示的执行计划可能不同于使用v$sql_plan所显示的执行计划.例如,当sql语句包含绑定变量时使用explain plan在显示执行计划时会忽略掉绑定变量的值,当使用v$sql_plan显示执行计划时会在生成执行计划的过程中考虑绑定变量的值.
在oracle9i中引入了dbms_xplan包使得显示执行计划变得更加容易,而且这个dbmx_xplan包在后续的版本中功能更加增强了.这个dbms_xplan包提供了一些pl/sql接口来显示不得来源的执行计划:
Explain plan命令
V$sql_plan
Automatic workload repostitory(Awr)
Sql tuning set(STS)
Sql plan baseline(spm)

使用explain plan命令与dbms_xplan.display函数
下面的例子将说明使用dbms_xplan包所提供的不同函数来怎样生成和显示执行计划
3
Dbms_xplan.display函数的参数如下:
Plan table name(缺省值是’plan_table’)
Statement_id(缺省值是null意味着最后一个被插入plan table的语句)
Format 控制着显示信息的总量(缺省值是’typical’)

为了利用explain plan的功能你需要有合适的权限来运行你要试图explain plan的语句.一个缺省的plan_table对于每一个用户都是存在的不需要提前创建.

使用dbms_xplan.display_cursor函数
一种替代的方法是真实执行sql语句来生产执行计划并使用dbms_xplan.display_cursor函数来显示执行计划.
4
Dbms_xplan.display_cursor函数的参数值如下:
Sql_id(缺省值是null,意味着在这个会话中最后一个执行的sql语句)
Child number(default 0),
Format 控制着显示信息的数量(缺省值是’typical’)
除了要有实际运行这个sql语句的权限之外还要有对v$sql_plan,v$sql_plan_detail和select_catalog_role的select权限.

格式化执行计划
Dbms_xplan包中函数的格式化参数是高度可定制的在执行计划输出中可以根据需要来显示少量或大量的详细信息.这里有三个预先定义的格式变量:
Basic 在执行计划中只会显示ID,operation和name列
Typical 在执行计划中显示了在basic级别的信息之外还包括了额外优化相关的内部信息比如,cost,cardinality,estimates等等.在执行计划中这些信息显示了每一个操作优化器所认为的操作成本,生成的行记录数等等.也显示了每一个操作的谓词评估.有两种类型的谓词:access和filter.access谓词对于索引来说将通过对合适的列应用搜索条件来检索相关的数据块.filter谓词在检索数据块后来进行评估.

All 在执行计划中显示了在typical级别的信息之外还包括了每一个操作产生的表达式(列)列表.提示别名和查询块名字属于outline信息.最后两个片段的信息可以作为参数对语句添加提示.

低级别的选项可以包括或者排除详细信息比如谓词和cost信息.下面的信息显示了基本的执行计划和谓词信息和优化器成本列cost
5
也可以使用低级别的参数来排除其它信息.下面的例子显示了排除优化器成本cost和bytes列信息:
6

Note部分
除了执行计划和谓词信息之外,dbms_xplan包在note部分显示了其它的信息.比如在查询优化或星型转换时应用于查询的动态抽样.例如下面的例子中表sales没有统计信息,所以优化器在查询优化时使用动态抽样,在显示执行计划时加上note信息:
7
Note部分的信息当格式选项被设置为typical或all时是自动显示的.

什么是成本
Oracle优化器是一个基于成本的优化器.对一个sql语句选择执行计划它其实只是优化器考虑的许多替代执行计划中的一个.优化器会选择成本值最低的执行计划.这里的成本代表了对执行计划的资源使用的评估.成本值越低的执行计划其执行效率会越高.优化器成本模型会对查询计算IO,CPU和网络资源使用情况.
8
在执行计划中整个执行计划的成本(在第0行显示),每一个单独的操作也显示了执行成本.然而它并不能可以调整.这个成本是一个内部单元用于执行计划的比较.

理解执行计划
为了判断你是否正在查找一个好的执行计划,需要理解优化器判断执行计划首先要考虑的是什么.如果优化器在其评估或者计算中有任何问题导致了选择了次优的执行计划,你应该查看执行计划和其评估.评估的组件有:
Cardinality—-评估每一个操作将产生的行记录数
Access method —-数据被访问的方法可以是表扫描或索引扫描
Join method –-用于表连接的方法(哈希,排序合并,嵌套循环)
Join order –表连接的先后顺序
Partition pruning –-对于查询来说只有必须要被访问的分区才会被访问
Parallel execution –在并行执行情况中,执行计划中的每一个操作是否正在被并行执行,是否使用了正确的数据分布方法

下面将详细说明在执行计划中的这些组件.
Cardinality
基数是评估每一个操作将返回的行记录数.优化器判断每一个操作的基数是基于输入的表和列级统计信息(或者通过动态抽样所得到的统计信息)并使用复杂的一组公式来评估的.在一个单表查询(没有直方图信息)中只有一个等值谓词时将会使用一个简化的公式.在这种情况下优化器会假设列的数据是均匀分布且计算这个查询的基数是通过将表的总行数除以谓词列中不重复值的个数.
下面的查询hr方案中的employees表中107行记录
9

在表employees中job_id有19个不相同的值所以优化器预测这个查询语句的基数为107/19=5.6因此用dbms_xplan显示为6行

评估基数是很重要的因此尽可能的准确因为他们会影响执行计划的访问路么,连接顺序.然而有多个因素可能导致错误的基数评估即使当基表和列统计统计信息及时更新的情况下.这些因素包括:
数据倾斜
对单个表使用多个单列谓词
在where子句谓词中使用函数加密的列
复杂的表达式

在前面的例子中在employees表中的job_id的数据是倾斜的.不是每一个job_id都有相同的雇员数.实际上在employees表中job_id为’AD_VP’的只有两个雇员,优化器评估的的大小是他的三倍.为了精确的反映数据倾斜,需要对job_id列生成直方图.直方图的出现将会改变优化器基数评估的公式.

缺省情况下oracle会基于列使用的统计数据和数据倾斜的出现来自动判断列需不需要生成直方图.如果要手动创建直方图可以使用下面的命令:
SQL > Exec DBMS_STATS.GATHER_TABLE_STATS(‘HR’,’EMPLOYEES’,
method_opt=>’FOR COLUMNS SIZE 254 JOB_ID’);
当有了直方图后优化器能评估出将要返回的正确行数:
10
尽管对于这个查询有了更准确的基数评估后执行计划没有发生变化但还是要准确的评估其基数.

判断正确的基数
为了手动判断优化器是否已经正确的评估了正确的基数,可以对于查询中的每一个表使用一个简单的select count(*) 查询并应用属于这个表的where子句来检查.对于这个例子可以先使用:
11

另外也可以在sql语句中使用gather_plan_statistics提示来自动收集全面的运行时统计信息.这个提示会记录在每一步操作中真实的基数(返回的行数).执行时(运行)基数使用格式化参数’allstats last’的dbms_xplan.display_cursor可以在执行计划中显示出来.额外的列叫做A-Rows它是实际返回的行数
12
注意使用gather_plan_statistics提示对sql语句的执行时间有影响,所以你应该只在分析的情况下使用它.当初始化参数statistics_level=all的情况下不使用gather_plan_statistics提示也是可以显A-Row列. SQL*Monitoring功能—oracle enterprise manager或者pl/sql接口对于sql语句总是会显示A-Rows列而不会有任何开销.
13

Access method
访问方法或访问路径—显示了每一个表(或索引)中的数据将怎样被访问.访问方法是在执行计划中的operation列显示的
14
Oracle支持九种常见的访问方法:
Full table scan –从一个表中读取所有的行记录并过滤掉不满足where子句中谓词条件的记录.一个全表扫描将使用多块IO(通常是1MB IOs).当要从一个表中返回大部分行记录,或者表中没有索引或者存在的索引不能被使用或者它的成本值最低时就会选择全表扫描.决定使用全全扫描也会受以下因素影响:
初始化参数db_multi_block_read_count
Parallel degree
Hints
缺少可用的索引
使用索引的成本更高

Table access by rowed—行的rowid指定的数据文件,数据块,以及行在数据块中的位置.oracle首先从where子句的谓词或者从表中的一个索引或多个索引中获得rowid.oracle然后会基于获得的rowid来回表定位所选的每一行记录的位置再一行一行访问.

Index unique scan—扫描唯一索引只会返回一行记录.在等值谓词用于一个唯一索引或一个主键列上会使用唯一索引扫描
15

Index range scan—oracle访问相邻的索引条目然后使用索引中的rowid值来从表中检索相关的行记录.索引范围扫描可以是有边界也可以是无边界.当对一个非唯一索引键使用等值谓词或者对一个唯一键使用非等值或范围谓词时将会使用索引范围扫描(=,< ,>,like),数据会以索引列的升序返回.
16

Index range scan descending 索引范围降序扫描—与索引范围扫描的概念是相同的,当order by … descending子句中的列是某个索引列表的子集时就会使用.

Index skip scan –正常情况下为了使用一个索引,索引键的前缀(索引的前导列)将要在查询中被引用.然而,除了索引中的第一列外其它的列在语句中被引用,oracle可以进行索引跳跃扫描来跳过索引的第一列而使用剩下的列.如果在一个复合索引中前导列只有几个不同的值而在非前导列中有大量不同值时是有用的.

Full index scan—完全索引扫描不会读取索引结构中的每一个索引块.索引完全扫描会处理索引的所有叶子块,但只在足够的分支块中找到第一个叶子块.当查询语句中所引用的列都在索引列中存在这时使用完全索引扫描比扫描表成本更低.在以下情况下可能使用单块IO:
一个orader by子句有索引中所有的列且顺序和索引相同(也可以是索引列中的子集)
查询要求执行一个排序合并连接且查询中所引用的所有列都出现在索引列中
查询中引用列的顺序与索引前导列的顺序相同
一个group by 子句出现在查询中,group by子句中的列出现在索引列中.

Fast full index scan—这是一种替代的完全表扫描当索引包含查询所需要的所有列时且在索引键中至少有一个列有not null约束.它不能用来消除一个排序操作,因为数据访问不遵循索引键.它将使用多块读来读取索引中的所有索引块,与完全索引扫描不一样.

Index join—连接相同表中的 多个索引这个集合包含了查询中所引用的所有列.如果索引连接被使用那么就不需要进行表访问.因为所有相关的列都能从索引中得到,索引连接操作不能消除排序操作.

Bitmap index—位图索引使用每一个索引键的一组位图值和一个映射函数将每一个位图转换成rowid.当where子句中的几个谓词使用boolean操作来解决and和or条件时oracle能够有效的合并位图索引

如果看到的执行计划中访问方法不是你所期望的,可以检查对这些对象的基数评估是不是正确的,连接顺序所允许的访问方法是不是你期待的

Join method
连接方法描述了来自两个数据生产者的数据怎样连接在一起.可以通过查看执行计划中的operations列来识别sql语句中的连接方法
17
Oracle数据库提供了几种连接方法和连接类型

Join methods

Hash joins—哈希连接用于大数据集的连接.oracle优化器在内存中基于连接键使用两个表或者两个数据源中的小者来构建一个哈希表,然后扫描大表基于连接键执行相同的哈希运算.对于每一个值都会探测之前构建的哈希表如果匹配就返回这一行.

Nested loops joins—嵌套循环连接当第一要访问的表有较小的数据集且对于第二个表存在一种有效的访问方式(例如索引扫描)时是很有用的.对于第一个表(外部表)中的每一行,oracle将要访问第二个表(内部表)中的所有行.可认将它看作是两个嵌入的for循环.在oracle11g中为了减少物理I/O的整体延迟嵌套循环连接的内部实现发生了改变,所以在执行计划中的operations列中会看到两个nested loops.在之前的oracle版本中只会看到一个.
18

Sort merge joins—当两个表的连接条件是等值条件时排序合并连接是非常有用的,比如< ,<=,>,>=.对于大数据集来说排序合并连接比嵌套循环连接性能更好. 排序合并连接是由两个步骤组成:
排序连接操作:所有输入会基于连接键进行排序
合并连接操作:排序列表将被合并

如果一个表中存在一个索引能够消除排序操作那么排序合并连接就更会被优化器所选择.在下面的例子中只有来自sales表的记录需要进行排序(ID 5),而products表中的记录基于连接键使用主键索引已经被排序了(ID 4).
19

Cartesian join—优化器用一个数据源中的每一行与另一个数据源中的所有行进行连接.通常情况下如果被调用的表较小或都一个或多个表与语句中的任何其它表没有连接条件的情况下会被优化器选择.笛卡尔连接不常见,所以当它出现时可能是基数评估出现了问题.
20

Join types
Oracle提供了几种连接类型:inner join,(left) outer join,full outerjoin,anti join,semi join,grouped outer join等等.其中inner join是最常见的连接类型,因此执行计划中没有出现关键字”inner”.

Outer join—外连接将返回满足条件的所有行和没有使用(+)标识的其它表中不满足连接条件的行记录.例如t1.x=t2.x(+),这里t1是左表它的不满足连接条件的行记录将会被返回.
21

Join order
连接顺序是在一个多表sql语句中每一个表被加入连接的一个顺序.为了判断一个执行计划中表的连接顺序可以查看operation列中表的缩进,在下面的图表中sales和products表的缩进是相同的且它们都比customers表更缩进.因此sales和products表首先使用一个哈希连接进行连接然后它们的连接结果再与customers表进行哈希连接.
22

在一些复杂的sql语句中通过查看operations列中表的缩进来判断表的连接顺序是不容易的.在这种情况下使用带有format参数的dbms_xplan过程来显示执行计划的outline信息,它包括了连接顺序.例如,下面的图表是使用带有format选项的dbms_xplan.display_cursor来生成outline信息.
DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>’Typical + outline’));
23

在outline信息中查看以leading开头的行.这一行显示了查询的连接顺序.在这个例子中可以看到”P”,”S”,”C”三个字母,这三个字母是查询中所引用的三个表的别名.P(products)表与S(sales)表进行连接然后再与C(customers)表连接.

连接顺序是基于成本来决定的所以基数评估和访问路径对连接顺序是有强烈影响的.优化器也总是遵守一些基本规则:
大多数产生一行结果集的连接总是会先被执行.优化器基于表的unique和primary key约束来进行判断.

当使用外连接时没有外连接操作符(+)的表必须在谓词中其它有外连接操作符的表之后这样才能确保不满足连接条件的行记录才能被加入到返回结果集中.

当一个子查询已经被转换成反连接或半连接时那么子查询中的表将在外部查询块中的表之后进行连接.然而,哈希反连接和哈希半连接在特定情况会覆盖这种连接顺序.

如果不能进行视图合并那么视图中的所有表会在与视图外部表连接之前进行连接

如果连接顺序不是你所期待的那么检查每一个对象的基数评估和访问方法是否正确.

Partitioning
分区允许一个表,索引或索引组织表被分成一些较小的片段.每一个数据库对象的片段叫作分区.分区修剪或分区消区是使用分区来提高性能的最简单的方法.例如一个程序有一个orders表包含了最近2年所有的订单记录.而且这个orders表通过day来进行分区.一个查询只查询一周的订单记录它只会访问orders表的7个分区而不是730个分区.
分区修剪在执行计划中的pstart和pstop列中是可见的.pstart列包含了将被访问的第一个分区,pstop列包含了将被访问的最后一个分区.在下面的图表中sales表有4个分区被访问,分区名是9,10,11,12
24
当对一个按day进行分区并且按cust_id列进行子分区的表进行一个简单查询那么在pstart和pstop列中会出现更多的数字,这些额外的数字意味着什么例如:
25

当使用组合分区时,oracle每一个分区的数字从1到n(绝对分区数字).对于一个只有一层分区的表,这些绝对数代表了单层分区表在磁盘上的真实物理段.

在组合分区表中,然而一个分区是一个逻辑条目不代表磁盘上的真实物理段.每一个分区又是被细分为多个子分区.每一个子分区的分区数字从1到m(单个分区的相对子分区数字).最终组合分区表中的所有子分区都被指定一个全局数字从1到(n*m)(绝对子分区数字).这些绝对数字代表了组合分区表在磁盘上的真实物理段.
26

所以在之前的执行计划中line 4这一行的pstart和pstop列中的数字为10,代表了全局分区数代表了磁盘上的物理段.执行计划中的line 2这一行中的pstart和pstop列的数字为5代表了分区号,执行计划中的line 3这一行中的pstart和pstop列的数字为2代表分区的了相对子分区号

在有些情况下在pstart和pstop列会出现字母或单词而不是数字.例如在这些列中可以看到单词KEY.这说明在解析时不能识别,查询将访问哪个分区但优化器相信在执行时(动态修剪)分区修剪将会发生.当查询中的基于分区键列等值谓词中包含一个函数时就会出现这种情况.例如time_id=sysdate,另一种情况动态修剪会发生当查询中在分区键列上有一个连接条件且这个表不是与分区表的所有分区进行连接时,例如,因为一个filter谓词,分区修剪将在执行时发生.在下面的例子中,time表与sales表基于分区键time_id进行连接,在where子句谓词被应用到time表且合适的time_ids被选择后那么分区修剪在执行时会发生.
27
如果分区修剪不象预期那样发生那么检查分区键列上的谓词.确保谓词使用了与分区键列相同的数据类型.也可以检查执行计划中的谓词信息部分的内容.如果表是哈希分区,如果基于分区键列的谓词是一个等值或in-list谓词那么分区修剪将会发生.所以如果一个表是多列哈希分区,那么只有哈希分区中的所有列都在谓词中出现才会发生分区修剪.

Parallel execution
Oracle中的并行执行是基于一组协调原则(通常叫作查询协调器或QC)和并行服务器进程的.QC在并行执行中对单个会话中初始化并行sql语句和并行服务器进程来执行工作.QC将工作分配给并行服务器进程且并可能要执行较小的不能被并行执行的工作.例如一个使用sum()操作的的并行查询要求将每个并行服务器进程的计算结果求和
28
QC在并行执行计划中是很容易识别的因为会出现它的名字.在下面的图表中可以查看ID 1这一行就会看到在operation列中的PX COORDINATOR.在执行计划中在这一行之上的所有操作都是由QC来完成的.因为这些操作是由单进程串行执行完成的.通常要最小化由QC所有完成的操作.在PX COORDINATOR之下的所有操作通常是由并行服务器进程所完成的.
29

Granules
粒度是指派给并行服务器进程工作的最小单元.为了在并行服务器进程之间得到均匀的工作分布粒度数量通常比请求的DOP高.每一个并行服务器进程将只会完成分配给它的工作粒度当它完成指定的工作粒度后会得到另外的工作粒度直到所有的工作粒度都被执行完成为止.oracle数据库对于并行执行分配工作使用的基本机制就是基于数据块范围或基于数据块粒度.在执行计划中可以看到粒度是怎样分配给并行服务器进程的.在下面图表中的执行计划中的line 7这一行的operation列中可以看到’PX BLOCK ITERATOR’,这意味着并行服务器进程将遍历完所生成的数据块范围粒度来完成表扫描.
30

虽然基于数据块粒度是最常见的方法,这里有些操作可能会受益于分区表的底层数据结构.这些情况下分区表将成为一个工作粒度.使用基于分区粒度一个并行服务器进程将以单个分区的所有数据为一个工作粒度.如果在操作中被访问的分区数至少等于DOP时oracle优化器会考虑基于分区的工作粒度,在下面的图表中在执行计划中的line 6这一行的operation列可以看到’PX PARTITION RANGE ALL’意味着每一个并行服务器进程将只会完成分区表中的一定范围的分区.
31
基于sql语句的并行度,oracle数据库将决定是使用基于数据块还是基于分区的工作粒度来完成更优的执行.
Producers and consumers
为了有效的并行执行一个sql语句,并行服务器进程实际上是以工作集来一起完成这项工作的.一组是生产行(生产者),一组是消费行记录(消费者).例如在下面的图表中,在sales和customers表之间的并行连接使用两组并行服务器进程.生产者将扫描两个表并应用所有谓词条件然后将结果发送给消费乾(lines 9-11和lines 5-7).可以很容易的识别生产者因为它们是在PX SEND操作(line 9 & 5)之下执行操作.消费者完成实际的哈希连接并将结果发送给QC(line 8和lines 2-4).消费者可以通过PX RECEIVE来识别因为在它们执行工作之先必须先执行PX RECEIVE操作(line 8 & 4).而它们总是通过PX SEND QC(line 2)
32

在执行计划中在TQ列显示了类似的信息,它显示了哪一组并行服务器进程被执行.在执行计划中Q100组并行服务器进程(生产者)将首先扫描customers表.它然后将结果发送给消费者(line 5)Q102,Q100组并行服务器进程然后变成Q101组并行服务器进程(另一组生产者),Q101扫描sales表然后发送给消费者(line 9),Q102组并行服务器进程(消费者)接收来自生产者(line 8 & 4),完成连接(line 3)然后将结果发送给查询协调器
33
Data redistribution
在这个例子中有两个大表customers和sales在连接中被调用.为了以并行来处理这个连接,在生产者和消费者之间重新分配行源是必要的.生产者将基于数据块范围来扫描表并应用谓词条件然后将结果发送给消费者.在执行计划中的IN-OUT和PQ Distrib两列中有关于数据在生产者和消费者之间数据是怎样重新分配的信息.PQ Distrib列最有用的列且有些情况下已经替代了IN-OUT列.

下面有五种最常用的数据重新分配方法
Hash:为了在并行服务器进程之间完成一个相等的重新分配哈希数据重新分配是非常常见.一个哈希函数被应用于连接列且结果指示了哪一个消费者并行服务器进程将接收这些行源.

Broadcast:广播重新分配发生在当连接操作中两个结果集中的一个比另一个小得多的时候.代替对两个结果集重新分配行记录.数据库为了保证单个并行服务器进程能够完成它的连接操作将小结果集发送给所有消费者并行服务器进程.

Range:范围重新分配通常用于并行排序操作.单个并行服务器进程以数据范围进行工作所以QC没有进行任何排序但只存在单个并行服务器进程的结果的顺序是正确的.

KEY:键值重新分配确保结果集中单个键值被集簇在一起.这是一种优化主要用于partial partition-wise joins来确保在连接中只有一边被重新分配.

Round robin:循环数据重新分配是在发送数据到请求进程之前最后的重新分配操作.当没有重新分配约束被请求时它也可以用于查询的早期阶段.

在RAC数据库中可以在重新分配方法中看到local后缀.在RAC中本地重新分配是为了对节点间的并行查询进行最小化互连通信.在这种情况下行只会被分配给与RAC相同节点的消费者.

在下面的图表中生产者使用一个hash重新分配方法将数据发送给消费者
34
你会注意到在执行计划中数据重新分配的位置IN-OUT列中的值有P->P(lines 5 & 9)或P->S(line 2).P->P意味着数据由一个并行操作发送给另一个并行操作.P->S意味着数据由一个并行操作发送给一个串行操作.在line 2这一行数据被发送给QC,它是一个单进程,因此是P->S.然而如果你看到一个P->S操作

结论
Oracle优化器的目的是用来判断查询的最有效执行计划的.它是基于查询数据的统计信息和oracle数据库功特性比如hash joins parallel query和partitioning来进行决策的.通过分析执行计划和评估四个关键因素:基数评估,访问路径,连接方法和连接顺序,能够判断一个执行计划是不是最有效的执行计划.