暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SYSAUX表空间及其组件

eygle 2019-10-14
1363

在创建数据库的过程中,有这样一条语句:

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中一些组件和以前版本的对照

image.png


新增的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所示,通过分析图表,空间的使用情况一目了然。


image.png

图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上的竞争,又可以将重要数据的存储纯净化,从而方便备份恢复以及相关维护。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论