快速修复步骤:1. 检查分区表状态 sqlplus / as sysdba select table_name, partition_name, high_value from dba_tab_partitions where table_name='你的表名'; 2. 清理失效分区 alter table 你的表名 drop partition 分区名 update index; 3. 表空间检查 select tablespace_name, sum(bytes)/1024/1024 from dba_free_space group by tablespace_name; alter tablespace 表空间名 add datafile '/path/new.dbf' size 1G; 4. 远程重启服务 srvctl stop database -d dbname; srvctl start database -d dbname; 测试插入数据无报错即可。
网友方案一:分区同步远程处理
我遇到ORA-39940,分区表老分区没删干净。用远程工具登录到DB服务器,执行alter table DROP PARTITION P_20200101 UPDATE INDEXES; 然后检查alert.log,没问题了。表空间满了,df -h看磁盘,alter database datafile 'file_id' resize 10G; 重启实例后正常。强烈推荐远程桌面工具,省得本地折腾。
网友方案二:故障排查全过程
ORA-39940原因是分区高值溢出。排查:select * from dba_tab_partitions where partition_position is null; 找到坏分区,alter table exchange partition 坏分区 with table temp_table without validation; 然后drop它。表空间问题用select * from dba_tablespace_usage_metrics; 如果>90%,加数据文件。远程用expdp/impdp备份分区再处理,安全。
网友方案三:表空间扩容远程脚本
远程ssh到服务器,运行脚本:#!/bin/bash sqlplus sys/密码@remote as sysdba < 别纠结排查,直接远程连上,alter table 表名 truncate partition 坏分区; 然后split partition into (p1,p2) by date; 表空间用resize或add file。测试过很多次,99%有效。记得commit事务。 日志显示ORA-39940: partition out of order。远程查看v$session_longops,杀掉卡住进程。alter session set ddl_lock_timeout=60; 再drop partition。表空间select file_name, bytes from dba_data_files where tablespace_name='TBS'; resize到20G。重启后分区表完美。 Q: ORA-39940怎么快速判断是哪个分区坏了? Q: 远程处理需要什么工具? Q: 表空间满了不扩容行吗? Q: 修复后分区表还能自动创建分区吗?网友方案四:简单重置分区
网友方案五:综合修复日志分享
FAQ
A: 执行select table_name, partition_name from dba_tab_partitions where insert_timestamp is null;
A: 用sqlplus远程连接或Toad/PL/SQL Developer配置TNS,结合ssh查看服务器磁盘。
A: 不行,会连锁报错,先resize datafile再删分区。
A: 可以,检查interval设置alter table add partition interval(numtodsinterval(1,'day'));