程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle shrinktable收縮表使用場景

Oracle shrinktable收縮表使用場景

編輯:Oracle教程

Oracle shrinktable收縮表使用場景


現場有一個外網的環境表空間嚴重不足,客戶不想擴容,要清理一部分數據,都是大字段的blob. 表空間是1T,已經使用0.99T,刪除2015年之前的blob後,通過附件的基礎信息表查出還有200G的數據,不過表空間並沒有釋放(高水位線),這個時候有幾種方式處理:

1. 新建一張表,把剩下的數據導入,不可行,沒有這麼大的空間了.

2. 用數據泵或用exp導出大字段,刪除表後,然後導入.

3. 用shrink table.

最終選擇用第三種方案,以下是試驗,blob的實驗也測試過,可以收縮,如何插入blob,在此不再贅述.

select * from v$version;
BANNER
-------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

create user TEST_DB
identified by TEST_DB
default tablespace testdb_tbs
temporary tablespace TEMP;
grant connect to TEST_DB;
grant dba to TEST_DB;
grant resource to TEST_DB;
grant select any dictionary to TEST_DB;

create tablespace testdb_tbs datafile '/home/oracle/app/oradata/orcl/testdb_tbs.dbf' size 100m autoextend off;
create table test as select * from dba_objects;
insert into test select * from dba_objects;--執行多次,直到表空間使用率為90%以上

SELECT Upper(F.TABLESPACE_NAME) "表空間名",
D.TOT_GROOTTE_MB "表空間大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",
F.TOTAL_BYTES "空閒空間(M)",
To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99')
|| '%' "使用比"
FROM (SELECT TABLESPACE_NAME,
Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
having DD.TABLESPACE_NAME='TESTDB_TBS'
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME;
表空間名 表空間大小(M) 已使用空間(M) 空閒空間(M) 使用比
------------- ------------- ------------- ----------- -----------
TESTDB_TBS 100 97 3 97.00%

select count(1) from test;
COUNT(1)
----------
802835

delete from test where rownum <=2835;
commit;

select count(1) from test;
COUNT(1)
---------
800000

--再次查詢表空間,TESTDB_TBS空間沒有釋放

alter table test shrink space cascade;
alter table test shrink space cascade
*
第 1 行出現錯誤:
ORA-10636: ROW MOVEMENT is not enabled


alter table test enable row movement ;
表已更改。

alter table test shrink space cascade;--連同索引一起收縮
表已更改。
SELECT Upper(F.TABLESPACE_NAME) "表空間名",
D.TOT_GROOTTE_MB "表空間大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",
F.TOTAL_BYTES "空閒空間(M)",
To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99')
|| '%' "使用比"
FROM (SELECT TABLESPACE_NAME,
Round(Sum(BYTES) / ( 1024 * 1024 ), 2) TOTAL_BYTES,
Round(Max(BYTES) / ( 1024 * 1024 ), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
Round(Sum(DD.BYTES) / ( 1024 * 1024 ), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
having DD.TABLESPACE_NAME='TESTDB_TBS'
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME;
表空間名 表空間大小(M) 已使用空間(M) 空閒空間(M) 使用比
------------ ------------- ------------- ----------- ----------------
TESTDB_TBS 100 90.94 9.06 90.94%

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved