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

Oracle遇到ORA-00062,认识DML_LOCKS

DB小榴莲 2019-08-08
1242

场景


在给一张表添加主键时,遇到ORA-00062


SQL> alter  table JOB_TEST

  2   add constraint PK_TEST_JOB primary key (card_id);

alter table  JOB_TEST

*

ERROR at line 1:

ORA-00062: DML  full-table lock cannot be acquired; DML_LOCKS is 0


查看DML锁的个数,系统中该参数值为0


SQL> show  parameter DML_LOCKS

 

NAME                                 TYPE        VALUE

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

dml_locks                            integer     0

 


认识DML_LOCKS



DML锁存在于正在进行DML操作(插入,更新,删除)的表上。 DML_LOCKS指定DML锁的最大数量,每个事务中修改的每个表都需要一个DML锁。该值应等于所有用户当前操作的表的锁总数。例如,如果三个用户正在修改一个表中的数据,则需要三个锁,如果三个用户正在修改两个表中的数据,那么需要六个锁。

 


如果将DML_LOCKS置为0,那么enqueues将被禁用,同时数据库系统性能将会得到提升,但是不可以做如下的操作了



DML_LOCKS设置为0,执行DML操作是可以的,但是大部分DDL语句在DML_LOCKS设置为0后不能运行了,抛出ORA-00062错误,这是因为大部分的DDL在执行过程中需要对表加锁。有时甚至连shutdown immediate都会失败,只能abort database了。




方案


alter system set  dml_locks=200 scope=spfile;

该参数重启生效

最后修改时间:2021-06-23 11:06:12
文章转载自DB小榴莲,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论