上周应用上线,有一个数据库脚本,包含改字段长度等操作,执行过程中,现象就是有些改字段成功了,有些执行出错,报了ORA-00054的错误。了解一下原理,就能对这个错误,有比较深入的理解了。

首先,我们模拟下报错过程,创建测试表,session 1执行update语句,但不提交,session 2执行alter table变更name字段长度,此时立即报错ORA-00054,

SQL> create table tbl_lock(id number, name varchar2(10));

Table created.

SQL> select * from tbl_lock;

ID NAME

---------- ----------

1 a

2 b

session 1:

SQL> update tbl_lock set name='c' where id=1;

1 rows updated.

session 2:

SQL> alter table tbl_lock modify name varchar2(5);

alter table tbl_lock modify name varchar2(5)

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

我们看下报错,ORA-00054,提示的就是资源繁忙,因为设置了NOWAIT参数,或者超时,才返回这个错误,

看下此时的锁信息,其中14309是从dba_objects中根据object_name='TBL_LOCK'检索得出的,如下显示,TBL_LOCK表上有一个TM表锁,

表锁,又叫TM锁,当交易执行DML语句的时候,会拥有此锁。目的就是为了阻止此时有其他的进程正在执行DDL,修改表结构,

A table lock, also called a TM lock, is acquired by a transaction when a table is modified by an INSERT, UPDATE, DELETE, MERGE, SELECT with the FORUPDATE clause, or LOCK TABLE statement. DML operations require table locks to reserve DML access to the table on behalf of a transaction and to prevent DDL operations that would conflict with the transaction.

结论:

至此,开始的问题,就可以解释清楚了,上线过程中,执行alter table改表的字段长度,但由于有些表,此时碰巧有业务操作,对数据做了DML,交易尚未提交,因此由于TM锁未释放,导致alter table这条DDL语句执行报错,对于alter table执行时尚未有DML未commit操作的表,自然就可以执行成功了。

解决方法:

就是等一会再执行,只要出现真空期,没有业务操作,就可以执行成功了,毕竟alter table改字段长度,需要改数据字典信息,对于表结构的变更,何时执行时间,会和表数据量有关,何时则无关,以前写了几篇小文章,不同的场景,有一些不同的结论,可以参考,

针对ORA-00054这问题,可以再了解一些。

从11g开始,出现了一个新的参数,

这个参数可以session级别设置,作用就是可以控制一条DDL语句等待一个DML锁释放的时间,默认值是0,表示NOWAIT,最大值是1000000秒,大约11.5天,如果在设置的时间之内,仍未获取DDL锁,则抛出异常错误,错误号就是ORA-00054,

DDL_LOCK_TIMEOUT specifies a time limit for how long DDL statements will wait in a DML lock queue. The default value of zero indicates a status of NOWAIT. The maximum value of 1,000,000 seconds will result in the DDL statement waiting forever to acquire a DML lock.

If a lock is not acquired before the timeout period expires, then an error is returned.

上面的实验中,DDL_LOCK_TIMEOUT默认值是0,因此执行alter table会立即报错,

设置参数值,改为10妙,执行alter table,确实SQL等待了10秒,才返回了ORA-00054错误,

SQL> alter session set ddl_lock_timeout=10;

Session altered.

Elapsed: 00:00:00.00

SQL> alter table tbl_lock modify name varchar2(5);

alter table tbl_lock modify name varchar2(5)

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

Elapsed: 00:00:10.00

惜分飞文章(http://www.xifenfei.com/2012/07/oracle-11g%E7%9A%84ddl_lock_timeout%E5%8F%82%E6%95%B0.html)介绍了这个参数的作用,

ddl_lock_timeout可以在一定程度上解决因为我们不清楚这个表是否有dml操作而导致ddl操作不能进行的情况,从一定程度上减少了自己去尝试ddl操作,或者查询相关视图然后找出相关会话,然后kill掉对应数据的情况,可以说是在修改表结构的时候一个很不错的新特性。

11g之前,DDL操作,碰见TM锁,是直接报错,11g则用这参数,通过设置等待时间,可以避免一些DDL语句重复执行,例如开始碰见的问题,如果设置了DDL_LOCK_TIMEOUT,可能等待一会就会执行成功,而不需要我们手工再执行。

但这参数有一个问题,就是对于alter table加字段操作,是不起作用,无论ddl_lock_timeout设置为0还是非0,

SQL> alter table tbl_lock add sex varchar2(1);

会一直处于hang

直到人为中止

c^Calter table tbl_lock add sex varchar2(1)

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation

但是alter table删除字段、drop table删除表操作,可以生效,

SQL> alter table tbl_lock drop column name;

alter table tbl_lock drop column name

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

SQL> drop table tbl_lock;

drop table tbl_lock

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

MOS(Alter Table Add Column Command Hangs With Wait Event 'blocking txn id for DDL' (文档 ID 1553725.1))这篇文章,同样说明了这一个问题,由于11g中,alter table add column操作,没有被DDL排他锁覆盖,因此不受DDL_LOCK_TIMEOUT参数的控制,更不会抛出ORA-00054错误,而是出于hang,

In 11g,  ALTER TABLE ADD COLUMN is not covered by an exclusive ddl lock; therefore, it will not wait for the specified time in DDL_LOCK_TIMEOUT parameter and it will not raise the ORA-00054 error.

《DDL_LOCK_TIMEOUT Behavior in 11G (文档 ID 779569.1)》介绍了这个参数。

11.1.0.6版本,有人开了《Bug 7707888 : DDL_LOCK_TIMEOUT IS NOT WORKING AS EXPECTED》这个bug,此版本中,若有seesion执行DML未提交,此时alter table add column可以执行,但是drop table可以执行。

总结:

1. DDL_LOCK_TIMEOUT是11g新参数,对于一些频繁DML的表,若需要结构变更,可以设置非0,一定程度上,可以避免人为重新执行,自动找出真空期,执行完成DDL语句。

2. alter table加字段操作,不受DDL_LOCK_TIMEOUT控制,需要人为控制。

如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

ora错误匹配java_上周上线碰见的ORA-00054错误回放相关推荐

  1. 上周上线碰见的ORA-00054错误回放

    上周应用上线,有一个数据库脚本,包含改字段长度等操作,执行过程中,现象就是有些改字段成功了,有些执行出错,报了ORA-00054的错误.了解一下原理,就能对这个错误,有比较深入的理解了. 首先,我们模 ...

  2. mc手游服务器明日之后无限法则,手游《明日之后》错误的定位错误的核心,上线没多久就开始凉了...

    原标题:手游<明日之后>错误的定位错误的核心,上线没多久就开始凉了 盘点网易最近出来的所有游戏,都是雷声大雨点小,开服阵仗大以为要火,结果几天凉嗖嗖!决战平安京,非人学园,逆水寒,明日之后 ...

  3. ora 00900 已编译但有错误_技术分享|万万没想到!编译错误竟然还没灭绝???

    CodeWisdom-技术分享 万万没想到!编译错误竟然还没灭绝??? 复旦大学CodeWisdom团队的代码分析和挖掘小组针对开源软件项目持续集成过程中出现的编译错误,进行了大规模的经验研究.该研究 ...

  4. Excel的公式:公式基本使用、单元格地址引用、错误值利用、追踪公式利用与追踪错误

    文章目录 Exceld的公式 1.概念 2.作用 3.基本使用 (1)查看公式 (2)输入包含内置函数的公式 (3)公式深度介绍 (4)公式运算符 (5)公式特点 4.单元格地址引用 5.单列变多列- ...

  5. 用友u8年度账文件服务器错误,用友U8.52建立年度账出现错误

    文章摘要:问题现象:用友U8.52建立年度账出现错误?出错事项:建立年度账出现错误:大体内容是:插入错误:列名或所提供值的数目与表定义不匹配:传输网上银行信息(NBNewAcc.DLL)失败:无法除去 ...

  6. 如何定位逻辑错误C语言,如何调试C程序的语法错误和逻辑错误

    如何调试C程序的语法错误和逻辑错误 语法错误] 语法错误,这是C语言初学者出现最多的错误,比如,分号":"是每个C语句的结束的标志,在C语句后忘记写":"就是语 ...

  7. 初学rpa的十大经典错误及解决办法_Python3之十大经典错误及其解决办法

    作者 | 严小样儿 来源 | 统计与数据分析实战 接触了很多Python爱好者,有初学者,亦有转行人.不论大家学习Python的目的是什么,总之,学习Python前期写出来的代码不报错就是极好的.下面 ...

  8. cfree运行程序错误的原因_Python入门教程 | 第 8 章 错误、调试和测试

    第八章 错误.调试和测试 在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的. 有的错误 ...

  9. bootstrap 输入错误提示_win7系统提示explorer.exe应用程序错误怎么办

    在电脑当中弹出错误提示框可谓是多种多样,详细有很多电脑都有碰到过,最近有位win7系统用户在使用电脑的过程中,系统总是提示"explorer.exe应用程序错误",用户不知道怎么解 ...

最新文章

  1. IT人的八大修炼神器
  2. 2022年科学突破奖,9人共获奖金1500万美元,mRNA 新冠疫苗2位奠基人获奖
  3. linux 运维shell习题
  4. 过滤器获取service方法返回慢_Gateway:自定义过滤器
  5. Windows server 2003 R2 文件服務管理測試報告
  6. php扩展调试,5分钟学会PHP扩展开发与断点调试
  7. mysql索引结构优缺点_mysql索引优缺点及注意事项
  8. python嵌套html开发gui_python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例...
  9. 刷题笔记(2) 将数组中的数字组合成一个最小的数
  10. 一起来学SpringBoot | 第二篇:SpringBoot配置详解
  11. SQL Server 2005 在64位win7操作系统下的安装及问题总结
  12. 文章目录---收藏不迷路
  13. ps复制文字到html,【答疑】PS里文字复制粘贴快捷键是什么啊? - 视频教程线上学...
  14. python 调用 C++ 函数
  15. android 微信 语音,安卓手机微信不能发语音的解决办法
  16. 我国东北虎种群增长迅速 但近交风险不容忽视
  17. Windows10不用任何软件实现手机投屏到电脑
  18. 模电——开关电源中电容的放置及其取值
  19. r420服务器安装系统,r420服务器bios设置
  20. 基于PLC的自动配料控制系统设计,PLC自动控制论文(本科自动化专业论文)

热门文章

  1. CSS超过指定的宽度加省略号
  2. duilib学习领悟(2)
  3. 对Html里的title属性的换行
  4. VS2008(C#)子页嵌套母版页的控件访问方法(二)
  5. 组合枚举——妖梦拼木棒(洛谷 P3799)
  6. NOTEBOOK随笔
  7. 如何快速打好java基础_学习Java课程时如何才能打好基础呢?
  8. 【本周六,上海】2021年的首场openGauss Meetup,有干货有礼品,只等你来!
  9. 在数据库系统中遇见存储技术飞跃会怎样?
  10. 实战演练:MySQL RPM包定制化制作全过程