解决 java.sql.SQLException: ORA-01688: unable to extend table XXX partition YYY by 1024 in tablespace

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路解决 java.sql.SQLException: ORA-01688: unable to extend table XXX partition YYY by 1024 in tablespace,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

错误

java.sql.SQLException: ORA-01688: unable to extend table XXX partition YYY by 1024 in tablespace ZZZ
往Oracle table中导入大量数据时,遇到上面的数据库错误。

注意:
我在错误信息中隐藏了真实的表名、分区名、表空间名,下面的sql也将用它们来代替,如果要解决自己项目中的问题,根据自己的情况进行替换:
XXX: table name
YYY: partition name
ZZZ: tablespace name

错误解释:
该表所属的表空间大小不够。

解决方案

有以下3种解决办法:

  1. 给指定的tablespace增加data file

    alter tablespace ZZZ add datafile 'path\to\data\file2' size 1G;
    
  2. 增加当前data file的大小

    alter database datafile 'path\to\data\file' resize 10G;
    
  3. 设置当前的data file为自动增长

    alter database datafile 'path\to\data\file' autoextend on maxsize unlimited;
    

注意:
上面的sql是例子,具体的限制根据自己项目的实际情况来。

如果是测试环境,可以考虑删除不用的老数据,达到清理空间的效果。例子如下:

alter table table_name truncate partition partition_name
						update indexes;
# 清理某个表的某个partition中的数据

分析(相关知识)

解决这样的问题,首先分析当前表空间的实用情况,主要实用下面一些比较重要的系统view或者table等:
DBA_TABLESPACES
USER_TABLESPACES
DBA_DATA_FILES
DBA_FREE_SPACE
V$DATAFILE
DBA_SEGMENTS

Oracle提供了很多有用的系统表或者视图,可以参见下面的博客:

Oracle中常用系统表和视图以及常用函数

脚本1

查出当前数据库中表空间使用率情况。
不出意外,错误信息里的表空间ZZZ应该排在最前面。

SELECT a.TABLESPACE_NAME, a.BYTES/1024/1024 "sum MB",
(a.BYTES-b.BYTES)/1024/1024 "used MB",B.BYTES/1024/1024 "free MB",
ROUND (((a.BYTES-b.BYTES)/a.BYTES)*100,2) "used%" FROM
(SELECT TABLESPACE_NAME, SUM(BYTES) BYTES FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) a,
(SELECT TABLESPACE_NAME, SUM(BYTES) BYTES, MAX(BYTES) LARGEST FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) b
WHERE a.TABLESPACE_NAME = b.TABLESPACE_NAME
ORDER BY ((a.BYTES-b.BYTES)/a.BYTES) DESC;

脚本2

查出表空间ZZZ的所有data file的大小

SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME, ROUND(BYTES/(1024*1024),0) TOTAL_SPACE_MB
FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'ZZZ'
ORDER BY TOTAL_SPACE_MB DESC, FILE_ID ASC;

脚本3

按照大小顺序列出所有使用表空间ZZZ的数据库对象,
注意 SEGMENT_TYPE字段。

SELECT OWNER, TABLESPACE_NAME, SEGMENT_NAME, SEGMENT_TYPE, PARTITION_NAME, ROUND(BYTES/(1024*1024),2) SIZE_MB
FROM DBA_SEGMENTS
WHERE SEGMENT_TYPE IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION',
                       'INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION', 'TEMPORARY', 'LOBINDEX', 'LOBSEGMENT', 'LOB PARTITION')
AND TABLESPACE_NAME = 'ZZZ'
ORDER BY BYTES DESC;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155833.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!