Oracle resize DBF報錯"ORA-03297"簡單介紹

maohaiqing0304發表於2015-08-26


標題:Oracle resize DBF報錯"ORA-03297"簡單介紹

作者:lōττéry©版權所有[文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任.]


錯誤號資訊分析:

[oracle@localhost ~]$ oerr ora 03297
03297, 00000, "file contains used data beyond requested RESIZE value"
// *Cause:  Some portion of the file in the region to be trimmed is
//          currently in use by a database object
// *Action: Drop or move segments containing extents in this region prior to
//          resizing the file, or choose a resize value such that only free
//          space is in the trimmed.
[oracle@Database-backup ~]$ 


報錯資訊很提示:檔案包含超出要求的調整值的資料,如下來看下各資料檔案可回收到的最小大小,若沒resize回收餘地如何解決。


oracle 檢視DBF回收resize最小大小 --&gt各DBF最大block大小

SQL
     select 'alter database datafile ''' || file_name || ''' resize ' ||decode(MAX_GB, 0, '100M;', MAX_GB || 'G;') RESIZE命令,
       a.TABLESPACE_NAME,
       a.AUTOEXTENSIBLE,
       a.TOTAL_GB,
       a.MAX_GB
  from (SELECT TABLESPACE_NAME,
               FILE_NAME,
               AUTOEXTENSIBLE,
               CEIL(SUM(BYTES / 1024 / 1024 / 1024)) TOTAL_GB,
               CEIL(SUM(case when MAX_BLOCK.FILE_ID is null then 0 else MAX_BLOCK.MAX_BLOCK end)) MAX_GB
        --由於size大小需為整
        --CEIL(N) 取大於等於數值N的最小整數
        --FLOOR(N)取小於等於數值N的最大整數
          FROM DBA_DATA_FILES
          LEFT JOIN (SELECT MAX(BLOCK_ID) * 8 / 1024 / 1024 MAX_BLOCK,
                           FILE_ID
                      FROM DBA_EXTENTS
                     GROUP BY FILE_ID) MAX_BLOCK
            ON MAX_BLOCK.FILE_ID = DBA_DATA_FILES.FILE_ID
         GROUP BY TABLESPACE_NAME, /*MAX_BLOCK.FILE_ID,*/
                  FILE_NAME,
                  AUTOEXTENSIBLE
         ORDER BY TABLESPACE_NAME) A
 where TOTAL_GB != MAX_GB;
 
RESIZE命令                                                                                                   TABLESPACE_NAME                AUTOEXTENSIBLE     TOTAL_GB  MAX_BLOCK_GB
---------------------------------------------------------------------------- -------- -------- -------- -------- -------- ----------------------------- ----------------- ------------- ------------
alter database datafile '/data/datafiles/ZB_LSP_001/sysaux01.dbf' resize 8G;             SYSAUX                            YES                      10                     8
alter database datafile '/data/datafiles/ZBLSP_DATA_001.dbf' resize 27G;                 TBS_LMP                            YES                     30                    27
alter database datafile '/data/datafiles/ZB_LSP_001/tbs_scheduler.dbf'resize 10G;     TBS_SCHEDULER                 YES                     32                    10
SQL> 


提示:
MAX_BLOCK_GB接近TOTAL_GB時,可透過查詢DBA_EXTENTS按照block_id排序,move部分最大塊物件(適用於block_id極其且較少的不連續block_id'例如:資料檔案Resize引起的ORA-03297報錯')
當然,若透過dba_free_space查詢資料檔案空間剩餘較多,想對剩餘空間進行部分resize來釋放系統空間,可同如下方式解決
1、寫個批處理 move 物件,注意索引失效處理;
2、匯出,重建資料檔案,再匯入;


擴充套件:
檢視碎片比:select tablespace_name,count(*) chunks,max(bytes/1024/1024) max_chunk from dba_free_space group by tablespace_name; 
                    #CHUNK列表示表空間中可用有多少可用的空閒資料塊,如果空閒塊較多,超過100,則需要對相鄰碎片進行整合

檢視block_id極其不連續情況
select * from (SELECT segment_name,block_id ,LEAD( block_id) OVER ( ORDER BY block_id desc)/*整列向下移動一行*/ block_id_ FROM dba_extents) where  block_id -block_id_ >10000


  【源於本人筆記】 若有書寫錯誤,表達錯誤,請指正...


此條目發表在  Oracle  分類目錄。將固定連線加入收藏夾。



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

相關文章