Oracle健康检查基础项目检查步骤概述其二 1. 表空间 1.1 SYSTEM 表空间 系统表空间中非常不建议创建普通的用户对象(比如表、索引等)。如果创建了会导致很多碎片,并阻止系统表的增长。找出system表空间中不属于 SYS 或 SYSTEM的对象:
SQL> select owner, segment_name, segment_type
from dba_segments
where tablespace_name = 'SYSTEM'
and owner not in ('SYS','SYSTEM');
1.2 SYSAUX 表空间SYSAUX表空间是SYSTEM表空间的辅助表空间,在创建或升级数据库时,SYSAUX 表空间会被自动创建。之前创建并使用独立表空间的一些数据库组件,现在也会使用 SYSAUX 表空间。注:(1)如果SYSAUX表空间不可用,则核心数据库功能将仍可操作。使用 SYSAUX 表空间的数据库功能可能会失败,或是功能受限。(2)如果配置不当,SYSAUX表空间中存储的数据量可能非常大,并随着时间推移而增长到无法管理的大小,所以对有一些组件需要特别注意。检查哪些组件正占用空间:
SQL> select space_usage_kbytes, occupant_name, occupant_desc from v$sysaux_occupants order by 1 desc;
1.3 本地管理表空间与字典管理表空间本地管理表空间,也称为 LMT,相对于数据字典管理表空间有一定的优势。要验证哪个表空间为 Locally Managed(本地管理)或 Dictionary Managed(字典管理),可以使用以下SQL:
SQL> select tablespace_name, extent_management from dba_tablespaces;
1.4 临时表空间本地管理空间表将临时文件用于临时表空间,而字典管理表空间使用临时类型的表空间。默认情况下,所有表空间创建时都为 PERMANENT,因此应确保专用于临时segment的表空间为TEMPORARY类型,检查SQL如下:
SQL> select tablespace_name, contents from dba_tablespaces; TABLESPACE_NAME CONTENTS ------------------------------ --------- SYSTEM PERMANENT USER_DATA PERMANENT ROLLBACK_DATA PERMANENT TEMPORARY_DATA TEMPORARY
另外,还需要确保数据库上的用户都分配了临时类型的表空间。以下SQL可以查出了将永久表空间指定为其默认临时表空间的所有用户:
SQL> select u.username, t.tablespace_name from dba_users u, dba_tablespaces t where u.temporary_tablespace = t.tablespace_name and t.contents <> 'TEMPORARY';
注: 系统用户SYS和SYSTEM会将SYSTEM表空间显示为它们的默认临时表空间。该值也可以改变,以防止 SYSTEM 表空间中产生碎片,比如:
SQL> alter user SYSTEM temporary tablespace TEMP;
临时表空间中分配的空间是可以重复使用的。这是因为基于性能的考虑,以避免由于持续分配和取消分配 extent 和 segment所产生瓶颈。因此,当查看临时表空间中的可用空间时,可能会始终显示为已满的状态,所以 11g引入了新视图dba_temp_free_space可以查出临时表空间的真实使用率。以下查询可以列出关于临时 segment 使用情况的更多有用信息:(1)查看临时表空间的大小:
SQL> select tablespace_name, sum(bytes)/1024/1024 mb from dba_temp_files group by tablespace_name;
(2)查看临时表空间的“高水位线”:
SQL> select tablespace_name, sum(bytes_cached)/1024/1024 mb from v$temp_extent_pool group by tablespace_name;
1.5 表空间碎片 表空间碎片过多会对性能产生影响,特别是系统上正进行许多 full table scan(全表扫描)或者index fast full scan(索引快速全扫描)时。碎片的另一个缺点是,当所有可用空间的总和远远超出被需要的空间时,可能会得到空间不足的错误消息。 解决碎片的唯一办法是重新创建对象,可以使用 "alter table .. move" 命令,或者使用逻辑导入导出。如果需要对系统表空间消除碎片,则必须重建整个数据库,因为无法删除系统表空间。 2. 数据库对象 2.1 Extent(区)的数量尽管过度扩展对象的性能影响不是很大,但是很多过度扩展对象积聚起来确实会影响性能。下面SQL将列出分配的extent超过了指定最小量的所有对象:
SQL> select owner, segment_type, segment_name, tablespace_name,
count(blocks), SUM(bytes/1024) "BYTES K", SUM(blocks)
from dba_extents
where owner NOT IN ('SYS','SYSTEM')
group by owner, segment_type, segment_name, tablespace_name
having count(*) > xxx --根据实际情况更改成具体数值
order by segment_type, segment_name;
注:通常,对于extent个数超过100或200的对象,可以通过使用更大的extent来重建 2.2 分配下一个extent由于segment可以增长,因此在需要时它们可以分配下一个extent。如果表空间中没有足够的可用空间,则无法分配下一个 extent,且对象无法增长。下面SQL返回了所有无法分配其下一个extent的segment:
SQL> select s.owner, s.segment_name, s.segment_type, s.tablespace_name, s.next_extent from dba_segments s where s.next_extent > (select MAX(f.bytes) from dba_free_space f where f.tablespace_name = s.tablespace_name);
注:如果表空间中有许多碎片,则此查询可能会返回仍然可以增长的对象。上述查询基于可以表空间中的最大可用块。如果有许多这样彼此相连的“较小”可用块,则Oracle数据库将合并这些块以提供extent分配。 2.3 索引 基本不需要重建索引!基本不需要重建索引!基本不需要重建索引!重要的事情说三遍。具体原因可参考:定期重建索引的利与弊: http://blog.itpub.net/69992972/viewspace-2765192/
