一文读懂oracle表空间
概述
oracle表空间这个概念大家应该都很熟悉了, 这是一个逻辑概念,可以理解为在数据库中开辟的空间用来存储数据库对象。
表空间相关
1、表空间和数据文件的关系:
表空间由一个或多个数据文件组成;数据文件的大小和位置可以自己定义;
2、表空间的分类:
永久表空间:数据库中要永久化存储的一些对象,如:表、视图、存储过程
临时表空间:数据库操作当中中间执行的过程,执行结束后,存放的内容会被自动释放
UNDO表空间:用于保存事务所修改数据的旧值,可以进行数据的回滚
篇幅有限,下面主要对系统表空间、辅助表空间和临时表空间做个介绍。
一、系统表空间
SYSTEM 表空间是 Oracle 数据库最重要的一个表空间,存放了一些 DDL 语言产生的 信息以及 PL/SQL 包、视图、函数、过程等,称之为数据字典,因此该表空间也具有其特殊性。
Oracle服务器使用SYSTEM表空间管理整个数据库。这个表空间包含系统的数据字典和关于数据库的管理信息,这些信息均包含在SYS方案中,只有SYS用户或者拥有所需权限的其它管理用户才可访问这些信息。SYSTEM表空间用于核心功能(例如数据字典表)。
1、建议不存放用户数据
//为数据库设定默认表空间
SQL>ALTER DATABASE DEFAULTTABLESPACE tablespace_name;
//查询默认表空间
SQL> select property_name,property_value from database_properties where property_name like 'DEFAULT%';
2、SYSTEM表空间特性
• 不能脱机 offline
• 不能置为只读 read only
• 不能重命名
• 不能删除
3、空间管理
这里一定要保证空间可用,一般存放单个数据文件,如果 SYSTEM 表空间数据文件很大,可以考虑使用 bigfile。
二、辅助表空间
SYSAUX 表空间在 Oracle Database 10g 中引入,作为 SYSTEM 表空间的辅助表空间.
以前一些使用独立表空间或系统表空间的数据库组件现在在 SYSAUX 表空间中创建. 通过分离这些组件和功能,SYSTEM 表空间的负荷得以减轻.反复创建一些相关对象及组件 引起 SYSTEM 表空间的碎片问题得以避免。
SYSTEM和SYSAUX表空间是在创建数据库时创建的必须存在的表空间。这些表空间必须联机。在OPEN状态下,SYSAUX表空间可以脱机以执行表空间恢复,而SYSTEM表空间则不能,这两种表空间都不能设置为只读状态。在MOUNT状态下,任何表空间都可以脱机。
SYSTEM表空间的大小一般变化不大,而SYSAUX表空间在默认条件下如果不做任何配置,那么随着时间的推移,会越来越大。所以,如果SYSAUX表空间过大,那么应该及时诊断清理该表空间。
对于SYSTEM表空间而言,如果占用过大,那么一般情况下是由于审计表(SYS.AUD$)过大引起的。需要将审计表移动到其它表空间中,然后再清理审计表(TRUNCATE TABLE SYS.AUD$)即可。需要注意的是,如果审计表过大,那么应该分部去清理审计表。
对于SYSAUX表空间而言,如果占用过大,那么一般情况下是由于AWR信息或对象统计信息没有及时清理引起的,具体原因可以通过如下的SQL语句查询:
SELECT OCCUPANT_NAME "Item", SPACE_USAGE_KBYTES / 1048576 "Space Used (GB)", SCHEMA_NAME "Schema", MOVE_PROCEDURE "Move Procedure" FROM V$SYSAUX_OCCUPANTS WHERE SPACE_USAGE_KBYTES > 1048576 ORDER BY "Space Used (GB)" DESC;
如果OCCUPANT_NAME列为SM/AWR(Server Manageability - Automatic Workload Repository),那么表示AWR信息占用过大;如果该列为SM/OPTSTAT(Server Manageability - Optimizer Statistics History),那么表示优化器统计信息占用过大。
也可以直接查询DBA_SEGMENTS视图获取信息:
SELECT D.SEGMENT_NAME, D.SEGMENT_TYPE,SUM(BYTES)/1024/1024 SIZE_M FROM DBA_SEGMENTS D WHERE D.TABLESPACE_NAME = 'SYSAUX' GROUP BY D.SEGMENT_NAME, D.SEGMENT_TYPE ORDER BY SIZE_M DESC;
然后查询占用空间较大的表,即可得到占用空间较大的原因
结论: 这是一个管理及规划上的改进,进一步独立 SYSTEM 表空间,保证其存储及性能. 我们在做数据库规划时大可借鉴 Oracle 这个改进,分离重要数据及次要数据,分离稳定结构及频繁变化结构,尽量减少对重要数据及结构的影响。
三、临时表空间
1、 临时表空间作用
Oracle 临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。 重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题 sql 语句的执行, temp 表空间会一直增长。直到耗尽硬盘空间。
有人猜测在磁盘空间的分配上,oracle 使用的是贪心算法,如果上次磁盘空间消耗达到 1GB,那么临时表空间就是 1GB。
也就是说当前临时表空间文件的大小是历史上使用临时表空间最大的大小。
临时表空间的主要作用:
索引 create 或 rebuild;
Order by 或 group by;
Distinct 操作;
Union 或 intersect 或 minus;
Sort-merge joins;
analyze。
2、使用原理
在 Oracle 数据库中进行排序、分组汇总、索引等到作时,会产生很多的临时数据。对于这些临时数据,Oracle 数据库是如何处理的呢?
通常情况下,Oracle 数据库会先将这些临时数据存放到内存的 PGA(程序全局区)内。
在这个程序全局区中有一个叫做排序区的地方,专门用来存放这些因为排序操作而产生的临
时数据。但是这个分区的容量是有限的。当这个分区的大小不足以容纳排序后所产生的记录
时,数据库系统就会将临时数据存放到临时表空间中。这就是临时表空间的来历。
看起来好像这个临时表空间是个临时工,对于数据库的影响不会有多大。其实大家这是
误解这个临时表空间了。
在用户进行数据库操作时,排序、分组汇总、索引这些作业是少不了,其会产生大量的临时数据。为此基本上每个数据库都需要用到临时表空间。而如果这个临时表空间设置不当的话,则会给数据库性能带来很大的负面影响。为此管理员在维护这个临时表空间的时候,不能够掉以轻心。要避免因为临时表空间设置不当影响数据库的性能。
oracle中的表就是一张存储数据的表。表空间是逻辑上的划分。方便管理的。前面已经介绍了怎么去看表空间大小和扩展的一些命令,这里就不说明了。后面会分享更多关于DBA方面内容,感兴趣的朋友可以关注下!!