在创建数据库的过程中,有这样一条语句:
SYSAUX DATAFILE SIZE 120M AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
这个语句用来创建一个新的表空间SYSAUX表空间,这个表空间在Oracle 10g之前并不存在,而是在Oracle 10g中被引入,用来作为SYSTEM表空间的辅助表空间。
SYSAUX表空间及其组件
作为辅助表空间,以前一些使用系统表空间或独立表空间的数据库组件现在在SYSAUX表空间中创建,通过分离这些组件,SYSTEM表空间的负荷得以减轻。而且通过使用SYSAUX表空间,反复创建一些相关对象及组件引起的空间问题得以避免,通过剥离,SYSTEM表空间的作用更加单纯,更易于管理和维护。另外,如果SYSAUX表空间出现问题,如空间耗尽等,数据库的核心功能将保持有效。
表5-2列出了Oracle 10g中这些组件和以前版本的对照,可以注意到很多组件现在从SYSTEM表空间中转移出来,以前因为这些组件引发的系统表空间故障非常常见。
表5-2 Oracle 10g中一些组件和以前版本的对照
新增的V$SYSAUX_OCCUPANTS视图可以用来查看这些信息:
SQL> SELECT occupant_name, occupant_desc, schema_name 2 FROM v$sysaux_occupants; OCCUPANT_NAME OCCUPANT_DESC SCHEMA_NAME --------------------- ---------------------------------------------------- ----------- LOGMNR LogMiner SYSTEM LOGSTDBY Logical Standby SYSTEM STREAMS Oracle Streams SYS XDB XDB XDB AO Analytical Workspace Object Table SYS XSOQHIST OLAP API History Tables SYS XSAMD OLAP Catalog OLAPSYS SM/AWR Server Manageability - Automatic Workload Repository SYS SM/ADVISOR Server Manageability - Advisor Framework SYS SM/OPTSTAT Server Manageability - Optimizer Statistics History SYS SM/OTHER Server Manageability - Other Components SYS STATSPACK Statspack Repository PERFSTAT ODM Oracle Data Mining DMSYS SDO Oracle Spatial MDSYS WM Workspace Manager WMSYS ORDIM Oracle interMedia ORDSYS Components ORDSYS ORDIM/PLUGINS Oracle interMedia ORDPLUGINS Components ORDPLUGINS ORDIM/SQLMM Oracle interMedia SI_INFORMTN_SCHEMA Components SI_INFORMTN_SCHEMA EM Enterprise Manager Repository SYSMAN TEXT Oracle Text CTXSYS ULTRASEARCH Oracle Ultra Search WKSYS ULTRASEARCH_DEMO_USER Oracle Ultra Search Demo User WK_TEST EXPRESSION_FILTER Expression Filter System EXFSYS EM_MONITORING_USER Enterprise Manager Monitoring User DBSNMP TSM Oracle Transparent Session Migration User TSMSYS JOB_SCHEDULER Unified Job Scheduler SYS 26 rows selected
SYSAUX表空间作为SYSTEM的辅助表空间,具有如下一些限制。
(1)不能删除。
SQL> drop tablespace SYSAUX including contents and datafiles; drop tablespace SYSAUX including contents and datafiles * ERROR at line 1: ORA-13501: Cannot drop SYSAUX tablespace
(2)不能重命名。
SQL> alter tablespace SYSAUX rename to OPT_TBS; alter tablespace SYSAUX rename to OPT_TBS * ERROR at line 1: ORA-13502: Cannot rename SYSAUX tablespace
(3)不能置为read only。
SQL> alter tablesapce SYSAUX read only; alter tablesapce SYSAUX read only * ERROR at line 1: ORA-00940: invalid ALTER command
SYSAUX空间组件的转移
如果希望转移这些系统对象的表空间,可以使用相应的系统包实现:
SQL> SELECT occupant_name, schema_name, move_procedure,space_usage_kbytes 2 FROM v$sysaux_occupants where move_procedure is not null 3 ORDER BY 1 4 / OCCUPANT_NAME SCHEMA_NAME MOVE_PROCEDURE SPACE_USAGE_KBYTES ------------------------- ----------- -------------------------------- ------------------ AO SYS DBMS_AW.MOVE_AWMETA 20160 EM SYSMAN emd_maintenance.move_em_tblspc 1134976 LOGMNR SYSTEM SYS.DBMS_LOGMNR_D.SET_TABLESPACE 6080 LOGSTDBY SYSTEM SYS.DBMS_LOGSTDBY.SET_TABLESPACE 896 ODM DMSYS MOVE_ODM 256 SDO MDSYS MDSYS.MOVE_SDO 33472 TEXT CTXSYS DRI_MOVE_CTXSYS 4736 ULTRASEARCH WKSYS MOVE_WK 0 ULTRASEARCH_DEMO_USER WK_TEST MOVE_WK 0 WM WMSYS DBMS_WM.move_proc 7040 XDB XDB XDB.DBMS_XDB.MOVEXDB_TABLESPACE 49280 XSAMD OLAPSYS DBMS_AMD.Move_OLAP_Catalog 15936 XSOQHIST SYS DBMS_XSOQ.OlapiMoveProc 20160 13 rows selected
如转换LOGMNER空间:
SQL> exec SYS.DBMS_LOGMNR_D.SET_TABLESPACE('USERS'); PL/SQL procedure successfully completed.
接下来再检查LOGMNR在SYSAUX中的空间占用:
SQL> SELECT occupant_name, schema_name, move_procedure,space_usage_kbytes 2 FROM v$sysaux_occupants where OCCUPANT_NAME='LOGMNR' 3 / OCCUPANT_NAME SCHEMA_NAME MOVE_PROCEDURE SPACE_USAGE_KBYTES ------------- ------------ -------------------------------- ------------------ LOGMNR SYSTEM SYS.DBMS_LOGMNR_D.SET_TABLESPACE 0
看到LOGMNR的空间占用已经变为0。而相关对象已经转移到了USERS表空间:
SQL> select table_name,tablespace_name,owner 2 from dba_tables where table_name like 'LOGMNR%' and tablespace_name='USERS'; TABLE_NAME TABLESPACE_NAME OWNER ------------------------------ ------------------------------ ------------------------------ LOGMNR_UID$ USERS SYSTEM LOGMNR_SPILL$ USERS SYSTEM LOGMNR_SESSION_EVOLVE$ USERS SYSTEM LOGMNR_RESTART_CKPT_TXINFO$ USERS SYSTEM LOGMNR_RESTART_CKPT$ USERS SYSTEM LOGMNR_PROCESSED_LOG$ USERS SYSTEM LOGMNR_LOG$ USERS SYSTEM LOGMNR_HEADER2$ USERS SYSTEM LOGMNR_HEADER1$ USERS SYSTEM LOGMNR_FILTER$ USERS SYSTEM LOGMNR_ERROR$ USERS SYSTEM LOGMNR_AGE_SPILL$ USERS SYSTEM LOGMNRP_CTAS_PART_MAP USERS SYSTEM LOGMNRC_DBNAME_UID_MAP USERS SYSTEM 14 rows selected
SYSAUX表空间的使用情况可以通过DB Control清晰地看到,从EM首页中的数据库实例→管理→表空间→SYSAUX来查看,如图5-26所示,通过分析图表,空间的使用情况一目了然。
图5-26 空间使用情况
SYSAUX的作用与意义
在以前的版本中,系统表空间被过度使用的最常见原因是由于高级复制引起的,缺省地,高级复制的系统对象被创建在SYSTEM表空间中,由于高级复制的队列表等可能会扩展到极其夸张的大小,所以可能会造成严重的系统故障。
以我处理过的一个案例为例(Oracle 10gR1 RAC环境,架构于Solaris之上),来看一下该数据库系统的Top 8空间使用对象:
SQL> select segment_name,SEGMENT_TYPE,bytes/1024/1024,tablespace_name 2 from dba_segments where bytes/1024/1024 > 500; SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024 TABLESPACE_NAME ----------------------------- ------------------ --------------- --------------- I_WRI$_OPTSTAT_IND_OBJ#_ST INDEX 699 SYSAUX WRI$_OPTSTAT_IND_HISTORY TABLE 513 SYSAUX SYS_LOB0000004603C00003$$ LOBSEGMENT 63637 SYSTEM SYS_LOB0000004603C00004$$ LOBSEGMENT 1540 SYSTEM DEF$_LOB TABLE 4330 SYSTEM DEF$_AQCALL TABLE 3762 SYSTEM SYS_LOB0000058045C00106$$ LOBSEGMENT 15133 USERS SYS_LOB0000058012C00025$$ LOBSEGMENT 4394 USERS
注意到,DEF$_LOB、DEF$_AQCALL都是和高级复制有关的原数据表,这两个表就占用了8092MB的空间,而另外一个63637MB大小的LOBSEGMENT也与高级复制有关,这3个表加起来已经占用了70多个GB的空间,而且都在SYSTEM表空间之中,这实在是个灾难。
实际上在创建之初,就应该将这些对象分离到SYSAUX表空间或其他独立的表空间,减少对于系统表空间的冲击。
这些问题加上用户的一些不当操作,最终导致了数据库故障。而且这个环境相当复杂,“Oracle10gR1 + CRS + ASM”的两套RAC环境间的高级复制,处理过程着实花了一番功夫。
然而需要注意的是,即使在Oracle 10gR2/Oracle 11gR2中,Oracle仍然没有改变,Oracle仍然会缺省地将所有复制的系统队列表(queue table)置于系统表空间之中。
SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 - Production
复制字典对象的存储地都是SYSTEM表空间:
SQL> set linesize 120 SQL> col segment_name for a30 SQL> col segment_type for a20 SQL> col tablespace_name for a20 SQL> select segment_name,segment_type,tablespace_name,bytes/1024 from dba_segments where segment_name like '%DEF$_%'; SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BYTES/1024 ------------------------------ -------------------- -------------------- ---------- DEF$_ERROR TABLE SYSTEM 64 DEF$_DESTINATION TABLE SYSTEM 64 DEF$_CALLDEST TABLE SYSTEM 64 DEF$_DEFAULTDEST TABLE SYSTEM 64 DEF$_LOB TABLE SYSTEM 64 DEF$_PROPAGATOR TABLE SYSTEM 64 DEF$_ORIGIN TABLE SYSTEM 64 DEF$_PUSHED_TRANSACTIONS TABLE SYSTEM 64 DEF$_AQCALL TABLE SYSTEM 64 DEF$_AQERROR TABLE SYSTEM 64 DEF$_ERROR_PRIMARY INDEX SYSTEM 64 DEF$_DESTINATION_PRIMARY INDEX SYSTEM 64 DEF$_CALLDEST_PRIMARY INDEX SYSTEM 64 DEF$_CALLDEST_N2 INDEX SYSTEM 64 DEF$_DEFAULTDEST_PRIMARY INDEX SYSTEM 64 DEF$_LOB_PRIMARY INDEX SYSTEM 64 DEF$_LOB_N1 INDEX SYSTEM 64 DEF$_PROPAGATOR_PRIMARY INDEX SYSTEM 64 DEF$_PUSHED_TRAN_PRIMARY INDEX SYSTEM 64 DEF$_TRANORDER INDEX SYSTEM 64 20 rows selected
一般建议在初始创建数据库时,可以通过修改队列创建脚本$ORACLE_HOME/rdbms/admin/catdefrt.sql定义存储参数来更改创建地点。
如果已经完成了创建,可以通过EXP/IMP等一系列手段迁移队列表,不过通常迁移操作都会影响高级复制的使用,这对于一个上线的24×7业务系统来说,通常都极为困难,所以最好的方法仍然是提前规划。
最后体会深刻的是,不管哪一项技术,前期的规划都极其重要,如果规划不当,后期的问题将会曾出不穷。在设计规划数据库的结构和应用上,Oracle的很多优化方案是值得我们借鉴的,将重要数据和次要数据分开,既可以避免次要数据在存储、IO上的竞争,又可以将重要数据的存储纯净化,从而方便备份恢复以及相关维护。