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

Oracle DB从12.1更改为12.2 RAC获取ORA-02297

askTom 2018-05-14
439

问题描述


我们最近从12.1的单个实例更改为在具有两个节点的RAC环境中运行的12.2版本。

Wa现在面临的问题是,PL/SQL过程比单个实例运行的时间长3倍。

我们的管理员已经确定每个语句都在同一时间执行。我们已经尝试直接连接到单个节点,希望该过程在单个实例上的行为类似,但事实并非如此。

第二个问题是,未经处理的程序 (它在过去3年中没有任何问题地工作) 会出现以下错误。

Caused by: java.sql.SQLException: ORA-20000: ORA-02297: Constraint (SCHEMA.SPIL_PK) kann nicht deaktiviert werden - Abhängigkeiten sind vorhanden: Fehlgeschlagen => ALTER TABLE SPIEL DISABLE CONSTRAINT SPIL_PK
ORA-06512: in ".PR_CLEAR_DATABASE", Zeile 59
ORA-06512: in ".PR_CLEAR_DATABASE", Zeile 59
ORA-06512: in Zeile 1
复制


The procedure:
CREATE OR REPLACE PROCEDURE pr_CLEAR_DATABASE
AS

  CURSOR lc_select_table
  IS
    SELECT TABLE_NAME
    FROM USER_TABLES
    WHERE TABLE_NAME NOT IN ('SCHEMA_VERSION', 'KMS') 
       AND TABLE_NAME NOT LIKE 'QRTZ_%' 
    ORDER BY 1;
    
  CURSOR lc_enable_constraints
  IS
    SELECT 
     CONSTRAINT_NAME,
     TABLE_NAME
   FROM 
     USER_CONSTRAINTS
   WHERE 
     STATUS         = 'DISABLED'
     AND CONSTRAINT_TYPE IN ('P','R')
     AND TABLE_NAME NOT  IN ('SCHEMA_VERSION') 
     AND TABLE_NAME NOT LIKE 'QRTZ_%'
   ORDER BY R_CONSTRAINT_NAME DESC;
    
  CURSOR lc_disable_constraints
  IS
    SELECT 
     CONSTRAINT_NAME,
     TABLE_NAME
   FROM 
     USER_CONSTRAINTS
   WHERE 
     STATUS         = 'ENABLED'
     AND CONSTRAINT_TYPE IN ('P','R')
     AND TABLE_NAME NOT  IN ('SCHEMA_VERSION') 
     AND TABLE_NAME NOT LIKE 'QRTZ_%'
   ORDER BY R_CONSTRAINT_NAME ASC;
    
  lv_user            VARCHAR2(128);
  lv_sql             VARCHAR2(512);
BEGIN
 
  SELECT USER INTO lv_user FROM DUAL;
  IF ((lv_user='SYSTEM') OR (lv_user='SYS')) THEN
    RETURN;
  END IF;
  
  EXECUTE IMMEDIATE 'PURGE RECYCLEBIN';
  
  -- DISABLE table's constraints
  FOR lv_constraint IN lc_disable_constraints
  LOOP
    lv_sql := 'ALTER TABLE ' || lv_constraint.TABLE_NAME || ' DISABLE CONSTRAINT ' || lv_constraint.CONSTRAINT_NAME;
    BEGIN
      EXECUTE IMMEDIATE lv_sql ;
    EXCEPTION
    WHEN OTHERS THEN
      raise_application_error ( -20000, SQLERRM || ': Fehlgeschlagen => ' || lv_sql);
    END;
  END LOOP;
  
  -- TRUNCATE tables
  FOR lv_table IN lc_select_table
  LOOP
    --get table name
    lv_sql := 'TRUNCATE TABLE ' || lv_table.TABLE_NAME;
    BEGIN
      EXECUTE IMMEDIATE lv_sql ;
    EXCEPTION
    WHEN OTHERS THEN
      raise_application_error ( -20000, SQLERRM || ': Fehlgeschlagen => ' || lv_sql);
    END;
  END LOOP;
  
  -- ENABLE table's constraints
  FOR lv_constraint IN lc_enable_constraints
  LOOP
    lv_sql     := 'ALTER TABLE ' || lv_constraint.TABLE_NAME || ' ENABLE CONSTRAINT ' || lv_constraint.CONSTRAINT_NAME;
    BEGIN
      EXECUTE IMMEDIATE lv_sql ;
    EXCEPTION
    WHEN OTHERS THEN
      raise_application_error ( -20000, SQLERRM || ': Fehlgeschlagen => ' || lv_sql);
    END;
  END LOOP;
END;
/
复制

专家解答

当您尝试禁用具有指向它的启用FK的PK时,您会得到一个ORA-02297:

create table t1 (
  x int not null primary key
);
create table t2 (
  x int references t1 (x)
);

alter table t1 modify primary key disable ;

ORA-02297: cannot disable constraint (CHRIS.SYS_C0010760) - dependencies exist
复制


这意味着要么:

-迁移后有人添加了新的FK
-迁移期间更改的约束名称

您只是按名称对约束进行排序。所以你真的很幸运,这以前从未发生过。所以要么你需要先改变光标来获得FKs:

ORDER BY CONSTRAINT_TYPE DESC, R_CONSTRAINT_NAME ASC
复制


或仅选择PKs并使用级联选项:

alter table t1 modify primary key disable cascade;

Table T1 altered.

select status from user_constraints
where  constraint_type in ( 'P', 'R' )
and    table_name like 'T_';

STATUS     
DISABLED   
DISABLED  
复制


当谈到性能变化时,我只能给出一个答案:

跟踪你的会话,看看它在做什么!

理想情况下,在原始系统上执行相同的操作,以便您可以看到需要更长时间的时间。

其他任何事情都是疯狂的猜测 (=> 可能是错误的)。有关如何执行此操作的详细信息,请参见:

https://blogs.oracle.com/sql/how-to-create-an-execution-plan#tkprof

如果您正在努力解释结果,请发布您的发现,我们将为您提供帮助。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论