在web項目往數(shù)據(jù)庫表中新增數(shù)據(jù)時,插入失敗,報錯信息如下:Oracle解決ora-01653 無法通過1024擴展

 

 首先看到這個問題,理解的是這個表數(shù)據(jù)量太大,存不下了,但是并不知道是在哪里存的,于是網(wǎng)上百度了一下:

一、查看表-->屬性中所屬的表空間,在system表中間中。

二、查看數(shù)據(jù)庫有哪些表空間及使用情況:

方法1:

SELECT a.tablespace_name "表空間名",a.bytes / 1024 / 1024 "表空間大小(M)",(a.bytes - b.bytes) / 1024 / 1024 "已使用空間(M)",
b.bytes / 1024 / 1024 "空閑空間(M)",round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "使用比"
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:

--獲取數(shù)據(jù)文件dbf路徑
select tablespace_name, file_id,file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;

第一種解決方案:

可以看到USERS表空間總共有3個dbf(此時我已經(jīng)增加了04.dbf),復(fù)制其中一個dbf路徑 /home/oracle/oradata/users01.dbf,覆蓋下面的datafile參數(shù):

--新增加一個dbf文件,指定該dbf文件大小為32GB左右,并使其每次自動擴展1GB,并且沒有最大限制
alter tablespace users add datafile '/home/oracle/oradata/users04.dbf' size 32760m autoextend on next 1024m maxsize unlimited;
--segment space management auto extent management local; 據(jù)說可以連接上一句一起執(zhí)行(把上一句分號去掉即可),沒執(zhí)行,不知道執(zhí)行效果,謹(jǐn)慎期間,慎用。

第二種解決方案:

--把原有的dbf數(shù)據(jù)文件大小調(diào)整(擴大)
alter database  datafile '/home/oracle/oradata/users01.dbf' resize  61440M; --沒試過,不知道效果

我用的第一種方案,第二種也試了一下可以。

解決后效果

我用的第一種解決方案,增加了04.dbf,再次使用SQL查看表空間使用情況:

SELECT a.tablespace_name "表空間名",a.bytes / 1024 / 1024 "表空間大小(M)",(a.bytes - b.bytes) / 1024 / 1024 "已使用空間(M)",
b.bytes / 1024 / 1024 "空閑空間(M)",round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "使用比"
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;

 

 

使用比已經(jīng)從99.99%降低到69.42%,說明效果明顯,方案可用。

再去查看/home,使用du -sh命令查看了/home目錄大小為282GB。原來增加一個dbf文件會使得/home目錄實際也增加32GB大小。

注意事項及所有用到的SQL

 1、在上面的第一種解決方案里,32760m 約等于 32GB,根據(jù)最大塊來算的,塊計算SQL

SELECT UPPER(F.TABLESPACE_NAME) "表空間名",D.TOT_GROOTTE_MB "表空間大小(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",
  TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
  F.TOTAL_BYTES "空閑空間(M)",F.MAX_BYTES "最大塊(M)" 
  FROM (SELECT TABLESPACE_NAME,
  ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
  ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
  FROM SYS.DBA_FREE_SPACE
  GROUP BY TABLESPACE_NAME) F,
  (SELECT DD.TABLESPACE_NAME,
   ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
  FROM SYS.DBA_DATA_FILES DD
  GROUP BY DD.TABLESPACE_NAME) D
  WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
  ORDER BY 1;
---查詢數(shù)據(jù)文件以及數(shù)據(jù)文件大小
select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
select username, default_tablespace, temporary_tablespace from dba_users;

--獲取數(shù)據(jù)文件路徑
select tablespace_name, file_id,file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
--讓數(shù)據(jù)文件自動擴展
alter tablespace users add datafile '/home/oracle/oradata/users04.dbf' size 32760m autoextend on next 1024m maxsize unlimited;
--segment space management auto extent management local; 據(jù)說可以連接上一句一起執(zhí)行(把上一句分號去掉即可),沒執(zhí)行,不知道執(zhí)行效果,謹(jǐn)慎期間,慎用。
--把數(shù)據(jù)文件大小調(diào)整
alter database  datafile '/home/oracle/oradata/users01.dbf'  resize  61440M; --沒試過,不知道效果

大SQL, 表本身大小,表的索引大小,表的LOB字段大小:

--大SQL,表本身大小。
 --比如,索引有3個,然后匯總100M,然后表本身20M,最后的總數(shù)就是120,索引100M
 select OWNER FD_OWNER,COLUMN_NAME FD_COLUMN_NAME,TABLE_NAME FD_TABLE_NAME,
 case segment_name||'-' when '-' then table_name else segment_name end as FD_SEGMENT_NAME ,
 SEGMENT_TYPE FD_SEGMENT_TYPE,FD_BYTES,FD_MAX_SIZE,
 ROUND(FD_BYTES / 1024 / 1024) FD_MB,
 ROUND(sum(FD_BYTES) over(partition by segment_type) / 1024 / 1024) FD_SEGTYPE_TOTAL_MB,
 ROUND(sum(FD_BYTES) over(partition by table_name ) / 1024 / 1024)  FD_TOTAL_MB
 from (
 --第一部分,表本身大小
     select b.owner, null column_name,b.segment_name as table_name,b.partition_name as segment_name,
     b.segment_type,sum(b.BYTES) FD_BYTES,sum(b.MAX_SIZE) FD_MAX_SIZE
     from dba_segments b
     where b.owner = 'COGLINK'
     group by b.owner, b.segment_name, partition_name, b.segment_type
 UNION ALL
 --第二部分,表的索引大小
     select a.owner, null column_name,a.table_name, b.segment_name,b.segment_type,sum(b.BYTES) FD_BYTES,sum(b.MAX_SIZE) FD_MAX_SIZE
     from dba_indexes a, dba_segments b
     where a.OWNER = b.owner and a.OWNER = 'COGLINK'
     and a.index_name = b.segment_name group by a.owner, a.table_name, b.segment_name, b.segment_type
 UNION ALL
 --第三部分,如果表有LOB類型,LOB是單獨存放的,包括數(shù)據(jù)和索引都分開
     select a.owner,a.column_name,a.table_name,b.segment_name,b.segment_type,b.BYTES FD_BYTES,b.MAX_SIZE FD_MAX_SIZE
     from dba_lobs a, dba_segments b
     where a.segment_name = b.segment_name
     and a.owner = 'COGLINK'
 UNION ALL
     select a.owner,a.column_name,a.table_name,b.segment_name,b.segment_type,b.BYTES FD_BYTES,b.MAX_SIZE FD_MAX_SIZE
     from dba_lobs a, dba_segments b
     where a.index_name = b.segment_name
     and a.owner = 'COGLINK'
 ) f order by segment_type, FD_BYTES desc

 

 

 文本來源:https://www.bbsmax.com/A/obzb70RjJE/

用來記錄和學(xué)習(xí),如有侵權(quán),請聯(lián)系刪除。