oracle表空間不足:ORA-01653: unable to extend table

DBA_每日記發表於2019-10-14

問題背景:

      oracle表空間不足報錯是比較常見的故障,尤其是沒有對剩餘表空間做定期巡檢的系統;

       報錯程式碼如下:

       oracle表空間不足錯誤程式碼:ORA-01653: unable to extend table ;


解決方式:


1、檢視錶空間使用率:

set linesize 220;
set pagesize 500;
col tbsn for a40;
select total.tablespace_name TBSN,
        round(total.MB,3) as total_space,
        case when free.MB is null then 0
                               else round(free.MB,3)
         end as free_space,
       case when free.MB is null then 0
         else round(free.MB,3)/round(total.MB,3)*100  end as free_rate
from ( select tablespace_name, sum(bytes/1024/1024) MB from dba_data_files group by tablespace_name )  total,
        ( select tablespace_name, sum(bytes/1024/1024) MB from dba_free_space group by tablespace_name )  free
where total.tablespace_name=free.tablespace_name(+)
order by  free_rate desc;


上述程式碼可以查詢中資料庫有哪些表空間,總空間大小,剩餘空間大小以及使用百分比,可以做到對錶空間使用情況的一目瞭然


2、 檢視磁碟那個空間表多,把表空間放在剩餘空間比較多的地方(Linux作業系統)
df -h


3、檢視錶空間資料檔案:
一定要確認好路徑,和原有的檔案路徑保持一致
set wrap on;
set lines 170
col file_name for a80
select file_id,file_name,bytes/1024/1024 MB from dba_data_files where tablespace_name=upper('&tablespace_name');

4、如果是RAC環境還要檢視asm磁碟剩餘空間
select group_number,name,total_mb,free_mb from v$asm_diskgroup;

5、新增表空間  (手動條件資料檔案)
alter tablespace tablespace_name add datafile '/xxxx/xxxx/xxxxx_number.dbf' size 30g autoextend off;

6、自己寫了一個自動編輯增加資料檔案的擴容sql ,可以批量生成擴容指令碼(不保證百分百成功率,基本都沒問題)

set linesize 150 pagesize 900
SELECT 'alter tablespace ' || TABLESPACE_NAME || ' add datafile ''' ||
       substr(file_name, 1, regexp_instr(file_name, '[[:digit:]]+\.') - 1) ||
       TO_CHAR(substr(file_name,
                      regexp_instr(file_name, '[[:digit:]]+\.'),
                      instr(file_name, '.') -
                      regexp_instr(file_name, '[[:digit:]]+\.')) + B.RN) ||
       '.dbf'' size ' || bytes / 1024 / 1024 || 'm autoextend off;'
  FROM DBA_DATA_FILES,
       (select rownum rn
          from dba_objects
         WHERE ROWNUM <= &number_of_datafile) B       ----增加幾個資料檔案,比如3個
 WHERE FILE_ID = (SELECT DISTINCT LAST_VALUE(FILE_ID)
 OVER(ORDER BY to_number(substr(file_name, regexp_instr(file_name, '[[:digit:]]+\.'), instr(file_name, '.') - regexp_instr(file_name, '[[:digit:]]+\.'))) ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
                    FROM DBA_DATA_FILES
                   WHERE tablespace_name = '&tablespace_name');    --表空間名稱




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69950231/viewspace-2659967/,如需轉載,請註明出處,否則將追究法律責任。

相關文章