诊断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数据库管理操作.