alter table 表名 move和alter table 表名 shrink space都可以用來進行段收縮,降低高水位HWM,
成都創新互聯專注于通化縣企業網站建設,響應式網站開發,購物商城網站建設。通化縣網站建設公司,為通化縣等地區提供建站服務。全流程按需求定制設計,專業設計,全程項目跟蹤,成都創新互聯專業和態度為您提供的服務
也都可以用來消除行鏈接(Row Chaining)和行遷移(Row Migration),估計效果不明顯,看你的數據庫用途是干什么的(如果是數據倉庫肯定是不明顯的)。
解決方案
執行
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.
注意:因為alter table jk_test move 是通過消除行遷移,清除空間碎片,刪除空閑空間,實現縮小所占的空間,但會導致此表上的索引無效(因為ROWID變了,無法找到),所以執行 move 就需要重建索引。
找到表對應的索引
select?index_name,table_name,tablespace_name,index_type,status??from?dba_indexes??where?table_owner='SCOTT'
根據status 的值,重建無效的就行了。sql='alter index '||index_name||' rebuild'; 使用存儲過程執行,稍微安慰。
還要注意alter table move過程中會產生鎖,應該避免在業務高峰期操作!
另外說明:truncate table jk_test 會執行的更快,而且其所占的空間也會釋放,應該是truncate 語句執行后是不會進入oracle回收站(recylebin)的緣故。如果drop 一個表加上purge 也不會進回收站(在此里面的數據可以通過flashback找回)。
不管是delete還是truncate 相應數據文件的大小并不會改變,如果想改變數據文件所占空間大小可執行如下語句:
alter?database?datafile?'filename'?resize?8g
重定義數據文件的大小(不能小于該數據文件已用空間的大小)。
另補充一些PURGE知識
Purge操作:
1). Purge tablespace tablespace_name : 用于清空表空間的Recycle Bin
2). Purge tablespace tablespace_name user user_name: 清空指定表空間的Recycle Bin中指定用戶的對象
3). Purge recyclebin: 刪除當前用戶的Recycle Bin中的對象。
4). Purge dba_recyclebin: 刪除所有用戶的Recycle Bin中的對象,該命令要sysdba權限
5). Drop table table_name purge:??刪除對象并且不放在Recycle Bin中,即永久的刪除,不能用Flashback恢復。
6). Purge index recycle_bin_object_name: 當想釋放Recycle bin的空間,又想能恢復表時,可以通過釋放該對象的index所占用的空間來緩解空間壓力。 因為索引是可以重建的。
二、如果某些表占用了數據文件的最后一些塊,則需要先將該表導出或移動到其他的表空間中,然后刪除表,再進行收縮。不過如果是移動到其他的表空間,需要重建其索引。
1、
SQL?alter?table?t_obj?move?tablespace?t_tbs1;???---移動表到其它表空間
也可以直接使用exp和imp來進行
2、
SQLalter?owner.index_name?rebuild;?????--重建索引
3、刪除原來的表空間
很大可能是原來表是壓縮過的,再導進去就沒有壓縮了,要重新壓縮下
--找出目前TEST表空間最大的block_id
SELECT MAX(block_id)FROM dba_extentsWHERE tablespace_name = 'TEST';
MAX(BLOCK_ID)
-------------????
136
--計算目前最大塊的段所占用的空間(該數據庫的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)如果表空間的數據沒存滿,可以考慮執行表空間收縮操作。
(2)如果表空間的數據存滿了,可以考慮建多個表空間文件。
(3)從業務的角度考慮,是否可以考慮將部分數據進行剝離,存放在歷史庫。
(4)從業務角度進行分析,該表空間中最大的幾張表中的數據都是必須、有用的嗎?是否可以將部分無用數據備份后執行清理操作。
(5)如果是undo表空間,可以執行undo表空間收縮操作。
(6)如果是temp表空間,可以將原表空間文件drop掉后重建表空間文件。
刪除數據不能縮小表空間,只是可再利用的多了.
要實際縮小,讓操作系統可以利用,需要先把表move tablespace
也可以在原來的tablespace上move一遍,再縮小tablespace就可以了.
例如:
alter table your_table move tablespace yourtablespace;
本文名稱:oracle如何收縮表,oracle表空間收縮
分享URL:http://vcdvsql.cn/article48/hecsep.html
成都網站建設公司_創新互聯,為您提供做網站、虛擬主機、關鍵詞優化、網站內鏈、域名注冊、網站維護
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯