• 技术文章 >数据库 >Oracle

    Oracle数据库表空间整理回收与释放操作

    长期闲置长期闲置2022-07-18 20:18:11转载284
    本篇文章给大家带来了关于Oracle的相关知识,其中主要介绍了数据库表空间整理回收与释放操作的相关问题,包括了降低表空间高水位、在删除时进行释放等等内容,下面一起来看一下,希望对大家有帮助。

    推荐教程:《Oracle视频教程

    在使用Oracle进行录入测试时,我们会制造许多测试数据,而使用删除后表空间的高水位依旧无法自动下调,导致出现表空间出现空白数据,影响表空间性能的同时也占用了过多的存储空间。

    一、降低表空间高水位

    1.查看表空间和对应物理文件名

    代码如下:

    select 
    b.file_id 物理文件号,
    b.file_name 物理文件名,
    b.tablespace_name 表空间,
    b.bytes/1024/1024 大小M,
    (b.bytes-sum(nvl(a.bytes,0)))/1024/1024  已使用M,
    substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5)  利用率 
    from dba_free_space a,dba_data_files b 
    where a.file_id=b.file_id 
    group by b.tablespace_name,b.file_id,b.file_name,b.bytes 
    order by b.tablespace_name

    根据利用率可以直观的判断有那些表空间可以进行释放。

    2.清空回收站

    代码如下:

    -- 清除用户回收站
    purge recyclebin;
    -- 清除全库回收站
    purge dba_recyclebin;

    清除删除过程中遗留的数据。

    3.整理表空间

    代码如下:

    alter tablespace tablespace_name coalesce;

    整合表空间的碎片增加表空间的连续性

    4.生成RESIZE代码

    代码如下:

    select a.file#,a.name,a.bytes/1024/1024 CurrentMB,
    ceil(HWM * a.block_size)/1024/1024 ResizeTo,
    (a.bytes - HWM * a.block_size)/1024/1024 ReleaseMB,
    'alter database datafile '''||a.name||''' resize '||
    ceil(HWM * a.block_size/1024/1024) || 'M;' ResizeCMD
    from v$datafile a,
    (select file_id,max(block_id+blocks-1) HWM
    from dba_extents where file_id in
    (select b.file# From v$tablespace a ,v$datafile b
    where a.ts#=b.ts# and a.name='tablespace_name')
    group by file_id) b
    where a.file# = b.file_id(+)
    and (a.bytes - HWM *block_size)>0
    order by 5

    上述代码执行后,可以生成一个对应表空间RESIZE的SQL代码,此时运行对应的SQL代码即可。

    二、在删除时进行释放

    1.清空表数据并释放表空间

    代码如下:

    -- 清空表数据
    truncate table table_name;
    -- 释放表空间
    alter table table_name deallocate UNUSED KEEP 0;

    先清空表数据,此时表依旧存在,Truncate不支持回滚,并且不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除;
    注意如果不加KEEP 0的话,表空间是不会释放的。

    2.迁移表数据

    在出现以下错误时,我们不仅可以通过整理表空间或者清楚回收站进行解决,还可以通过将待释放表空间的表数据全部迁移到其他表空间,将空间释放后再迁移回原表空间。

    	--需移动的表数据
       select DISTINCT 'alter table '|| owner||'.'||segment_name || ' move tablespace user_test;' from dba_extents where segment_type='TABLE' and file_id=4;
    	--需移动的索引数据
       select DISTINCT 'alter index '|| owner||'.'|| segment_name || ' rebuild tablespace user_test;' from dba_extents where segment_type='INDEX' and file_id=4;
       --需移动的分区表数据
       select DISTINCT 'alter table '|| owner||'.'|| segment_name || ' move partition '|| partition_name || ' tablespace user_test;' from dba_extents where segment_type='TABLE PARTITION' and file_id=4;
       --需移动的分区表索引数据
       select DISTINCT 'alter index '|| owner||'.'|| segment_name || ' rebuild partition '|| partition_name || ' tablespace user_test;' from dba_extents where segment_type='INDEX PARTITION' and file_id=4;

    上述代码中file_id可以通过查看表空间进行比对更改,上述代码执行后可以获得对应的自动生成的SQL代码,此时运行对应的SQL代码即可迁移表数据

    推荐教程:《Oracle视频教程

    以上就是Oracle数据库表空间整理回收与释放操作的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:oracle
    上一篇:完全掌握Oracle使用数据操作函数 下一篇:Oracle示例详解分组数据
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• oracle查看锁及session执行中的sql(总结分享)• 实例详解Oracle数据表导入导出• oracle数据字典、数据字典视图及动态性能视图(总结分享)• 一文掌握oracle启动过程• docker能安装oracle吗
    1/1

    PHP中文网