縮小資料檔案尺寸報ORA-03297的處理辦法
有個表空間中的佔用空間較多,但實際資料並不多.使用ALTER TABLE table SHRINK SPACE CASCAD後大部分資料檔案可以調整,當試圖調整其中一個資料檔案尺寸的時候報
RA-03297: file contains used data beyond requested RESIZE value
說明這個檔案不能透過降低hwm來釋放空間了。
資料庫版本:oracle 9.2.0.1
--找到資料檔案對應的檔案號
SQL>select file#,name from v$datafile where name like '%BASEINFO.dbf';
5 /data/eucpdb/eucpdb/BASEINFO.dbf
找到檔案中最大的塊號
SQL>select max(block_id) from dba_extents where file_id=5 ;
1213833
--檢視資料庫塊大小
SQL>show parameter db_block_size
db_block_size integer 8192
計算一下檔案中最大使用塊佔用的位置
SQL>select 1213833*8/1024 from dual;
9483.0703125 M
----根據檔案號和塊ID找出資料庫物件
SQL> col segment_name format a30
SQL> SET LIN 200
SQL> select segment_name,segment_type,tablespace_name,extent_id,bytes,blocks from dba_extents where file_id=5 and block_id='1213833';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS
------------------------------ ------------------ ------------------------------ ---------- ---------- ----------
REGISTRYINFO TABLE BASEINFO 25 524288 64
SQL>
SQL> ALTER TABLE eucpmanager.REGISTRYINFO SHRINK SPACE CASCADE;
表已更改。
---建立一個新的表空間,把block_id比較高的幾個表移出表空間
SQL> CREATE SMALLFILE TABLESPACE "BASEINFO_BAK" DATAFILE '/data/eucpdb/eucpdb/baseinfo_bak.dbf' SIZE 100M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
表空間已建立。
SQL> alter user eucpmanager quota unlimited on BASEINFO_BAK;
使用者已更改。
--把block_id比較高的幾個表移動到新的表空間
SELECT DISTINCT SEGMENT_NAME FROM DBA_EXTENTS WHERE TABLESPACE_NAME='BASEINFO' AND FILE_ID=5 and block_id>1159985 and segment_type='TABLE' ;
SQL> SELECT distinct 'alter table '|| SEGMENT_NAME||' move tablespace baseinfo_bak; ' FROM DBA_EXTENTS WHERE TABLESPACE_NAME='BASEINFO' AND FILE_ID=5 and block_id>1159985 and segment_type='TABLE' ;
'ALTERTABLE'||SEGMENT_NAME||'MOVETABLESPACEBASEINFO_BAK;'
----------------------------------------------------------------------------------------------------------------------------
alter table ENTERPRISESERVICEINFO move tablespace baseinfo_bak;
alter table REGISTRYFEEDETAILEX move tablespace baseinfo_bak;
alter table ENTERPRISEROUTE move tablespace baseinfo_bak;
alter table REGISTRYAUTHINFO move tablespace baseinfo_bak;
alter table ENTERPRISEBASEINFO move tablespace baseinfo_bak;
SQL> alter table ENTERPRISESERVICEINFO move tablespace baseinfo_bak;
alter table REGISTRYFEEDETAILEX move tablespace baseinfo_bak;
alter table ENTERPRISEROUTE move tablespace baseinfo_bak;
alter table REGISTRYAUTHINFO move tablespace baseinfo_bak;
alter table ENTERPRISEBASEINFO move tablespace baseinfo_bak;
表已更改。
SQL>
表已更改。
SQL>
表已更改。
SQL>
表已更改。
告警日誌中會出現下面的內容,索引需要重建
Thu Apr 24 14:20:21 2008
Some indexes or index [sub]partitions of table EUCPMANAGER.ENTERPRISEBASEINFO have been marked unusable
把下面的執行結果的語句執行所有重建
SELECT distinct 'alter INDEX '|| SEGMENT_NAME||' REBUILD TABLESPACE BASEINFO_BAK; ' FROM DBA_EXTENTS WHERE TABLESPACE_NAME='BASEINFO' AND FILE_ID=5 and block_id>1159985 and segment_type='INDEX' ;
alter INDEX PK_ENTERPRISEBASEINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX PK_REGISTRYINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX PK_REGISTRYFEEDETAILEX REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
alter INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO_BAK;
再次修改資料檔案大小
SQL> select max(block_id) from dba_extents where file_id=5 ;
MAX(BLOCK_ID)
-------------
3209
SQL> ALTER DATABASE DATAFILE '/data/eucpdb/eucpdb/BASEINFO.dbf' RESIZE 1000m;
資料庫已更改。
資料庫檔案的空間已經調整成功了
SQL>
--把挪走的表在挪回來
SQL> alter table ENTERPRISESERVICEINFO move tablespace baseinfo;
alter table REGISTRYFEEDETAILEX move tablespace baseinfo;
alter table ENTERPRISEROUTE move tablespace baseinfo;
alter table REGISTRYAUTHINFO move tablespace baseinfo;
alter table ENTERPRISEBASEINFO move tablespace baseinfo;
alter table registryinfo move tablespace baseinfo;
表已更改。
SQL>
表已更改。
--重建索引
SQL>
SQL>
SQL> ALTER INDEX PK_REGISTRYINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX AK_REGISTRYCODE_REGISTRYINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX PK_ENTERPRISEBASEINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX PK_ENTERPRISESERVICEINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX UNI_REGISTRYAUTHINFO REBUILD TABLESPACE BASEINFO;
ALTER INDEX PK_REGISTRYFEEDETAILEX REBUILD TABLESPACE BASEINFO;
索引已更改。
SQL> SELECT COUNT(*) FROM DBA_SEGMENTS WHERE TABLESPACE_NAME='BASEINFO_BAK' ;
COUNT(*)
----------
0
--已經沒有物件在新建的這個表空間了。現在刪除掉
SQL> drop tablespace baseinfo_bak;
表空間已刪除。
到此調整已經結束了。
其實調整方法有很多,如用imp/exp等
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/73920/viewspace-1004707/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料檔案Resize引起的ORA-03297報錯
- 當前日誌檔案壞了的處理辦法
- 非歸檔下日誌檔案丟失的處理辦法
- java中 檔案壓縮處理Java
- git上傳檔案時報錯常見的處理辦法Git
- 對於undotbs01.dbf檔案太大的處理辦法
- coreldraw檔案丟失(損壞)的恢復處理辦法
- 收縮臨時表空間收縮方法及ORA-03297錯誤處理
- 處理資料缺失的結構化解決辦法
- 本地無法複製檔案到windows server 系統的處理辦法WindowsServer
- 使用資料流的思想處理檔案
- 含有特殊字元的資料檔案處理字元
- Hadoop小檔案的處理方式Hadoop
- 誤刪資料庫資料檔案的處理方法資料庫
- SpringBoot-檔案壓縮處理Spring Boot
- 有手就會的 Java 處理壓縮檔案Java
- avro處理hadoop上的小檔案VRHadoop
- 資料檔案收縮
- mysql 4.1.7忘記資料庫密碼的處理辦法MySql資料庫密碼
- sqlserver收縮資料庫、收縮資料檔案的操作SQLServer資料庫
- 收縮ORACLE的資料檔案Oracle
- sql server日誌檔案總結及日誌滿的處理辦法SQLServer
- 不可預料的壓縮檔案末端 解壓出錯的解決辦法
- 表空間資料檔案故障處理
- Gulp壓縮報錯處理
- ASP.NET在刪除掉資料庫檔案後報錯處理ASP.NET資料庫
- asm管理的dg資料檔案缺失的處理方法ASM
- Delphi資料壓縮處理(1) (轉)
- Delphi資料壓縮處理(2) (轉)
- 收縮Oracle資料檔案Oracle
- ORACLE 收縮資料檔案Oracle
- 微信小程式資料處理微信小程式
- PowerShell的異常處理辦法
- 批處理 壓縮zip 並過濾部分檔案
- 非歸檔資料檔案誤刪除解決辦法
- 【/proc/檔案淺析】另類辦法恢復資料檔案和控制檔案
- 基於MFC的大型資料檔案處理方法 (轉)
- 【undo】undo 意外刪除處理辦法(非歸檔)