Resize Datafile时ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据
前些天做測試,為了圖方便,在sys用戶下建立了一張大表,插入的數據大概幾億條,導致system空間增長了30G左右,后面想刪除數據,縮小system空間,因此truncate table,后面又drop table,但是此時只是降低了段的高水位,數據文件還有高水位,因此磁盤空間并沒有被釋放。
1、先查詢可以利用的空閑空間
SQL> select sum(bytes/1024/1024/1024) from dba_free_space where tablespace_name='SYSTEM';
SUM(BYTES/1024/1024/1024)
-------------------------
???????????????31.4642944
?
2、計算datafile可以resize收縮的空間,也就是必須剩余部分其他對象正在使用的空間
????select a.file#,a.name,a.bytes/1024/1024 CurrentMB,??
???????ceil(HWM * a.block_size)/1024/1024 ResizeTo,??
???????(a.bytes - HWM * a.block_size)/1024/1024 ReleaseMB,??
???????'alter database datafile '''||a.name||''' resize '||??
???????ceil(HWM * a.block_size/1024/1024) || 'M;' ResizeCMD??
from v$datafile a,??
?????(select file_id,max(block_id+blocks-1) HWM??
???????from dba_extents where file_id in???
??????????????(select b.file#??From v$tablespace a ,v$datafile b??
????????????????where a.ts#=b.ts# and a.name='SYSTEM')
???????group by file_id) b??
where a.file# = b.file_id(+)??
and (a.bytes - HWM *block_size)>0??
order by 5??
/
?????FILE#
----------
NAME
----------------------------------------------------------------------------------------------
?CURRENTMB???RESIZETO??RELEASEMB
---------- ---------- ----------
RESIZECMD
----------------------------------------------------------------------------------------------
?????????1
D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
??????1024??????545.5??????478.5
alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF' resize 546M;
3、直接收縮數據文件
SQL> ALTER DATABASE DATAFILE 'D:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF' RESIZE 546m;
????正常情況下這樣就可以了,但是我在計算datafile可以resize收縮的空間時,發現只能收縮至30G左右,如果收縮太小,出錯
SQL> ALTER DATABASE DATAFILE 'D:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF' RESIZE 10240M;
第 1 行出現錯誤:
ORA-03297: 文件包含在請求的 RESIZE 值以外使用的數據
????文件也有高水位,不是你想RESIZE到多少就多少的,有些有效數據被切掉,當然是不允許的,但是除了原來那張大表,剩余的數據不可能占用怎么大的空間,所以估計是哪個表或其他對象還占用了大量空間
?
4、找到文件對應的文件號
SQL> select file#,name from v$datafile;
?????FILE# NAME
---------- --------------------------------------------------------------------------------
?????????1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
?????????2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
?????????3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
?????????4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
?????????5 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
?????????6 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\XTFDB\UNIEAP.DBF
?????????7 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\XTFDB\NEUDOC.DBF
?????????8 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\XTFDB\ELARP.DBF
?????????9 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\XTFDB\SEAS.DBF
????????10 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\XTFDB\DLMIS.DBF
?
5、看下找到文件中最大的塊號
SQL> select max(block_id) from dba_extents where file_id=1;
SQL> select owner,segment_name,segment_type,tablespace_name,extent_id from dba_extents where block_id=(select max(block_id) from dba_extents);
?owner??segment_name???segment_type tablespace_name extent_id??
------??-------------- ------------ --------------- ---------
?SYS????C_OBJ#_INTCOL#????CLUSTER?????SYSTEM????????????18
?
6、主要是C_OBJ#_INTCOL#這個聚簇段占用的塊的位置的太大了,接下來要先查出這個聚簇段屬于某張表
SQL> select * from dba_clu_columns where cluster_name='C_OBJ#_INTCOL#';
OWNER??????????????????????????CLUSTER_NAME???????????????????CLU_COLUMN_NAME???????????????TABLE_NAME??????????????????TAB_COLUMN_NAME
------------------------------ ------------------------------ ------------------------------ --------------------------??---------------
SYS????????????????????????????C_OBJ#_INTCOL#?????????????????OBJ#??????????????????????????HISTGRM$????????????????????????OBJ#
SYS????????????????????????????C_OBJ#_INTCOL#?????????????????INTCOL#???????????????????????HISTGRM$????????????????????????INTCOL#
可以看出來,是屬于HISTGRM$表,HISTGRM$系統表,這個表是記錄各個業務表的數據分布情況的,網絡上查到其基本可以刪除
?
7、截斷c_obj#_intcol#
SQL> truncate cluster c_obj#_intcol#;truncate cluster c_obj#_intcol#???????
第 1 行出現錯誤:ORA-00701: 無法變更熱啟動數據庫所需的對象
8、截斷HISTGRM$表
SQL> truncate table HISTGRM$;
ORA-14512:不能對聚集對象進行操作
ORA-00701:無法改變熱啟動數據庫所需的對象
?
9、使用move
SQL> ALTER TABLE HISTGRM$ MOVE;
第 1 行出現錯誤:
ORA-14512: 不能對聚簇對象進行操作
一樣的錯誤
?
???上網查:CLUSTER C_OBJ#_INTCOL#增長導致數據庫的SYSTEM 表空間被大量占用,因為這個CLUSTER是一個BOOTSTRAP$對象。由于是BOOTSTRAP$對象,所以無法TRUNCATE.由于這個對象是251>56,因此不是核心BOOTSTRAP$對象,所以我們用得上EVENT 38003了。大意是修改一下event級別,然后重新啟動后即可。
10、設置EVENT參數,重啟數據庫
SQL> alter system set EVENT="38003 trace name context forever, level 10"???SCOPE=SPFILE;
系統已更改。
SQL> shutdown immediate;
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area??612368384 bytes
Fixed Size??????????????????1250428 bytes
Variable Size?????????????100666244 bytes
Database Buffers??????????503316480 bytes
Redo Buffers????????????????7135232 bytes
數據庫裝載完畢。
數據庫已經打開。
?
11、重新截斷cluster c_obj#_intcol#
SQL> truncate cluster c_obj#_intcol#;
簇已截斷。
?
12、Resize datafile
SQL> alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF' resize 548M;
數據庫已更改。
?
13、測試,確保沒有影響
SQL> exec DBMS_STATS.GATHER_TABLE_STATS(ownname=>'scott', tabname=>'emp', estimate_percent=>30,?method_opt=>'for all indexed columns size skewonly',cascade=>true, degree=>2);
PL/SQL 過程已成功完成。
?
14、檢查使用exp與expdp是否可以順利導出數據
我的exp出現如下錯誤:
C:\Documents and Settings\Administrator>exp scott/tiger file=e:/ymhtest.dmp
EXP-00008: 遇到 ORACLE 錯誤 600
ORA-00600: 內部錯誤代碼, 參數: [19004], [], [], [], [], [], [],
. . 正在導出表???????????????????????????BONUS
EXP-00008: 遇到 ORACLE 錯誤 600
ORA-00600: 內部錯誤代碼, 參數: [19004], [], [], [], [], [], [],
. . 正在導出表??????????????????????????COMMIT
EXP-00008: 遇到 ORACLE 錯誤 600
ORA-00600: 內部錯誤代碼, 參數: [19004], [], [], [], [], [], [],
. . 正在導出表????????????????????????????DEPT
EXP-00008: 遇到 ORACLE 錯誤 600
ORA-00600: 內部錯誤代碼, 參數: [19004], [], [], [], [], [], [],
. . 正在導出
我的expdp出現如下錯誤:
ORA-39002: 操作無效
ORA-39070: 無法打開日志文件。
ORA-29283: 文件操作無效
ORA-06512: 在 "SYS.UTL_FILE", line 475
ORA-29283: 文件操作無效
???試過很多辦法,最終還是無法解決,我的是oracle10.2.0。1的,有人說要打補丁才行,沒試過,最后只好還原數據庫,所以,要盡量小心。
????注意:這是不被支持的方法,建議在生產庫中不要輕易實施,如果要實施
1、備份數據庫
2、最好操作后要對重要的表進行一次分析,可能影響系統中的一些SQL的執行計劃。
總結
以上是生活随笔為你收集整理的Resize Datafile时ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE 普通表转换成分区表(在线重
- 下一篇: 字符集的更改