运维联盟俱乐部

 找回密码
 立即注册
查看: 1624|回复: 0

[日常管理] shrink

[复制链接]
  • TA的每日心情
    开心
    2023-8-9 11:05
  • 发表于 2021-10-12 15:25:49 | 显示全部楼层 |阅读模式
    shrink功能介绍和示例
    这里提到的shrink功能使用示例适用于11gR219c版本数据库。
    功能介绍
    shrink功能主要功能是对表、表的分区、表的子分区、索引、索引分区和索引子分区对象进行空间收缩,执行过程主要分为两步,第一步把对空间进行收缩,也就是compact,第二调整高水位的位置,达到释放空间的目的。在执行过程中需要激活对象row movement功能。为了降低执行过程对象被加锁的时间,可以分为两步执行示例如下:
    第一步:对空间进行收缩:
       alter table table_name shrink space compact;
    第二步:调整高水位位置:
       alter table table_name shrink space;
    注:
    shrink操作不适用于压缩表和带有函数索引的表
    示例一:表shrink
    针对表级进行shrink,示例命令如下:
      alter table <table_name> enable row movement;
      alter table <table_name> shrink space compact;
      alter table <table_name> shrink space;
      alter table <table_name> disable row movement;
    示例二:表及关联索引shrink
    针对表及关联索引进行shrink示例命令如下:
      alter table <table_name> enable row movement;
      alter table <table_name> shrink space compact cascade;
      alter table <table_name> shrink space cascade;
      alter table <table_name> disable row movement;
    示例三:索引shrink
    针对索引进行shrink示例命令如下:
    alter index <index_name> shrink space compact;
        alter index <index_name> shrink space;
    示例四:分区表shrink
    针对一个表的分区进行shrink,示例命令如下:
    ALTER TABLE <table_name> enable row movement;
    ALTER TABLE <table_name> MODIFY PARTITION <partition_name> SHRINK SPACE compact;
    ALTER TABLE <table_name> MODIFY PARTITION <partition_name> SHRINK SPACE;
    alter table <table_name> disable row movement;
    示例五:分区索引shrink
    针对一个索引的分区进行shrink,示例命令如下:
    ALTER INDEX <index_name> MODIFY PARTITION <partition_name> SHRINK SPACE compact;
    ALTER INDEX <index_name> MODIFY PARTITION <partition_name> SHRINK SPACE;
    示例六:二级分区表shrink
    针对一个表的二级子分区进行shrink,示例命令如下:
    ALTER TABLE <table_name> enable row movement;
    ALTER TABLE <table_name> MODIFY SUBPARTITION <subpartition_name> SHRINK SPACE compact;
    ALTER TABLE <table_name> MODIFY SUBPARTITION <subpartition_name> SHRINK SPACE;
    alter table <table_name> disable row movement;
    示例七:二级分区索引shrink
    针对一个索引的分区进行shrink,示例命令如下:
    ALTER INDEX <index_name> MODIFY SUBPARTITION <subpartition_name> SHRINK SPACE compact;
    ALTER INDEX <index_name> MODIFY SUBPARTITION <subpartition_name> SHRINK SPACE;
    验证shrink效果
    可以在执行shrink操作前后,分别执行以下语句,可以验证shrink的效果:
    select segment_name,partition_name,blocks,bytes/1024/1024 from user_segments where segment_name in ('<table_name>','<index_name>') order by segment_name;
    查询/DML并发性
    =======================
    线段收缩的在线阶段是通过与dml兼容的锁来完成的。因此,dml可以在这个阶段共存。在空间释放/HWM调整阶段,将在表上获取不兼容的锁,因此,dml将在收缩时阻塞。
    收缩不会在dml上导致用户可见错误。
    查询将高速缓存数据段HWM。Oracle保证HWM始终向前移动,因此在段头和范围映射块上不需要CR(一致读取)。导致段HWM向后移动的唯一操作是删除和截断。
    我们允许查询与删除/截断ddl共存,因为查询不会获得锁。如果在删除/截断之后,空间在其他一些段中被重用,那么查询将得到“8103对象不存在”的外部错误消息。
    在段收缩期间,当调整段HWM时,位图块和段头中改变分段化身号。随后的数据块更改发生在这个较新的化身号上。
    跨越此阶段的查询可能会出现外部错误“10632-无效rowid”
    1)他们读取更新后的位图块(有新的inc#)。注意,如果空间没有被重用,就会发生此失败
    2)空间被其他对象或相同的对象重用。
    依赖维护和限制收缩
    =================================================
    段收缩期间要处理的唯一依赖是指数。
    收缩后,索引不会处于不可用状态。
    分段收缩的压缩阶段将以插入/删除对的方式进行。在数据移动阶段,将不会触发DML触发器。
    由于数据不会更改,因此不需要触发触发器。
    基于ROWID的触发器应该在发出收缩之前被禁用,因为它在收缩期间不会触发。
    不能对具有已提交实体化视图的对象进行分段收缩。
    基于主键的实体化视图在收缩后无需刷新或重建。
    但是,DBAas要负责刷新/重新构建基于旋转的实体化视
    可用性
    ============
    段收缩是在线完成的,因此它增加了对象的可用性。
    虽然传统的DML操作可以与段收缩共存,但并行的DML则不能。
    在线段收缩期间,数据将作为压缩阶段的一部分进行移动。
    在压缩期间,锁定将被保存在包含数据的各个行和/或块上。
    这将导致像更新和删除这样的并发dml在锁上序列化。
    压缩将以较小的事务为单位来完成,因此对象的可用性将不会受到重大影响。
    然而,在段收缩的某些阶段(当调整HWM时),段将必须锁定在排他模式。
    该阶段持续时间很短,对对象可用性的影响较小。
    安全
    ========
    在对象上执行段收缩所需的权限将与更改对象的权限相同。alter object
    我可以取消收缩操作吗?
    ====================
    一个大部分的收缩空间可能需要很多时间,例如数十小时,并且可以产生大量的重做。因此,不建议中断收缩语句。
    最好的解决方法应该是:
    SQL> alter table shrink space compact;
    这也需要很长时间,但应该没有什么影响,因为只有很短的dml锁
    SQL> alter table shrink space;
    只有在方便的时候,发出SQL>更改表收缩空间;
    在运行生产之前,建议测试测试环境中可能产生的影响。
    在执行过程中,可以监控
    1. set serveroutput on
    2. declare
    3. v_unformatted_blocks number;
    4. v_unformatted_bytes number;
    5. v_fs1_blocks number;
    6. v_fs1_bytes number;
    7. v_fs2_blocks number;
    8. v_fs2_bytes number;
    9. v_fs3_blocks number;
    10. v_fs3_bytes number;
    11. v_fs4_blocks number;
    12. v_fs4_bytes number;
    13. v_full_blocks number;
    14. v_full_bytes number;
    15. begin
    16. dbms_space.space_usage ('&OWNNER_NAME', '&TABLE_NAME', 'TABLE', v_unformatted_blocks,
    17. v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes,
    18. v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes);
    19. dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks);
    20. dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks);
    21. dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks);
    22. dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks);
    23. dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks);
    24. dbms_output.put_line('Full Blocks = '||v_full_blocks);
    25. end;
    26. /

    27. Unformatted Blocks = 16
    28. FS1 Blocks = 2
    29. FS2 Blocks = 1
    30. FS3 Blocks = 0
    31. FS4 Blocks = 21
    32. Full Blocks = 2094

    33. PL/SQL procedure successfully completed.
    复制代码

    segment_type
    Type of the segment to be analyzed (TABLE, INDEX, or CLUSTER):
    • TABLE
    • TABLE PARTITION
    • TABLE SUBPARTITION
    • INDEX
    • INDEX PARTITION
    • INDEX SUBPARTITION
    • CLUSTER
    • LOB
    • LOB PARTITION
    • LOB SUBPARTITION

    -------------------------
    unformatted_blocks                     Total number of blocks unformatted
    fs1_blocks                                   Number of blocks having at least 0 to 25% free space
    fs2_blocks                                   Number of blocks having at least 25 to 50% free space
    fs3_blocks           Number of blocks having at least 50 to 75% free space
    fs4_blocks                                   Number of blocks having at least 75 to 100% free space
    ful1_blocks                                 Total number of blocks full in the segment

    There is no need of taking the backup using RMAN or datapump.  Even though if you want to kill or alter shrink failed due to any error there will not be any corruption to the data. If you restart the alter command again then it will start from where it failed and not from the beginning.
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    运维联盟俱乐部 ( 冀ICP备19036648号 )

    GMT+8, 2024-5-17 14:07 , Processed in 0.053033 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表