暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 是截断表操作在DML操作上创建锁定

ASKTOM 2020-09-08
207

问题描述

团队,

您能否确认我是否可以对应用程序的关键事务表执行截断分区操作。表被应用程序和执行DML操作大量使用。

我们要截断旧分区,在进行导出备份后,我们可以在应用程序启动并运行时执行此操作吗?或者我们需要停机申请。

Oracle数据库版本11.2.0.4

问候,
阿希什

专家解答

是的,有一个但是。

截断分区是一个阻塞DDL操作。这意味着您要截断的分区不能有未提交的事务。

我猜你只是在截断旧分区,不受数据更改的影响。在这种情况下,您可以继续进行-您可以继续对所有其他分区进行更改。

请注意,默认情况下,truncate partition将所有全局索引保持在不可用状态:

create table t (
  c1 int, c2 int
) partition by range ( c1 ) 
  interval ( 10 ) (
    partition p0 values less than ( 11 ) 
  );
create index i on t ( c2 );
  
insert into t 
with rws as (
  select level x from dual
  connect by level <= 100
)
  select x, x from rws;
commit;

alter table t
  truncate partition p0;
  
select index_name, status 
from   user_indexes;

INDEX_NAME   STATUS     
I            UNUSABLE  


这可能也会让你的应用程序处于不可用的状态!

要避免这种情况,请添加update全局索引子句:

alter index i rebuild;

alter table t
  truncate partition p0
  update global indexes;
  
select index_name, status 
from   user_indexes;

INDEX_NAME   STATUS   
I            VALID  

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论