初始化参数DML_LOCKS控制系统中允许的TM锁定的总数。它的默认值是:4 * TRANSACTIONS 范围是:20 to unlimited,它可以设置为0,这将会禁止ENQUEUE(Enqueues是串行化访问数据库资源的共享内存结构)。这并不意味着用户的数据库变成只读的数据库(没有锁定)。而是指不允许DDL。
简单介绍一下TM锁定。这些锁定主要用来保证在更新表的内容时,表的结构不会被更改。例如:如果已经更新了一个表,将得到在哪个表上的一个TM锁定。这将防止另一个用户在哪个表上运行DROP或者ALTER命令。如果试图在已经拥有TM锁定的表上执行DDL,将获得下面的错误信息:
SQL> DROP TABLE A;
DROP TABLE A
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
看看DML_LOCKS=0 对数据库的影响:
1、你不能对表执行DDL语句,创建索引等操作
SQL> SHOW PARAMETER DML_LOCKS;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------
dml_locks integer 0
SQL> DROP TABLE B;
DROP TABLE B
*
第 1 行出现错误:
ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0
SQL> ALTER TABLE B ADD COL1 NUMBER;
ALTER TABLE B ADD COL1 NUMBER
*
第 1 行出现错误:
ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0
SQL> CREATE INDEX B_IDX ON B(ID);
CREATE INDEX B_IDX ON B(ID)
*
第 1 行出现错误:
ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0
2、你不可对表显示执行锁定
SQL> SHOW PARAMETER DML_LOCKS;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------
dml_locks integer 0
SQL> LOCK TABLE B IN SHARE MODE;
LOCK TABLE B IN SHARE MODE
*
第 1 行出现错误:
ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0
但可以在行级别制定锁定
SQL> LOCK TABLE B IN ROW EXCLUSIVE MODE;
表已锁定。
3、数据库正常关闭不了
SQL> SHUTDOWN IMMEDIATE
ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0
SQL> SELECT OPEN_MODE FROM V$DATABASE;
OPEN_MODE
--------------------
READ WRITE
感觉数据库还好像正常一样。如果在另一个会话登录数据库就会产生错误:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>sqlplus admin/admin
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 2月 20 18:16:52 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01089: 正在执行立即关闭 - 不允许进行任何操作
请输入用户名:
日志文件里有如下内容:
Sat Feb 20 18:13:11 2010
Starting background process EMN0
EMN0 started with pid=20, OS id=2636
Sat Feb 20 18:13:11 2010
Shutting down instance: further logons disabled
Sat Feb 20 18:13:11 2010
Stopping background process CJQ0
Sat Feb 20 18:13:11 2010
Stopping background process QMNC
Sat Feb 20 18:13:12 2010
Stopping background process MMNL
Sat Feb 20 18:13:13 2010
Stopping background process MMON
Sat Feb 20 18:13:14 2010
Shutting down instance (immediate)
License high water mark = 2
Sat Feb 20 18:13:14 2010
Stopping Job queue slave processes
Sat Feb 20 18:13:14 2010
Job queue slave processes stopped
All dispatchers and shared servers shutdown
Sat Feb 20 18:13:20 2010
ALTER DATABASE CLOSE NORMAL
ORA-62 signalled during: ALTER DATABASE CLOSE NORMAL...
可以看到数据库已经停止了后台进程。
此时我们只能SHUTDOWN ABORT了。
对于DML_LOCKS的默认值值,对于某些系统,这个值不一定足够。而且如果存在大量的PDML,你需要加大这个参数值,因为PDML比
常规DML需要更多的LOCK.我们还可以用下面的命令来启用/禁用对表的锁定:
ALTER TABLE XXX ENABLE/DISABLE TABLE LOCK;
阅读(2106) | 评论(0) | 转发(0) |