【问题标题】:Adding column to Oracle OLTP table向 Oracle OLTP 表添加列
【发布时间】:2011-02-10 05:51:23
【问题描述】:

我正在尝试在应用程序正在运行且繁忙时向 Oracle 10 OLTP 数据库中的常用表添加可为空的列。添加可以为空的列只是数据字典的更改,因此任何表锁都只能保持很短的时间(可以由系统处理)。

问题是我的ALTER TABLE 经常失败:

ORA-00054: resource busy and acquire with NOWAIT specified

我目前的方法是通过运行它来阻止更改,直到表上碰巧没有锁为止。这意味着我无法在 SQL*Plus 中完整运行这样的脚本,但需要复制并粘贴每个语句并确保其正常工作。

有没有更好的办法?

【问题讨论】:

  • 请记住,它会反编译依赖于表的任何内容(视图、包、触发器等),这在生产环境中可能不太好......
  • +1 表示 cagcowboy 的评论。不适合在 prod 环境中更改表的代码,可能会有很多无效的对象。这是一个需要协调的变更控制问题
  • 11g 稍微改善了重新编译的情况,对依赖项进行了较低级别的跟踪。
  • 某些对象在下次使用时会自动失效并重新编译。比关闭应用程序有一个短暂的暂停更好。没有大量的 PL/SQL,所以这不会花很长时间。应用程序处理 ORA-04068: 包的现有状态已被丢弃

标签: oracle alter-table ora-00054


【解决方案1】:

蛮力方法怎么样?将其放入无限循环并在完成后退出。伪代码(没查过):

create or replace 
procedure execDDL(ddl in varchar2) is
   myexp EXCEPTION;
   pragma exception_init (myexp, -54);
begin

 loop
   begin
      execute immediate ddl;
      exit;
   exception
      when myexp then 
         null;
 end loop;
 end;

【讨论】:

  • +1,虽然我会添加对dbms_lock.sleep 的调用,这样您的块就不会不必要地垄断资源(两次尝试之间的短暂等待)。
  • 我想我可以这样做,但它似乎不是很优雅
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 2015-02-20
  • 2020-11-10
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多