场景
在给一张表添加主键时,遇到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; |
该参数重启生效




