<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>OracleBlog.cn -天堂向左 DBA向右</title>
	
	<link>http://www.oracleblog.cn</link>
	<description>一个dba的平凡生活</description>
	<pubDate>Fri, 30 Oct 2009 07:18:28 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/oracleblogcn" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>RAC ONE NODE</title>
		<link>http://www.oracleblog.cn/study-note/rac-one-node/</link>
		<comments>http://www.oracleblog.cn/study-note/rac-one-node/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 14:21:58 +0000</pubDate>
		<dc:creator>小荷</dc:creator>
		
		<category><![CDATA[Study note]]></category>

		<category><![CDATA[11g]]></category>

		<guid isPermaLink="false">http://www.oracleblog.cn/?p=779</guid>
		<description><![CDATA[之前，一直对rac one node、Single Instance HA(SIHA)、Oracle Restart的概念没搞清楚，今天和 @jarodwang和@ricky_zhu聊了之后，才明白了其中的概念：
SIHA = Oracle Restart = Oracle Grid Infrastructure 安装选项中的 Install... ]]></description>
			<content:encoded><![CDATA[<p>之前，一直对rac one node、Single Instance HA(SIHA)、Oracle Restart的概念没搞清楚，今天和 <a href="https://twitter.com/jarodwang ">@jarodwang</a>和<a href="https://twitter.com/ricky_zhu">@ricky_zhu</a>聊了之后，才明白了其中的概念：<br />
<code>SIHA = Oracle Restart = Oracle Grid Infrastructure 安装选项中的 Install and Configure Grid Infrastructure for a Standalone Server</code><br />
因此，我们在10g中用的SIHA，在11gR2中已经重新命名成Oracle Restart，并且是包含在Grid Infrastructure中。<br />
而rac one node则是另外的一个概念了，是11gR2才出现的。它是oracle提供的一种类似虚拟化技术，将各个物理机器的资源整合起来，成一个大的cluster。概括的说，它能整合你的服务器，提高failover能力，提供load balance能力，另外它能实现数据库存储的虚拟化，数据库环境的标准化和避免升级的downtime。</p>
<p>以下是一个rac one node 的架构图：<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/10/rac1node_1.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/10/rac1node_1.jpg" alt="rac one node 架构图" title="rac1node_1" width="500" height="271" class="size-full wp-image-781" /></a><br />
从图上我们看出，rac one node，有3个物理主机，Server A、Server B、Server C，这3个物理主机组成一个single cluster，在3个主机上，可以有5个不同的single instance的database，DB1和DB2 host在Server A上，DB3 host在Server B上，DB 4和DB 5 host在Server C上。各个数据库使用共享存储（common share storage）。</p>
<p>对于single cluster上的各个数据库，rac one node能提供以下优势：</p>
<p>1.为同一个主机上的各个数据库Caging不同比例的CPU（见下图）。我的理解是这个和单个数据库上的资源管理器中的resource limit功能类似，限定数据库使用的cpu资源。不过原来的那个是用户分不同的资源组，这个，是按照数据库分不同的资源组了：<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/10/rac1node_caging.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/10/rac1node_caging.jpg" alt="rac one node caging cpu" title="rac1node_caging" width="423" height="571" class="size-full wp-image-785" /></a></p>
<p>2.提供failover，注意这个是提供了服务器级别和数据库级别——双重级别的failover。而不是像一般的虚拟机，只是在服务器级别提供failover，如果仅是数据库down了，不会提供failover。<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/10/rac1node_failover.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/10/rac1node_failover.jpg" alt="rac one node failover" title="rac1node_failover" width="500" height="271" class="size-full wp-image-787" /></a><br />
这功能通过oracle clusterware来实现。</p>
<p>3.load banlance。oracle提供一种叫做Omotion的特性，来实现在业务忙时，从忙的主机将数据库透明的转移到不忙的主机。<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/10/rac1node_omotion.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/10/rac1node_omotion.jpg" alt="rac one node omotion" title="rac1node_omotion" width="500" height="292" class="size-full wp-image-788" /></a></p>
<p>    在上图中，DB 2原来跑在Server A上，此时Server A负载较重，Omotion能实现在Server A和Server B同步的功能，在Server A和Server B上同时存在DB 2的实例，但是是一个database。（2个instance，一个database，且能负载均衡，这个就类似与rac了。只不过，rac是instance A和instance B，这个是2个一样的instance。我想，这就是rac one node的来由吧，是个rac，但是同一个instance，即一个node。）注意，在此时，Server A上DB 2和Server B上的DB 2，能实现类似rac 的cache fusion——memory mirroring；同时，由于Server A负载重，原来在Server A上的事务，也会迁移到Server B上，直到所以的连接完成迁移后，Server A上的 DB 2的instance会关闭。——instance迁移的时间不会太长，即出现2个instance B的时间，不会太长。</p>
<p>    不过，我很怀疑，这个迁移的依据是什么，如果仅仅是根据rac的load banlance原理，数据库在2个服务器间迁移来迁移去，不是很方便管理。如果我的Server之间的配置不同，一个超大的内存，忙；一个超小的内存，闲——这个时候instance是怎么迁移的呢？</p>
<p>4.保证系统和数据库的在线率。当主机硬件升级，或者打os patch，可以利用Omotion进行迁移。</p>
<p>5. 其他优势。由于rac one node使用的共享存储是ASM，因此ASM有的一些优势它也具有。</p>
<p>总结：从上面的几点优势来看，rac one node确实比较吸引人，能提供较高的高可用保护，另外，新的Omotion的特性，可以用于load banlance和迁移。——这个，我目前还找不到可以替代的方案来实现数据库的memory mirroring。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracleblog.cn/study-note/rac-one-node/feed/</wfw:commentRss>
		</item>
		<item>
		<title>oracle 11g R2 新特性学习</title>
		<link>http://www.oracleblog.cn/study-note/new-feature-of-11g-r2/</link>
		<comments>http://www.oracleblog.cn/study-note/new-feature-of-11g-r2/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 08:32:05 +0000</pubDate>
		<dc:creator>小荷</dc:creator>
		
		<category><![CDATA[Study note]]></category>

		<category><![CDATA[11g]]></category>

		<guid isPermaLink="false">http://www.oracleblog.cn/?p=764</guid>
		<description><![CDATA[oracle 11g R2的新特性，简单说明如下：
一、 新的Grid架构安装选项
新的Grid架构包含了ASM、侦听和Oracle重启（Oracle Restart）。——值得一提的是oracle重启这个特性，他类似像HP service guard，能提供... ]]></description>
			<content:encoded><![CDATA[<p>oracle 11g R2的新特性，简单说明如下：</p>
<p>一、 新的Grid架构安装选项<br />
新的Grid架构包含了ASM、侦听和Oracle重启（Oracle Restart）。——值得一提的是oracle重启这个特性，他类似像HP service guard，能提供数据库实例、asm、侦听的监控、管理和自动重启。注意要先安装Grid架构，再安装数据库、asm等。</p>
<p>二、 安装时指定是系统的类型，是服务器类型，或者是一般的桌面应用类型。注意一般桌面应用类的安装，没有高级配置选项。</p>
<p>三、 提供DBMS_DST包来帮助透明的更新TSTZ（Timestamp Timezone）</p>
<p>四、 用SYSASM权限来管理ASM。</p>
<p>五、 提供fixup脚本，来修正安装环境的最小需求。——看上去不错，不过估计真的执行的之前，还得再看看脚本都设置什么了。</p>
<p>六、 提供oracle的卸载工具，OUI不再提供专门的卸载功能，而是由$ORACLE_HOME/deinstall路径下提供一个卸载工具。</p>
<p>七、 智能数据存放——能让你指定将最频繁访问的数据放在asm disk的热端（磁道外端）。</p>
<p>八、 Oracle ACFS，oracle的cluster file system，共享文件系统。这个功能很多DBA已经很兴奋了，它拓展ASM的功能，除了原来放在ASM上的东西，其他的东西也能放Oracle ACFS上。值得一提的是，它还提供了snapshot功能，这个和存储的高级容灾功能已经很像了。注意ACFS也是要求先安装Gird架构。</p>
<p>九、 增强的数据泵，能兼容之前的exp和imp。</p>
<p>十、 单实例的自动重启（Oracle Restart），这个在第一点介绍Gird架构的时候就讲过。这个功能看上去很像在10gR2出现的single instance的HA（搭建方法可以参见<a href="http://www.oracleblog.cn/working-case/protecting-single-instance-using-oracle-crs/">这里</a>）。注意该功能的使用也需要先安装Grid架构。</p>
<p>十一、 增强了的SRVCTL命令，可以用来管理单实例的Oracle Restart或者RAC。</p>
<p>十二、 被废弃的一些特性：<br />
1.OUI和DBCA在安装和建库的时候，不再支持裸设备。oracle要求使用文件系统或者ASM。<br />
2.Oracle Ultra Search不再支持。</p>
<p>总体感觉：Grid架构很重要，很多功能都是基于Grid架构才能安装使用；Oracle越来越霸道，也越来越强大，裸设备已经在OUI和DBCA中不支持，已经倾向使用oracle自身的ASM；Oracle的自身管理也越来越智能，Restart似乎可以解决HA的问题，ACFS似乎可以能做存储容灾。只是，这一切不知收费如何？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracleblog.cn/study-note/new-feature-of-11g-r2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DSI 之lock学习</title>
		<link>http://www.oracleblog.cn/useful-script/study-lock-in-dsi/</link>
		<comments>http://www.oracleblog.cn/useful-script/study-lock-in-dsi/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 12:43:02 +0000</pubDate>
		<dc:creator>小荷</dc:creator>
		
		<category><![CDATA[Study note]]></category>

		<category><![CDATA[Useful script]]></category>

		<guid isPermaLink="false">http://www.oracleblog.cn/?p=701</guid>
		<description><![CDATA[
锁的申请：
1.使用hash算法将资源做hash，做完hash得到一个结果值将对应一个hash bucket
2.申请enqueue hash chain以访问hash bucket。
3.此时，将资源放到hash bucket的hash chain上。如果在hash chain上没有找到... ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/lock-and-resource.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/lock-and-resource.jpg" alt="" title="lock-and-resource" width="800" height="600" class="aligncenter size-full wp-image-723" /></a></p>
<p>锁的申请：<br />
1.使用hash算法将资源<TM-432-0>做hash，做完hash得到一个结果值将对应一个hash bucket<br />
2.申请enqueue hash chain以访问hash bucket。<br />
3.此时，将资源放到hash bucket的hash chain上。如果在hash chain上没有找到对应的资源结构，就到free resource  list上找，找到后放入到hash chain上。<br />
4.获得enqueue latch<br />
5.获得free lock的结构（与lock free list的头部断连）<br />
6.将正确的资源信息放到lock上。<br />
7.将lock结构连接到资源结构上。<br />
8.释放enqueue latch<br />
9.释放enqueue hash chain latch。</p>
<p>锁的释放：<br />
1.使用hash函数得到resource的hash chain<br />
2.获得enqueue hash chain来访问hash bucket<br />
3.找到hash bucket，顺着hash chain找到resource。<br />
4.申请enqueue latch<br />
5.将lock结构和resource结构断连<br />
6.将lock结构再次连到free lock list上<br />
7.释放enqueue latch<br />
8.如果resource结构有converter或者waiter，这继续处理。<br />
9.如果可能的话，将resource结构从hash chain上断开，将resource 结构放到free resource list中。<br />
10.释放enquene hash chain latch。</p>
<p>注：上面的resource是指能被session共享的resource，如一个表、一个library cache中的child handle等等。enqueue是用于控制如何访问这些共享资源的后续会具体说明。</p>
<p>打个比方吧，有个钻石加工厂，要把钻石镶嵌到项链上，项链有不同大小的眼以供钻石镶嵌上去。由于为了清洗项链，项链被放在一个开水桶里面，开水桶做了标记，1，2，3，4……</p>
<p>开水桶就是我们的hash bucket，钻石是我们的resource，项链上的眼是resource structure，enquene hash chain是能伸进开水桶的钳子，free resource list是放了一堆链子托盘，如果某个桶里面没有链子，可以到这个上面去找一条来放入到开水桶中，enqueue是做镶嵌工作时小榔头。lock structure是项链上的眼需要抓紧钻石的爪子。该工厂就只有一把钳子和一把榔头，因此后续要操作的人必须等待。</p>
<p>钻石根据其自身的成色/切工/大小，根据hash算法，知道需要镶嵌在5号桶的一条项链上，于是，首先获得enqueue hash chain钳子，去捞那条链子，如果发现5号的hash bucket桶里面没有这条链子，则去free resource list上找一条链子，再泡到开水桶中。如果找到，就把抓钻石的小爪子安放到项链的眼上，小榔头把爪子敲好。</p>
<p>相关视图和基表：<br />
X$KSQRS——v$resource的基表<br />
x$ksqst——可以看系统级的enqueue的type，gets和waits<br />
X$KSQEQ——v$lock的基表</p>
<p>enqueue可以通过v$session_wait来查询，这里的v$session_wait中的p1、p2也就是resource name<TYPE-ID1-ID2>中对应的ID1和ID2.<br />
如果v$session_wait中的等待是enqueue，那么对应的p1raw就能找出对应的type，而不必通过p1的繁琐运算：<br />
如：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Maroon;">1</span><span style="color: Gray;">* </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">event</span><span style="color: Gray;">,</span><span style="color: Blue;">sid</span><span style="color: Gray;">,</span><span style="color: Blue;">p1</span><span style="color: Gray;">,</span><span style="color: Blue;">p2</span><span style="color: Gray;">,</span><span style="color: Blue;">p1raw</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">v</span><span style="color: Gray;">$</span><span style="color: Blue;">session_wait</span><span style="color: Gray;"> </span><span style="color: Green;">where</span><span style="color: Gray;"> </span><span style="color: Blue;">event</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">enqueue</span><span style="color: #8b0000;">'</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; /<br />&nbsp;<br /></span><span style="color: Blue;">EVENT</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">SID</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">P1</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">P2</span><span style="color: Gray;"> </span><span style="color: Blue;">P1RAW</span><span style="color: Gray;"><br />------------------</span><span style="color: #ffa500;">-- ---------- ---------- ---------- ----------------</span><span style="color: Gray;"><br /></span><span style="color: Blue;">enqueue</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">65</span><span style="color: Gray;"> </span><span style="color: Maroon;">1415053318</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">65542</span><span style="color: Gray;"> </span><span style="color: Maroon;">0000000054580006</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; <br />&nbsp;<br />--取</span><span style="color: Blue;">p1raw</span><span style="color: Gray;">的</span><span style="color: Maroon;">54580006</span><span style="color: Gray;">，其中</span><span style="color: Maroon;">5458</span><span style="color: Gray;">表示类型，</span><span style="color: Maroon;">0006</span><span style="color: Gray;">表示</span><span style="color: Blue;">lmode</span><span style="color: Gray;">为</span><span style="color: Maroon;">6</span><span style="color: Gray;">的锁。我们把</span><span style="color: Maroon;">5458</span><span style="color: Gray;">再分解。</span><span style="color: Maroon;">54</span><span style="color: Gray;">是个</span><span style="color: Maroon;">16</span><span style="color: Gray;">进制的数字，转换成</span><span style="color: Maroon;">10</span><span style="color: Gray;">进制，就是：<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">to_number</span><span style="color: Olive;">(</span><span style="color: Maroon;">54</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">xxxxxxxx</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">dual</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: Blue;">TO_NUMBER</span><span style="color: Olive;">(</span><span style="color: Maroon;">54</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">XXXXXXXX</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />----------------------</span><span style="color: #ffa500;">--<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;84</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; <br />--转换反</span><span style="color: Blue;">ascii</span><span style="color: Gray;">码：<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">84</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">dual</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #00008b;">C</span><span style="color: Gray;"><br />-<br /></span><span style="color: Blue;">T</span><span style="color: Gray;"><br />&nbsp;<br />--同理可得</span><span style="color: Maroon;">58</span><span style="color: Gray;">：<br />&nbsp; </span><span style="color: Maroon;">1</span><span style="color: Gray;">* </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">to_number</span><span style="color: Olive;">(</span><span style="color: Maroon;">58</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">xxxxxxxx</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">dual</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; /<br />&nbsp;<br /></span><span style="color: Blue;">TO_NUMBER</span><span style="color: Olive;">(</span><span style="color: Maroon;">58</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">XXXXXXXX</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />----------------------</span><span style="color: #ffa500;">--<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;88</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">88</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">dual</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #00008b;">C</span><span style="color: Gray;"><br />-<br /></span><span style="color: Blue;">X</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; <br />--因此得到类型为</span><span style="color: Blue;">TX</span><span style="color: Gray;">的锁。<br />&nbsp;<br />--或者直接计算：<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Blue;">to_number</span><span style="color: Olive;">(</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: Blue;">p1raw</span><span style="color: Gray;">,</span><span style="color: Maroon;">9</span><span style="color: Gray;">,</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">xxxxxxxx</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Maroon;">2</span><span style="color: Gray;">&nbsp; ||</span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Blue;">to_number</span><span style="color: Olive;">(</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: Blue;">p1raw</span><span style="color: Gray;">,</span><span style="color: Maroon;">11</span><span style="color: Gray;">,</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">xxxxxxxx</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">&nbsp; </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: Blue;">enqueue_type</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Maroon;">3</span><span style="color: Gray;">&nbsp; </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">v</span><span style="color: Gray;">$</span><span style="color: Blue;">session_wait</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Maroon;">4</span><span style="color: Gray;">&nbsp; </span><span style="color: Green;">where</span><span style="color: Gray;"> </span><span style="color: Blue;">event</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">enqueue</span><span style="color: #8b0000;">'</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Maroon;">5</span><span style="color: Gray;">&nbsp; /<br />&nbsp;<br /></span><span style="color: Blue;">ENQU</span><span style="color: Gray;"><br />--</span><span style="color: #ffa500;">--<br />TX</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt;</span></div></div>
<p>分布式事务的死锁无法判断，因为不在一个SGA中，无法判断是真的死锁，还是等待时间太长的锁，可以通过_DISTRIBUTED_LOCK_TIMEOUT隐含参数来设置分布式事务锁的时间。</p>
<p>v$lock:<br />
lmode>0 request=0 ->owner<br />
lmode=0 request>0 ->waiter<br />
lmode>0 request>0 ->converter</p>
<p><strong>数据字典的锁</strong>：row cache lock，type是QA～QZ， 隐含参数_ROW_CACHE_INSTANCE_LOCKS定义了系统最多的row cache lock，默认值是100.<br />
获取过程：申请-如果未获取，则等3秒-再次申请，如此反复1000次，如果还是未获取，就放弃，报错Waited too long for row cache enqueue lock，考虑加大shared pool（主要是share pool中的data dictionary部分）<br />
注意：row cache lock的resource structure是cached row</p>
<p><strong>库缓存的锁</strong>：library cache lock是加在library cache对象的句柄上，type是LA～LP。<br />
在parse阶段，会在parent handle和child handle上加library cache lock的独占锁，在dependency上加library cache lock的共享锁。<br />
library cache lock在以下情况会保持null状态：1）检测无效对象；2）避免再次locate handle。<br />
注意：library cache lock的resource structure是object handle<br />
相关视图：<br />
X$KGLLK</p>
<p>library cache pin是加在library data heap上，type有NA～NZ。<br />
当修改data heap的时候，library cache pin会以独占的模式获取<br />
在读取data heap或者需要保护被修改的对象的时候，library cache pin会以share的模式获取。<br />
当一个client修改或检查一个对象的时候，会先在对应的handle上获取library cache lock，再在合适的heap上获取pin。<br />
注意：library cache pin的resource structure是object handle。<br />
相关视图：X$KGLPN</p>
<p><strong>DML行锁</strong>是包含行级锁（row level lock）和事务锁：<br />
行级锁是由于：1.行头争用，2.数据块或者索引块的ITL争用<br />
事务锁是TX的enqueue表现的。</p>
<p>（一）行级锁：<br />
行头争用：<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/snap0.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/snap0.jpg" alt="" title="snap0" width="500" height="340" class="aligncenter size-full wp-image-729" /></a></p>
<p><a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/snap1.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/snap1.jpg" alt="" title="snap1" width="500" height="308" class="aligncenter size-full wp-image-730" /></a><br />
如update一行记录：<br />
1.访问对应的block，并且allocate一个ITL<br />
2.通过rowid访问对应的行，如果确认没有其他的事务锁住该行，则将行头的第二个byte当时应该是0<br />
3.找到ITL对应的索引值，通过这个值将行头的lock field改成非0。<br />
4.当另一个事务update这一行时，就会发现行头的标记已经是非0。<br />
5.事务2想知道事务1是否已经commit或者rollback，事务2执行ITL cleanout，当执行完ITL cleanout之后，发现事务1还是active的，于是enqueue等待。</p>
<p>ITL争用：<br />
ITL的初始值为INITRANS的值。最大值为MAXTRANS，能动态修改。<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/snap2.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/snap2.jpg" alt="" title="snap2" width="500" height="307" class="aligncenter size-full wp-image-732" /></a><br />
如一个表的maxtrans为3，里面有4行，<br />
1.update第一行记录，这个事务占据一个ITL<br />
2.再开一个窗口update第二行，即又一个事务占据另一个ITL，<br />
3.再开一个窗口update第三行记录，即又占据一个ITL。此时3个ITL已经都被占满，<br />
4.如果此时又开一个窗口update另一行，则此session被挂起。该session会有一个TX的lmode为4（即S锁）的锁。</p>
<p>（二）事务锁：<br />
事务锁是针对活动事务来说的，他们是在回滚段头的块中。transaction identifiers（XID）唯一数据block或者index block的ITL中，是唯一的。XID的格式是：<br />
XID=USN#.SLOT#.WRAP#<br />
XID和回滚段头的关系如下：<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/xid.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/xid.jpg" alt="" title="xid" width="500" height="304" class="aligncenter size-full wp-image-737" /></a></p>
<p>dump transaction table：<br />
主要是dump回滚段头：<br />
alter system dump undo header &#8216;_SYSSMU8$&#8217;;<br />
dump出来的结果中state为10表示active，9表示inactive</p>
<p>Buffer 锁：<br />
注意：buffer lock的resource structure是buffer header。session通过buffer handle来访问buffer，buffer handle是lock structure。<br />
buffer header为session提供buffer handle双向链表，一方面指向session使用的buffer，另一方面指向session等待的buffer。正在等待buffer lock的session会报buffer busy wait或者write complete wait。<br />
buffer busy wait在v$session_wait中 p1表示绝对文件好，p2表示block号，p3表示错误代码。<br />
可以通过v$waitstat看各个类型：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; </span><span style="color: Blue;">l</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Maroon;">1</span><span style="color: Gray;">* </span><span style="color: Green;">select</span><span style="color: Gray;"> * </span><span style="color: Green;">from</span><span style="color: Gray;"> </span><span style="color: Blue;">V</span><span style="color: Gray;">$</span><span style="color: Blue;">WAITSTAT</span><span style="color: Gray;"> </span><span style="color: Green;">order</span><span style="color: Gray;"> </span><span style="color: Green;">by</span><span style="color: Gray;"> </span><span style="color: Maroon;">1</span><span style="color: Gray;"><br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt; /<br />&nbsp;<br /></span><span style="color: Green;">CLASS</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">COUNT</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">TIME</span><span style="color: Gray;"><br />----------------</span><span style="color: #ffa500;">-- ---------- ----------</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">1</span><span style="color: Blue;">st</span><span style="color: Gray;"> </span><span style="color: Green;">level</span><span style="color: Gray;"> </span><span style="color: Blue;">bmb</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">2</span><span style="color: Blue;">nd</span><span style="color: Gray;"> </span><span style="color: Green;">level</span><span style="color: Gray;"> </span><span style="color: Blue;">bmb</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Maroon;">3</span><span style="color: Blue;">rd</span><span style="color: Gray;"> </span><span style="color: Green;">level</span><span style="color: Gray;"> </span><span style="color: Blue;">bmb</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Blue;">bitmap</span><span style="color: Gray;"> </span><span style="color: Blue;">block</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Blue;">bitmap</span><span style="color: Gray;"> </span><span style="color: Blue;">index</span><span style="color: Gray;"> </span><span style="color: Blue;">block</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Green;">data</span><span style="color: Gray;"> </span><span style="color: Blue;">block</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">1664116</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">576375</span><span style="color: Gray;"><br /></span><span style="color: Blue;">extent</span><span style="color: Gray;"> </span><span style="color: Green;">map</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">2</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">5</span><span style="color: Gray;"><br /></span><span style="color: Blue;">file</span><span style="color: Gray;"> </span><span style="color: Blue;">header</span><span style="color: Gray;"> </span><span style="color: Blue;">block</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">17</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">3650</span><span style="color: Gray;"><br /></span><span style="color: Green;">free</span><span style="color: Gray;"> </span><span style="color: Blue;">list</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Blue;">save</span><span style="color: Gray;"> </span><span style="color: Blue;">undo</span><span style="color: Gray;"> </span><span style="color: Blue;">block</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Blue;">save</span><span style="color: Gray;"> </span><span style="color: Blue;">undo</span><span style="color: Gray;"> </span><span style="color: Blue;">header</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Blue;">segment</span><span style="color: Gray;"> </span><span style="color: Blue;">header</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">9037</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">42</span><span style="color: Gray;"><br /></span><span style="color: Blue;">sort</span><span style="color: Gray;"> </span><span style="color: Blue;">block</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">system</span><span style="color: Gray;"> </span><span style="color: Blue;">undo</span><span style="color: Gray;"> </span><span style="color: Blue;">block</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">system</span><span style="color: Gray;"> </span><span style="color: Blue;">undo</span><span style="color: Gray;"> </span><span style="color: Blue;">header</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Blue;">undo</span><span style="color: Gray;"> </span><span style="color: Blue;">block</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">376</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br /></span><span style="color: Blue;">undo</span><span style="color: Gray;"> </span><span style="color: Blue;">header</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">15244</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">9343</span><span style="color: Gray;"><br /></span><span style="color: Blue;">unused</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Maroon;">0</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Maroon;">18</span><span style="color: Gray;"> </span><span style="color: Green;">rows</span><span style="color: Gray;"> </span><span style="color: Blue;">selected</span><span style="color: Gray;">.<br />&nbsp;<br /></span><span style="color: Green;">SQL</span><span style="color: Gray;">&gt;</span></div></div>
<p>1.如buffer busy wait是data block争用：<br />
1.1 如果是data block的读等待，则限制使用选择性不高的索引。<br />
1.2 如果是data block的修改等待，则增加行的选择性：修改pctfree或pctused，增加initrans，减少RECORDS_PER_BLOCK，减小db_block_size，避免使用right hand index。</p>
<p>2.如buffer busy wait是undo的争用<br />
2.1 undo header的争用，则需要更多的undo segment，或者减少transactions_per_rollback_segment。注：9i开始由于使用AUM，自动管理undo，所以该等待出现的情况不多。</p>
<p>3.如buffer busy wait是free list争用，主要是buffer cache中segment header block的争用。<br />
3.1 增加 free list<br />
3.2 增加free list group</p>
<p>SMON的作用：<br />
1.合并free extent，注，会有ST enqueue。<br />
2.清理temporary segment——注：不一定是temp表空间，如truncate之后的表，就被列为temporary segment了。<br />
3.清理不存在的object<br />
4.清理online rebuild但crash后的IND$<br />
5.回缩undo segment<br />
6.启动时的事务恢复<br />
7.事务回滚（被PMON触发）。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracleblog.cn/useful-script/study-lock-in-dsi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>sqlnet文件格式导致侦听无法启动</title>
		<link>http://www.oracleblog.cn/working-case/lnsr-can-not-start-because-of-sqlnet-format/</link>
		<comments>http://www.oracleblog.cn/working-case/lnsr-can-not-start-because-of-sqlnet-format/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 20:34:52 +0000</pubDate>
		<dc:creator>小荷</dc:creator>
		
		<category><![CDATA[..experience]]></category>

		<category><![CDATA[Working case]]></category>

		<guid isPermaLink="false">http://www.oracleblog.cn/?p=739</guid>
		<description><![CDATA[今天凌晨接到某省的一个电话，数据库进行MC service guard的切换，但是切换过去后，发现侦听无法启动，启动时侦听报错信息为：
oracle@ha_dc02:/oracle/app/oracle/product/9.2.0/network/admin &#62; lsnrctl start&#1... ]]></description>
			<content:encoded><![CDATA[<p>今天凌晨接到某省的一个电话，数据库进行MC service guard的切换，但是切换过去后，发现侦听无法启动，启动时侦听报错信息为：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">oracle@ha_dc02:/oracle/app/oracle/product/9.2.0/network/admin &gt; lsnrctl start<br />&nbsp;<br />LSNRCTL for HPUX: Version 9.2.0.6.0 - Production on 04-SEP-2009 01:46:07<br />&nbsp;<br />Copyright (c) 1991, 2002, Oracle Corporation.&nbsp; All rights reserved.<br />&nbsp;<br />Starting /oracle/app/oracle/product/9.2.0/bin/tnslsnr: please wait...<br />&nbsp;<br />TNSLSNR for HPUX: Version 9.2.0.6.0 - Production<br />System parameter file is /oracle/app/oracle/product/9.2.0/network/admin/listener.ora<br />Log messages written to /oracle/app/oracle/product/9.2.0/network/log/listener.log<br />Error listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.203.41.11)(PORT=1521)))<br />TNS-12532: TNS:invalid argument<br />&nbsp;TNS-12560: TNS:protocol adapter error<br />&nbsp; TNS-00502: Invalid argument<br />&nbsp;<br />&nbsp;<br />Listener failed to start. See the error message(s) above...<br />&nbsp;<br />oracle@ha_dc02:/oracle/app/oracle/product/9.2.0/network/admin &gt;</span></div></div>
<p>检查配置，网络，都没有问题，浮动IP也是启动在10.203.41.11上，但是侦听就是起不来，检查/etc/hosts文件，也是没发现错误。</p>
<p>无奈之下只能开侦听的trace，呵呵，发现遇到侦听无法启动的问题，开trace是个很好的诊断方法。<br />
在trace中发现：<br />
<code>[000001 04-SEP-2009 02:47:41:888] nttcon: entry<br />
[000001 04-SEP-2009 02:47:41:888] nttcon: toc = 2<br />
[000001 04-SEP-2009 02:47:41:888] nttcnp: entry<br />
[000001 04-SEP-2009 02:47:41:889] ntvlin: entry<br />
[000001 04-SEP-2009 02:47:41:889] ntvllt: entry<br />
<strong>[000001 04-SEP-2009 02:47:41:889] ntvllt: Not successful in reading /oracle/app/oracle/product/9.2.0/network/admin/sqlnet.ora</strong><br />
[000001 04-SEP-2009 02:47:41:889] ntvllt: exit<br />
[000001 04-SEP-2009 02:47:41:889] ntvlin: exit<br />
[000001 04-SEP-2009 02:47:41:889] nttcnp: Validnode Table **NOT** used; err 0&#215;1f6<br />
[000001 04-SEP-2009 02:47:41:889] nttcnp: exit<br />
[000001 04-SEP-2009 02:47:41:889] nttcon: exit<br />
[000001 04-SEP-2009 02:47:41:889] nserror: entry<br />
[000001 04-SEP-2009 02:47:41:890] nserror: nsres: id=0, op=65, ns=12532, ns2=12560; nt[0]=502, nt[1]=0, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0<br />
[000001 04-SEP-2009 02:47:41:890] nsopen: unable to open transport<br />
[000001 04-SEP-2009 02:47:41:890] nsbfr: entry</code></p>
<p>看来是和sqlnet.ora文件有关系了，该文件在前段时间安全加固中加上了IP鉴权：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">TCP.VALIDNODE_CHECKING=yes<br />TCP.INVITED_NODES=(10.203.41.28,<br />10.203.41.31,<br />10.203.41.42,<br />……<br />10.203.42.193,<br />10.203.42.194,<br />10.203.42.195,<br />10.203.42.196)</span></div></div>
<p>咋一看，是没什么问题，其实，在实际的操作过程中，之前操作的同事可能把格式写错了。呵呵，这样的问题谁都预料不到。我们应该写成：<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/sqlnet.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/sqlnet.jpg" alt="" title="sqlnet" class="aligncenter size-full wp-image-748" /></a><br />
这样就正常了。</p>
<p>我们可以在自己的机器上（oracle 10.2.0.1）做测试：<br />
（一）当sqlnet.ora写成：<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/sqlnet1.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/sqlnet1.jpg" alt="" title="sqlnet1" class="aligncenter size-full wp-image-757" /></a><br />
侦听启动正常：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">C:\Documents and Settings\Administrator&gt;lsnrctl start<br />&nbsp;<br />LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 04-9月 -2009 04:36:36<br />&nbsp;<br />Copyright (c) 1991, 2005, Oracle.&nbsp; All rights reserved.<br />&nbsp;<br />启动tnslsnr: 请稍候...<br />&nbsp;<br />TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />系统参数文件为d:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />写入d:\oracle\product\10.2.0\db_1\network\log\listener.log的日志信息<br />监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=HEJIANMIN)(PORT=1521)))<br />监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))<br />&nbsp;<br />正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=HEJIANMIN)(PORT=1521)))<br />LISTENER 的 STATUS<br />------------------------<br />别名&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LISTENER<br />版本&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />启动日期&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 04-9月 -2009 04:36:40<br />正常运行时间&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 天 0 小时 0 分 3 秒<br />跟踪级别&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; off<br />安全性&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ON: Local OS Authentication<br />SNMP&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OFF<br />监听程序参数文件&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />监听程序日志文件&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d:\oracle\product\10.2.0\db_1\network\log\listener.log<br />监听端点概要...<br />&nbsp; (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=HEJIANMIN)(PORT=1521)))<br />&nbsp; (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))<br />服务摘要..<br />服务 &quot;CLRExtProc&quot; 包含 1 个例程。<br />&nbsp; 例程 &quot;CLRExtProc&quot;, 状态 UNKNOWN, 包含此服务的 1 个处理程序...<br />服务 &quot;PLSExtProc&quot; 包含 1 个例程。<br />&nbsp; 例程 &quot;PLSExtProc&quot;, 状态 UNKNOWN, 包含此服务的 1 个处理程序...<br />命令执行成功<br />&nbsp;<br />C:\Documents and Settings\Administrator&gt;</span></div></div>
<p>（二）当我们的sqlnet.ora写成：<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/sqlnet2.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/sqlnet2.jpg" alt="" title="sqlnet2" class="aligncenter size-full wp-image-758" /></a></p>
<p>侦听启动报错：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">C:\Documents and Settings\Administrator&gt;lsnrctl start<br />&nbsp;<br />LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 04-9月 -2009 04:37:24<br />&nbsp;<br />Copyright (c) 1991, 2005, Oracle.&nbsp; All rights reserved.<br />&nbsp;<br />启动tnslsnr: 请稍候...<br />&nbsp;<br />TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />系统参数文件为d:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />写入d:\oracle\product\10.2.0\db_1\network\log\listener.log的日志信息<br />监听该对象时出错: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=HEJIANMIN)(PORT=1521)))<br />TNS-12560: TNS: 协议适配器错误<br />&nbsp;TNS-00583: 有效节点检查: 无法对配置参数进行语法分析<br />&nbsp;<br />&nbsp;<br />监听程序未能启动。请参阅上面的错误消息...<br />&nbsp;<br />&nbsp;<br />C:\Documents and Settings\Administrator&gt;</span></div></div>
<p>（三）当我们把sqlnet.ora写成：<br />
<a href="http://www.oracleblog.cn/wp-content/uploads/2009/09/sqlnet3.jpg"><img src="http://www.oracleblog.cn/wp-content/uploads/2009/09/sqlnet3.jpg" alt="" title="sqlnet3" class="aligncenter size-full wp-image-759" /></a></p>
<p>侦听启动正常：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">C:\Documents and Settings\Administrator&gt;lsnrctl start<br />&nbsp;<br />LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 04-9月 -2009 04:41:55<br />&nbsp;<br />Copyright (c) 1991, 2005, Oracle.&nbsp; All rights reserved.<br />&nbsp;<br />启动tnslsnr: 请稍候...<br />&nbsp;<br />TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />系统参数文件为d:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />写入d:\oracle\product\10.2.0\db_1\network\log\listener.log的日志信息<br />监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=HEJIANMIN)(PORT=1521)))<br />监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))<br />&nbsp;<br />正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=HEJIANMIN)(PORT=1521)))<br />LISTENER 的 STATUS<br />------------------------<br />别名&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LISTENER<br />版本&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production<br />启动日期&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 04-9月 -2009 04:41:56<br />正常运行时间&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 天 0 小时 0 分 1 秒<br />跟踪级别&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; off<br />安全性&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ON: Local OS Authentication<br />SNMP&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OFF<br />监听程序参数文件&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d:\oracle\product\10.2.0\db_1\network\admin\listener.ora<br />监听程序日志文件&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d:\oracle\product\10.2.0\db_1\network\log\listener.log<br />监听端点概要...<br />&nbsp; (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=HEJIANMIN)(PORT=1521)))<br />&nbsp; (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))<br />服务摘要..<br />服务 &quot;CLRExtProc&quot; 包含 1 个例程。<br />&nbsp; 例程 &quot;CLRExtProc&quot;, 状态 UNKNOWN, 包含此服务的 1 个处理程序...<br />服务 &quot;PLSExtProc&quot; 包含 1 个例程。<br />&nbsp; 例程 &quot;PLSExtProc&quot;, 状态 UNKNOWN, 包含此服务的 1 个处理程序...<br />命令执行成功<br />&nbsp;<br />C:\Documents and Settings\Administrator&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.oracleblog.cn/working-case/lnsr-can-not-start-because-of-sqlnet-format/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DML LOCK兼容性表的一个比喻</title>
		<link>http://www.oracleblog.cn/study-note/dml-lock-metaphor-compatibility-table/</link>
		<comments>http://www.oracleblog.cn/study-note/dml-lock-metaphor-compatibility-table/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 00:50:00 +0000</pubDate>
		<dc:creator>小荷</dc:creator>
		
		<category><![CDATA[Study note]]></category>

		<guid isPermaLink="false">http://www.oracleblog.cn/?p=702</guid>
		<description><![CDATA[今天看到ZALBB和jeffli73讨论的文章《oracle多粒度封锁机制研究》，觉得比喻的很有意思，不过jeffli73在坛子上只是比喻了单粒度的封锁机制，没继续比喻多粒度的封锁，这里，我狗尾续貂，按照je... ]]></description>
			<content:encoded><![CDATA[<p>今天看到ZALBB和jeffli73讨论的文章<a href="http://www.itpub.net/270059.html">《oracle多粒度封锁机制研究》</a>，觉得比喻的很有意思，不过jeffli73在坛子上只是比喻了单粒度的封锁机制，没继续比喻多粒度的封锁，这里，我狗尾续貂，按照jeffli73的意思也打个比方吧。</p>
<p>一个艺术中心占地很广（我们把它类比做数据库），有许多独立的建筑-艺术馆（艺术馆相当于数据库中的“表”），各个艺术馆中又有许多展馆（相当于表中的记录），为了使各个艺术馆得到有效的管理，对进出艺术馆的人员进行了分类并对他们各自的行为做了如下限制：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">A</span><span style="color: Gray;">：一般观众：，在任何情况下，他们可以自由进出艺术馆的各个展馆，没有限制，但他们只能观看；给通票。<br /></span><span style="color: Blue;">B</span><span style="color: Gray;">：不同工种的维修工人：他们可以进入展馆进行检查或维修，但是在某一时刻，只能有一个工种的工人在某个展馆进行维修（这主要是为了安全，比如油漆工与电焊工如果同时作业，可能会引起火灾）；在这里，我们把做检查的工人配</span><span style="color: Blue;">RS</span><span style="color: Gray;">的胸卡，把做维修的工人配</span><span style="color: Blue;">RX</span><span style="color: Gray;">的胸卡。<br /></span><span style="color: #00008b;">C</span><span style="color: Gray;">：贵宾（比如联合国世界文化遗产的评审官员）：为了保证这些贵宾的参观效果，在他们参观期间，不允许任何的维修、展馆调整（下面介绍）等工作，但仍然可以进行检查和接待一般观众；同时，后来的贵宾可以进入艺术馆和先来的贵宾一起参观。贵宾配</span><span style="color: Blue;">S</span><span style="color: Gray;">的胸卡。<br /></span><span style="color: Blue;">D</span><span style="color: Gray;">：维修后的清洁人员：维修人员（</span><span style="color: Blue;">RX</span><span style="color: Gray;">）在维修后会产生垃圾需要清理，这些维修后的垃圾有清洁人员清理，他们在工作期间，不允许进行维修工作和调整工作，但是可以进行检查工作，同时为了维护艺术馆形象，工作期间贵宾不能进入，但是一般观众可以进入参观。为了节省费用，一个清洁工人负责整片场地的清洁，下一个的到来必须等这个清洁完毕再入内。清洁人员配</span><span style="color: Blue;">SRX</span><span style="color: Gray;">的胸卡。<br /></span><span style="color: Blue;">E</span><span style="color: Gray;">：展馆调整人员：由于展馆调整会涉及多个展馆，所以在调整期间，不允许对任何展馆进行维修，也不接待任何贵宾；展馆调整人员配</span><span style="color: Blue;">X</span><span style="color: Gray;">的胸卡。</span></div></div>
<p>到时我会守在艺术馆的门口，对于：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Maroon;">1.</span><span style="color: Gray;"> 手持通票的人，我将一律放行；<br />&nbsp;<br /></span><span style="color: Maroon;">2.</span><span style="color: Gray;"> 对于来检查的维修人员，即佩戴</span><span style="color: Blue;">RS</span><span style="color: Gray;">胸卡的人：<br /></span><span style="color: Maroon;">2.1</span><span style="color: Gray;"> 我先检查一下手里是否有</span><span style="color: Blue;">RS</span><span style="color: Gray;">的胸卡，看看该</span><span style="color: Blue;">RS</span><span style="color: Gray;">胸卡和现在要进入的人是否去同一个展馆，如果是去同一展馆就说明也有人在里面进行检查，因此需要等待，如果不是就放行，且记下他去的展馆号码。记下展馆号码后的胸卡我留下，等维修人员出来后还给他。<br /></span><span style="color: Maroon;">2.2</span><span style="color: Gray;"> 如果我手中有的是</span><span style="color: Blue;">RX</span><span style="color: Gray;">的胸卡，则看看是否和检查人员要去的是同一个的展馆，如果是说明有人在同一展馆内进行维修，需要等待前者出来后再进去，如果不是，就放行。<br /></span><span style="color: Maroon;">2.3</span><span style="color: Gray;"> 如果我手中有的是</span><span style="color: Blue;">S</span><span style="color: Gray;">胸卡，说明有贵宾在参观，但是不影响检查，则放行。<br /></span><span style="color: Maroon;">2.4</span><span style="color: Gray;"> 如果我手中是</span><span style="color: Blue;">SRX</span><span style="color: Gray;">的胸卡，说明有清洁人员在打扫，但是不影响检查工作，则放行。<br /></span><span style="color: Maroon;">2.5</span><span style="color: Gray;"> 如果我手中拿的是</span><span style="color: Blue;">X</span><span style="color: Gray;">的胸卡，说明在进行展馆调整，不允许进行检查，则等待。<br />&nbsp;<br /></span><span style="color: Maroon;">3.</span><span style="color: Gray;"> 对于来维修的人员，即佩戴</span><span style="color: Blue;">RX</span><span style="color: Gray;">胸卡的人：<br /></span><span style="color: Maroon;">3.1</span><span style="color: Gray;"> 我先检查一下手里是否有</span><span style="color: Blue;">RS</span><span style="color: Gray;">的胸卡，看看该</span><span style="color: Blue;">RS</span><span style="color: Gray;">胸卡和现在要进入的人是否去同一个展馆，如果是则说明现在还有人在同一展馆做检查，维修人员不能进去，则等待；如果不是同一展馆的，这放行，且记下他去的展馆号码。<br /></span><span style="color: Maroon;">3.2</span><span style="color: Gray;"> 如果我手里的是</span><span style="color: Blue;">RX</span><span style="color: Gray;">的胸卡，且胸卡上的展馆号和现在来的人员要去的是同一个展馆，则需要等前者完成工作出来后才能进去，因此需要等待；如果不是同一展馆的，则放行，且记下去的展馆号码。<br /></span><span style="color: Maroon;">3.3</span><span style="color: Gray;"> 如果我手里的是</span><span style="color: Blue;">S</span><span style="color: Gray;">胸卡，说明里面有贵宾在参观，不能进行维修，则等待。<br /></span><span style="color: Maroon;">3.4</span><span style="color: Gray;"> 如果我手里的是</span><span style="color: Blue;">SRX</span><span style="color: Gray;">胸卡，说明里面有清洁人员在打扫，也不能维修，则等待。<br /></span><span style="color: Maroon;">3.5</span><span style="color: Gray;"> 如果我的手里是</span><span style="color: Blue;">X</span><span style="color: Gray;">的胸卡，说明在进行展馆调整，不能维修，则等着<br />&nbsp;<br /></span><span style="color: Maroon;">4.</span><span style="color: Gray;"> 对于来参观的贵宾，即佩戴</span><span style="color: Blue;">S</span><span style="color: Gray;">胸卡的人：<br /></span><span style="color: Maroon;">4.1</span><span style="color: Gray;"> 我先检查一下手里是否有</span><span style="color: Blue;">RS</span><span style="color: Gray;">胸卡，如果有，说明里面正在检查，这要分</span><span style="color: Maroon;">2</span><span style="color: Gray;">种情况了：<br /></span><span style="color: Maroon;">4.1.1</span><span style="color: Gray;"> 对于指定房间的检查（即</span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: Green;">where</span><span style="color: Gray;"> </span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Green;">update</span><span style="color: Gray;">），由于参观不确定会去哪个展馆，为避免不小心看到了正在搞检查工作的展馆，还是等检查工作完毕在进去，此时</span><span style="color: Blue;">S</span><span style="color: Gray;">胸卡的人在外面等待。<br /></span><span style="color: Maroon;">4.1.2</span><span style="color: Gray;"> 对于不指定展馆的检查（即</span><span style="color: Blue;">lock</span><span style="color: Gray;"> </span><span style="color: Green;">table</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Green;">row</span><span style="color: Gray;"> </span><span style="color: Blue;">share</span><span style="color: Gray;"> </span><span style="color: Blue;">mode</span><span style="color: Gray;">），则能进去参观。<br /></span><span style="color: Maroon;">4.2</span><span style="color: Gray;"> 如果我手里有</span><span style="color: Blue;">RX</span><span style="color: Gray;">的胸卡，说明里面正在进行维修，不能进去参观，贵宾需等待维修完成再进去。<br /></span><span style="color: Maroon;">4.3</span><span style="color: Gray;"> 如果我手里是</span><span style="color: Blue;">S</span><span style="color: Gray;">的胸卡，说明之前已经有一位贵宾进去，根据之前的条件，此刻的这个贵宾也能一起进去参观，于是放行。<br /></span><span style="color: Maroon;">4.4</span><span style="color: Gray;"> 如果我手里的是</span><span style="color: Blue;">SRX</span><span style="color: Gray;">的胸卡，说明正在清理，为保持形象，贵宾需等待。<br /></span><span style="color: Maroon;">4.5</span><span style="color: Gray;"> 如果我手里是</span><span style="color: Blue;">X</span><span style="color: Gray;">胸卡，说明正在调整展馆，不能进去参观，贵宾等待。<br />&nbsp;<br /></span><span style="color: Maroon;">5.</span><span style="color: Gray;"> 对于来进行清理的人员，即佩戴</span><span style="color: Blue;">SRX</span><span style="color: Gray;">胸卡的人：<br /></span><span style="color: Maroon;">5.1</span><span style="color: Gray;"> 我先检查是否有</span><span style="color: Blue;">RS</span><span style="color: Gray;">的胸卡，如果有，说明正在进行检查，但是检查工作和清扫工作不冲突，于是放行。<br /></span><span style="color: Maroon;">5.2</span><span style="color: Gray;"> 如果我手里有</span><span style="color: Blue;">RX</span><span style="color: Gray;">的胸卡，说明还在维修，维修和维修的垃圾清扫冲突，则等待<br /></span><span style="color: Maroon;">5.3</span><span style="color: Gray;"> 如果我手里有</span><span style="color: Blue;">S</span><span style="color: Gray;">的胸卡，说明有贵宾在参观，此时为了保持形象，不能进行清扫工作，则等待。<br /></span><span style="color: Maroon;">5.4</span><span style="color: Gray;"> 如果我手里有的是</span><span style="color: Blue;">SRX</span><span style="color: Gray;">胸卡，说明已经有一个清洁人员进去，根据约定，不能</span><span style="color: Maroon;">2</span><span style="color: Gray;">个清洁人员一起进场，于是等待。<br /></span><span style="color: Maroon;">5.5</span><span style="color: Gray;"> 如果我手里是</span><span style="color: Blue;">X</span><span style="color: Gray;">胸卡，说明正在调整展馆，不能进去参观，需要等待。<br />&nbsp;<br /></span><span style="color: Maroon;">6.</span><span style="color: Gray;"> 对于来展馆调整人员，即佩戴</span><span style="color: Blue;">X</span><span style="color: Gray;">胸卡的人：<br /></span><span style="color: Maroon;">6.1</span><span style="color: Gray;"> 我查一下手中是否有卡，有卡说明有检查维护工作、清洁工作或者贵宾正在里面，此时展馆不能调整，则等待。<br /></span><span style="color: Maroon;">6.2</span><span style="color: Gray;"> 如果手里没有卡，此时可以调整，则放行。</span></div></div>
<p>题外话：从10G R2开始select for update已经改成了RX的模式，即lmode为3，这应该说是一个改进，因为从之前的文档上看，select for update是RS锁，可以兼容S锁，前提条件是*Yes, if no conflicting row locks are held by another transaction. Otherwise, waits occur.但是在实际的测试中，如果我select * from table where 1=2 for udpate，这样的不锁任何数据的RS锁，也会让lock table in share mode阻塞。因此，现实的情况select for update为RX锁的情况吻合了，所以10G R2这个版本被改成RX锁，算是修正了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.oracleblog.cn/study-note/dml-lock-metaphor-compatibility-table/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
