查分区表所在表空间需用DBA_TAB_PARTITIONS获取已创建分区的表空间名,因分区表数据实际存储在段中;再结合DBA_DATA_FILES查路径时须区分ASM(+开头)与文件系统(/开头)路径,且不可忽略tempfile和UNDO文件的磁盘占用。
查分区表所在的表空间,不能直接看 DBA_DATA_FILES
分区表本身不直接对应物理文件;它只是逻辑结构。真正存数据的是底层的**段(segment)**,而段又落在某个**表空间**里。所以第一步必须先定位分区属于哪个表空间:
SELECT DISTINCT tablespace_name FROM dba_tab_partitions WHERE table_owner = 'SCHEMA_NAME' AND table_name = 'TABLE_NAME';注意:
dba_tab_partitions 只返回已创建的分区(不含空分区),如果表刚建好还没插入数据,可能查不到结果——得补查 dba_tab_subpartitions 或直接看基表的 tablespace_name。
查表空间对应的数据文件路径,要区分 ASM 还是文件系统
dba_data_files 确实能给出表空间的数据文件路径,但它的 name 字段含义取决于存储方式:
- 以
+开头(如+data/orcl/datafile/users.256.123456789)→ 是 asm 别名,不是 os 路径,需连 asm 实例查v$asm_disk.path - 以
/开头(如/u01/oradata/orcl/users01.dbf)→ 是文件系统绝对路径,可用df -h $(dirname "/u01/oradata/orcl/users01.dbf")查挂载点
ls 或 du,结果当然找不到。一个分区可能跨多个数据文件,DBA_DATA_FILES 不体现分布细节
即使确认了表空间名,也不能认为所有分区都落在同一块物理盘上。因为:
- 同一表空间可包含多个
datafile,它们可能分布在不同挂载点(比如users01.dbf在/u01,users02.dbf在/u02) - Oracle 分配区(extent)时按表空间内空闲空间策略走,不保证连续或同盘
-
DBA_DATA_FILES本身不带 I/O 统计或使用率,看不出哪块盘快满了
v$segment_statistics 和 OS 层 iostat -x 1 对照着看。别忘了临时和 UNDO 表空间也占磁盘,且默认常跟 SYSTEM 挤一起
DBA_DATA_FILES 只返回永久表空间的数据文件。但分区表在大量 INSERT /*+ APPEND */ 或并行 DML 时,会用到临时表空间;长事务还会撑大 UNDO 表空间。这两类文件不会出现在 DBA_DATA_FILES 里:
- 查临时文件:
SELECT file_name FROM dba_temp_files; - 查 UNDO 数据文件:
SELECT name FROM v$datafile WHERE ts# IN (SELECT ts# FROM v$tablespace WHERE name = 'UNDOTBS1');
SYSTEM 表空间共用同一挂载点(如 /u01),事务高峰时悄无声息把整块盘写满,报 ORA-01652 却只盯着用户表空间查。


















