ORA-01688 表示分区表某分区无法在指定表空间扩展,需确认该分区所属表空间的真实空闲空间及存储归属;而 ORA-01654 针对索引段扩展失败,排查重点为索引的 next_extent 和碎片。
ORA-01688 是什么,和 ORA-01654 有啥区别
ora-01688 的完整错误是 ora-01688: unable to extend table xxx.yyy partition zzz by nnn in tablespace ttt,它专指**分区表的某个分区**无法在目标表空间中分配新 extent。注意:不是索引,是表分区 —— 很多人搜“索引扩展失败”却实际遇到的是这个错误,因为报错里带了“extend”,又看到“tablespace”,就默认往索引上想。
它和 ORA-01654(索引无法扩展)症状相似,但根因排查路径不同:ORA-01654 要盯 dba_indexes.next_extent 和索引段碎片;而 ORA-01688 必须先确认该分区**物理归属的表空间是否真有空间**,且该表空间是否被正确指定为该分区的默认存储位置。
- 查分区所属表空间:
SELECT table_name, partition_name, tablespace_name FROM dba_tab_partitions WHERE table_name = 'YOUR_TABLE' AND partition_name = 'YOUR_PART' - 查该表空间真实剩余:
SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb FROM dba_free_space WHERE tablespace_name = 'TTT' GROUP BY tablespace_name - 别只看
dba_data_files.bytes总和 —— 分区可能落在某个特定数据文件上,而那个文件已满或被 quota 锁死
为表空间添加数据文件前,必须绕开的三个 OS 层陷阱
执行 ALTER TABLESPACE ttt ADD DATAFILE '/path/to/new.dbf' SIZE 2G AUTOEXTEND ON 之前,如果直接运行,大概率卡住或报模糊 I/O 错。原因几乎总是操作系统层的硬限制,不是 SQL 写错了。
-
df -h /path/to/mountpoint显示有空间?再跑quota -u oracle—— 如果挂载点启用了 usrquota(mount | grep /u01输出含usrquota),而Blocks列的used≥hard,RESIZE 或 ADD 都会静默失败 - 用
ls -l /path/to/mountpoint看父目录权限,确保oracle用户有写权限;再用id -u oracle确认当前是 oracle 用户身份执行命令,不是 root 切过去没切干净 - 检查文件系统单文件上限:
df -T /u01看类型(ext3=2TB,xfs=50TB+),再算你要加的SIZE是否超过该限制;若接近上限,ORA-01237 + Error: 27: File too large就来了
ADD DATAFILE 时 autoextend 和 maxsize 的实际取值逻辑
很多人设了 AUTOEXTEND ON 却发现还是扩不动,问题常出在 MAXSIZE 值本身被设小了,或者根本没设(Oracle 默认行为不等于你想要的行为)。
-
MAXSIZE UNLIMITED在 Oracle 11g+ 多数版本下等价于一个极大值(如 3.44E+10 字节),但底层仍受文件系统限制;生产环境建议显式写成MAXSIZE 32G这类可控值,避免误触 OS 上限 -
INCREMENT_BY单位是数据库块(DB_BLOCK_SIZE),不是字节 —— 如果你的块大小是 8K,NEXT 128实际每次扩 1MB(128 × 8192),不是 128MB - 新加的数据文件路径必须是 Oracle 可写的绝对路径;不要用软链,不要跨挂载点;ASM 存储则必须用
+DG_NAME格式,不能填本地路径
加完数据文件后,分区仍报 ORA-01688?检查分区级存储子句
即使表空间整体有空闲、新加了文件、autoextend 也开了,ORA-01688 还可能继续报 —— 因为该分区在创建时被显式指定了 TABLESPACE xxx,而你新加的文件不在那个 xxx 里,或者该分区用了 STORAGE (INITIAL 1G NEXT 512M) 这种大步长,而剩余空间碎片化严重,凑不出连续 512M。
- 查分区存储定义:
SELECT partition_name, tablespace_name, initial_extent, next_extent FROM dba_tab_partitions WHERE table_name = 'YOUR_TABLE' AND partition_name = 'YOUR_PART' - 如果
next_extent远大于dba_free_space.largest(查出来的最大连续空闲块),就得要么重建分区(ALTER TABLE ... MOVE PARTITION ... TABLESPACE ttt),要么调小NEXT(需先ALTER TABLE ... MODIFY PARTITION ... STORAGE(NEXT 64M)) - 别忽略索引分区:如果主表分区扩展失败,其本地索引分区也可能同步卡住,需一并检查
dba_ind_partitions
最常被跳过的动作是:加完文件后没验证该文件是否真的被 Oracle 认为“可用”——运行 SELECT file_name, status, enabled FROM dba_data_files WHERE tablespace_name = 'TTT',确保新文件 status 是 AVAILABLE,enabled 是 WRITE。否则它只是躺在磁盘上,Oracle 不会用。











