准备写入数据-》寻找可用空间-》找到可用的分区-》找到可用的块-》写满或未发现有可用的块-》需要新的分区并申请-》表空间的数据文件的可用空间已不足以分配一个分区-》申请扩展数据文件空间-》若数据文件已达到最大值或磁盘上无可用空间,则报错。
一、 查看Oracle数据库表空间使用情况
select upper(f.tablespace_name) "表空间名",
d.tot_grootte_mb "表空间大小(m)",
d.tot_grootte_mb – f.total_bytes "已使用空间(m)",
to_char(round((d.tot_grootte_mb – f.total_bytes) / d.tot_grootte_mb * 100,
2),
'990.99') || '%' "使用比",
f.total_bytes "空闲空间(m)",
f.max_bytes "最大块(m)"
from (select tablespace_name,
round(sum(bytes) / (1024 * 1024), 2) total_bytes,
round(max(bytes) / (1024 * 1024), 2) max_bytes
from sys.dba_free_space
group by tablespace_name) f,
(select dd.tablespace_name,
round(sum(dd.bytes) / (1024 * 1024), 2) tot_grootte_mb
from sys.dba_data_files dd
group by dd.tablespace_name) d
where d.tablespace_name = f.tablespace_name
order by 1;
二、扩大表空间的四种方法
–给表空间增加数据文件
ALTER TABLESPACE app_data ADD DATAFILE 'D:\dbfile\app_01.dbf' SIZE 1G;
–新增数据文件,并且允许数据文件自动增长
ALTER TABLESPACE app_data ADD DATAFILE 'D:\dbfile\app_02.dbf' SIZE 500M
AUTOEXTEND ON NEXT 50M MAXSIZE 5G;
–允许已存在的数据文件自动增长
ALTER DATABASE DATAFILE 'D:\dbfile\app_01.dbf'
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;
–手工改变已存在数据文件的大小
ALTER DATABASE DATAFILE 'D:\dbfile\app_01.dbf' RESIZE 500M;
三、系统表空间过大的情况
1)system表空间过大(使用率95%以上)
a)检查aud$表大小
–查看数据库表大小SQL
select bytes,owner,segment_name
from dba_segments
where segment_type='TABLE' order by bytes desc;
–查看aud$表大小SQL
select bytes,owner,segment_name
from dba_segments
where segment_type='TABLE' and segment_name = 'AUD$';
b) 如果aud$过大,清理.导出aud$表后,用truncate清理.
c) 如果出现aud$表为空,system表空间使用率照样达到99%,建议增加数据文件,如下:
alter tablespace system add datafile 'D:\dbfile\SYSTEM_02.DBF' size 50M autoextend on;
select * from dba_data_files;
a) 修改统计信息保存时间
select dbms_stats.get_stats_history_retention from dual; –检查统计信息保存时间(默认应该是31天);
exec dbms_stats.alter_stats_history_retention(7); –如果31天将其改为7天;
select dbms_stats.get_stats_history_retention from dual; –验证是否修改成功;
b) 删除AWR报告快照
删除AWR有两种方式进行删除:dbms_workload_repository,dbms_swrf_internal。dbms_workload_repository可以删除本地和其他数据库的快照,可以选择不同的快照来进行删除;dbms_swrf_internal只能对其他数据库的快照来进行操作,会把所有的快照直接干掉。
使用dbms_workload_repository包删除:
select dbid, retention from dba_hist_wr_control;
select min(snap_id), max(snap_id)from dba_hist_snapshot where dbid = '得到的dbid值';
exec dbms_workload_repository.drop_snapshot_range('得到的min(snap_id)值','得到的max(snap_id)值','得到的dbid值');
select * from dba_hist_snapshot where dbid = '得到的dbid值';
使用dbms_swrf_internal包删除:
select dbid, retention from dba_hist_wr_control;
select min(snap_id), max(snap_id)from dba_hist_snapshot where dbid = '得到的dbid值';
exec dbms_swrf_internal.unregister_database('得到的dbid值');
select * from dba_hist_snapshot where dbid = '得到的dbid值';
——————————sysaux表空间解读————————————–
SYSAUX表空间在Oracle Database 10g中引入,作为SYSTEM表空间的辅助表空间。
以前一些使用独立表空间或系统表空间的数据库组件现在在SYSAUX表空间中创建。
SYSAUX 表空间存放一些其他的 metadata 组件,如 OEM,Streams 等会默认存放在 SYSAUX 表空间里。
通过分离这些组件和功能,SYSTEM表空间的负荷得以减轻.反复创建一些相关对象及组件引起SYSTEM表空间的碎片问题得以避免。
因此SYSAUX 表空间也是在在 DB 创建或者升级时自动创建的。 如果在手工使用SQL 创建 DB 时没有指定 SYSAUX tablespace,那么创建语句会报错。 无法执行。
在正常操作下, 不能 drop 和 rename SYSAUX 表空间。
如果SYSAUX表空间不可用,数据库核心功能将保持有效;使用SYSAUX表空间的特点将会失败或功能受限.。
我们不能使用 alter tablespace 来修改这 4 个属性,同样也不能 drop 和 rename SYSAUX 表空间。
查看SYSAUX表空间信息:
select OCCUPANT_NAME, SCHEMA_NAME,MOVE_PROCEDURE ,SPACE_USAGE_KBYTES from V$SYSAUX_OCCUPANTS;
这些组件占据这 SYSAUX 表空间,所以这些组件的大小也就决定 SYSAUX表空间的大小。
•schema_name 对应的是用户名。
•在v$sysaux_occupants 视图里中的move_procudure字段,是用于迁移组件信息的。就是对于已经安装好的组件,如果想把这些组件放到其他的空间,可以使用这个存储过程。如果没有对应的过程,说明不可移动。
比如我们的AWR。 AWR 是SYSAUX 中占用空间最多的组件。 对于一个有10个并发session 的系统,就需要200M 的空间。当然,也可以修改AWR的保存策略来控制AWR所占用空间的大小。