0

DML_LOCKS设置为0导致SHUTDOWN IMMEDIATE失败

老杨 2019-04-18
212

问题描述

DML_LOCKS参数设置系统中允许DML锁的数量,如果将这个参数设置为0,会禁止ENQUEUE的产生,有可能轻微的提升系统的性能。
不过如果将这个参数设置为0,带来的后果会严重很多:

SQL> SHOW parameter dml_locks
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dml_locks INTEGER 264
SQL> ALTER system SET dml_locks = 0 scope = spfile;
System altered.
SQL> shutdown immediate
DATABASE closed.
DATABASE dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 524288000 bytes
Fixed SIZE 2097560 bytes
Variable SIZE 150998632 bytes
DATABASE Buffers 369098752 bytes
Redo Buffers 2093056 bytes
DATABASE mounted.
DATABASE opened.
SQL> conn test/test
Connected.
SQL> CREATE TABLE t_dml (id NUMBER);
TABLE created.
SQL> INSERT INTO t_dml VALUES (1);
1 ROW created.
SQL> UPDATE t_dml SET id = 2;
1 ROW updated.
SQL> DELETE t_dml;
1 ROW deleted.
SQL> commit;
Commit complete.
SQL> CREATE INDEX i_t_dml_id ON t_dml(id);
CREATE INDEX i_t_dml_id ON t_dml(id)
*
ERROR at line 1:
ORA-00062: DML full-TABLE LOCK cannot be acquired; DML_LOCKS IS 0
 
SQL> TRUNCATE TABLE t_dml;
TRUNCATE TABLE t_dml
*
ERROR at line 1:
ORA-00062: DML full-TABLE LOCK cannot be acquired; DML_LOCKS IS 0
 
SQL> DROP TABLE t_dml purge;
DROP TABLE t_dml purge
*
ERROR at line 1:
ORA-00062: DML full-TABLE LOCK cannot be acquired; DML_LOCKS IS 0


专家解答

可以看到,并非是DML_LOCKS设置为0,就不能执行DML操作了,事实上DML仍然可以执行。相反由于大部分的DDL在执行过程中需要对表加锁,因此大部分DDL语句在DML_LOCKS设置为0后不能在运行了。
收影响的操作不只是DDL而已,连SHUTDOWN IMMEDIATE都不能幸免:

SQL> conn / AS sysdba
Connected.
SQL> shutdown immediate
ORA-00062: DML full-TABLE LOCK cannot be acquired; DML_LOCKS IS 0
SQL> shutdown abort
ORACLE instance shut down.

也就是说设置DML_LOCKS后,只能使用ABORT方式关闭数据库了。

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

评论

关注
最新发布
暂无内容,敬请期待...
数据库资讯
最新 热门 更多
本月热门
近期活动
全部
暂无活动,敬请期待...
相关课程
全部