删除一个月前数据,释放表空间

来源:互联网 发布:开根号的算法 编辑:程序博客网 时间:2024/06/08 04:02

背景需求:

最近一个表存储数据太多了,一天2万条,每条数据很大,2个月已经占了100G 。

想只保留一个月的数据,删掉前一个月的数据。释放表空间。


网上的做法是:

       imp  导出最近一个月的数据到临时表

    (delete  和 truncate 都无法真正释放表空间)

      drop 原始表  这样来达到释放表空间的效果

     新建表

     临时表再导入 原始表

问题:该表还在运行中,oracle 无法停下来操作。上述方案失效。只能重新找方案。



首先网上找到一个关于查询对象工具

参考:http://blog.csdn.net/indexman/article/details/47207987

tom大神写了一个用于查看Oracle数据库对象空间使用情况。 
下面演示一下如何使用:

–工具源码

CREATE OR REPLACE PROCEDURE show_space(p_segname   IN VARCHAR2,                                       p_owner     IN VARCHAR2 DEFAULT USER,                                       p_type      IN VARCHAR2 DEFAULT 'TABLE',                                       p_partition IN VARCHAR2 DEFAULT NULL) AS  l_free_blks          NUMBER;  l_total_blocks       NUMBER;  l_total_bytes        NUMBER;  l_unused_blocks      NUMBER;  l_unused_bytes       NUMBER;  l_lastusedextfileid  NUMBER;  l_lastusedextblockid NUMBER;  l_last_used_block    NUMBER;  l_segment_space_mgmt VARCHAR2(255);  l_unformatted_blocks NUMBER;  l_unformatted_bytes  NUMBER;  l_fs1_blocks         NUMBER;  l_fs1_bytes          NUMBER;  l_fs2_blocks         NUMBER;  l_fs2_bytes          NUMBER;  l_fs3_blocks         NUMBER;  l_fs3_bytes          NUMBER;  l_fs4_blocks         NUMBER;  l_fs4_bytes          NUMBER;  l_full_blocks        NUMBER;  l_full_bytes         NUMBER;  PROCEDURE p(p_label IN VARCHAR2,              p_num   IN NUMBER) IS  BEGIN    dbms_output.put_line(rpad(p_label, 40, '.') ||                         to_char(p_num, '999,999,999,999'));  END;BEGIN  EXECUTE IMMEDIATE 'select ts.segment_space_management from dba_segments seg,dba_tablespaces ts where seg.segment_name = :p_segname and (:p_partition is null or seg.partition_name = :p_partition) and seg.owner = :p_owner and seg.tablespace_name=ts.tablespace_name'    INTO l_segment_space_mgmt    USING p_segname, p_partition, p_partition, p_owner;  --     exception  --             when too_many_rows  --             then  --             dbms_output.put_line('This must be a partitioned table,use p_partition => ');  --             return;  --     end;  IF l_segment_space_mgmt = 'AUTO' THEN    dbms_space.space_usage(p_owner, p_segname, p_type, l_unformatted_blocks,                           l_unformatted_bytes, l_fs1_blocks, l_fs1_bytes,                           l_fs2_blocks, l_fs2_bytes, l_fs3_blocks, l_fs3_bytes,                           l_fs4_blocks, l_fs4_bytes, l_full_blocks,                           l_full_bytes, p_partition);    p('Unformatted Blocks  ', l_unformatted_blocks);    p('FS1 Blocks (0-25)   ', l_fs1_blocks);    p('FS2 Blocks (25-50)  ', l_fs2_blocks);    p('FS3 Blocks (50-75)  ', l_fs3_blocks);    p('FS4 Blocks (75-100) ', l_fs4_blocks);    p('Full Blocks         ', l_full_blocks);  ELSE    dbms_space.free_blocks(segment_owner => p_owner, segment_name => p_segname,                           segment_type => p_type, freelist_group_id => 0,                           free_blks => l_free_blks);  END IF;  dbms_space.unused_space(segment_owner => p_owner, segment_name => p_segname,                          segment_type => p_type, partition_name => p_partition,                          total_blocks => l_total_blocks,                          total_bytes => l_total_bytes,                          unused_blocks => l_unused_blocks,                          unused_bytes => l_unused_bytes,                          last_used_extent_file_id => l_lastusedextfileid,                          last_used_extent_block_id => l_lastusedextblockid,                          last_used_block => l_last_used_block);  p('Total Blocks ', l_total_blocks);  p('Total Bytes  ', l_total_bytes);      p('Total MBytes ', trunc(l_total_bytes / 1024 / 1024));  p('Unused Blocks', l_unused_blocks);  p('Unused Bytes ', l_unused_bytes);  p('Last Used Ext FileId', l_lastusedextfileid);  p('Last Used Ext BlockId', l_lastusedextblockid);  p('Last Used Block', l_last_used_block);END;

可以正常执行 为一个procedure 

–用法演示

SYS@orcl> exec show_space('TEST_SPACE');

(这里会报错) 没有该表  (该表是刚建的)

后续吧。。。。。





0 0
原创粉丝点击