ora-01688是分区段在表空间无法扩展,需查分区所属表空间、真实空闲空间及用户配额/数据文件autoextend设置;ora-14400是分区键不匹配任何分区边界,须检查high_value并用split或interval分区扩容。

ORA-01688 和 ORA-14400 是两类完全不同的失败,但都表现为“插入失败”,必须先区分清楚再动手。 如果错误信息里明确含 unable to extend table ... partition ... in tablespace,那就是 ORA-01688 —— 分区段无法在所属表空间分配新 extent;如果报的是 inserted partition key does not map to any partition,那才是 ORA-14400,属于分区定义没覆盖插入值。混在一起查,90%会走错方向。
怎么确认是 ORA-01688(分区段扩展失败)
别只看应用日志里“插入失败”四个字。直接从报错原文提取关键字段:
- 出现
ORA-01688且含partition和tablespace,说明问题出在**该分区物理归属的表空间没空间了** - 查这个分区实际落在哪个表空间:
SELECT tablespace_name FROM dba_tab_partitions WHERE table_name = 'YOUR_TABLE' AND partition_name = 'P_202508' - 查该表空间真实空闲量:
SELECT SUM(bytes)/1024/1024 AS free_mb FROM dba_free_space WHERE tablespace_name = 'USERS'—— 注意:这里返回的数值必须 > 你插入语句预计需要的 extent 大小(通常几 MB 起) - 如果
dba_free_space返回空或极小值,但dba_data_files显示文件总大小很大,大概率是用户配额为 0 或 autoextend 卡死
ORA-01688 的三个高频卡点
不是磁盘满了才报这个错,以下三点漏查任意一个都会白忙活:
-
dba_ts_quotas.max_bytes = 0:新建用户或迁移后未赋配额,表空间有 100GB 空闲也写不进一 record。执行ALTER USER app_user QUOTA UNLIMITED ON USERS立解 - 数据文件
autoextensible = 'NO'且已满:查dba_data_files,若autoextensible是NO,必须用ALTER DATABASE DATAFILE '/path/to/file.dbf' RESIZE 4096M手动扩 -
autoextensible = 'YES'但maxbytes被设成 1G/32G 这类硬上限:执行ALTER DATABASE DATAFILE '/path/to/file.dbf' AUTOEXTEND ON MAXSIZE 32G,注意单位是字节,别写成MAXSIZE 32
加数据文件(ADD DATAFILE)还是调大小(RESIZE)
生产环境优先选 ADD DATAFILE,除非有强约束要求单文件管理:
-
ADD DATAFILE在线、不锁 DML、不依赖磁盘连续空间,命令形如:ALTER TABLESPACE users ADD DATAFILE '/u01/oradata/db/users02.dbf' SIZE 2048M AUTOEXTEND ON NEXT 128M MAXSIZE 32G - 执行前务必确认:
df -h /u01/oradata/db有足够磁盘空间;ls -ld /u01/oradata/db中 oracle 用户有写权限;SELinux/AppArmor 没拦截(RHEL/CentOS 常见) -
RESIZE会短暂阻塞该数据文件上所有写操作,且不能缩到低于 HWM(高水位线),报ORA-03297就得认栽换路 - UNDO 表空间(如
UNDOTBS1)不支持ADD DATAFILE(12c+ 多租户除外),只能调大现有文件或开 autoextend
真正麻烦的从来不是“怎么加空间”,而是加完发现插入还是失败——这时候得回头再盯一遍 dba_ts_quotas 和 dba_data_files 的具体值,而不是接着加第三个文件。











