Oracle12G将不再支持裸设备?

Oracle12G将不再支持裸设备?

一直以来,为了更好的IO性能,为了避免文件系统可能碰到的bug,可能很多DBA都倾向于在一些IO压力比较大的核心库上采用裸设备。毫无疑问,对比文件系统,裸设备的管理相对要复杂些,但其实一旦熟悉,基本上也相差不大。不过Oracle一直在存储和文件系统方面下功夫,ASM在OS层面不失为存储虚拟化的一个廉价解决方案,但是RAC的OCR和Voting Disk无法存放在ASM上,并且在稳定性,可靠性和可管理性还有待加强。在Oracle11g中,ASM已经有了不少的改进,并且有小道消息说Oracle准备将ASM发展成ASMFS,要是真的能实现,绝对具有吸引力。目前在淘宝的数据仓库环境中,RAC+ASM的组合还是比较让人满意的。至于OCFS,作为一个集群文件系统,应该说还有很长的路要走,而从Oracle11g来看,ASM才是Oracle力推的方式。

Oracle最近在Metalink上放出了一个文档(Note:578455.1 - Announcement of De-Support of RAW devices in Release 12G),号称在将来的12G版本中将放弃对裸设备的支持。当然,要实现这一目的,Oracle首先要提供一个足够说服客户的理由,比如未来ASM能够支持OCR和Voting disk,目前ASM还依赖CSS,肯定无法做到这一点,那么12g的ASM可能就是一个独立于整个clusterware的东西,这就无限接近于传说中的ASMFS了。

De-Support of Raw

This document is to announce the de-support of raw devices in a future Oracle 12 g release. This means customers can no longer keep their datafiles, OCR or Voting disks on raw devices in Oracle 12g.

If raw devices are not being used in the current release then there is nothing to be done. However if raw devices are being currently used, then planning should be done to migrate off the raw devices. There are many choices currently to replace raw devices, including ASM, OCFS, and other cluster file systems.

dba_indexes视图的性能

前端时间,在监控系统中加入了index的状态是否为unusable,以及其并行度是否有设置的监控:

select case when status='UNUSABLE' then
                'alter index '||owner||'.'||index_name||' rebuild online compute statistics;'
            when to_number(degree)>1 then
                'alter index /* '||degree ||' */'||owner||'.'||index_name||' noparallel;'
       end case
from (select * from dba_indexes where degree<>‘DEFAULT’) a
where status=’UNUSABLE’
or to_number(degree)>1
and owner not in (’SYS’,'SYSTEM’,'MANAGER’,'WMSYS’);

语句运行的速度很快,但是从statspack中发现这条语句的逻辑读单次高达26846。使用set autotrace比较了下9i和10g的执行计划和统计信息,发现9i查询这个视图的代价非常的高,而10g则有了一定的改善。在Oracle9i中,optimizer_mode默认是CHOOSE,所以查询数据字典使用了RBO,而Oracle10g则默认为ALL_ROWS,所以采用了CBO。

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
PL/SQL Release 9.2.0.6.0 - Production
CORE    9.2.0.6.0       Production
TNS for IBM/AIX RISC System/6000: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production

SQL> set autot trace
SQL> select * from dba_indexes;

1242 rows selected.

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   NESTED LOOPS (OUTER)
   2    1     NESTED LOOPS (OUTER)
   3    2       NESTED LOOPS
   4    3         NESTED LOOPS
   5    4           NESTED LOOPS (OUTER)
   6    5             NESTED LOOPS
   7    6               NESTED LOOPS (OUTER)
   8    7                 NESTED LOOPS
   9    8                   TABLE ACCESS (FULL) OF 'OBJ$'
  10    8                   TABLE ACCESS (BY INDEX ROWID) OF 'IND$'
  11   10                     INDEX (UNIQUE SCAN) OF 'I_IND1' (UNIQUE)
  12    7                 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
  13   12                   INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
  14    6               TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
  15   14                 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
  16    5             TABLE ACCESS (CLUSTER) OF 'USER$'
  17   16               INDEX (UNIQUE SCAN) OF 'I_USER#' (NON-UNIQUE)
  18    4           TABLE ACCESS (CLUSTER) OF 'USER$'
  19   18             INDEX (UNIQUE SCAN) OF 'I_USER#' (NON-UNIQUE)
  20    3         TABLE ACCESS (CLUSTER) OF 'USER$'
  21   20           INDEX (UNIQUE SCAN) OF 'I_USER#' (NON-UNIQUE)
  22    2       TABLE ACCESS (CLUSTER) OF 'SEG$'
  23   22         INDEX (UNIQUE SCAN) OF 'I_FILE#_BLOCK#' (NON-UNIQUE)
  24    1     TABLE ACCESS (CLUSTER) OF 'TS$'
  25   24       INDEX (UNIQUE SCAN) OF 'I_TS#' (NON-UNIQUE)

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      42924  consistent gets
          0  physical reads
          0  redo size
      98000  bytes sent via SQL*Net to client
       1558  bytes received via SQL*Net from client
         84  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       1242  rows processed

[继续阅读全文]

Oracle 9i和10g在create index和rebuild index的统计信息的区别

在9.2.0.6和10.2.0.4做了个小小的试验,演示9i和10g对于create index和rebuild index时统计信息的区别。这里列出试验的过程,由于结果比较明显,就懒得写太多文字做说明了。其中tbsql是一个常用脚本的集成环境,tbsql tabstat用户输出一个表以及列和索引的信息,其实就是关联dba_tables/dba_indexes/dba_tab_columns的一个查询。

先来看9.2.0.6的情况:

SQL> create table t as select * from all_objects;
Table created.

SQL> create index t_id on t(object_id);
Index created.
$tbsql tabstat t
           Table    Number           Empty  Average    Chain  Average
OWNER      Name    of Rows  Blocks  Blocks    Space    Count  Row Len
---------- ------ -------- ------- ------- -------- -------- --------
SYS        T

Column             Column                   Distinct
Name               Details                    Values Density
------------------ ------------------------ -------- -------
OWNER              VARCHAR2(30) NOT NULL
OBJECT_NAME        VARCHAR2(30) NOT NULL
SUBOBJECT_NAME     VARCHAR2(30)
OBJECT_ID          NUMBER(22) NOT NULL
DATA_OBJECT_ID     NUMBER(22)
OBJECT_TYPE        VARCHAR2(18)
CREATED            DATE NOT NULL
LAST_DDL_TIME      DATE NOT NULL
TIMESTAMP          VARCHAR2(19)
STATUS             VARCHAR2(7)
TEMPORARY          VARCHAR2(1)
GENERATED          VARCHAR2(1)
SECONDARY          VARCHAR2(1)

13 rows selected.

                        B                          Average     Average
Index                Tree  Leaf       Distinct Leaf Blocks Data Blocks Cluster
Name      Unique    Level  Blks           Keys     Per Key     Per Key  Factor
--------- --------- ----- ----- -------------- ----------- ----------- -------
T_ID      NONUNIQUE                                                    

Index     Column           Col Column
Name      Name             Pos Details
--------- --------------- ---- ------------------------
T_ID      OBJECT_ID                 1 NUMBER(22) NOT NULL

可以看到到表,列和索引都没有统计信息。

SQL> alter index t_id rebuild online compute statistics;
Index altered.
$tbsql tabstat t

        Table    Number           Empty  Average    Chain  Average
OWNER   Name    of Rows  Blocks  Blocks    Space    Count  Row Len
------- ------ -------- ------- ------- -------- -------- --------
SYS     T        25,420     348       0        0        0      100

Column            Column                    Distinct
Name              Details                     Values Density
----------------- ------------------------ --------- -------
OWNER             VARCHAR2(30) NOT NULL
OBJECT_NAME       VARCHAR2(30) NOT NULL
SUBOBJECT_NAME    VARCHAR2(30)
OBJECT_ID         NUMBER(22) NOT NULL         25,420       0
DATA_OBJECT_ID    NUMBER(22)
OBJECT_TYPE       VARCHAR2(18)
CREATED           DATE NOT NULL
LAST_DDL_TIME     DATE NOT NULL
TIMESTAMP         VARCHAR2(19)
STATUS            VARCHAR2(7)
TEMPORARY         VARCHAR2(1)
GENERATED         VARCHAR2(1)
SECONDARY         VARCHAR2(1)

13 rows selected.

                       B                     Average     Average
Index               Tree  Leaf  Distinct Leaf Blocks Data Blocks Cluster
Name     Unique    Level  Blks      Keys     Per Key     Per Key  Factor
-------- --------- ----- ----- --------- ----------- ----------- -------
T_ID     NONUNIQUE     1    56    25,420           1           1  22,731

Index   Column      Col Column
Name    Name        Pos Details
------- ---------- ---- ------------------------
T_ID    OBJECT_ID     1 NUMBER(22) NOT NULL

注意到表,object_id列和索引都有统计信息了

[继续阅读全文]

AIX平台升级到Oracle10.2.0.4的几个问题

最近将AIX5306上一个Oracle从9.2.0.6升级到了10.2.0.4,虽然最终升级顺利完成,不过还是碰到了几个小问题,在这里记录一下。

1. plan_table的问题
如果在9i的sys用户下手动执行过$ORACLE_HOME/rdbms/admin/utlxplan.sql脚本建立plan_table,则升级前必须删除。否则执行完升级脚本catupgrd.sql会发现Oracle Database Packages and Types组件一直是invalid的,并且升级脚本的log中有如下错误:

118/44   PL/SQL: ORA-00904: "OTHER_XML": invalid identifier

遇到该错误后,删除plan_table重建也还来得及:

@?/rdbms/admin/utlxplan
@?/rdbms/admin/prvtspao.plb
@?/rdbms/admin/utlrp


2.lock_sga的问题

Oracle10.2.0.4在AIX平台分配共享内存的机制有了一点变化。原来9i使用lock_sga=true是正常的,但是10.2.0.4则无法启动instance,报错:

SQL> startup
ORA-27126: unable to lock shared memory segment in core
IBM AIX RISC System/6000 Error: 1: Not owner

看起来像是权限问题,但是即使给Oracle用户加system组也没有用。后来Oracle解释说需要给Oracle用户赋予两个capability:CAP_BYPASS_RAC_VMMCAP_PROPAGATE,但这两个capabilities是采用大页内存时才需要设置的,这样说10.2.0.4如果lock_sga的话,默认是要采用大页内存的。当然,大页内存的使用还需要os上设置相关参数的,如果os没有设置,oracle应该还是要采用4k的内存页。

#chuser capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE oracle
#lsuser -a capabilities oracle
oracle capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE

3.dba_segments和dba_free_space空间计算不一致的问题

select sum(bytes)/1024/1024/1024 from dba_data_files;

SUM(BYTES)/1024/1024/1024
-------------------------
468.554688

select sum(bytes)/1024/1024/1024 from dba_free_space;

SUM(BYTES)/1024/1024/1024
-------------------------
63.3510742

select sum(bytes)/1024/1024/1024 from dba_segments;

SUM(BYTES)/1024/1024/1024
-------------------------
381.477112

显然,468.554688-63.3510742=405.203614,这比从dba_segments算出来的总占用空间381.477112大了20多G,并且这个差距在不断拉大,每天大概相差4G左右。这个问题还在跟Oracle扯皮,不知道他们是否会承认这个是bug。