方法一:
在實際的應用中經常會遇到truncate或者delete表中的資料後發現表空間並沒有將空間進行釋放,磁碟空間被告占用感覺空間白白被浪費掉了。
通過下面的sql語句檢視表空間總大小及實用大小,然後拼出來乙個sql語句將表空間的資料檔案重新設定大小
select 'alter database datafile ''' || a.file_name || ''' resize ' ||
round(a.filesize - (a.filesize - c.hwmsize - 100) * 0.8) || 'm;',
a.filesize || 'm' as "資料檔案的總大小",
c.hwmsize || 'm' as "資料檔案的實用大小"
from (select file_id, file_name, round(bytes / 1024 / 1024) as filesize
from dba_data_files) a,
(select file_id, round(max(block_id) * 8 / 1024) as hwmsize
from dba_extents
group by file_id) c
where a.file_id = c.file_id
and a.filesize - c.hwmsize > 100;
上面的那個sql語句執行可能是有點慢下面的語句更快:
注意:對於此sql語句由於dba_free_space這個檢視在統計空閒空間時沒有考慮表空間中的資料檔案自動擴充套件時產生的可使用空間。同時,對於分配給行的空間,在刪除行以後,仍可繼續用於表的插入操作,但不將其作為可用於其他資料庫物件的空間算入下面sql查詢結果中,但是對於擷取表時,該空間就可用於其他的資料庫物件。如果不考慮資料檔案擴充套件的情況下用此sql語句基本上可以滿足要求了,如果要很精確的話可以考慮上面sql語句就是太慢了點。
select a.tablespace_name,
a.file_name,
a.totalsize,
b.freesize,
'alter database datafile ''' || a.file_name || ''' resize ' ||
round((a.totalsize - b.freesize) + 200) || 'm;' as "alter datafile"
from (select a.file_name,
a.file_id,
a.tablespace_name,
a.bytes / 1024 / 1024 as totalsize
from dba_data_files a) a,
(select b.tablespace_name,
b.file_id,
sum(b.bytes / 1024 / 1024) as freesize
from dba_free_space b
group by b.tablespace_name, b.file_id) b
where a.file_id = b.file_id
and b.freesize > 100
and a.tablespace_name not like 'undo%'
從網上查了乙個關於**表空間的語句:
alter tablespace tablespacename coalesce
此語句是整合表空間的碎片增加表空間的連續性,但是他不會收縮乙個檔案的大小的。
**某個表使用空間的步驟:
(1)、選擇某個表空間中超過n個blocks的segments,通過此語句可以看出那個表占用的空間大。
select segment_name,segment_type,blocks from dba_segments
where tablespace_name='tablespacename'
and blocks > n
order by blocks;
(2)、分析表,得知表的一些資訊
analyze table tablename estimate statistics;
執行完後再執行
select initial_extent,next_extent,min_extents,blocks,empty_blocks from dba_tables
where table_name='hisholdsinfo' and owner='hs_his';
(3)、使用alter table ... deallocate unused 命令**表的空間
例如:alter table hs_his.hisholdsinfo' deallocate unused keep 1k;
方法二:
oracle database用一段時間以後,硬碟空間會不夠,更甚者硬碟會used 100%。(oracle表空間設定為自動擴充套件)。此時oracle會出現各種莫名其妙的錯誤,為保持oracle資料庫的穩定,我們需要實時檢視硬碟空間。 那麼怎樣縮小一些不用的表空間,以釋放硬碟空間?
oracle常用的此類命令alter database datafile(tempfile),當然也可從toad等ui工具去操作。
alter database tempfile '/opt/oracle/oradata/gctwp101/temp02.dbf' resize 1229m;
如果盲目去操作,oracle會報ora-03297錯誤。表示在所定義的空間之後有資料存在,不能收縮。我們不得不查出最後的資料所處的位置, 然後表空間設定到稍比這位置大一點的大小。
1. 查該資料檔案中資料處在最大位置
select max(block_id) from dba_extents where file_id=15;< /font>
max(block_id)
383497
查詢file_id,也可在toad工具tablespace直接看到。
select file#,name from v$datafile;
2. 查出最大塊位置
select 383497*8/1024 from dual;
2996.0703125
這說明該檔案中最大使用塊位於2996m與3000m之間,
3. 修改表空間(也可用toad工具介面修改)
alter database tempfile '/opt/oracle/oradata/gctwp101/temp02.dbf' resize 3000m;
mysql收縮空間 Oracle表空間收縮方案
對於表空間收縮,oracle只提供擴大的功能,而不提供收縮。所以,要實現這樣的要求,就只能先建立乙個中間表空間,然後將待收縮表 應用背景 某些情況下,由於前期設計上沒有考慮全面,導致表空間預建太大,遠遠超出實際使用大小。於是,就出現了收縮表空間這樣的需求,即將這個表空間的占用空間進行收縮。處理方案 ...
Oracle 表空間收縮
業務表頻繁寫入,刪除,清空後,表占用的空間不能夠及時釋放,需要通過如下方式手工釋放空間。更新業務表統計資訊 call dbms stats.gather table stats user name table name 收縮業務表空間占用 alter table enable row movemen...
ORACLE 收縮表空間的資料檔案
在實際的應用中經常會遇到truncate或者delete表中的資料後發現表空間並沒有將空間進行釋放,磁碟空間被告占用感覺空間白白被浪費掉了。提供乙個 表空間的簡單方法供參考 通過下面的sql語句檢視表空間總大小及實用大小,然後拼出來乙個sql語句將表空間的資料檔案重新設定大小 select alte...