收縮表空間ORA-03297錯誤解決
最近導一個空庫到資料庫後,發現佔用的表空間非常大,執行表收縮(SHRINK SPACE CASCADE)後,發現實際佔用的空間不到1%。
ALTER DATABASE DATAFILE 'D:\ora_tablespace\GCOMM2.dbf' RESIZE 5000M;
提示:ORA-03297: file contains used data beyond requested RESIZE value
原因1:壓縮表空間大小,最小必須是該表空間目前最大塊段的大小
原因2:表的初始大小分配的太大
一、徵對原因1,可以採用移動表空間的方法來減小block_id
--找出目前GCOMM2表空間最大的block_id
SELECT MAX(block_id)
FROM dba_extents
WHERE tablespace_name = 'GCOMM2';
MAX(BLOCK_ID)
-------------
994816
--計算目前最大塊的段所佔用的空間(該資料庫的block大小是8092)
SQL> show parameter db_block_size ;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
SELECT 994816*8192/1024/1024 FROM dual;
994816*8192/1024/1024
---------------------
7772
因此目前該表空間只能收縮到7772M左右
ALTER DATABASE DATAFILE 'D:\ora_tablespace\GCOMM2.dbf' RESIZE 7772M;
--透過移動移動表空間來收縮表空間大小步驟
1.建立表空間用於將較大block_id的表移到此表空間
CREATE TABLESPACE "gcomm_bk" DATAFILE 'D:\ora_tablespace\gcomm_bk.dbf' SIZE 2048M
LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
2.找出需要移動表空間的表並將這些表移到剛建立的表空間
--收縮表
' SHRINK SPACE CASCADE; '
FROM dba_extents
WHERE tablespace_name = 'GCOMM2'
AND segment_type = 'TABLE'
AND file_id = 11
AND block_id > 30336;
SELECT DISTINCT 'alter table ' || segment_name ||
' move tablespace "gcomm_bk"; '
FROM dba_extents
WHERE tablespace_name = 'GCOMM2'
AND file_id = 11
AND block_id > 30336/*872704*/
AND segment_type = 'TABLE';
移動表空間過程中出現了這個錯誤:ORA-01658: 無法為表空間 gcomm_bk 中的段建立 INITIAL 區
原因:表空間不夠。
解決:將該表空間設為自動擴充套件或者直接擴大該表空間
注:如果是smallfile 表空間無法設為自動擴充套件,則必須手動將這些表空間先加大
ALTER DATABASE DATAFILE 'D:\ora_tablespace\gcomm_bk.dbf' RESIZE 7000M;
3.重建該空間的索引
SELECT DISTINCT 'alter INDEX ' || segment_name ||
' REBUILD TABLESPACE "gcomm_bk"; '
FROM dba_extents
WHERE tablespace_name = 'GCOMM2'
AND file_id = 11
AND block_id > /*30336*/872704
AND segment_type = 'INDEX';
4.再次檢視此時gcomm2表空間最大塊的段
SELECT MAX(block_id)
FROM dba_extents
WHERE tablespace_name = 'GCOMM2';
SELECT 30336*8192/1024/1024 FROM dual;
5.收縮表空間(執行成功)
ALTER DATABASE DATAFILE 'D:\ora_tablespace\GCOMM2.dbf' RESIZE 500M;
6.再將表移回來
SELECT DISTINCT 'alter table ' || segment_name ||
' move tablespace GCOMM2; '
FROM dba_extents
WHERE tablespace_name = 'gcomm_bk'
AND segment_type = 'TABLE';
7.重建索引
' REBUILD TABLESPACE GCOMM2; '
FROM dba_extents
WHERE tablespace_name = '"gcomm_bk"'
AND file_id = 11
AND block_id > 30336
AND segment_type = 'INDEX';
二、徵對原因2可透過減小表或索引的初始化大小來收縮表空間
--徵對塊大的表 減小其初始分配大小
SELECT DISTINCT 'alter table ' || segment_name ||
' MOVE STORAGE(INITIAL 1M) ;'
FROM dba_extents
WHERE tablespace_name = 'GCOMM2'
AND segment_type = 'TABLE'
AND file_id = 11
AND block_id > 30336;
--徵對塊大的索引減小其初始分配大小
SELECT DISTINCT 'alter index ' || segment_name ||
' REBUILD tablespace GCOMM2 storage(initial 64K next 1M pctincrease 0);'
FROM dba_extents
WHERE tablespace_name = 'GCOMM2'
AND segment_type = 'INDEX'
AND file_id = 11
AND block_id > 30336;
然後再收縮表空間
ALTER DATABASE DATAFILE 'D:\ora_tablespace\GCOMM2.dbf' RESIZE 1000M;
執行成功,原先為7G多。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2125362/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 轉貼:收縮oracle表空間時ora-03297錯誤的解決Oracle
- 收縮臨時表空間收縮方法及ORA-03297錯誤處理
- 分析表空間空閒率並收縮表空間
- Oracle表空間收縮方案Oracle
- mysql收縮共享表空間MySql
- DB2_收縮表空間DB2
- oracle之EXP匯出表空間錯誤解決Oracle
- 收縮表空間 for Oracle 10gOracle 10g
- oracle空間收縮Oracle
- 【RESIZE】Oracle收縮表空間主要命令Oracle
- oracle之臨時表空間的收縮Oracle
- mysql共享表空間擴容,收縮,遷移MySql
- 表空間(資料檔案shrink)收縮示例
- Oracle效能優化:收縮臨時表空間Oracle優化
- shrink收縮檔案空間
- MySQL 5.7新特性之線上收縮undo表空間MySql
- UNDO表空間的ORA-1122錯誤解決(三)
- ORACLE 11g臨時表空間收縮的功能Oracle
- Oracle案例11——Oracle表空間資料庫檔案收縮Oracle資料庫
- Oracle 11g 新特性 -- 臨時表空間收縮(轉)(Oracle
- lvm收縮邏輯卷空間LVM
- UNDO表空間損壞,爆滿,ORA-600[4194]/[4193]錯誤解決
- expdp/impdp來解決exp/imp出現的錯誤並匯入指定表空間
- 錯誤新增表空間的資料檔案
- UNDO表空間不足解決方法
- 表空間滿的解決方法
- 測試表的空間壓縮與表空間的關係
- HybridDBforPostgreSQL列存表(AO表)的膨脹、垃圾檢查與空間收縮SQL
- system表空間爆滿解決方法
- TEMP表空間不足解決 - temp group
- 關於收縮表和表空間的相關概念(Shrinking Database Segments Online)Database
- 在HPUX ASM上建立表空間產生的錯誤UXASM
- 【UNDO】使用重建UNDO表空間方法解決UNDO表空間過大問題
- Oracle 10g Shrink Table - Shrink Space 收縮空間Oracle 10g
- 儲存管理之段收縮、可恢復空間
- undo表空間不能回收的解決方法
- Oracle undo表空間爆滿的解決Oracle
- 【實驗】重建臨時表空間解決臨時表空間過大問題