﻿<?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博客-我的ITblog我作主　　关注→　『伊波拉』→　测试　SzDlinXie- ITblog　　  　　   -随笔分类-数据库信息资料</title><link>http://www.cnitblog.com/szdlinxie/category/4493.html</link><description>·√·  本ITblog站点记录相关的软件技术文档、网络技术杂志、测试技术杂谈等技术文档的管理站点.联系方式：MSN：dowling@sunlike.cn   QQ:94595885</description><language>zh-cn</language><lastBuildDate>Thu, 06 Oct 2011 11:10:15 GMT</lastBuildDate><pubDate>Thu, 06 Oct 2011 11:10:15 GMT</pubDate><ttl>60</ttl><item><title>.net读写INI文件的函数</title><link>http://www.cnitblog.com/szdlinxie/archive/2008/12/31/53298.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 31 Dec 2008 06:10:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2008/12/31/53298.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/53298.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2008/12/31/53298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/53298.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/53298.html</trackback:ping><description><![CDATA[<p style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana">Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32<br>&nbsp;&nbsp;&nbsp; Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Int32<o:p></o:p></span></p>
<p style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; Public Function GetINI(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim Str As String = LSet(Str, 256)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetPrivateProfileString(Section, AppName, lpDefault, Str, Len(Str), FileName)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1)<br>&nbsp;&nbsp;&nbsp; End Function<br>&nbsp;&nbsp;&nbsp; Public Function WriteINI(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteINI = WritePrivateProfileString(Section, AppName, lpDefault, FileName)<br>&nbsp;&nbsp;&nbsp; End Function<o:p></o:p></span></p>
<br>写:<br>
<p style="WORD-BREAK: break-all; LINE-HEIGHT: 12pt"><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana">Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim path As String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = Application.StartupPath + "\文件名.ini"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriteINI("aa", "a1", 内容, path)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Catch ex As Exception<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Try<br>&nbsp;&nbsp;&nbsp; End Sub<br><o:p><br>读:<br><span>Dim path As String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = Application.StartupPath + "\文件名.ini"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textbox.Text = GetINI("aa", "a1", "", path)<br><br></span><br></o:p></span></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/53298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2008-12-31 14:10 <a href="http://www.cnitblog.com/szdlinxie/archive/2008/12/31/53298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批量插入数据MYSQL</title><link>http://www.cnitblog.com/szdlinxie/archive/2008/10/10/50062.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 10 Oct 2008 09:46:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2008/10/10/50062.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/50062.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2008/10/10/50062.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/50062.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/50062.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>@echo off</span></p>
<p><span>cls</span></p>
<p>&nbsp;</p>
<p><span>set CLASSPATH=..\api\jogre.jar</span></p>
<p><span>set CLASSPATH=%CLASSPATH%;.</span></p>
<p><span>set CLASSPATH=%CLASSPATH%;classes</span></p>
<p><span>set CLASSPATH=%CLASSPATH%;lib\dom4j.jar</span></p>
<p>&nbsp;</p>
<p><span>java org.jogre.server.JogreServer</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>建表<span><br>[code]<br>create database con_test;<br>use con_test;<br>create table test(id int not null,txt varchar (70),primary key (id),index (id));<br>[/code]<br><br></span>就两个字段，<span>id</span>加索引。<span><br><br></span>用<span>java</span>程序给表循环<span>10</span>万次插入纪录，<span>id(</span>循环次数<span>) </span>和 内容<span>(</span>这条记录是第<span>=xx)<br><br><br>InsertTestMysql.java<br><br>[code]<br>import java.lang.*;<br>import java.sql.*;<br><br>public class InsertTestMysql{<br>&nbsp; &nbsp; &nbsp; &nbsp; public static void main(String [] args){&nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java.util.Date now_start = new java.util.Date();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long start_time=now_start.getTime();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int st = 100000;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String str,info;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String db="org.gjt.mm.mysql.Driver";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String host="jdbc:mysql://192.168.1.35/test";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String user="root";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String passwd="root";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Connection con=null;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try{<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Class.forName(db).newInstance();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catch(Exception e){<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("</span>加载驱动失败<span>:"+db);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try{<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; con=DriverManager.getConnection(host,user,passwd);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; con.setAutoCommit(false);//</span>关闭事务自动提交<span><br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i=1;i&lt;=st;i++){<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; info = "</span>这条记录是第<span>=";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; info = info.concat(java.lang.Integer.toString(i));<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; str = "insert into test (id,txt) values(?,?);";<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PreparedStatement pstmt = con.prepareStatement(str);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pstmt.setInt(1,i);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pstmt.setString(2,info);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pstmt.executeUpdate();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; con.commit();//</span>语句执行完毕，提交本事务<span><br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; con.close();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; catch(Exception e) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;System.out.println(e);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java.util.Date now_end = new java.util.Date();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long end_time=now_end.getTime();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long use_time=end_time-start_time;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("&lt;&lt;---</span>本页生成耗时<span>["+use_time+"]</span>毫秒<span>("+((double)use_time)/1000+"</span>秒<span>)---&gt;&gt;");<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("\n&lt;&lt;---</span>共插入记录<span>"+st+"</span>条<span>--&gt;&gt;");<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>}<br>[/code]<br><br><br></span>在不同版本的<span>jdbc</span>下，表现不同。<span><br><br>jdbc <st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False">3.1.7</st1:chsdate>, 12770,12778 </span>插入这个数目时，程序退出，中文正常。<span><br>jdbc 3.1.12 12000 </span>插入这个数目时，程序退出，中文正常。<span><br><br></span>均出现以下提示：<span><br>"Exception in thread "main" java.lang.OutOfMemoryError: Java heap space"<br>&#8220;Java </span>堆 空间 错误<span>&#8221;</span>，可能是我机器内存不够。但用<span>3.10</span>系列<span>jdbc</span>就正常。<span><br><br>jdbc 3.0.16-ga 10</span>万记录正常，中文正常。<span><br>jdbc 3.0.10 10</span>万记录成功，但中文错误。<span><br><br></span>使用<span>3.1</span>系列<span>jdbc</span>，程序运行后，机器剩余物理内存很快就成了<span>40xxKB</span>了。<span><br><br></span>这个，也可能是<span>jdbc3.1</span>系列需要内存大，我机器内存不足。<span><br><br></span>明天再去同学的<span>AMD64 <st1:chmetcnv w:st="on" UnitName="m" SourceValue="512" HasSpace="False" Negative="False" NumberType="1" TCSC="0">512M</st1:chmetcnv> RAM </span>机器测试。<span><br><br><br></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>jdbc <st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False">3.0.16</st1:chsdate>-ga </span><span>唯一这个正常的，测试结果为：<span><br><br>[code]<br>D:\Program Files\test\db_test&gt;java InsertTestMysql<br>&lt;&lt;---</span>本页生成耗时<span>[98582]</span>毫秒<span>(98.582</span>秒<span>)---&gt;&gt;<br><br>&lt;&lt;---</span>共插入记录<span>100000</span>条<span>--&gt;&gt;<br>[/code]</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>前几天又测试了下，用开源的<span>jdts </span>的<span>jdbc </span>连接<span>ms-sql server 2000&nbsp;&nbsp;sp3 </span>其他同上，测试结果惨不忍睹：<span><br><br>[code]<br>D:\dev\java\src\ts\Ms-Sql&gt;java InsertTestMssql<br>&lt;&lt;---</span>本页生成耗时<span>[1746681]</span>毫秒<span>(1746.681</span>秒<span>)---&gt;&gt;<br><br>&lt;&lt;---</span>共插入记录<span>100000</span>条<span>--&gt;&gt;<br>[/code]<br><br><br></span>因为<span>MicorSoft</span>官方的<span>jdbc</span>不支持手动提交，因此用开源<span>jdts</span>的<span>,</span>反正官方测试报告说<span>jdts</span>性能在<span>ms-sql</span>的<span>java</span>驱动里性能最好。<span><br><br><br></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>把<span>insert </span>语句注释掉， 看你的程序运行<span>10</span>次是否会正常</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>--&gt;<br>Error</span><span>即是<span>JVM</span>的問題<span>,</span>大概是<span>garbage collection</span>太慢<span>:roll:<br><br></span>試試每<span>10000</span>條作一次<span>garbage collection </span>看看<span>:roll:<br><br>--&gt;<br></span>這句每一次作了<span>3</span>個物件<span>,</span>改一個看看<span><br><br><br></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>--&gt;<br><br></span><span>但是配合<st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False"><span>3.0.16</span></st1:chsdate>和<span>3.0.10 </span>都没问题。<span><br><br><br></span>我也曾设置过，每执行<span>1000</span>次就提交一次，照样是用<span>3.1</span>的驱动出问题。还是<span>1w2</span>时候。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>事务太长了，每插入一条就<span>commit</span>一次；偶插入过<span>3</span>千万条，没有问题的</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>昨天，用<st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False"><span>3.1.12</span></st1:chsdate>驱动，在同学的<span>AMD 64 + <st1:chmetcnv w:st="on" UnitName="m" SourceValue="512" HasSpace="False" Negative="False" NumberType="1" TCSC="0">512M</st1:chmetcnv> RAM </span>上测试了，<span>2W</span>记录，使用<span>java -Xmx<st1:chmetcnv w:st="on" UnitName="m" SourceValue="64" HasSpace="False" Negative="False" NumberType="1" TCSC="0">64m</st1:chmetcnv> -Xmx<st1:chmetcnv w:st="on" UnitName="m" SourceValue="128" HasSpace="False" Negative="False" NumberType="1" TCSC="0">128m</st1:chmetcnv> </span>参数运行，可以顺利通过。<span><br><br></span>但<span>10W</span>记录，照样完蛋。机器消耗的总内存<span>(</span>物理<span>+</span>交换文件<span>)</span>达到<span>1.4GB </span>后，因为空间不够，自动中止。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>如果直接插入而不用事务机制呢？</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>--&gt;<br><br></span><span>我每次测试，首先就是默认的自动提交<span>(</span>每语句<span>)</span>，用<span>3.1</span>驱动还是出错。<span><br><br></span>当记录数目小到能正常完成时，自动提交耗时是一次事务的<span>10</span>倍时间（记录不太多时，大于<span>1W</span>，差距缩小到<span>2~3</span>倍）。<span><br><br></span>自动提交<span>:<br>[code]<br>## </span>默认<span><br>D:\Program Files\test\db_test&gt;java InsertTestMysql<br>&lt;&lt;---</span>本页生成耗时<span>[43693]</span>毫秒<span>(43.693</span>秒<span>)---&gt;&gt;<br><br>&lt;&lt;---</span>共插入记录<span>1000</span>条<span>--&gt;&gt;<br>[/code]<br><br></span>一次事务<span>:<br>[code]<br>## </span>控制<span>COMMIT,</span>一次性提交<span><br>D:\Program Files\test\db_test&gt;java InsertTestMysql<br>&lt;&lt;---</span>本页生成耗时<span>[3846]</span>毫秒<span>(3.846</span>秒<span>)---&gt;&gt;<br><br>&lt;&lt;---</span>共插入记录<span>1000</span>条<span>--&gt;&gt;<br>[/code]<br><br><br></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>没问题啊，。我们每天都通过ｊａｖａ程序插入几十万条数据做测试，都可以的</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left>&nbsp;</p>
<div align=center>
<table cellSpacing=1 cellPadding=0 width="95%" border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><span>//</span><span>用<span>mysql</span>自己的驱动程序，下面的测试程序插入<span>100000</span>条记录，结果是：<span><br>//&lt;&lt;---</span>本页生成耗时<span>[82781]</span>毫秒<span>(82.781</span>秒<span>)---&gt;&gt;<br>//&lt;&lt;---</span>共插入记录<span>100000</span>条<span>--&gt;&gt;<br>import java.sql.*;<br><br>public class InsertTestMysql {<br>&nbsp; &nbsp; &nbsp; &nbsp; public static void main(String[] args) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java.util.Date now_start = new java.util.Date();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long start_time = now_start.getTime();<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int st = 100000;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String db = "com.mysql.jdbc.Driver";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String host = "jdbc:mysql://192.168.2.108/develop";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String user = "whl";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String passwd = "MVu9H370uG";<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Connection con = null;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Class.forName(db).newInstance();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("</span>加载驱动失败<span>:" + db);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; con = DriverManager.getConnection(host, user, passwd);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PreparedStatement pstmt = con.prepareStatement("insert into test (id,txt) values(?,?);");<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 1; i &lt;= st; i++) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pstmt.setInt(1, i);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pstmt.setString(2, "</span>这条记录是第<span>=" + i);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pstmt.executeUpdate();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; con.close();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception e) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(e);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; java.util.Date now_end = new java.util.Date();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long end_time = now_end.getTime();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long use_time = end_time - start_time;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("&lt;&lt;---</span>本页生成耗时<span>[" + use_time + "]</span>毫秒<span>("<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + ((double) use_time) / 1000 + "</span>秒<span>)---&gt;&gt;");<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("\n&lt;&lt;---</span>共插入记录<span>" + st + "</span>条<span>--&gt;&gt;");<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>}</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align=left><span><a href="http://pigdogyourmother.ycool.com/post.1723176.html"><strong><span>MySQL</span></strong><strong><span><span>存储过程资料收集</span></span></strong></a></span></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>表<span>A </span></span></strong></p>
<table cellSpacing=1 cellPadding=0 width=542 border=0>
    <tbody>
        <tr>
            <td>
            <table cellPadding=0 width=535 border=0>
                <tbody>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><strong><span>声明</span></strong></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><strong><span>描述</span></strong></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>CREATE PROCEDURE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>建立一个存放在<span>MySQL</span>数据库的表格的存储过程。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>CREATE FUNCTION</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>建立一个用户自定义的函数，尤其是返回数据的存储过程。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>ALTER PROCEDURE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>更改用<span>CREATE PROCEDURE </span>建立的预先指定的存储过程，其不会影响相关存储过程或存储功能。<span>.</span></span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>ALTER FUNCTION</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>更改用<span>CREATE FUNCTION </span>建立的预先指定的存储过程，其不会影响相关存储过程或存储功能。<span>.</span></span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>DROP PROCEDURE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>从<span>MySQL</span>的表格中删除一个或多个存储过程。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>DROP FUNCTION</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>从<span>MySQL</span>的表格中删除一个或多个存储函数。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>SHOW CREATE PROCEDURE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>返回使用<span>CREATE PROCEDURE </span>建立的预先指定的存储过程的文本。这一声明是<span>SQL:2003</span>规范的一个<span>MySQL</span>扩展。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>SHOW CREATE FUNCTION</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>返回使用<span>CREATE &nbsp;FUNCTION</span>建立的预先指定的存储过程的文本。这一声明是<span>SQL:2003</span>规范的一个<span>MySQL</span>扩展。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>SHOW PROCEDURE STATUS</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>返回一个预先指定的存储过程的特性，包括名称、类型、建立者、建立日期、以及更改日期。这一声明是<span>SQL:2003</span>规范的一个<span>MySQL</span>扩展。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>SHOW FUNCTION STATUS</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>返回一个预先指定的存储函数的特性，包括名称、类型、建立者、建立日期、以及更改日期。这一声明是<span>SQL:2003</span>规范的一个<span>MySQL</span>扩展。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>CALL</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>调用一个使用<span>CREATE PROCEDURE</span>建立的预先指定的存储过程。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>BEGIN ... END</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>包含一组执行的多声明。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>DECLARE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>用于指定当地变量、环境、处理器，以及指针。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>SET</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>用于更改当地和全局服务器变量的值。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>SELECT ... INTO</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>用于存储显示变量的纵列。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>OPEN</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>用于打开一个指针。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>FETCH</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>使用特定指针来获得下一列。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>CLOSE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>用于关闭和打开指针。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>IF</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>一个<span>An if-then-else-end if </span>声明。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>CASE ... WHEN</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>一个<span> case</span>声明的结构</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><st1:place w:st="on"><span>LOOP</span></st1:place></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>一个简单的循环结构；可以使用<span>LEAVE </span>语句来退出。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>LEAVE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>用于退出<span>IF</span>，<span>CASE</span>，<span>LOOP</span>，<span>REPEAT</span>以及<span>WHILE </span>语句。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>ITERATE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>用于重新开始循环。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>REPEAT</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>在结束时测试的循环。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>WHILE</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>在开始时测试的循环。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td vAlign=top width=172>
                        <p align=left><span>RETURNS</span></p>
                        </td>
                        <td vAlign=top width=349>
                        <p align=left><span>返回一个存储过程的值。</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p align=left></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left><span>MySQL 5.0</span><span>支持存储过程语句。</span></p>
<p align=left>&nbsp;</p>
<table cellPadding=0 border=0>
    <tbody>
        <tr>
            <td>
            <p align=left><strong><span>一<span>.</span>创建存储过程</span></strong></p>
            <p align=left><span>1.</span><span>基本语法：</span></p>
            <p align=left><span>create&nbsp;procedure&nbsp;sp_name()<br>begin<br>.........<br>end</span></p>
            <p align=left><span>2.</span><span>参数传递</span></p>
            <p align=left><strong><span>二<span>.</span>调用存储过程</span></strong></p>
            <p align=left><span>1.</span><span>基本语法：<span>call&nbsp;sp_name()<br></span>注意：存储过程名称后面必须加括号，哪怕该存储过程没有参数传递</span></p>
            <p align=left><strong><span>三<span>.</span>删除存储过程</span></strong></p>
            <p align=left><span>1.</span><span>基本语法：<span><br>drop&nbsp;procedure&nbsp;sp_name//<br>2.</span>注意事项<span><br>(1)</span>不能在一个存储过程中删除另一个存储过程，只能调用另一个存储过程</span></p>
            <p align=left><strong><span>四<span>.</span>区块，条件，循环</span></strong></p>
            <p align=left><span>1.</span><span>区块定义，常用<span><br>begin<br>......<br>end;<br></span>也可以给区块起别名，如：<span><br>lable:begin<br>...........<br>end&nbsp;lable;<br></span>可以用<span>leave&nbsp;lable;</span>跳出区块，执行区块以后的代码<span><br>2.</span>条件语句</span></p>
            <p align=left><span><span>if</span>&nbsp;</span><span>条件&nbsp;</span><span>then</span><span><br>statement<br></span><span>else</span><span><br>statement<br></span><span>end</span>&nbsp;<span>if</span><span>;</span></p>
            <p align=left><span><br>3.</span><span>循环语句<span><br>(1).while</span>循环</span></p>
            <p align=left><span><span>[label:]</span>&nbsp;<span>WHILE</span><span>&nbsp;expression&nbsp;DO<br><br>statements<br><br></span><span>END</span>&nbsp;<span>WHILE</span>&nbsp;<span>[label]</span><span>&nbsp;;<br></span></span></p>
            <p align=left>&nbsp;</p>
            <p align=left><span>(2).loop</span><span>循环</span></p>
            <p align=left><span><span>[label:]</span><span>&nbsp;<st1:place w:st="on">LOOP</st1:place><br><br>statements<br><br></span><span>END</span><span>&nbsp;LOOP&nbsp;</span><span>[label]</span><span>;</span></span></p>
            <p align=left>&nbsp;</p>
            <p align=left><span>(3).repeat&nbsp;until</span><span>循环</span></p>
            <p align=left><span><span>[label:]</span><span>&nbsp;REPEAT<br><br>statements<br><br>UNTIL&nbsp;expression<br><br></span><span>END</span><span>&nbsp;REPEAT&nbsp;</span><span>[label]</span><span>&nbsp;;</span></span></p>
            <p align=left>&nbsp;</p>
            <p align=left><strong><span>五<span>.</span>其他常用命令</span></strong></p>
            <p align=left><span>1.show&nbsp;procedure&nbsp;status<br></span><span>显示数据库中所有存储的存储过程基本信息，包括所属数据库，存储过程名称，创建时间等<span><br>2.show&nbsp;create&nbsp;procedure&nbsp;sp_name</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left><strong><u><span>存储过程创建语法<span>:</span></span></u></strong></p>
<div align=center>
<table cellPadding=0 width="80%" border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>CREATE PROCEDURE procedure_name ([parameter[,...]) </span></p>
            <p align=left><span>[LANGUAGE SQL] </span></p>
            <p align=left><span>[ [NOT] DETERMINISTIC ] </span></p>
            <p align=left><span>[{CONTAINS SQL|MODIFIES SQL DATA|READS SQL DATA|NO SQL}] </span></p>
            <p align=left><span>[SQL SECURITY {DEFINER|INVOKER} ] </span></p>
            <p align=left><span>[COMMENT comment_string] </span></p>
            <p align=left><span>procedure_statements </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span><br>&nbsp;<br></span><span>可用<span>SHOW PROCEDURE STATUS </span>或<span> SHOW CREATE PROCEDURE </span>来查看存储过程信息<span><br></span>另，系统表<span>INFORMATION_SCHEMA.ROUTINES</span>也包含了存储过程的一些信息<span><br></span>同样地<span>,</span>函数也可以使用同样方式查看<span>(SHOW FUNCTION STATUS) </span></span></p>
<p align=left><span><br></span><strong><u><span>函数的创建</span></u></strong><span><br>&nbsp;</span></p>
<div align=center>
<table cellPadding=0 width="80%" border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>CREATE FUNCTION function_name (parameter[,...]) </span></p>
            <p align=left><span>RETURNS datatype </span></p>
            <p align=left><span>[LANGUAGE SQL] </span></p>
            <p align=left><span>[ [NOT] DETERMINISTIC ]</span></p>
            <p align=left><span>[ {CONTAINS SQL | NO SQL | MODIFIES SQL DATA | READS SQL DATA} ] </span></p>
            <p align=left><span>[ SQL SECURITY {DEFINER|INVOKER} ] </span></p>
            <p align=left><span>[ COMMENT comment_string ] </span></p>
            <p align=left><span>语句体<span> </span></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span><br></span><span>函数与存储过程基本一样，其区别主要有<span>:<br>1</span>、&nbsp;要使用<span>RETURNS</span>指定返回类型<span><br>2</span>、&nbsp;函数必须返回值<span>,</span>且在语句体中使用<span>RETURN</span>返回<span>(</span>注意<span>:</span>指定返回类型用<span>RETURNS,</span>返回值用<span>RETURN)<br>3</span>、&nbsp;参数不区分<span>IN</span>，<span>OUT</span>，全部为<span>IN</span>类形</span></p>
<p align=left><span><br></span><span>例<span>:<br>CREATE FUNCTION cust_status(in_status CHAR(1))<br>&nbsp;&nbsp;&nbsp; RETURNS VARCHAR(20)<br>BEGIN<br>&nbsp;&nbsp;&nbsp; DECLARE long_status VARCHAR(20);<br>&nbsp;&nbsp;&nbsp; IF in_status = 'O' THEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET long_status='Overdue';<br>&nbsp;&nbsp;&nbsp; ELSEIF in_status = 'U' THEN&nbsp;&nbsp;&nbsp; SET long_status='Up to date';<br>&nbsp;&nbsp;&nbsp; ELSEIF in_status = 'N' THEN&nbsp;&nbsp;&nbsp; SET long_status='New';<br>&nbsp;&nbsp;&nbsp; END IF;<br>&nbsp;&nbsp;&nbsp; RETURN(long_status);<br>END;<br>&nbsp;<br></span>调用<span>:<br>SELECT cust_status('O');<br>&nbsp;<br></span><strong><u>触发器</u></strong><span><br>&nbsp;</span></span></p>
<div align=center>
<table cellPadding=0 width="80%" border=1>
    <tbody>
        <tr>
            <td>
            <p align=left><span>CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name </span></p>
            <p align=left><span>{BEFORE|AFTER} {UPDATE|INSERT|DELETE} </span></p>
            <p align=left><span>ON table_name </span></p>
            <p align=left><span>FOR EACH ROW </span></p>
            <p align=left><span>trigger_statements </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span><br>&nbsp;<br></span><span>意义<span>:</span>当对表<span>table_name</span>执行<span>update</span>，<span>insert,delete</span>操作之前<span>(before)</span>或之后<span>(after)</span>时触发语句<span>trigger_statements</span>操作</span></p>
<p align=left><span>例<span>:<br>mysql&gt; CREATE TRIGGER account_balance_au<br>&nbsp;AFTER UPDATE ON account_balance FOR EACH ROW<br>BEGIN<br>&nbsp; DECLARE dummy INT;<br>&nbsp; IF NEW.balance&lt;0 THEN<br>&nbsp;&nbsp;&nbsp;&nbsp; SET NEW.balance=NULL;<br>&nbsp; END IF;<br>END<br>&nbsp;<br></span>上述触发器表示<span>:</span>当更新表<span>account_balance</span>之后，如果更新的值<span>balance</span>小于<span>0,</span>则将它改为<span>NULL,<br></span>注<span>:</span>如果为<span>OLD.balance</span>则表示更新前的原值</span></p>
<p>&nbsp;</p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/50062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2008-10-10 17:46 <a href="http://www.cnitblog.com/szdlinxie/archive/2008/10/10/50062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库导入导出方法</title><link>http://www.cnitblog.com/szdlinxie/archive/2008/09/02/48612.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 02 Sep 2008 02:23:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2008/09/02/48612.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/48612.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2008/09/02/48612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/48612.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/48612.html</trackback:ping><description><![CDATA[<strong>.使用命令行：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>数据导出：</strong>
<p style="TEXT-INDENT: 2em"><strong>1.将数据库TEST完全导出,用户名system密码manager导出到D:\daochu.dmp中</strong>
<p style="TEXT-INDENT: 2em">exp system/manager@TEST file=d:\daochu.dmp full=y
<p style="TEXT-INDENT: 2em"><strong>2.将数据库中system用户与sys用户的表导出</strong>
<p style="TEXT-INDENT: 2em">exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
<p style="TEXT-INDENT: 2em"><strong>3.将数据库中的表inner_notify、notify_staff_relat导出</strong>
<p style="TEXT-INDENT: 2em">exp aichannel/aichannel@TESTDB2 file= d:\data\newsmgnt.dmp tables=(inner_notify,notify_staff_relat)
<p style="TEXT-INDENT: 2em"><strong>4.将数据库中的表table1中的字段filed1以"00"打头的数据导出</strong>
<p style="TEXT-INDENT: 2em">exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
<p style="TEXT-INDENT: 2em">上面是常用的导出，对于压缩，既用winzip把dmp文件可以很好的压缩。
<p style="TEXT-INDENT: 2em">也可以在上面命令后面加上compress=y来实现。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>数据的导入：</strong>
<p style="TEXT-INDENT: 2em"><strong>1.将D:\daochu.dmp 中的数据导入 TEST数据库中。</strong>
<p style="TEXT-INDENT: 2em">imp system/manager@TEST file=d:\daochu.dmp
<p style="TEXT-INDENT: 2em">imp aichannel/aichannel@HUST full=y file=file= d:\data\newsmgnt.dmp ignore=y
<p style="TEXT-INDENT: 2em">上面可能有点问题，因为有的表已经存在，然后它就报错，对该表就不进行导入。
<p style="TEXT-INDENT: 2em">在后面加上 ignore=y 就可以了。
<p style="TEXT-INDENT: 2em"><strong>2.将d:\daochu.dmp中的表table1导入</strong>
<p style="TEXT-INDENT: 2em">imp system/manager@TEST file=d:\daochu.dmp tables=(table1)
<p style="TEXT-INDENT: 2em"><strong>2.plsql:</strong>
<p style="TEXT-INDENT: 2em"><strong>数据导出:</strong>
<p style="TEXT-INDENT: 2em">TOOLS-Export user objects(用户对象)
<p style="TEXT-INDENT: 2em">TOOLS-Export tables(表)
<p style="TEXT-INDENT: 2em"><strong>数据的导入：</strong>
<p style="TEXT-INDENT: 2em">TOOLS-Import tables
<p style="TEXT-INDENT: 2em">Oracle Import(表) SQL Inserts(用户对象)
<p style="TEXT-INDENT: 2em">也可以将用户对象的语句拷贝出来，粘贴到Command Window这样的好处是可以看到执行的过程。 </p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/48612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2008-09-02 10:23 <a href="http://www.cnitblog.com/szdlinxie/archive/2008/09/02/48612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL5.1手册(官方英文CHM)_中文MYSQL.CN</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/09/16/33503.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Sun, 16 Sep 2007 12:39:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/09/16/33503.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/33503.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/09/16/33503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/33503.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/33503.html</trackback:ping><description><![CDATA[<a class=l onmousedown="return clk(0,'','','res','3','')" href="http://doc.mysql.cn/mysql5/2006/0416/5525.html" target=_blank><u><font color=#cc0033>MySQL5</font><font color=#551a8b>.</font><font color=#cc0033>1</font><font color=#551a8b>手册(官方英文CHM)_中文MYSQL.CN</font></u></a><a href="http://doc.mysql.cn/mysql5/2006/0416/5525.html"><br><br>http://doc.mysql.cn/mysql5/2006/0416/5525.html</a>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/33503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-09-16 20:39 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/09/16/33503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2常用命令集</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32165.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 21 Aug 2007 13:33:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32165.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/32165.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32165.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/32165.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/32165.html</trackback:ping><description><![CDATA[<p>DB2常用命令集</p>
<p>*************************************************<br>　<br>关闭db2</p>
<p>db2stop 或</p>
<p>db2stop force。</p>
<p>在脚本中一般两个都写上，避免使用db2stop force命令，如：</p>
<p>db2stop</p>
<p>db2stop force</p>
<p>启动db2</p>
<p>db2start</p>
<p>创建数据库</p>
<p>db2 create db &lt;db name&gt;</p>
<p>或db2 create db using codeset GBK territory CN</p>
<p>删除数据库</p>
<p>执行此操作要小心。</p>
<p>db2 drop db &lt;db name&gt;</p>
<p>如果不能删除，断开所有数据库连接或者重启db2。</p>
<p>断开数据库连接</p>
<p>db2 force application all</p>
<p>连接数据库</p>
<p>db2 connect to &lt;db name&gt; user &lt;username&gt; using &lt;password&gt;</p>
<p>断开数据库连接</p>
<p>断开当前数据库连接：db2 connect reset</p>
<p>或者：db2 disconnect current</p>
<p>断开所有数据库的连接：db2 disconnect all</p>
<p>备份数据库</p>
<p>db2 backup db &lt;db name&gt; </p>
<p>备注：执行以上命令之前需要断开数据库连接</p>
<p>恢复数据库</p>
<p>db2 restore db &lt;source db name&gt;</p>
<p>导出数据文件</p>
<p>db2move &lt;db name&gt; export [-sn &lt;模式名称，一般为db2admin&gt;] [-tn&nbsp; &lt;表名，多个之间用逗号分隔&gt;]</p>
<p>导入数据文件</p>
<p>db2move &lt;db name&gt; import</p>
<p>列出数据库中所有db</p>
<p>db2 list db directory</p>
<p>进入db2命令环境</p>
<p>在&#8220;运行&#8221;中执行：db2cmd </p>
<p>获取db2数据库管理配置环境信息&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>db2 get dbm cfg</p>
<p>获取db2某个数据库数据库管理配置环境信息&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>db2 get db cfg for &lt;db name&gt;</p>
<p>或者：连接至某个数据库以后执行db2 get db cfg。</p>
<p>设置联合数据库为可用（默认联合数据库不可用）</p>
<p>db2 update dbm cfg using federated yes</p>
<p>更改db2日志空间的大小</p>
<p>备注：以下命令为了防止db2数据库过份使用硬盘空间而设，仅用于开发者自己机器上的db2，如果是服务器，则参数需要修改。</p>
<p>db2 UPDATE DB CFG FOR &lt;db name&gt; USING logretain OFF logprimary 3 logsecond 2 logfilsiz 25600;</p>
<p>如果页大小是4KB，则以上命令创建3个100M的日志文件，占用300MB硬盘空间。25600*4KB=102400KB。</p>
<p>创建临时表空间</p>
<p>DB2 CREATE USER TEMPORARY TABLESPACE STMASPACE PAGESIZE 32 K MANAGED BY DATABASE USING (FILE 'D:\DB2_TAB\STMASPACE.F1' 10000) EXTENTSIZE 256</p>
<p>获取数据库管理器的快照数据</p>
<p>db2 &#8211;v get snapshot for dbm</p>
<p>显示进行程号</p>
<p>db2 list applications show detail</p>
<p>调查错误</p>
<p>sqlcode:产品特定错误码；</p>
<p>sqlstate:DB2系列产品的公共错误码，符合ISO/ANSI 92SQL标准。</p>
<p>调查sqlcode : db2 ? sql1403n</p>
<p>调查sqlstate: db2 ? 08004</p>
<p>创建表空间</p>
<p>rem 创建缓冲池空间 8K</p>
<p>db2 connect to gather</p>
<p>db2 CREATE BUFFERPOOL STMABMP IMMEDIATE&nbsp; SIZE 25000 PAGESIZE 8K</p>
<p>&nbsp;创建表空间：STMA</p>
<p>&nbsp;必须确认路径正确</p>
<p>D:\DB2Container\Stma</p>
<p>db2 drop tablespace stma</p>
<p>db2 CREATE&nbsp; REGULAR TABLESPACE STMA PAGESIZE 8 K&nbsp; MANAGED BY SYSTEM&nbsp; USING ('D:\DB2Container\Stma' ) EXTENTSIZE 8 OVERHEAD 10.5 PREFETCHSIZE 8 TRANSFERRATE 0.14 BUFFERPOOL&nbsp; STMABMP&nbsp; DROPPED TABLE RECOVERY OFF</p>
<p>db2 connect reset</p>
<p>将暂挂的数据恢复到前滚状态</p>
<p>db2 ROLLFORWARD DATABASE TESTDB TO END OF LOGS AND COMPLETE NORETRIEVE</p>
<p>备份表空间</p>
<p>BACKUP DATABASE YNDC TABLESPACE ( USERSPACE1 ) TO "D:\temp" WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING</p>
<p>创建db2工具数据库</p>
<p>db2 create tools catalog systools create new database toolsdb</p>
<p>如何进行增量/差量备份</p>
<p>增量：上一次完整备份至本次备份之间增加的数据部分；</p>
<p>差量(delta)：上次备份以来（可能是完整备份、增量备份或者差量备份）至本次备份之间增加的数据部分；</p>
<p>更新所有表的统计信息</p>
<p>db2 -v connect to DB_NAME</p>
<p>db2 -v "select tbname, nleaf, nlevels, stats_timefrom sysibm.sysindexes"</p>
<p>db2 -v reorgchkupdate statistics on table all</p>
<p>db2 -v "select tbname, nleaf, nlevels, stats_timefrom sysibm.sysindexes"</p>
<p>db2 -v terminate</p>
<p>对一张表运行统计信息</p>
<p>db2 -v runstatson table TAB_NAMEand indexes all</p>
<p>查看是否对数据库执行了RUNSTATS</p>
<p>db2 -v "select tbname, nleaf, nlevels, stats_timefrom sysibm.sysindexes"</p>
<p>更改缓冲池的大小</p>
<p>缓冲池中，当syscat.bufferpools的npages是-1时，由数据库的配置参数bufferpage控制缓冲池的大小。</p>
<p>将npages的值更改为-1的命令：</p>
<p>db2 -v connect to DB_NAME</p>
<p>db2 -v select * from syscat.bufferpools</p>
<p>db2 -v alter bufferpoolIBMDEFAULTBP size -1</p>
<p>db2 -v connect reset</p>
<p>db2 -v terminate</p>
<p>更改数据库配置参数BufferPages的命令如下：</p>
<p>db2 -v update db cfgfor dbnameusing BUFFPAGE bigger_value</p>
<p>db2 -v terminate</p>
<p>查看数据库监视内容列表</p>
<p>db2 -v get monitor switches</p>
<p>打开某个数据库监视内容</p>
<p>db2 -v update monitor switches using bufferpoolon</p>
<p>获取数据库快照</p>
<p>db2 -v get snapshot for all databases &gt; snap.out</p>
<p>db2 -v get snapshot for dbm&gt;&gt; snap.out</p>
<p>db2 -v get snapshot for all bufferpools&gt;&gt; snap.out</p>
<p>db2 -v terminate</p>
<p>重置数据库快照</p>
<p>db2 -v reset monitor all</p>
<p>计算缓冲池命中率</p>
<p>理想情况下缓冲池命中率在95%以上，计算公式如下：</p>
<p>(1 -((buffer pool data physical reads + buffer pool index physical reads) /(buffer pool data logical reads + pool index logical reads))) *100%</p>
<p>&nbsp;创建db2实例</p>
<p>db2icrt &lt;实例名称&gt;</p>
<p>删除db2实例</p>
<p>db2idrop &lt;实例名称&gt;</p>
<p>设置当前db2实例</p>
<p>set db2intance=db2</p>
<p>&nbsp;显示db2拥有的实例</p>
<p>db2ilist</p>
<p>恢复离线增量备份数据库的命令</p>
<p>DB2 RESTORE DATABASE YNDC INCREMENTAL AUTOMATIC FROM D:\backup\autobak\db2 TAKEN AT 20060314232015</p>
<p>&nbsp;创建样本数据库</p>
<p>在unix平台，使用：sqllib/bin/db2sampl &lt;path&gt;</p>
<p>在windows,os/2平台，使用：db2sampl e,e是可选参数，指定将创建数据库的驱动器；</p>
<p>&nbsp;列出数据库中所有的表</p>
<p>db2 list tables</p>
<p>&nbsp;列出某个表的数据结构</p>
<p>db2 describe table v_ro_role</p>
<p>给表增加列</p>
<p>ALTER TABLE STAFF&nbsp; ADD COLUMN PNHONE VARCHAR(20)</p>
<p>数据迁移方法1</p>
<p>export脚本示例<br>db2 connect to testdb user test password test<br>db2 "export to aa1.ixf of ixf select * from table1"<br>db2 "export to aa2.ixf of ixf select * from table2"<br>db2 connect reset<br>import脚本示例<br>db2 connect to testdb user test password test<br>db2 "load from aa1.ixf of ixf&nbsp; replace into table1&nbsp; COPY NO&nbsp; without prompting "<br>db2 "load from aa2.ixf of ixf&nbsp; replace into table2&nbsp; COPY NO&nbsp; without prompting "<br>db2 connect reset<br></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/32165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-08-21 21:33 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM DB2 日常维护汇总</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32144.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 21 Aug 2007 07:14:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32144.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/32144.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/32144.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/32144.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;1.DB2产品的级别有那些? 　　企业版的NTERPRISEEDITION 　　工作组版WORKGROUPEDITION 　　企业扩展版ENTERPRISEEXTENDEDEDITION 　　个人版的PERSONALEDITION 　　卫星版的SATELLITEEDITION 　　微型版的EVERYPLACE 　　 　　2.可以连接到DB2数据库的产品有哪些? 　　DB2客户端 　...&nbsp;&nbsp;<a href='http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32144.html'>阅读全文</a><img src ="http://www.cnitblog.com/szdlinxie/aggbug/32144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-08-21 15:14 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2 UDB V8.1 管理</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32143.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 21 Aug 2007 07:12:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32143.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/32143.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/32143.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/32143.html</trackback:ping><description><![CDATA[<p align=left><a name=1><strong><span></span></strong></a></p>
<p align=left><span><span>工作学习之余对<span>DB2</span>使用知识的一点零散记录，包括<span>DB2</span>的基础知识、数据库管理、性能调优以及开发等方面，内容非常零散，而且有时不免理解有误，可能并未回头改掉，望见谅，仅供参考。</span></span></p>
<p align=left><a name=2><strong><span>DB2 </span></strong></a><span><strong><span>基本概念</span></strong></span></p>
<p align=left><span><span>在<span>DB2</span>中由上至下的几个概念：</span></span></p>
<ul type=disc>
    <li><span><span>实例<span>(Instance), </span></span></span></li>
    <li><span><span>数据库<span>(Database)</span>，</span></span></li>
    <li><span><span>表空间<span>(TableSpace)</span>，</span></span></li>
    <li><span><span>容器<span>(Container)</span></span></span></li>
</ul>
<p align=left><span><span>在一个操作系统中，<span>DB2</span>数据服务可以同时运行多个实例<span>(</span>有别于<span>Oracle</span>在一个系统内只能起一个实例<span>).</span></span></span></p>
<p align=left><span><span>数据库定义在实例中，一个实例可以包含多个数据库。在同一个实例中的不同数据库是完全独立的，分别拥有自己独立的系统编目表。<span><br><br></span>表空间有<span>2</span>种管理方式：</span></span></p>
<ul type=disc>
    <li><span><span>DMS(Database management Space)</span></span><span><span>方式</span></span></li>
    <li><span><span>SMS(System manegement Space)</span></span><span><span>方式</span></span></li>
</ul>
<p align=left><span><span>DMS</span></span><span><span>与<span>SMS</span>方式在表空间建立时指定，建好后不能转换。对于<span>DMS</span>方式，一个表空间对应了一个或多个容器<span>(Container)</span>，容器指定了数据的物理存储位置。对于<span>SMS</span>方式，只能够指定一个目录，不能够增加。</span></span></p>
<p align=left><span><span>表空间具有以下类型：</span></span></p>
<ul type=disc>
    <li><span><span>系统编目表空间<span>(SysCatSpace)</span></span></span></li>
    <li><span><span>系统临时表空间<span>(SysTempSpace)</span></span></span></li>
    <li><span><span>用户表空间<span>(UserSpace)</span></span></span></li>
    <li><span><span>用户临时表空间<span>(UserTempSpace)</span></span></span></li>
</ul>
<p align=left><span><span>一个数据库中必须存在两个系统基本的表空间，分别是系统编目表空间与系统临时表空间。在数据库中创建的任何对象都以在系统编目表空间中增加记录的方式体现，对于临时表空间，其占用磁盘大小是根据使用情况动态伸缩的，即仅在需要时才分配磁盘空间，并在使用后进行回收。此外，若用户需要创建表，则需要创建用户表空间，若需要使用临时表，则需要创建用户临时表空间。<span><br><br><br></span>容器分为三种类型：</span></span></p>
<ul type=disc>
    <li><span><span>Files </span></span><span><span>文件</span></span></li>
    <li><span><span>Devices </span></span><span><span>设备</span></span></li>
    <li><span><span>Directory </span></span><span><span>目录</span></span></li>
</ul>
<p align=left><span><span>文件与设备，用于<span>DMS</span>方式的表空间；</span></span></p>
<p align=left><span><span>目录，用于<span>SMS</span>方式的表空间，此种方式不需要人工管理数据存储文件，<span>DB2</span>可根据情况在目录中自动增加存储文件，只要磁盘空间允许。</span></span></p>
<p align=left><span><span>实质上，表空间是数据存储的逻辑位置定义，容器则是数据存储的物理位置定义。</span></span></p>
<p align=left><a name=3><strong><span>数据库的性能</span></strong></a></p>
<p align=left><span><span>影响一个数据库的性能主要有以下因素：</span></span></p>
<ul type=disc>
    <li><span><span>磁盘<span>(Disk)</span></span></span></li>
    <li><span><span>内存<span>(Memory)</span></span></span></li>
    <li><span><span>处理器<span>(CPU)</span></span></span></li>
    <li><span><span>网络<span>(Network)</span></span></span></li>
</ul>
<p align=left><span><span>其中以磁盘最为显著，<span>90%</span>的性能瓶颈可能来自于磁盘的<span>IO</span>竞争；</span></span></p>
<p align=left><span><span>其次是内存，一方面是指物理内存的总量要满足需求，另一方面是指与内存相关的配置参数应正确配置；</span></span></p>
<p align=left><span><span>当然处理器的性能也很重要，多路<span>CPU</span>会对哪些依赖计算能力的复杂<span>SQL</span>查询起到显著的效果；</span></span></p>
<p align=left><span><span>网络不属于主要因素，属于客观的环境因素，是指过慢的网速会对数据的传输造成影响。以下列出一些对于提高数据库性能有效的方法：</span></span></p>
<ul type=disc>
    <li><span><span>对于运行数据库服务的服务器可以尽可能的配置多块物理磁盘，每块的容量不必太大，这样可以有效的分担数据存储与读取操作过程的磁盘<span>IO</span>竞争。即采用多块小容量的磁盘在性能上要优于仅采用一块大容量的磁盘。</span></span></li>
    <li><span><span>如果条件允许，尽量使数据存储服务与操作系统分别运行在物理分开的磁盘上。</span></span></li>
    <li><span><span>采用<span>DMS(Database Management Space)</span>管理方式的表空间。</span></span></li>
    <li><span><span>在物理不同的磁盘上创建多个表空间。然后可以将数据和索引分别存放在不同的表空间，这样可以显著的提高性能。还可以把一个使用频繁的大表纵向拆成多个小表，分别存放在不同的表空间中，然后用一个视图进行联合。</span></span></li>
    <li><span><span>DB2</span></span><span><span>服务器可以管理裸设备，即除系统以及<span>DB2</span>服务运行磁盘以外，为<span>DB2</span>数据存放单独准备磁盘，可以是多块，分区后不需要格式化，创建裸设备后直接交给<span>DB2</span>进行管理，用于存储数据。</span></span></li>
    <li><span><span>系统的临时表空间对数据库性能影响很大，当由管理的物理内存不能满足数据库操作的需要时，<span>DB2</span>便会把临时数据写到磁盘上，这时便用到了系统临时表空间，并且这种情况会经常发生。</span></span></li>
    <li><span><span>尽量在磁盘靠近最内层磁道的位置安放数据，因为此处磁盘的访问速度较快。</span></span></li>
</ul>
<p align=left><a name=4><strong><span>与性能相关的主要参数</span></strong></a></p>
<p align=left><span><span>DB2</span></span><span><span>的参数配置分为两个级别，一个是实例级别，另一个是数据库级别。对数据服务性能影响较大的参数主要在数据库级别配置。以下是三个比较重要的内存配置参数：</span></span></p>
<p align=left><span><span>bufferpage<br>locklist<br>sortheap</span></span></p>
<ul type=disc>
    <li><span><span>bufferpage: </span></span><span><span>由同一个数据库中的所有对象共享。</span></span></li>
    <li><span><span>sortheap: </span></span><span><span>用于排序的内存交换区，非共享，不宜设置太大，否则，很容易引起内存耗尽，因为每一个事务都会申请独立的内存用于排序。</span></span></li>
    <li><span><span>locklist: </span></span><span><span>共享内存，用于记录数据服务运行中建立的锁。建议设置<span>20Mb</span>左右，需要时根据实际情况进行调整。<span>DB2</span>默认使用行级锁，如果设置太小，当锁的记录太多时，则会导致内存不足，此时<span>DB2</span>会把多个行锁升级为一个表锁，这样就会大大降低应用程序的并发性能。如果设置太大，则多分配的内存很少会被用到，导致浪费。</span></span></li>
</ul>
<p align=left><span><span>其他的一些配置参数：</span></span></p>
<p align=left><span><span>numdb: </span></span><span><span>同时可以启动的实例数目</span></span></p>
<p align=left><a name=5><strong><span>DB2</span></strong></a><span><strong><span>的常用命令</span></strong></span></p>
<p align=left><span><span>db2ilist </span></span><span><span>列出当前系统中定义的<span>DB2</span>实例<span><br>daslist </span>列出系统中的<span>DAS<br>db2 list database directory </span>列出当前实例中定义的数据库<span><br>db2 list tablespaces </span>列出当前数据库中定义的表空间<span><br>db2 list tabses [for all] </span>列出当前数据库中的表<span><br>db2 list active db </span>列出活动的数据库</span></span></p>
<p align=left><span><span>db2 get dbm config<br>get db cfg for databasename<br>db2 update db cfg for databasename using bufferpage <st1:chmetcnv w:st="on" UnitName="m" SourceValue="600" HasSpace="False" Negative="False" NumberType="1" TCSC="0">600M</st1:chmetcnv><br>db2 alter bufferpool IABMDEFAULTBP size =1<br>db2 list applications show detail</span></span></p>
<p align=left><span><span>以上命令可以在后面加<span> " show detail" </span>参数，显示详细信息。<span><br><br>DB2</span>数据存储的页大小只能在表空间级别统一指定<span>(</span>区别于<span>Oracle</span>，可以定义在表级别<span>), </span>并且建好后不能修改。<span><br><br></span>可以手工建立一个页大小为<span>4K</span>的<span>DMS</span>用户临时表空间，然后把系统默认的<span>SMS</span>系统临时表空间删除。为满足应用需求，一般还应再建立一个页大小在<span>8K</span>以上的用户临时表空间。<span><br><br>DB2 UDB V8.1 </span>对<span>RedHat Linux 9 </span>的支持不好，默认情况下无法启动<span>GUI</span>安装程序<span>(</span>可以通过设置环境<span>LD_ASSUME_KERNEL=<st1:chsdate w:st="on" Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False">2.2.5</st1:chsdate></span>解决<span>)</span>，并且不会安装<span>Sample</span>数据库，控制中心也无法正常启动。</span></span></p>
<p align=left><a name=6><strong><span>DB2 SQL </span></strong></a><span><strong><span>相关</span></strong></span></p>
<p align=left><span><span>当使用<span>COUNT()</span>函数时，如果表中的记录数<span> &gt; 2 147 483 647</span>行，则函数可能返回错误的结果，这时可以使用返回类型为<span>DECIMAL(31, 0)</span>的<span>COUNT_BIG()</span>函数。<span><br><br>DISTINCT </span>关键字可以用在<span>COUNT()</span>函数中，如：</span></span></p>
<p align=left><span><span>SELECT COUNT(DISTINCT id) FROM TABLE</span></span></p>
<p align=left><span><span>这代表将不对<span>id</span>列的重复值进行计数。<span><br><br>ORDER BY</span>子句后面如果写了多个列名，需要分别指定升序或是降序。<span><br><br></span>可以在<span>load</span>大量数据时，暂时关闭表的日志选项。使用：</span></span></p>
<p align=left><span><span>ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY</span></span></p>
<p align=left><span><span>DB2</span></span><span><span>的几个特殊寄存器：</span></span></p>
<p align=left><span><span>CURRENT DATE<br>CURRENT TIME<br>CURRENT TIMESTAMP<br>USER(</span></span><span><span>用户<span>ID)</span></span></span></p>
<p align=left><span><span>有关日期的操作：</span></span></p>
<p align=left><span><span>CURRENT TIMESTAMP + 2 DAYS(or HOURS, SECONDS, MONTHS, YEARS, etc.)</span></span></p>
<p align=left><span><span>case </span></span><span><span>语句的使用：</span></span></p>
<p align=left><span><span>case when </span></span><span><span>条件一<span> then </span>动作一<span> else </span>动作二<span> end; </span></span></span></p>
<p align=left><span><span>以上可以欠套使用。</span></span></p>
<p align=left><span><span>在视图的创建语句中无法使用<span>order by </span>子句与<span> fetch n rows </span>子句。但对于<span>order by</span>可以用如下方法替代实现，不过会影响效率。</span></span></p>
<p align=left><span><span>create view v_name1(c1, c2, c3) as<br>select * from (<br>select column1, column2, column3<br>from t1<br>order by column1 ) as t1;</span></span></p>
<p align=left><span>表空间类型分为<span>SMS</span>和<span>DMS</span>，分别是<span>system management space, database management space. SMS</span>使用方便，简单，无需手工创建和维护数据存储文件。<span>DMS</span>需要手动指定<span>container</span>和存储数据的文件名，并保证有足够磁盘空间可用。<span><br></span>对于一个数据库，至少存在一个<span>page size</span>为<span>4K</span>的系统临时表空间，可以额外建立具有更大<span>page size</span>的用户临时表空间，系统会自动进行使用。<span><br><br></span>无法用<span>alter</span>语句更改一个字段的数据类型，对某些字段可以更改数据长度，这一点上相对于<span>Oracle</span>，<span>DB2</span>的限制要多一些。<span><br></span>可以使用<span>: select </span>表达式<span> from sysibm.sysdummy; </span>替代的，以下语句是等价的：<span>values </span>表达式；<span><br><br><br></span>表和视图的创建、更新、删除操作，都写日志，因此可以<span>commit</span>或<span>rollback</span>。<span><br><br></span>在<span>update</span>语句中，如果没有对定义了默认值的某个字段显式赋值，则更新时，此字段不会重新执行默认值中定义的表达式。为了让其重新执行默认值定义的表达式，可以采用以下方式：</span></p>
<p align=left><span>create table t1 (c1 varchar(32), lastupdatetime with default current timpstamp);<br>update t1 set c1 = 'new string', lastupdatetime = default;</span></p>
<p align=left><span>对于<span>DB2</span>数据库可以在创建时指定<span>codepage</span>参数，创建后不可修改。当应用程序访问数据库时，<span>DB2</span>会比较两者的<span>codepage</span>是否一致，不一致则进行代码页的自动转换。为了减少转换所带来的开销，应尽量保证应用程序所采用的代码页与数据库一致。<span><br><br></span>可以对<span>DB2 CLP</span>工具的<span>codepage</span>进行设置，使用：</span></p>
<p align=left><span>$ db2set DB2CODEPAGE= 1386</span></p>
<p align=left><span>本例中设置的是中文<span>GBK</span>字符集在<span>Windows</span>平台对应的值。注意，这个数字值是由<span>DB2</span>自己定义的。有关各种字符集在相应平台所对应的代码页值可在<span>IBM</span>网站查找。<span><br><br></span>在<span>DB2 CLP</span>中，对远程数据库编目的操作，首先把远程主机映射为本地节点，节点名自己指定，本例采用<span>TCPIP</span>连接。<span>service_name</span>一般定义在远程主机的<span>/etc/services</span>文件中。</span></p>
<p align=left><span>$ db2 CATALOG TCPIP NODE local_node_name REMOTE hostname|ip SERVER service_name </span></p>
<p align=left><span>然后把已知的远程主机的数据库映射到本地别名，注意本地别名在主机级别不能重复。节点名指定上面刚编目的节点。</span></p>
<p align=left><span>$ db2 CATALOG DATABASE db_name AS local_alias AT local_node_name USER username USING password </span></p>
<p align=left><span>现在就可以用刚才编目中定义的别名连接远程主机数据库</span></p>
<p align=left><span>$ db2 CONNECT TO local_alias USER username USING password</span></p>
<p align=left><span>获取数据库详细配置信息</span></p>
<p align=left><span>$ db2 GET CONFIGURATION SHOW DETAIL </span></p>
<p align=left><span>对于<span>DB2</span>返回的错误号，可以用以下方法查阅说明<span>(</span>以<span>sql 10008</span>为例<span>)</span>：</span></p>
<p align=left><span>$ db2 ? sql10008</span></p>
<p align=left><span>数据库的备份与恢复：<span><br><br></span>使用备份与恢复工具可以完成在不同的服务器见完整的转移数据库的工作，命令行方式如下：<span><br><br></span>备份</span></p>
<p align=left><span>$ db2 BACKUP DATABASE db_name USER user_name USING password to backup_dir_name<br>$ db2 BACKUP DATABASE dlhdb USER dlh USING admindlh TO d:\backups</span></p>
<p align=left><span>恢复</span></p>
<p align=left><span>$ db2 RESTORE DATABASE source_db_name USER user_name USING password FROM backup_dir_name TAKEN AT backup_file_create_time TO driver_letter INTO new_db_name<br>$ db2 RESTORE DATABASE dlhdb USER dlh USING admindlh FROM d:\backups TAKEN AT 20031209141056 TO d: INTO newdb</span></p>
<p align=left><span>有关实例的操作：</span></p>
<p align=left><span>设置默认实例环境变量</span></p>
<p align=left><span>$ db2 SET DB2INSTANCE=inst_name</span></p>
<p align=left><span>启动当前实例</span></p>
<p align=left><span>$ db2start</span></p>
<p align=left><span>停止当前实例</span></p>
<p align=left><span>$ db2stop [force]</span></p>
<p align=left><span>连接到某个实例</span></p>
<p align=left><span>$ db2 ATTACH TO ANSTANCE inst_name</span></p>
<p align=left><span>获取实例的配置参数</span></p>
<p align=left><span>$ db2 GET DBM CFG SHOW DETAIL</span></p>
<p align=left><span>导出数据库完整的定义到脚本文件，包括表，视图，函数，数据库参数等</span></p>
<p align=left><span>$ db2look -d sample</span><span>（数据库）<span> -a -e -l -x -m -f -o</span>（参数）<span>samplesql.out</span>（输出文件）</span></p>
<p align=left><span>load </span><span>一个表的数据时，有可能导致表空间处于<span>backup pending</span>（<span>0x0020</span>）状态。比如把整形数据<span>load</span>到<span>double</span>型的字段中。<span><br></span>处于<span>backup pending</span>状态的表空间不能被访问。<span><br></span>可以通过对此表空间运行一次<span>backup</span>操作，恢复到正常状态（<span>0x0</span>）。<span><br><br></span>对于自增字段，可以通过两种方式指定：</span></p>
<p align=left><span>generated by default as identity<br>generated always as identity</span></p>
<p align=left><span>区别是，第一种方式在插入数据时允许手工指定自增字段的值，只要不重复即可，并且数据库会自动设置下一个值；<span><br></span>第二种方式则不允许指定，只能由数据库自动分配并插入。<span><br><br><br>DB2 sql</span>语句中转义符的使用：</span></p>
<p align=left><span>select * from t1 where a like '%abc\%def' escape '\';</span></p>
<p align=left><span>创建数据库时，出现<span>SQL<st1:chmetcnv w:st="on" UnitName="C" SourceValue="1043" HasSpace="False" Negative="False" NumberType="1" TCSC="0">1043C</st1:chmetcnv></span>错误，可能的问题：<span><br></span>指定容器所在的磁盘空间不足，<span><br></span>当容器为<span>file</span>类型时，后面的<span>long-num</span>参数不对，比如<span>25600</span>代表<span>256Mb</span>，但如果指定<span>256</span>则会导致以上错误。<span><br><br><br></span>平台<span> RH Linux 8<br>DB2 UDB v8.1<br></span>在<span>WAS 5</span>中建立到<span>db2</span>的数据源，但连接失败，返回以下错误：</span></p>
<p align=left><span>[Servlet Error]-[SQLConnect]: java.lang.UnsatisfiedLinkError: SQLConnect</span></p>
<p align=left><span>原因是没有为运行<span>was</span>服务的用户设置以下环境变量：</span></p>
<p align=left><span>D_LIBRARY_PATH<br>LIBPATH<br>DB2INSTANCE<br>...</span></p>
<p align=left><span>以上环境变量定义在<span> $INSTHOME/sqllib/db2profile</span>文件中，可以采用的解决方案：</span></p>
<p align=left><span>$ sh stopServer.sh servername<br><br>$ . $INSTHOME/sqllib/db2profile<br>$ sh startServer.sh servername</span></p>
<p align=left><span>也可以把<span>db2profile</span>放到<span>was</span>启动脚本中首先执行。<span><br><br></span>如果只设置了<span>LD_LIBRARY_PATH</span>，<span>LIBPATH</span>两个环境变量，<span>DB2</span>会返回以下错误：</span></p>
<p align=left><span>CLI0600E Invalid connection handle or connection is closed.<br>SQLSTATE S1000</span></p>
<p align=left><span>对应于<span>Oracle</span>的<span>Job</span>包功能，<span>DB2</span>通过一个<span>GUI</span>工具－任务中心（<span>task center</span>）实现。使用任务中心前需要进行必要的工具设置，需要创建一些数据库对象，可以创建在已有的一个数据库中，也可以单独创建一个数据库。通过以下命令实现：</span></p>
<p align=left><span>create catalog tools schema_name create new database db_name</span></p>
<p align=left><span>此命令为编目工具创建一个名为<span>db_name </span>的数据库，并指定了一个模式名。<span><br></span>注意：无法用<span>using </span>子句指定一个<span>codeset</span>，系统会默认使用<span>ISO8859-1</span>字符集。<span><br><br><br>Quest Center for DB2</span>带有数据库性能诊断功能，动态监视<span>db</span>内存，磁盘<span>io, </span>表空间，负载等等。<span><br><br>DB2</span>客户端的类型：</span></p>
<ul type=disc>
    <li><span>DB2</span><span>运行时客户端<span> DB2 Runtime Client</span></span></li>
    <li><span>DB2</span><span>管理客户端<span> DB2 Administrator Client</span>（包含运行时客户端的所有内容）</span></li>
    <li><span>DB2</span><span>应用程序开发客户端<span> DB2 Application Development Client</span>（包含管理客户端的所有内容）</span></li>
    <li><span>DB2</span><span>瘦客户端<span> DB2 Thin Client</span></span></li>
    <li><span>DB2 Relational Connect </span><span>联邦数据库，用于连接异种数据库。</span></li>
</ul>
<p align=left><span>强制断开已有连接，停止实例并删除。</span></p>
<p align=left><span>$ db2idrop -f instance_name </span></p>
<p align=left><span>用于在<span>UNIX</span>下迁移实例。</span></p>
<p align=left><span>$ db2imigr instance_name </span></p>
<p align=left><span>更新实例，用于实例获得一些新的产品选项或修订包的访问权。</span></p>
<p align=left><span>$ db2iupdt instance_name </span></p>
<p align=left><span>获取当前所处的实例。</span></p>
<p align=left><span>$ db2 get instance </span></p>
<p align=left><span>当更新实例级别或数据库级别的参数后，有些可以立即生效，有些需要重新启动实例才可生效。<span>immediate </span>显式指明更改立即生效，<span>deferred </span>显式指明更改在重起实例后生效。<span><br><br></span>当需要配置许多台客户机与<span>DB2</span>服务器的连接时，可以用配置助手将服务器的概要文件导出，然后在每个客户机使用配置助手导入概要文件。若客户端只安装了运行时客户端，则可以使用以下命令导入概要文件。</span></p>
<p align=left><span>$ db2cfimp access_profile_name</span></p>
<p align=left><span>疑问：是否应该由已配置好的一台客户机导出概要文件？</span></p>
<p align=left><span>列出所有的数据库连接</span></p>
<p align=left><span>$ db2 list applications </span></p>
<p align=left><span>终止指定的连接句柄，事务被中断并回滚。同时操作多个句柄可以用逗号分开，或者指定关键字<span> all</span>。此命令只终止指定的连接，不会阻止新的应用连接到数据库。</span></p>
<p align=left><span>$ db2 force application (2) </span></p>
<p align=left><span>创建数据库时可以指定排序方式：</span></p>
<p align=left><span>collate using identity</span></p>
<p align=left><span>系统模式集是和每个数据库一起创建的，并且它们被放置到<span> SYSCATSPACE </span>表空间中。</span></p>
<ul type=disc>
    <li><span>SYSIBM</span><span>：基本系统目录，建议不要进行直接访问</span></li>
    <li><span>SYSCAT</span><span>：<span>PUBLIC </span>被授予该模式的<span> SELECT </span>权限，对只读视图编目，这是获取目录信息的推荐方式</span></li>
    <li><span>SYSSTAT</span><span>：可更新的目录视图 － 影响优化器</span></li>
    <li><span>SYSFUN</span><span>：用户定义的函数</span></li>
</ul>
<p align=left><span>如果表中的现有行不满足约束，则不能定义该约束。可以关闭约束检查以加快大量数据的添加，但是该表处于检查暂挂（<span>CHECK PENDING</span>）状态。<span><br><br></span>在创建表时，可以使用选项来指定一个或多个表空间，表和索引将被放置到其中：</span></p>
<p align=left><span>CREATE TABLE TEST (<br>column 1 definition, column 2 definition, ...<br>) IN &lt;tablespace name&gt; INDEX IN &lt;index space name&gt;</span></p>
<p align=left><span>这条命令为您提供了一个选项：指定创建表和索引的位置。如果没有指定单独的索引表空间，那么将在表所在的同一表空间中创建索引。创建表之后，就没有机会在不同的表空间中创建索引了。创建索引要提前作规划！</span></p>
<p align=left><span>CREATE &lt;UNIQUE&gt; INDEX &lt;index name&gt; ON &lt;table name&gt;<br>(<br>column 1 &lt;ASC | DESC&gt; ,<br>column 2 &lt;ASC | DESC&gt; ...<br>)</span></p>
<p align=left><span>UNIQUE </span><span>属性告诉<span> DB2</span>，索引必须强制所有插入值的唯一性。<span><br></span>如果结果集是以升序和降序两种方式排序的，<span>ALLOW REVERSE SCANS </span>会告诉<span> DB2 </span>在索引中包括附加的指针，以允许在记录中有效地进行正向和反向链接。<span><br><br>DB2 </span>能够向正在创建的索引中添加另外的列。<span>CREATE INDEX </span>命令允许用户指定那些不属于实际索引但因为性能原因而保存在索引记录中的列。</span></p>
<p align=left><span>CREATE UNIQUE INDEX ON EMPLOYEE (EMPNO) INCLUDE (LASTNAME,FIRSTNAME)</span></p>
<p align=left><span>对于索引中包含的列而言，索引必须是<span> UNIQUE </span>的。当创建索引时，另外的列被添加到索引值中。索引不使用这些值进行排序或确定唯一性，但可以在满足<span> SQL </span>查询时使用它们。例如，下列<span> SELECT </span>语句将不需要读取实际数据行：</span></p>
<p align=left><span>SELECT LASTNAME, FIRSTNAME FROM EMPLOYEE WHERE EMPNO &lt; '000300'</span></p>
<p align=left><span>要在表上创建群集索引，将<span> CLUSTER </span>关键字附加到<span> CREATE INDEX </span>命令的末尾，例如：</span></p>
<p align=left><span>CREATE INDEX <st1:place w:st="on"><st1:city w:st="on">DEPTS-IX</st1:city> <st1:state w:st="on">ON</st1:state></st1:place> EMPLOYEE(WORKDEPT) CLUSTER</span></p>
<p align=left><span>使用下列通用规则来决定为表定义的索引的经典数量。索引数量取决于数据库的主要用途：<span><br></span>对于在线事务处理（<span>OLTP</span>）环境，创建一到两个索引。<span><br></span>对于混合查询和<span> OLTP </span>环境，创建两到五个索引。<span><br></span>对于只读查询环境，创建五个以上索引。<span><br><br></span>在<span>Windows</span>平台上的<span>DB2</span>的命令行模式下，或者在类<span>Unix</span>平台下，使用命令<span>db2cc</span>启动控制中心。<span><br><br>db2move</span>提供了在数据库之间批量移动数据的能力，可以指定某个表，也可以指定整个数据库的表。</span></p>
<p align=left><span>$ db2move dbname action</span></p>
<p align=left><span>action </span><span>可以指定为：<span>export, import</span>或者<span>load<br></span>使用<span> -l </span>参数指定<span>lob</span>对象存储的文件夹<span><br><br></span>执行增量备份要求设置数据库配置参数<span>&#8220;trackmod&#8221;</span>的值为<span>&#8220;YES&#8221;<br></span>执行在线备份要求设置数据库配置参数<span>&#8220;logretain&#8221;</span>的值为<span>&#8220;YES&#8221;</span>，在线备份语法：</span></p>
<p align=left><span>$ db2 backup db dbname online to path</span></p>
<p align=left><span>当删除了<span>das</span>用户的<span>home</span>目录，未先<span>drop</span>掉<span>das</span>服务，则再执行<span>dasdrop</span>则不成功，提示：<span><br>db2admin </span>命令无法找到，原因是<span>db2admin</span>命令保存在<span>das</span>的<span>home</span>目录中。<span><br></span>可以删除干净<span>das</span>用户的<span>home</span>目录后，重起服务器解决此问题。</span></p>
<p align=left><span>$ dasupdt dasName </span><span>升级<span>das<br>$ db2iupdt instName </span>升级实例<span><br>$ db2licd end </span>停止许可证守护进程</span></p>
<p align=left><span>在<span>Linux</span>系统安装<span>DB2 V8.1</span>后，<span>db2fmcd</span>进程会自动启动，即使不启动实例和<span>DAS</span>，<span><br><br></span>在中文<span>Linux</span>环境下安装了<span>DB2</span>数据库服务，并使用<span>GBK</span>代码页（<span>codepage</span>）创建了一个数据库，完成后可以正常连接操作，若更改操作系统代码页为英语，则使用<span>&#8220;db2 connect&#8221;</span>时会报错，连接时无法转换代码页。</span></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/32143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-08-21 15:12 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2个人版快速入门</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32127.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 20 Aug 2007 16:47:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32127.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/32127.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/32127.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/32127.html</trackback:ping><description><![CDATA[<a href="http://www.cnitblog.com/Files/szdlinxie/db2AA.pdf">/Files/szdlinxie/db2AA.pdf</a>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/32127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-08-21 00:47 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2安装配置补遗</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32125.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 20 Aug 2007 16:44:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32125.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/32125.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/32125.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/32125.html</trackback:ping><description><![CDATA[<a href="http://www.cnitblog.com/Files/szdlinxie/db2C.pdf">/Files/szdlinxie/db2C.pdf</a>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/32125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-08-21 00:44 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2服务器快速入门</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32123.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 20 Aug 2007 16:39:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32123.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/32123.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32123.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/32123.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/32123.html</trackback:ping><description><![CDATA[<p><a href="http://www.cnitblog.com/Files/szdlinxie/db2.rar">/Files/szdlinxie/db2.rar</a></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/32123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-08-21 00:39 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/08/21/32123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle有关资料</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/05/18/27202.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 18 May 2007 07:51:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/05/18/27202.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/27202.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/05/18/27202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/27202.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/27202.html</trackback:ping><description><![CDATA[<p>2007.5.14</p>
<p>1、oracle有关资料查询：<br><a href="http://www.oracle.com/technology/global/cn/pub/articles/smiley_10gdb_install.html">http://www.oracle.com/technology/global/cn/pub/articles/smiley_10gdb_install.html</a></p>
<p>2、 Linux下的Oracle 10g安装及配置 <br>&nbsp;<br>一.资源需要：<br>至少1024 MB物理内存<br>1024－2048 需1.5倍的交互空间<br>2048－8192 需1倍的交互空间<br>8192－ 需0.75倍的交互空间<br>至少400 MB /tmp 临时目录空间<br>oracle软件需要1.5 GB 到 3.5 GB 磁盘空间<br>默认数据库需要1.2 GB</p>
<p>二.查看系统资源相关语句：<br>cat /etc/issue<br>uname -r<br>grep MemTotal /proc/meminfo<br>grep SwapTotal /proc/meminfo<br>grep "model name" /proc/cpuinfo<br>free<br>df -k /tmp<br>df -k<br>安装前的检查和准备工作： <br>p4198954_21_linux.zip 在运行 runInstaller 之前打. <br>rpm -ivh compat-oracle-rhel4-1.0-5.i386.rpm (p4198954_21_linux.zip)<br>(不打PATCH也可以）<br>安装 libaio-0.3.102-1.i386.rpm <br>libaio-devel0.3.102-1.i386.rpm<br>在Red Hat Enterprise Linux 介质的第三张CD,以 root 用户身份运行以下命令：<br>rpm -ivh /mnt/cdrom/RedHat/RPMS/ libaio-0.3.102-1.i386.rpm</p>
<p>三.创建数据库安装的准备工作: <br>1.创建用户和组(user/group)； <br>groupadd dba <br>groupadd oinstall <br>useradd oracle -g oinstall -G dba <br>passwd oracle <br>如果nobody用户不存在（id nobody命令查看)，则创建：<br>useradd nobody<br>2.建立oracle安装文件夹(sample)； <br>mkdir -p /opt/oracle/product/10g<br>mkdir /opt/oracle/database<br>chown -R oracle.oinstall /opt/oracle<br>chmod 755 -R /opt/oracle<br>2， 配置环境变量； <br>要使用 Oracle 产品，应该或必须设置几个环境变量。如果您在同一服务器上安装了多个 Oracle 产品或数据库，则 ORACLE_HOME、ORACLE_SID 和 PATH 变量可能会更改。ORACLE_BASE 变量不应更改，并可以在需要时在您的登录配置文件中设置它。Oracle 提供了一个称作 oraenv 的实用程序来设置其他变量。<br>对于数据库服务器，建议设置以下环境变量： <br>使用第一步创建的用户名Oracle登陆: <br>su oracle <br>vi ~/.bash_profile <br>修改以下是配置文件的内容<br>export ORACLE_BASE=/opt/oracle/<br>export ORACLE_HOME=/opt/oracle/product/10g<br>export ORACLE_SID=ge01(可随意定义)<br>export PATH=$ORACLE_HOME/bin:$PATH<br>ESC(退出vi的编辑环境)<br>:wq(退出vi应用程序并保存修改)</p>
<p>安装好后再取消屏蔽这些环境变量设置<br>#export TNS_ADMIN=$ORACLE_HOME/network/admin<br>#export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK<br>#export LANG=AMERICAN_AMERICA.ZHS16GBK<br>配置好后用 source .bash_profile 命令使配置生效 </p>
<p>四.设置系统参数；<br>Oracle 数据库 10g 需要以下所示的内核参数设置。<br>其中给出的是最小值，因此如果您的系统使用的值较大，则不要更改它。<br>切换到root用户:<br>su root <br>a) 修改/etc/sysctl.conf(vi /etc/sysctl.conf), 添加： </p>
<p>kernel.shmmax = 2147483648<br>kernel.shmmni = 4096 <br>kernel.shmall = 2097152 <br>kernel.sem = 250 32000 100 128 <br>fs.file-max = 65536 <br>net.ipv4.ip_local_port_range = 1024 65000 <br>net.core.rmem_default=262144<br>net.core.rmem_max=262144<br>net.core.wmem_default=262144<br>net.core.wmem_max=262144</p>
<p>修改后运行"/sbin/sysctl -p"命令使得内核改变立即生效； </p>
<p>B) 设置oracle对文件的要求： <br>编辑文件：vi /etc/security/limits.conf 加入以下语句： <br>oracle soft nproc 2047<br>oracle hard nproc 16384<br>oracle soft nofile 1024<br>oracle hard nofile 65536<br>编辑文件：vi /etc/pam.d/login 加入以下语句(可能应该加在最后一条规则之前）:<br>session required /lib/security/pam_limits.so</p>
<p>安装Oralce10G</p>
<p>解压缩Oracle10G的安装文件 ：<br>1． Oracle <br>(1) 简化过程（以oracle登录，释放安装文件,使用更少的磁盘空间，速度更快） <br>在/tmp下解压缩10201_database_linux32.zip:<br>unzip 10201_database_linux32<br>开始安装oracle <br>（一）开始安装： <br>1.以oracle用户登录系统，进行Oracle的安装：<br>cd /tmp/database (或者你解压缩安装程序包的目录）<br>./runInstaller<br>过一会儿就会出现Oracle的安装界面<br>注意：<br>1、选择advance install<br>2、数据库home设置为/opt/oracle/product/10g<br>3、数据库全局名称设置为ge01<br>4、数据库字符集选Simplified Chinese ZHS16GBK</p>
<p>2.其他用默认设置！<br>注意：安装过程中会提示以root用户登陆执行一些脚本 ，执行后再按&#8220;ok&#8221;按钮继续安装。</p>
<p>3、登陆并启动数据库的操作。 <br>[oracle@oracle oracle]$ lsnrctl start <br>[oracle@oracle oracle]$ sqlplus /nolog <br>SQL*Plus: Release 9.2.0.0 - Production on Sat Mar 12 22:58:53 2005 <br>Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. <br>SQL&gt; connect / as sysdba <br>Connected. <br>SQL&gt; shutdown immediate 关闭数据库 （OR "dbshut" command)<br>Database closed. <br>Database dismounted. <br>ORACLE instance shut down. <br>SQL&gt; startup; 启动数据库 <br>ORACLE instance started. <br>Total System Global Area 236000356 bytes <br>Fixed Size 451684 bytes <br>Variable Size 201326592 bytes <br>Database Buffers 33554432 bytes <br>Redo Buffers 667648 bytes <br>Database mounted. <br>Database opened. </p>
<p>4, dbstart脚本修改<br>数据库创建完成后，修改vi /etc/oratab，把orcl:/opt/oracle/oracle/product/10g:N那一行最后的N改成Y，<br>然后执行dbstart启动数据库数据库可能无法启动，报告Can&#8217;t find init file &#8230;的错误，需要复制一个初始化文件: <br>cp /opt/oracle/admin/ge01/pfile/init.ora.* /opt/oracle/product/10.2.0/dbs/initge01.ora <br>重新执行dbstart就可以了。<br>修改vi /opt/oracle/product/10g/bin/dbstart中ORACLE_HOME_LISTNER=/opt/oracle/oracle/product/10g/<br>vi /etc/rc.local 加入下面一行 起动ORACLE ON system boot<br>/opt/oracel/product/10g/bin/dbstart</p>
<p>5. 编写启动脚本（OPTION）<br>为了方便管理，可以写一个启动脚本ora10g： <br>以root身份进入，编写以下脚本： <br>#!/bin/bash <br># <br># chkconfig: 2345 91 19 <br># description: starts the oracle listener and instance <br>status() {<br>pid=`ps -ef | grep ora_pmon | grep -v grep | awk '{print $8}'`<br>if [ "X$pid" = "X" ]<br>then<br>echo "oracle10g is not running."<br>exit 1<br>else<br>echo "oracle10g is running."<br>exit 0<br>fi<br>}<br>case "$1" in <br>start) <br>#startup the listener and instance <br>echo -n "oracle begin to startup: " <br>su - oracle -c "lsnrctl start" <br>su - oracle -c dbstart <br>echo "oracle10g started" <br>;; <br>stop) <br># stop listener, apache and database <br>echo -n "oracle begin to shutdown:" <br>su - oracle -c "lsnrctl stop" <br>su - oracle -c dbshut <br>echo "oracle10g shutdowned" <br>;; <br>reload|restart) <br>$0 stop <br>$0 start <br>;; <br>'status')<br>status<br>;;<br>*) <br>echo "Usage: ora10g [start|stop|reload|restart]" <br>exit 1 <br>esac <br>exit 0 <br>存为ora10g后，然后<br>chmod a+x ora10g<br>ln -s /opt/oracle/product/10.2.0/bin/ora10g /etc/rc.d/init.d/<br>即可在以后以root身份运行/etc/rc.d/init.d/ora10g start |stop 来管oracle的启动和停止了。<br>如果要将这个脚本加入到系统中使其可开机运行，那么要运行以下命令：<br>chkconfig --level 345 ora10g on</p>
<p>或者可在/etc/rc.d/rc.local中加入如下： <br>su - oracle -c "lsnrctl start" <br>su - oracle -c "dbstart" </p>
<p>6, 关于数据库删除重新安装的问题: <br>把ORACLE安装目录删除及/etc/ora*.*删除就行了 <br>#rm &#8211;f /etc/ora*.*</p>
<p>7.修改Oracle10g数据库字符集<br>SQL&gt; connect sys/oracle as sysdba<br>SQL&gt; startup mount<br>SQL&gt; alter session set sql_trace=true;<br>Session altered.<br>SQL&gt; alter system enable restricted session;<br>System altered.<br>SQL&gt; alter system set job_queue_processes=0;<br>System altered.<br>SQL&gt; alter system set aq_tm_processes=0;<br>System altered.<br>SQL&gt; alter database open;<br>Database altered.<br>SQL&gt; set linesize 120;<br>SQL&gt; alter database character set zhs16gbk;<br>alter database character set zhs16gbk<br>*<br>ERROR at line 1:<br>ORA-12712: new character set must be a superset of old character set<br>SQL&gt; ALTER DATABASE character set INTERNAL_USE zhs16gbk; # 使用INTERNAL_USE可以跳过超集的检查,ALTER DATABASE character set INTERNAL_USE <br>Database altered.<br>SQL&gt; shutdown immediate;<br>Database closed.<br>Database dismounted.<br>ORACLE instance shut down.<br>SQL&gt; STARTUP<br>SQL&gt; select name,value$ from props$ where name like '%NLS%';<br>NLS_CHARACTERSET<br>ZHS16GBK</p>
<p>8. oracle database备份<br>(1)vi bachupDb.sh<br>#!/bin/sh<br>#oracle用户下<br>#crontab -e 增加 "35 4 * * * /home/oracle/dbbackup/backupDb.sh",保存后自动安装<br>#或echo "35 4 * * * /home/oracle/dbbackup/backupDb.sh" &gt; backupDb.cron<br>#crontab backupDb.cron<br>#############<br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#64;&#116;&#105;&#112;">#@tip</a> 修改为本机数据库home目录<br>export ORACLE_HOME=/opt/oracle/product/10g<br>export PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin<br># 注意字符集必须和数据库的字符集一致，以避免字符集转化失败 <br>export NLS_LANG=AMERICAN_AMERICA.zhs16gbk<br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#64;&#116;&#105;&#112;">#@tip</a> 125修改为要备份的oracle的ip地址的最后一段<br>dmpfile="`echo ~/`dbbackup/gedb_`date +%w`.dmp"<br>logfile="`echo ~/`dbbackup/gedb_`date +%w`.log"</p>
<p>if [ -w $dmpfile ]<br>then<br>echo "rm -f $dmpfile"<br>rm -f "$dmpfile"<br>fi</p>
<p><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#64;&#116;&#105;&#112;">#@tip</a> ip地址修改为要备份的oracle的主机地址<br>exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#85;&#83;&#69;&#82;&#73;&#68;&#61;&#103;&#101;&#100;&#98;&#47;&#103;&#101;&#100;&#98;&#64;&#49;&#48;&#46;&#50;&#52;&#56;&#46;&#49;&#46;&#53;&#47;&#103;&#101;&#48;&#49;">USERID=gedb/gedb@10.248.1.5/ge01</a> file=$dmpfile log=$logfile owner=gedb grants=y<br>(2)copy bachupDb.sh 到slave oracle srever 相应目录,<br>chown oracle.oinstall bachupDb.sh<br>chmod 744 bachupDb.sh <br>vi bachupDb.sh 以符合安装情况<br>(3)以oracle user role<br>crontab -e<br>35 4 * * * /home/oracle/dbbackup/backupDb.sh </p>
<p>9. restore oracle backup<br>su - oracle<br>imp USERID=gedb/gedb file=gedb_6.dmp log=implogfile commit=y grants=y full=y&nbsp;&nbsp;&nbsp; <br>&nbsp;<br>&nbsp;<br>*****脚本修改的相关资料查询：<a href="http://unix-cd.com/unixcd12/article_5428.html">http://unix-cd.com/unixcd12/article_5428.html</a><br>&nbsp;<br>SQLPLUS命令的使用大全，解压密码为<a href="http://www.csai.cn/">www.csai.cn</a>。</p>
<p><br>Uedit32与SQLPlus结合使用技巧<br><a href="http://www.itwen.com/08db/04oracle/oracle20060219/34003.html">http://www.itwen.com/08db/04oracle/oracle20060219/34003.html</a></p>
<p>Uedit32与SQLPlus结合使用技巧 用过Uedit32的人都知道,这个工具虽然小,却功能俱全.只要我们在工作中巧妙的使用用它,可以使我们的工作效率事半功倍.那么,在下面的文章中,我将说说Uedit32与Oracle SQLPlus用法. <br>首先下载并安装Uedit32,确保SQlPlus能正常运行, 接下来的事情就是两者的系统配置了,具体按照以下的几个步骤进行: <br>步骤一：在Oracle安装目录下的Ora81找到dbs这个文件夹，如果没有这个文件 夹，创建名为dbs的文件夹，然后在这个文件夹下新建一个文本文件， 取名为：login.sql.<br>步骤二：在Uedit32的安装目录下新建一个文本文件，取名为：PlSQL.txt<br>步骤三：打开Uedit32，在Uedit32主菜单的Advanced下，选择 Configuration...进入到一个页面UltraEdit Configuration．在这个　 　　 页面中选择Syntax Highlighting,在Full path name for中，将你第二 步创建的Plsql.txt连接到此，即，单击Browse，直接在Uedit32目录下 找到Plsql.txt这个文件，确定后，一切就ok了。<br>步骤四：在Uedit32主菜单的View下的View AS(Highlightiing File Type)下会 显示一个SQL，这样就说明你的Configuration已经Succeed.如果在这个 菜单下没有SQL，就说明Configuration错误，重复上边的步骤，直到出 现SQL为止。<br>*****如果配置成功后,每次在SQLPlus下进行SQL语句编辑的时候,要对已经编辑或执行的SQL语句修改,就可以直接输入ED即可进入到Uedit32的编辑状态,这样,大大方便了使用速度. 另附：login.sql文件脚本： define _editor='uedit32.exe'<br>set editfile a.sql<br>set line 1000 说明：PlSQL.txt脚本主要用来控制 SQL语句在uedit32中字体显示颜色，变量名，函数名等将以不同的颜色进行显示，方便修改和辨认。由于篇幅有限，如果需要，可以mail给我。 海 洋 2002-05-31（完）计算机基础教程网</p>
<p>==================================================================================================================<br>2007.05.15</p>
<p>1、UltraEdit 11 的注册码</p>
<p>用户名1：UltraEdit<br>注册码1：A2X1Q-A0K6X-X700D-H407N</p>
<p>grant all on *.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#114;&#111;&#111;&#116;&#64;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;">root@localhost</a> identified by password</p>
<p>source 脚本</p>
<p>mysqldump --opt databases tables &gt; 脚本名&nbsp; -d<br>(-d&nbsp; 参数是叫导出数据库里所有表的结构，不包括数据)</p>
<p><br>3、按照NVMP手册安装 ，但是 在 最后执行SETUP.BAT时候不成，不知道原因？</p>
<p><br>=====================================================================================================================</p>
<p>2007.05.16</p>
<p>1、LOGIN界面可以出现，但是输入用户名以及密码后，没有系统的主界面。不知道原因。</p>
<p>2、数据库建立错误。。。。。BUILD FAILED</p>
<p>3、Oracle基础学习一:安装Oracle9i Database及Client 认识相关工具 <br><a href="http://www.cnblogs.com/freeliver54/archive/2007/04/13/705135.html">http://www.cnblogs.com/freeliver54/archive/2007/04/13/705135.html</a></p>
<p>1.安装Oracle9i或其他版本的Database 和 Client等<br>2.利用[数据库配置助手]创建数据库表空间<br>3.利用[企业管理器]管理数据库表空间<br>4.配置 [管理服务器]<br>5.SQL Plus 与 SQLPlus Worksheet<br>6.Oracle Administration Assistant for Windows NT 等 其他工具<br>===============================</p>
<p>1.安装Oracle9i或其他版本的Database 和 Client等<br>------------------------<br>(1).安装界面及欢迎<br>&nbsp;&nbsp;&nbsp; 此安装界面 可以查看 已安装产品 以及 卸载产品<br>&nbsp;&nbsp;&nbsp; 直接点击 下一步 则进行安装<br>(2).文件定位<br>&nbsp;&nbsp;&nbsp; 安装文件的来源路径 以及 产品的目标路径<br>&nbsp;&nbsp;&nbsp; 默认即可<br>(3).选择要安装的产品选项 <br>&nbsp;&nbsp;&nbsp; 该选项决定了下一步的安装类型<br>&nbsp;&nbsp;&nbsp; 此处选择默认的第一项 Oracle 9i Database...&nbsp;&nbsp;&nbsp; <br>(4).安装类型<br>&nbsp;&nbsp;&nbsp; 选择默认的 企业版本 下一步<br>(5).数据库配置<br>&nbsp;&nbsp;&nbsp; 可以选择默认的通用<br>&nbsp;&nbsp;&nbsp; 也可以选择最后的只安装软件<br>&nbsp;&nbsp;&nbsp; 当然也可以选择自定义 以及 数据仓库等其他<br>&nbsp;&nbsp;&nbsp; 此处同样选择默认<br>(6).数据库标识<br>&nbsp;&nbsp;&nbsp; 给数据库起个 全局数据库名 如aDB等<br>(7).接下来的<br>&nbsp;&nbsp;&nbsp; 数据库文件位置 及 字符集等 <br>&nbsp;&nbsp;&nbsp; 一路默认即可<br>(8).安装过程中 <br>&nbsp;&nbsp;&nbsp; 会提示需要你指示出下一张CD的位置<br>(9).如果顺利 就会安装成功<br>&nbsp;&nbsp;&nbsp; 如果期间 有个别组件 安装不成功<br>&nbsp;&nbsp;&nbsp; 如果不是太必需 可以选择取消<br>&nbsp;&nbsp;&nbsp; 当然是取消该组件的安装 而不是取消整个产品的安装<br>(10).安装完Database<br>&nbsp;&nbsp;&nbsp; 接下来 可以继续安装 Client<br>&nbsp;&nbsp;&nbsp; 也可以只在其他位置的客户端需要时 <br>&nbsp;&nbsp;&nbsp; 进行下面的安装客户端的相关步骤<br>&nbsp;&nbsp;&nbsp; 也就是承接上述的第3步<br>&nbsp;&nbsp;&nbsp; 选择Oracle 9i Client<br>(11).安装类型<br>&nbsp;&nbsp;&nbsp; 选择默认的 Administrator 下一步<br>(12).在安装过程中 同样会提示需要你指示出其他CD的位置<br>(13).安装完成后 会自动出现 网络配置助手 的欢迎画面<br>&nbsp;&nbsp;&nbsp;&nbsp; 以帮助你 进行 本地网络服务名配置<br>&nbsp;&nbsp;&nbsp;&nbsp; 该助手的打开位置在<br>&nbsp;&nbsp;&nbsp;&nbsp; [打开位置]<br>&nbsp;&nbsp;&nbsp;&nbsp; 开始-&gt;所有程序-&gt;Oracle - OraHome90<br>&nbsp;&nbsp;&nbsp;&nbsp; -&gt;Configuration and Migration Tools<br>&nbsp;&nbsp;&nbsp;&nbsp; -&gt;Net Configuration Assistant<br>(14).按默认即可<br>&nbsp;&nbsp;&nbsp; 在 服务名 处的填写<br>&nbsp;&nbsp;&nbsp; 就是输入全局数据库名 如上面的aDB<br>&nbsp;&nbsp;&nbsp; 当然如果上面Database安装时 <br>&nbsp;&nbsp;&nbsp; 只安装了软件 没有创建数据库<br>&nbsp;&nbsp;&nbsp; 则可以后续再做配置<br>(15).选择协议 默认TCP 下一步<br>&nbsp;&nbsp;&nbsp;&nbsp; 填写主机名 输入Oracle9i的刚才安装的主机IP<br>&nbsp;&nbsp;&nbsp;&nbsp; 端口处 默认1521 <br>&nbsp;&nbsp;&nbsp;&nbsp; 下一步 进行 是否进行测试画面<br>(16).也不用配置另一个网络服务名<br>&nbsp;&nbsp;&nbsp; 这样 顺利的话 就配置网络服务名完成 </p>
<p>经过上述的安装 接下来也就可以使用Oracle了&nbsp;&nbsp;&nbsp; </p>
<p>其默认有如下几个帐户<br>ID: system&nbsp; PWD:manager&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 权限:SYSDBA<br>ID: sys&nbsp;&nbsp;&nbsp;&nbsp; PWD:change_on_install&nbsp;&nbsp; 权限:SYSDBA</p>
<p><br>2.利用[数据库配置助手]创建数据库表空间<br>--------------------------------------<br>[打开位置]<br>&nbsp; 开始-&gt;所有程序-&gt;Oracle - OraHome90<br>&nbsp; -&gt;Configuration and Migration Tools<br>&nbsp; -&gt;Database Configuration Assistant</p>
<p>&nbsp; 通过该使用该助手<br>&nbsp; 可以创建 配置 和 删除 数据库 等 以及管理模板</p>
<p>(1).何种操作处 <br>&nbsp;&nbsp;&nbsp; 选择 默认的 创建数据库 下一步<br>(2).数据库模板 处<br>&nbsp;&nbsp;&nbsp; 选择New Database 或其他需要的模板<br>(3).数据库名 全局的数据库名称<br>(4).下面的根据助手的指引<br>&nbsp;&nbsp;&nbsp; 默认即可<br>&nbsp;&nbsp;&nbsp; 当然也可以根据自己的情况 进行修改<br>(5).创建数据库是一个时间稍长的过程<br>&nbsp;&nbsp; 最后如果成功 就会弹出相关数据库信息画面<br>&nbsp;&nbsp; 如全局数据库名称 系统标识符(SID)<br>&nbsp;&nbsp; 和两个默认的数据库帐户(sys和system) </p>
<p>3.利用[企业管理器]管理数据库表空间<br>----------------------------------<br>[打开位置]<br>&nbsp; 开始-&gt;所有程序-&gt;Oracle - OraHome90<br>&nbsp; -&gt;Enterprise Manager Console<br>&nbsp; 可以选择<br>&nbsp; -&gt;独立启动(S)<br>&nbsp; 或<br>&nbsp; -&gt;登录[管理服务器]<br>&nbsp;&nbsp;&nbsp; 登录到Oracle Management Server(L)<br>&nbsp; 如果还没有进行下面4.配置 [管理服务器]的部分<br>&nbsp; 可以选择独立启动 <br>&nbsp; <br>4.配置 [管理服务器]<br>-------------------<br>[打开位置]<br>&nbsp; 开始-&gt;所有程序-&gt;Oracle - OraHome90<br>&nbsp; -&gt;Configuration and Migration Tools<br>&nbsp; -&gt;Enterprise Manager Configuration Assistant<br>&nbsp; 根据向导进行相关配置</p>
<p>5.SQL Plus 与 SQLPlus Worksheet<br>--------------------------------<br>a.SQL Plus<br>[打开位置]<br>&nbsp; 开始-&gt;所有程序-&gt;Oracle - OraHome90<br>&nbsp; -&gt;Application Development<br>&nbsp; -&gt;SQL Plus</p>
<p>b.SQLPlus Worksheet<br>[打开位置]<br>&nbsp; 开始-&gt;所有程序-&gt;Oracle - OraHome90<br>&nbsp; -&gt;Integrated Management Tools<br>&nbsp; -&gt;SQLPlus Worksheet<br>&nbsp; 或<br>&nbsp; 开始-&gt;所有程序-&gt;Oracle - OraHome90<br>&nbsp; -&gt;Application Development<br>&nbsp; -&gt;SQLPlus Worksheet</p>
<p>6.Oracle Administration Assistant for Windows NT 等 其他工具<br>------------------------------------------<br>[打开位置]<br>&nbsp; 开始-&gt;所有程序-&gt;Oracle - OraHome90<br>&nbsp; -&gt;Configuration and Migration Tools<br>&nbsp; -&gt;Administration Assistant for Windows NT</p>
<p>Oracle Administration Assistant for Windows NT <br>是一种数据库管理工具，<br>它可以帮助您在 Windows NT 上轻松地<br>创建数据库管理员、操作员、用户和角色。<br>此外，它还可帮助您管理 Oracle 数据库服务、<br>Oracle 数据库启动和关闭配置、<br>编辑注册表参数设置以及查看 Oracle 进程信息。</p>
<p><br><a href="http://128.8.153.120:8080/jira">http://128.8.153.120:8080/jira</a></p>
<p><a href="http://www.atlassian.com/software/jira/">http://www.atlassian.com/software/jira/</a></p>
<p><br>监控的时候，如果有正常的I/O设备，那切换的时候不会慢也不会死</p>
<p>如果没有正常的I/O设备的话，在切换时候就会发生慢或死</p>
<p><a href="http://blog.csdn.net/zcatlinux/archive/2006/05/10/721157.aspx">http://blog.csdn.net/zcatlinux/archive/2006/05/10/721157.aspx</a> 让ORACLE自动启动的方法</p>
<p><a href="http://blog.csdn.net/">http://blog.csdn.net</a></p>
<p>FlashFXP 注册码</p>
<p>把下面的代码复制到密钥框中即可:(就是就击注册那框中)</p>
<p>FLASHFXPwQAOlhkgwQAAAAC6W5MNJwTnsl73nIraAU149tnCQS<br>0hmZU3GGBQG1FtoSp5x0mUgA7bFW0qr0fKk2KCA+v2CCrFbF+q<br>bmLvEjV+4JCAX+H/TBpG7pdEJ8IEW09ST8t60Poou/CTNhxGoz<br>1Ww0kiyHynU4fOmVK9gQZ5eeMxKzssnhKdor2ibc3OTo+WvErl<br>omRpMfd15+/2EA/SbxzdwKmX6ybVAYnLe4g3cheOEdD3YnxF5i<br>4NeTRw</p>
<p><br>下载地址：<a href="http://www.tvmi.cn/Soft/163.html">http://www.tvmi.cn/Soft/163.html</a></p>
<p>====================================================================================================================<br>2007.05.17</p>
<p>linux下安装oracle 10g SLES9安装Oracle 10g <br>十一月 29th 2006 Posted to 未分类 <br>系统环境：<br>SuSE Linux Enterprise Server 9 （升级到sp3)<br>kernel-2.6.5-7.244-default</p>
<p>Oracle最低硬件需求<br>物理内存：最低512MB （运行 grep MemTotal /proc/meminfo检查）<br>交换分区：最低1GB （运行 grep SwapTotal /proc/meminfo检查）<br>硬盘空间：软件需空间2.5G，数据库需空间1.2G.（运行df -h检查硬盘剩余空间）</p>
<p>检查所依赖的软件包<br>所需要的软件包的版本(或更高版本）<br>kernel-2.6.5-7.5<br>gcc-3.3.3-43<br>gcc-c++-3.3.3-43<br>glibc-2.3.3-98<br>libaio-0.3.98-18<br>libaio-devel-0.3.98-18<br>make-3.80<br>openmotif-libs-2.2.2-519.1<br>查看内核版本执行命令 uname -r<br>要查看系统是否安装上述软件包。以root身份运行<br>rpm -q gcc gcc-c++ glibc libaio libaio-devel make openmotif-libs命令。<br>注：如果SLES9系统中了认证服务(NIS,LDAP,kerbose)。则要把它们删除。</p>
<p>安装orarun<br>orarun是为一个专门简化oracle安装的软件包。Orarun自动添加了安装oracle所需要的用户和组，设置了环境变量和内核参数。可以通过Yast安装orarun。<br>安装好orarun后，还需要修改shell。<br>编辑/etc/passwd，把orarun对应行的/bin/false更改为/bin/bash<br>修改/etc/profile.d/oracle.sh文件：<br>把第29行ORACLE_HOME=$ORACLE_BASE/product/9ir2<br>修改为ORACLE_HOME=$ORACLE_BASE/product/10gR2</p>
<p>设置内核参数<br>完成上述操作后，以root身份执行命令/usr/sbin/rcoracle start来设置内核参数</p>
<p>安装oracle<br>从oracle网站上下载10201_database_linux32.zip。解压。<br>以oracle身份登录系统，进入到解压后的目录。运行./runInstaller安装。按照默认值安装既可</p>
<p>修改dbstart脚本<br>安装好oracle后。要修改dbstart脚本。<br>把第78行ORACLE_HOME_LISTEN=/ade/vikrkuma-new/oracle<br>更改为ORACLE_HOME_LISTEN=$ORACLE_BASE/product/10gR2</p>
<p>Comments(0) <br>在RHEL AS 3上安装Oracle 10g <br>十一月 29th 2006 Posted to 未分类 <br>系统环境<br>Red Hat Enterprise Linux AS release 3 (Taroon Update 4)<br>Kernel 2.4.21-27.EL</p>
<p>Oracle最低硬件需求<br>物理内存：最低512MB （运行 grep MemTotal /proc/meminfo检查）<br>交换分区：最低1GB （运行 grep SwapTotal /proc/meminfo检查）<br>硬盘空间：软件需空间2.5G，数据库需空间1.2G.（运行df -h检查硬盘剩余空间）</p>
<p>检查所依赖的软件包<br>所需要的软件包的版本(或更高版本）<br>gcc-3.2.3-2<br>make-3.79 <br>binutils-2.11<br>openmotif-2.2.2-16<br>setarch-1.3-1<br>compat-gcc-7.3-2.96.122<br>compat-gcc-c++-7.3.-2.96.122<br>compat-libstdc++-7.3-2.96.122<br>compat-libstdc++-devel-7.3-2.96.122<br>compat-db-4.0.14.5<br>要查看系统是否安装上述软件包。以root身份运行<br>rpm -q gcc make binutils openmotif setarch compat-gcc 类似命令检查。</p>
<p>创建Oracle用户和组<br>以root身份执行下列命令：<br>/usr/sbin/groupadd oinstall<br>/usr/sbin/groupadd dba<br>/usr/sbin/useradd -m -g oinstall -G dba oracle <br>id oracle<br>然后设置oracle账户的密码：<br>/usr/bin/passwd oracle</p>
<p>创建目录<br>创建针对Oracle 10g软件和数据库的目录。以root身份执行下列命令<br>mkdir -p /u01/app/oracle<br>mkdir -p /u02/oradata<br>chown -R oracle:oinstall /u01/app/oracle /u02/oradata<br>chown -R 775 /u01/app/oracle /u02/oradata<br>修改内核参数<br>以root身份编辑/etc/sysctl.conf文件。添加以下内容：<br>kernel.shmall = 2097152<br>kernel.shmmax = 2147483648<br>kernel.shmmni = 4096<br>kernel.sem = 250 3200 100 128<br>fs.file-max = 65536<br>net.ipv4.ip_local_range = 1024 65000<br>保存，退出。<br>然后运行/sbin/sysctl -p激活更改。<br>为oracle用户设置shell限制 <br>以root身份编辑/etc/security/limits.conf文件。添加以下内容：<br>oracle soft nproc 2047<br>oracle hard nproc 16384<br>oracle soft nofile 1024<br>oracle hard nofile 65536<br>然后再编辑/etc/pam.d/login文件。添加以下内容：<br>session required /lib/security/pam_limits.so</p>
<p>oracle用户的环境变量设置<br>以oracle用户身份登录系统。<br>编辑.bash_profile文件。添加以下内容：（具体值请根据自己的情况设置）<br>export ORACLE_BASE=/u01/app/oracle<br>export ORACLE_HOME=$ORACLE_BASE/product/10g<br>export ORACLE_SID=DEMO<br>export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib<br>export LC_CTYPE=en_US.UTF-8<br>并且把PATH=$PATH:$HOME/bin一行修改为PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin<br>保存，退出。<br>然后运行命令source .bash_profile 使环境变量生效。</p>
<p>安装oracle<br>从oracle网站上下载10201_database_linux32.zip。解压。<br>进入到解压后的目录。运行./runInstaller安装。按照默认值安装既可。</p>
<p>Comments(0)&nbsp; <br>.</p>
<p><a href="http://www.linuxeden.com/doc/26838.html">http://www.linuxeden.com/doc/26838.html</a>&nbsp; 用linux完成oracle自动物理备份</p>
<p><a href="http://www.linuxeden.com/">http://www.linuxeden.com/</a>&nbsp; LINUX基本论坛</p>
<p><a href="http://book.csdn.net/bookfiles/292/10029212533.shtml">http://book.csdn.net/bookfiles/292/10029212533.shtml</a> ORACLE10G书籍站点</p>
<p><br><a href="http://www.soft6.com/know/detail.asp?id=BAAEJB">http://www.soft6.com/know/detail.asp?id=BAAEJB</a></p>
<p>SQL&gt; show user --显示当前连接用户 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; show error　　　　　　　　　　　　　　　 --显示错误 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set heading off --禁止输出列标题，默认值为ON </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set feedback off --禁止显示最后一行的计数反馈信息，默认值为"对6个或更多的记录，回送ON" </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set timing on --默认为OFF，设置查询耗时，可用来估计SQL语句的执行时间，测试性能 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set sqlprompt "SQL&gt; " --设置默认提示符，默认值就是"SQL&gt; " </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set linesize 1000 --设置屏幕显示行宽，默认100 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set autocommit ON --设置是否自动提交，默认为OFF </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set pause on --默认为OFF，设置暂停，会使屏幕显示停止，等待按下ENTER键，再显示下一页 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set arraysize 1 --默认为15 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; set long 1000 --默认为80 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long值默认为80，设置1000是为了显示更多的内容，因为很多数据字典视图中用到了long数据类型，如： </p>
<p>SQL&gt; desc user_views<br>列名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可空值否&nbsp;&nbsp; 类型<br>------------------------------- -------- ----<br>VIEW_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT NULL VARCHAR2(30)<br>TEXT_LENGTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER<br>TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG </p>
<p>SQL&gt; define a = '''20000101 12:01:01'''&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --定义局部变量，如果想用一个类似在各种显示中所包括的回车那样的常量，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --可以用define命令来设置<br>SQL&gt; select &amp;a from dual;<br>原值&nbsp;&nbsp;&nbsp; 1: select &amp;a from dual<br>新值&nbsp;&nbsp;&nbsp; 1: select '20000101 12:01:01' from dual </p>
<p>'2000010112:01:01<br>-----------------<br>20000101 12:01:01</p>
<p><br>问题提出： <br>1、用户需要对数据库用户下的每一张表都执行一个相同的SQL操作，这时，一遍、一遍的键入SQL语句是很麻烦的 </p>
<p>实现方法： <br>SQL&gt; set heading off --禁止输出列标题<br>SQL&gt; set feedback off --禁止显示最后一行的计数反馈信息 </p>
<p>列出当前用户下所有同义词的定义，可用来测试同义词的真实存在性<br>select 'desc '||tname from tab where tabtype='SYNONYM'; </p>
<p>查询当前用户下所有表的记录数<br>select 'select '''||tname||''',count(*) from '||tname||';' from tab where tabtype='TABLE'; </p>
<p>把所有符合条件的表的select权限授予为public<br>select 'grant select on '||table_name||' to public;' from user_tables where 《条件》; </p>
<p>删除用户下各种对象<br>select 'drop '||tabtype||' '||tname from tab; </p>
<p>删除符合条件用户<br>select 'drop user '||username||' cascade;' from all_users where user_id&gt;25; </p>
<p>快速编译所有视图 <br>----当在把数据库倒入到新的服务器上后(数据库重建)，需要将视图重新编译一遍，<br>----因为该表空间视图到其它表空间的表的连接会出现问题，可以利用PL/SQL的语言特性，快速编译。 </p>
<p>SQL&gt; SPOOL ON.SQL<br>SQL&gt; SELECT'ALTER VIEW '||TNAME||' COMPILE;' FROM TAB;<br>SQL&gt; SPOOL OFF<br>然后执行ON.SQL即可。<br>SQL&gt; @ON.SQL<br>当然，授权和创建同义词也可以快速进行，如：<br>SQL&gt; SELECT 'GRANT SELECT ON '||TNAME||' TO 用户名;' FROM TAB;<br>SQL&gt; SELECT 'CREATE SYNONYM '||TNAME||' FOR 用户名.'||TNAME||';' FROM TAB; </p>
<p>SQL*PLUS常用命令列表 </p>
<p>[ 天堂之水&nbsp; 2002年9月18日，阅读人数36人 ]</p>
<p>软件环境： <br>1、Windows 98 第二版<br>2、Oracle数据库版本为：Personal Oracle7 Release 7.3.4.0.0<br>3、Oracle安装路径为：C:\ORAWIN95 </p>
<p>命令列表： <br>假设当前执行命令为：select * from tab; </p>
<p>(a)ppend　　　　 添加文本到缓冲区当前行尾　　　　a&nbsp; order by tname　结果：select * from tab order by tname;<br>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　（注：a后面跟2个空格）<br>(c)hange/old/new 在当前行用新的文本替换旧的文本　c/*/tname　　　　　结果：select tname from tab;<br>(c)hange/text　　从当前行删除文本　　　　　　　　c/tab　　　　　　　结果：select tname from ;<br>del　　　　　　　删除当前行<br>del n　　　　　　删除第n行<br>(i)nput 文本　　 在当前行之后添加一行<br>(l)ist　　　　　 显示缓冲区中所有行<br>(l)ist n　　　　 显示缓冲区中第 n 行<br>(l)ist m n　　　 显示缓冲区中 m 到 n 行<br>run　　　　　　　执行当前缓冲区的命令<br>/　　　　　　　　执行当前缓冲区的命令<br>r　　　　　　　　执行当前缓冲区的命令<br>@文件名　　　　　运行调入内存的sql文件，如： </p>
<p>SQL&gt; edit s&lt;回车&gt;<br>如果当前目录下不存在s.sql文件，则系统自动生成s.sql文件，<br>在其中输入&#8220;select * from tab;&#8221;，存盘退出。 </p>
<p>SQL&gt; @s&lt;回车&gt;<br>系统会自动查询当前用户下的所有表、视图、同义词。 </p>
<p>@@文件名　　　　 在.sql文件中调用令一个.sql文件时使用 </p>
<p>save 文件名　　　将缓冲区的命令以文件方式存盘，缺省文件扩展名为.sql<br>get 文件名　　　 调入存盘的sql文件<br>start 文件名　　 运行调入内存的sql文件 </p>
<p>spool 文件名　　 把这之后的各种操作及执行结果&#8220;假脱机&#8221;即存盘到磁盘文件上，默认文件扩展名为.lst<br>spool　　　　　　显示当前的&#8220;假脱机&#8221;状态<br>spool off　　　　停止输出 </p>
<p>例：<br>SQL&gt; spool a<br>SQL&gt; spool<br>正假脱机到 A.LST<br>SQL&gt; spool off<br>SQL&gt; spool<br>当前无假脱机 </p>
<p>exit　　　　　　 退出SQL*PLUS<br>desc 表名　　　　显示表的结构<br>show user　　　　显示当前连接用户<br>show error　　　 显示错误<br>show all　　　　 显示所有68个系统变量值<br>edit　　　　　　 打开默认编辑器，Windows系统中默认是notepad.exe，把缓冲区中最后一条SQL语句调入afiedt.buf文件中进行编辑<br>edit 文件名　　　把当前目录中指定的.sql文件调入编辑器进行编辑 </p>
<p>clear screen　　 清空当前屏幕显示</p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/27202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-05-18 15:51 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/05/18/27202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计三大范式应用实例剖析</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20858.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 08:01:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20858.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20858.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20858.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20858.html</trackback:ping><description><![CDATA[
		<div class="style7" align="center">
				<span style="FONT-SIZE: 12pt">
						<b>数据库设计三大范式应用实例剖析<br /><div class="daxiao14" align="left"><strong>引言<br /><br /></strong>　　数据库的设计范式是数据库设计所需要满足的规范，满足这些规范的数据库是简洁的、结构明晰的，同时，不会发生插入（insert）、删除（delete）和更新（update）操作异常。反之则是乱七八糟，不仅给数据库的编程人员制造麻烦，而且面目可憎，可能存储了大量不需要的冗余信息。<br /><br />　　设计范式是不是很难懂呢？非也，大学教材上给我们一堆数学公式我们当然看不懂，也记不住。所以我们很多人就根本不按照范式来设计数据库。<br /><br />　　实质上，设计范式用很形象、很简洁的话语就能说清楚，道明白。本文将对范式进行通俗地说明，并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。<br /><br />　　<b>范式说明</b><br /><br />　　第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整型、实数、字符型、逻辑型、日期型等。<br /><br />　　例如，如下的数据库表是符合第一范式的：<br /><br /><table class="content" cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>字段1</td><td>字段2</td><td>字段3</td><td>字段4</td></tr><tr><td> </td><td>　</td><td>　</td><td>　</td></tr></tbody></table><br />　　而这样的数据库表是不符合第一范式的：<br /><br /><table class="content" cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>字段1</td><td>字段2</td><td colspan="2"><div align="center">字段3 </div></td><td>字段4</td></tr><tr><td> </td><td>　</td><td>字段3.1</td><td>字段3.2</td><td> </td></tr></tbody></table><br />　　很显然，在当前的任何关系数据库管理系统（DBMS）中，傻瓜也不可能做出不符合第一范式的数据库，因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此，你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。<br /><br />　　第二范式（2NF）：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。<br /><br />　　假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分)，关键字为组合关键字(学号, 课程名称)，因为存在如下决定关系：<br /><br />　　(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)<br /><br />　　这个数据库表不满足第二范式，因为存在如下决定关系：<br /><br />　　(课程名称) → (学分)<br /><br />　　(学号) → (姓名, 年龄)<br /><br />　　即存在组合关键字中的字段决定非关键字的情况。<br /><br />　　由于不符合2NF，这个选课关系表会存在如下问题：<br /><br />　　(1) 数据冗余：<br /><br />　　同一门课程由n个学生选修，"学分"就重复n-1次；同一个学生选修了m门课程，姓名和年龄就重复了m-1次。<br /><br />　　(2) 更新异常：<br /><br />　　若调整了某门课程的学分，数据表中所有行的"学分"值都要更新，否则会出现同一门课程学分不同的情况。<br /><br />　　(3) 插入异常：<br /><br />　　假设要开设一门新的课程，暂时还没有人选修。这样，由于还没有"学号"关键字，课程名称和学分也无法记录入数据库。<br /><br />　　(4) 删除异常：<br /><br />　　假设一批学生已经完成课程的选修，这些选修记录就应该从数据库表中删除。但是，与此同时，课程名称和学分信息也被删除了。很显然，这也会导致插入异常。<br /><br />　　把选课关系表SelectCourse改为如下三个表：<br /><br />　　学生：Student(学号, 姓名, 年龄)；<br /><br />　　课程：Course(课程名称, 学分)；<br /><br />　　选课关系：SelectCourse(学号, 课程名称, 成绩)。<br /><br />　　这样的数据库表是符合第二范式的，消除了数据冗余、更新异常、插入异常和删除异常。<br /><br />　　另外，所有单关键字的数据库表都符合第二范式，因为不可能存在组合关键字。<br /><br />　　第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在"A → B → C"的决定关系，则C传递函数依赖于A。因此，满足第三范式的数据库表应该不存在如下依赖关系：<br /><br />　　关键字段 → 非关键字段x → 非关键字段y<br /><br />　　假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)，关键字为单一关键字"学号"，因为存在如下决定关系：<br /><br />　　(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)<br /><br />　　这个数据库是符合2NF的，但是不符合3NF，因为存在如下决定关系：<br /><br />　　(学号) → (所在学院) → (学院地点, 学院电话)<br /><br />　　即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。<br /><br />　　它也会存在数据冗余、更新异常、插入异常和删除异常的情况，读者可自行分析得知。<br /><br />　　把学生关系表分为如下两个表：<br /><br />　　学生：(学号, 姓名, 年龄, 所在学院)；<br /><br />　　学院：(学院, 地点, 电话)。<br /><br />　　这样的数据库表是符合第三范式的，消除了数据冗余、更新异常、插入异常和删除异常。<br /><br />　　鲍依斯-科得范式（BCNF）：在第三范式的基础上，数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。<br /><br />　　假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)，且有一个管理员只在一个仓库工作；一个仓库可以存储多种物品。这个数据库表中存在如下决定关系：<br /><br />　　(仓库ID, 存储物品ID) →(管理员ID, 数量)<br /><br />　　(管理员ID, 存储物品ID) → (仓库ID, 数量)<br /><br />　　所以，(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字，表中的唯一非关键字段为数量，它是符合第三范式的。但是，由于存在如下决定关系：<br /><br />　　(仓库ID) → (管理员ID)<br /><br />　　(管理员ID) → (仓库ID)<br /><br />　　即存在关键字段决定关键字段的情况，所以其不符合BCNF范式。它会出现如下异常情况：<br /><br />　　(1) 删除异常：<br /><br />　　当仓库被清空后，所有"存储物品ID"和"数量"信息被删除的同时，"仓库ID"和"管理员ID"信息也被删除了。<br /><br />　　(2) 插入异常：<br /><br />　　当仓库没有存储任何物品时，无法给仓库分配管理员。<br /><br />　　(3) 更新异常：<br /><br />　　如果仓库换了管理员，则表中所有行的管理员ID都要修改。<br /><br />　　把仓库管理关系表分解为二个关系表：<br /><br />　　仓库管理：StorehouseManage(仓库ID, 管理员ID)；<br /><br />　　仓库：Storehouse(仓库ID, 存储物品ID, 数量)。<br /><br />　　这样的数据库表是符合BCNF范式的，消除了删除异常、插入异常和更新异常。<br /><br /><strong>范式应用<br /><br /></strong>　　我们来逐步搞定一个论坛的数据库，有如下信息：<br /><br />　　（1） 用户：用户名，email，主页，电话，联系地址<br /><br />　　（2） 帖子：发帖标题，发帖内容，回复标题，回复内容<br /><br />　　第一次我们将数据库设计为仅仅存在表：<br />　　 
<table class="content" cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>用户名</td><td>email</td><td>主页</td><td>电话</td><td>联系地址</td><td>发帖标题</td><td>发帖内容</td><td>回复标题</td><td>回复内容</td></tr></tbody></table><br />　　这个数据库表符合第一范式，但是没有任何一组候选关键字能决定数据库表的整行，唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段，即将表修改为：<br /><br /><table class="content" cellspacing="0" cellpadding="2" width="90%" align="center" border="1"><tbody><tr><td>用户名</td><td>email</td><td>主页</td><td>电话</td><td>联系地址</td><td>发帖ID</td><td>发帖标题</td><td>发帖内容</td><td>回复ID</td><td>回复标题</td><td>回复内容</td></tr></tbody></table><br />　　这样数据表中的关键字(用户名，发帖ID，回复ID)能决定整行：<br /><br />　　(用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)<br /><br />　　但是，这样的设计不符合第二范式，因为存在如下决定关系：<br /><br />　　(用户名) → (email,主页,电话,联系地址)<br /><br />　　(发帖ID) → (发帖标题,发帖内容)<br /><br />　　(回复ID) → (回复标题,回复内容)<br /><br />　　即非关键字段部分函数依赖于候选关键字段，很明显，这个设计会导致大量的数据冗余和操作异常。<br /><br />　　我们将数据库表分解为（带下划线的为关键字）：<br /><br />　　（1） 用户信息：用户名，email，主页，电话，联系地址<br /><br />　　（2） 帖子信息：发帖ID，标题，内容<br /><br />　　（3） 回复信息：回复ID，标题，内容<br /><br />　　（4） 发贴：用户名，发帖ID<br /><br />　　（5） 回复：发帖ID，回复ID<br /><br />　　这样的设计是满足第1、2、3范式和BCNF范式要求的，但是这样的设计是不是最好的呢？<br /><br />　　不一定。<br /><br />　　观察可知，第4项"发帖"中的"用户名"和"发帖ID"之间是1：N的关系，因此我们可以把"发帖"合并到第2项的"帖子信息"中；第5项"回复"中的"发帖ID"和"回复ID"之间也是1：N的关系，因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余，新的设计为： <br />　　（1） 用户信息：用户名，email，主页，电话，联系地址<br /><br />　　（2） 帖子信息：用户名，发帖ID，标题，内容<br /><br />　　（3） 回复信息：发帖ID，回复ID，标题，内容<br /><br />　　数据库表1显然满足所有范式的要求；<br /><br />　　数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖，即不满足第二范式的要求，但是这一设计并不会导致数据冗余和操作异常；<br /><br />　　数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖，也不满足第二范式的要求，但是与数据库表2相似，这一设计也不会导致数据冗余和操作异常。<br /><br />　　由此可以看出，并不一定要强行满足范式的要求，对于1：N关系，当1的一边合并到N的那边后，N的那边就不再满足第二范式了，但是这种设计反而比较好！<br /><br />　　对于M：N的关系，不能将M一边或N一边合并到另一边去，这样会导致不符合范式要求，同时导致操作异常和数据冗余。 <br />对于1：1的关系，我们可以将左边的1或者右边的1合并到另一边去，设计导致不符合范式要求，但是并不会导致操作异常和数据冗余。<br /><br />　　结论<br /><br />　　满足范式要求的数据库设计是结构清晰的，同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的，在数据库表中存在1：1或1：N关系这种较特殊的情况下，合并导致的不符合范式要求反而是合理的。<br /><br />　　在我们设计数据库的时候，一定要时刻考虑范式的要求。 </div></b>
				</span>
		</div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-20 16:01 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL与Oracle、DB2的性能比较</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20857.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 07:43:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20857.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20857.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20857.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20857.html</trackback:ping><description><![CDATA[
		<div class="style7" align="center">
				<span style="FONT-SIZE: 12pt">
						<strong>SQL与Oracle、DB2的性能比较<br /></strong>
						<font size="2">
								<strong>开放性 </strong>　　SQL Server<br />　　只能在Windows 上运行，没有丝毫的开放性，操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用，NT server只适合中小型企业。而且Windows平台的可靠性，安全性和伸缩性是非常有限的。它不象Unix那样久经考验，尤其是在处理大数据量的关键业务时。<br />　　Oracle<br />　　能在所有主流平台上运行（包括 Windows）。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。<br />　　DB2<br />　　能在所有主流平台上运行（包括Windows）。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%。 </font>
						<p>
								<strong>
										<font size="2">　　可伸缩性,并行性 　　SQL Server<br />　　并行实施和共存模型并不成熟。很难处理日益增多的用户数和数据卷。伸缩性有限。Oracle<br />平行服务器通过使一组结点共享同一簇中的工作来扩展Window NT的能力,提供高可用性和高伸缩性的簇的解决方案。如果WindowsNT不能满足需要, 用户可以把数据库移到UNIX中。<br />　　DB2 <br />　　DB2具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境。数据库分区是数据库的一部分，包含自己的数据、索引、配置文件、和事务日志。数据库分区有时被称为节点或数据库节点。 </font>
								</strong>
						</p>
						<p>
								<font size="2">
										<strong>　　安全性 <br />　　SQL server <br />　　没有获得任何安全证书。 <br />　　Oracle Server<br />　　获得最高认证级别的ISO标准认证。<br />　　DB2<br />　　获得最高认证级别的ISO标准认证。 </strong>
								</font>
						</p>
						<p>
								<font size="2">
										<strong>　　性能 <br />　　SQL Server <br />　　多用户时性能不佳 <br />　　Oracle<br />　　性能最高， 保持WindowsNT下的TPC-D和TPC-C的世界记录。<br />　　DB2<br />　　适用于数据仓库和在线事物处理，性能较高。 </strong>
								</font>
						</p>
						<p>
								<font size="2">
										<strong>　　客户端支持及应用模式<br />　　SQL Server <br />　　C/S结构，只支持Windows客户，可以用ADO,DAO,OLEDB,ODBC连接。<br />　　Oracle<br />　　多层次网络计算，支持多种工业标准，可以用ODBC,JDBC,OCI等网络客户连接。<br />　　DB2<br />　　跨平台，多层结构，支持ODBC,JDBC等客户。</strong>
								</font>
						</p>
						<p>
								<font size="2">
										<strong>　　操作简便 <br />　　SQL Server <br />　　操作简单,但只有图形界面。<br />　　Oracle<br />　　较复杂, 同时提供GUI和命令行，在Windows NT和Unix下操作相同。<br />　　DB2<br />　　操作简单,同时提供GUI和命令行，在Windows NT和Unix下操作相同。 </strong>
								</font>
						</p>
						<p>
								<font size="2">
										<strong>　　使用风险 </strong>
								</font>
						</p>
						<p>
								<font size="2">
										<strong>　　SQL Server <br />　　完全重写的代码，经历了长期的测试，不断延迟，许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。 <br />　　Oracle<br />　　长时间的开发经验，完全向下兼容。得到广泛的应用。完全没有风险。<br />　　DB2<br />　　在巨型企业得到广泛的应用，向下兼容性好。风险小。 </strong>
								</font>
						</p>
				</span>
		</div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-20 15:43 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2/Sybase/Oracle的比较</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20855.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 07:23:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20855.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20855.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20855.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20855.html</trackback:ping><description><![CDATA[
		<div class="style7" align="center">
				<span style="FONT-SIZE: 12pt">
						<b>DB2/Sybase/Oracle的比较<br /><div class="daxiao14" align="left">DB2与Oracle比较 <br />特性 DB2 Oracle <br />开放性/可移植性 IBMDB2UDB在各层面，从网络协议的支持到应用开发程序的编程接口，数据库存储程序及触发器，服务器之间的分布式运作，都是基于最新的国际标准，以确保其开放性及移植性。 ORACLE的许多功能都是使用其私有的，非开放性的技术。例如：ORACLEPL/SQL语言是ORACLE私有的。其存储程序语句也不符合ANSISQL及ISOSQL的标准，客户机/服务器的编程接口，ORACLE的SQL*NET也不是根据标准定义的。 <br />处理性能 IBM发明了关系型数据库以及其优化技术，并不断发展，所以DB2在各种性能测试中均占领先地位。IBM有信心能在各种标准的测试环境下超越ORACLE。DB2在高端应用具有过硬的技术，有众多超过1Tera-bytes数据量的用户实例。 由于ORACLE限制用户在未经许可的情况下不能公布他们所作的性能测试，故一般用户不易取得ORACLE的比较资料。Oracle超过1Tera-bytes数据量的客户实例很少。 <br />并行能力 DB2的并行版支持位图索引和对象关系，因此，DB2有更好的扩展性和性能； Oracle触发器无法支持并行：在一些特殊的引用完整性(referentialintegrity)的限制下，并行也无法运用：如果表格中有大对象，由于前述的限制(表不能分割)，并行也无法运用。总之，Oracle在并行系统中没有实现位图索引和对象关系， <br />分布式数据库 DB2分布式数据库的处理(如两阶段提交)及连接功能是建立在DB2的核心中，不需要使用其它的产品附件。性能好，易使用，减少开支。 ORACLE的分布式功能需要另外购买DistributedOption以及SQL*NET等产品才能实现分布式数据库的连接。 <br />异构平台支持 在异构的环境中，IBM数据库方案简单、更加无缝而且比Oracle的成本低； Oracle的异构网关性能差，当访问异构数据库时，Oracle缺乏全局的优化，导致了过多的数据及网络传输。 <br />复制能力 DB2提供业界最佳效率的和最开放的复制方案；DB2提供自动冲突检测和解决方法。 Oracle只提供自动冲突检测和解决方法的例子程序，用户须对例子程序做定制后来解决复制冲突 <br />对电子商务支持 IBM的Java技术为业界所公认，DB2公认为电子商务基石。DB2提供的JDBC接口，还可用Java语言写储存过程和用户自定义函数 Oracle的Java技术仅局限于数据库和ERP应用。 <br />对商业智能支持 DB2OLAPServer远比Express更易使用和实现。DB2OLAPServer提供读/写能力-这对一些关键性的多维分析扩展应用如：预测和预算，是非常有用的(Express只支持读)。IBM的商业智能解决方案中，拥有数据挖掘(IntelligentMiner)工具。 OracleExpress只支持读的能力，不利于支持预测和预算。Oracle缺乏数据挖掘方面的工具。 <br />软件质量与可靠性 DB2的软件开发实验室早在1994年便已通过ISO9000国际质量管理标准的验证与认可。故DB2的软件质量是所有数据库厂家中可靠性最高，故障率最低的数据库。 ORACLE版本6及版本7在推出后皆需经过无数次修订版升级才能达到一定程度的可用度，这给用户带来极大的不便，并且严重影响到投产系统的可用性及可靠性。 <br /><br /><br />DB2与Sybase比较 <br /><br />特性 DB2 Sybase <br />开放性/可移植性 IBMDB2的编程接口遵照ANSI、X/OPEN标准的CLI(CallLevelInterface)及ANSISQL的嵌入式SQL等开放标准。IBMDB2的存储程序和触发器机制则使用最新的SQL国际标准并支持标准的开放语言如C/C++。在DB2CommonServerV2.1.2(1996)以及DB2UDB(1997)中更加入了用Java语言开发存储程序和触发器的功能。 1.编程接口：SYBASE使用的编程接口不是开放的，因为他使用的是自己的OpenClient/OpenServer接口，而不是基于某一标准的接口。2.存储程序(StoredProcedure)：由于SYBASE的CLIENT/SERVER技术是80年代开发的，没有使用SQL92等相关的标准，因此编制存储程序和触发器所用的Transact-SQL也是它们自己专用的。 <br />处理性能 IBM发明了关系型数据库以及其优化技术，并不断发展，所以DB2在各种性能测试中均占领先地位。DB2在高端应用具有过硬的技术，有众多超过1Tera-bytes数据量的用户实例。 SYBASE的优化器(OPTIMIZER)不能有效的支持复杂的查询(ComplexQueries)。应用程序中稍微复杂一些的SQL语句，SYBASE的优化器就无法妥善优化处理。SYBASE刚刚进入海量多处理器MPP的领域，缺乏这方面的经验及先例，Sybase大于一个TB数据量的客户实例很少。 <br />并行能力 DB2的并行版支持位图索引和对象关系，因此，DB2有更好的扩展性和性能； SYBASE数据库核心结构较陈旧，尤其在多处理器(SMP)的服务器上无法做到软硬件相配合的延伸与扩展(scale)，无法发挥多处理器的优势。其单进程多线索的结构就无法象DB2的多进程多线索的结构更能有效地在SMP等机器上运行。 <br />高可用性 DB2可以用数据库及表空间两种粒度(granularity)对数据作备份与恢复(BACKUP及RESTORE)，并且备份可以在联机方式(ONLINE)下进行，不影响多用户的同时使用。这使得DB2能真正地满足一天24小时、一星期七天的全天候使用。 SYBASE在BACKUP数据库及RESTORE数据库时，需要将系统转为单一用户模式以保证数据库中数据的完整性及一致性，并且在BACKUP之后，要运行DBCC检查数据的一致性，这使得SYBASE数据库在可用性方面受到限制。 <br />数据完整与可管理性 IBMDB2中数据库可自动的维持两表间的一致性，无需再由DBA编程。 SYBASE在其数据库技术中引入RI(ReferentialIntegrity数据引用完整性)较晚，而且功能有限。例如，当表A中的列A是另一个表B中列B的ForeignKey时，若要删掉表A中的一个记录，在SYBASE中是不允许的，只有通过触发器(Trigger)及存储过程(StoredProcedure)，才能删掉表A中的一个记录，同时删掉表B中的相关记录，或把其值设置为NULL。 <br />异构平台支持 在异构的环境中，IBM数据库方案简单、更加无缝而且成本低； Oracle的异构网关性能差，当访问异构数据库时，Oracle缺乏全局的优化，导致了过多的数据及网络传输。 <br />复制能力 DB2提供业界最佳效率的和最开放的复制方案；DB2支持对数据做预处理后再复制到远端，更有效率且网络流量少。 Sybase是立即复制交易，数据和网络流量大，据用户反映，Sybase的复制难以实施。SybaseAdaptiveServerAnywhere和AdaptiveServerEnterprise之间的数据复制不是无缝连接，且要求整合工作。 <br />对电子商务支持 IBM的Java技术为业界所公认，DB2公认为电子商务基石。DB2提供的JDBC接口，还可用Java语言写储存过程和用户自定义函数 Oracle的Java技术仅局限于数据库和ERP应用。 <br />对商业智能支持 DB2WarehouseManager内置了数据仓库管理功能。IBM的商业智能解决方案中，拥有数据挖掘(IntelligentMiner)工具。 Sybase数据集市(datamart)没有提供仓库(Warehouse)管理与自动化的功能。 <br />软件质量与可靠性 DB2的软件开发实验室早在1994年便已通过ISO9000国际质量管理标准的验证与认可。故DB2的软件质量是所有数据库厂家中可靠性最高，故障率最低的数据库。数据在IBM系统内被腐化(corrupted)不但是前所未闻，也是IBM传统用户所不可能忍受的。 SYBASE中的数据需要小心的维护，因为数据在数据库中有可能被“腐化(corrupted)”而无法继续使用。在没有事先修补的情形下，若这些数据被备份了，则它们无法再被使用。为此SYBASE不得不为客户提供一个检查程序(DBCC)。 <br /><br /><br />DB2与Informix比较 <br /><br />特性 DB2 Informix <br />开放性/可移植性 IBMDB2UDB在各层面，从网络协议的支持到应用开发程序的编程接口，数据库存储程序及触发器，服务器之间的分布式运作，都是基于最新的国际标准，以确保其开放性及移植性。 INFORMIX私有4GL编写的程序只能局限在INFORMIX上运行。 <br />处理性能 IBM发明了关系型数据库以及其优化技术，并不断发展，所以DB2在各种性能测试中均占领先地位。DB2在高端应用具有过硬的技术，有众多超过1Tera-bytes数据量的用户实例。 由于INFORMIX是以小型数据库起家，所以其产品设计到目前为止仍有许多小型数据库的限制。许多用户都曾遇到INFORMIX在数据存储、日志管理、备份、恢复等方面的问题。Informix的扩展并行选项在支持多用户并发访问时存在困难。INFORMIX由于缺乏对大量数据的管理经验，所以其优化器技术也不能针对大量数据做优化。 <br />并行能力 DB2EEE能利用HACMP自动接替故障节点正常工作，Informix做不到。DB2EEE已经有多年的历史，颁布了最高的TPC-D和TPC-H基准测试值。DB2EEE支持动态位图索引完成Star-jion，从而既提高了性能又不增加数据库系统管理员的维护量。 在并行机SP上，当SP的高性能开关(switch)不能通讯时，InformixXPS数据库将处于瘫痪状态.当并行机的节点出现故障时，InformixXPS数据库将处于瘫痪状态，停机时间为4到24小时；InformixXPS没有备份和恢复。InformixXPS没有对查询的监控机制，有可能某一个用户的一个查询耗尽系统的所有资源而不让其他用户使用。 <br />分布式数据库 DB2则是通过核心直接支持XA接口，并且提供许多其它厂商所没有的XA先进功能，例如工商银行山东分行的DB2应用就大量地使用了DB2XA接口，实现了与CICS结合的大型联机事物处理系统(OLTP)来支持全省通存通兑等应用。 INFORMIX对异构分布式数据库的支持是通过X/OPEN、XA实现的。虽然INFORMIX声称它能够支持X/OPEN、XA接口，但只是在某几个版本通过附加选件完成。并且在这方面，INFORMIX很少有使用先例，也没有这方面的技术支持。 <br />异构平台支持 在异构的环境中，IBM数据库方案简单、更加无缝而且成本低； INFORMIX在数据库与数据库之间的连接方面很弱。例如INFORMIX没有连接其他数据库如bbORACLE、SYBASE等数据库的产品. <br />复制能力 DB2提供业界最佳效率的和最开放的复制方案；DB2提供自动冲突检测和解决方法。 Informix只支持Informix数据库间的复制，若要同其它数据库相互复制，则必须购买第三方支持软件。 <br /><br />成功案例 <br />DB2在国内、国际的用户群 <br />DB2的用户不胜枚举。它在全球有一百万以上的License和超过四千万的用户，它在全世界有一万一千个企业级用户。全世界70％公司的数据储存在IBM的数据库里。 </div></b>
				</span>
		</div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-20 15:23 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手动建立Oracle9i数据库</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20854.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 07:22:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20854.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20854.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20854.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20854.html</trackback:ping><description><![CDATA[
		<div class="style7" align="center">
				<span style="FONT-SIZE: 12pt">
						<b>手动建立Oracle9i数据库<br /><p>本文内容将涵盖下列主题：</p><ul><li>n          建立数据库的前置工作 
</li><li>n          起始参数档的重要参数 
</li><li>n          手动建立 Oracle9i 数据库的步骤 
</li><li>n          如何移除 Oracle9i 数据库</li></ul><p> </p><p>不管原因为何，当您准备自行建立 Oracle9i 数据库时，都必须事先做好妥善准备。因为手动建立 Oracle9i 数据库并不是件容易的事，可能的话应该尽量使用 Oracle9i 提供的「数据库建置辅助精灵」来建立新数据库。但是要想成为一个合格的 Oracle DBA，您也必须熟稔手动建立数据库的方式，才能面对建置 Oracle9i 数据库所可能碰到的任何问题。</p><p> </p><p>首先我们先看看建立 Oracle9i 数据库之前应注意那些事情。</p><p> </p><p><strong>建立</strong><strong> Oracle9i </strong><strong>数据库的前置处理工作</strong><strong></strong></p><p>在开始建立新的 Oracle9i 数据库之前，建议您先做好下列准备工作：</p><ul><li>n          评估资料表与索引的存放位置，并预估其所需空间(如果可能的话)。 
</li><li>n          规划操作系统下数据库实体档案的部署方式—良好的档案配置将大幅改善资料存取效能。不管是安装 Oracle 服务器软件或是建置新数据库时，都必须特别注意这点。例如说，您可以将重置日志文件 (Redo Log files) 置于其它磁盘或是 RAID 1磁盘阵列上；而将数据文件置于 RAID 5磁盘阵列上。 
</li><li>n          选定「全域数据库名称」(global database name) —它是在网际网络上识别 Oracle9i 数据库的方式，由<strong>数据库名称</strong><strong></strong>与<strong>网域名称</strong><strong></strong>组成，分别设定在起始参数档的<strong>DB_NAME</strong>与<strong>DB_DOMAIN</strong>参数内。 
</li><li>n          熟悉起始参数档内较重要的参数，甚至「服务器参数档」(server parameter file)的使用时机与其功用。 
</li><li>n          选定适当的数据库字符集。所有字符资料都是依照特定字符集存入数据库，因此您必须在建立数据库时指定适当字符集(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn1" name="_ftnref1"></a>[1])。 
</li><li>n          选定「标准资料区块」大小—设定在起始参数档的<strong>DB_BLOCK_SIZE</strong>参数。除了 SYSTEM 资料表空间，其它资料表空间也可以遵循「标准资料区块」的设定。此外，在 Oracle9i 数据库中，您可以设定额外四种「非标准资料区块」。需要注意的是，「标准资料区块」大小在数据库建立完成后即无法更改。 
</li><li>n          针对未来数据库的运作情况，订立一份良好的数据库备份计划，以便数据库毁损时能在最短时间内予以修复。 
</li><li>n          熟悉 Oracle9i 数据库的激活/关闭方式，与其搭配的各种选项(如 STARTUP 指令的 nomount、mount、open 选项)。 
</li><li>n          确认物理内存是否足以激活 Oracle9i Instance。 
</li><li>n          确认 Oracle9i 服务器机的磁盘空间足够，以建置新数据库。</li></ul><p> </p><p>除了本文提及的注意事项，您也可以查阅各种操作系统专属的 Oracle9i 安装指南，以获取更详尽的信息。</p><p> </p><p><strong>选择数据库建置方式</strong><strong></strong></p><p>Oracle9i 数据库建置过程包含下列三项主要工作：</p><ul><li>n          建置新的数据库实体档案，包含资料文件、重置日志文件。 
</li><li>n          建立控制档，并予以初始化。 
</li><li>n          建置 Oracle9i 存取数据库系统时必要的数据字典(data dictionary)。</li></ul><p> </p><p>实际上，您可能经由下列三种方式之一来建置新的 Oracle9i 数据库时：</p><ul><li>n          使用 Oracle「数据库建置组态精灵」(Database Configuration Assistant，DBCA)。</li></ul><p>Oracle Universal Installer 在安装过程中会适时激活 DBCA 协助您建立数据库，视您选择的安装种类而定。DBCA 将以图形接口方式引导您逐步完成 Oracle9i 数据库的建置工作。若是安装过程未激活 DBCA，您也可以事后单独激活 DBCA 建立新数据库，甚至建立第二个 Oracle9i 数据库。</p><ul><li>n          执行指令文件(script)手动建立 Oracle9i 数据库</li></ul><p>如果您手边恰好保存着上次建立 Oracle9i 数据库所用的指令文件，那么您可以直接编修该指令文件，并予以执行。否则，建议您使用 Oracle9i 提供的范例指令文件进行编修。Oracle9i 不仅提供了数据库建置范例指令文件，也提供了起始参数范例文件。您可视实际需要进行必要调整。</p><ul><li>n          移转(migrate)或升级(upgrade)既有数据库。</li></ul><p>如果您的应用系统正在存取既有 Oracle 数据库，除非您需要一个全新的数据库或是测试用环境，否则应该不需要建立新数据库。在此情况下，您所面临的将是数据库移转或升级议题。有关这方面的详尽信息，请参阅《Oracle9<em>i </em>Database Migration》手册。</p><p> </p><p><strong>再谈起始参数档</strong><strong></strong></p><p>还记得上一期曾经提过的起始参数档吗？因为手动建立 Oracle9i 数据库之前必须先激活 Oracle9i Instance，因此您必须先建立一个起始参数档。建立新的起始参数档时，最快速的方式就是编辑 Oracle9i 提供的范例档案，然后另存新档。我较习惯的方式是直接编辑既有起始参数档之复本，然后视实际需要进行调整。因为起始参数档可供设定的参数非常多，如果某些参数未经过明确设定，Oracle9i 会自动代入默认值。</p><p>第一次以手动方式建立 Oracle 数据库时，建议您尽可能不要修改各起始参数值。等到您熟悉每个参数的意义与使用时机之后，再利用文字编辑器调整或新增其它参数。除此之外，Oracle9i 允许您建立服务器参数文件(以二进制格式存放)。该档案内的参数可在 Oracle9i Instance 激活后执行 ALTER SYSTEM 指令予以修改。</p><p> </p><p>以下是建置新数据库之前必须新增或编辑的起始参数，包括：</p><ul><li>n          全域数据库名称 
</li><li>n          控制文件名称与路径 
</li><li>n          资料区块大小 
</li><li>n          影响 SGA 容量的起始参数 
</li><li>n          设定处理程序最大数目 
</li><li>n          设定空间回复(Undo)管理方法</li></ul><p><strong></strong><strong></strong> </p><p><strong>设定全域数据库名称</strong><strong></strong></p><p>Oracle9i 的<strong>全域数据库名称</strong>由「数据库名称」与「网域名称」所组成，其中「数据库名称」设定于 DB_NAME 起始参数，而「网域名称」则是设定于 DB_DOMAIN 参数。这两个参数合并之后就可以在网际网络上唯一识别每一个 Oracle9i 数据库。举例来说，假设我们欲建立的 Oracle9i 数据库之<strong>全域数据库名称</strong>为 mydb.uuu.com.tw，那么可在起始参数档内设定下列两参数：</p><p>DB_NAME = mydb</p><p>DB_DOMAIN = uuu.com.tw</p><p> </p><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td></td></tr></tbody></table>Tips： 
<p>您可以执行 ALTER DATABASE RENAME GLOBAL_NAME 指令更改 Oracle9i 数据库的全域数据库名称；在您更改 DB_NAME 与 DB_DOMAIN 这两个起始参数后必须将 Oracle9i 数据库重新激活才会生效。此外，控制档也必须重新建立。</p><p><strong></strong><strong></strong> </p><p><strong>关于</strong><strong> DB_NAME </strong><strong>起始参数</strong><strong></strong></p><p><strong>DB_NAME</strong>必须是文字字符串，且不能超过 8 个字符。在建立数据库的过程中，<strong>DB_NAME</strong>设定值会记录在资料文件、控制文件、以及重置日志文件之中。如果您激活 Oracle9i Instance 的时候，起始参数档内设定的<strong>DB_NAME</strong>不同于控制文件内所纪录的，那么数据库将无法激活。</p><p><strong></strong><strong></strong> </p><p><strong>关于</strong><strong> DB_DOMAIN </strong><strong>起始参数</strong><strong></strong></p><p><strong>DB_DOMAIN</strong>通常是数据库主机所在位置的网域名称。如果您欲建立的数据库将加入分布式数据库运算环境，请特别注意此参数的设定。</p><p><strong></strong><strong></strong> </p><p><strong>设定控制档</strong><strong></strong></p><p>如前所述，控制文件是 Oracle9i 数据库内相当重要的档案。因此您必须在新的起始参数档内加入<strong>CONTROL_FILE</strong>参数以设定控制文件之文件名与路径。当您执行 CREATE DATABASE 时，列在<strong>CONTROL_FILE</strong>之中的控制档将随之建立。如果起始参数档忽略了此项参数，则 Oracle9i 会在执行 CREATE DATABASE 指令时自动建立控制文件并命名之，然后放在系统预设路径下。</p><p>那么，如果<strong>CONTROL_NAME</strong>内设定的控制文件已经存在于操作系统下该怎么办呢？此时 Oracle9i 会自动覆盖既有的控制档。如果您想建立全新的控制档，请确定<strong>CONTROL_NAME</strong>设定的控制文件名不会与操作系统下任何文件名重复。</p><p>依照过去经验，Oracle 强烈建议您为每个数据库至少规划两个控制档，并分散在两个实体磁盘上。如此可避免任一控制文件毁损时造成系统停摆。</p><p>注[1]：有关 Oracle 9i 数据库的字符集种类与名称，请参阅《Oracle9i Globalization Support Guide Release 1》</p><p> </p><p><strong>设定资料区块大小</strong><strong></strong></p><p>Oracle9i 数据库内存放资料的最小单位为「资料区块」(data block)。数据库内「标准资料区块」大小是设定在起始参数档之<strong>DB_BLOCK_SIZ</strong>E 参数。Oracle9i 数据库内最重要的 SYSTEM 资料表空间就是以<strong>DB_LOCK_SIZE</strong>设定值为基础所建立。此外<strong>DB_BLOCK _SIZE</strong>也是建立新资料表空间时预设的资料区块大小。除了标准资料区块大小之外，Oracle9i 支持额外 4 种「非标准资料区块」大小。</p><p> </p><p><strong>关于</strong><strong> DB_BLOCK_SIZE </strong><strong>起始参数</strong><strong></strong></p><p>从 Oracle9i 开始，<strong>DB_BLOCK_SIZE</strong>所设定的仅是标准资料区块大小；绝大多数的数据库环境只需要设定该参数即可。一般来说，<strong>DB_BLOCK_SIZE</strong>可设定为 4K 或 8K。如果此参数未经设定，则 Oracle9i 会自动依照数据库所在操作系统平台自行决定适当的资料区块大小。</p><p>需要注意的是，标准资料区块大小在数据库建立之后就无法改变—除非重建数据库。如果数据库的「资料区块」大小不同于「操作系统区块」大小，那么建议您将<strong>DB_BLOCK_SIZE</strong>设为「操作系统区块」大小之整数倍。假定操作系统区块大小为 4K，则不妨设定<strong>DB_BLOCK_SIZE </strong>= 8192。在某些情况下，这样的组态方式将会显著地提升资料存取效能。</p><p> </p><p><strong>何谓「非标准资料区块」？</strong><strong></strong></p><p>由「非标准资料区块」构成的资料表空间可经由 CREATE TABLESPACE 指令搭配<strong>BLOCKSIZE</strong>子句建立之；其区块大小设定值可为 2K、4K、8K、16K、32。需注意的是此类型资料区块将受到操作系统环境限制，不是所有操作系统都可以设定上述所有区块大小。</p><p>欲使用「非标准资料区块」时，您还必须适当组态 SGA 内数据库缓冲区的子缓冲区，方式是藉由<strong>DB_<em>n</em>K_CACHE_SIZE</strong>参数所设定(此参数容后说明)。</p><p>此项机制是 Oracle9i 提出的新功能，在转移数据库时特别好用。举例来说，您的 OLTP 数据库也许将资料区块大小设定为 4K，但是资料仓储系统使用的数据库却将资料区块大小设定为 8K。藉由「非标准资料区块」的机制，您就可以平顺地将 OLTP 数据库的资料转移到资料仓储系统的数据库。</p><p> </p><p><strong>影响</strong><strong> SGA </strong><strong>容量的起始参数</strong><strong></strong></p><p>此类型起始参数将控制内存内「系统全域区」(System Global Area，SGA) 的大小，除了<strong>SGA_MAX_SIZE</strong>之外，其它参数几乎都可以经由 ALTER SYSTEM 指令动态地更改。借着此项特性，您可以在 Oracle9i Instance 运作时动态地增加或缩小 SGA 容量。</p><p> </p><p><strong>设定「数据库缓冲区」大小</strong><strong></strong></p><p>一般情况下，Oracle9i 数据库缓冲区(database buffer cache)大小是由起始参数档<strong>DB_CACHE_SIZ</strong>E 参数所决定。此时数据库缓冲区是以「标准资料区块」作为资料存取单位。如果您想在 Oracle9i 数据库使用多重资料区块大小，则必须设定一组<strong>DB_BLOCK_SIZE</strong>与<strong>DB_nK_CACHE_SIZE</strong>参数。如果上述两项参数在起始参数档未明确设定，则 Oracle9i 会自动设定适当的<strong>DB_CACHE_SIZE</strong>值，且将<strong>DB_<em>n</em>K_CACHE_SIZE</strong>设定为 0。</p><p> </p><p><strong>关于</strong><strong> DB_CACHE_SIZE </strong><strong>起始参数</strong><strong></strong></p><p>在 Oracle8i 以前，数据库缓冲区大小是由<strong>DB_BLOCK_BUFFERS</strong>与<strong>DB_BLOCK_SIZE</strong>所决定；从 Oracle9i 开始将由<strong>DB_CACHE_SIZE</strong>取代之。需要注意的是，<strong>DB_CACHE_SIZE</strong>是以<strong>DB_BLOCK_SIZE</strong>所设定的标准资料区块大小为基准。为了向前兼容，在 Oracle9i 中仍旧可以设定<strong>DB_BLOCK_BUFFERS</strong>参数。但是<strong>DB_BLOCK_BUFFERS</strong>属于静态参数，无法在 Oracle9i 数据库运作时进行动态调整，也不能与其它动态参数互相搭配使用。</p><p> </p><p><strong>关于</strong><strong> DB_ <em>n</em>K_CACHE_SIZE </strong><strong>起始参数</strong><strong></strong></p><p>从 Oracle9i 开始提供了「非标准资料区块」的支持，可经由下列参数设定：</p><ul><li>Ø          DB_2K_CACHE_SIZE 
</li><li>Ø          DB_4K_CACHE_SIZE 
</li><li>Ø          DB_8K_CACHE_SIZE 
</li><li>Ø          DB_16K_CACHE_SIZE 
</li><li>Ø          DB_32K_CACHE_SIZE.</li></ul><p> </p><p>各参数之中的<strong><em>n</em>k</strong>即是设定非标准资料区块的大小。我以下列参数设定为例：</p><p></p><p>DB_BLOCK_SIZE=4096</p><p>DB_CACHE_SIZE=20M</p><p>DB_2K_CACHE_SIZE=10M</p><p>DB_8K_CACHE_SIZE=8M</p><p> </p><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td></td></tr></tbody></table><p> </p><p>使用上述参数所组态的数据库缓冲区将拥有以下特性：</p><ul><li>1.          「标准资料区块」大小为 4K。 
</li><li>2.          「标准资料区块」大小构成的数据库缓冲区容量为 20M。 
</li><li>3.          第一种「非标准资料区块」大小为 2K，其构成的缓冲区容量为10M。 
</li><li>4.          第二种「非标准资料区块」大小为 8K，其构成的缓冲区容量为8M。</li></ul><p><strong></strong><strong></strong> </p><p>请注意一点，<strong>DB_ <em>n</em>K_CACHE_SIZE </strong>参数不能设定「标准资料区块」之缓冲区大小。举例来说，如果<strong>DB_BLOCK_SIZE</strong>设定为<strong>4K</strong>，就不能再设定<strong>DB_4K_CACHE_SIZE</strong>参数。</p><p> </p><p> </p><p><strong>设定「共享区」与「大型区」容量</strong><strong></strong></p><p>SGA 内的共享区(Shared Pool)与大型区(Large Pool)分别由<strong>SHARED_POOL_SIZE</strong>与<strong>LARGE_POOL_SIZE</strong>所设定；这两个参数都属于动态参数(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn1" name="_ftnref1"></a>[2])。如果起始参数档内未设定这两个参数，则 Oracle9i 将自动决定其适当大小。</p><p> </p><p><strong>设定</strong><strong> SGA </strong><strong>的相关注意事项</strong><strong></strong></p><p>SGA 最大容量由<strong>SGA_MAX_SIZE</strong>所控制。您可以动态地改变该参数值，但是需注意<strong>SGA_MAX_SIZE</strong>为数据库缓冲区、共享区、大型区、以及其它 SGA 组件之容量总和。各区域之大小不能超过<strong>SGA_MAX_SIZE</strong>所设定。如果<strong>SGA_MAX_SIZE</strong>未设定，则 Oracle9i 会自动设定<strong>SGA_MAX_SIZE</strong>为所有 SGA 组件大小之总和。</p><p> </p><p><strong>设定处理程序最大数量</strong><strong></strong></p><p>起始参数<strong>PROCESSESS</strong>可决定同时间连接 Oracle9i 的操作系统程序最大数量。该参数值必须大于 6；其中 5 个是 Oracle9i 背景处理程序，加上 1 个使用者处理程序。假定同一时间您的 Oracle9i 数据库同时间会有 100 使用者上线，那么<strong>PROCESSES</strong>至少应设定为 105。</p><p> </p><p><strong>设定空间回复管理方式</strong><strong></strong><strong></strong></p><p>任何数据库都应该具备某种特殊机制来确保交易的一致性与完整性。在 Oracle9i 数据库内即存有一份重要的交易相关信息，以便必要时可退回(rollback) 失败的交易，或是回复(undo)某个数据处理动作。Oracle 将这些信息统称为「回复项目」(undo entries)。Oracle9i 的回复项目存放在「回复资料表空间」(undo tablespace) 或是「退回区段」(rollback segments)。</p><p><strong></strong><strong></strong> </p><p><strong>UNDO_MANAGEMENT </strong><strong>起始参数</strong><strong></strong></p><p>针对回复项目的管理，起始参数档的<strong>UNDO_MANAGEMENT</strong>可设定由下列两种方式之一激活 Oracle9i Instance：</p><ul><li>n          AUTO：以<strong>”</strong><strong>自动回复管理模式</strong><strong>” </strong>激活 Oracle9i Instance；其回复项目将储存于「回复资料表空间」。 
</li><li>n          MANUAL：以<strong>”</strong><strong>手动模式</strong><strong>” </strong>激活 Oracle9i Instance；其回复项目将储存于「退回区段」。</li></ul><p> </p><p>为了向前兼容，<strong>UNDO_MANAGEMENT</strong>的默认值为 MANUAL。</p><p> </p><p><strong>关于</strong><strong> UNDO_TABLESPACE </strong><strong>起始参数</strong><strong></strong></p><p>当 Oracle9i Instance 以<strong>”</strong><strong>自动管理模式</strong><strong>” </strong>激活时，将尝试寻找第一个可用的「回复资料表空间」以存放「回复项目」。如果执行 CREATE DATABASE 指令，且<strong>UNDO_MANAGEMENT</strong>设定为<strong>AUTO</strong>时，Oracle9i 就会自动建立一个名为 SYS_UNDOTBS 的「回复资料表空间」。此资料表空间将是<strong>”</strong><strong>自动管理模式</strong><strong>” </strong>下预设的「回复资料表空间」。</p><p>此外，您还可以设定<strong>UNDO_TABLESPACE </strong>起始参数，以明确指定 Oracle9i 所使用的「回复资料表空间」为何。如果系统内缺乏可用的「回复资料表空间」，则 Oracle9i Instance 虽然可以激活，但是将使用 SYSTEM 退回区段。Oracle 建议您尽量妥善运用「回复资料表空间」来取代「回复区段」，因为前者不但易于管理，也可以设定「回复项目」之维护时间。</p><p> </p><p><strong>关于</strong><strong> ROLLBACK_SEGMENTS </strong><strong>起始参数</strong><strong></strong></p><p><strong>ROLLBACK_SEGMENTS</strong>起始参数内列出一连串「非系统退回区段」之相关信息。当数据库以<strong>”</strong><strong>手动模式</strong><strong>” </strong>进行回复项目管理时，Oracle9i Instance 将会在激活时要求此类型退回区段。如果该参数内无任何设定值，则使用「系统退回区段」。Oracle9i 数据库的<strong>ROLLBACK_SEGMENTS </strong>参数是为了向前兼容而保留，建议您以「回复资料表空间」取代之。</p><p> </p><p><strong>手动建立</strong><strong> Oracle9i </strong><strong>数据库</strong><strong></strong></p><p>完成所有前置准备工作之后，您就可以依照先前的规划建立 Oracle9i 数据库。有别于使用「数据库建置组态精灵」(Database Configuration Assistant)，手动建立数据库的方式主要是执行<strong>CREATE DATABASE</strong>指令。以下是建立 Oracle9i 数据库<strong>mydb</strong>的完整步骤：</p><ul><li>1.          设定 Oracle SID 
</li><li>2.          选择 DBA 验证方式 
</li><li>3.          建立起始参数档 
</li><li>4.          激活 Oracle Instance 
</li><li>5.          执行<strong>CREATE DATABASE</strong>指令 
</li><li>6.          建立其它资料表空间 
</li><li>7.          建立数据字典视观表</li></ul><p> </p><p><strong>步骤</strong><strong> 1: </strong><strong>设定</strong><strong> Oracle SID</strong><strong></strong></p><p>在一般情况下，每个 Oracle9i 数据库都必须对应一个 Oracle9i Instance。所以在建立数据库之前，您必须先指定 Oracle9i Instance 的系统标识符(system identifier)，此系统标识符就是俗称的 Oracle SID；您也可以将它视为 Oracle9i Instance 之名称。</p><p>因为 Oracle SID 可用以辨识不同的 Oracle 数据库，因此 SID 名称必须是唯一的，可经由操作系统的环境变量<strong>ORACLE_SID</strong>设定之(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn2" name="_ftnref2"></a>[3])。以下范例将设定数据库所使用的 Oracle SID 为<strong>mydb</strong>：</p><p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref1" name="_ftn1"></a>注[2]：SHARED_POOL_SIZE 与 LARGE_POOL_SIZE 在 Oracle9i 以前为静态变量。</p><p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref2" name="_ftn2"></a>注[3]：起始参数档之 DB_NAME 参数值必须与 ORACLE_SID 完全吻合。</p><p><img height="66" alt="文本框: ORACLE_SID = mydbexport ORACLE_SID    " src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image001_0090.gif" width="558" /> </p><p>步骤 2: 选择 DBA 验证方式</p><p>您必须经过数据库之验证手续，且被赋予适当系统权限后才可以建立 Oracle9i 数据库。Oracle9i 用来验证 DBA 的方式有两种，分别是「密码文件验证」与「操作系统验证」。建议您第一次手动建立数据库时先使用 oracle 帐号(安装 Oracle9i 所用的帐号) 经由「操作系统验证」来登入 SQL*Plus。有关密码文件的建立与使用方式将在未来专栏中为大家详细介绍。<strong></strong></p><p><strong></strong><strong></strong> </p><p><strong>步骤</strong><strong> 3: </strong><strong>建立起始参数档</strong><strong></strong></p><p>为了简化管理动作，建议您将起始参数档置放于 Oracle9i 预设目录下，并且依照标准格式为起始参数档命名。Oracle9i 起始参数档名之格式为：</p><p><img height="42" alt="文本框: init&lt;Oracle SID 名称&gt;.ora    " src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image002_0013.gif" width="558" /> </p><p> </p><p>其预设存放路径则为：</p><p><img height="42" alt="文本框: $ORACLE_HOME/dbs    " src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image003.gif" width="558" /> </p><p> </p><p>以<strong>mydb</strong>数据库为例，起始参数档名称可命名为 init<strong>mydb</strong>.ora，并存放在 opt/oracle/product/9.0.1/dbs 目录下(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn1" name="_ftnref1"></a>[4])。如此一来，每当您欲执行<strong>STARTUP</strong>指令激活 Oracle9i Instance 时，系统会自动到预设目录下寻找起始参数档，不需额外指定 PFILE 选项。</p><p> </p><p>以下范例起始参数文件之部分内容：<br /></p><p></p><p><strong>Sample Initialization Parameter File</strong></p><p># Cache and I/O</p><p>DB_BLOCK_SIZE=4096</p><p>DB_CACHE_SIZE=20971520</p><p># Diagnostics and Statistics</p><p>BACKGROUND_DUMP_DEST=$ORACLE_HOME/admin/mydb/bdump</p><p>CORE_DUMP_DEST=$ORACLE_HOME/admin/mydb/cdump</p><p>TIMED_STATISTICS=TRUE</p><p>USER_DUMP_DEST=$ORACLE_HOME/admin/mydb/udump</p><p># Control File Configuration</p><p>CONTROL_FILES=("$ORACLE_HOME/oradata/mydb/control01.ctl",</p><p>"$ORACLE_HOME/oradata/mydb/control02.ctl",</p><p>"$ORACLE_HOME/oradata/mydb/control03.ctl")</p><p># Archive</p><p>LOG_ARCHIVE_DEST_1='LOCATION=$ORACLE_HOME/oradata/mydb/archive'</p><p>LOG_ARCHIVE_FORMAT=%t_%s.dbf</p><p>LOG_ARCHIVE_START=TRUE</p><p># Miscellaneous</p><p>COMPATIBLE=9.0.0</p><p>DB_NAME=ora901</p><p># Distributed, Replication and Snapshot</p><p>DB_DOMAIN=uuu.com.tw</p><p>REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE</p><p># Network Registration</p><p>INSTANCE_NAME=ora901</p><p># Pools</p><p>JAVA_POOL_SIZE=31457280</p><p>LARGE_POOL_SIZE=1048576</p><p>SHARED_POOL_SIZE=52428800</p><p># Processes and Sessions</p><p>PROCESSES=150</p><p># Redo Log and Recovery</p><p>FAST_START_MTTR_TARGET=300</p><p># Resource Manager</p><p>RESOURCE_MANAGER_PLAN=SYSTEM_PLAN</p><p># Sort, Hash Joins, Bitmap Indexes</p><p>SORT_AREA_SIZE=524288</p><p> </p><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td></td></tr></tbody></table><br /><p><strong>步骤</strong><strong> 4: </strong><strong>激活</strong><strong> Oracle Instance</strong><strong></strong></p><p>在 Oracle9i 数据库中，较常用来激活 Oracle9i Instance 的方式是使用 SQL*Plus 与 Oracle9i Enterprise Manager。以前者为例，您必须先进入 SQL*Plus 环境，然后切换为 sysdba 身份，方式为：</p><p><img height="67" alt="文本框: $ SQLPLUS  /nologCONNECT  /  AS sysdba     " src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image004_0003.gif" width="547" /> </p><p> </p><p> </p><p> </p><p>接下来您必须执行<strong>STARTUP</strong>指令将Oracle9i Instance 开启至<strong>NOMOUNT</strong>状态。一般来说，只有在建立新数据库，或是进行特定数据库维护工作时才会将 Instance 开启至<strong>NOMOUNT</strong>状态。因为将 Instance 开启至<strong>MOUNT</strong>状态时就会尝试挂载 Oracle9i 实体数据库。试想，若系统本身尚未建立数据库实体档案，怎么可能 Instance 开启至<strong>MOUNT</strong>或是<strong>OPEN</strong>状态呢？以下是<strong>STARTUP</strong>指令的执行方式：</p><p><img height="43" alt="文本框: STARTUP NOMOUNT     " src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image005_0000.gif" width="547" /> </p><p> </p><p> </p><p>此为<strong>STARTUP</strong>指令最基本的执行方式。因为我们将起始参数文件置于预设目录($ORACLE_HOME/dbs)下，所以不需指定 PFILE 选项。否则，您所执行的 STARTUP 指令应该类似于：</p><p><img height="43" alt="文本框: STARTUP NOMOUNT pfile = $ORACLE_HOME/pfile/initmydb.ora     " src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image006_0001.gif" width="547" /> </p><p> </p><p> </p><p>截至目前为止，我们才算是完成执行 CREATE DATABASE 指令前的所有准备工作—在内存内已顺利配置 SGA，并激活各种背景处理程序。但此时系统本身尚未存在任何实体数据库。接下来是最重要的步骤—执行<strong>CREATE DATABASE</strong>指令。</p><p> </p><p><strong>步骤</strong><strong> 5: </strong><strong>执行</strong><strong> CREATE DATABASE </strong><strong>指令</strong><strong></strong></p><p>当您执行<strong>CREATE DATABASE</strong>指令建立新数据库时，Oracle9i 会完成下列各项主要工作：</p><ul><li>n          建立新数据库的实体档案，如资料文件、重置日志文件。 
</li><li>n          更新控制文件内相关信息。 
</li><li>n          建立 SYSTEM 资料表空间与 SYSTEM 退回区段(rollback segment)。 
</li><li>n          建立数据字典 
</li><li>n          设定数据库使用的字符集 
</li><li>n          设定数据库所在时区</li></ul><p> </p><p>以下是 CREATE DATABASE 指令之范例：</p><p> </p><p><img height="378" alt="文本框: CREATE DATABASE mydbMAXINSTANCES 1MAXLOGHISTORY 1MAXLOGFILES 5MAXLOGMEMBERS 5MAXDATAFILES 100DATAFILE '$ORACLE_HOME/oradata/mydb/system01.dbf' SIZE 200M REUSEUNDO TABLESPACE undotbs DATAFILE '$ORACLE_HOME/oradata/mydb/undotbs01.dbf'SIZE 200M REUSE AUTOEXTEND ON NEXT 2048K MAXSIZE UNLIMITEDDEFAULT TEMPORARY TABLESPACE temptbs1CHARACTER SET ZHT16BIG5NATIONAL CHARACTER SET AL16UTF16LOGFILE 	GROUP 1 ('$ORACLE_HOME/oradata/mydb/redo01.log') SIZE 100M,GROUP 2 ('$ORACLE_HOME/oradata/mydb/redo02.log') SIZE 100M,GROUP 3 ('$ORACLE_HOME/oradata/ora901/redo03.log') SIZE 100M;    " src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image007_0001.gif" width="570" /> </p><p>我将以上<strong>CREATE DATABASE</strong>指令较重要的部分整理如下：</p><ul><li>n          数据库名称为<strong>mydb</strong>，其<strong>全域数据库名称</strong>(global database name)为<strong>mydb</strong>.uuu.com.tw。 
</li><li>n          依照起始参数档<strong>CONTROL_FILES</strong>参数所设定的名称与路径分别建立三个控制档。 
</li><li>n          <strong>MAXINSTANCES</strong>参数：可用来开启该数据库的 Instance 数目。 
</li><li>n          <strong>MAXDATAFILES</strong>参数：该数据库所拥有的最大数据文件数量。 
</li><li>n          如 DATAFILE 子句所设定，该数据库 SYSTEM 资料表空间所相对应的操作系统档案为$ORACLE_HOME/oradata/mydb/system01.dbf。假如该档案已事先存在，则予以覆写。 
</li><li>n          <strong>UNDO_TABLESPACE</strong>用以建立与命名「回复资料表空间」(undo tablespace)。 
</li><li>n          <strong>DEFAULT_TEMPORARY_TABLESPACE</strong>用以建立与命名该数据库预设的「暂时资料表空间」。 
</li><li>n          ZHT16BIG5 为数据库内存放资料的字符集。 
</li><li>n          AL16UTF16 为「国际字符集」(NATIONAL CHARACTER SET) 设定值，为 NCHAR、NCLOB、与 NVARCHAR2 等 unicode 字段所使用的字符集。AL16UTF16 为 SQL NCHAR 资料型态预设的字符集，其编码方式为 UTF-16。 
</li><li>n          新数据库拥有三个线上重置日志文件(online redo log files)，分别设定在 LOGFILE 子句中。MAXLOGHISTORY、MAXLOGFILES、与 MAXLOGMEMBERS 为重置日志文件的相关设定。 
</li><li>n          因为 CREATE DATABASE 指令内并未包含 ARCHIVELOG 子句，所以该数据库并不会进行重置日志文件的封存动作。您可以在数据库建立后执行 ALTER DATABASE 指令将数据库切换为「封存模式」(ARCHIVELOG mode)。起始参数文件内与「封存模式」相关的参数为 LOG_ARCHIVE_DEST_1、LOG_ARCHIVE_FORMAT、与LOG_ARCHIVE_START。 
</li><li>n          在 CREATE DATABASE 指令内也可加上 SET TIME_ZONE 子句以设定数据库时区(time zone)。如果省略该子句，则数据库预设时区(time zone)与操作系统时区相同。</li></ul><p><strong></strong><strong></strong> </p><p><strong>步骤</strong><strong> 6: </strong><strong>建立其它资料表空间</strong><strong></strong></p><p>上期专栏内容中我们曾经探讨过 Oracle9i 的资料表空间规划方式。以步骤 5 的 CREATE DATABASE 指令而言，新数据库内将只有一个 SYSTEM 资料表空间。为了更有效地使用及管理 Oracle9i 数据库，建议您另外新增数个资料表空间，依照应用系统实际需求而定。以下指令分别建立<strong>users</strong>与<strong>indx </strong>数据表空间。</p><p> </p><p><img height="246" alt="文本框: CREATE TABLESPACE users LOGGINGDATAFILE '$ORACLE_HOME/oradata/mydb/users01.dbf 'SIZE 25M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITEDEXTENT MANAGEMENT LOCAL; CREATE TABLESPACE indx LOGGINGDATAFILE '$ORACLE_HOME/oradata/mydb/indx01.dbf 'SIZE 25M REUSE AUTOEXTEND ON NEXT 1280K MAXSIZE UNLIMITEDEXTENT MANAGEMENT LOCAL;      " src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image008_0001.gif" width="558" /> </p><p><strong>步骤</strong><strong> 7: </strong><strong>建立数据字典视观表</strong><strong></strong></p><p>除了建立额外的资料表空间外，您还必须在数据库建立之后执行两个重要的指令文件：catelog.sql 与 cataproc.sql。这两个指令文件将在 Oracle9i 数据库内建立管理工作必备的视观表、同义字(synonyms)、以及 PL/SQL 套件(packages)。</p><ul><li>n          catalog.sql：</li></ul><p>本指令文件内容为：在数据字典数据表上建立相关视观表、动态效能视观表、以及存取各种视观表所用的同义字。此外，catalog.sql 也会将这些视观表的使用权限授权给数据库使用者。</p><ul><li>n          cataproc.sql：</li></ul><p>本指令文件内包含执行 PL/SQL 程序所需的所有指令文件。</p><p> </p><p><strong>移除</strong><strong> Oracle9i </strong><strong>数据库的方式</strong><strong></strong></p><p>移除 Oracle9i 数据库的方式有两种。传统方式是手动删除所有数据库实体档案；较简便的方式是使用「数据库组态辅助精灵」。</p><p>如果您想手动移除先前建立的 Oracle9i 数据库，步骤可能会稍微繁琐一点。因为所有数据库相关档案(包含资料文件、重置日志文件、控制文件、起始参数文件、重置日志封存盘...等)都必须自操作系统删除。如果您不清楚这些档案的存放位置，可查询 V$DATAFILE、V$LOGFILE、与 V$CONTROLFILE 等数据字典视观表。如果您欲移除的数据库是设定在「封存模式」，那么建议您先检视起始参数档内 LOG_ARCHIVE_DEST_ n、LOG_ARCHIVE_DEST、与LOG_ARCHIVE_DUPLEX_DEST 等参数，以便从操作系统删除旧有重置日志封存盘。</p><p> </p><p><strong>结语</strong></p><p>本期谈到如何以手动方式建置 Oracle9i 数据库，以及 CREATE DATABASE 指令的主要项目。希望各位读者对于 Oracle9i 数据库的建置过程都能有一定程度的了解。未来有机会我将为大家示范如何经由「数据库组态辅助精灵」来建置 Oracle9i 数据库。届时您将发现，原来建置 Oracle9i 数据库竟然如此简单！</p><p> </p><p><strong>作者简介</strong><strong></strong></p><p>何致億，专长为Oracle、SQL Server 等大型数据库系统管理，资料仓储规划建置，以及数据库应用程序系统开发。拥有 MCSD、MCDBA，Oracle OCP，RHCE，SCJP，Borland JBuilder Product Certified等十余项国际认证。目前正致力于Oracle9i应用系统开发，并负责Oracle9i系列书籍中文化与Oracle Press技术校稿工作。他同时也是美商 Oracle 與 Sun Microsystems公司原厂认证讲师。您可以透过hochihyi@ms64.hinet.net与他联系。</p><p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref1" name="_ftn1"></a>注[4]：以我的 Oracle9i 数据库为例：ORACLE_BASE = /opt/oracle，而ORACLE_HOME = $ORACLE_BASE/product/9.0.1，所以起始参数文件之预设目录应为opt/oracle/product/9.0.1/dbs。</p></b>
				</span>
		</div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-20 15:22 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE 常用脚本</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20852.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 07:18:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20852.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20852.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20852.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20852.html</trackback:ping><description><![CDATA[
		<div class="style7" align="center">
				<span style="FONT-SIZE: 12pt">
						<b>ORACLE 常用脚本（1）<br /><table cellspacing="0" cellpadding="0" width="558" border="0"><tbody><tr><td valign="top" align="right" width="2%" height="10"><div align="left"></div></td><td valign="top" align="right" width="98%" bgcolor="#ffffff"><div class="daxiao14" align="left"><p>1、查看表空间的名称及大小</p><p>    select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size<br />    from dba_tablespaces t, dba_data_files d<br />    where t.tablespace_name = d.tablespace_name<br />    group by t.tablespace_name;</p><p>2、查看表空间物理文件的名称及大小</p><p>  select tablespace_name, file_id, file_name,<br />  round(bytes/(1024*1024),0) total_space<br />  from dba_data_files<br />  order by tablespace_name;</p><p>3、查看回滚段名称及大小</p><p>  select segment_name, tablespace_name, r.status,<br />  (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,<br />  max_extents, v.curext CurExtent<br />  From dba_rollback_segs r, v$rollstat v<br />  Where r.segment_id = v.usn(+)<br />  order by segment_name ;</p><p>4、查看控制文件</p><p>  select name from v$controlfile;</p><p>5、查看日志文件</p><p>  select member from v$logfile;</p><p>6、查看表空间的使用情况</p><p>  select sum(bytes)/(1024*1024) as free_space,tablespace_name<br />  from dba_free_space<br />  group by tablespace_name;</p><p>  SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,<br />  (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"<br />  FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C<br />  WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;</p><p>7、查看数据库库对象</p><p>  select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;</p><p>8、查看数据库的版本　</p><p>  Select version FROM Product_component_version<br />  Where SUBSTR(PRODUCT,1,6)='Oracle';</p><p>9、查看数据库的创建日期和归档方式</p><p>  Select Created, Log_Mode, Log_Mode From V$Database;</p><p>10、查看当前所有对象 </p><p>SQL&gt; select * from tab;</p><p>11、建一个和a表结构一样的空表 </p><p>SQL&gt; create table b as select * from a where 1=2; </p><p>SQL&gt; create table b(b1,b2,b3) as select a1,a2,a3 from a where 1=2;</p><p>12、察看数据库的大小，和空间使用情况 </p><p>SQL&gt; col tablespace format a20<br />SQL&gt; select b.file_id　　文件ID,<br />　　b.tablespace_name　　表空间,<br />　　b.file_name　　　　　物理文件名,<br />　　b.bytes　　　　　　　总字节数,<br />　　(b.bytes-sum(nvl(a.bytes,0)))　　　已使用,<br />　　sum(nvl(a.bytes,0))　　　　　　　　剩余,<br />　　sum(nvl(a.bytes,0))/(b.bytes)*100　剩余百分比<br />　　from dba_free_space a,dba_data_files b<br />　　where a.file_id=b.file_id<br />　　group by b.tablespace_name,b.file_name,b.file_id,b.bytes<br />　　order by b.tablespace_name<br />　　/<br />　　dba_free_space --表空间剩余空间状况<br />　　dba_data_files --数据文件空间占用情况</p><p>13、查看现有回滚段及其状态 </p><p>SQL&gt; col segment format a30<br />SQL&gt; SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS;</p><p>14、查看数据文件放置的路径 </p><p>SQL&gt; col file_name format a50<br />SQL&gt; select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;</p><p>15、显示当前连接用户 </p><p>SQL&gt; show user</p><p>16、把SQL*Plus当计算器 </p><p>SQL&gt; select 100*20 from dual;</p><p>17、连接字符串 </p><p>SQL&gt; select 列1||列2 from 表1;<br />SQL&gt; select concat(列1,列2) from 表1;</p><p>18、查询当前日期 </p><p>SQL&gt; select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;</p><p>19、用户间复制数据 </p><p>SQL&gt; copy from user1 to user2 create table2 using select * from table1;</p><p>20、视图中不能使用order by，但可用group by代替来达到排序目的 </p><p>SQL&gt; create view a as select b1,b2 from b group by b1,b2;</p><p>21、通过授权的方式来创建用户 </p><p>SQL&gt; grant connect,resource to test identified by test; </p><p>SQL&gt; conn test/test</p></div></td></tr></tbody></table><br /><div class="style7" align="center"><span style="FONT-SIZE: 12pt"><b>ORACLE 常用脚本（2）<br /><div class="daxiao14" align="left"><p>一、ORACLE的表的分类：<br />1、REGULAR TABLE：普通表，ORACLE推荐的表，使用很方便，人为控制少。<br />2、PARTITIONED TABLE：分区表，人为控制记录的分布，将表的存储空间分为若干独立的分区，记录按一定的规则存储在分区里。适用于大型的表。</p><p>二、建表<br />1 CREATE TABLE 表名 （EMPNO NUMBER（2），NAME VARCHAR2（20）） PCTFREE 20 PCTUSED 50 <br />STORAGE （INITIAL 200K NEXT 200K MAXEXTENTS 200 PCTINCREASE 0） TABLESPACE 表空间名称 <br />[LOGGING|NOLOGGING]所有的对表的操作都要记入REDOLOG，ORACLE建议使用NOLOGGING；<br />[CACHE|NOCACHE]：是否将数据按照一定的算法写入内存。<br />2、关于PCTFREE 和PCTUSED<br />A、行迁移和行链接<br />B、PCTFREE：制止INSERT，为   UPDATE留FREE 空间<br />C、PCTUSED：为恢复INSERT操作，而设定的。</p><p>三、拷贝一个已经存在的表：<br />CREATE TABLE 新表名 STORAGE（。。） TABLESPACE 表空间<br />AS SELECT * FROM 老表名 ；<br />当老表存在约束，触发的时候，不会拷过去。</p><p>四、修改表的参数<br />ALTER TABLE 名称 PCTFREE 20 PCTUSED 50 STOAGE（MAXEXTENTS 1000）；</p><p>五、手工分配空间：</p><p>ALTER TABLE 名称 ALLOCATE EXTENT（SIZE 500K DATAFILE '。。'）；</p><p>1、SIZE选项，按照NEXT分配<br />2、表所在表空间与所分配的数据文件所在的表空间必须一样。</p><p>六、水线<br />1、水线定义了表的数据在一个BLOCK中所达到的最高的位置。<br />2、当有新的记录插入，水线增高<br />3、当删除记录时，水线不回落<br />4、减少查询量</p><p>七、如何回收空间：<br />ALTER TABLE 名称 DEALLOCATE UNUSED [KEEP 4[M|K]]<br />1、当空间分配过大时，可以使用本命令<br />2、如果没有加KEEP，回收到水线<br />3、如果水线《MINEXTENTS的大小回收到MINEXTENTS所指定的大小</p><p>八、TRUNCATE 一个表<br />TRUNCATE TABLE 表名，表空间截取MINEXTENT，同时水线重置。</p><p>九、DROP 一个表<br />DROP TABLE 表名 [CASCADE CONSTRAINTS]<br />当一个表含有外键的时候，是不可以直接DROP的，加CASCADE CONSRIANTS将外键等约束一并删掉。</p><p>十、信息获取<br />1、dba_object<br />2 dba_tables:建表的参数<br />3 DBA_SEGMENTS:<br />组合查询的连接字段：DBA_TABLES的table_name+dba_ojbect的object_name+dba_segments的SEGMENT_NAME<br /><br /></p><div class="style7" align="center"><span style="FONT-SIZE: 12pt"><b>ORACLE 常用脚本（3）<br /><div class="daxiao14" align="left"><p>用户的管理<br />一、ORACLE的安全域<br />1、TABLESPACE QUOTAS：表空间的使用定额<br />2、DEFAULT TABLESPACE：默认表空间<br />3、TEMPORARY TABLESPACE：指定临时表空间。<br />4、ACCOUNT LOCKING：用户锁<br />5、RESOURCE LIMITE：资源限制<br />6、DIRECT PRIVILEGES：直接授权<br />7、ROLE PRIVILEGES：角色授权先将应用中的用户划为不同的角色，<br />二、创建用户时的清单：<br />1、选择一个用户名称和检验机制：A，看到用户名，实际操作者是谁，业务中角色。<br />2、选择合适的表空间：<br />3、决定定额：<br />4、口令的选择：<br />5、临时表空间的选择：先建立一个临时表空间，然后在分配。不分配，使用SYSTEM表空间<br />6、CREATE USER<br />7、授权：A，用户的工作职能<br />      B，用户的级别<br />三、用户的创建：<br />1、命令：<br />CREATE USER 名称 IDENTIFIED BY 口令 DEFAULT TABLESPACE 默认表空间名 TEMPOARAY <br />TABLESPACE 临时表空间名<br />QUOTA 15M ON 表空间名<br />[PASSWORD EXPIRE]：当用户第一次登陆到ORACLE，创建时所指定的口令过期失效，强迫用户自己定义一个新口令。<br />[ACCOUNT LOCK]：加用户锁<br />QUOTA UNLIMITED ON TABLESPACE：不限制，有多少有多少。<br />[PROFILE 名称]：受PROFILE文件的限制。</p><p>四、如何控制用户口令和用户锁<br />1、强迫用户修改口令：ALTER USER 名称 IDENTIFIED BY 新口令 PASSWORD EXPIRE；<br />2、给用户加锁：ALTER USER 名称 ACCOUNT [LOCK|UNLOCK]<br />3、注意事项：<br />A、所有操作对当前连接无效<br />B、1的操作适用于当用户忘记口令时。</p><p>五、更改定额<br />1、命令：ALTER USER 名称 QUOTA 0 ON 表空间名 <br />ALTER USER 名字 QUOTA （数值）K|M|UNLIMITED ON 表空间名；<br />2、使用方法：<br />A、控制用户数据增长<br />B、当用户拥有一定的数据，而管理员不想让他在增加新的数据的时候。<br />C、当将用户定额设为零的时候，用户不能创建新的数据，但原有数据仍可访问。</p><p>六、DROP一个USER<br />1、DROP USER 名称<br />  适合于删除一个新的用户<br />2、DROP USER 名称 CASCADE： 删除一个用户，将用户的表，索引等都删除。<br />3、对连接中的用户不好用。</p><p><br />七、信息获取：<br />1、DBA_USERS:用户名，状态，加锁日期，默认表空间，临时表空间<br />2、DBA_TS_QUOTAS:用户名，表空间名，定额。<br />两个表的连接字段：USERNAME<br />GRANT CREATE SESSION TO 用户名</p><p>PROFILE的管理（资源<br />      文件）<br />一、PROFILE的管理内容：<br />1、CPU的时间<br />2、I/O的使用<br />3、IDLE TIME（空闲时间）<br />4、CONNECT TIME（连接时间）<br />5、并发会话数量<br />6、口令机制：</p><p>二、DEFAULT PROFILE：<br />1、所有的用户创建时都会被指定这个PROFILE<br />2、DEFAULT PROFILE的内容为空，无限制</p><p>三、PROFILE的划分：<br />1、CALL级LIMITE：<br />  对象是语句：<br />  当该语句资源使用溢出时：<br />  A、该语句终止<br />  B、事物回退<br />  C、SESSION连接保持<br />2、SESSION级LIMITE：<br />  对象是：整个会话过程<br />  溢出时：连接终止</p><p>四、如何管理一个PROFILE<br />1、CREATE PROFILE<br />2、分配给一个用户<br />3、象开关一样打开限制。</p><p>五、如何创建一个PROFILE：<br />1、命令：CREATE PROFILE 名称 <br />  LIMIT <br />  SESSION_PER_USER 2<br />  CPU_PER_SESSION 1000<br />  IDLE_TIME 60<br />  CONNECT_TIME 480<br />六、限制参数：<br />1、SESSION级LIMITE：<br />  CPU_PER_SESSION:定义了每个SESSION占用的CPU的时间：   （1/100 秒）<br />2、SESSION_PER_USER:每个用户的并发连接数 <br />3、CONNECT_TIME:一个连接的最长连接时间（分钟）<br />4、LOGICAL_READS_PER_SESSION: 一次读写的逻辑块的数量<br />5、CALL级LIMITE<br />  CPU_PER_CALL:每个语句占用的CPU时间<br />  <br />  LOGICAL_READS_PER_CALL:</p><p>七、分配给一个用户：<br />CREATE USER 名称。。。。。。<br />PROFILE 名称<br />ALTER USER 名称 PROFILE 名称</p><p>八、打开资源限制：<br />1、RESOURCE_LIMT:资源文件中含有<br />2、ALTER SYSTEM SET RESOURCE_LIMIT=TRUE；<br />3、默认不打开</p><p>九、修改PROFIE的内容：<br />1、ALTER PROFILE 名称参数   新值<br />2、对于当前连接修改不生效。</p><p>DROP一个PROFILE<br />1、DROP PROFILE 名称<br />  删除一个新的尚未分配给用户的PROFILE，<br />2、DROP PROFILE 名称 CASCADE<br />3、注意事项<br />  A、一旦PROFILE被删除，用户被自动加载DEFAULT PROFILE<br />  B、对于当前连接无影响<br />  C、DEFAULT PROFILE不可以被删除</p><p>信息获取：<br />1、DBA_USERS:<br />  用户名，PROFILE <br />2、DBA_PROFILES:<br />  PROFILE及各种限制参数的值<br />每个用户的限制：PROFILE（关键字段）</p><p>PROFILE的口令机制限制<br />1、限制内容<br />A、限制连续多少次登录失败，用户被加锁<br />B、限制口令的生命周期<br />C、限制口令的使用间隔<br />2、限制生效的前提：<br />A、RESOURCE_LIMIT:=TRUE<br />B ORACLE\RDBMS\ADMIN\UTLPWDMG.SQL<br />3、如何创建口令机制：<br />CREATE PROFILE 名称<br />SESSIONS_PER_USER </p><p>.....<br />password_life_time 30<br />failed_log_attempts 3<br />password_reuse_time 3<br />4、参数的含义：<br />A FAILED_LOGIN_ATTEMPTS:<br />  当连续登陆失败次数达到该参数指定值时，用户加锁<br />B PASSWORD_LOCK_TIME:加锁天数<br />C PASSWORD_LIFE_TIME:口令的有效期（天）<br />D PASSWORD_GRACE_TIME:口令修改的间隔期（天）<br />E PASSWORD_REUSE_TIME:口令被修改后原有口令隔多少天被重新使用。<br />F PASSWORD_REUSE_MAX:口令被修改后原有口令被修改多少次被重新使用。<br /><br /></p><div class="style7" align="center"><span style="FONT-SIZE: 12pt"><b>ORACLE 常用脚本（4）<br /><div class="daxiao14" align="left"><p>rem  这需要 统计某个具体用户的"Table,index,column,constraits"<br />rem================================================================<br />rem   全部表-列定义 table_cols.txt<br /> set lin 110 pages 3000<br /> column table_name format a30<br /> column data_type  format a12<br /> column data_default  format a8<br /> column column_name format a22<br /> column Cid format  999<br /> column Len format  9999<br /> column Prec format  99<br /> column Scale format  99</p><p>select  TABLE_NAME, COLUMN_ID "Cid", COLUMN_NAME, DATA_TYPE, DATA_LENGTH "Len",<br /> nvl(DATA_PRECISION,'-1') "Prec", nvl(DATA_SCALE,'-1') "Scale",<br /> NULLABLE,  DATA_DEFAULT<br />from   USER_TAB_COLUMNS ;</p><p>rem ======== TAB =============<br />select * from tab;<br />spool off</p><p>spool user_indexes.txt<br />rem================================================================<br />rem   全部索引定义user_index.txt<br /> column table_name format a22<br /> column index_name format a28<br /> column index_type format a7<br /> column column_name format a18<br /> column # format  99<br /> column Init format  999999;<br />select  a.table_name, t.cache "C",a.index_name,<br /> column_position "#",column_name,<br /> UNIQUENESS,a.INITIAL_EXTENT/1024 "Init"<br /> from user_indexes a, user_ind_columns c,user_tables t<br /> where  c.INDEX_NAME =a.INDEX_NAME  <br /> and a.table_name= t.table_name<br /> order by  a.table_name,a.index_name,column_position;<br />spool off </p><p>spool user_Obj_Table_Index.txt<br />rem================================================================<br />rem  用户对象，表和索引userObj_Table_Index.txt<br /> set lin 111 pages 333<br /> column table_name format a24<br /> column index_name format a32<br /> column tablespace_name a12<br /> column Init format  999999;<br />rem 由于用户要关心的是我自己的详细数据的存放位置，下面分别得出index,tables<br /> select tablespace_name,table_name,cache,initial_extent/1024 "Init"<br />    from user_tables  order by tablespace_name,table_name;<br /> select tablespace_name,table_name,index_name,initial_extent/1024 "Init"<br />   from user_indexes  order by tablespace_name,table_name,index_name;<br />spool off</p><p>spool user_constraints.txt<br />rem================================================================<br />rem   全部表-列约束_user_constraints.txt<br /> column CONSTRAINT_NAME format a30<br /> column TABLE_NAME format a30<br /> column r_CONSTRAINT_NAME format a20</p><p>select CONSTRAINT_NAME,<br /> CONSTRAINT_TYPE,  TABLE_NAME, R_CONSTRAINT_NAME, DELETE_RULE  <br /> from user_constraints<br /> order by  CONSTRAINT_TYPE,TABLE_NAME;<br />spool off</p><p>spool c:\user_index1rebld.sql<br />rem================================================================<br />rem   重建全部索引<br />rem select 'alter index '||index_name||' rebuild;' from user_indexes<br />rem    where table_name = 'GWNEWS';<br />select 'alter index '||INDEX_NAME||' rebuild tablespace indexes;' from user_indexes;<br />spool off<br />rem @index1rebld.sql</p><p>spool c:\user_sources.sql<br />rem================================================================<br />rem   全部代码，主要是procedure<br /> column name format a22 ;<br /> column text format a77;<br /> break on name;<br />select text,name from user_source;<br />spool off</p><p>rem       =============== End of File ==================<br />*************查看当前用户使用的操作**************************** </p><p>SELECT a.machine,a.terminal,a.osuser, a.username, b.sql_text<br />from v$session a, v$sqlarea b<br />where a.sql_address =b.address order by b.address </p><p>***************************************************</p><p>1. 监控事例的等待 </p><p>select event,sum(decode(wait_Time,0,0,1)) "Prev", <br />sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot" <br />from v$session_Wait <br />group by event order by 4; </p><p>2. 回滚段的争用情况 </p><p>select name, waits, gets, waits/gets "Ratio" <br />from v$rollstat a, v$rollname b <br />where a.usn = b.usn; </p><p>3. 监控表空间的 I/O 比例 </p><p>select df.tablespace_name name,df.file_name "file",f.phyrds pyr, <br />f.phyblkrd pbr,f.phywrts pyw, f.phyblkwrt pbw <br />from v$filestat f, dba_data_files df <br />where f.file# = df.file_id <br />order by df.tablespace_name; </p><p>4. 监控文件系统的 I/O 比例 </p><p>select substr(a.file#,1,2) "#", substr(a.name,1,30) "Name", <br />a.status, a.bytes, b.phyrds, b.phywrts <br />from v$datafile a, v$filestat b <br />where a.file# = b.file#; </p><p>5.在某个用户下找所有的索引 </p><p>select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name <br />from user_ind_columns, user_indexes <br />where user_ind_columns.index_name = user_indexes.index_name <br />and user_ind_columns.table_name = user_indexes.table_name <br />order by user_indexes.table_type, user_indexes.table_name, <br />user_indexes.index_name, column_position; </p><p>6. 监控 SGA 的命中率 </p><p>select a.value + b.value "logical_reads", c.value "phys_reads", <br />round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO" <br />from v$sysstat a, v$sysstat b, v$sysstat c <br />where a.statistic# = 38 and b.statistic# = 39 <br />and c.statistic# = 40; </p><p>7. 监控 SGA 中字典缓冲区的命中率 </p><p>select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio", <br />(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio" <br />from v$rowcache <br />where gets+getmisses &lt;&gt;0 <br />group by parameter, gets, getmisses; </p><p>8. 监控 SGA 中共享缓存区的命中率，应该小于1% </p><p>select sum(pins) "Total Pins", sum(reloads) "Total Reloads", <br />sum(reloads)/sum(pins) *100 libcache <br />from v$librarycache; </p><p>select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent" <br />from v$librarycache;</p><p>9.显示所有数据库对象的类别和大小 </p><p>select count(name) num_instances ,type ,sum(source_size) source_size , <br />sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size, <br />sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required <br />from dba_object_size <br />group by type order by 2;</p><p>10.监控 SGA 中重做日志缓存区的命中率，应该小于1% </p><p>SELECT name, gets, misses, immediate_gets, immediate_misses, <br />Decode(gets,0,0,misses/gets*100) ratio1, <br />Decode(immediate_gets+immediate_misses,0,0, <br />immediate_misses/(immediate_gets+immediate_misses)*100) ratio2 <br />FROM v$latch WHERE name IN ('redo allocation', 'redo copy');</p><p>11.监控内存和硬盘的排序比率，最好使它小于 .10，增加 sort_area_size </p><p>SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');</p><p>12.监控当前数据库谁在运行什么SQL语句 </p><p>SELECT osuser, username, sql_text from v$session a, v$sqltext b <br />where a.sql_address =b.address order by address, piece;</p><p>13.监控字典缓冲区 </p><p>SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE; <br />SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE; <br />SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE; </p><p>后者除以前者,此比率小于1%,接近0%为好。 </p><p>SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES" <br />FROM V$ROWCACHE</p><p>14.找ORACLE字符集 </p><p>select * from sys.props$ where name='NLS_CHARACTERSET'; </p><p>15. 监控 MTS </p><p>select busy/(busy+idle) "shared servers busy" from v$dispatcher; </p><p>此值大于0.5时，参数需加大 </p><p>select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher'; <br />select count(*) from v$dispatcher; <br />select servers_highwater from v$mts; </p><p>servers_highwater接近mts_max_servers时，参数需加大 </p><p>16. 碎片程度 </p><p>select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name <br />having count(tablespace_name)&gt;10; </p><p>alter tablespace name coalesce; <br />alter table name deallocate unused; </p><p>create or replace view ts_blocks_v as <br />select tablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space <br />union all <br />select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents; </p><p>select * from ts_blocks_v; </p><p>select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space <br />group by tablespace_name;</p><p>查看碎片程度高的表 </p><p>SELECT segment_name table_name , COUNT(*) extents <br />FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name <br />HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name); </p><p>17. 表、索引的存储情况检查 </p><p>select segment_name,sum(bytes),count(*) ext_quan from dba_extents where <br />tablespace_name='&amp;tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name; </p><p>select segment_name,count(*) from dba_extents where segment_type='INDEX' and owner='&amp;owner' <br />group by segment_name; </p><p>18、找使用CPU多的用户session </p><p>12是cpu used by this session </p><p>select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value <br />from v$session a,v$process b,v$sesstat c <br />where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;</p><p>19、查看Lock <br />SELECT sn.username, m.sid, m.type, <br />DECODE(m.lmode, 0, 'None', <br />1, 'Null', <br />2, 'Row Share', <br />3, 'Row Excl.', <br />4, 'Share', <br />5, 'S/Row Excl.', <br />6, 'Exclusive', <br />lmode, ltrim(to_char(lmode,'990'))) lmode, <br />DECODE(m.request,0, 'None', <br />1, 'Null', <br />2, 'Row Share', <br />3, 'Row Excl.', <br />4, 'Share', <br />5, 'S/Row Excl.', <br />6, 'Exclusive', <br />request, ltrim(to_char(m.request, <br />'990'))) request, <br />m.id1, m.id2 <br />FROM v$session sn, v$lock m <br />WHERE (sn.sid = m.sid AND m.request != 0) <br />OR (sn.sid = m.sid <br />AND m.request = 0 AND lmode != 4 <br />AND (id1, id2) IN (SELECT s.id1, s.id2 <br />FROM v$lock s <br />WHERE request != 0 <br />AND s.id1 = m.id1 <br />AND s.id2 = m.id2) <br />) <br />ORDER BY id1, id2, m.request; </p><p><br />select l.sid,s.serial#,s.username,s.terminal, <br />decode(l.type,'RW','RW - Row Wait Enqueue', <br />'TM','TM - DML Enqueue', <br />'TX','TX - Trans Enqueue', <br />'UL','UL - User',l.type||'System') res, <br />substr(t.name,1,10) tab,u.name owner, <br />l.id1,l.id2, <br />decode(l.lmode,1,'No Lock', <br />2,'Row Share', <br />3,'Row Exclusive', <br />4,'Share', <br />5,'Shr Row Excl', <br />6,'Exclusive',null) lmode, <br />decode(l.request,1,'No Lock', <br />2,'Row Share', <br />3,'Row Excl', <br />4,'Share', <br />5,'Shr Row Excl', <br />6,'Exclusive',null) request <br />from v$lock l, v$session s, <br />sys.user$ u,sys.obj$ t <br />where l.sid = s.sid <br />and s.type != 'BACKGROUND' <br />and t.obj# = l.id1 <br />and u.user# = t.owner#<br />--第二条语句比较有效。</p><p>20、显示表空间的使用情况： </p><p>col tsname format a16 justify c heading 'Tablespace' <br />col nfrags format 999,990 justify c heading 'Free|Frags' <br />col mxfrag format 999,999,990 justify c heading 'Largest|Frag (KB)' <br />col totsiz format 999,999,990 justify c heading 'Total|(KB)' <br />col avasiz format 999,999,990 justify c heading 'Available|(KB)' <br />col pctusd format 990 justify c heading 'Pct|Used' <br />select <br />total.tablespace_name tsname, <br />count(free.bytes) nfrags, <br />nvl(max(free.bytes)/1024,0) mxfrag, <br />total.bytes/1024 totsiz, <br />nvl(sum(free.bytes)/1024,0) avasiz, <br />(1-nvl(sum(free.bytes),0)/total.bytes)*100 pctusd <br />from <br />dba_data_files total, <br />dba_free_space free <br />where <br />total.tablespace_name = free.tablespace_name(+) <br />group by <br />total.tablespace_name, <br />total.bytes;</p></div></b></span></div></div></b></span></div></div></b></span></div></b>
				</span>
		</div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-20 15:18 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle9i 数据库实体结构</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20850.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 07:11:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20850.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20850.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20850.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20850.html</trackback:ping><description><![CDATA[
		<div class="style7" align="center">
				<span style="FONT-SIZE: 12pt">
						<b>Oracle9i 数据库实体结构<br /><div class="daxiao14" align="left"><p><strong>Oracle9i</strong><strong>数据库结构</strong><strong></strong></p><p>谈及Oracle数据库结构时，我们应该从两个角度来探讨：分别是数据库的「逻辑层面」与「实体组成」。简单的说，「逻辑层面」是由”数据库内部”观看其组成要素，包括：资料表空间(tablespaces)、区段(segments)、延伸区块(extents)、资料区块(data block)、以及纲要对象(Schema objects)(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn1" name="_ftnref1"></a>[1])。而「实体组成」则是从”操作系统”角度来看 Oracle9i 数据库的实体构成项目，包括：数据文件(Data files)、重置日志文件(redo log files)、控制文件(control files)、密码文件(password)、起始参数档(initialization parameter files)…等等。如果您有心成为一个顶尖的 Oracle DBA，那么不仅要对以上各项如数家珍般熟悉，还要了解其内部运作与相互关系才行。首先我们就先从「逻辑层面」探访Oracle9i数据库！</p><p> </p><p><strong>数据库之逻辑组成</strong><strong></strong></p><p>无论是任何规模的企业，在管理数据库系统时，DBA都应该依据实际系统需求或是未来可能的管理方式，规划出一个或多个资料储存区域。重点是希望将资料分门别类地妥善存放。譬如，您可能会希望将公司内会计系统的帐务资料与产品销售纪录分开存放。</p><p>Oracle9i数据库允许DBA自行规划各种用途的资料表空间(Tablespace)，以便存放不同型态的资料与数据库对象。举例来说，存放Oracle系统信息的「资料辞典」(data dictionary)可放在 SYSTEM 资料表空间；应用系统资料可存放在 USER 资料表空间；而所有数据表的索引(Index)则可单独存放在INDX 数据表空间内(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn2" name="_ftnref2"></a>[2])。</p><p>一般来说，Oracle9i数据库至少应规划出五个以上的资料表空间，如下图一所示：</p><p align="center"><img height="244" src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image002_0059.jpg" width="346" /></p><p align="center">图一：Oracle9i数据库之资料表空间。</p><p align="left"> </p><p>那么，先从资料的最小储存单位—「资料区块」谈起。</p><p> </p><p><strong>何谓「资料区块」？</strong><strong></strong></p><p>许多初次接触数据库的读者最好奇的一点是：” 资料究竟是如何存放在数据库呢？”。其实，Oracle9i 数据库有几种资料储存体，其中最小的储存单元就称为「数据区块」(data block)。资料区块大小是由起始参数档的 DB_BLOCK_SIZE 参数所决定，且在新建Oracle9i数据库之前就必须明确地定义。实际上，资料区块大小与”操作系统的磁盘读写区块”(O.S. blocks)也有关系，所以您必须将 DB_BLOCK_SIZE 设定为 O.S. blocks的整数倍。附带一提：Oracle9i在存取资料时是以data block为最小读取单位，而不是以OS block为单位。</p><p> </p><p>从 Oracle9i 开始，数据库内可以设定多种资料区块大小。换句话说，Oracle9i数据库内分为「标准资料区块」与「非标准资料区块」；预设情况下 SYSTEM 资料表空间就是以「标准资料区块」建立而成。</p><p> </p><p><strong>何谓「延伸区块」？</strong><strong></strong></p><p>除了资料区块之外，Oracle9i数据库还有所谓的「延伸区块」(extents)。虽然资料区块是Oracle9i最小的资料读写单位，但值得注意的是：Oracle9i 在”<strong>配置</strong>”储存空间时，并不是以资料区块为单位，而是改采「延伸区块」的方式来配置空间。那么，使用「延伸区块」究竟有何好处呢？当您执行DDL指令建立数据库对象时(例如CREATE TABLE 指令)，Oracle9i会先配置出一连串的资料区块；直到这些资料区块全部存满资料后，下次再配置一连串的资料区块。这些连续的资料区块就统称为「延伸区块」。</p><p> </p><p>举例来说，假定您准备在Oracle9i数据库内存放80 KB的资料，Oracle9i可以先配置一个「延伸区块」，其大小可为资料区块(8 KB)的5倍；然后视实际需要再配置第二个「延伸区块」(大小还是40 KB)。如此一来，只要两次的空间配置动作就可以存放80 KB的资料了！试想，如果Oracle9i每次只配置8 KB的「资料区块」让您存放资料，总共需要10次空间配置动作才能放满80 KB的资料，是不是比较没有效率呢？由此可见，「延伸区块」的确有其存在的必要性。</p><p> </p><p><strong>何谓「区段」？</strong><strong></strong></p><p>依照不同的数据处理性质，您可能需要在资料表空间内划分出不同区域，以存放不同资料；我们将这些区域称之为「区段」(segment)。例如，存放数据的称为「数据区段」、存放数据的称为「索引区段」。而「区段」其实就是由许多「延伸区块」组合而成。除了上述两种「区段」以外，Oracle9i数据库内还有另外两种区段结构，分别是：「暂时性区段」(temporary segment)与「退回区段」(rollback segment)。下图二说明了Oracle9i数据库内各逻辑组成要件之间的阶层关系：</p><p align="center"><img height="303" src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image004_0001.gif" width="319" /></p><p align="center">图二：Tablespace、Segment、Extent、Block之间的关系。</p><p align="left"> </p><p>所以，从Oracle9i数据库的「逻辑层面」来看，我们知道：</p><ul><li>n            资料是存放在每个「资料区块」内，资料读写动作也将以「资料区块」为单位。 
</li><li>n            空间配置的动作则是引用「延伸区块」的概念。一个「延伸区块」由一连串的「资料区块」所构成。 
</li><li>n            依实际资料量多寡，资料(或数据库对象)由多个「延伸区块」所组成。 
</li><li>n            「资料表空间」内可划分不同的「区段」；而每个「区段」内又包含许多「延伸区块」。 
</li><li>n            在每个Oracle9i数据库内可规划不同的「资料表空间」，用以存放不同型态的资料。</li></ul><p> </p><p>截至目前为止，无论是资料区块、延伸区块、区段、甚至数据表空间，都只是逻辑上的数据储存概念。实际上，Oracle9i数据库是藉由数个操作系统内实体档案来维系数据库系统之正常运作。接下来我们将从操作系统角度来探讨Oracle9i的实体组成要素。</p><p><strong>数据库之实体组成</strong><strong></strong></p><p>还记得上一期文章中我们曾经综览Oracle9i 服务器基本架构吗？如果从操作系统的观点来看，Oracle9i 数据库的实体组成要素就是操作系统内各式档案，最重要的有：数据文件、重置日志文件、控制文件、起始参数档…等。下图三描述了Oracle9i 数据库的基本架构。</p><p align="center"><img height="299" src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image006_0000.gif" width="397" /></p><p align="center">图三：Oracle9i 数据库基本架构。</p><p align="left"> </p><p><strong>数据文件</strong><strong></strong></p><p>每个 Oracle9i 数据库都包含为数不等的实体「数据文件」。数据库内所有逻辑数据库对象都是存放在数据文件内，如：数据表、索引….等。</p><p>一但数据文件被建立后，系统就会在磁盘上配置出适当空间给数据文件；但尚未存放任何使用者资料。等到未来使用者将资料存入数据库时，Oracle9i 才会在数据文件内配置出「数据区段」，以存放数据。而这些动作都是由 Oracle9i 自动完成的。</p><p>当然了，如果数据文件剩余空间不足，您就必须调整数据文件大小；或增加新的数据文件。所以在 Oracle9i 数据库内，一个数据库对象有可能横跨多个数据文件 (数据文件相关的管理与维护动作将在未来专栏内容中详细探讨) 。</p><p>如前所述，Oracle9i 数据库内可规划一个以上的「资料表空间」。但如果由操作系统角度来看，「资料表空间」其实是由一个或数个实体「数据文件」所组成。换句话说，数据库的所有资料就是位于操作系统的各「数据文件」内。</p><p>所以：</p><ul><li>n          一个「数据文件」只能对应的一个「资料表空间」。 
</li><li>n          一个「资料表空间」可包含多个「数据文件」。</li></ul><p> </p><p>如下图四所示：SYSTEM 「资料表空间」对应到操作系统的 system01.ora 「数据文件」(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn3" name="_ftnref3"></a>[3])；USER 「资料表空间」则是包含 user01.ora 与 user02.ora 两个「数据文件」。</p><p> </p><p align="center"><img height="260" src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image008_0000.gif" width="434" /></p><p align="center">图四：资料表空间与数据文件之对应。</p><p align="left"> </p><p><strong>重置日志文件</strong><strong></strong></p><p>除了「数据文件」外，最重要的Oracle9i数据库实体档案就是「重置日志文件」(redo log files)，也就是大家俗称的「交易日志」(transaction log)。虽然它与「数据文件」不同，但是彼此间却有密不可分的关系！简单的说，Oracle9i 重置日志文件会负责纪录数据库内任何数据处理情况(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn4" name="_ftnref4"></a>[4])。当资料被异动时，所有异动纪录会先保留在内存的重置纪录缓冲区，并在适当时机由LGWR背景处理程序负责写入至硬盘上重置日志文件(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn5" name="_ftnref5"></a>[5])。如此一来，所有资料异动情况都会完整地保留下来。万一您的 Oracle9i 数据库不小心当机或是遭遇毁损，Oracle9i 将凭借重置日志文件内相关纪录将资料复原至最完整的状态—这个动作我们又称为『Roll Forward』。</p><p><strong>重置日志文件的配置方式</strong><strong></strong></p><p>请注意，Oracle9i数据库正常运作的先决条件是至少配置两个(组)重置日志文件！</p><p> </p><p>假定目前Oracle9i数据库拥有两个重置日志文件，分别是redo01.ora与redo02.ora。因为重置日志文件是以循环方式使用，所以当redo01.ora写满后就会轮到redo02.ora —这个动作称为<strong>「日志切换」</strong><strong>(log switch)</strong>。理论上，当redo02.ora写满后应该会立刻从redo01.ora重新开始写入动作。但实际上并非如此— Oracle9i 会等到redo01.ora内纪录的资料异动情况真正反应在数据文件之后(记得我们曾经提过的CKPT处理程序吗？)，才会覆写redo01.ora的资料。在一个大型线上交易(OLTP)系统下，如果资料交易量十分频繁，建议您不妨配置五个以上重置日志文件。以免Oracle9i进行「日志切换」时还要等候CKPT处理程序执行「检查点动作」(checkpoint)，因而影响系统效能。</p><p> </p><p>在执行关键性任务(mission-critical)的数据库系统中，为了避免硬件问题导致重置日志文件毁损(例如硬盘产生坏轨)，我们会考虑建置<strong>「多重重置日志文件」</strong><strong>(multiplexed redo log)</strong>。所谓的「多重重置日志文件」其实就是在其它硬盘内同时存放多份重置日志文件之复本。以下图五为例：假定原来的重置日志文件为Redo_A01.ora与Redo_A02.ora。我在第二个磁盘又额外规划了两个重置日志文件— Redo_B01.ora与Redo_B02.ora(分别为Redo_A01.ora与Redo_A02.ora之复本)。这时候Redo_A01.ora与Redo_B01.ora就构成所谓的<strong>「重置日志群组」</strong><strong>(redo log group)</strong>；而Redo_A01.ora与Redo_B01.ora分别为该群组之<strong>「群组成员」</strong><strong>(member)</strong>。</p><p> </p><p>一但您以「重置日志群组」的方式规划重置日志文件，LGWR会同时将异动纪录写入相同群组的所有成员。也就是说，LGWR会将资料同时写入Redo_A01.ora与Redo_B01.ora，等到发生「日志切换」动作后，再同时写入Redo_A02.ora与Redo_B02.ora。可想而知，万一这两颗硬盘其中之一不幸损毁。重置日志文件将不受任何影响。</p><p> </p><p>尽管「多重重置日志文件」的概念已具备容错功能，但是对于重置日志文件之写入效能却有一定程度的影响！这也是我们在规划之初就必须考虑的重点之一。</p><p align="center"><img height="306" src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image010.jpg" width="407" /></p><p align="center">图五：多重重置日志文件的配置方式。</p><p align="left"><strong>控制檔</strong><strong></strong></p><p>每个 Oracle9i 数据库也都会有一个「控制文件」，用以纪录与描述数据库的实体结构。「控制文件」内记录以下重要信息：</p><ul><li>n          Oracle9i数据库名称与建立时间。 
</li><li>n          数据文件与重置日志文件之名称，及其所在位置。 
</li><li>n          交易纪录序列码(log sequence number)。</li></ul><p> </p><p>每当数据库被激活时，Oracle9i 会在执行个体激活后立刻读取控制文件内容，待所有数据库实体组成档案之所在信息都收集完毕，数据库才会被开启。为了避免控制档毁损导致数据库系统停摆，建议您比照「多重重置日志群组」的方式—至少配置两个控制文件，并存放在不同实体硬盘(注<a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftn6" name="_ftnref6"></a>[6])。</p><p> </p><p><strong>起始参数档</strong><strong></strong></p><p>在激活执行个体之前，Oracle9i必须依照特定参数设定值来配置内存空间，并激活相关背景处理程序。而DBA 可以事先规划这些参数，并存放在操作系统内的某个档案。往后将利用这个档案来开启相对应的Oracle9i 执行个体。这个档案就是所谓的<strong>「起始参数档」</strong>。</p><p> </p><p>起始参数档包含以下主要内容：</p><ul><li>n          系统全域区相关的组态设定 
</li><li>n          其它各起始参数之名称与设定值 
</li><li>n          控制文件名称与存放路径</li></ul>n          重置日志文件之相关设定 
<p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref1" name="_ftn1"></a>注[1]：Oracle9i的纲要对象即为俗称的”数据库对象”。</p><p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref2" name="_ftn2"></a>注[2]：SYSTEM为Oracle数据库预设的资料表空间；USER与INDX则是由DBA自行规划建置的。</p><p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref3" name="_ftn3"></a>注[3]：任何 Oracle9i 数据库都必须要有一个 SYSTEM 资料表空间，所以Oracle9i 会在建立数据库时自动将第一个数据文件配置给 SYSTEM 数据表空间。</p><p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref4" name="_ftn4"></a>注[4]：这里的数据处理动作泛指新增、修改、删除；但查询动作除外。</p><p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref5" name="_ftn5"></a>注[5]：有关重置纪录缓冲区与LGWR背景处理的互动过程，请参阅我在2002年1月Linuxer杂志的专栏文章。</p><p><a href="http://www.51testing.com/dede/add_news_view.php?typeid=0#_ftnref6" name="_ftn6"></a>注[6]：除了数据库激活时需读取控制档以外。进行数据库复原动作时也必须存取控制档内容。</p><p>您可以利用任何文字编辑器来建立或修改起始参数档，通常起始参数档的名称为init.ora或是init&lt;SID&gt;.ora。假定Oracle9i 执行个体的名称为ora901，起始参数档之档名就可以定为initora901.ora。以下是一个起始参数文件范例：</p><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td><p># Copyright (c) 1991, 2001 by Oracle Corporation</p><p> </p><p># Cache and I/O</p><p>db_block_size=8192</p><p>db_cache_size=67108864</p><p> </p><p># Cursors and Library Cache</p><p>open_cursors=300</p><p> </p><p># Diagnostics and Statistics</p><p>background_dump_dest=/opt/oracle/admin/ora901/bdump</p><p>core_dump_dest=/opt/oracle/admin/ora901/cdump</p><p>timed_statistics=TRUE</p><p>user_dump_dest=/opt/oracle/admin/ora901/udump</p><p> </p><p># Distributed, Replication and Snapshot</p><p>db_domain=uuu.com.tw</p><p>remote_login_passwordfile=EXCLUSIVE</p><p> </p><p># File Configuration</p><p>control_files=("/opt/oracle/oradata/ora901/control01.ctl", </p><p>"/opt/oracle/oradata/ora901/control02.ctl", </p><p>"/opt/oracle/oradata/ora901/control03.ctl")</p><p> </p><p># MTS</p><p>dispatchers="(PROTOCOL=TCP)(SER=MODOSE)", </p><p>"(PROTOCOL=TCP)(PRE=oracle.aurora.server.GiopServer)", </p><p>"(PROTOCOL=TCP)(PRE=oracle.aurora.server.SGiopServer)"</p><p> </p><p># Miscellaneous</p><p>compatible=9.0.0</p><p>db_name=ora901</p></td></tr></tbody></table><table cellspacing="0" cellpadding="0"><tbody><tr><td><p># Network Registration</p><p>instance_name=ora901</p><p> </p><p># Pools</p><p>java_pool_size=117440512</p><p>large_pool_size=1048576</p><p>shared_pool_size=117440512</p><p># Processes and Sessions</p><p>processes=150</p><p># Redo Log and Recovery</p><p>fast_start_mttr_target=300</p><p># Resource Manager</p><p>resource_manager_plan=SYSTEM_PLAN</p><p># Sort, Hash Joins, Bitmap Indexes</p><p>sort_area_size=524288</p><p># System Managed Undo and Rollback Segments</p><p>undo_management=AUTO</p><p>undo_tablespace=UNDOTBS</p></td></tr></tbody></table>  
<p>除了上述档案之外，Oracle9i 数据库内还包含密码文件(password file)、重置日志封存盘(Archived Redo log files)。有关这些档案的使用时机与管理方式将在未来专栏中陆续为大家深入介绍。</p><p> </p><p>了解Oracle9i 数据库的实体组成后，我们就可以继续往下探讨Oracle9i 数据库的激活/关闭方式。</p><br /><p><strong>激活与关闭</strong><strong>Oracle9i</strong><strong>数据库</strong><strong></strong></p><p>在激活Oracle9i数据库之前，首先您必须了解数据库的各种激活状态：</p><ul><li>n            NOMOUNT 
</li><li>n            MOUNT 
</li><li>n            OPEN</li></ul><p> </p><p>下表一列出不同的激活状态，与其使用时机：</p><table cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" width="146"><p>激活状态</p></td><td valign="top" width="412"><p>说明</p></td></tr><tr><td valign="top" width="146"><p>NOMOUNT</p></td><td valign="top" width="412"><ul><li>n            仅激活Oracle9i执行个体，不会挂载(mount)Oracle数据库。 
</li><li>n            配置<strong>系统全域区</strong>(SGA)，激活各背景处理程序。 
</li><li>n            数据库尚无法使用。 
</li><li>n            DBA可执行ALTER DATABASE指令将数据库开启至MOUNT或是OPEN状态。 
</li><li>n            通常使用于<strong>第一次建立数据库</strong>，或是需重建控制档时。</li></ul></td></tr><tr><td valign="top" width="146"><p>MOUNT</p></td><td valign="top" width="412"><ul><li>n            激活Oracle9i执行个体。 
</li><li>n            开启控制档。 
</li><li>n            挂载Oracle9i数据库，但尚未开启之。 
</li><li>n            数据库尚无法使用，但是DBA可以进行特殊的管理工作(例如更改数据库内重置日志文件的封存模式)。</li></ul></td></tr><tr><td valign="top" width="146"><p>OPEN</p></td><td valign="top" width="412"><ul><li>n            激活Oracle9i执行个体。 
</li><li>n            开启控制档。 
</li><li>n            挂载Oracle9i数据库之后立刻开启。 
</li><li>n            使用者可以存取数据库。</li></ul></td></tr></tbody></table><p align="center">表一：Oracle9i数据库各种激活状态。</p><p align="left"> </p><p> </p><p>当您的系统内尚未建立任何数据库之前，只能先将Oracle9i执行个体开启至NOMOUNT状态，接着利用CREATE DATABASE指令建立Oracle9i数据库。待数据库顺利建立时(数据库内相关的信息已纪录至控制文件)，才可以执行ALTER DATABASE指令将数据库开启至OPEN状态；或是先将执行个体关闭，再一口气将数据库开启至OPEN状态。</p><p> </p><p> </p><p>欲开启/关闭Oracle9i数据库时可利用以下几种工具：</p><ul><li>n            SQL*Plus。 
</li><li>n            Oracle Enterprise Manager。 
</li><li>n            Recovery Manager。</li></ul><p> </p><p>一般来说，前两种是比较常用的方式。值得注意的是：在Oracle8i之前版本可使用Server Manager来激活/关闭Oracle数据库，或是执行系统维护的相关指令。从Oracle8i以后，所有Server Manager的指令都可以在SQL*Plus下执行。而Oracle9i已移除Server Manager，统一由SQL*Plus做为Oracle9i的客户端工具。</p><p> </p><p><strong>激活</strong><strong>Oracle9i</strong><strong>数据库的方式</strong><strong></strong></p><p>欲开启Oracle9i数据库之前，您必须先以SYSDBA身分登入，然后执行STARTUP指令。下列步骤假设您是从SQL*Plus激活数据库：</p><ul><li>1.          激活 SQL*Plus。</li></ul><p></p><p>$ sqlplus /nolog</p><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td></td></tr></tbody></table><br /><p> </p><p> </p><p> </p><p>这里我们使用了 nolog 选项，这是假设目前 Oracle9i 数据库尚未激活，当然也无法登入数据库。所以我们仅先进入SQL*Plus环境。</p><p> </p><ul><li>2.          利用SYSDBA身分登入。</li></ul><p></p><p>SQL&gt; connect使用者名称/密码as sysdba</p><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td></td></tr></tbody></table><br /><p> </p><p> </p><p> </p><ul><li>3.          执行START指令，其基本语法为：</li></ul><p></p><p><strong>STARTUPPFILE = </strong><strong>起始参数档名称</strong><strong></strong><strong>激活状态</strong></p><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td></td></tr></tbody></table><p>例如：</p><p></p><h2>STARTUPPFILE = initora901.oraNOMOUNT</h2><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td></td></tr></tbody></table><br />在一般情况下，如果要将Oracle9i数据库开启至OPEN状态，可以直接执行STARTUP指令。 
<p></p><h2>STARTUP</h2><p></p><table cellspacing="0" cellpadding="0"><tbody><tr><td></td></tr></tbody></table>结果如下图五所示： 
<p align="center"><img height="303" src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image002_0060.jpg" width="448" /></p><p align="center">图五：利用SQL*Plus开启Oracle9i数据库至OPEN状态。</p><p align="left"> </p><p>由图五可得知：激活Oracle9i 执行个体时会先配置出系统全域区，然后是挂载数据库，最后才会将数据库开启至OPEN状态。</p><p> </p><p> </p><p><strong>关闭</strong><strong>Oracle9i</strong><strong>数据库的方式</strong><strong></strong></p><p>关闭数据库时，您也必须以SYSDBA登入后执行SHUTDOWN指令。SHUTDOWN指令共有下列四种选项：</p><ul><li>n            Normal 
</li><li>n            Transactional 
</li><li>n            Immediate 
</li><li>n            Abort</li></ul><p> </p><p>下表二整理出每个选项之用途与使用时机：</p><table cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" width="146"><p>SHUTDOWN选项</p></td><td valign="top" width="412"><p>说明</p></td></tr><tr><td valign="top" width="146"><p>Normal</p></td><td valign="top" width="412"><ul><li>n            其它使用者无法再登入数据库，但现有使用者可继续未完成的数据处理动作。Oracle9i会等待所有使用者离线后才关闭数据库。 
</li><li>n            下次开启Oracle9i数据库时，系统不需进行执行个体修复动作(Instance Recovery)。 
</li><li>n            为系统预设的关闭数据库选项。</li></ul></td></tr><tr><td valign="top" width="146"><p>Transactional</p></td><td valign="top" width="412"><ul><li>n            不允许其它使用者再登入数据库。 
</li><li>n            正在进行的资料交易动作不会受到影响。 
</li><li>n            等到交易正常结束(不管是确认或是退回交易) Oracle9i才结束使用者联机阶段。待所有使用者离线后才关闭数据库。 
</li><li>n            下次开启Oracle9i数据库时，系统不需进行执行个体修复动作。</li></ul></td></tr><tr><td valign="top" width="146"><p>Immediate</p></td><td valign="top" width="412"><ul><li>n            不允许其它使用者再登入数据库。 
</li><li>n            自动退回(rollback)所有未确认的交易 
</li><li>n            Oracle9i自动结束所有使用者联机阶段，并关闭数据库。 
</li><li>n            资料交易的一致性与完整性可能会受到影响。 
</li><li>n            下次开启Oracle9i数据库时，系统不需进行执行个体修复动作。</li></ul></td></tr><tr><td valign="top" width="146"><p>Abort</p></td><td valign="top" width="412"><ul><li>n            不允许其它使用者再登入数据库。 
</li><li>n            正在进行的所有交易会立刻中断(不会rollback)。 
</li><li>n            Oracle9i会自动中断所有使用者联机阶段。 
</li><li>n            资料交易的一致性与完整性可能会受到影响。 
</li><li>n            下次开启Oracle9i数据库时，系统会自动进行执行个体修复动作。</li></ul></td></tr></tbody></table><p align="center">表二：Oracle9i数据库的关闭指令选项。</p><p align="left"> </p><p>关闭数据库的方式如激活数据库的方式类似，您可以在登入SQL*Plus之后执行SHUTDOWN指令。结果如图六所示：</p><p> </p><p align="center"><img height="327" src="http://www.51testing.com/ddimg/uploadimg/20051030/clip_image004.jpg" width="553" /></p><p align="center">图六：关闭Oracle9i数据库。</p><p align="center"> </p><p align="left">通常我们都是以Normal或是Transactional来关闭数据库。除非必要，否则请尽量不要使用SHUTDOWN ABORT去关闭Oracle9i数据库，以免影响使用者正在进行的数据处理工作。</p><p> </p><p><strong>结语</strong><strong></strong></p><p>在本期内容里，我以两种角度探讨了Oracle9i数据库的组成要素。个人认为这是学习Oracle最重要的工作。在我从事Oracle数据库管理相关教学工作以来，这部分也是上课学员普遍认为较难接受的观念之一。但是只要这些基本观念搞清楚，就像练武时任督二脉已被打通一般，未来研读Oracle的相关技术将会如鱼得水。最近也有读者来信和我讨论Oracle9i数据库的管理技巧。当然了，Oracle9i也有很棒的图形接口管理工具— Oracle9i Enterprise Manager。</p><p>未来的专栏内容我必然会为大家介绍Oracle9i Enterprise Manager的使用方式与技巧。有了Enterprise Manager，管理Oracle9i数据库将如虎添翼！</p><p> </p></div></b>
				</span>
		</div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-20 15:11 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL数据库连接过多错误的可能性以及解决方法</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20806.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 19 Dec 2006 08:56:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20806.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20806.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20806.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20806.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20806.html</trackback:ping><description><![CDATA[MYSQL数据库连接过多错误的可能性以及解决方法<a href="http://www.designxf.com/Article/200607/5789664.htm"><br /><br />http://www.designxf.com/Article/200607/5789664.htm<br /></a><br /><br /><br /><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-19 16:56 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL数据库优化</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20805.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 19 Dec 2006 08:52:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20805.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20805.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20805.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20805.html</trackback:ping><description><![CDATA[MYSQL数据库优化<a href="http://www.designxf.com/Article/200607/5789663.htm"><br />http://www.designxf.com/Article/200607/5789663.htm</a><br /><br /><br /><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-19 16:52 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库性能优化</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20803.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 19 Dec 2006 08:44:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20803.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20803.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20803.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20803.html</trackback:ping><description><![CDATA[Oracle数据库性能优化<br /><a href="http://www.designxf.com/Article/200511/2416.htm">http://www.designxf.com/Article/200511/2416.htm</a><br /><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-19 16:44 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL数据强制(Forcing)恢复</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20634.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Sat, 16 Dec 2006 11:41:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20634.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20634.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20634.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20634.html</trackback:ping><description><![CDATA[
		<p>强制(Forcing)恢复<br />如果出现数据库页面损坏，可以通过 SELECT INTO OUTFILE 从数据库中转储出表数<br />据,通常大部分的数据并未受损坏。 但是这些损坏可能引起 SELECT * FROM table <br />或 InnoDB 后台操作崩溃或中断(assert)，甚至是 InnoDB 的前滚(roll-forward)<br />恢复崩溃。从 InnoDB version 3.23.44 开始，在 my.cnf 中有个设置选项可以强<br />制 InnoDB 启动，以及防止后台操作的运行，因而你可以转储数据。例如，你可以 <br />my.cnf 在中加入如下设置： <br />set-variable = innodb_force_recovery = 4</p>
		<p>　</p>
		<p>innodb_force_recovery 代替选择将在下面列出。 这个参数不能用于数据库的其它<br />方面！当设置值大于 0 时，作为安全尺度，InnoDB 禁止用户使用 INSERT, UPDATE,<br /> 或 DELETE 。<br />从 3.23.53 和 4.0.4 开始，即使强制恢复被使用你也可以使用 DROP 或 CREATE <br />一个表。 如果你确定表如引起回滚崩溃，你可以移除(drop)它。你也可以通过这个<br />停止一个因导入大量数据或 ALTER TABLE 而引起的失控(runaway)回滚。你可以杀死<br /> mysqld 进程，并使用 my.cnf 设置项 innodb_force_recovery=3 不使用回滚。然<br /> 后就可以 DROP 那个引起失控(runaway)回滚的表。</p>
		<p>下面较大的数意味着包含所有较低数所对就的安全防范。为了能够转储表设置至少为 4 ，<br />这是相对安全的，仅仅只有一些损坏的页面数据掉失。Option 6 is more dramatic,<br /> because database pages are left in an obsolete state, which in turn may <br /> introduce more corruption into B-trees and other database structures. <br /> 1 (SRV_FORCE_IGNORE_CORRUPT) 即使发现一个错误也启动服务；<br /> 试着使用 SELECT * FROM table 跳过损坏的索引记录和页面，这将帮助转储表。 <br /> 2 (SRV_FORCE_NO_BACKGROUND) prevent the main thread from running: <br /> 如果在清理过程中将发生崩溃，这将预防它。 <br /> 3 (SRV_FORCE_NO_TRX_UNDO) 恢复时不运行事务回滚。 <br /> 4 (SRV_FORCE_NO_IBUF_MERGE) 防止插入缓冲区的归并操作：如果他们将引起崩溃，<br /> 最好不要操作他们；不要考虑表统计(table statistics)。 <br /> 5 (SRV_FORCE_NO_UNDO_LOG_SCAN)  当启动数据库时不撤销日志(undo logs)：<br /> InnoDB 将未完成的事务已提交。 <br /> 6 (SRV_FORCE_NO_LOG_REDO) do not do the log roll-forward in connection with recovery.<br /></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-16 19:41 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2数据库的安装</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20629.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Sat, 16 Dec 2006 11:27:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20629.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20629.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20629.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20629.html</trackback:ping><description><![CDATA[
		<table style="WIDTH: 418.5pt; mso-cellspacing: 0cm; mso-padding-alt: 0cm 0cm 0cm 0cm" cellspacing="0" cellpadding="0" width="558" border="0">
				<tbody>
						<tr style="HEIGHT: 24pt">
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 24pt; BACKGROUND-COLOR: transparent" colspan="2">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 13.5pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
												<b>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: #990000; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">DB2数据库的安装</span>
												</b>
												<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #990000; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
														<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="HEIGHT: 15pt">
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 15pt; BACKGROUND-COLOR: transparent" colspan="2">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 13.5pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center"> <span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
								</td>
						</tr>
						<tr style="HEIGHT: 7.5pt">
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 7.5pt; BACKGROUND-COLOR: transparent" valign="top" colspan="2">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 13.5pt; TEXT-ALIGN: right; mso-pagination: widow-orphan" align="right"> <span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 9.0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
								</td>
						</tr>
						<tr style="HEIGHT: 7.5pt">
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 0cm; BORDER-TOP: #d4d0c8; PADDING-LEFT: 0cm; BACKGROUND: white; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 98%; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 7.5pt" valign="top" width="98%">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-line-height-alt: 7.5pt" align="left">
												<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体">这是在<span lang="EN-US">IBM RS6000 操作系统为AIX安装的,HP9000上雷同. 注册为具有超级用户权限的用户(root) <br />2. 将 标有“DB2通用数据库企业版”的软件光盘插入驱动器 <br />3. 输入如下命令，以创建一个目录来安装该 CD-ROM： <br /># mkdir -p /cdrom 其中 cdrom 表示 CD-ROM 安装目录。 <br />输入如下命令，来分配 CD-ROM 文件系统： <br /># smitty storage <br />4. 选择文件系统 <br />5. 选择添加／更改／显示／删除文件系统 <br />6. 选择 CDROM 文件系统 <br />7. 选择添加 CDROM 文件系统 <br />8. 在弹出窗口中，输入如下项作为安装点： <br />/cdrom <br />9. 通过输入以下命令来安装 CD-ROM 文件系统： smit mountf <br />10. 在文件系统名称字段中输入值。例如，该名称可能是 /dev/cd0。 <br />11. 在安装目录字段中输入值。例如，此值可能是 /cdrom。 <br />12. 将安装为只读系统设置为 Yes。 <br />13. 单击确定。 <br />14. cd /cdrom <br />15. 输入 ./db2setup 命令以启动 DB2 安装程序。 安装 DB2 V6 窗口打开。 <br />16. 按 Tab 键更改突出显示的选项，按 Enter 键选择或取消选择选项。 <br />（1） 在服务器上安装，一般选择安装以下三个产品： <br />注意：要显示想要安装的 DB2 产品的部件，选择定制。要在任何时候返回至先前窗口，选择取消。 <br /> DB2 Administration Client </span></span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Symbol; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: Symbol">
														<span style="mso-char-type: symbol; mso-symbol-font-family: Symbol">Ø</span>
												</span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体">
														<br />选择定制安装这个产品， <br /> DB2 UDB enterprise edition </span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Symbol; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: Symbol">
														<span style="mso-char-type: symbol; mso-symbol-font-family: Symbol">Ø</span>
												</span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体">
														<br />选择定制安装这个产品， <br /> DB2 Software Developer Kit </span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Symbol; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: Symbol">
														<span style="mso-char-type: symbol; mso-symbol-font-family: Symbol">Ø</span>
												</span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体">
														<br />如果同时做开发，需要定制安装此产品。 <br />（2） 在“DB2产品信息”和“DB2产品库”只选择中国语言ZH_CN支持。 <br />17. 在16步确认后，将开始安装数据库程序。在安装过程中，还需确认以下问题： <br />（1） 是否建立DB2管理帐户, 一般选择建立: <br />按缺省建立db2管理用户db2as（使用缺省的UID，Group Id，安装home路径），在语言支持上， <br />只选择中国语言ZH_CN支持。 <br />（2） 是否建立DB2的实例, 一般选择建立: <br /> 按缺省建立db2管理用户db2inst1:db2iadm1（使用缺省的UID，Group Id，安装home路径）， </span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Symbol; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: Symbol">
														<span style="mso-char-type: symbol; mso-symbol-font-family: Symbol">Ø</span>
												</span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体">
														<br />在语言支持上，只选择中国语言ZH_CN支持。 <br /> 按缺省建立db2用户db2fenc1:db2fenc1（使用缺省的UID，Group Id，安装home路径）， </span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Symbol; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: Symbol">
														<span style="mso-char-type: symbol; mso-symbol-font-family: Symbol">Ø</span>
												</span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体">
														<br />在语言支持上，只选择中国语言ZH_CN支持。 <br /> 是否建立sample数据库（为了检查数据库的安装是否正确，一般选择建立sample数据库） </span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Symbol; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: Symbol">
														<span style="mso-char-type: symbol; mso-symbol-font-family: Symbol">Ø</span>
												</span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体">
														<br /> 是否选择DB2的实例进程在操作系统启动时，自动执行初始化 </span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Symbol; mso-ascii-font-family: 宋体; mso-hansi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-char-type: symbol; mso-symbol-font-family: Symbol">
														<span style="mso-char-type: symbol; mso-symbol-font-family: Symbol">Ø</span>
												</span>
												<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体">
														<br />如果在独立服务器上安装使用，可选择autostart，但在aix+hacmp+db2的双机共享环境中，不要选择 <br />autostart，DB2实例进程的启动，由hacmp来控制。 &lt;/P&gt;&lt;P&gt;18. 安装结果： <br />数据库程序安装完成后，DB2的软件程序安装在/usr/lpp目录中， <br />DB2DIR = /usr/lpp/DB2_06_01 <br />注意：如果安装过程中没有指定建立实例和管理帐户，在安装完成后可以使用命令创建实例(db2icrt)。 <br />或者要创建或添加新的实例、“管理服务器”或其他 DB2 产品和部件，输入如下命令： <br />/usr/lpp/DB2_06_01/install/DB2setup <br />19. 验证安装 <br />在安装时若没有选择建立sample数据库，在安装完成后可以通过命令（db2sampl）创建 SAMPLE 数据库， <br />并通过使用命令行处理器与该数据库相连来验证安装: <br />（1） 作为具有系统管理 (SYSADM) 权限的用户向系统注册。如：db2inst1 <br />（2） 输入 DB2sampl 命令以便创建 SAMPLE 数据库。 <br />（3） 创建 SAMPLE 数据库时，用数据库别名 SAMPLE 将它自动编目。 <br />（4） 输入 DB2start 命令以启动数据库管理程序。 <br />（5） 输入下列命令来与 SAMPLE 数据库相连，检索在部门 20 中工作的所有雇员的列表，并重设数据库连接： <br />DB2 connect to sample <br />DB2 "select * from staff where dept = 20" <br />DB2 connect reset <br />注意：在验证安装后，可除去 SAMPLE 数据库以释放磁盘空间。输入 DB2 drop database sample 命令 <br />来卸下 SAMPLE 数据库。 &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;若尚未未安装 DB2 工具，则您可以通过创建 SAMPLE 数据库， 并通过使用命令行处理器与该数据库 <br />相连来验证安装，如下所示： <br />步骤 1. <br />作为具有系统管理 (SYSADM) 权限的用户向系统注册。 &lt;/P&gt;&lt;P&gt;步骤 2. <br />输入 db2sampl 命令以便创建 SAMPLE 数据库。 &lt;/P&gt;&lt;P&gt;<br />创建 SAMPLE 数据库时， 用数据库别名 SAMPLE 将它自动编目。 &lt;/P&gt;&lt;P&gt;步骤 3. <br />输入 db2start 命令以启动数据库管理程序。 &lt;/P&gt;&lt;P&gt;步骤 4. <br />输入下列命令来与 SAMPLE 数据库相连， 检索在部门 20 中工作的所有雇员的列表，并重设数据库连接： &lt;/P&gt;&lt;P&gt;db2 connect to sample <br />db2 "select * from staff where dept = 20" <br />db2 connect reset &lt;/P&gt;&lt;P&gt;如以上命令均正确执行, 则证明DB2 UDB 数据库服务器的安装已经成功完成. <o:p></o:p></span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-16 19:27 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2上机操作指令指南</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20628.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Sat, 16 Dec 2006 11:26:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20628.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20628.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20628.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20628.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: DB2														上机操作指令指南																																																								1. 				启动实例				(db2inst1):								　　				db2start								　　				2. 				...&nbsp;&nbsp;<a href='http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20628.html'>阅读全文</a><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-16 19:26 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/16/20628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>