日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle如何收缩表空间,ORACLE收缩表空间

發布時間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle如何收缩表空间,ORACLE收缩表空间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近導一個空庫到數據庫后,發現占用的表空間非常大,執行表收縮(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.找出需要移動表空間的表并將這些表移到剛創建的表空間 --收縮表 SELECT DISTINCT 'alter table ' || segment_name || ??????????????? ' 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 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 '||owner||',' || segment_name || ' enable row movement; '? FROM dba_extents WHERE tablespace_name = 'gcomm_bk'?? AND segment_type = 'TABLE'; 釋放存貯--針對delte SELECT DISTINCT 'alter table '||owner||',' || segment_name || ' shrink space cascade; '? FROM dba_extents WHERE tablespace_name = 'gcomm_bk'?? AND segment_type = 'TABLE'; 移動表到新的表空間 SELECT DISTINCT 'alter table '||owner||',' || segment_name || ' move tablespace GCOMM2; '? FROM dba_extents WHERE tablespace_name = 'gcomm_bk'?? AND segment_type = 'TABLE'; 重建索引到新的表空間 SELECT DISTINCT 'alter INDEX? '||owner||',' || segment_name ||' REBUILD TABLESPACE GCOMM2; '? FROM dba_extents WHERE tablespace_name = '"gcomm_bk"'? AND segment_type = 'INDEX'; 移動大對象到新的表空間 select 'alter table '||owner||','||table_name||' move lob('||colmn_name||') store as (tablespace GCOMM2)' from dba_lobs ? where segment_name in(select segment_name ???????????????????????? from dba_extents ???????????????????????? where tablespace_name ='gcomm_bk' and? segment_type like 'LOB%') 二、征對原因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多。

總結

以上是生活随笔為你收集整理的oracle如何收缩表空间,ORACLE收缩表空间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。