在我的oracle数据库中,一个表空间经常发出“空间不足”警报,即使正在增加空间,如何知道原因?
最初我创建了大小为 1GB 的表空间,现在它的大小为 4GB。
如何知道原因,当我查询特定表空间表单 dba_segments 的已用对象时,它只给出段名称。
我认为您在这里描述的问题是表空间空间阈值。您可以通过以下方式获取当前阈值设置(另请查看文档):
SELECT * FROM dba_thresholds
WHERE object_type = 'TABLESPACE' AND object_name = <Your tablespace>;
就我而言,这给了我:
METRICS_NAME: Tablespace Space usage
WARNING_OPERATOR: GE
WARNING_VALUE: 85
CRITICAL_OPERATOR: GE
CRITICAL_VALUE: 97
OBSERVATION_PERIOD: 1
CONSECUTIVE_OCCURRENCES: 1
INSTANCE_NAME: database_wide
OBJECT_TYPE: TABLESPACE
OBJECT_NAME: null
STATUS: VALID
您可以通过该DBMS_SERVER_ALERT.SET_THRESHOLD
方法修改阈值或完全停用它们。例如,要停用我系统上的阈值,我使用:
BEGIN
DBMS_SERVER_ALERT.SET_THRESHOLD(
metrics_id => DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL,
warning_operator => DBMS_SERVER_ALERT.OPERATOR_DO_NOT_CHECK,
warning_value => '0',
critical_operator => DBMS_SERVER_ALERT.OPERATOR_DO_NOT_CHECK,
critical_value => '0',
observation_period => 1,
consecutive_occurrences => 1,
instance_name => NULL,
object_type => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,
object_name => NULL);
END;
/
通过再次查询 DBA_THRESHOLDS 我现在有:
METRICS_NAME: Tablespace Space usage
WARNING_OPERATOR: DO NOT CHECK
WARNING_VALUE: 0
CRITICAL_OPERATOR: DO_NOT_CHECK
CRITICAL_VALUE: 0
OBSERVATION_PERIOD: 1
CONSECUTIVE_OCCURRENCES: 1
INSTANCE_NAME: database_wide
OBJECT_TYPE: TABLESPACE
OBJECT_NAME: null
STATUS: VALID
您可以使用 dba_segments 来查找占用空间的内容:
select tablespace_name, sum(bytes)/1024/1024 MB from dba_segments group by tablespace_name order by tablespace_name
这列出了表空间及其用法。
select owner, sum(bytes)/1024/1024 mb
from dba_segments
where tablespace_name = 'SYSAUX'
group by owner
order by sum(bytes)/1024/1024 desc, owner
这列出了用户 ID 在您的表空间中占用了多少空间。通常警报火灾是有原因的,因此忽略它们可能不是最明智的做法。
您当然可以放大特定用户的对象并随着时间的推移重复此操作以查找正在增长的对象。我把它留给读者作为练习。