alter table 表名 move和alter table 表名 shrink space都可以用來進(jìn)行段收縮,降低高水位HWM,
成都創(chuàng)新互聯(lián)專注于通化縣企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),購物商城網(wǎng)站建設(shè)。通化縣網(wǎng)站建設(shè)公司,為通化縣等地區(qū)提供建站服務(wù)。全流程按需求定制設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
也都可以用來消除行鏈接(Row Chaining)和行遷移(Row Migration),估計(jì)效果不明顯,看你的數(shù)據(jù)庫用途是干什么的(如果是數(shù)據(jù)倉庫肯定是不明顯的)。
解決方案
執(zhí)行
alter?table?jk_test?move
或
alter?table?jk_test?move?storage(initial?64k)
或
alter?table?jk_test?deallocate?unused
或
alter?table?jk_test?shrink?space.
注意:因?yàn)閍lter table jk_test move 是通過消除行遷移,清除空間碎片,刪除空閑空間,實(shí)現(xiàn)縮小所占的空間,但會(huì)導(dǎo)致此表上的索引無效(因?yàn)镽OWID變了,無法找到),所以執(zhí)行 move 就需要重建索引。
找到表對(duì)應(yīng)的索引
select?index_name,table_name,tablespace_name,index_type,status??from?dba_indexes??where?table_owner='SCOTT'
根據(jù)status 的值,重建無效的就行了。sql='alter index '||index_name||' rebuild'; 使用存儲(chǔ)過程執(zhí)行,稍微安慰。
還要注意alter table move過程中會(huì)產(chǎn)生鎖,應(yīng)該避免在業(yè)務(wù)高峰期操作!
另外說明:truncate table jk_test 會(huì)執(zhí)行的更快,而且其所占的空間也會(huì)釋放,應(yīng)該是truncate 語句執(zhí)行后是不會(huì)進(jìn)入oracle回收站(recylebin)的緣故。如果drop 一個(gè)表加上purge 也不會(huì)進(jìn)回收站(在此里面的數(shù)據(jù)可以通過flashback找回)。
不管是delete還是truncate 相應(yīng)數(shù)據(jù)文件的大小并不會(huì)改變,如果想改變數(shù)據(jù)文件所占空間大小可執(zhí)行如下語句:
alter?database?datafile?'filename'?resize?8g
重定義數(shù)據(jù)文件的大小(不能小于該數(shù)據(jù)文件已用空間的大?。?/p>
另補(bǔ)充一些PURGE知識(shí)
Purge操作:
1). Purge tablespace tablespace_name : 用于清空表空間的Recycle Bin
2). Purge tablespace tablespace_name user user_name: 清空指定表空間的Recycle Bin中指定用戶的對(duì)象
3). Purge recyclebin: 刪除當(dāng)前用戶的Recycle Bin中的對(duì)象。
4). Purge dba_recyclebin: 刪除所有用戶的Recycle Bin中的對(duì)象,該命令要sysdba權(quán)限
5). Drop table table_name purge:??刪除對(duì)象并且不放在Recycle Bin中,即永久的刪除,不能用Flashback恢復(fù)。
6). Purge index recycle_bin_object_name: 當(dāng)想釋放Recycle bin的空間,又想能恢復(fù)表時(shí),可以通過釋放該對(duì)象的index所占用的空間來緩解空間壓力。 因?yàn)樗饕强梢灾亟ǖ摹?/p>
二、如果某些表占用了數(shù)據(jù)文件的最后一些塊,則需要先將該表導(dǎo)出或移動(dòng)到其他的表空間中,然后刪除表,再進(jìn)行收縮。不過如果是移動(dòng)到其他的表空間,需要重建其索引。
1、
SQL?alter?table?t_obj?move?tablespace?t_tbs1;???---移動(dòng)表到其它表空間
也可以直接使用exp和imp來進(jìn)行
2、
SQLalter?owner.index_name?rebuild;?????--重建索引
3、刪除原來的表空間
很大可能是原來表是壓縮過的,再導(dǎo)進(jìn)去就沒有壓縮了,要重新壓縮下
--找出目前TEST表空間最大的block_id
SELECT MAX(block_id)FROM dba_extentsWHERE tablespace_name = 'TEST';
MAX(BLOCK_ID)
-------------????
136
--計(jì)算目前最大塊的段所占用的空間(該數(shù)據(jù)庫的block大小是8192)
show parameter db_block_size ;
NAME??????????????????? ???? TYPE???? VALUE
------------------------------------ ----------- ------------------------------
db_block_size?????????????? ???? integer???? 8192
SELECT 136*8192/1024/1024? "MAX(M)" FROM dual;
MAX(M)
----------
1.0625
--查看表空間物理文件的名稱及大小
set line 200
col file_name for a50
select
tablespace_name, file_id, file_name,round(bytes/(1024*1024),0)
"total_space(M)"from dba_data_fileswhere tablespace_name ='TEST' ;
TABLESPACE_NAME ? ? ? ? ?FILE_ID ? ?FILE_NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? total_space(M)
------------------------------ ---------- -------------------------------------------------- --------------
TEST ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?6 ? ? ? ? ? ? /u01/oradata/source/test01.dbf ? ? ? ? ? ? ? ? ? 100
4
--resize表空間
SQL ALTER DATABASE DATAFILE '/u01/oradata/source/test01.dbf' RESIZE 1M;
ALTER DATABASE DATAFILE '/u01/oradata/source/test01.dbf' RESIZE 1M*ERROR at line 1:
ORA-03214: File Size specified is smaller than minimum required
SQL ALTER DATABASE DATAFILE '/u01/oradata/source/zfl01.dbf' RESIZE 2M;
Database altered.
給您提供建議如下:
(1)如果表空間的數(shù)據(jù)沒存滿,可以考慮執(zhí)行表空間收縮操作。
(2)如果表空間的數(shù)據(jù)存滿了,可以考慮建多個(gè)表空間文件。
(3)從業(yè)務(wù)的角度考慮,是否可以考慮將部分?jǐn)?shù)據(jù)進(jìn)行剝離,存放在歷史庫。
(4)從業(yè)務(wù)角度進(jìn)行分析,該表空間中最大的幾張表中的數(shù)據(jù)都是必須、有用的嗎?是否可以將部分無用數(shù)據(jù)備份后執(zhí)行清理操作。
(5)如果是undo表空間,可以執(zhí)行undo表空間收縮操作。
(6)如果是temp表空間,可以將原表空間文件drop掉后重建表空間文件。
刪除數(shù)據(jù)不能縮小表空間,只是可再利用的多了.
要實(shí)際縮小,讓操作系統(tǒng)可以利用,需要先把表move tablespace
也可以在原來的tablespace上move一遍,再縮小tablespace就可以了.
例如:
alter table your_table move tablespace yourtablespace;