Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2885731
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2010-02-07 18:32:42

初始化参数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) |
给主人留下些什么吧!~~