<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>idv2 &#187; oracle</title>
	<atom:link href="http://tech.idv2.com/tag/oracle/feed/" rel="self" type="application/rss+xml" />
	<link>http://tech.idv2.com</link>
	<description>关注Web开发技术，关注Internet。</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:54:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Oracle DBA学习笔记</title>
		<link>http://tech.idv2.com/2006/10/03/oracle-dba-note/</link>
		<comments>http://tech.idv2.com/2006/10/03/oracle-dba-note/#comments</comments>
		<pubDate>Mon, 02 Oct 2006 16:18:29 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[dba]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archives/181.html</guid>
		<description><![CDATA[<span id="more-181"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_1"></a>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_0">  数据库、安装等</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_1">  初始化参数</a></li>
<li><a href="#content_1_2">  建立数据库</a></li>
<li><a href="#content_1_3">  数据库模板</a></li>
<li><a href="#content_1_4">  OFA</a></li>
<li><a href="#content_1_5">  Oracle Universal Installer</a></li>
<li><a href="#content_1_6">  监察(audit)</a></li></ul></li>
<li><a href="#content_1_7">  控制文件</a></li>
<li><a href="#content_1_8">  段</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_9">  自动段(Segment)管理</a></li>
<li><a href="#content_1_10">  段类型</a></li>
<li><a href="#content_1_11">  rollback 段</a></li></ul></li>
<li><a href="#content_1_12">  范围(extent)</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_13">  范围(extent)管理</a></li></ul></li>
<li><a href="#content_1_14">  表空间</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_15">  默认表空间</a></li>
<li><a href="#content_1_16">  临时表空间</a></li>
<li><a href="#content_1_17">  表空间管理</a></li></ul></li>
<li><a href="#content_1_18">  索引</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_19">  索引</a></li>
<li><a href="#content_1_20">  监视索引</a></li></ul></li>
<li><a href="#content_1_21">  表</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_22">  临时表</a></li>
<li><a href="#content_1_23">  创建表时的注意事项</a></li></ul></li>
<li><a href="#content_1_24">  表约束</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_25">  约束延迟</a></li></ul></li>
<li><a href="#content_1_26">  一致性</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_27">  读取一致性</a></li></ul></li>
<li><a href="#content_1_28">  日志(REDO Log)</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_29">  checkpoint的发生条件</a></li>
<li><a href="#content_1_30">  日志的archive</a></li></ul></li>
<li><a href="#content_1_31">  UNDO</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_32">  建立</a></li>
<li><a href="#content_1_33">  UNDO表空间管理</a></li>
<li><a href="#content_1_34">  自动UNDO表空间管理的参数</a></li></ul></li>
<li><a href="#content_1_35">  数据字典</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_36">  数据字典</a></li>
<li><a href="#content_1_37">  动态性能视图</a></li></ul></li>
<li><a href="#content_1_38">  权限管理</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_1_39">  用户</a></li>
<li><a href="#content_1_40">  操作系统认证</a></li>
<li><a href="#content_1_41">  角色</a></li>
<li><a href="#content_1_42">  权限</a></li>
<li><a href="#content_1_43">  密码</a></li>
<li><a href="#content_1_44">  策略(profile)</a></li></ul></li>
<li><a href="#content_1_45">  SQL*Plus</a></li></ul>
</div>

<hr class="full_hr" />
<h2 id="content_1_0">数据库、安装等</h2>

<h3 id="content_1_1">初始化参数</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>MAX_ENABLED_ROLES</strong>：用户拥有的有效角色的最大值</li>
<li><strong>DB_CACHE_SIZE</strong>：数据库缓存大小</li></ul>

<h3 id="content_1_2">建立数据库</h3>
<p>建立数据库之前需要考虑以下条件。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>拥有SYSDBA权限</li>
<li>若使用操作系统认证，则需要建立相关操作系统帐户，
若使用密码文件认证，则需要建立密码文件</li>
<li>足够的内存</li>
<li>足够的磁盘空间</li></ul>
<p>建立数据库时执行的脚本：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">sql.bsq</td><td class="style_td">建立数据字典的表</td><td class="style_td">建立数据库时由Oracle自动执行</td></tr><tr><td class="style_td">catalog.sql</td><td class="style_td">建立数据字典视图</td><td class="style_td">建立数据库之后由管理者手动执行</td></tr></tbody></table></div>

<h3 id="content_1_3">数据库模板</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>仅包括数据库结构的模板
<ul class="list2" style="padding-left:16px;margin-left:16px"><li>表空间</li>
<li>数据文件</li>
<li>初始化参数</li></ul></li>
<li>包括数据库结构和用户数据的模板
<ul class="list2" style="padding-left:16px;margin-left:16px"><li>表空间</li>
<li>数据文件</li>
<li>初始化参数</li>
<li>用户schema</li>
<li>用户数据</li></ul></li></ul>

<h3 id="content_1_4">OFA</h3>
<p><strong>Optimal Flexible Architecture</strong>，Oracle推荐的目录结构，
将数据文件、控制文件、日志等分散在多个磁盘中。好处：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>能轻易地区分数据文件和系统文件</li>
<li>可以简单地识别控制文件、数据文件、日志等</li>
<li>同一台服务器上建立多个Oracle数据库时降低管理难度</li>
<li>通过分散数据文件，减少读写文件时的冲突，提高性能</li></ul>

<h3 id="content_1_5">Oracle Universal Installer</h3>
<p>启动之前需要建立拥有 Oracle 的系统帐户（oracle用户、dba组、oinstall组）</p>

<h3 id="content_1_6">监察(audit)</h3>
<p>使监察有效：设置初始化参数 AUDIT_TRAIL=DB|OS|NONE</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>DB: 监察记录写到 SYS.AUD$</li>
<li>OS: 监察记录写道操作系统日志中</li></ul>

<h2 id="content_1_7">控制文件</h2>
<p>使用 CREATE CONTROLFILE 命令建立控制文件。</p>
<p>使用OMF(Oracle-Managed Files)管理文件时也能用CREATE CONTROLFILE命令建立控制文件，
但必须要指定 DATAFILE 和 LOGFILE。</p>
<p>可以过以下方法察看控制文件：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>V$CONTROLFILES</li>
<li>V$PARAMETERS</li>
<li>show parameters 命令</li></ul>
<p>控制文件在以下情况下更新。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">数据文件和REDO日志文件的名称和位置</td><td class="style_td">数据库中添加、更改或删除数据文件和REDO日志文件时</td></tr><tr><td class="style_td">表空间信息</td><td class="style_td">添加或删除表空间时</td></tr><tr><td class="style_td">REDO日志的历史记录</td><td class="style_td">日志切换时</td></tr><tr><td class="style_td">备份日志的位置和状态</td><td class="style_td">日志备份发生时</td></tr><tr><td class="style_td">备份的位置和状态</td><td class="style_td">由Recovery Manager记录</td></tr><tr><td class="style_td">现在的日志序号</td><td class="style_td">日志切换时</td></tr><tr><td class="style_td">checkpoint信息</td><td class="style_td">checkpoint执行时</td></tr></tbody></table></div>

<h2 id="content_1_8">段</h2>

<h3 id="content_1_9">自动段(Segment)管理</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>自动管理 PCTUSED、FREELISTS、FREELIST GROUPS参数</li>
<li>提高空间利用率、提高并行数据插入的性能</li>
<li>使用位图（而不是空闲列表）管理段内的空闲空间，插入数据时通过位图查找大小合适的数据块。</li>
<li>不能保存LOB段和包含LOB列的表</li></ul>

<h3 id="content_1_10">段类型</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>表(Table)</li>
<li>分区表(Partition Table)</li>
<li>簇(Cluster)</li>
<li>索引(Index)</li>
<li>索引组织表(Index-organized Table, IOT)</li>
<li>分区索引(Partition Index)</li>
<li>UNDO段</li>
<li>临时段：查询和建立索引时排序用</li>
<li>LOB</li>
<li>嵌套表(Nested Table)</li>
<li>bootstrap：打开数据库时初始化数据字典时使用的段</li></ul>
<p>其中UNDO段和临时段为系统建立，不属于 schema 对象。</p>

<h3 id="content_1_11">rollback 段</h3>
<p>包括<strong>系统rollback段</strong>、<strong>非系统rollback段</strong>、<strong>延迟rollback段</strong>三种。</p>
<dl class="list1" style="padding-left:16px;margin-left:16px"><dt>系统rollback段</dt>
<dd>创建数据库时创建，仅当系统表空间内的对象发生变化时使用</dd>
<dt>非系统rollback段</dt>
<dd>自动管理、手动管理</dd>
<dt>延迟rollback段</dt>
<dd>事务进行时，表空间以 NORMAL 以外的方式脱机，事务信息将被保存在延迟rollback段中以便表空间联机时恢复事务。由oracle自动管理。</dd></dl>

<h2 id="content_1_12">范围(extent)</h2>

<h3 id="content_1_13">范围(extent)管理</h3>
<p>手动分配</p>
<pre>ALTER TABME emp ALLOCATE EXTENT [(SIZE size DATAFILE 'filename)]</pre>

<h2 id="content_1_14">表空间</h2>

<h3 id="content_1_15">默认表空间</h3>
<p>创建表时如果不指定表空间，则建立在schema规定的默认表领域中。</p>

<h3 id="content_1_16">临时表空间</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>创建：CREATE TEMPORARY TABLESPACE 语句，默认使用字典方式管理</li>
<li>更改默认临时表空间：ALTER DATABSE DEFAULT TEMPORARY TABLESPACE 语句。</li></ul>

<h3 id="content_1_17">表空间管理</h3>
<p>local表空间管理方式不能更改其存储参数(STORAGE)。
字典管理方式下可以更改存储参数。</p>
<p>Oracle9i中默认管理方式为local管理，8i 为字典管理。
9i中可以通过 EXTENT MANAGEMENT DICTIONARY 来指定字典管理方式。</p>
<p>使用 ALTER TABLESPACE user01 OFFLINE NORMAL 将表空间设置为OFFLINE的动作
会同时被记录到控制文件和数据字典中。</p>

<h2 id="content_1_18">索引</h2>

<h3 id="content_1_19">索引</h3>
<p>通过 ALTER INDEX ... REBUILD 语句重新建立索引有以下特征：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>根据原有索引来建立新索引</li>
<li>不需要排序</li>
<li>建立时需要有足够的空间来容纳新旧索引。建立完毕后旧索引会被删除</li>
<li>建立的索引中不包括已删除的数据</li>
<li>建立过程中依然可以通过旧索引进行查询</li></ul>

<h3 id="content_1_20">监视索引</h3>
<p>通过下面的方法来监视索引是否被使用。</p>
<pre>ALTER INDEX ... MONITORING USAGE;</pre>
<p>之后通过 V$OBJECT_USAGE 来确认索引的使用情况。例如</p>
<pre>ALTER INDEX numb_oe_index MONITORING USAGE;     -- 监视开始
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
SELECT COUNT(*) FROM numbers WHERE odd_even='E';  -- 在numbers表上执行查询
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
ALTER SESSION SET optimizer_mode=first_rows;    -- 修改优化器为cost base
SELECT COUNT(*) FROM numbers WHERE odd_even='E';  -- 在numbers表上执行查询
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
ALTER INDEX numb_oe_index NOMONITORING USAGE;   -- 监视停止</pre>

<h2 id="content_1_21">表</h2>

<h3 id="content_1_22">临时表</h3>
<p>临时表仅在当前会话或者当前事务中存在。
其生命期由 CREATE GLOBAL TEMPORARY TABLE语句的参数决定。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>ON COMMIT DELETE ROWS：（默认）事务范围内存在</li>
<li>ON COMMIT PRESERVE ROWS：会话范围内存在</li></ul>
<p><strong>特性</strong></p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>针对临时表的DML操作不锁定、不生成REDO日志</li>
<li>可以针对临时表建立索引、视图、触发器。</li>
<li>可以通过工具导入/导出其定义，但无法导出数据。</li></ul>

<h3 id="content_1_23">创建表时的注意事项</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>rollback segment、临时段、索引等放在不同的表空间，防止出现碎片</li>
<li>尽可能少地分配 extent 以减少碎片</li>
<li>尽量使用 local 管理以降低 overhead</li></ul>

<h2 id="content_1_24">表约束</h2>

<h3 id="content_1_25">约束延迟</h3>
<p>创建约束时通过 [NOT] DEFERRABLE INITIALLY {IMMEDIATE|DEFERRED} 来设置延迟。
<strong>延迟</strong>即为事务提交时检查约束，反之则在语句执行时检查约束。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>NOT DEFERRABLE</strong> 不能延迟</li>
<li><strong>DEFERRABLE INITIALLY IMMEDIATE</strong> 能够延迟，但默认情况下为不延迟。DEFERRABLE 情况下的的默认设置</li>
<li><strong>DEFERRABLE INITIALLY DEFERRABLE</strong> 能够延迟，默认情况下为延迟</li></ul>
<p>修改延迟设置：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>ALTER SESSION SET CONSTRANT[S] = {IMMEDIATE|DEFERRED|DEFAULT}</li>
<li>SET CONSTRANT[S] {constrant_name|ALL} {IMMEDIATE|DEFERRED}</li></ul>

<h2 id="content_1_26">一致性</h2>

<h3 id="content_1_27">读取一致性</h3>
<p>默认情况下是语句级别读取一致性。
通过 SET TRANSACTION READ ONLY 可以使用事务级读写一致性。</p>

<h2 id="content_1_28">日志(REDO Log)</h2>

<h3 id="content_1_29">checkpoint的发生条件</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>日志切换</li>
<li>SHUTDOWN ABORT以外的方式终止实例</li>
<li>由于FAST_START_MTTR_TARGET参数导致的强制执行</li>
<li>ALTER SYSTEM CHECKPOINT命令执行</li>
<li>OFFLINE NORMAL、READ ONLY、BEGIN BACKUP选项的 ALTER TABLESPACE命令</li></ul>

<h3 id="content_1_30">日志的archive</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>ARCHIVELOG模式：过去的日志文件被archive之后，才会被覆盖</li>
<li>ARCHIVELOG模式、NOARCHIVELOG模式：checkpoint结束之后过去的日志才会被覆盖</li></ul>

<h2 id="content_1_31">UNDO</h2>

<h3 id="content_1_32">建立</h3>
<p>建立数据库时建立：</p>
<pre>CREATE DATABASE ... UNDO TABLESPACE undo01 DATAFILE '...';</pre>
<p>建立数据库之后建立：</p>
<pre>CREATE UNDO TABLESPACE undo01 DATAFILE '...';</pre>

<h3 id="content_1_33">UNDO表空间管理</h3>
<p>如果系统中有事务正在执行，那么切换UNDO表空间</p>
<pre>ALTER SYSTEM SET undo_tablespace=undotbs2</pre>
<p>会造成</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>新的 UNDO 表空间中的 UNDO 段成为ONLINE状态</li>
<li>旧 UNDO 表空间中包含事务的 UNDO 段成为 PENDING OFFLINE 状态</li></ul>

<h3 id="content_1_34">自动UNDO表空间管理的参数</h3>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">UNDO_MANAGEMENT</td><td class="style_td">auto=自动管理 manual=手动管理</td></tr><tr><td class="style_td">UNDO_TABLESPACE</td><td class="style_td">指定有效的undo表空间</td></tr><tr><td class="style_td">UNDO_RETENTION</td><td class="style_td">UNDO数据的保存时间(秒)</td></tr><tr><td class="style_td">UNDO_SUPPRESS_ERRORS</td><td class="style_td">设置为true可以禁止显示 ORA_30019 错误信息</td></tr></tbody></table></div>

<h2 id="content_1_35">数据字典</h2>

<h3 id="content_1_36">数据字典</h3>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">DBA_TAB_PRIVS</td><td class="style_td">对象权限</td></tr><tr><td class="style_td">DBA_COL_PRIVS</td><td class="style_td">列权限</td></tr><tr><td class="style_td">DBA_SYS_PRIVS</td><td class="style_td">系统权限</td></tr><tr><td class="style_td">SESSION_PRIVS</td><td class="style_td">当前会话可以使用的系统权限</td></tr><tr><td class="style_td">DBA_ROLLBACK_SEGS</td><td class="style_td">所有的rollback段的信息，但不包括OPTIMAL值</td></tr><tr><td class="style_td">DBA_FREE_SPACES</td><td class="style_td">数据文件内可分配的连续空间的信息</td></tr><tr><td class="style_td">DBA_USERS</td><td class="style_td">包含用户的角色信息</td></tr></tbody></table></div>
<p><strong>数据字典视图</strong>由 catalog.sql 脚本建立。</p>

<h3 id="content_1_37">动态性能视图</h3>
<p>使用<strong>动态性能视图</strong>可以获得以下信息。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">V$DATAFILE</td><td class="style_td">数据文件</td></tr><tr><td class="style_td">V$INSTANCE</td><td class="style_td">数据库状态</td></tr><tr><td class="style_td">V$LOCK, V$LOCKED_OBJECT</td><td class="style_td">锁信息</td></tr><tr><td class="style_td">V$SESSION</td><td class="style_td">会话信息</td></tr><tr><td class="style_td">V$ROLLSTAT</td><td class="style_td">有效rollback段的信息</td></tr><tr><td class="style_td">V$ROLLNAME</td><td class="style_td">仅包含rollback段id和名称，通常和V$ROLLSTAT结合使用</td></tr></tbody></table></div>

<h2 id="content_1_38">权限管理</h2>

<h3 id="content_1_39">用户</h3>
<p>创建用户时使用 IDENTIFIED GLOBALLY AS 'external' 可以用<strong>企业目录服务</strong>(Enterprise Directory Service)进行用户认证。</p>

<h3 id="content_1_40">操作系统认证</h3>
<p>OS_AUTHENT_PREFIX参数值 + OS用户名 = Oracle用户名</p>

<h3 id="content_1_41">角色</h3>
<p>修改角色的条件：用户需要拥有 ALTER ANY ROLE 权限，或者以 WITH ADMIN OPTION 被赋予某个角色。</p>

<h3 id="content_1_42">权限</h3>
<p>DDL的系统权限在取消时不会连锁。例如 A -&gt; B with admin option，
B -&gt; C，那么 A 在 revoke B 时 B 赋予 C 的权限不会被自动取消。</p>

<h3 id="content_1_43">密码</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>PASSWORD_REUSE_TIME</strong>: 重复使用旧密码的最小间隔日数</li>
<li><strong>PASSWORD_REUSE_MAX</strong>: 重复使用旧密码之前，最少需要修改几次密码</li>
<li><strong>FAILED_LOGIN_ATTEMPTS</strong>: 密码错误超过规定次数以上则锁定帐户</li>
<li><strong>PASSWORD_LOCK_TIME</strong>: 帐户锁定时间</li>
<li><strong>PASSWORD_LIFE_TIME</strong>: 密码有效期限</li>
<li><strong>PASSWORD_GRACE_TIME</strong>: 密码过期后多长时间内必须修改密码</li>
<li><strong>PASSWORD_VERIFY_FUNCTION</strong>: 检查密码复杂度的函数</li></ul>
<p>执行 utlpwdmg.sql 可以建立默认的复杂度检查函数。</p>

<h3 id="content_1_44">策略(profile)</h3>
<p>创建策略：</p>
<pre>CREATE PROFILE dev_prof LIMIT
  IDLE_TIME 60
  SESSIONS_PER_USER 2
  CONNECT_TIME 30</pre>
<p>创建策略时的参数：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">CPU_PER_SESSION</td><td class="style_td">会话使用的CPU时间(单位0.01秒)</td></tr><tr><td class="style_td">SESSIONS_PER_USER</td><td class="style_td">用户可以同时进行的会话数</td></tr><tr><td class="style_td">CONNECT_TIME</td><td class="style_td">允许连接时间(分钟)</td></tr><tr><td class="style_td">IDLE_TIME</td><td class="style_td">允许空闲时间(分钟)</td></tr><tr><td class="style_td">LOGICAL_READS_PER_SESSION</td><td class="style_td">一次会话中能够进行的逻辑读次数(单位为数据块)</td></tr><tr><td class="style_td">PRIVATE_SGA</td><td class="style_td">私有SGA的大小(单位为数据块)</td></tr><tr><td class="style_td">CPU_PER_CALL</td><td class="style_td">一次调用(SQL语句)允许使用的CPU时间最大值(0.01秒)</td></tr><tr><td class="style_td">LOGICAL_READS_PER_CALL</td><td class="style_td">一次调用(SQL语句)能够进行的逻辑读次数(单位为数据块)</td></tr></tbody></table></div>
<p>如何使策略有效</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>设置初始化参数 RESOURCE_LIMIT=TRUE</li>
<li>用ALTER SYSTEM命令动态变更</li></ul>

<h2 id="content_1_45">SQL*Plus</h2>
<p>确认表或视图的结构：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>DESCRIBE 命令</li>
<li>DICT_COLUMNS 视图</li></ul>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<span id="more-181"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_2"></a>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_0">  数据库、安装等</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_1">  初始化参数</a></li>
<li><a href="#content_2_2">  建立数据库</a></li>
<li><a href="#content_2_3">  数据库模板</a></li>
<li><a href="#content_2_4">  OFA</a></li>
<li><a href="#content_2_5">  Oracle Universal Installer</a></li>
<li><a href="#content_2_6">  监察(audit)</a></li></ul></li>
<li><a href="#content_2_7">  控制文件</a></li>
<li><a href="#content_2_8">  段</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_9">  自动段(Segment)管理</a></li>
<li><a href="#content_2_10">  段类型</a></li>
<li><a href="#content_2_11">  rollback 段</a></li></ul></li>
<li><a href="#content_2_12">  范围(extent)</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_13">  范围(extent)管理</a></li></ul></li>
<li><a href="#content_2_14">  表空间</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_15">  默认表空间</a></li>
<li><a href="#content_2_16">  临时表空间</a></li>
<li><a href="#content_2_17">  表空间管理</a></li></ul></li>
<li><a href="#content_2_18">  索引</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_19">  索引</a></li>
<li><a href="#content_2_20">  监视索引</a></li></ul></li>
<li><a href="#content_2_21">  表</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_22">  临时表</a></li>
<li><a href="#content_2_23">  创建表时的注意事项</a></li></ul></li>
<li><a href="#content_2_24">  表约束</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_25">  约束延迟</a></li></ul></li>
<li><a href="#content_2_26">  一致性</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_27">  读取一致性</a></li></ul></li>
<li><a href="#content_2_28">  日志(REDO Log)</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_29">  checkpoint的发生条件</a></li>
<li><a href="#content_2_30">  日志的archive</a></li></ul></li>
<li><a href="#content_2_31">  UNDO</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_32">  建立</a></li>
<li><a href="#content_2_33">  UNDO表空间管理</a></li>
<li><a href="#content_2_34">  自动UNDO表空间管理的参数</a></li></ul></li>
<li><a href="#content_2_35">  数据字典</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_36">  数据字典</a></li>
<li><a href="#content_2_37">  动态性能视图</a></li></ul></li>
<li><a href="#content_2_38">  权限管理</a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_2_39">  用户</a></li>
<li><a href="#content_2_40">  操作系统认证</a></li>
<li><a href="#content_2_41">  角色</a></li>
<li><a href="#content_2_42">  权限</a></li>
<li><a href="#content_2_43">  密码</a></li>
<li><a href="#content_2_44">  策略(profile)</a></li></ul></li>
<li><a href="#content_2_45">  SQL*Plus</a></li></ul>
</div>

<hr class="full_hr" />
<h2 id="content_2_0">数据库、安装等</h2>

<h3 id="content_2_1">初始化参数</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>MAX_ENABLED_ROLES</strong>：用户拥有的有效角色的最大值</li>
<li><strong>DB_CACHE_SIZE</strong>：数据库缓存大小</li></ul>

<h3 id="content_2_2">建立数据库</h3>
<p>建立数据库之前需要考虑以下条件。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>拥有SYSDBA权限</li>
<li>若使用操作系统认证，则需要建立相关操作系统帐户，
若使用密码文件认证，则需要建立密码文件</li>
<li>足够的内存</li>
<li>足够的磁盘空间</li></ul>
<p>建立数据库时执行的脚本：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">sql.bsq</td><td class="style_td">建立数据字典的表</td><td class="style_td">建立数据库时由Oracle自动执行</td></tr><tr><td class="style_td">catalog.sql</td><td class="style_td">建立数据字典视图</td><td class="style_td">建立数据库之后由管理者手动执行</td></tr></tbody></table></div>

<h3 id="content_2_3">数据库模板</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>仅包括数据库结构的模板
<ul class="list2" style="padding-left:16px;margin-left:16px"><li>表空间</li>
<li>数据文件</li>
<li>初始化参数</li></ul></li>
<li>包括数据库结构和用户数据的模板
<ul class="list2" style="padding-left:16px;margin-left:16px"><li>表空间</li>
<li>数据文件</li>
<li>初始化参数</li>
<li>用户schema</li>
<li>用户数据</li></ul></li></ul>

<h3 id="content_2_4">OFA</h3>
<p><strong>Optimal Flexible Architecture</strong>，Oracle推荐的目录结构，
将数据文件、控制文件、日志等分散在多个磁盘中。好处：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>能轻易地区分数据文件和系统文件</li>
<li>可以简单地识别控制文件、数据文件、日志等</li>
<li>同一台服务器上建立多个Oracle数据库时降低管理难度</li>
<li>通过分散数据文件，减少读写文件时的冲突，提高性能</li></ul>

<h3 id="content_2_5">Oracle Universal Installer</h3>
<p>启动之前需要建立拥有 Oracle 的系统帐户（oracle用户、dba组、oinstall组）</p>

<h3 id="content_2_6">监察(audit)</h3>
<p>使监察有效：设置初始化参数 AUDIT_TRAIL=DB|OS|NONE</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>DB: 监察记录写到 SYS.AUD$</li>
<li>OS: 监察记录写道操作系统日志中</li></ul>

<h2 id="content_2_7">控制文件</h2>
<p>使用 CREATE CONTROLFILE 命令建立控制文件。</p>
<p>使用OMF(Oracle-Managed Files)管理文件时也能用CREATE CONTROLFILE命令建立控制文件，
但必须要指定 DATAFILE 和 LOGFILE。</p>
<p>可以过以下方法察看控制文件：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>V$CONTROLFILES</li>
<li>V$PARAMETERS</li>
<li>show parameters 命令</li></ul>
<p>控制文件在以下情况下更新。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">数据文件和REDO日志文件的名称和位置</td><td class="style_td">数据库中添加、更改或删除数据文件和REDO日志文件时</td></tr><tr><td class="style_td">表空间信息</td><td class="style_td">添加或删除表空间时</td></tr><tr><td class="style_td">REDO日志的历史记录</td><td class="style_td">日志切换时</td></tr><tr><td class="style_td">备份日志的位置和状态</td><td class="style_td">日志备份发生时</td></tr><tr><td class="style_td">备份的位置和状态</td><td class="style_td">由Recovery Manager记录</td></tr><tr><td class="style_td">现在的日志序号</td><td class="style_td">日志切换时</td></tr><tr><td class="style_td">checkpoint信息</td><td class="style_td">checkpoint执行时</td></tr></tbody></table></div>

<h2 id="content_2_8">段</h2>

<h3 id="content_2_9">自动段(Segment)管理</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>自动管理 PCTUSED、FREELISTS、FREELIST GROUPS参数</li>
<li>提高空间利用率、提高并行数据插入的性能</li>
<li>使用位图（而不是空闲列表）管理段内的空闲空间，插入数据时通过位图查找大小合适的数据块。</li>
<li>不能保存LOB段和包含LOB列的表</li></ul>

<h3 id="content_2_10">段类型</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>表(Table)</li>
<li>分区表(Partition Table)</li>
<li>簇(Cluster)</li>
<li>索引(Index)</li>
<li>索引组织表(Index-organized Table, IOT)</li>
<li>分区索引(Partition Index)</li>
<li>UNDO段</li>
<li>临时段：查询和建立索引时排序用</li>
<li>LOB</li>
<li>嵌套表(Nested Table)</li>
<li>bootstrap：打开数据库时初始化数据字典时使用的段</li></ul>
<p>其中UNDO段和临时段为系统建立，不属于 schema 对象。</p>

<h3 id="content_2_11">rollback 段</h3>
<p>包括<strong>系统rollback段</strong>、<strong>非系统rollback段</strong>、<strong>延迟rollback段</strong>三种。</p>
<dl class="list1" style="padding-left:16px;margin-left:16px"><dt>系统rollback段</dt>
<dd>创建数据库时创建，仅当系统表空间内的对象发生变化时使用</dd>
<dt>非系统rollback段</dt>
<dd>自动管理、手动管理</dd>
<dt>延迟rollback段</dt>
<dd>事务进行时，表空间以 NORMAL 以外的方式脱机，事务信息将被保存在延迟rollback段中以便表空间联机时恢复事务。由oracle自动管理。</dd></dl>

<h2 id="content_2_12">范围(extent)</h2>

<h3 id="content_2_13">范围(extent)管理</h3>
<p>手动分配</p>
<pre>ALTER TABME emp ALLOCATE EXTENT [(SIZE size DATAFILE 'filename)]</pre>

<h2 id="content_2_14">表空间</h2>

<h3 id="content_2_15">默认表空间</h3>
<p>创建表时如果不指定表空间，则建立在schema规定的默认表领域中。</p>

<h3 id="content_2_16">临时表空间</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>创建：CREATE TEMPORARY TABLESPACE 语句，默认使用字典方式管理</li>
<li>更改默认临时表空间：ALTER DATABSE DEFAULT TEMPORARY TABLESPACE 语句。</li></ul>

<h3 id="content_2_17">表空间管理</h3>
<p>local表空间管理方式不能更改其存储参数(STORAGE)。
字典管理方式下可以更改存储参数。</p>
<p>Oracle9i中默认管理方式为local管理，8i 为字典管理。
9i中可以通过 EXTENT MANAGEMENT DICTIONARY 来指定字典管理方式。</p>
<p>使用 ALTER TABLESPACE user01 OFFLINE NORMAL 将表空间设置为OFFLINE的动作
会同时被记录到控制文件和数据字典中。</p>

<h2 id="content_2_18">索引</h2>

<h3 id="content_2_19">索引</h3>
<p>通过 ALTER INDEX ... REBUILD 语句重新建立索引有以下特征：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>根据原有索引来建立新索引</li>
<li>不需要排序</li>
<li>建立时需要有足够的空间来容纳新旧索引。建立完毕后旧索引会被删除</li>
<li>建立的索引中不包括已删除的数据</li>
<li>建立过程中依然可以通过旧索引进行查询</li></ul>

<h3 id="content_2_20">监视索引</h3>
<p>通过下面的方法来监视索引是否被使用。</p>
<pre>ALTER INDEX ... MONITORING USAGE;</pre>
<p>之后通过 V$OBJECT_USAGE 来确认索引的使用情况。例如</p>
<pre>ALTER INDEX numb_oe_index MONITORING USAGE;     -- 监视开始
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
SELECT COUNT(*) FROM numbers WHERE odd_even='E';  -- 在numbers表上执行查询
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
ALTER SESSION SET optimizer_mode=first_rows;    -- 修改优化器为cost base
SELECT COUNT(*) FROM numbers WHERE odd_even='E';  -- 在numbers表上执行查询
SELECT inde_name, usage FROM v$object_usage;    -- 确认使用情况
ALTER INDEX numb_oe_index NOMONITORING USAGE;   -- 监视停止</pre>

<h2 id="content_2_21">表</h2>

<h3 id="content_2_22">临时表</h3>
<p>临时表仅在当前会话或者当前事务中存在。
其生命期由 CREATE GLOBAL TEMPORARY TABLE语句的参数决定。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>ON COMMIT DELETE ROWS：（默认）事务范围内存在</li>
<li>ON COMMIT PRESERVE ROWS：会话范围内存在</li></ul>
<p><strong>特性</strong></p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>针对临时表的DML操作不锁定、不生成REDO日志</li>
<li>可以针对临时表建立索引、视图、触发器。</li>
<li>可以通过工具导入/导出其定义，但无法导出数据。</li></ul>

<h3 id="content_2_23">创建表时的注意事项</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>rollback segment、临时段、索引等放在不同的表空间，防止出现碎片</li>
<li>尽可能少地分配 extent 以减少碎片</li>
<li>尽量使用 local 管理以降低 overhead</li></ul>

<h2 id="content_2_24">表约束</h2>

<h3 id="content_2_25">约束延迟</h3>
<p>创建约束时通过 [NOT] DEFERRABLE INITIALLY {IMMEDIATE|DEFERRED} 来设置延迟。
<strong>延迟</strong>即为事务提交时检查约束，反之则在语句执行时检查约束。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>NOT DEFERRABLE</strong> 不能延迟</li>
<li><strong>DEFERRABLE INITIALLY IMMEDIATE</strong> 能够延迟，但默认情况下为不延迟。DEFERRABLE 情况下的的默认设置</li>
<li><strong>DEFERRABLE INITIALLY DEFERRABLE</strong> 能够延迟，默认情况下为延迟</li></ul>
<p>修改延迟设置：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>ALTER SESSION SET CONSTRANT[S] = {IMMEDIATE|DEFERRED|DEFAULT}</li>
<li>SET CONSTRANT[S] {constrant_name|ALL} {IMMEDIATE|DEFERRED}</li></ul>

<h2 id="content_2_26">一致性</h2>

<h3 id="content_2_27">读取一致性</h3>
<p>默认情况下是语句级别读取一致性。
通过 SET TRANSACTION READ ONLY 可以使用事务级读写一致性。</p>

<h2 id="content_2_28">日志(REDO Log)</h2>

<h3 id="content_2_29">checkpoint的发生条件</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>日志切换</li>
<li>SHUTDOWN ABORT以外的方式终止实例</li>
<li>由于FAST_START_MTTR_TARGET参数导致的强制执行</li>
<li>ALTER SYSTEM CHECKPOINT命令执行</li>
<li>OFFLINE NORMAL、READ ONLY、BEGIN BACKUP选项的 ALTER TABLESPACE命令</li></ul>

<h3 id="content_2_30">日志的archive</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>ARCHIVELOG模式：过去的日志文件被archive之后，才会被覆盖</li>
<li>ARCHIVELOG模式、NOARCHIVELOG模式：checkpoint结束之后过去的日志才会被覆盖</li></ul>

<h2 id="content_2_31">UNDO</h2>

<h3 id="content_2_32">建立</h3>
<p>建立数据库时建立：</p>
<pre>CREATE DATABASE ... UNDO TABLESPACE undo01 DATAFILE '...';</pre>
<p>建立数据库之后建立：</p>
<pre>CREATE UNDO TABLESPACE undo01 DATAFILE '...';</pre>

<h3 id="content_2_33">UNDO表空间管理</h3>
<p>如果系统中有事务正在执行，那么切换UNDO表空间</p>
<pre>ALTER SYSTEM SET undo_tablespace=undotbs2</pre>
<p>会造成</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>新的 UNDO 表空间中的 UNDO 段成为ONLINE状态</li>
<li>旧 UNDO 表空间中包含事务的 UNDO 段成为 PENDING OFFLINE 状态</li></ul>

<h3 id="content_2_34">自动UNDO表空间管理的参数</h3>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">UNDO_MANAGEMENT</td><td class="style_td">auto=自动管理 manual=手动管理</td></tr><tr><td class="style_td">UNDO_TABLESPACE</td><td class="style_td">指定有效的undo表空间</td></tr><tr><td class="style_td">UNDO_RETENTION</td><td class="style_td">UNDO数据的保存时间(秒)</td></tr><tr><td class="style_td">UNDO_SUPPRESS_ERRORS</td><td class="style_td">设置为true可以禁止显示 ORA_30019 错误信息</td></tr></tbody></table></div>

<h2 id="content_2_35">数据字典</h2>

<h3 id="content_2_36">数据字典</h3>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">DBA_TAB_PRIVS</td><td class="style_td">对象权限</td></tr><tr><td class="style_td">DBA_COL_PRIVS</td><td class="style_td">列权限</td></tr><tr><td class="style_td">DBA_SYS_PRIVS</td><td class="style_td">系统权限</td></tr><tr><td class="style_td">SESSION_PRIVS</td><td class="style_td">当前会话可以使用的系统权限</td></tr><tr><td class="style_td">DBA_ROLLBACK_SEGS</td><td class="style_td">所有的rollback段的信息，但不包括OPTIMAL值</td></tr><tr><td class="style_td">DBA_FREE_SPACES</td><td class="style_td">数据文件内可分配的连续空间的信息</td></tr><tr><td class="style_td">DBA_USERS</td><td class="style_td">包含用户的角色信息</td></tr></tbody></table></div>
<p><strong>数据字典视图</strong>由 catalog.sql 脚本建立。</p>

<h3 id="content_2_37">动态性能视图</h3>
<p>使用<strong>动态性能视图</strong>可以获得以下信息。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">V$DATAFILE</td><td class="style_td">数据文件</td></tr><tr><td class="style_td">V$INSTANCE</td><td class="style_td">数据库状态</td></tr><tr><td class="style_td">V$LOCK, V$LOCKED_OBJECT</td><td class="style_td">锁信息</td></tr><tr><td class="style_td">V$SESSION</td><td class="style_td">会话信息</td></tr><tr><td class="style_td">V$ROLLSTAT</td><td class="style_td">有效rollback段的信息</td></tr><tr><td class="style_td">V$ROLLNAME</td><td class="style_td">仅包含rollback段id和名称，通常和V$ROLLSTAT结合使用</td></tr></tbody></table></div>

<h2 id="content_2_38">权限管理</h2>

<h3 id="content_2_39">用户</h3>
<p>创建用户时使用 IDENTIFIED GLOBALLY AS 'external' 可以用<strong>企业目录服务</strong>(Enterprise Directory Service)进行用户认证。</p>

<h3 id="content_2_40">操作系统认证</h3>
<p>OS_AUTHENT_PREFIX参数值 + OS用户名 = Oracle用户名</p>

<h3 id="content_2_41">角色</h3>
<p>修改角色的条件：用户需要拥有 ALTER ANY ROLE 权限，或者以 WITH ADMIN OPTION 被赋予某个角色。</p>

<h3 id="content_2_42">权限</h3>
<p>DDL的系统权限在取消时不会连锁。例如 A -&gt; B with admin option，
B -&gt; C，那么 A 在 revoke B 时 B 赋予 C 的权限不会被自动取消。</p>

<h3 id="content_2_43">密码</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>PASSWORD_REUSE_TIME</strong>: 重复使用旧密码的最小间隔日数</li>
<li><strong>PASSWORD_REUSE_MAX</strong>: 重复使用旧密码之前，最少需要修改几次密码</li>
<li><strong>FAILED_LOGIN_ATTEMPTS</strong>: 密码错误超过规定次数以上则锁定帐户</li>
<li><strong>PASSWORD_LOCK_TIME</strong>: 帐户锁定时间</li>
<li><strong>PASSWORD_LIFE_TIME</strong>: 密码有效期限</li>
<li><strong>PASSWORD_GRACE_TIME</strong>: 密码过期后多长时间内必须修改密码</li>
<li><strong>PASSWORD_VERIFY_FUNCTION</strong>: 检查密码复杂度的函数</li></ul>
<p>执行 utlpwdmg.sql 可以建立默认的复杂度检查函数。</p>

<h3 id="content_2_44">策略(profile)</h3>
<p>创建策略：</p>
<pre>CREATE PROFILE dev_prof LIMIT
  IDLE_TIME 60
  SESSIONS_PER_USER 2
  CONNECT_TIME 30</pre>
<p>创建策略时的参数：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">CPU_PER_SESSION</td><td class="style_td">会话使用的CPU时间(单位0.01秒)</td></tr><tr><td class="style_td">SESSIONS_PER_USER</td><td class="style_td">用户可以同时进行的会话数</td></tr><tr><td class="style_td">CONNECT_TIME</td><td class="style_td">允许连接时间(分钟)</td></tr><tr><td class="style_td">IDLE_TIME</td><td class="style_td">允许空闲时间(分钟)</td></tr><tr><td class="style_td">LOGICAL_READS_PER_SESSION</td><td class="style_td">一次会话中能够进行的逻辑读次数(单位为数据块)</td></tr><tr><td class="style_td">PRIVATE_SGA</td><td class="style_td">私有SGA的大小(单位为数据块)</td></tr><tr><td class="style_td">CPU_PER_CALL</td><td class="style_td">一次调用(SQL语句)允许使用的CPU时间最大值(0.01秒)</td></tr><tr><td class="style_td">LOGICAL_READS_PER_CALL</td><td class="style_td">一次调用(SQL语句)能够进行的逻辑读次数(单位为数据块)</td></tr></tbody></table></div>
<p>如何使策略有效</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>设置初始化参数 RESOURCE_LIMIT=TRUE</li>
<li>用ALTER SYSTEM命令动态变更</li></ul>

<h2 id="content_2_45">SQL*Plus</h2>
<p>确认表或视图的结构：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li>DESCRIBE 命令</li>
<li>DICT_COLUMNS 视图</li></ul>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/10/03/oracle-dba-note/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 6.06 上安装 Oralce10g</title>
		<link>http://tech.idv2.com/2006/09/10/install-oracle10g-on-ubuntu-606/</link>
		<comments>http://tech.idv2.com/2006/09/10/install-oracle10g-on-ubuntu-606/#comments</comments>
		<pubDate>Sun, 10 Sep 2006 10:01:23 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/122.html</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>Oracle 10g2默认仅支持redhat enterprise系列和 SuSE 系列的几个版本的 Linux。
在 Ubuntu 上安装 Oracle 需要做些设置。下面是安装过程。</p>
<!-- end Pukiwiki generated code--><span id="more-102"></span><!-- begin Pukiwiki generated code--><h3 id="content_4_0">安装前的准备</h3>
<p>首先要安装开发工具。切换到 root 用户执行下面的命令。</p>
<pre># apt-get install build-essential</pre>
<p>然后要修改 Ubuntu 的版本以“ 欺骗” Oracle安装程序，使之能
正常安装。</p>
<pre># echo Red Hat Enterprise Linux AS rlease 3 (Taroon) &gt; /etc/redhat-release</pre>
<p>然后插入 Oralce 10g2 的安装光盘。系统会自动 mount光盘，
但由于默认情况下光盘上的文件是没有执行权限的，
因此要为cdrom加上执行权限。</p>
<pre># umount /media/cdrom0
# mount -o exec /media/cdrom0</pre>

<h3 id="content_4_1">安装设置</h3>
<p>在 Oracle 光盘根目录下的 welcome.html 中有很详细的Oracle的安装指南。
可将其打开作为参考。</p>
<p>首先要修改内核参数:</p>
<pre># vi /etc/sysctl.conf</pre>
<p>在 sysctl.conf 文件下添加以下内容。</p>
<pre># modify config kernel parameters for oracle 10g
kernel.sem = 250 32000 100 128
kernel.shmall = 2097152
kernel.shmmax = 263708672
kernel.shmmni = 4096
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144</pre>
<p>保存退出，然后执行以下命令使修改生效。</p>
<pre># sysctl -p</pre>
<p>创建必要的用户和组。</p>
<pre># groupadd oinstall
# groupadd dba
# groupadd nobody
# useradd -d /home/oracle -G oinstall,dba -s /bin/bash oracle </pre>
<p>创建oracle目录:</p>
<pre># mkdir /opt/oracle
# chown -R oracle.oinstall /opt/oracle</pre>
<p>创建 oracle 用户的环境设置。</p>
<pre># su - oracle
$ vi .bash_profile</pre>
<p>内容如下。</p>
<pre>export DISPLAY=:0.0
export LANG=C                             # 语言修改为英文以避免安装程序的乱码
export ORACLE_BASE=/opt/oracle            # oracle安装路径
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0    # oracle home
export PATH=$PATH:$ORACLE_HOME/bin</pre>
<p>保存后执行下面的命令使修改生效。</p>
<pre>$ . .bash_profile</pre>
<p>ubuntu的X-server使用的是 xauth 进行认证，新建的 oracle 用户是无法使用 X 的，
因此安装程序无法正常执行，所以要为oracle用户增加X server的认证信息。
首先切换到系统中能够正常使用X的用户(例如安装时创建的默认用户)，执行</p>
<pre>$ xauth list $DISPLAY
hostmame/unix:0  MIT-MAGIC-COOKIE-1  1234567890abcdef01234567890abcdef</pre>
<p>然后切换到 oracle 用户:</p>
<pre># su - oracle
$ xauth add $DISPLAY . 1234567890abcdef01234567890abcdef
$ exit</pre>

<h3 id="content_4_2">开始安装</h3>
<p>切换到oracle用户执行安装程序。</p>
<pre>$ /media/cdrom/runInstaller</pre>
<p>安装界面。选择 DBA 组为 dba。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/oracle_install_1.png" alt="oracle_install_1.png" title="oracle_install_1.png" width="647" height="505" /></div>

<p>下一步，选择安装程序所用的目录。组名设置为 oinstall。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/oracle_install_2.png" alt="oracle_install_2.png" title="oracle_install_2.png" width="648" height="505" /></div>

<p>之后进入安装过程。
安装过程中可能会遇到一些错误。遇到错误时，
打开 $ORACLE_HOME/oraInventory/logs/installAction***.log文件
查看错误原因。</p>
<p><strong>错误1</strong></p>
<p>错误信息：</p>
<pre>Exception String: Error in invoking target 'ntcontab.o' of makefile '/opt/oracle/product/10.2.0/network/lib/ins_net_client.mk'. See '/opt/oracle/oraInventory/logs/installActions2006-09-10_05-15-13PM.log' for details.</pre>
<p>原因：</p>
<pre>INFO: sys/types.h: No such file or directory
（找不到sys/types.h）</pre>
<p>原因在于安装oracle之前没有安装开发工具。切换到root安装开发工具即可。</p>
<pre>$ su -
# apt-get install build-essential</pre>
<p><strong>错误2</strong></p>
<p>错误信息：</p>
<pre>Error in invoking target 'utilities ctx_on' of makefile '/opt/oracle/product/10.2.0/rdbms/lib/ins_rdbms.mk'. See '/opt/oracle/oraInventory/logs/installActions2006-09-10_05-15-13PM.log' for details.</pre>
<p>原因：</p>
<pre>INFO: /opt/oracle/product/10.2.0/lib//libagtsh.so: undefined reference to `nnfyboot'
（在库文件 libagtsh.so 中找不到 nnfyboot 符号）</pre>
<p>这是 Oracle 安装程序的一个bug（<a href="http://forums.oracle.com/forums/thread.jspa?threadID=413032&amp;tstart=0">参考</a>）。修正方法如下，切换到 root 执行下面的命令。</p>
<pre>export LD_LIBRARY_PATH=$ORACLE_HOME/lib
ln -s /usr/bin/basename /bin/basename
ln -s $ORACLE_HOME/lib/libclient10.a $ORACLE_HOME/lib/libagtsh.a
$ORACLE_HOME/bin/genagtsh $ORACLE_HOME/lib/libagtsh.so 1.0 </pre>
<p>然后在 Oracle 安装程序中 Retry 即可。</p>
<p>安装将近完成时，安装程序要求你以root权限执行脚本。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/oracle_install_3.png" alt="oracle_install_3.png" title="oracle_install_3.png" width="552" height="410" /></div>

<p>切换到root用户执行即可，但由于ubuntu的路径问题，需要先执行下面的命令。</p>
<pre># ln -s /usr/bin/awk /bin/awk</pre>
<p>然后执行要求的脚本。</p>
<pre># /opt/oracle/oraInventory/orainstRoot.sh
# /opt/oracle/product/10.2.0/root.sh</pre>
<p>后一个脚本会询问 /usr/local/bin 的位置（选择默认值即可），然后向其中复制三个文件：
coraenv、 dbhome、oraenv。</p>
<p>安装结束，显示下面的信息。</p>
<pre>The following J2EE Applications have been deployed 
and are accessible at the URLs listed below.

iSQL*Plus URL:
http://charleemain:5560/isqlplus

iSQL*Plus DBA URL:
http://charleemain:5560/isqlplus/dba</pre>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>Oracle 10g2默认仅支持redhat enterprise系列和 SuSE 系列的几个版本的 Linux。
在 Ubuntu 上安装 Oracle 需要做些设置。下面是安装过程。</p>
<!-- end Pukiwiki generated code--><span id="more-102"></span><!-- begin Pukiwiki generated code--><h3 id="content_6_0">安装前的准备</h3>
<p>首先要安装开发工具。切换到 root 用户执行下面的命令。</p>
<pre># apt-get install build-essential</pre>
<p>然后要修改 Ubuntu 的版本以“ 欺骗” Oracle安装程序，使之能
正常安装。</p>
<pre># echo Red Hat Enterprise Linux AS rlease 3 (Taroon) &gt; /etc/redhat-release</pre>
<p>然后插入 Oralce 10g2 的安装光盘。系统会自动 mount光盘，
但由于默认情况下光盘上的文件是没有执行权限的，
因此要为cdrom加上执行权限。</p>
<pre># umount /media/cdrom0
# mount -o exec /media/cdrom0</pre>

<h3 id="content_6_1">安装设置</h3>
<p>在 Oracle 光盘根目录下的 welcome.html 中有很详细的Oracle的安装指南。
可将其打开作为参考。</p>
<p>首先要修改内核参数:</p>
<pre># vi /etc/sysctl.conf</pre>
<p>在 sysctl.conf 文件下添加以下内容。</p>
<pre># modify config kernel parameters for oracle 10g
kernel.sem = 250 32000 100 128
kernel.shmall = 2097152
kernel.shmmax = 263708672
kernel.shmmni = 4096
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144</pre>
<p>保存退出，然后执行以下命令使修改生效。</p>
<pre># sysctl -p</pre>
<p>创建必要的用户和组。</p>
<pre># groupadd oinstall
# groupadd dba
# groupadd nobody
# useradd -d /home/oracle -G oinstall,dba -s /bin/bash oracle </pre>
<p>创建oracle目录:</p>
<pre># mkdir /opt/oracle
# chown -R oracle.oinstall /opt/oracle</pre>
<p>创建 oracle 用户的环境设置。</p>
<pre># su - oracle
$ vi .bash_profile</pre>
<p>内容如下。</p>
<pre>export DISPLAY=:0.0
export LANG=C                             # 语言修改为英文以避免安装程序的乱码
export ORACLE_BASE=/opt/oracle            # oracle安装路径
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0    # oracle home
export PATH=$PATH:$ORACLE_HOME/bin</pre>
<p>保存后执行下面的命令使修改生效。</p>
<pre>$ . .bash_profile</pre>
<p>ubuntu的X-server使用的是 xauth 进行认证，新建的 oracle 用户是无法使用 X 的，
因此安装程序无法正常执行，所以要为oracle用户增加X server的认证信息。
首先切换到系统中能够正常使用X的用户(例如安装时创建的默认用户)，执行</p>
<pre>$ xauth list $DISPLAY
hostmame/unix:0  MIT-MAGIC-COOKIE-1  1234567890abcdef01234567890abcdef</pre>
<p>然后切换到 oracle 用户:</p>
<pre># su - oracle
$ xauth add $DISPLAY . 1234567890abcdef01234567890abcdef
$ exit</pre>

<h3 id="content_6_2">开始安装</h3>
<p>切换到oracle用户执行安装程序。</p>
<pre>$ /media/cdrom/runInstaller</pre>
<p>安装界面。选择 DBA 组为 dba。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/oracle_install_1.png" alt="oracle_install_1.png" title="oracle_install_1.png" width="647" height="505" /></div>

<p>下一步，选择安装程序所用的目录。组名设置为 oinstall。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/oracle_install_2.png" alt="oracle_install_2.png" title="oracle_install_2.png" width="648" height="505" /></div>

<p>之后进入安装过程。
安装过程中可能会遇到一些错误。遇到错误时，
打开 $ORACLE_HOME/oraInventory/logs/installAction***.log文件
查看错误原因。</p>
<p><strong>错误1</strong></p>
<p>错误信息：</p>
<pre>Exception String: Error in invoking target 'ntcontab.o' of makefile '/opt/oracle/product/10.2.0/network/lib/ins_net_client.mk'. See '/opt/oracle/oraInventory/logs/installActions2006-09-10_05-15-13PM.log' for details.</pre>
<p>原因：</p>
<pre>INFO: sys/types.h: No such file or directory
（找不到sys/types.h）</pre>
<p>原因在于安装oracle之前没有安装开发工具。切换到root安装开发工具即可。</p>
<pre>$ su -
# apt-get install build-essential</pre>
<p><strong>错误2</strong></p>
<p>错误信息：</p>
<pre>Error in invoking target 'utilities ctx_on' of makefile '/opt/oracle/product/10.2.0/rdbms/lib/ins_rdbms.mk'. See '/opt/oracle/oraInventory/logs/installActions2006-09-10_05-15-13PM.log' for details.</pre>
<p>原因：</p>
<pre>INFO: /opt/oracle/product/10.2.0/lib//libagtsh.so: undefined reference to `nnfyboot'
（在库文件 libagtsh.so 中找不到 nnfyboot 符号）</pre>
<p>这是 Oracle 安装程序的一个bug（<a href="http://forums.oracle.com/forums/thread.jspa?threadID=413032&amp;tstart=0">参考</a>）。修正方法如下，切换到 root 执行下面的命令。</p>
<pre>export LD_LIBRARY_PATH=$ORACLE_HOME/lib
ln -s /usr/bin/basename /bin/basename
ln -s $ORACLE_HOME/lib/libclient10.a $ORACLE_HOME/lib/libagtsh.a
$ORACLE_HOME/bin/genagtsh $ORACLE_HOME/lib/libagtsh.so 1.0 </pre>
<p>然后在 Oracle 安装程序中 Retry 即可。</p>
<p>安装将近完成时，安装程序要求你以root权限执行脚本。</p>
<div class="img_margin" style="text-align:left"><img src="http://tech.idv2.com/wp-content/uploads/2006/09/oracle_install_3.png" alt="oracle_install_3.png" title="oracle_install_3.png" width="552" height="410" /></div>

<p>切换到root用户执行即可，但由于ubuntu的路径问题，需要先执行下面的命令。</p>
<pre># ln -s /usr/bin/awk /bin/awk</pre>
<p>然后执行要求的脚本。</p>
<pre># /opt/oracle/oraInventory/orainstRoot.sh
# /opt/oracle/product/10.2.0/root.sh</pre>
<p>后一个脚本会询问 /usr/local/bin 的位置（选择默认值即可），然后向其中复制三个文件：
coraenv、 dbhome、oraenv。</p>
<p>安装结束，显示下面的信息。</p>
<pre>The following J2EE Applications have been deployed 
and are accessible at the URLs listed below.

iSQL*Plus URL:
http://charleemain:5560/isqlplus

iSQL*Plus DBA URL:
http://charleemain:5560/isqlplus/dba</pre>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/09/10/install-oracle10g-on-ubuntu-606/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Oracle管理SQL语句</title>
		<link>http://tech.idv2.com/2006/06/13/oracle-management-sql/</link>
		<comments>http://tech.idv2.com/2006/06/13/oracle-management-sql/#comments</comments>
		<pubDate>Tue, 13 Jun 2006 09:33:47 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/105.html</guid>
		<description><![CDATA[Oracle管理中常用的SQL语句。
<span id="more-85"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_7"></a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_7_0">  用户信息</a></li>
<li><a href="#content_7_1">  确认用户角色</a></li>
<li><a href="#content_7_2">  确认用户的系统权限</a></li>
<li><a href="#content_7_3">  确认用户的对象权限</a></li></ul>
</div>

<hr class="full_hr" />
<h3 id="content_7_0">用户信息</h3>
<p>DBA_USERS表中的主要列如下。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><thead><tr><td class="style_td">列名</td><td class="style_td">说明</td></tr></thead><tbody><tr><td class="style_td">USERNAME</td><td class="style_td">用户名</td></tr><tr><td class="style_td">USER_ID</td><td class="style_td">用户的唯一id</td></tr><tr><td class="style_td">PASSWORD</td><td class="style_td">加密后的密码</td></tr><tr><td class="style_td">ACCOUNT_STATUS</td><td class="style_td">用户状态(正常、锁定、密码过期等)</td></tr><tr><td class="style_td">DEFAULT_TABLESPACE</td><td class="style_td">默认表空间</td></tr><tr><td class="style_td">TEMPORARY_TABLESPACE</td><td class="style_td">排序时使用的临时表空间</td></tr><tr><td class="style_td">CREATED</td><td class="style_td">该用户的创建时间</td></tr></tbody></table></div>
<p>使用下面的SQL语句可以确认用户信息。</p>
<pre>SELECT username
    , user_id
    , password
    , account_status
    , default_tablespace
    , temporary_tablespace
    , created
FROM dba_users</pre>
<p>推荐格式如下：</p>
<pre>col username form a20
col default_tablespace form a20
col temporary_tablespace form a20
col password form a20
col account_status form a30</pre>
<p>用以下的SQL语句可以查找系统中默认密码的用户，以检查安全隐患。</p>
<pre>SELECT username &quot;User(s) with Default Password!&quot;
FROM dba_users
WHERE password IN (
  'E066D214D5421CCC', -- dbsnmp
  '24ABAB8B06281B4C', -- ctxsys
  '72979A94BAD2AF80', -- mdsys
  'C252E8FA117AF049', -- odm
  'A7A32CD03D3CE8D5', -- odm_mtr
  '88A2B2C183431F00', -- ordplugins
  '7EFA02EC7EA6B86F', -- ordsys
  '4A3BA55E08595C81', -- outln
  'F894844C34402B67', -- scott
  '3F9FBD883D787341', -- wk_proxy
  '79DF7A1BD138CF11', -- wk_sys
  '7C9BA362F8314299', -- wmsys
  '88D8364765FCE6AF', -- xdb
  'F9DA8977092B7B81', -- tracesvr
  '9300C0977D7DC75E', -- oas_public
  'A97282CE3D94E29E', -- websys
  'AC9700FD3F1410EB', -- lbacsys
  'E7B5D92911C831E1', -- rman
  'AC98877DE1297365', -- perfstat
  '66F4EF5650C20355', -- exfsys
  '84B8CBCA4D477FA3', -- si_informtn_schema
  'D4C5016086B2DC6A', -- sys
  'D4DF7931AB130E37'  -- system
)</pre>

<h3 id="content_7_1">确认用户角色</h3>
<p>DBA_ROLE_PRIVS表中的主要列如下。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><thead><tr><td class="style_td">列名</td><td class="style_td">说明</td></tr></thead><tbody><tr><td class="style_td">GRANTEE</td><td class="style_td">接受该角色的用户名或角色名</td></tr><tr><td class="style_td">GRANTED_ROLE</td><td class="style_td">赋予用户或角色的角色名</td></tr><tr><td class="style_td">ADMIN_OPTION</td><td class="style_td">赋予时是否带有ADMIN OPTION(YES/NO)</td></tr><tr><td class="style_td">DEFAULT_ROLE</td><td class="style_td">是否为默认角色</td></tr></tbody></table></div>
<p>用下面的SQL语句可以确认赋予用户SCOTT的角色。</p>
<pre>SELECT granted_role
    , admin_option
    , default_role
FROM dba_role_privs
WHERE grantee='SCOTT'</pre>

<h3 id="content_7_2">确认用户的系统权限</h3>
<p>DBA_SYS_PRIVS表中的主要列如下。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><thead><tr><td class="style_td">列名</td><td class="style_td">说明</td></tr></thead><tbody><tr><td class="style_td">GRANTEE</td><td class="style_td">接受权限的用户名或角色名</td></tr><tr><td class="style_td">PRIVILEGE</td><td class="style_td">系统权限名</td></tr><tr><td class="style_td">ADMIN_OPTION</td><td class="style_td">赋予时是否带有ADMIN OPTION(YES/NO)</td></tr></tbody></table></div>
<p>使用下面的SQL语句显示某个用户的系统权限。</p>
<pre>SELECT privilege
    , admin_option
FROM dba_sys_privs
WHERE grantee='SCOTT'</pre>
<p>但是，仅通过DBA_SYS_PRIVS表无法看到SYSDBA和SYSOPER权限的赋予情况。可以使用下面的SQL语句。下面的SQL语句确认SYS用户的权限。</p>
<pre>SELECT privilege
    , admin_option
FROM dba_sys_privs
WHERE grantee='SYS'
UNION
SELECT DECODE(sysdba, 'TRUE', 'SYSDBA', NULL)
    , 'YES'
FROM v$pwfile_users
WHERE username='SYS'
  AND sysdba='TRUE'
UNION
SELECT DECODE(sysoper, 'TRUE', 'SYSOPER', NULL)
    , 'YES'
FROM v$pwfile_users
WHERE username='SYS'
  AND sysoper='TRUE'</pre>

<h3 id="content_7_3">确认用户的对象权限</h3>
<p>DBA_TAB_PRIVS表的主要列如下。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><thead><tr><td class="style_td">列名</td><td class="style_td">说明</td></tr></thead><tbody><tr><td class="style_td">GRANTEE</td><td class="style_td">接受该权限的用户名</td></tr><tr><td class="style_td">OWNER</td><td class="style_td">对象的拥有者</td></tr><tr><td class="style_td">TABLE_NAME</td><td class="style_td">对象名</td></tr><tr><td class="style_td">GRANTOR</td><td class="style_td">赋予权限的用户</td></tr><tr><td class="style_td">PRIVILEGE</td><td class="style_td">权限名</td></tr><tr><td class="style_td">GRANTABLE</td><td class="style_td">赋予该权限时是否带有GRANT OPTION</td></tr><tr><td class="style_td">HIERARCHY</td><td class="style_td">赋予该权限时是否带有HIERARCHY OPTION</td></tr></tbody></table></div>
<p>使用下面的SQL语句可以查看用户的对象权限。</p>
<pre>SELECT privilege priv
    , owner||'.'||table_name table_name
	 , grantee
	 , grantable
FROM dba_tab_privs
WHERE owner='SCOTT'</pre>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[Oracle管理中常用的SQL语句。
<span id="more-85"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_8"></a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_8_0">  用户信息</a></li>
<li><a href="#content_8_1">  确认用户角色</a></li>
<li><a href="#content_8_2">  确认用户的系统权限</a></li>
<li><a href="#content_8_3">  确认用户的对象权限</a></li></ul>
</div>

<hr class="full_hr" />
<h3 id="content_8_0">用户信息</h3>
<p>DBA_USERS表中的主要列如下。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><thead><tr><td class="style_td">列名</td><td class="style_td">说明</td></tr></thead><tbody><tr><td class="style_td">USERNAME</td><td class="style_td">用户名</td></tr><tr><td class="style_td">USER_ID</td><td class="style_td">用户的唯一id</td></tr><tr><td class="style_td">PASSWORD</td><td class="style_td">加密后的密码</td></tr><tr><td class="style_td">ACCOUNT_STATUS</td><td class="style_td">用户状态(正常、锁定、密码过期等)</td></tr><tr><td class="style_td">DEFAULT_TABLESPACE</td><td class="style_td">默认表空间</td></tr><tr><td class="style_td">TEMPORARY_TABLESPACE</td><td class="style_td">排序时使用的临时表空间</td></tr><tr><td class="style_td">CREATED</td><td class="style_td">该用户的创建时间</td></tr></tbody></table></div>
<p>使用下面的SQL语句可以确认用户信息。</p>
<pre>SELECT username
    , user_id
    , password
    , account_status
    , default_tablespace
    , temporary_tablespace
    , created
FROM dba_users</pre>
<p>推荐格式如下：</p>
<pre>col username form a20
col default_tablespace form a20
col temporary_tablespace form a20
col password form a20
col account_status form a30</pre>
<p>用以下的SQL语句可以查找系统中默认密码的用户，以检查安全隐患。</p>
<pre>SELECT username &quot;User(s) with Default Password!&quot;
FROM dba_users
WHERE password IN (
  'E066D214D5421CCC', -- dbsnmp
  '24ABAB8B06281B4C', -- ctxsys
  '72979A94BAD2AF80', -- mdsys
  'C252E8FA117AF049', -- odm
  'A7A32CD03D3CE8D5', -- odm_mtr
  '88A2B2C183431F00', -- ordplugins
  '7EFA02EC7EA6B86F', -- ordsys
  '4A3BA55E08595C81', -- outln
  'F894844C34402B67', -- scott
  '3F9FBD883D787341', -- wk_proxy
  '79DF7A1BD138CF11', -- wk_sys
  '7C9BA362F8314299', -- wmsys
  '88D8364765FCE6AF', -- xdb
  'F9DA8977092B7B81', -- tracesvr
  '9300C0977D7DC75E', -- oas_public
  'A97282CE3D94E29E', -- websys
  'AC9700FD3F1410EB', -- lbacsys
  'E7B5D92911C831E1', -- rman
  'AC98877DE1297365', -- perfstat
  '66F4EF5650C20355', -- exfsys
  '84B8CBCA4D477FA3', -- si_informtn_schema
  'D4C5016086B2DC6A', -- sys
  'D4DF7931AB130E37'  -- system
)</pre>

<h3 id="content_8_1">确认用户角色</h3>
<p>DBA_ROLE_PRIVS表中的主要列如下。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><thead><tr><td class="style_td">列名</td><td class="style_td">说明</td></tr></thead><tbody><tr><td class="style_td">GRANTEE</td><td class="style_td">接受该角色的用户名或角色名</td></tr><tr><td class="style_td">GRANTED_ROLE</td><td class="style_td">赋予用户或角色的角色名</td></tr><tr><td class="style_td">ADMIN_OPTION</td><td class="style_td">赋予时是否带有ADMIN OPTION(YES/NO)</td></tr><tr><td class="style_td">DEFAULT_ROLE</td><td class="style_td">是否为默认角色</td></tr></tbody></table></div>
<p>用下面的SQL语句可以确认赋予用户SCOTT的角色。</p>
<pre>SELECT granted_role
    , admin_option
    , default_role
FROM dba_role_privs
WHERE grantee='SCOTT'</pre>

<h3 id="content_8_2">确认用户的系统权限</h3>
<p>DBA_SYS_PRIVS表中的主要列如下。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><thead><tr><td class="style_td">列名</td><td class="style_td">说明</td></tr></thead><tbody><tr><td class="style_td">GRANTEE</td><td class="style_td">接受权限的用户名或角色名</td></tr><tr><td class="style_td">PRIVILEGE</td><td class="style_td">系统权限名</td></tr><tr><td class="style_td">ADMIN_OPTION</td><td class="style_td">赋予时是否带有ADMIN OPTION(YES/NO)</td></tr></tbody></table></div>
<p>使用下面的SQL语句显示某个用户的系统权限。</p>
<pre>SELECT privilege
    , admin_option
FROM dba_sys_privs
WHERE grantee='SCOTT'</pre>
<p>但是，仅通过DBA_SYS_PRIVS表无法看到SYSDBA和SYSOPER权限的赋予情况。可以使用下面的SQL语句。下面的SQL语句确认SYS用户的权限。</p>
<pre>SELECT privilege
    , admin_option
FROM dba_sys_privs
WHERE grantee='SYS'
UNION
SELECT DECODE(sysdba, 'TRUE', 'SYSDBA', NULL)
    , 'YES'
FROM v$pwfile_users
WHERE username='SYS'
  AND sysdba='TRUE'
UNION
SELECT DECODE(sysoper, 'TRUE', 'SYSOPER', NULL)
    , 'YES'
FROM v$pwfile_users
WHERE username='SYS'
  AND sysoper='TRUE'</pre>

<h3 id="content_8_3">确认用户的对象权限</h3>
<p>DBA_TAB_PRIVS表的主要列如下。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><thead><tr><td class="style_td">列名</td><td class="style_td">说明</td></tr></thead><tbody><tr><td class="style_td">GRANTEE</td><td class="style_td">接受该权限的用户名</td></tr><tr><td class="style_td">OWNER</td><td class="style_td">对象的拥有者</td></tr><tr><td class="style_td">TABLE_NAME</td><td class="style_td">对象名</td></tr><tr><td class="style_td">GRANTOR</td><td class="style_td">赋予权限的用户</td></tr><tr><td class="style_td">PRIVILEGE</td><td class="style_td">权限名</td></tr><tr><td class="style_td">GRANTABLE</td><td class="style_td">赋予该权限时是否带有GRANT OPTION</td></tr><tr><td class="style_td">HIERARCHY</td><td class="style_td">赋予该权限时是否带有HIERARCHY OPTION</td></tr></tbody></table></div>
<p>使用下面的SQL语句可以查看用户的对象权限。</p>
<pre>SELECT privilege priv
    , owner||'.'||table_name table_name
	 , grantee
	 , grantable
FROM dba_tab_privs
WHERE owner='SCOTT'</pre>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/06/13/oracle-management-sql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle常用SQL语句</title>
		<link>http://tech.idv2.com/2006/06/13/useful-oracle-sql/</link>
		<comments>http://tech.idv2.com/2006/06/13/useful-oracle-sql/#comments</comments>
		<pubDate>Tue, 13 Jun 2006 02:54:59 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/104.html</guid>
		<description><![CDATA[Oracle使用过程中经常会用到的SQL语句。
<span id="more-84"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_9"></a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_9_0">  表</a></li>
<li><a href="#content_9_1">  制约</a></li>
<li><a href="#content_9_2">  视图</a></li>
<li><a href="#content_9_3">  顺序</a></li>
<li><a href="#content_9_4">  索引</a></li>
<li><a href="#content_9_5">  用户</a></li></ul>
</div>

<hr class="full_hr" />
<h3 id="content_9_0">表</h3>
<p>创建表。</p>
<pre>CREATE TABLE [schema.]t_employees (
    employee_id NUMBER(2),                  -- 长度=2的整数
    hire_date DATE DEFAULT SYSDATE,         -- default的例子
	 ...
) AS 子查询;                                -- 利用子查询建立表</pre>
<p>确认表。</p>
<pre>desc t_employees;          -- 确认表结构
SELECT table_name FROM user_tables;         -- 确认用户拥有的表
SELECT DISTINCT object_type FROM user_objects;  -- 确认用户拥有的对象的种类
SELECT * FROM user_catalog;                 -- 确认用户拥有的对象</pre>
<p>修改表</p>
<pre>ALTER TABLE t_employees ADD (colname ..., colname...,);  -- 增加列
ALTER TABLE t_employees MODIFY (colname DATATYPE [DEFAULT ...], colname ...);  -- 修改列定义
ALTER TABLE DROP { COLUMN 列名 | (列名[,列名...])};      -- 删除列，列名用括号或者COLUMN关键字</pre>
<p>其他</p>
<pre>DROP TABLE dept;                                          -- 删除表
RENAME dept TO detail_dept;                               -- 修改名称。
TRUNCATE TABLE detail_dept;                               -- 清空表。
COMMENT ON TABLE employee IS 'Employee Information';      -- 添加注释。</pre>
<p>注释确认可以通过 ALL_COL_COMMENTS、USER_COL_COMMENTS、ALL_TAB_COMMENTS、USER_TAB_COMMENTS 视图的 COMMENTS 列来进行。</p>

<h3 id="content_9_1">制约</h3>
<p>定义制约</p>
<pre>CREATE TABLE employee (
  employee_id NUMBER(6),
  first_name  VARCHAR2(20),
  last_name   VARCHAR2(20) CONSTRAINT last_name_nn NOT NULL,
  email       VARCHAR2(25),
  dept_id     NUMBER(6),
  salary      NUMBER(8,2),
  ...
  job_id      VARCHAR2(10) NOT NULL,
  CONSTRAINT emp_emp_id_pk PRIMARY KEY (employee_id),
  CONSTRAINT emp_email_uk UNIQUE(email),
  CONSTRAINT emp_deptid_fk FOREIGN KEY (department_id) REFERENCES departments(department_id),
  CONSTRAINT emp_salary_min CHECK (salary&gt;0));</pre>
<p>确认制约。</p>
<pre>SELECT constraint_name, constraint_type, search_condition
FROM user_constraints
WHERE table_name='EMPLOYEES';

SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name='EMPLOYEES';</pre>

<h3 id="content_9_2">视图</h3>
<p>选出前n条记录。</p>
<pre>SELECT * FROM ( select ....) WHERE rownum&lt;=n;</pre>

<h3 id="content_9_3">顺序</h3>
<p>创建顺序。</p>
<pre>CREATE SEQUENCE dept_deptdi_seq
  INCREMENT BY 10
  START WITH 120
  MAXVALUE 9999
  NOCACHE
  NOCYCLE;</pre>
<p>确认顺序。</p>
<pre>SELECT sequence_name, min_value, max_value, increment_by, last_number
FROM user_sequences;    -- last_number为上次取得的顺序值</pre>
<p>使用方法</p>
<pre>INSERT INTO departments (department_id, department_name, location_id)
VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);</pre>
<p>变更顺序。</p>
<pre>ALTER SEQUENCE dept_deptid_seq
  INCREMENT BY 20
  MAXVALUE 999999
  NOCACHE
  NOCYCLE;</pre>
<p>删除顺序。</p>
<pre>DROP SEQUENCE dept_deptid_seq;</pre>

<h3 id="content_9_4">索引</h3>
<p>创建索引。</p>
<pre>CREATE INDEX emp_last_name_idx ON employees(last_name);</pre>
<p>确认索引内容。</p>
<pre>SELECT ic.index_name, ic.column_name, ic.column_position col_pos, ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name=ix.index_name AND ic.table_name='YOUR_TABLE_NAME'</pre>

<h3 id="content_9_5">用户</h3>
<p>创建用户。</p>
<pre>CREATE USER scott IDENTIFIED BY tiger;</pre>
<p>赋予权限。</p>
<pre>GRANT create session, create table, create sequence, create view TO scott;  -- 系统权限
GRANT select ON employees TO sue, rich WITH GRANT OPTION;
     -- 对象权限, with grant option表明该用户可以将被赋予的权限再赋予别人
GRANT update (department_name, location_id) ON departments TO PUBLIC;</pre>
<p>取消权限。</p>
<pre>REVOKE select, insert ON departments FROM scott;</pre>
<p>角色。</p>
<pre>CREATE ROLE manager;
GRANT create table, create view TO manager;
GRANT manager TO dehaan, kochhar;</pre>
<p>修改密码。</p>
<pre>ALTER USER scott IDENTIFIED BY lion;</pre>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[Oracle使用过程中经常会用到的SQL语句。
<span id="more-84"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_10"></a>
<ul class="list2" style="padding-left:16px;margin-left:16px"><li><a href="#content_10_0">  表</a></li>
<li><a href="#content_10_1">  制约</a></li>
<li><a href="#content_10_2">  视图</a></li>
<li><a href="#content_10_3">  顺序</a></li>
<li><a href="#content_10_4">  索引</a></li>
<li><a href="#content_10_5">  用户</a></li></ul>
</div>

<hr class="full_hr" />
<h3 id="content_10_0">表</h3>
<p>创建表。</p>
<pre>CREATE TABLE [schema.]t_employees (
    employee_id NUMBER(2),                  -- 长度=2的整数
    hire_date DATE DEFAULT SYSDATE,         -- default的例子
	 ...
) AS 子查询;                                -- 利用子查询建立表</pre>
<p>确认表。</p>
<pre>desc t_employees;          -- 确认表结构
SELECT table_name FROM user_tables;         -- 确认用户拥有的表
SELECT DISTINCT object_type FROM user_objects;  -- 确认用户拥有的对象的种类
SELECT * FROM user_catalog;                 -- 确认用户拥有的对象</pre>
<p>修改表</p>
<pre>ALTER TABLE t_employees ADD (colname ..., colname...,);  -- 增加列
ALTER TABLE t_employees MODIFY (colname DATATYPE [DEFAULT ...], colname ...);  -- 修改列定义
ALTER TABLE DROP { COLUMN 列名 | (列名[,列名...])};      -- 删除列，列名用括号或者COLUMN关键字</pre>
<p>其他</p>
<pre>DROP TABLE dept;                                          -- 删除表
RENAME dept TO detail_dept;                               -- 修改名称。
TRUNCATE TABLE detail_dept;                               -- 清空表。
COMMENT ON TABLE employee IS 'Employee Information';      -- 添加注释。</pre>
<p>注释确认可以通过 ALL_COL_COMMENTS、USER_COL_COMMENTS、ALL_TAB_COMMENTS、USER_TAB_COMMENTS 视图的 COMMENTS 列来进行。</p>

<h3 id="content_10_1">制约</h3>
<p>定义制约</p>
<pre>CREATE TABLE employee (
  employee_id NUMBER(6),
  first_name  VARCHAR2(20),
  last_name   VARCHAR2(20) CONSTRAINT last_name_nn NOT NULL,
  email       VARCHAR2(25),
  dept_id     NUMBER(6),
  salary      NUMBER(8,2),
  ...
  job_id      VARCHAR2(10) NOT NULL,
  CONSTRAINT emp_emp_id_pk PRIMARY KEY (employee_id),
  CONSTRAINT emp_email_uk UNIQUE(email),
  CONSTRAINT emp_deptid_fk FOREIGN KEY (department_id) REFERENCES departments(department_id),
  CONSTRAINT emp_salary_min CHECK (salary&gt;0));</pre>
<p>确认制约。</p>
<pre>SELECT constraint_name, constraint_type, search_condition
FROM user_constraints
WHERE table_name='EMPLOYEES';

SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name='EMPLOYEES';</pre>

<h3 id="content_10_2">视图</h3>
<p>选出前n条记录。</p>
<pre>SELECT * FROM ( select ....) WHERE rownum&lt;=n;</pre>

<h3 id="content_10_3">顺序</h3>
<p>创建顺序。</p>
<pre>CREATE SEQUENCE dept_deptdi_seq
  INCREMENT BY 10
  START WITH 120
  MAXVALUE 9999
  NOCACHE
  NOCYCLE;</pre>
<p>确认顺序。</p>
<pre>SELECT sequence_name, min_value, max_value, increment_by, last_number
FROM user_sequences;    -- last_number为上次取得的顺序值</pre>
<p>使用方法</p>
<pre>INSERT INTO departments (department_id, department_name, location_id)
VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);</pre>
<p>变更顺序。</p>
<pre>ALTER SEQUENCE dept_deptid_seq
  INCREMENT BY 20
  MAXVALUE 999999
  NOCACHE
  NOCYCLE;</pre>
<p>删除顺序。</p>
<pre>DROP SEQUENCE dept_deptid_seq;</pre>

<h3 id="content_10_4">索引</h3>
<p>创建索引。</p>
<pre>CREATE INDEX emp_last_name_idx ON employees(last_name);</pre>
<p>确认索引内容。</p>
<pre>SELECT ic.index_name, ic.column_name, ic.column_position col_pos, ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name=ix.index_name AND ic.table_name='YOUR_TABLE_NAME'</pre>

<h3 id="content_10_5">用户</h3>
<p>创建用户。</p>
<pre>CREATE USER scott IDENTIFIED BY tiger;</pre>
<p>赋予权限。</p>
<pre>GRANT create session, create table, create sequence, create view TO scott;  -- 系统权限
GRANT select ON employees TO sue, rich WITH GRANT OPTION;
     -- 对象权限, with grant option表明该用户可以将被赋予的权限再赋予别人
GRANT update (department_name, location_id) ON departments TO PUBLIC;</pre>
<p>取消权限。</p>
<pre>REVOKE select, insert ON departments FROM scott;</pre>
<p>角色。</p>
<pre>CREATE ROLE manager;
GRANT create table, create view TO manager;
GRANT manager TO dehaan, kochhar;</pre>
<p>修改密码。</p>
<pre>ALTER USER scott IDENTIFIED BY lion;</pre>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/06/13/useful-oracle-sql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ORA-01779错误的处理方法</title>
		<link>http://tech.idv2.com/2006/06/02/ora-01779/</link>
		<comments>http://tech.idv2.com/2006/06/02/ora-01779/#comments</comments>
		<pubDate>Fri, 02 Jun 2006 03:47:25 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/102.html</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>Oracle中试图对一个子查询进行更新时可能会出现ORA-01779错误。该错误的内容为：</p>
<pre>ORA-01779: cannot modify a column which maps to a non-key-preserved table</pre>
<!-- end Pukiwiki generated code--><span id="more-82"></span><!-- begin Pukiwiki generated code--><p>例如，使用以下的更新查询就会出现该错误。</p>
<pre>CREATE TABLE test1 (
  id integer primary key,
  num integer
);

INSERT INTO test1 VALUES (1,0);
INSERT INTO test1 VALUES (2,0);
INSERT INTO test1 VALUES (3,0);
INSERT INTO test1 VALUES (4,0);

CREATE TABLE test2 (
  id integer,
  num integer,
  upd integer
);

INSERT INTO test2 VALUES (1,10, 0);
INSERT INTO test2 VALUES (2,20, 1);

UPDATE (
  SELECT 
    t1.id id1, t1.num num1, 
	 t2.id id2, t2.num num2
  FROM
    test1 t1, test2 t2
  WHERE
    t1.id=t2.id AND t2.upd=1
) SET num1=num2;

ORA-01779: cannot modify a column which maps to a non-key-preserved table</pre>
<p>这个错误的意思是，子查询的结果中，更新数据源(test2)的内容不唯一，导致被更新对象(test1)中的一行可能对应数据源(test2)中的多行。
本例中，test2表的id不唯一，因此test2表中可能存在id相同但是num不相同的数据，这种数据是无法用来更新 test1 的。</p>
<p>解决方法就是保证数据源的唯一性，例如本例中可以为test2.id创建一个唯一索引：</p>
<pre>CREATE UNIQUE INDEX test2_idx_001 ON test2 (id);</pre>
<p>之后上面的更新就可以执行了。</p>
<p>另外也可以强制 Oracle 执行，方法是加上 BYPASS_UJVC 注释。</p>
<pre>UPDATE (
  SELECT /*+ BYPASS_UJVC */
    t1.id id1, t1.num num1, 
	 t2.id id2, t2.num num2
  FROM
    test1 t1, test2 t2
  WHERE
    t1.id=t2.id AND t2.upd=1
) SET num1=num2;</pre>
<p>BYPASS_UJVC的作用是跳过Oracle的键检查。
这样虽然能够执行了，但是如果test2中存在不唯一的数据，test1就会被更新多次而导致意想不到的结果。</p>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>Oracle中试图对一个子查询进行更新时可能会出现ORA-01779错误。该错误的内容为：</p>
<pre>ORA-01779: cannot modify a column which maps to a non-key-preserved table</pre>
<!-- end Pukiwiki generated code--><span id="more-82"></span><!-- begin Pukiwiki generated code--><p>例如，使用以下的更新查询就会出现该错误。</p>
<pre>CREATE TABLE test1 (
  id integer primary key,
  num integer
);

INSERT INTO test1 VALUES (1,0);
INSERT INTO test1 VALUES (2,0);
INSERT INTO test1 VALUES (3,0);
INSERT INTO test1 VALUES (4,0);

CREATE TABLE test2 (
  id integer,
  num integer,
  upd integer
);

INSERT INTO test2 VALUES (1,10, 0);
INSERT INTO test2 VALUES (2,20, 1);

UPDATE (
  SELECT 
    t1.id id1, t1.num num1, 
	 t2.id id2, t2.num num2
  FROM
    test1 t1, test2 t2
  WHERE
    t1.id=t2.id AND t2.upd=1
) SET num1=num2;

ORA-01779: cannot modify a column which maps to a non-key-preserved table</pre>
<p>这个错误的意思是，子查询的结果中，更新数据源(test2)的内容不唯一，导致被更新对象(test1)中的一行可能对应数据源(test2)中的多行。
本例中，test2表的id不唯一，因此test2表中可能存在id相同但是num不相同的数据，这种数据是无法用来更新 test1 的。</p>
<p>解决方法就是保证数据源的唯一性，例如本例中可以为test2.id创建一个唯一索引：</p>
<pre>CREATE UNIQUE INDEX test2_idx_001 ON test2 (id);</pre>
<p>之后上面的更新就可以执行了。</p>
<p>另外也可以强制 Oracle 执行，方法是加上 BYPASS_UJVC 注释。</p>
<pre>UPDATE (
  SELECT /*+ BYPASS_UJVC */
    t1.id id1, t1.num num1, 
	 t2.id id2, t2.num num2
  FROM
    test1 t1, test2 t2
  WHERE
    t1.id=t2.id AND t2.upd=1
) SET num1=num2;</pre>
<p>BYPASS_UJVC的作用是跳过Oracle的键检查。
这样虽然能够执行了，但是如果test2中存在不唯一的数据，test1就会被更新多次而导致意想不到的结果。</p>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/06/02/ora-01779/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle SQL性能调节的方法</title>
		<link>http://tech.idv2.com/2006/05/26/oracle-sql-performance-tuning/</link>
		<comments>http://tech.idv2.com/2006/05/26/oracle-sql-performance-tuning/#comments</comments>
		<pubDate>Fri, 26 May 2006 07:59:03 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/101.html</guid>
		<description><![CDATA[简单介绍一下使用tkprof工具调整Oracle SQL语句性能的方法。
<span id="more-81"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_15"></a>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><a href="#content_15_0">  用tkprof工具测量执行时间</a></li>
<li><a href="#content_15_1">  利用EXPLAIN PLAN语句解释执行计划</a></li></ul>
</div>

<hr class="full_hr" />
<h2 id="content_15_0">用tkprof工具测量执行时间</h2>
<p>首先在SQL*Plus中执行以下SQL语句，开启执行记录功能。</p>
<pre>alter session set timed_statistics=true;
alter session set sql_trace=true;</pre>
<p>然后执行要测量时间的SQL语句：</p>
<pre>select 
  user_id, 
  min(site_id) keep (dense_rank first order by dt desc) as site_id
from charlee_test
where site_id in (10,13)
group by user_id</pre>
<p>最后关闭记录功能：</p>
<pre>alter session set sql_trace=false;
alter session set timed_statistics=false;</pre>
<p>这样就记录下了SQL语句的执行log。那么这些log保存在什么地方呢？可以通过以下语句来查看：</p>
<pre>select value from v$parameter where name='user_dump_dest';</pre>
<pre>VALUE
---------------------------------
/opt/oracle/admin/scott/udump</pre>
<p>退出SQL*Plus回到shell（或者另开启一个终端），执行如下命令：</p>
<pre>ll /opt/oracle/admin/scott/udump/*.trc</pre>
<p>利用生成时间找到刚刚生成的log文件，假设为 ora_11111.trc。执行如下命令将该文件转化为可以阅读的格式：</p>
<pre>$ tkprof /opt/oracle/admin/scott/udump/ora_11111.trc ora_11111.prf 
  explain=scott/password aggregate=no sys=no sort=fchela</pre>
<p>使用文本编辑器打开生成的 ora_11111.prf，内容如下：</p>
<pre>********************************************************************************

select user_id, min(site_id) keep (dense_rank first order by dt desc) as site_id
from charlee_test
where site_id in (10,13)
group by user_id

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0          7          0           4
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          0          7          0           4

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 61  (WBRRADM)

Rows     Row Source Operation
-------  ---------------------------------------------------
      4  SORT GROUP BY (cr=7 r=0 w=0 time=153 us)
      5   TABLE ACCESS FULL CHARLEE_TEST (cr=7 r=0 w=0 time=68 us)


Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT   GOAL: CHOOSE
      4   SORT (GROUP BY)
      5    TABLE ACCESS (FULL) OF 'CHARLEE_TEST'</pre>
<p>该报告的第一部分是执行的SQL语句。第二部分是关于此语句的统计信息，其中各个字段的内容如下：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>count</strong>: OCI进程执行的次数</li>
<li><strong>cpu</strong>: 消耗的CPU时间</li>
<li><strong>elapsed</strong>: 总共执行时间</li>
<li><strong>disk</strong>: 将数据从硬盘读取到缓存中的次数</li>
<li><strong>query</strong>: number of buffers gotten for consistent read</li>
<li><strong>current</strong>: number of buffers gotten in current mode</li>
<li><strong>rows</strong>: 查询返回的行数</li></ul>
<p>下面的<strong>Misses in library cache during parse</strong>的值为1表明在共有区域中没有找到缓存，因此需要执行该SQL语句。
其下是执行计划以及每一步执行的代价。代价的描述中各个值的含义如下：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>cr</strong>: 从缓存读入的块数</li>
<li><strong>r</strong>: 从磁盘读入的块数</li>
<li><strong>w</strong>: 向磁盘写入的块数</li>
<li><strong>time</strong>: 合计经过的时间</li></ul>
<pre>Rows     Row Source Operation
-------  ---------------------------------------------------
      6  TABLE ACCESS FULL CHARLEE_TEST (cr=9 r=5 w=0 time=304 us)


Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT   GOAL: CHOOSE
      6   TABLE ACCESS (FULL) OF 'CHARLEE_TEST'</pre>
<p>利用Excel将此部分整理，计算相邻两步的时间差，即可知道哪一步占用时间最大。</p>

<h2 id="content_15_1">利用EXPLAIN PLAN语句解释执行计划</h2>
<p>SQL语句的执行过程不了解的人，很难明白执行计划的意思。Oracle为我们提供的EXPLAIN PLAN可以将执行计划的详细内容输出。</p>
<p>首先要创建EXPLAIN PLAN语句所需的PLAN_TABLE表。在SQL*Plus中执行以下脚本：</p>
<pre>@$ORACLE_HOME/rdbms/admin/utlxplan.sql</pre>
<p>然后执行EXPLAIN PLAN：</p>
<pre>explain plan for
select 
  user_id, 
  min(site_id) keep (dense_rank first order by dt desc) as site_id
from charlee_test
where site_id in (10,13)
group by user_id</pre>
<p>执行下面的脚本可以查看解释结果：</p>
<pre>@$ORACLE_HOME/rdbms/admin/utlxpls.sql

----------------------------------------------------------------------
| Id  | Operation            |  Name         | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |       |       |       |
|   1 |  SORT GROUP BY       |               |       |       |       |
|*  2 |   TABLE ACCESS FULL  | CHARLEE_TEST  |       |       |       |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(&quot;CHARLEE_TEST&quot;.&quot;SITE_ID&quot;=10 OR
              &quot;CHARLEE_TEST&quot;.&quot;SITE_ID&quot;=13)

Note: rule based optimization</pre>
<!-- end Pukiwiki generated code-->

]]></description>
			<content:encoded><![CDATA[简单介绍一下使用tkprof工具调整Oracle SQL语句性能的方法。
<span id="more-81"></span><!-- begin Pukiwiki generated code--><div class="contents">
<a id="contents_16"></a>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><a href="#content_16_0">  用tkprof工具测量执行时间</a></li>
<li><a href="#content_16_1">  利用EXPLAIN PLAN语句解释执行计划</a></li></ul>
</div>

<hr class="full_hr" />
<h2 id="content_16_0">用tkprof工具测量执行时间</h2>
<p>首先在SQL*Plus中执行以下SQL语句，开启执行记录功能。</p>
<pre>alter session set timed_statistics=true;
alter session set sql_trace=true;</pre>
<p>然后执行要测量时间的SQL语句：</p>
<pre>select 
  user_id, 
  min(site_id) keep (dense_rank first order by dt desc) as site_id
from charlee_test
where site_id in (10,13)
group by user_id</pre>
<p>最后关闭记录功能：</p>
<pre>alter session set sql_trace=false;
alter session set timed_statistics=false;</pre>
<p>这样就记录下了SQL语句的执行log。那么这些log保存在什么地方呢？可以通过以下语句来查看：</p>
<pre>select value from v$parameter where name='user_dump_dest';</pre>
<pre>VALUE
---------------------------------
/opt/oracle/admin/scott/udump</pre>
<p>退出SQL*Plus回到shell（或者另开启一个终端），执行如下命令：</p>
<pre>ll /opt/oracle/admin/scott/udump/*.trc</pre>
<p>利用生成时间找到刚刚生成的log文件，假设为 ora_11111.trc。执行如下命令将该文件转化为可以阅读的格式：</p>
<pre>$ tkprof /opt/oracle/admin/scott/udump/ora_11111.trc ora_11111.prf 
  explain=scott/password aggregate=no sys=no sort=fchela</pre>
<p>使用文本编辑器打开生成的 ora_11111.prf，内容如下：</p>
<pre>********************************************************************************

select user_id, min(site_id) keep (dense_rank first order by dt desc) as site_id
from charlee_test
where site_id in (10,13)
group by user_id

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0          7          0           4
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.00       0.00          0          7          0           4

Misses in library cache during parse: 1
Optimizer goal: CHOOSE
Parsing user id: 61  (WBRRADM)

Rows     Row Source Operation
-------  ---------------------------------------------------
      4  SORT GROUP BY (cr=7 r=0 w=0 time=153 us)
      5   TABLE ACCESS FULL CHARLEE_TEST (cr=7 r=0 w=0 time=68 us)


Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT   GOAL: CHOOSE
      4   SORT (GROUP BY)
      5    TABLE ACCESS (FULL) OF 'CHARLEE_TEST'</pre>
<p>该报告的第一部分是执行的SQL语句。第二部分是关于此语句的统计信息，其中各个字段的内容如下：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>count</strong>: OCI进程执行的次数</li>
<li><strong>cpu</strong>: 消耗的CPU时间</li>
<li><strong>elapsed</strong>: 总共执行时间</li>
<li><strong>disk</strong>: 将数据从硬盘读取到缓存中的次数</li>
<li><strong>query</strong>: number of buffers gotten for consistent read</li>
<li><strong>current</strong>: number of buffers gotten in current mode</li>
<li><strong>rows</strong>: 查询返回的行数</li></ul>
<p>下面的<strong>Misses in library cache during parse</strong>的值为1表明在共有区域中没有找到缓存，因此需要执行该SQL语句。
其下是执行计划以及每一步执行的代价。代价的描述中各个值的含义如下：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>cr</strong>: 从缓存读入的块数</li>
<li><strong>r</strong>: 从磁盘读入的块数</li>
<li><strong>w</strong>: 向磁盘写入的块数</li>
<li><strong>time</strong>: 合计经过的时间</li></ul>
<pre>Rows     Row Source Operation
-------  ---------------------------------------------------
      6  TABLE ACCESS FULL CHARLEE_TEST (cr=9 r=5 w=0 time=304 us)


Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT   GOAL: CHOOSE
      6   TABLE ACCESS (FULL) OF 'CHARLEE_TEST'</pre>
<p>利用Excel将此部分整理，计算相邻两步的时间差，即可知道哪一步占用时间最大。</p>

<h2 id="content_16_1">利用EXPLAIN PLAN语句解释执行计划</h2>
<p>SQL语句的执行过程不了解的人，很难明白执行计划的意思。Oracle为我们提供的EXPLAIN PLAN可以将执行计划的详细内容输出。</p>
<p>首先要创建EXPLAIN PLAN语句所需的PLAN_TABLE表。在SQL*Plus中执行以下脚本：</p>
<pre>@$ORACLE_HOME/rdbms/admin/utlxplan.sql</pre>
<p>然后执行EXPLAIN PLAN：</p>
<pre>explain plan for
select 
  user_id, 
  min(site_id) keep (dense_rank first order by dt desc) as site_id
from charlee_test
where site_id in (10,13)
group by user_id</pre>
<p>执行下面的脚本可以查看解释结果：</p>
<pre>@$ORACLE_HOME/rdbms/admin/utlxpls.sql

----------------------------------------------------------------------
| Id  | Operation            |  Name         | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |       |       |       |
|   1 |  SORT GROUP BY       |               |       |       |       |
|*  2 |   TABLE ACCESS FULL  | CHARLEE_TEST  |       |       |       |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(&quot;CHARLEE_TEST&quot;.&quot;SITE_ID&quot;=10 OR
              &quot;CHARLEE_TEST&quot;.&quot;SITE_ID&quot;=13)

Note: rule based optimization</pre>
<!-- end Pukiwiki generated code-->

]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/05/26/oracle-sql-performance-tuning/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQL*Plus常用命令</title>
		<link>http://tech.idv2.com/2006/05/25/useful-sqlplus-commands/</link>
		<comments>http://tech.idv2.com/2006/05/25/useful-sqlplus-commands/#comments</comments>
		<pubDate>Thu, 25 May 2006 01:21:39 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sqlplus]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/100.html</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>启动时不连接服务器。</p>
<pre>sqlplus /nolog</pre>
<p>连接服务器的命令：</p>
<pre>connect username/password@hoststring</pre>
<p>设置行宽为1000字符。</p>
<pre>set line 1000</pre>
<p>设置列group_name的宽度为30字符。</p>
<pre>col group_name format a30</pre>
<p>启动外部编辑器编辑sql语句。</p>
<pre>ed</pre>
<p>设置ed命令启动的外部编辑器为vim。</p>
<pre>define _EDITOR=vim</pre>
<p>使用Windows下的gvim作为编辑器时应当加上-f参数。</p>
<pre>define _EDITOR=&quot;gvim -f&quot;</pre>
<p>设置每页显示200条记录。</p>
<pre>set pagesize 200</pre>
<p>登录时自动执行的SQL脚本。</p>
<pre>$ORACLE_HOME/sqlplus/admin/glogin.sql</pre>
<p>各个用户自己的登录脚本。Oracle会在执行完glogin.sql之后执行该文件。搜索顺序为：当前目录-&gt;$SQLPATH。</p>
<pre>login.sql</pre>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>启动时不连接服务器。</p>
<pre>sqlplus /nolog</pre>
<p>连接服务器的命令：</p>
<pre>connect username/password@hoststring</pre>
<p>设置行宽为1000字符。</p>
<pre>set line 1000</pre>
<p>设置列group_name的宽度为30字符。</p>
<pre>col group_name format a30</pre>
<p>启动外部编辑器编辑sql语句。</p>
<pre>ed</pre>
<p>设置ed命令启动的外部编辑器为vim。</p>
<pre>define _EDITOR=vim</pre>
<p>使用Windows下的gvim作为编辑器时应当加上-f参数。</p>
<pre>define _EDITOR=&quot;gvim -f&quot;</pre>
<p>设置每页显示200条记录。</p>
<pre>set pagesize 200</pre>
<p>登录时自动执行的SQL脚本。</p>
<pre>$ORACLE_HOME/sqlplus/admin/glogin.sql</pre>
<p>各个用户自己的登录脚本。Oracle会在执行完glogin.sql之后执行该文件。搜索顺序为：当前目录-&gt;$SQLPATH。</p>
<pre>login.sql</pre>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2006/05/25/useful-sqlplus-commands/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle中NULL值相关问题</title>
		<link>http://tech.idv2.com/2005/06/03/oracle-null-info/</link>
		<comments>http://tech.idv2.com/2005/06/03/oracle-null-info/#comments</comments>
		<pubDate>Fri, 03 Jun 2005 03:34:52 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://charlee.itbdns.com/tech/archive/57.html</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>NULL值不等于0，也不等于空，它表示该值不定。</p>
<p>任何运算（加减乘除、字符串连接等）的运算数中包括NULL值时，整个表达式的值即为NULL。使用单行函数对NULL值进行处理，得到的结果也为NULL（NVL等函数除外）。</p>
<p>但是NULL值的布尔运算结果并不一定是NULL，例外的情况为，FALSE AND NULL 结果为FALSE，TRUE OR NULL 结果为TRUE。这是因为在AND运算时只要有一个运算数为FALSE结果即为FALSE，即使另一个运算数为NULL，结果也是一定为FALSE的。反之OR运算中，只要有一个运算数为TRUE，结果即为TRUE。</p>
<p>分组函数均忽略NULL值。</p>
<p>排序时，NULL被看作是最大的值，即正序时NULL显示在最下方，逆序时NULL显示在最上方。</p>
<p>处理NULL值的函数有如下几个：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>NVL(参数1, 参数2)</strong>：如果参数1不为NULL，则返回参数1；如果参数1为NULL，则返回参数2</li>
<li><strong>NVL2(参数1, 参数2, 参数3)</strong>：如果参数1不为NULL，则返回参数2；如果参数1为NULL，则返回参数3。该函数的返回值的类型总是与参数2相同，当参数1为NULL时，Oracle会将参数3转换成参数2的数据类型之后再返回。</li>
<li><strong>NULLIF(参数1, 参数2) </strong>：如果参数1等于参数2，则返回NULL；如果参数1不等于参数2，则返回参数1。</li>
<li><strong>COALESCE(参数1, 参数2, ..., 参数n)</strong>：返回参数1到参数n中第一个不为NULL的值。</li></ul>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>NULL值不等于0，也不等于空，它表示该值不定。</p>
<p>任何运算（加减乘除、字符串连接等）的运算数中包括NULL值时，整个表达式的值即为NULL。使用单行函数对NULL值进行处理，得到的结果也为NULL（NVL等函数除外）。</p>
<p>但是NULL值的布尔运算结果并不一定是NULL，例外的情况为，FALSE AND NULL 结果为FALSE，TRUE OR NULL 结果为TRUE。这是因为在AND运算时只要有一个运算数为FALSE结果即为FALSE，即使另一个运算数为NULL，结果也是一定为FALSE的。反之OR运算中，只要有一个运算数为TRUE，结果即为TRUE。</p>
<p>分组函数均忽略NULL值。</p>
<p>排序时，NULL被看作是最大的值，即正序时NULL显示在最下方，逆序时NULL显示在最上方。</p>
<p>处理NULL值的函数有如下几个：</p>
<ul class="list1" style="padding-left:16px;margin-left:16px"><li><strong>NVL(参数1, 参数2)</strong>：如果参数1不为NULL，则返回参数1；如果参数1为NULL，则返回参数2</li>
<li><strong>NVL2(参数1, 参数2, 参数3)</strong>：如果参数1不为NULL，则返回参数2；如果参数1为NULL，则返回参数3。该函数的返回值的类型总是与参数2相同，当参数1为NULL时，Oracle会将参数3转换成参数2的数据类型之后再返回。</li>
<li><strong>NULLIF(参数1, 参数2) </strong>：如果参数1等于参数2，则返回NULL；如果参数1不等于参数2，则返回参数1。</li>
<li><strong>COALESCE(参数1, 参数2, ..., 参数n)</strong>：返回参数1到参数n中第一个不为NULL的值。</li></ul>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2005/06/03/oracle-null-info/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
