Oracle 10g数据文件的收缩与数据对象跨表空间的迁移

1.Oracle10g数据库文件的收缩: 1.1 问题: 一个数据库里面有上百万条数据,使用Delete语句删除大部分数据后,数据库文件所

1.Oracle10g数据库文件的收缩:

  1.1 问题:

    一个数据库里面有上百万条数据,使用Delete语句删除大部分数据后,数据库文件所占空间并不会缩小释放多余的空间。

    如使用RESIZE语句对数据文件大小做调整,如下:

    >ALTER DATABASE DATAFILE ‘D:/Oracle10g/oradata/ORDB/NEWDB.ORA’ RESIZE 100M;

    则会报一个错误:ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据。

    这主要涉及到Oracle的逻辑存储和段空间管理以及数据库块中的数据分布。

    Oralce有一个High Water Mark(高水位线),它表示Oracle对象使用空间最高水位线。

    当插入了数据以后,HWM就会上涨;Delete语句删除数据后,HWH并没有降低。

    HWH数据库块分布在调整范围之外,此时使用RESIZE命令会报错。

 

  1.2 方法:

    网上查到资料说通过Move Tablespace移动表和索引后,可以重置表的HWH,然后再使用Resize就可以缩减数据库文件。
 
    但我在Oracle10g中尝试多次,都没有成功。另外,数据库如果有Long型的字段,是不能使用Move命令的。
 
    好在是Oracle10g,有shrink! :)

    Shrink的语法如下:
 
    ——————–

    alter table shrink space [ | compact | cascade ];
    alter table shrink space compcat;
    说明:收缩表,移动块中数据位置到一起,但 High Water Mark 保持不变

    alter table shrink space;
    说明:收缩表,降低 High Water Mark

    alter table shrink space cascade;
    说明:收缩表,降低 High Water Mark,并且把相关索引也收缩一下。

    alter index idxname shrink space;
    说明:回缩索引

    ——————–

 

  1.3 操作:

    对所有表空间中的所有表执行一次shrink命令,需要根据shrink语法,构造shrink命令。

    此时,为了构建shrink命令,可以使用如下SQL语句来查询表空间数据库文件的File_ID:

    ———————

    select * from dba_data_files;

    ———————

    另外,在执行shrink前,必须开启数据表的行迁移功能,SQL语句如下:

    ———————

    alter table Tbl_Name enable row movement;

    ———————
    注意:该SQL语句会造成引用表Tbl_Name的对象(如存储过程、包、视图等)变为无效,后续需要重新编译一次确认是否有效。

    构造shrink命令,建立create_shrink.sql文件,其内容如下:

    ——————-
    set heading off;
    set echo off;
    set feedback off;
    set termout on;
    spool c:/shrink.sql;
    select ‘alter table THAMS.’|| table_name || ‘ enable row movement; ‘ from user_tables where tablespace_name=’THAMS’;
    select ‘alter table THAMS.’|| table_name || ‘ shrink space CASCADE;’ from user_tables where tablespace_name=’THAMS’;
    select ‘alter index THAMS.’|| segment_name || ‘ shrink space;’ from dba_extents where segment_type=’INDEX’ and file_id=14;
    spool off;
    ——————-

    以表空间的默认用户THAMS登录数据库,,成功执行create_shrink.sql后,得到shrink.sql文件。

    以sys/system身份登录数据库,执行shrink.sql文件后,在OEMC中查看表空间,会发现数据库表空间的“已使用”比例大大下降。
  
    此时,再经过EXP/IMP后,会得到一个占用空间很小的数据库文件。

linux

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1939813.html

(0)
上一篇 2025年2月23日 00:08:23
下一篇 2025年2月23日 00:08:39

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Redhat Enterprise Edition 5安装Oracle 11g

    Redhat Enterprise Edition 5安装Oracle 11g 系统安装:     选择尽量多的开发软件,X Windows为必需。 一.创建必要的用户,组和目录    #mkdir -p /u01/Oracle    #g…

    数据库 2025年2月23日
    100
  • Oracle存储过程的格式

    存储过程在程序中是常用的,在项目中我也经常写一些,但是犯了一个错误是,我老是把sql语句的过程,写成一长串sql语句,然后按正 存储过程在程序中是常用的,在项目中我也经常写一些,但是犯了一个错误是,我老是把sql语句的过程,写成一长串sql…

    数据库 2025年2月23日
    100
  • Oracle Manager Server安装配置

    安装oms服务在登陆到oms之前,你必须首先安装oms服务。 启动Oracle universal installer,查看已安装产品,展开oracle主目录–or 安装oms服务在登陆到oms之前,你必须首先安装oms服务。 …

    数据库 2025年2月23日
    100
  • Oracle正常启动OEM或OMS关键

    能否正常启动OEM或OMS关键有以下两点: 第一.Oracle的系统服务是否开启; 第二.登录时用的用户名和口令是否正确。 那么先针 能否正常启动OEM或OMS关键有以下两点: 第一.Oracle的系统服务是否开启; 第二.登录时用的用户名…

    数据库 2025年2月23日
    100
  • Oracle常用sql语法集合

    表: select * from cat; select * from tab; select table_name from user_tables; 视图: select text from u 表:   select * from c…

    数据库 2025年2月23日
    100
  • Oracle中的数据类型和表的管理

    日期类型 date 包含年月日和时分秒 timestamp 这是Oracle9i对date数据类型的扩展 (时间戳)date类型的时间更精确 图片类 日期类型   date 包含年月日和时分秒   timestamp 这是Oracle9i对…

    数据库 2025年2月23日
    100
  • Oracle 11g ASM数据库升级compatible

    我的数据库(asm存储)是11.1升级 11.2的。今天在做延迟段创建时报一定要升级到11.2才能应用此功能。查看我的实例的compatible是 我的数据库(asm存储)是11.1升级 11.2的。 今天在做延迟段创建时报一定要升级到11…

    数据库 2025年2月23日
    100
  • Oracle 生成序列号存储过程

    项目中经常要根据年月日规则生成序列号,简单写了个存储过程可根据需要扩展 一、序列号存储表 — Create tablecreate table SYS_ 项目中经常要根据年月日规则生成序列号,简单写了个存储过程可根据需要扩展 一…

    数据库 2025年2月23日
    100
  • Oracle 10g 监听器启动后停止的解决办法

    今天遇到了监听器启动问题,问题原因是原先机器装Oracle的时候没有问题,后来更改机器名后,监听器就再无法启动了,问题定位是由 oracle 10g 监听器启动后停止的解决办法 [日期:2011-11-29]来源:Linux社区 作者:ti…

    数据库 2025年2月23日
    100
  • Oracle物理读与逻辑读

    Physical Reads(物理读): 逻辑读内容在内存中,不需要读硬盘。 计算公式可以如下:Physical Reads = db block gets + consist Physical Reads(物理读): 逻辑读内容在内存中,…

    数据库 2025年2月23日
    100

发表回复

登录后才能评论