﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-风花雪月-随笔分类-oracle数据库</title><link>http://www.cnitblog.com/conish/category/8328.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Sep 2011 01:51:04 GMT</lastBuildDate><pubDate>Wed, 28 Sep 2011 01:51:04 GMT</pubDate><ttl>60</ttl><item><title>Oracle内存结构研究-SGA篇</title><link>http://www.cnitblog.com/conish/archive/2009/11/02/62363.html</link><dc:creator>风花雪月</dc:creator><author>风花雪月</author><pubDate>Mon, 02 Nov 2009 10:32:00 GMT</pubDate><guid>http://www.cnitblog.com/conish/archive/2009/11/02/62363.html</guid><wfw:comment>http://www.cnitblog.com/conish/comments/62363.html</wfw:comment><comments>http://www.cnitblog.com/conish/archive/2009/11/02/62363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/conish/comments/commentRss/62363.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/conish/services/trackbacks/62363.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt">一、概述<br></p>
SGA，PGA，UGA都是Oracle管理的内存区。<br><br>SGA（System Global Area），即系统全局区，Oracle中最重要的内存区。<br>PGA（Process Global Area），即程序全局区，一个进程的专用的内存区。<br>UGA（User Global Area），即用户全局区，与特定的会话相关联。<br>专用服务器连接模式，UGA在PGA中分配。<br>共享服务器连接模式，UGA在SGA中的Large Pool中分配。<br><br>如果采用专用服务器连接模式，PGA中包含UGA，其他区域用来排序，散列和位图合并。<br>简单来讲，PGA=UGA+排序区+散列区+位图合并区。<br><br><br>二、PGA的<a onclick="javascript:tagshow(event, '%B9%DC%C0%ED');" href="javascript:;" target=_self><u><strong>管理</strong></u></a>模式。<br>PGA分两种管理模式：<br>1) 手动PGA内存管理，用户指定排序区和散列区所使用的内存，每个连接使用相同的内存。<br>2) 自动PGA内存管理，告诉Oracle可以使用的PGA的总量，由Oraclce根据系统负载决定具体分配。<br><br> 9iR1时默认为手动PGA内存管理，9iR2以后默认为自动PGA内存管理。<br> PGA内存可以动态扩大和回收。<br><br>PGA内存管理模式由WORKAREA_SIZE_POLICY控制。<br>1) 设为MANUAL，启用手动内存管理。<br>2) 设为AUTO，并且PGA_AGGREGATE_TARGET不为0时，启用自动内存管理。<br><br><br>三、手动PGA内存管理<br>有三个参数对PGA影响最大。<br>SORT_AREA_SIZE：对信息排序所用的内存总量<br>SORT_AREA_RETAINED_SIZE：排序后在内存中保存排序信息的内存总量。<br>HASH_AREA_SIZE：存储散列列表所用的内存量。<br><br>下面对这三个参数进行说明：<br>1) SORT_AREA_SIZE：<br>如果SORT_AREA_SIZE设为512KB，SORT_AREA_RETAINED_SIZE也为512KB，则Oracle使用512KB的内存进行排序，排序后所有数据都留在内存中。<br><br>2) SORT_AREA_RETAINED_SIZE：<br>如果SORT_AREA_SIZE设为512KB，SORT_AREA_RETAINED_SIZE设为384KB，则Oracle使用512KB的内存进行排序，然后保留384KB的已排序数据，另外512KB-384KB=128KB的已排序数据会写到临时表空间中。<br> 如果SORT_AREA_RETAINED_SIZE没有设置，则它的值为0，但是实际保留的排序数据和SORT_AREA_SIZE相同。<br><br>3) HASH_AREA_SIZE：<br>一个大集合和另个集合进行连接时，会用到HASH_AREA_SIZE参数。较小的 表会放到这部分内存中作为驱动表，然后大表进行探索（PROBE）操作进行连接。如果HASH_AREA_SIZE过小会影响两个集合（表）连接时的性能。<br><br>注意点：<br>1) 如果需要排序的数据量大于SORT_AREA_SIZE，Oracle会分批进行排序。把当前已排序的数据保存到临时表空间中，然后对剩余的数据进行排序。最后，还会对这些保存在临时表空间中的已排序数据再进行排序，因为每次保存到临时表空间中的已排序数据只是部分数据的排序，对整体需排序的数据来说只是部分局部有序。<br>2) *_AREA_SIZE只是对某个操作的限制，一个查询可能有多个操作，每个操作都有自己的内存区。如果SORT_AREA_SIZE设为5MB，一个查询可能会有10个排序操作，这样一个查询会占用50MB的排序内存。<br>3) 3，*_AREA_SIZE内存的分配是按需分配。如果一个查询需要5MB内存进行排序，就算分配1G的SORT_AREA_SIZE也不会全部使用，只会使用需要的5MB的内存量。<br><br><br>四、自动PGA内存管理<br>要启用自动PGA内存管理，设置下列参数：<br>1，WORKAREA_SIZE_POLICY=AUTO<br>2，PGA_AGGREGATE_TARGET=非零<br><br>有关PGA_AGGREGATE_TARGET：<br>1) PGA_AGGREGATE_TARGET是一个目标值。连接数少的时候实际分配PGA内存会比它要小。连接数多的时候实际分配的PGA内存会比它要大，但是Oracle会努力保持总PGA保持在PGA_AGGREGATE_TARGET值内。<br><br>例如，PGA_AGGREGATE_TARGET 设为300MB。5个用户连接时，每个用户可能分配10MB的PGA内存，共分配50MB的PGA内存。300个用户连接时每个用户可能分配1.3MB的PGA内存，共分配390MB的PGA内存。当用户连接多时，Oracle会降低每个用户的PGA内存使用量。<br>2) 一个串行查询（非并行查询）可能包括多个排序/散列操作，每个排序/散列操作最多使用5%的PGA内存。<br>3) 一个并行查询最多可用到30%的PGA内存，无论有多少并行进程。<br><br><br>五、手动PGA内存管理与自动PGA内存管理<br>自动PGA内存管理相对于手动PGA内存管理有很多优点<br>1， 当用户连接少时<br>a) 手动PGA内存管理不管有多少可用内存都按照预设值进行分配。比如当前空闲内存为300MB，连接需要10MB的内存进行排序，而我们设定的排序区大小为5MB，导致虽然有足够的空闲内存却无法分配给当前连接，造成执行效率低下。<br>b) 自动PGA内存管理会根据当前空闲内存来进行分配。当空闲内存为300MB，当前用户需要10MB内存进行排序，Oracle就会分配10MB内存给当前用户。<br>2， 当用户连接多时<br>a) 手动PGA内存管理会完全按照预设值分配内存。如果物理内存总量为1G，排序区设为5MB，当有300个用户连接时，Oracle会分配1.5G的内存，这已经超过了我们的实际物理内存！<br>b) 自动PGA内存管理会根据当前连接情况进行分配。如果物理内存总量为1G，PGA_AGGREGATE_TARGET为300MB，当用户数从10升到300时，每个用户连接的内存会从满足需要的10MB慢慢减少到1.3MB，虽然最后总量也会超过PGA_AGGREGATE_TARGET，但比起手动PGA内存管理要好很多了。<br><br>什么时候使用自动PGA内存管理？什么时候使用手动PGA内存管理？<br>白天系统正常运行时适合使用自动PGA内存管理，让Oracle根据当前负载自动管理、分配PGA内存。<br>夜里用户数少、进行维护的时候可以设定当前会话使用手动PGA内存管理，让当前的维护操作获得尽可能多的内存，加快执行速度。<br><br>如：服务器平时运行在自动PGA内存管理模式下，夜里有个任务要大表进行排序连接后更新，就可以在该操作session中临时更改为手动PGA内存管理，然后分配大的SORT_AREA_SIZE和HASH_AREA_SIZE（50%甚至80%内存，要确保无其他用户使用），这样能大大加快系统运行速度，又不影响白天高峰期对系统造成的影响。<br><br><br>六、操作命令<br>系统级更改：<br>ALTER SYSTEM SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL}；<br>ALTER SYSTEM SET PGA_AGGREGATE_TARGET=100000000;<br>ALTER SYSTEM SET SORT_AREA_SIZE = 65536 SCOPE = SPFILE；<br>ALTER SYSTEM SET HASH_AREA_SIZE = 65536 SCOPE = SPFILE；<br><br>会话级更改<br>ALTER SESSION SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL}；<br>ALTER SESSION SET SORT_AREA_SIZE = 65536；<br>ALTER SESSION SET HASH_AREA_SIZE = 65536；<br><br><br>七、学以致用<br>1，排序区：<br>pga_aggregate_target为100MB，单个查询能用到5%也就是5MB时排序所需时间<br><br>SQL&gt; create table sorttable as select * from all_objects;<br><br>表已创建。<br><br>SQL&gt; insert into sorttable (select * from sorttable);<br><br>已创建49735行。<br><br>SQL&gt; insert into sorttable (select * from sorttable);<br><br>已创建99470行。<br><br>SQL&gt; set timing on;<br>SQL&gt; set autotrace traceonly;<br>SQL&gt; select * from sorttable order by object_id;<br><br>已选择198940行。<br><br>已用时间: 00: 00: 50.49<br><br>Session级修改排序区为30mb所需时间<br>SQL&gt; ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL;<br><br>会话已更改。<br><br>已用时间: 00: 00: 00.02<br>SQL&gt; ALTER SESSION SET SORT_AREA_SIZE = 30000000;<br><br>会话已更改。<br><br>已用时间: 00: 00: 00.01<br>SQL&gt; select * from sorttable order by object_id;<br><br>已选择198940行。<br><br>已用时间: 00: 00: 10.76<br><br>可以看到所需时间从50.49秒减少到10.31秒，速度提升很明显。<br><br>2，散列区：<br>pga_aggregate_target为100MB，单个查询能用到5%也就是5MB时表连接所需时间<br><br>SQL&gt; select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;<br><br>已选择49735行。<br><br>已用时间: 00: 00: 40.50<br><br>Session级修改散列区为30mb所需时间<br>SQL&gt; ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL;<br><br>会话已更改。<br><br>已用时间: 00: 00: 00.01<br>SQL&gt; ALTER SESSION SET HASH_AREA_SIZE = 30000000;<br><br>会话已更改。<br><br>已用时间: 00: 00: 00.01<br>SQL&gt; select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;<br><br>已选择49735行。<br><br>已用时间: 00: 00: 04.47<br><br>所需时间由40.50秒提升到4.47秒，效果同样很明显。<br><br>备注：以上<a onclick="javascript:tagshow(event, '%CA%B5%D1%E9');" href="javascript:;" target=_self><u><strong>实验</strong></u></a>皆执行全表扫描保证相关表读入缓冲区中，避免因数据没读入缓存造成误差。<br><br><br>结论：在9iR2版以后，PGA不再像以前那样困扰DBA了，Oracle会帮我们做好PGA的分配。但这并不意味着DBA不需要深入了解PGA了，掌握PGA并根据适当应用会让工作如虎添翼。<br>
<img src ="http://www.cnitblog.com/conish/aggbug/62363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/conish/" target="_blank">风花雪月</a> 2009-11-02 18:32 <a href="http://www.cnitblog.com/conish/archive/2009/11/02/62363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pctused（percent used）与pctfree（percent free）</title><link>http://www.cnitblog.com/conish/archive/2009/11/02/62362.html</link><dc:creator>风花雪月</dc:creator><author>风花雪月</author><pubDate>Mon, 02 Nov 2009 10:31:00 GMT</pubDate><guid>http://www.cnitblog.com/conish/archive/2009/11/02/62362.html</guid><wfw:comment>http://www.cnitblog.com/conish/comments/62362.html</wfw:comment><comments>http://www.cnitblog.com/conish/archive/2009/11/02/62362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/conish/comments/commentRss/62362.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/conish/services/trackbacks/62362.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 12pt">概念：<br><br>&nbsp; &nbsp; pctused：一个块的使用水位的百分比，这个水位将使该块返回到可用列表中去等待更多的插入操作。<br>&nbsp; &nbsp; pctfree：用来为一个块保留的空间百分比，以防止在今后的更新操作中增加一列或多列值的长度。<br>&nbsp; &nbsp; freelist：可用列表是表中的一组可插入数据的可用块。<br>&nbsp; &nbsp; 行连接：指一行存储在多个块中的情况，这是因为该行的长度超过了一个块的可用空间大小，即行链接是跨越多块的行。<br>&nbsp; &nbsp; 行迁移：指一个数据行不适合放入当前块而被重新定位到另一个块（那里有充足的空间）中，但在原始块中保留一个指针的情形。原始块中的指针是必需的，因为索引的ROWID项仍然指向原始位置。<br><br>&nbsp; &nbsp; 计算公式：<br><br>&nbsp; &nbsp; PCTFREE=(Average Row Size-Initial Row Size)*100/Average Row Size<br>&nbsp; &nbsp; PCTUSED=(100-PCTFREE) -Average Row Size * 100/Availabe Data Space<br><br>&nbsp; &nbsp; Oracle的其中一个优点时它可以</span><a onclick="javascript:tagshow(event, '%B9%DC%C0%ED');" href="javascript:;" target=_self><u><strong><span style="FONT-SIZE: 12pt">管理</span></strong></u></a><span style="FONT-SIZE: 12pt">每个表空间中的自由空间。Oracle负责处理表和索引的空间管理，这样就可以让我们无需懂得Oracle的表和索引的内部运作。不过，对于有经验的Oracle调优专家来说，他需要懂得Oracle是如何管理表的extent和空闲的数据块。对于调整拥有高的insert或者update的系统来说，这是非常重要的。<br><br>&nbsp; &nbsp; 要精通对象的调整，你需要懂得freelists和freelist组的行为，它们和pctfree及pctused参数的值有关。这些知识对于</span><a onclick="javascript:tagshow(event, '%C6%F3%D2%B5');" href="javascript:;" target=_self><u><strong><span style="FONT-SIZE: 12pt">企业</span></strong></u></a><span style="FONT-SIZE: 12pt">资源计划（ERP）的应用是特别重要的，因为在这些应用中，不正确的表设置通常是DML语句执行慢的原因。<br><br>&nbsp; &nbsp; 对于初学者来说，最常见的错误是认为默认的Oracle参数对于所有的对象都是最佳的。除非磁盘的消耗不是一个问题，否则在设置表的pctfree和pctused参数时，就必须考虑平均的行长和</span><a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target=_self><u><strong><span style="FONT-SIZE: 12pt">数据库</span></strong></u></a><span style="FONT-SIZE: 12pt">的块大小，这样空的块才会被有效地放到freelists中。当这些设置不正确时，那些得到的freelists也是"dead"块，因为它们没有足够的空间来存储一行，这样将会导致明显的处理延迟。<br><br>&nbsp; &nbsp; Freelists对于有效地重新使用Oracle表空间中的空间是很重要的，它和pctfree及pctused这两个存储参数的设置直接相关。如果将pctused设置为一个高的值，这时数据库就会尽快地重新使用块。不过，高性能和有效地重新使用表的块是对立的。在调整Oracle的表格和索引时，需要认真考虑究竟需要高性能还是有效的空间重用，并且据此来设置表的参数。以下我们来看一下这些freelists是如何影响Oracle的性能的。<br><br>&nbsp; &nbsp; 当有一个请求需要插入一行到表格中时，Oracle就会到freelist中寻找一个有足够的空间来容纳一行的块。你也许知道，freelist串是放在表格或者索引的第一个块中，这个块也被称为段头（segment header）。pctfree和pctused 参数的唯一目的就是为了控制块如何在freelists中进出。虽然freelist link和 unlink是简单的Oracle功能，不过设置freelist link (pctused) 和unlink (pctfree) 对Oracle的性能确实有影响。<br><br>&nbsp; &nbsp; 由DBA的基本知识知道，pctfree参数是控制freelist un-links的（即将块由freelists中移除）。设置pctfree=10 意味着每个块都保留10%的空间用作行扩展。pctused参数是控制freelist re-links的。设置pctused=40意味着只有在块的使用低于40%时才会回到表格的freelists中。<br><br>&nbsp; &nbsp; 许多新手对于一个块重新回到freelists后的处理都有些误解。其实，一旦由于一个删除的操作而令块被重新加入到freelist中，它将会一直保留在freelist中即使空间的使用超过了60%，只有在到达pctfree时才会将数据块由freelist中移走。<br><br>&nbsp; &nbsp; 表格和索引存储参数设置的要求总结<br><br>&nbsp; &nbsp; 以下的一些规则是用来设置freelists, freelist groups, pctfree和pctused存储参数的。你也知道，pctused和pctfree的值是可以很容易地通过alter table命令修改的，一个好的DBA应该知道如何设置这些参数的最佳值。<br><br>&nbsp; &nbsp; 有效地使用空间和高性能之间是有矛盾的，而表格的存储参数就是控制这个方面的矛盾：<br><br>&nbsp; &nbsp; . 对于需要有效地重新使用空间，可以设置一个高的pctused值，不过副作用是需要额外的I/O。一个高的pctused值意味着相对满的块都会放到freelist中。因此，这些块在再次满之前只可以接受几行记录，从而导致更多的I/O。<br><br>&nbsp; &nbsp; . 追求高性能的话，可以将pctused设置为一个低的值，这意味着Oracle不会将数据块放到freelists中直到它几乎是空的。那么块将可以在满之前接收更多的行，因此可以减少插入操作的I/O。要记住Oracle扩展新块的性能要比重新使用现有的块高。对于Oracle来说，扩展一个表比管理freelists消耗更少的资源。<br><br>&nbsp; &nbsp; 让我们来回顾一下设置对象存储参数的一些常见规则：<br><br>&nbsp; &nbsp; ．经常将pctused设置为可以接收一条新行。对于不能接受一行的free blocks对于我们来说是没有用的。如果这样做，将会令Oracle的性能变慢，因为Oracle将在扩展表来得到一个空的块之前，企图读取5个"dead"的free block。<br><br>&nbsp; &nbsp; ．表格中chained rows的出现意味着pctfree太低或者是db_block_size太少。在很多情况下，RAW和LONG RAW列都很巨大，以至超过了Oracle的最大块的大小，这时chained rows是不可以避免的。<br><br>&nbsp; &nbsp; ．如果一个表有同时插入的</span><a onclick="javascript:tagshow(event, 'SQL');" href="javascript:;" target=_self><u><strong><span style="FONT-SIZE: 12pt">SQL</span></strong></u></a><span style="FONT-SIZE: 12pt">语句，那么它需要有同时删除的语句。运行单一个一个清除的工作将会把全部的空闲块放到一个freelist中，而没有其它包含有任何空闲块的freelists出现。<br><br>&nbsp; &nbsp; ．freelist参数应该设置为表格同时更新的最大值。例如，如果在任何时候，某个表最多有20个用户执行插入的操作，那么该表的参数应该设置为freelists=20。<br><br>&nbsp; &nbsp; 应记住的是freelist groups参数的值只是对于Oracle Parallel </span><a onclick="javascript:tagshow(event, 'Server');" href="javascript:;" target=_self><u><strong><span style="FONT-SIZE: 12pt">Server</span></strong></u></a><span style="FONT-SIZE: 12pt">和Real Application Clusters才是有用的。对于这类Oracle，freelist groups应该设置为访问该表格的Oracle Parallel Server实例的数目。<br></span>
<img src ="http://www.cnitblog.com/conish/aggbug/62362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/conish/" target="_blank">风花雪月</a> 2009-11-02 18:31 <a href="http://www.cnitblog.com/conish/archive/2009/11/02/62362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle内存结构研究-PGA篇</title><link>http://www.cnitblog.com/conish/archive/2009/11/02/62360.html</link><dc:creator>风花雪月</dc:creator><author>风花雪月</author><pubDate>Mon, 02 Nov 2009 10:26:00 GMT</pubDate><guid>http://www.cnitblog.com/conish/archive/2009/11/02/62360.html</guid><wfw:comment>http://www.cnitblog.com/conish/comments/62360.html</wfw:comment><comments>http://www.cnitblog.com/conish/archive/2009/11/02/62360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/conish/comments/commentRss/62360.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/conish/services/trackbacks/62360.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;
<p style="FONT-SIZE: 12pt">一、概述<br></p>
SGA，PGA，UGA都是Oracle管理的内存区。<br><br>SGA（System Global Area），即系统全局区，Oracle中最重要的内存区。<br>PGA（Process Global Area），即程序全局区，一个进程的专用的内存区。<br>UGA（User Global Area），即用户全局区，与特定的会话相关联。<br>专用服务器连接模式，UGA在PGA中分配。<br>共享服务器连接模式，UGA在SGA中的Large Pool中分配。<br><br>如果采用专用服务器连接模式，PGA中包含UGA，其他区域用来排序，散列和位图合并。<br>简单来讲，PGA=UGA+排序区+散列区+位图合并区。<br><br><br>二、PGA的<a onclick="javascript:tagshow(event, '%B9%DC%C0%ED');" href="javascript:;" target=_self><u><strong>管理</strong></u></a>模式。<br>PGA分两种管理模式：<br>1) 手动PGA内存管理，用户指定排序区和散列区所使用的内存，每个连接使用相同的内存。<br>2) 自动PGA内存管理，告诉Oracle可以使用的PGA的总量，由Oraclce根据系统负载决定具体分配。<br><br> 9iR1时默认为手动PGA内存管理，9iR2以后默认为自动PGA内存管理。<br> PGA内存可以动态扩大和回收。<br><br>PGA内存管理模式由WORKAREA_SIZE_POLICY控制。<br>1) 设为MANUAL，启用手动内存管理。<br>2) 设为AUTO，并且PGA_AGGREGATE_TARGET不为0时，启用自动内存管理。<br><br><br>三、手动PGA内存管理<br>有三个参数对PGA影响最大。<br>SORT_AREA_SIZE：对信息排序所用的内存总量<br>SORT_AREA_RETAINED_SIZE：排序后在内存中保存排序信息的内存总量。<br>HASH_AREA_SIZE：存储散列列表所用的内存量。<br><br>下面对这三个参数进行说明：<br>1) SORT_AREA_SIZE：<br>如果SORT_AREA_SIZE设为512KB，SORT_AREA_RETAINED_SIZE也为512KB，则Oracle使用512KB的内存进行排序，排序后所有数据都留在内存中。<br><br>2) SORT_AREA_RETAINED_SIZE：<br>如果SORT_AREA_SIZE设为512KB，SORT_AREA_RETAINED_SIZE设为384KB，则Oracle使用512KB的内存进行排序，然后保留384KB的已排序数据，另外512KB-384KB=128KB的已排序数据会写到临时表空间中。<br> 如果SORT_AREA_RETAINED_SIZE没有设置，则它的值为0，但是实际保留的排序数据和SORT_AREA_SIZE相同。<br><br>3) HASH_AREA_SIZE：<br>一个大集合和另个集合进行连接时，会用到HASH_AREA_SIZE参数。较小的 表会放到这部分内存中作为驱动表，然后大表进行探索（PROBE）操作进行连接。如果HASH_AREA_SIZE过小会影响两个集合（表）连接时的性能。<br><br>注意点：<br>1) 如果需要排序的数据量大于SORT_AREA_SIZE，Oracle会分批进行排序。把当前已排序的数据保存到临时表空间中，然后对剩余的数据进行排序。最后，还会对这些保存在临时表空间中的已排序数据再进行排序，因为每次保存到临时表空间中的已排序数据只是部分数据的排序，对整体需排序的数据来说只是部分局部有序。<br>2) *_AREA_SIZE只是对某个操作的限制，一个查询可能有多个操作，每个操作都有自己的内存区。如果SORT_AREA_SIZE设为5MB，一个查询可能会有10个排序操作，这样一个查询会占用50MB的排序内存。<br>3) 3，*_AREA_SIZE内存的分配是按需分配。如果一个查询需要5MB内存进行排序，就算分配1G的SORT_AREA_SIZE也不会全部使用，只会使用需要的5MB的内存量。<br><br><br>四、自动PGA内存管理<br>要启用自动PGA内存管理，设置下列参数：<br>1，WORKAREA_SIZE_POLICY=AUTO<br>2，PGA_AGGREGATE_TARGET=非零<br><br>有关PGA_AGGREGATE_TARGET：<br>1) PGA_AGGREGATE_TARGET是一个目标值。连接数少的时候实际分配PGA内存会比它要小。连接数多的时候实际分配的PGA内存会比它要大，但是Oracle会努力保持总PGA保持在PGA_AGGREGATE_TARGET值内。<br><br>例如，PGA_AGGREGATE_TARGET 设为300MB。5个用户连接时，每个用户可能分配10MB的PGA内存，共分配50MB的PGA内存。300个用户连接时每个用户可能分配1.3MB的PGA内存，共分配390MB的PGA内存。当用户连接多时，Oracle会降低每个用户的PGA内存使用量。<br>2) 一个串行查询（非并行查询）可能包括多个排序/散列操作，每个排序/散列操作最多使用5%的PGA内存。<br>3) 一个并行查询最多可用到30%的PGA内存，无论有多少并行进程。<br><br><br>五、手动PGA内存管理与自动PGA内存管理<br>自动PGA内存管理相对于手动PGA内存管理有很多优点<br>1， 当用户连接少时<br>a) 手动PGA内存管理不管有多少可用内存都按照预设值进行分配。比如当前空闲内存为300MB，连接需要10MB的内存进行排序，而我们设定的排序区大小为5MB，导致虽然有足够的空闲内存却无法分配给当前连接，造成执行效率低下。<br>b) 自动PGA内存管理会根据当前空闲内存来进行分配。当空闲内存为300MB，当前用户需要10MB内存进行排序，Oracle就会分配10MB内存给当前用户。<br>2， 当用户连接多时<br>a) 手动PGA内存管理会完全按照预设值分配内存。如果物理内存总量为1G，排序区设为5MB，当有300个用户连接时，Oracle会分配1.5G的内存，这已经超过了我们的实际物理内存！<br>b) 自动PGA内存管理会根据当前连接情况进行分配。如果物理内存总量为1G，PGA_AGGREGATE_TARGET为300MB，当用户数从10升到300时，每个用户连接的内存会从满足需要的10MB慢慢减少到1.3MB，虽然最后总量也会超过PGA_AGGREGATE_TARGET，但比起手动PGA内存管理要好很多了。<br><br>什么时候使用自动PGA内存管理？什么时候使用手动PGA内存管理？<br>白天系统正常运行时适合使用自动PGA内存管理，让Oracle根据当前负载自动管理、分配PGA内存。<br>夜里用户数少、进行维护的时候可以设定当前会话使用手动PGA内存管理，让当前的维护操作获得尽可能多的内存，加快执行速度。<br><br>如：服务器平时运行在自动PGA内存管理模式下，夜里有个任务要大表进行排序连接后更新，就可以在该操作session中临时更改为手动PGA内存管理，然后分配大的SORT_AREA_SIZE和HASH_AREA_SIZE（50%甚至80%内存，要确保无其他用户使用），这样能大大加快系统运行速度，又不影响白天高峰期对系统造成的影响。<br><br><br>六、操作命令<br>系统级更改：<br>ALTER SYSTEM SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL}；<br>ALTER SYSTEM SET PGA_AGGREGATE_TARGET=100000000;<br>ALTER SYSTEM SET SORT_AREA_SIZE = 65536 SCOPE = SPFILE；<br>ALTER SYSTEM SET HASH_AREA_SIZE = 65536 SCOPE = SPFILE；<br><br>会话级更改<br>ALTER SESSION SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL}；<br>ALTER SESSION SET SORT_AREA_SIZE = 65536；<br>ALTER SESSION SET HASH_AREA_SIZE = 65536；<br><br><br>七、学以致用<br>1，排序区：<br>pga_aggregate_target为100MB，单个查询能用到5%也就是5MB时排序所需时间<br><br>SQL&gt; create table sorttable as select * from all_objects;<br><br>表已创建。<br><br>SQL&gt; insert into sorttable (select * from sorttable);<br><br>已创建49735行。<br><br>SQL&gt; insert into sorttable (select * from sorttable);<br><br>已创建99470行。<br><br>SQL&gt; set timing on;<br>SQL&gt; set autotrace traceonly;<br>SQL&gt; select * from sorttable order by object_id;<br><br>已选择198940行。<br><br>已用时间: 00: 00: 50.49<br><br>Session级修改排序区为30mb所需时间<br>SQL&gt; ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL;<br><br>会话已更改。<br><br>已用时间: 00: 00: 00.02<br>SQL&gt; ALTER SESSION SET SORT_AREA_SIZE = 30000000;<br><br>会话已更改。<br><br>已用时间: 00: 00: 00.01<br>SQL&gt; select * from sorttable order by object_id;<br><br>已选择198940行。<br><br>已用时间: 00: 00: 10.76<br><br>可以看到所需时间从50.49秒减少到10.31秒，速度提升很明显。<br><br>2，散列区：<br>pga_aggregate_target为100MB，单个查询能用到5%也就是5MB时表连接所需时间<br><br>SQL&gt; select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;<br><br>已选择49735行。<br><br>已用时间: 00: 00: 40.50<br><br>Session级修改散列区为30mb所需时间<br>SQL&gt; ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL;<br><br>会话已更改。<br><br>已用时间: 00: 00: 00.01<br>SQL&gt; ALTER SESSION SET HASH_AREA_SIZE = 30000000;<br><br>会话已更改。<br><br>已用时间: 00: 00: 00.01<br>SQL&gt; select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;<br><br>已选择49735行。<br><br>已用时间: 00: 00: 04.47<br><br>所需时间由40.50秒提升到4.47秒，效果同样很明显。<br><br>备注：以上<a onclick="javascript:tagshow(event, '%CA%B5%D1%E9');" href="javascript:;" target=_self><u><strong>实验</strong></u></a>皆执行全表扫描保证相关表读入缓冲区中，避免因数据没读入缓存造成误差。<br><br><br>结论：在9iR2版以后，PGA不再像以前那样困扰DBA了，Oracle会帮我们做好PGA的分配。但这并不意味着DBA不需要深入了解PGA了，掌握PGA并根据适当应用会让工作如虎添翼。<br>
<img src ="http://www.cnitblog.com/conish/aggbug/62360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/conish/" target="_blank">风花雪月</a> 2009-11-02 18:26 <a href="http://www.cnitblog.com/conish/archive/2009/11/02/62360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>检查点SCN</title><link>http://www.cnitblog.com/conish/archive/2009/11/02/62359.html</link><dc:creator>风花雪月</dc:creator><author>风花雪月</author><pubDate>Mon, 02 Nov 2009 10:25:00 GMT</pubDate><guid>http://www.cnitblog.com/conish/archive/2009/11/02/62359.html</guid><wfw:comment>http://www.cnitblog.com/conish/comments/62359.html</wfw:comment><comments>http://www.cnitblog.com/conish/archive/2009/11/02/62359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/conish/comments/commentRss/62359.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/conish/services/trackbacks/62359.html</trackback:ping><description><![CDATA[<div>一、检查点概述<br>大多数关系型<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target=_self><u><strong><font color=#0000ff>数据库</font></strong></u></a>都采用"在提交时并不强迫针对数据块的修改完成"而是"提交时保证修改记录（以重做日志的形式）写入日志文件"的机制，来获得性能的优势。这句话的另外一种描述是：当用户提交事务，写数据文件是"异步"的，写日志文件是"同步"的。这就可能导致数据库实例崩溃时，内存中的DB_Buffer 中的修改过的数据，可能没有写入到数据块中。数据库在重新打开时，需要进行恢复，来恢复DB Buffer 中的数据状态，并确保已经提交的数据被写入到数据块中。检查点是这个过程中的重要机制，通过它来确定，恢复时哪些重做日志应该被扫描并应用于恢复。<br>要了解这个检查点，首先要知道checkpoint queu概念，检查点发生后，触发dbwn，CKPT获取发生检查点时对应的SCN，通知DBWn要写到这个SCN为止，<br>dbwr 写dirty buffer 是根据 buffer 在被首次 modify的时候的时间的顺序写出，也就是 buffer被modify 的时候会进入一个queue （checkpoint queue），dbwr 就根据queue从其中批量地写到数据文件。 由于这里有一个顺序的关系，所以 dbwr的写的进度就是可衡量的，写到哪个buffer的时候该buffer的首次变化时候的scn就是当前所有数据文件block的最新scn，但是由于无法适时的将dbwr的进度记录下来，所以<a onclick="javascript:tagshow(event, 'oracle');" href="javascript:;" target=_self><u><strong><font color=#0000ff>oracle</font></strong></u></a> 选择了一些策略。 其中就包括ckpt进程的检查点和心跳。<br>检查点发生以后，CKPT进程检查checkpoint queue(也就是脏块链表)是否过长，如果是，则触发DBWn，将一部分脏块写入数据文件，从而缩短checkpoint queue。</div>
<div>checkpoint 发生时，一方面通知dbwr进行下一批写操作，（dbwr 写入的时候，一次写的块数是有一个批量写的隐藏参数控制的。）另一方面，oracle 采用了一个心跳的概念，以3秒的频率将dbwr 写的进度反应到控制文件中，也就是把dbwr当前刚写完的dirty buffer对应的scn 写入数据文件头和控制文件，这就是检查点scn。<br>这个3秒和增量检查点不是一个概念，3秒只是在控制文件中，ckpt 进程去更新当前 dbwr写到哪里了，这个对于 ckpt 进程来说叫 heartbeat ，heartbeat是3秒一次，3秒可以看作不停的检查并记录检查点执行情况（DBWR的写进度）。<br>检查点发生之后数据库的数据文件、控制文件处于一致状态的含义是不需要进行 介质恢复，只表示数据文件头一致，但是并不表示数据文件内容一致，因为数据文件内容可能在没有发生检查点的其他情况下的dbwr写数据文件，这样数据文件内容就不一致，若掉电需要进行崩溃恢复。<br>二、触发的条件<br>这里需要明白两个概念"完全检查点和增量检查点"的区别。<br>增量检查点（incremental checkpoint）<br>oracle8以后推出了incremental checkpoint的机制，在以前的版本里每checkpoint时都会做一个full thread checkpoint,这样的话所有脏数据会被写到磁盘，巨大的i/o对系统性能带来很大影响。为了解决这个问题，oracle引入了checkpoint queue机制，每一个脏块会被移到检查点队列里面去，按照low rdb（第一次对此块修改对应的redo block address）来排列，靠近检查点队列尾端的数据块的low rba值是最小的，而且如果这些赃块被再次修改后它在检查点队列里的顺序也不会改变，这样就保证了越早修改的块越早写入磁盘。每隔3秒钟ckpt会去更新控制文件和数据文件，记录checkpoint执行的情况。<br>在运行的Oracle 数据中，有很多事件、条件或者参数来触发检查点。比如<br>当已通过正常事务处理或者立即选项关闭例程时；（shutdown immediate或者Shutdown normal;）<br>当通过设置初始化参数LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT 和FAST_START_IO_TARGET 强制时；<br>当数据库<a onclick="javascript:tagshow(event, '%B9%DC%C0%ED');" href="javascript:;" target=_self><u><strong><font color=#0000ff>管理</font></strong></u></a>员手动请求时；（ALter system checkpoint）<br>alter tablespace ... offline;<br>每次日志切换时;（alter system switch logfile）<br>需要说明的是，alter system switch logfile也将触发完全检查点的发生。<br>alter database datafile ... offline不会触发检查点进程。<br>如果是单纯的offline datafile，那么将不会触发文件检查点，只有针对offline tablespace的时候才会触发文件检查点，这也是为什么online datafile需要media recovery而online tablespace不需要。<br>对于表空间的offline后再online这种情况，最好做个强制的checkpoint比较好。<br>　　上面几种情况，将触发完全检查点，促使DBWR 将检查点时刻前所有的脏数据写入数据文件。<br>另外，一般正常运行期间的数据库不会产生完全检查点，下面很多事件将导致增量检查点，比如：<br>在联机热<a onclick="javascript:tagshow(event, '%B1%B8%B7%DD');" href="javascript:;" target=_self><u><strong><font color=#0000ff>备份</font></strong></u></a>数据文件前，要求该数据文件中被修改的块从DB_Buffer 写入数据文件中。所以，发出这样的命令：<br>ALTER TABLESPACE tablespace_name BIGEN BACKUP &amp; end backup; 也将触发和该表空间的数据文件有关的局部检查点；另外，<br>ALTER TABLESPACE tablespace_name READ ONLY;<br>ALTER TABLESPACE tablespace_name OFFLINE NORMAL;<br>等命令都会触发增量检查点。</div>
<div>关于检查点的一点具体应用讨论：<br>Commit成功后，数据还会丢失吗？<br>对于Oracle来说，用户所做的DML操作一旦被提交，则先是在database buffer cache 中进行修改，同时在修改之前会将数据的前镜像保存在回滚段中，然后将修改之前和修改之后的数据都写入到redo log buffer中，当接收到commit命令之后，则redo log buffer开始写redo log file ，并且记录此时的scn，当redo log file 写完了之后，表示这次事务提交操作已经确认被数据库记录了，只有当redo log file 写成功了，才会给用户 Commit completed 的成功字样。而对于Database buffer cache中的dirty buffer则会等待触发DBWn才写入，但是如果此时断电，则数据已经被记录到了redo log file中，系统在重新启动的时候，会自动进行嵌滚和回滚来保证数据的一致。所以，只要是commit成功的了，数据不会丢失！</div>
<div>数据库发生一次DBWn，是否将所有buffer cache 中的dirty buffer 都写入，还是先将脏队列中的数据写入？</div>
<div>这话看起来有道理，但实际上，dbwr在写的时候又不断地在产生dirty buffer ,所以说检查点发生的时候是期望把该时间点之前的所有脏缓冲区写入数据文件。<br>所有的buffer，不在LRU list上就在dirty list上, dbwr写入的时候，一次写的块数是有一个批量写的隐藏参数控制的。<br>所以说要是 dbwr将 dirty list也好， lru list上的也好，要实现全部写入，都是一个现实系统中很难存在的现象。dirty 总是在不断的产生，dbwr总是在不断地写,增量检查点发生的时候也并不意味着一定要更新数据文件头，检查点开始的时候只表示该次检查点结束的时候要更新数据文件头的话数据文件头具有该时间点的一致性。<br>关于检查点等待事件：<br>有些事件的产生必须等待检查点的完成，才能开始数据库的其它操作：<br>日志文件切换就是其中一个事件，日志切换必须等待检查点完成。<br>log file switch (checkpoint incomplete) 这个等待事件本身也说明，日志切换时产生的检查点是需要等待的，这个日志文件所对应脏块全部写完后，检查点进程更新控制文件和数据头，然后这个检查点才能算完成。<br>也就是说日志切换必须等待检查点完成，而检查点在等待DBWn完成。<br>这种等待DBWn完成的检查点，最后一步写入控制文件和数据文件头的SCN，肯定是DBWn完成的最后一块的SCN。<br>检查点为什么要等待dbwr完成后才进行切换（log switch）？<br>log switch时，是不能立即switch到active状态的，log group必须等待。active表示该log group还没有完成归档（归档模式下）或者该log group有进行instance recovery的需要用到的日志。所以当checkpoint发生时，如果dbwr还没有写完它该写完的dirty buffers（该checkpoint时间点以前产生的dirty buffers, 靠scn判断），则该log group处于active状态，不会进行日志切换，当然也不会发生日志文件被覆盖的问题了。<br>如果没有设置archive log ，在检查点发生后，发生log switch一个轮回，log file是否会被覆盖掉？<br>当检查点发生后，会触发lgwr，lgwr会把此时SCN以前在redo buffer中的所有操作写到redo log file，同时lgwr也会触发dbwr进程，dbwr也开始把此刻以前database buffer中的dirty buffer队列中的操作写入data file。<br>其实检查点发生后，就是lgwr和dbwr写buffer到磁盘文件的过程，但是两者的读写速度时不同的，dbwr写buffer到数据文件的过程相对较慢，因为dbwr写过程是一个随机读取存储的过程。Lgwr写buffer到redo文件的过程比dbwr要快很多，因为lgwr是顺序读取写入的。<br>由于以上lgwr和dbwr写操作的速度不同，就产生了一个等待问题。即当lgwr<br>轮循一圈后，要进行日志切换，覆盖redo log file，但是此时dbwr还没有写完，那么lgwr就会出现等待，oracle也会hang在那里，同时alter文件中会提示一个相应的提示checkpoint not complete。等检查点完成后数据库自动恢复正常。<br>当log switch时，会触发检查点，标记检查点时，DBWR要把log file中covered by the log being checkpointed的数据写入到数据文件上，如果Dbwr没有写完，那么前一个logfile是不能被覆盖的。因此必须等检查点完毕，也可以说是将 要被覆盖的日志相关的数据块全部写入数据文件后，该日志文件才能被覆盖！<br>如果这种情况出现，alert文件中会记录checkpoint not complete事件，这通常表明你的dbwr写入过慢或者logfile组数过少或log file太小。</div>
<div>检查点发生时，出现日志切换，但是dbwr还没有写完，是否会覆盖redo log file，如果此时掉电，dbwr挂起，会出现丢失数据吗？<br>答：不会覆盖redo文件，要等待dbwr写完才覆盖。或者说要等待检查点完成才覆盖。<br>如果DBWn正在写的脏块是指对应到即将被覆盖的那个日志文件的，那么，因为在这些操作完成之前，不可能有覆盖这件事发生，假设你预料的掉电发生了，不会有什么问题，实例恢复时的前滚从刚才准备覆盖的那个日志文件开始。</div>
<div>如果正在写的脏块是指对应到刚刚被写满的那个日志文件的，肯定一时半会也写不完，日志切换也不会等它，如果切换成功后dbwr挂了，后面的写脏块操作估计也还没完成，但是，刚写满的那个文件并没有被覆盖，也不会有任何问题。<br>因此不会出现数据丢失！<br>当一个很大的dml发生时，用户在commit后，需要将redo log buffer中的脏数据写入redo log file中。如果在写的过程中，发现一个redo log file写不下的话，需要写另外一个redo log file，这时应该触发checkpoint，接着触发DBWn，将脏数据写入datafile，这时发生掉电，导致DBWR失败。这时其实就可以说commit失败了。以上所述其实就是commit没有提交成功。</div>
<div>alter systen switch logfile会触发完全检查点;但是为什么，日志切换以后检查点只能记录到上一次归档日志产生的时间呢？而不是现在归档日志产生的时间呢？<br>因为这时的checkpoint enqueue队列中，也就是脏块队列中脏块还不够多，还不足以触发DBWn写脏块。所以，内存里需要写入的脏块所对应的redo还存在于上一个redo log里，这时你去看该redo log的status为active。<br>下面操作日志中出现当前redo log的status为current，而上一个redo log的status为active就说明了这一切。上一个redo log的status为active正是说明在上一个redo log中还存在未写入datafile的block所对应的redo。<br>SQL&gt; create table gaojf3 as select * from all_objects;<br>Table created<br>SQL&gt; insert into gaojf3 select * from gaojf3;<br>29630 rows inserted<br>SQL&gt; /<br>59260 rows inserted<br>SQL&gt; commit;<br>Commit complete<br>SQL&gt; select * from x$kccrt;<br>ADDR INDX INST_ID RTNUM RTSTA RTCKP_SCN RTCKP_TIM RTCKP_THR RTCKP_RBA_SEQ RTCKP_RBA_BNO RTCKP_RBA_BOF RTCKP_ETB RTOTF RTOTB RTNLF RTLFH RTLFT RTCLN RTSEQ RTENB RTETS RTDIS RTDIT RTLHP RTSID RTOTS<br>-------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ------------- ------------- ------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------------- -------------------- ---------- ---------------- --------------------<br>421A54D0 0 1 1 15 8796119126928 08/08/2006 00:28:38 1 14 2 16 0200000000000000 0 0 3 1 3 1 14 8796117861680 08/02/2006 02:29:36 0 13 cicro 08/02/2006 02:33:50<br>SQL&gt; alter system switch logfile;<br>System altered<br>SQL&gt; select * from x$kccrt;<br>ADDR INDX INST_ID RTNUM RTSTA RTCKP_SCN RTCKP_TIM RTCKP_THR RTCKP_RBA_SEQ RTCKP_RBA_BNO RTCKP_RBA_BOF RTCKP_ETB RTOTF RTOTB RTNLF RTLFH RTLFT RTCLN RTSEQ RTENB RTETS RTDIS RTDIT RTLHP RTSID RTOTS<br>-------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ------------- ------------- ------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------------- -------------------- ---------- ---------------- --------------------<br>421A54D0 0 1 1 15 8796119126928 08/08/2006 00:28:38 1 14 2 16 0200000000000000 0 0 3 1 3 2 15 8796117861680 08/02/2006 02:29:36 0 14 cicro 08/02/2006 02:33:50<br>SQL&gt; select * from x$kccrt;<br>ADDR INDX INST_ID RTNUM RTSTA RTCKP_SCN RTCKP_TIM RTCKP_THR RTCKP_RBA_SEQ RTCKP_RBA_BNO RTCKP_RBA_BOF RTCKP_ETB RTOTF RTOTB RTNLF RTLFH RTLFT RTCLN RTSEQ RTENB RTETS RTDIS RTDIT RTLHP RTSID RTOTS<br>-------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ------------- ------------- ------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------------- -------------------- ---------- ---------------- --------------------<br>421A54D0 0 1 1 15 8796119126928 08/08/2006 00:28:38 1 14 2 16 0200000000000000 0 0 3 1 3 2 15 8796117861680 08/02/2006 02:29:36 0 14 cicro 08/02/2006 02:33:50<br>SQL&gt; select * from x$kccrt;<br>ADDR INDX INST_ID RTNUM RTSTA RTCKP_SCN RTCKP_TIM RTCKP_THR RTCKP_RBA_SEQ RTCKP_RBA_BNO RTCKP_RBA_BOF RTCKP_ETB RTOTF RTOTB RTNLF RTLFH RTLFT RTCLN RTSEQ RTENB RTETS RTDIS RTDIT RTLHP RTSID RTOTS<br>-------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ------------- ------------- ------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------------- -------------------- ---------- ---------------- --------------------<br>421A54D0 0 1 1 15 8796119128114 08/08/2006 00:35:51 1 15 2 16 0200000000000000 0 0 3 1 3 3 16 8796117861680 08/02/2006 02:29:36 0 15 cicro 08/02/2006 02:33:50<br>从上面试验中可以看到，完全检查点正在执行，还没有执行完毕。因此，切换日志前后察看x$kccrt，看到的RTCKP_SCN, RTCKP_TIM没有发生变化。等检查点执行完毕后（也就是检查点触发的dbwr执行完写操作后），rtckp_scn, rtckp_tim才发生变化。</div>
<img src ="http://www.cnitblog.com/conish/aggbug/62359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/conish/" target="_blank">风花雪月</a> 2009-11-02 18:25 <a href="http://www.cnitblog.com/conish/archive/2009/11/02/62359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手动创建oracle数据库</title><link>http://www.cnitblog.com/conish/archive/2009/05/29/58888.html</link><dc:creator>风花雪月</dc:creator><author>风花雪月</author><pubDate>Fri, 29 May 2009 08:46:00 GMT</pubDate><guid>http://www.cnitblog.com/conish/archive/2009/05/29/58888.html</guid><wfw:comment>http://www.cnitblog.com/conish/comments/58888.html</wfw:comment><comments>http://www.cnitblog.com/conish/archive/2009/05/29/58888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/conish/comments/commentRss/58888.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/conish/services/trackbacks/58888.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">1.首先进入到dbs目录设置环境变量:$vi&nbsp;conish.env<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>ORACLE_BASE=/u01<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>ORACLE_HOME=$ORACLE_BASE/oracle<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>ORACLE_SID=yangyao<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>ORACLE_NLS33=$ORACLE_HOME/ocommon/nls/admin/data<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>PATH=$ORACLE_HOME/bin:$PATH<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>export&nbsp;ORACLE_BASE&nbsp;ORACLE_HOME&nbsp;ORACLE_SID&nbsp;ORACLE_NLS33&nbsp;PATH&nbsp;LD_LIBRARY_PATH<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>2.创建初始化文件&nbsp;$string&nbsp;spfiledenver.ora&nbsp;&gt;&nbsp;spfileyangyao.ora<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>3.创建密码文件：$orapwd&nbsp;file=orapwyangyao&nbsp;password=5811419&nbsp;entries=10<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>4.然后再/u01/oradata/下创建ORACLE_SID目录，$mkdir&nbsp;yangyao&nbsp;例如/u01/oradata/yangyao<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>5.创建数据库创建脚本：$vi&nbsp;crdb01.sql<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>CREATE&nbsp;DATABASE&nbsp;"yangyao"<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>MAXDATAFILES&nbsp;500<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>MAXINSTANCES&nbsp;8<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>MAXLOGFILES&nbsp;32<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>CHARACTER&nbsp;SET&nbsp;UTF8<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>NATIONAL&nbsp;CHARACTER&nbsp;SET&nbsp;AL16UTF16<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>ARCHIVELOG<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>DATAFILE&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;'/u01/oradata/yangyao/system01.dbf'&nbsp;SIZE&nbsp;300M<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>EXTENT&nbsp;MANAGEMENT&nbsp;LOCAL<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>DEFAULT&nbsp;TEMPORARY&nbsp;TABLESPACE&nbsp;temp&nbsp;TEMPFILE&nbsp;'/u01/oradata/yangyao/tempts01.dbf'&nbsp;SIZE&nbsp;10OM<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>EXTENT&nbsp;MANAGEMENT&nbsp;LOCAL<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>UNDO&nbsp;TABLESPACE&nbsp;"UNDOTBS1"<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>DATAFILE&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;'/u01/oradata/yangyao/undotbs01.dbf'&nbsp;SIZE&nbsp;200M<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>LOGFILE<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>LOGFILE&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;GROUP&nbsp;1&nbsp;('/u01/oradata/yangyao/redo01a.rdo',<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;'/u01/oradata/yangyao/redo01b.rdo')&nbsp;SIZE&nbsp;100M,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;GROUP&nbsp;2&nbsp;('/u01/oradata/yangyao/redo02a.rdo',<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;'/u01/oradata/yangyao/redo02b.rdo')&nbsp;SIZE&nbsp;100M,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;GROUP&nbsp;3&nbsp;('/u01/oradata/yangyao/redo03a.rdo',<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;'/u01/oradata/yangyao/redo03b.rdo')&nbsp;SIZE&nbsp;100M;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>6.在/u01/admin/下创建ORACLE_SID目录，例如/u01/admin/yangyao,然后在这个目录下创建五个目录分别为；<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>$mkdir&nbsp;bdump&nbsp;$mkdir&nbsp;cdump,$mkdir&nbsp;create,$mkdir&nbsp;pfile,$mkdir&nbsp;udump<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>/u01/admin/yangyao/bdump,/u01/admin/yangyao/cdump,/u01/admin/yangyao/create/,/u01/admin/yangyao/pfile,<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>/u01/admin/yangyao/udump<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>7.$sqlplus&nbsp;/nolog<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>8.&gt;conn&nbsp;/as&nbsp;sysdba<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>9.&gt;startup&nbsp;nomount<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>10.&gt;@$ORACLE_HOME/dbs/crdbo1.sql;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>11.创建用户表空间：&gt;create&nbsp;tablespace&nbsp;mytbs&nbsp;datafile&nbsp;'/u01/oradata/yangyaomytbs01.dbf'&nbsp;size&nbsp;100M&nbsp;extent&nbsp;management&nbsp;local;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>12.创建数据字典：&gt;spool&nbsp;log01.log<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&gt;@?/rdbms/admin/catalog.sql<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&gt;spool&nbsp;log02.log<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&gt;@?/rdbms/admin/catproc.sql<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&gt;spool&nbsp;log03.log<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&gt;@?/sqlplus/admin/pupbld.sql<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cnitblog.com/conish/aggbug/58888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/conish/" target="_blank">风花雪月</a> 2009-05-29 16:46 <a href="http://www.cnitblog.com/conish/archive/2009/05/29/58888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>