🚀 4.1 Oracle表空间检查11g
1. 表空间检查
Oracle 表空间检查是数据库日常运维的核心任务,确保存储空间充足、性能稳定。以下从多个维度给出检查方法、SQL 脚本及处理建议。
一、表空间总体使用率
1. 查询所有表空间的使用率(11g+)
SELECT tablespace_name,
ROUND(used_space * 100 / tablespace_size, 2) AS used_pct,
ROUND(tablespace_size / 1024 / 1024, 2) AS size_mb,
ROUND(used_space / 1024 / 1024, 2) AS used_mb,
ROUND((tablespace_size - used_space) / 1024 / 1024, 2) AS free_mb
FROM dba_tablespace_usage_metrics
ORDER BY used_pct DESC;
说明:该视图仅统计已分配的数据文件空间,不包含自动扩展的潜在空间。
2. 传统方法(兼容所有版本)
SELECT df.tablespace_name,
ROUND((df.total_bytes - NVL(fs.free_bytes, 0)) / df.total_bytes * 100, 2) AS used_pct,
ROUND(df.total_bytes / 1048576, 2) AS size_mb,
ROUND((df.total_bytes - NVL(fs.free_bytes, 0)) / 1048576, 2) AS used_mb,
ROUND(NVL(fs.free_bytes, 0) / 1048576, 2) AS free_mb
FROM (SELECT tablespace_name, SUM(bytes) total_bytes
FROM dba_data_files
GROUP BY tablespace_name) df,
(SELECT tablespace_name, SUM(bytes) free_bytes
FROM dba_free_space
GROUP BY tablespace_name) fs
WHERE df.tablespace_name = fs.tablespace_name(+)
ORDER BY used_pct DESC;
二、数据文件详细信息(含自动扩展)
SELECT file_id, tablespace_name, file_name,
ROUND(bytes / 1024 / 1024, 2) AS size_mb,
ROUND(maxbytes / 1024 / 1024, 2) AS max_mb,
autoextensible,
ROUND((bytes - NVL(free_bytes, 0)) / 1024 / 1024, 2) AS used_mb
FROM dba_data_files d,
(SELECT file_id, SUM(bytes) free_bytes FROM dba_free_space GROUP BY file_id) f
WHERE d.file_id = f.file_id(+);
关注点:
autoextensible = 'YES' 表示允许自动扩展,但需确保max_mb足够大。- 若多个数据文件接近满且无法自动扩展,需立即添加或扩展。
三、临时表空间检查
1. 临时文件信息
SELECT tablespace_name, file_name,
ROUND(bytes / 1024 / 1024, 2) AS size_mb,
autoextensible,
ROUND(maxbytes / 1024 / 1024, 2) AS max_mb
FROM dba_temp_files;
2. 临时表空间当前使用情况(近似)
SELECT tablespace_name,
ROUND(SUM(bytes_used) / SUM(bytes_allocated) * 100, 2) AS used_pct
FROM v$temp_space_header
GROUP BY tablespace_name;
- 若
used_pct长期 > 90%,可能需增大临时表空间或优化 SQL。
四、Undo 表空间监控
11G:
SELECT tablespace_name,
ROUND(SUM(bytes) / 1024 / 1024, 2) AS total_mb,
ROUND(SUM(NVL(used_bytes, 0)) / 1024 / 1024, 2) AS used_mb,
ROUND(SUM(NVL(used_bytes, 0)) / SUM(bytes) * 100, 2) AS used_pct
FROM dba_undo_extents
GROUP BY tablespace_name;
19C:
SELECT tablespace_name,
ROUND(SUM(bytes_used) / (SUM(bytes_used) + SUM(bytes_free)) * 100, 2) AS used_pct
FROM v$temp_space_header
GROUP BY tablespace_name;
- 若
used_pct持续 > 90%,可能存在长事务或 Undo 表空间配置不足。
五、快速恢复区(FRA)检查
如果使用 DB_RECOVERY_FILE_DEST,需监控空间:
SELECT name,
ROUND(space_limit / 1024 / 1024, 2) AS limit_mb,
ROUND(space_used / 1024 / 1024, 2) AS used_mb,
ROUND(space_used / space_limit * 100, 2) AS used_pct
FROM v$recovery_file_dest;
- 使用率超过 85% 时应及时清理(RMAN 删除过期归档/备份)。
六、表空间 I/O 性能(可选)
查看表空间级的 I/O 统计(需 STATISTICS_LEVEL = TYPICAL):
SELECT tablespace_name,
ROUND(SUM(phyblkrd) / DECODE(SUM(phyblkwrt), 0, 1, SUM(phyblkwrt)), 2) AS read_write_ratio
FROM v$filestat fs, dba_data_files df
WHERE fs.file# = df.file_id
GROUP BY tablespace_name;
七、常见问题与处理建议
| 问题 | 检查方法 | 处理措施 |
|---|---|---|
| 表空间使用率 ≥ 90% | 使用率查询 | 添加数据文件:ALTER TABLESPACE ... ADD DATAFILE ... SIZE 1G AUTOEXTEND ON;或扩展现有文件:ALTER DATABASE DATAFILE ... RESIZE 2G |
| 临时表空间不足 | v$temp_space_header |
增加临时文件:ALTER TABLESPACE temp ADD TEMPFILE ... SIZE 1G |
| Undo 表空间高水位 | dba_undo_extents |
检查长事务,适当增加 Undo 表空间大小 |
| FRA 空间满 | v$recovery_file_dest |
使用 RMAN 删除过期备份:DELETE OBSOLETE;或增加 FRA 大小 |
| 数据文件无法扩展 | dba_data_files 的 maxbytes 限制 |
修改 MAXSIZE:ALTER DATABASE DATAFILE ... AUTOEXTEND ON MAXSIZE 32G 或添加新文件 |
| 表空间碎片(高水位线过高) | dba_tables 的 blocks 与 empty_blocks |
使用 SHRINK SPACE 或 MOVE 重组表 |
八、一键巡检脚本(11g 兼容)
将以下 SQL 保存为 tablespace_check.sql,在 SQL*Plus 中执行 @tablespace_check:
sql
set pages 100 lines 200
col tablespace_name for a20
col file_name for a50
prompt === 1. 表空间使用率(Top 10) ===
select * from (
select tablespace_name,
round(used_space*100/tablespace_size,2) used_pct,
round(tablespace_size/1024/1024,2) size_mb,
round(used_space/1024/1024,2) used_mb
from dba_tablespace_usage_metrics
order by used_pct desc
) where rownum <= 10;
prompt === 2. 数据文件与自动扩展 ===
select file_id, tablespace_name, file_name,
round(bytes/1024/1024,2) size_mb,
autoextensible, round(maxbytes/1024/1024,2) max_mb
from dba_data_files
order by tablespace_name, file_id;
prompt === 3. 临时文件信息 ===
select tablespace_name, file_name,
round(bytes/1024/1024,2) size_mb,
autoextensible, round(maxbytes/1024/1024,2) max_mb
from dba_temp_files;
prompt === 4. Undo 表空间使用 ===
select tablespace_name,
round(sum(bytes)/1024/1024,2) total_mb,
round(sum(nvl(used_bytes,0))/1024/1024,2) used_mb,
round(sum(nvl(used_bytes,0))/sum(bytes)*100,2) used_pct
from dba_undo_extents
group by tablespace_name;
prompt === 5. FRA 使用率(如配置) ===
select name, round(space_limit/1024/1024,2) limit_mb,
round(space_used/1024/1024,2) used_mb,
round(space_used/space_limit*100,2) used_pct
from v$recovery_file_dest;
执行后可快速获取所有关键表空间信息。建议将此巡检纳入每日自动化监控,及时发现并处理空间问题。
阅读:154
发布时间: