ora-01653/ora-01688根本原因是目标表空间无足够连续空闲区段,须按序排查用户配额是否为0、数据文件autoextensible状态及maxbytes限制、磁盘实际可用空间;navicat恢复前还需确认用户默认表空间指向、配额授权及unlimited tablespace权限。
navicat恢复时报 ora-01653 或 ora-01688 怎么办
不是磁盘满了,是目标表空间没空间了。navicat 导入或恢复数据时,oracle 会往用户默认表空间里写数据,一旦该表空间的 used_percent ≥ 95%,就会触发这类错误。
先别急着加磁盘,直接查 Oracle 内部视图:
-
SELECT tablespace_name, used_percent FROM dba_tablespace_usage_metrics;—— 快速看所有表空间使用率 -
SELECT file_name, autoextensible, bytes/1024/1024/1024 gb FROM dba_data_files WHERE tablespace_name = 'YOUR_TS_NAME';—— 看具体文件是否能自动扩展、当前大小
注意:dba_free_space 显示“有空闲”,不代表能立刻分配——未格式化的块不计入可用空间,所以必须以 dba_tablespace_usage_metrics 的 used_percent 为准。
恢复前必须确认的三项权限配置
即使表空间已扩容,Navicat 仍可能失败,因为恢复操作受三重约束:
- 目标用户默认表空间是否指向你刚扩容的那个?查:
SELECT default_tablespace, temporary_tablespace FROM dba_users WHERE username = 'YOUR_USER'; - 该用户在目标表空间是否有配额?若为
UNLIMITED最好,否则需显式授权:ALTER USER your_user QUOTA UNLIMITED ON your_tablespace; - Navicat 连接用的账号,是否具备
CREATE TABLE、INSERT和UNLIMITED TABLESPACE权限?缺UNLIMITED TABLESPACE会导致ORA-01536,哪怕表空间本身还有空间
临时表空间不足引发 ORA-01652 怎么处理
恢复大表或含大量排序操作(如带 ORDER BY、GROUP BY 的 INSERT SELECT)时,Oracle 会用临时表空间做排序和哈希连接。此时报 ORA-01652,说明 TEMP 或自定义临时表空间撑满了。
检查方式:
SELECT tablespace_name, file_name, bytes/1024/1024 mb FROM dba_temp_files;-
SELECT * FROM v$temp_space_header;—— 查实时使用量(注意:该视图只反映当前活跃会话占用)
扩容建议:
- 优先新增一个临时文件:
ALTER TABLESPACE temp ADD TEMPFILE '/u01/oradata/yourdb/temp02.dbf' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 8G; - 不要直接扩原
temp01.dbf到极限;分散多个小文件更利于并发排序性能 - 若用的是非默认临时表空间(比如
TEMP2),记得确认用户是否被指定了它:SELECT temporary_tablespace FROM dba_users WHERE username = 'YOUR_USER';
撤销表空间满导致 ORA-30036 的应急操作
恢复过程中执行 DML(尤其是大批量 INSERT/UPDATE)时,UNDO 表空间会快速膨胀。报 ORA-30036 不代表磁盘满,而是 UNDO 段无法分配新回滚段。
紧急判断步骤:
- 查真实使用率:
SELECT tablespace_name, used_percent FROM dba_tablespace_usage_metrics WHERE tablespace_name LIKE 'UNDO%'; - 查长事务卡住 UNDO:
SELECT s.sid, s.serial#, t.used_ublk, t.start_time FROM v$transaction t JOIN v$session s ON t.ses_addr = s.saddr WHERE t.used_ublk > 10000 AND t.start_time (超30分钟即可疑)
恢复场景下最稳妥做法:
- 立刻添加新 UNDO 数据文件:
ALTER TABLESPACE undotbs1 ADD DATAFILE '/u01/oradata/yourdb/undotbs02.dbf' SIZE 2G AUTOEXTEND ON NEXT 200M MAXSIZE 6G; - 避免在恢复脚本中写单个超大事务;拆成每 5000 行
COMMIT一次 - 别调
UNDO_RETENTION试图“缓解”——它只是建议值,空间紧张时 Oracle 仍会覆盖旧 UNDO
真正容易被忽略的点:恢复操作用的用户,其默认表空间、临时表空间、撤销表空间,三者可能分属不同物理文件;而 Navicat 图形界面只显示“连接成功”,不会告诉你这些底层空间是否就绪。每次恢复前,必须手动验证这三项,而不是依赖上次配置。











