﻿<?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>BlogJava-larry-java学习交流空间-文章分类-数据库优化</title><link>http://www.blogjava.net/larry/category/22350.html</link><description>hibernate、spring、webwork、struts、Portal、ajax技术交流</description><language>zh-cn</language><lastBuildDate>Tue, 28 Aug 2007 18:35:14 GMT</lastBuildDate><pubDate>Tue, 28 Aug 2007 18:35:14 GMT</pubDate><ttl>60</ttl><item><title>数据库基本----SQL语句大全</title><link>http://www.blogjava.net/larry/articles/140495.html</link><dc:creator>larryjava</dc:creator><author>larryjava</author><pubDate>Tue, 28 Aug 2007 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/larry/articles/140495.html</guid><wfw:comment>http://www.blogjava.net/larry/comments/140495.html</wfw:comment><comments>http://www.blogjava.net/larry/articles/140495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/larry/comments/commentRss/140495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/larry/services/trackbacks/140495.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、基础&nbsp;&nbsp;&nbsp;&nbsp;1、说明：创建数据库&nbsp;&nbsp;&nbsp;&nbsp;Create&nbsp;DATABASE&nbsp;database-name&nbsp;&nbsp;&nbsp;&nbsp;2、说明：删除数据库&nbsp;&nbsp;&nbsp;&nbsp;drop&nbsp;database&nbsp;dbname&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/larry/articles/140495.html'>阅读全文</a><img src ="http://www.blogjava.net/larry/aggbug/140495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/larry/" target="_blank">larryjava</a> 2007-08-28 14:34 <a href="http://www.blogjava.net/larry/articles/140495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两个sql server数据库同步数据(转贴) </title><link>http://www.blogjava.net/larry/articles/132700.html</link><dc:creator>larryjava</dc:creator><author>larryjava</author><pubDate>Fri, 27 Jul 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/larry/articles/132700.html</guid><wfw:comment>http://www.blogjava.net/larry/comments/132700.html</wfw:comment><comments>http://www.blogjava.net/larry/articles/132700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/larry/comments/commentRss/132700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/larry/services/trackbacks/132700.html</trackback:ping><description><![CDATA[　经过两天的查找和实践，终于对－如何同步两个sql server的数据有了一个比较粗略的了解。<br>　　不是使用写sql 的方式来实现，而是采用－<span><strong>强制订阅实现数据库同步操作，大量和批量的数据可以用数据库的同步机制处理。<br>　　</strong><font color=#000000><br>说明：<br>　　为方便操作,所有操作均在发布服务器(分发服务器)上操作,并使用推模式，在客户机器使用强制订阅方式。<br><br>测试通过：<br>＝＝1:环境<br>服务器环境:<br>机器名称： serverDB<br>操作系统：Windows 2000 Server<br>数据库版本：SQL 2000 Server 企业版 </font></span>
<p>&nbsp;</p>
<p>客户端<br>机器名称：Joy<br>操作系统：Windows 2000 Server<br>数据库版本：SQL 2000 Server 企业版<br><br>＝＝2:建用户帐号<br>在服务器端建立域用户帐号<br>我的电脑管理-&gt;本地用户和组-&gt;用户-&gt;建立 <br>UserName：Joy<br>UserPwd：Joy<br><br>==3:重新启动服务器MSSQLServer<br>我的电脑-&gt;控制面版-&gt;管理工具-&gt;服务-&gt;MSSQLServer 服务<br>(更改为：域用户帐号,我们新建的joy用户 .\joy,密码:joy) <br><br></p>
<p>＝＝4:安装分发服务器<br>A:配置分发服务器<br>工具-&gt;复制-&gt;配置发布、订阅服务器和分发-&gt;下一步-&gt;下一步(所有的均采用默认配置)<br>B:配置发布服务器<br>工具-&gt;复制-&gt;创建和管理发布-&gt;选择要发布的数据库(pubs)-&gt;下一步-&gt;快照发布-&gt;下一步-&gt;<br>选择要发布的内容-&gt;下一步-&gt;下一步-&gt;下一步-&gt;完成<br>C:强制配置订阅服务器(推模式,拉模式与此雷同)<br>工具-&gt;复制-&gt;配置发布、订阅服务器和分发-&gt;订阅服务器-&gt;新建-&gt;SQL Server数据库-&gt;输入客户端服务器名称(joy)-&gt;使用SQL Server 身份验证(sa,sa)-&gt;确定-&gt;应用-&gt;确定<br>D:初始化订阅<br>复制监视器-&gt;发布服务器(serverDB)-&gt;双击订阅-&gt;强制新建-&gt;下一步-&gt;选择启用的订阅服务器-&gt;joy-&gt;<br>下一步-&gt;下一步-&gt;下一步-&gt;下一步-&gt;完成<br><br></p>
<p>＝＝6:测试数据<br>--在服务器执行:<br>选择表stores，手动或者通过sql语句修改其中的数据，insert ,update ,delete均可。<br><br>复制监视器-&gt;发布服务器(serverDB)-&gt;-&gt;快照-&gt;启动代理程序<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; -&gt;ZLP:SZ(强制)-&gt;启动同步处理</p>
<p>去查看同步的&nbsp;joy:stores 是否插入了一条新的记录</p>
<p>测试完毕，通过。</p>
<p>＝＝7修改数据库的同步时间,一般选择夜晚执行数据库同步处理<br>(具体操作略) :D<br><br></p>
<p><br><span><strong>〔注意说明〕</strong></span><br>服务器一端不能以(local)进行数据的发布与分发,需要先删除注册，然后新建注册本地计算机名称</p>
<p>卸载方式：工具-&gt;复制-&gt;禁止发布-&gt;是在"ZehuaDb"上静止发布,卸载所有的数据库同步配置服务器</p>
<p>注意：发布服务器、分发服务器中的SQLServerAgent服务必须启动<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用推模式: "D:\Microsoft SQL Server\MSSQL\REPLDATA\unc" 目录文件可以不设置共享<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 拉模式:则需要共享~!</p>
<p>少量数据库同步可以采用触发器实现,同步单表即可。<br><br>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br>配置过程中可能出现的问题</p>
<p>在SQL Server 2000里设置和使用数据库复制之前，应先检查相关的几台SQL Server服务器下面几点是否满足：<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 1、MSSQLserver和Sqlserveragent服务是否是以域用户身份启动并运行的（.\administrator用户也是可以的）<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果登录用的是本地系统帐户local，将不具备网络功能，会产生以下错误:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进程未能连接到Distributor '@Server name' <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (如果您的服务器已经用了SQL Server全文检索服务, 请不要修改MSSQLserver和Sqlserveragent服务的local启动。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会照成全文检索服务不能用。请换另外一台机器来做SQL Server 2000里复制中的分发服务器。)&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改服务启动的登录用户，需要重新启动MSSQLserver和Sqlserveragent服务才能生效。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 2、检查相关的几台SQL Server服务器是否改过名称(需要srvid=0的本地机器上srvname和datasource一样)<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在查询分析器里执行:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use master<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select srvid,srvname,datasource from sysservers&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果没有srvid=0或者srvid=0（也就是本机器）但srvname和datasource不一样, 需要按如下方法修改:<br></p>
<p>　　USE master<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GO<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 设置两个变量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE @serverproperty_servername&nbsp; varchar(100), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @servername&nbsp;&nbsp;&nbsp; varchar(100)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 取得Windows NT 服务器和与指定的 SQL Server 实例关联的实例信息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT @serverproperty_servername = CONVERT(varchar(100), SERVERPROPERTY('ServerName'))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 返回运行 Microsoft SQL Server 的本地服务器名称<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT @servername = CONVERT(varchar(100), @@SERVERNAME)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 显示获取的这两个参数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select @serverproperty_servername,@servername<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --如果@serverproperty_servername和@servername不同(因为你改过计算机名字),再运行下面的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --删除错误的服务器名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXEC sp_dropserver @server=@servername<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --添加正确的服务器名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXEC sp_addserver @server=@serverproperty_servername, @local='local'<br><br>修改这项参数，需要重新启动MSSQLserver和Sqlserveragent服务才能生效。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样一来就不会在创建复制的过程中出现18482、18483错误了。<br><br>3、检查SQL Server企业管理器里面相关的几台SQL Server注册名是否和上面第二点里介绍的srvname一样<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不能用IP地址的注册名。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （我们可以删掉IP地址的注册，新建以SQL Server管理员级别的用户注册的服务器名）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样一来就不会在创建复制的过程中出现14010、20084、18456、18482、18483错误了。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 4、检查相关的几台SQL Server服务器网络是否能够正常访问<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果ping主机IP地址可以，但ping主机名不通的时候，需要在&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; winnt\system32\drivers\etc\hosts&nbsp;&nbsp; (WIN2000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; windows\system32\drivers\etc\hosts (WIN2003)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件里写入数据库服务器IP地址和主机名的对应关系。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;例如：&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></p>
<p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td bgColor=#f3f3f3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 192.168.0.35&nbsp;&nbsp;&nbsp; oracledb&nbsp;&nbsp;&nbsp; oracledb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 192.168.0.65&nbsp;&nbsp;&nbsp; fengyu02&nbsp;&nbsp;&nbsp; fengyu02<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 202.84.10.193&nbsp;&nbsp; bj_db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bj_db&nbsp;&nbsp;&nbsp; </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;或者在SQL Server客户端网络实用工具里建立别名，例如:<font color=#000000> </font></p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp; 5、系统需要的扩展存储过程是否存在(如果不存在，需要恢复):</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp_addextendedproc 'xp_regenumvalues',@dllname ='xpstar.dll'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp_addextendedproc 'xp_regdeletevalue',@dllname ='xpstar.dll'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp_addextendedproc 'xp_regdeletekey',@dllname ='xpstar.dll' <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'&nbsp; <br></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 接下来就可以用SQL Server企业管理器里[复制]-&gt; 右键选择 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;[配置发布、订阅服务器和分发]的图形界面来配置数据库复制了</p>
<img src ="http://www.blogjava.net/larry/aggbug/132700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/larry/" target="_blank">larryjava</a> 2007-07-27 10:01 <a href="http://www.blogjava.net/larry/articles/132700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql Server性能优化(转贴) </title><link>http://www.blogjava.net/larry/articles/132699.html</link><dc:creator>larryjava</dc:creator><author>larryjava</author><pubDate>Fri, 27 Jul 2007 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/larry/articles/132699.html</guid><wfw:comment>http://www.blogjava.net/larry/comments/132699.html</wfw:comment><comments>http://www.blogjava.net/larry/articles/132699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/larry/comments/commentRss/132699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/larry/services/trackbacks/132699.html</trackback:ping><description><![CDATA[<p>1、 用程序中，保证在实现功能的基础上，尽量减少对数据库的访问次数；通过搜索参数，尽量减少对表的访问行数,最小化结果集，从而减轻网络负担；能够分开的操作尽量分开处理，提高每次的响应速度；在数据窗口使用SQL时，尽量把使用的索引放在选择的首列；算法的结构尽量简单；在查询时，不要过多地使用通配符如SELECT * FROM T1语句，要用到几列就选择几列如：SELECT COL1,COL2 FROM T1；在可能的情况下尽量限制尽量结果集行数如：SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。不要在应用中使用数据库游标，游标是非常有用的工具，但比使用常规的、面向集的SQL语句需要更大的开销；按照特定顺序提取数据的查找。</p>
<p>2、&nbsp;&nbsp; 避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如: <br>SELECT name FROM employee WHERE salary ＞ 60000 <br>在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。 </p>
<p>3、&nbsp;&nbsp; 尽量避免在WHERE子句中对字段进行函数或表达式操作，这将导致引擎放弃使用索引而进行全表扫描。如： <br>SELECT * FROM T1 WHERE F1/2=100<br>应改为: <br>SELECT * FROM T1 WHERE F1=100*2</p>
<p>SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=&#8217;5378&#8217;<br>应改为:<br>SELECT * FROM RECORD WHERE CARD_NO LIKE &#8216;5378%&#8217;</p>
<p>SELECT member_number, first_name, last_name&nbsp; FROM members<br>WHERE DATEDIFF(yy,datofbirth,GETDATE()) &gt; 21<br>应改为:<br>SELECT member_number, first_name, last_name&nbsp; FROM members<br>WHERE dateofbirth &lt; DATEADD(yy,-21,GETDATE())<br>即：任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。</p>
<p>4、&nbsp;&nbsp; 避免使用!=或＜＞、IS NULL或IS NOT NULL、IN ，NOT IN等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如: <br>SELECT id FROM employee WHERE id != 'B%' <br>优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。<br>&nbsp;<br>5、&nbsp;&nbsp; 尽量使用数字型字段，一部分开发人员和数据库管理人员喜欢把包含数值信息的字段<br>设计为字符型，这会降低查询和连接的性能，并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符，而对于数字型而言只需要比较一次就够了。</p>
<p>6、&nbsp;&nbsp; 合理使用EXISTS,NOT EXISTS子句。如下所示：<br>1.SELECT SUM(T1.C1)FROM T1 WHERE(<br>(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2&gt;0)<br>2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(<br>&nbsp; SELECT * FROM T2 WHERE T2.C2=T1.C2)<br>两者产生相同的结果，但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。<br>如果你想校验表里是否存在某条纪录，不要用count(*)那样效率很低，而且浪费服务器资源。可以用EXISTS代替。如：<br>IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')<br>可以写成：<br>IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')</p>
<p>经常需要写一个T_SQL语句比较一个父结果集和子结果集，从而找到是否存在在父结果集中有而在子结果集中没有的记录，如：<br>1.SELECT a.hdr_key&nbsp; FROM hdr_tbl a---- tbl a 表示tbl用别名a代替<br>WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key) </p>
<p>2.SELECT a.hdr_key&nbsp; FROM hdr_tbl a<br>LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key&nbsp; WHERE b.hdr_key IS NULL </p>
<p>3.SELECT hdr_key&nbsp; FROM hdr_tbl<br>WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三种写法都可以得到同样正确的结果，但是效率依次降低。</p>
<p>7、&nbsp;&nbsp; 尽量避免在索引过的字符数据中，使用非打头字母搜索。这也使得引擎无法利用索引。&nbsp; <br>见如下例子：<br>SELECT * FROM T1 WHERE NAME LIKE &#8216;%L%&#8217;<br>SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=&#8217;L&#8217;<br>SELECT * FROM T1 WHERE NAME LIKE &#8216;L%&#8217;<br>即使NAME字段建有索引，前两个查询依然无法利用索引完成加快操作，引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。</p>
<p>8、&nbsp;&nbsp; 分利用连接条件，在某种情况下，两个表之间可能不只一个的连接条件，这时在&nbsp; WHERE 子句中将连接条件完整的写上，有可能大大提高查询速度。<br>例：<br>SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO <br>SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO&nbsp; AND A.ACCOUNT_NO=B.ACCOUNT_NO<br>第二句将比第一句执行快得多。</p>
<p>9、&nbsp;&nbsp;&nbsp; 消除对大型表行数据的顺序存取<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尽管在所有的检查列上都有索引，但某些形式的WHERE子句强迫优化器使用顺序存取。如：<br>SELECT * FROM orders WHERE (customer_num=104&nbsp; AND order_num&gt;1001) OR <br>order_num=1008<br>解决办法可以使用并集来避免顺序存取：<br>SELECT ＊ FROM orders WHERE customer_num=104 AND order_num&gt;1001 <br>UNION <br>SELECT ＊ FROM orders WHERE order_num=1008 <br>这样就能利用索引路径处理查询。</p>
<p>10、 避免困难的正规表达式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIKE关键字支持通配符匹配，技术上叫正规表达式。但这种匹配特别耗费时间。例如：SELECT * FROM customer WHERE zipcode LIKE &#8220;98_ _ _&#8221; <br>即使在zipcode字段上建立了索引，在这种情况下也还是采用顺序扫描的方式。如<br>果把语句改为SELECT ＊ FROM customer WHERE zipcode &gt;&#8220;98000&#8221;，在执行查询<br>时就会利用索引来查询，显然会大大提高速度。<br>11、 使用视图加速查询<br>把表的一个子集进行排序并创建视图，有时能加速查询。它有助于避免多重排序<br>操作，而且在其他方面还能简化优化器的工作。例如： <br>SELECT cust.name，rcvbles.balance，&#8230;&#8230;other columns <br>FROM cust，rcvbles <br>WHERE cust.customer_id = rcvlbes.customer_id <br>AND rcvblls.balance&gt;0 <br>AND cust.postcode&gt;&#8220;98000&#8221; <br>ORDER BY cust.name <br>如果这个查询要被执行多次而不止一次，可以把所有未付款的客户找出来放在一个<br>视图中，并按客户的名字进行排序： <br>CREATE VIEW DBO.V_CUST_RCVLBES<br>AS <br>SELECT cust.name，rcvbles.balance，&#8230;&#8230;other columns <br>FROM cust，rcvbles <br>WHERE cust.customer_id = rcvlbes.customer_id <br>AND rcvblls.balance&gt;0 <br>ORDER BY cust.name </p>
<p>然后以下面的方式在视图中查询： <br>SELECT ＊ FROM&nbsp; V_CUST_RCVLBES<br>WHERE postcode&gt;&#8220;98000&#8221; <br>视图中的行要比主表中的行少，而且物理顺序就是所要求的顺序，减少了磁盘<br>I/O，所以查询工作量可以得到大幅减少。</p>
<p>12、 能够用BETWEEN的就不要用IN<br>SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)<br>改成：<br>SELECT * FROM T1 WHERE ID BETWEEN 10 AND 14<br>因为IN会使系统无法使用索引,而只能直接搜索表中的数据。</p>
<p>13、 DISTINCT的就不用GROUP BY<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT OrderID&nbsp; FROM Details WHERE UnitPrice &gt; 10 GROUP BY OrderID<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可改为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT DISTINCT OrderID FROM Details WHERE UnitPrice &gt; 10<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>14、&nbsp;&nbsp; 部分利用索引<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.SELECT employeeID, firstname, lastname<br>FROM names<br>WHERE dept = 'prod' or city = 'Orlando' or division = 'food'</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.SELECT employeeID, firstname, lastname FROM names WHERE dept = 'prod'<br>UNION ALL<br>SELECT employeeID, firstname, lastname FROM names WHERE city = 'Orlando'<br>UNION ALL<br>SELECT employeeID, firstname, lastname FROM names WHERE division = 'food'<br>如果dept 列建有索引则查询2可以部分利用索引，查询1则不能。</p>
<p>15、&nbsp;&nbsp; 能用UNION&nbsp; ALL就不要用UNION<br>UNION&nbsp; ALL不执行SELECT DISTINCT函数，这样就会减少很多不必要的资源</p>
<p>16、&nbsp;&nbsp; 不要写一些不做任何事的查询<br>如：SELECT COL1 FROM T1 WHERE 1=0<br>&nbsp;&nbsp;&nbsp; SELECT COL1 FROM T1 WHERE COL1=1 AND COL1=2<br>这类死码不会返回任何结果集，但是会消耗系统资源。</p>
<p>17、&nbsp; 尽量不要用SELECT INTO语句。<br>SELECT INOT 语句会导致表锁定，阻止其他用户访问该表。</p>
<p>18、 必要时强制查询优化器使用某个索引<br>&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45) <br>改成：<br>SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND processid IN (8,32,45)<br>则查询优化器将会强行利用索引IX_ProcessID 执行查询。<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>19、&nbsp; 虽然UPDATE、DELETE语句的写法基本固定，但是还是对UPDATE语句给点建议：<br>a) 尽量不要修改主键字段。<br>b) 当修改VARCHAR型字段时，尽量使用相同长度内容的值代替。<br>c) 尽量最小化对于含有UPDATE触发器的表的UPDATE操作。<br>d) 避免UPDATE将要复制到其他数据库的列。<br>e) 避免UPDATE建有很多索引的列。<br>f) 避免UPDATE在WHERE子句条件中的列。</p>
<p><br>上面我们提到的是一些基本的提高查询速度的注意事项,但是在更多的情况下,往往需要反复试验比较不同的语句以得到最佳方案。最好的方法当然是测试，看实现相同功能的SQL语句哪个执行时间最少，但是数据库中如果数据量很少，是比较不出来的，这时可以用查看执行计划，即：把实现相同功能的多条SQL语句考到查询分析器，按CTRL+L看查所利用的索引，表扫描次数（这两个对性能影响最大），总体上看询成本百分比即可。<br>简单的存储过程可以用向导自动生成：在企业管理器工具栏点击运行向导图标，点击&#8221;数据库&#8221;、&#8221;创建存储过程向导&#8221;。复杂存储过程的调试：在查询分析器左边的对象浏览器（没有？按F8）选择要调试的存储过程,点右键，点调试，输入参数执行，出现一个浮动工具条，上面有单步执行，断点设置等。</p>
<img src ="http://www.blogjava.net/larry/aggbug/132699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/larry/" target="_blank">larryjava</a> 2007-07-27 10:00 <a href="http://www.blogjava.net/larry/articles/132699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转载】oracle备份与恢复精华资料</title><link>http://www.blogjava.net/larry/articles/121745.html</link><dc:creator>larryjava</dc:creator><author>larryjava</author><pubDate>Mon, 04 Jun 2007 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/larry/articles/121745.html</guid><wfw:comment>http://www.blogjava.net/larry/comments/121745.html</wfw:comment><comments>http://www.blogjava.net/larry/articles/121745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/larry/comments/commentRss/121745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/larry/services/trackbacks/121745.html</trackback:ping><description><![CDATA[<div>
<p><font size=3><span>冷备份</span><font face="Times New Roman"><span><span>...................................................................................................................... </span></span><span>1</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>、备份步骤：</span><font face="Times New Roman"><span><span>................................................................................................... </span></span><span>1</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>、恢复步骤：</span><font face="Times New Roman"><span><span>................................................................................................... </span></span><span>2</span></font></font></p>
<p><font size=3><span>热备份</span><font face="Times New Roman"><span><span>...................................................................................................................... </span></span><span>2</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>、备份步骤：</span><font face="Times New Roman"><span><span>................................................................................................... </span></span><span>2</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>、恢复步骤：</span><font face="Times New Roman"><span><span>................................................................................................... </span></span><span>4</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">Windows</font></span><span>平台的</span><span><font face="Times New Roman">oracle</font></span><span>备份</span><font face="Times New Roman"><span>(Veritas BE)<span>...................................................................... </span></span><span>5</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>、需要的数据：</span><font face="Times New Roman"><span><span>............................................................................................... </span></span><span>5</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>、恢复过程：</span><font face="Times New Roman"><span><span>................................................................................................... </span></span><span>5</span></font></font></p>
<p><font size=3><span>例子：（网上原资料）</span><font face="Times New Roman"><span><span>............................................................................................... </span></span><span>7</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">1.<span>&nbsp;&nbsp;&nbsp; </span></font></span><span>用</span><span><font face="Times New Roman">Oracle</font></span><span>的热备份重建数据库</span><font face="Times New Roman"><span><span>..................................................................... </span></span><span>7</span></font></font></p>
<p><font size=3><span><font face="Times New Roman">2.<span>&nbsp;&nbsp;&nbsp; </span>Oracle9i RMAN </font></span><span>备份及恢复步骤</span><font face="Times New Roman"><span><span>................................................................ </span></span><span>12</span></font></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<h2><a name=_Toc134852034></a><a name=_Toc132594698><span><span>冷备份</span></span></a></h2>
<h3><a name=_Toc134852035></a><a name=_Toc132594699><span><span><font face="Times New Roman" size=5>1</font></span></span></a><span><span><span><font size=5>、备份步骤：</font></span></span></span></h3>
<p><font face=宋体><span>冷备份具有很多优良特性，快速，方便，以及高效。一次完整的冷备份步骤是：</span></font></p>
<p><span><font face=宋体>　　</font></span><span>1</span><span><font face=宋体>，首先关闭数据库（</font></span><span>shutdown normal</span><font face=宋体><span>）</span></font></p>
<p><span><font face=宋体>　　</font></span><span>2</span><font face=宋体><span>，拷贝相关文件到安全区域（利用操作系统命令拷贝数据库的所有的数据文件、日志文件、控制文件、参数文件、口令文件等（包括路径））</span></font></p>
<p><span><font face=宋体>　　</font></span><span>3</span><span><font face=宋体>，重新启动数据库（</font></span><span>startup</span><font face=宋体><span>）</span></font></p>
<p><font face=宋体><span>　　以上的步骤可以用一个脚本来完成操作：</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; su &#8211; oracle &lt;&nbsp;sqlplus /nolog <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect / as sysdba<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shutdown immediate;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !cp </span><span><font face=宋体>文件</font></span><span>&nbsp;&nbsp; </span><span><font face=宋体>备份位置（所有的日志、数据、控制及参数文件）</font></span><span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startup;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit;</span></p>
<h3><a name=_Toc134852036></a><a name=_Toc132594700><span><span><font face="Times New Roman" size=5>2</font></span></span></a><span><span><span><font size=5>、恢复步骤：</font></span></span></span></h3>
<p><font size=3><span>恢复的时候，相对比较简单了，我停掉数据库，将文件拷贝回相应位置，重启数据库就可以了，当然也可以用脚本来完成。</span></font></p>
<h2><a name=_Toc134852037></a><a name=_Toc132594701><span><span>热备份</span></span></a></h2>
<h3><a name=_Toc134852038></a><a name=_Toc132594702><span><span><font face="Times New Roman" size=5>1</font></span></span></a><span><span><span><font size=5>、备份步骤：</font></span></span></span></h3>
<p><font face=宋体><span>当需要做一个精度比较高的备份，而且我们的数据库不可能停掉（少许访问量）时，这个情况下，我们就需要归档方式下的备份，就是下面讨论的热备份。热备份可以非常精确的备份表空间级和用户级的数据，由于它是根据归档日志的时间轴来备份恢复的，理论上可以恢复到前一个操作，甚至就是前一秒的操作。具体步骤如下：</span></font></p>
<p><span><font face=宋体>　　</font></span><span>1</span><span><font face=宋体>，通过视图</font></span><span>v$database,</span><span><font face=宋体>查看数据库是否在</font></span><span>Archive</span><span><font face=宋体>模式下</font></span><span>:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; select log_mode from v$database;<br><br></span><span><font face=宋体>　　如果不是</font></span><span>Archive</span><font face=宋体><span>模式</span></font></p>
<p><span><font face=宋体>　　则设定数据库运行于归档模式下：</font></span><span>SQL&gt;shutdown immediate<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt;startup mount<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; alter database archivelog;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; alter database open;<br><br></span><span><font face=宋体>　　如果</font></span><span>Automaticarchival</span><span><font face=宋体>显示为</font></span><span>&#8220;Enabled&#8221;</span><span><font face=宋体>，则数据库归档方式为自动归档。否则需要手工归档，或者将归档方式修改为自动归档，如：</font></span><span><br></span><span><font face=宋体>　　正常</font></span><span>shutdown</span><span><font face=宋体>数据库，在参数文件中</font></span><span>init.ora</span><span><font face=宋体>中加入如下参数</font></span><span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt;shutdown immediate<br><br></span><span><font face=宋体>　　修改</font></span><span>init.ora</span><span><font face=宋体>：</font></span><span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG_ARCHIVE_START=TRUE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG_ARCHIVE_DEST1=ORACLE_HOME/admin/o816/arch(</span><span><font face=宋体>归档日值存放位置可以自己定义</font></span><span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt;startup<br><br></span><span><font face=宋体>　　然后，重新启动数据库，此时</font></span><span>Oracle</span><span><font face=宋体>数据库将以自动归档的方式工作在</font></span><span>Archive</span><span><font face=宋体>模式下。其中参数</font></span><span>LOG_ARCHIVE_DEST1</span><span><font face=宋体>是指定的归档日志文件的路径，建议与</font></span><span>Oracle</span><span><font face=宋体>数据库文件存在不同的硬盘，一方面减少磁盘</font></span><span>I/O</span><span><font face=宋体>竞争，另外一方面也可以避免数据库文件所在硬盘毁坏之后的文件丢失。归档路径也可以直接指定为磁带等其它物理存储设备，但可能要考虑读写速度、可写条件和性能等因素。</font></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span><font face=宋体>　　注意：当数据库处在</font></span><span>ARCHIVE</span><span><font face=宋体>模式下时，一定要保证指定的归档路径可写，否则数据库就会挂起，直到能够归档所有归档信息后才可以使用。另外，为创建一个有效的备份</font></span><span>,</span><span><font face=宋体>当数据库在创建时</font></span><span>,</span><span><font face=宋体>必须履行一个全数据库的冷备份</font></span><span>,</span><span><font face=宋体>就是说数据库需要运行在归档方式</font></span><span>,</span><span><font face=宋体>然后正常关闭数据库</font></span><span>,</span><span><font face=宋体>备份所有的数据库组成文件。这一备份是整个备份的基础</font></span><span>,</span><font face=宋体><span>因为该备份提供了一个所有数据库文件的拷贝。（体现了冷备份与热备份的合作关系，以及强大的能力）</span></font></p>
<p><span><font face=宋体>　　</font></span><span>2</span><span><font face=宋体>，备份表空间文件：</font></span><span> </span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a,</span><span><font face=宋体>首先，修改表空间文件为备份模式</font></span><span>&nbsp; ALTER TABLESPACE tablespace_name BEGIN BACKUP;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b,</span><span><font face=宋体>然后，拷贝表空间文件到安全区域</font></span><span> !CP tablespace_name D_PATH;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c,</span><span><font face=宋体>最后，将表空间的备份模式关闭</font></span><span>&nbsp;&nbsp;&nbsp; ALTER TABLESPACE tablespace_name END BACKUP;</span></p>
<p><span><font face=宋体>　　</font></span><span>3</span><font face=宋体><span>，对归档日志文件的备份：</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span><font face=宋体>停止归档进程－－</font></span><span>&gt;</span><span><font face=宋体>备份归档日志文件－－</font></span><span>&gt;</span><font face=宋体><span>启动归档进程</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span><font face=宋体>如果日志文档比较多，我们将它们写入一个文件成为一个恢复的参考：</font></span><span>$&nbsp;&nbsp; files `ls &lt;</span><span><font face=宋体>归档文件路径</font></span><span>&gt;/arch*.dbf`;export files</span></p>
<p><span><font face=宋体>　　</font></span><span>4</span><span><font face=宋体>，备份控制文件</font></span><span>:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt; alter database backup controlfile to 'controlfile_back_name</span><span><font face=宋体>（一般用</font></span><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="20" Month="11" Year="2004"><span>2004-11-20</span></st1:chsdate><span><font face=宋体>的方式）</font></span><span>' reuse;</span></p>
<p><span><font face=宋体>　　当然，我们也可以将上面的东东写为一个脚本，在需要的时候执行就可以了</font></span><span>:</span></p>
<p><font face=宋体><span>　　脚本范例：</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; su &#8211; oracle &lt; sqlplus /nolog&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect / as sysdba<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALTER TABLESPACE tablespace_name BEGIN BACKUP</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !CP tablespace_name D_PATH</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALTER TABLESPACE tablespace_name END BACKUP<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alter database backup controlfile to 'controlfile_back_name</span><span><font face=宋体>（一般用</font></span><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="20" Month="11" Year="2004"><span>2004-11-20</span></st1:chsdate><span><font face=宋体>的方式）</font></span><span>' reuse;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; !files `ls &lt;</span><span><font face=宋体>归档文件路径</font></span><span>&gt;/arch*.dbf`;export files</span></p>
<h3><a name=_Toc134852039></a><a name=_Toc132594703><span><span><font face="Times New Roman" size=5>2</font></span></span></a><span><span><span><font size=5>、恢复步骤：</font></span></span></span></h3>
<p><font face=宋体><span>　　热备份的恢复，对于归档方式数据库的恢复要求不但有有效的日志备份还</span><span>要求有一个在归档方式下作的有效的全库备份</span><span>。归档备份在理论上可以无数据丢失，但是对于硬件以及操作人员的要求都比较高。在我们使用归档方式备份的时候，全库物理备份也是非常重要的。归档方式下数据库的恢复要求从全备份到失败点所有的日志都要完好无缺。</span></font><span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span><font face=宋体>恢复步骤：</font></span><span>LOG_ARCHIVE_DEST_1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shutdown</span><span><font face=宋体>数据库。</font></span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span><font face=宋体>将全备份的数据文件放到原来系统的目录中。</font></span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span><font face=宋体>将全备份到失败点的所有归档日志放到参数</font></span><span>LOG_ARCHIVE_DEST_1</span><span><font face=宋体>所指定的位置。</font></span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span><font face=宋体>利用</font></span><span>sqlplus</span><span><font face=宋体>登陆到空实例。（</font></span><span>connect / as sysdba</span><span><font face=宋体>）</font></span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span><font face=宋体>然后</font></span><span>&nbsp; startup mount<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;set autorecovery on<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;recover database;<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;alter database open;</span></p>
<p><font face=宋体><span>这样，热恢复就算完工。</span></font></p>
<h2><a name=_Toc134852040></a><a name=_Toc132594704><span><span><font face=Arial>Windows</font></span></span></a><span><span><span>平台的</span><span><font face=Arial>oracle</font></span></span></span><span><span><span>备份</span><span><font face=Arial>(Veritas BE)</font></span></span></span></h2>
<p><font size=3><span>通过</span><span><font face="Times New Roman">Backup Exec</font></span><span>实施</span><span><font face="Times New Roman">Oracle</font></span><span>灾难恢复很简单。</span></font></p>
<h3><a name=_Toc134852041></a><a name=_Toc132594705><span><span><font face="Times New Roman" size=5>1</font></span></span></a><span><span><span><font size=5>、需要的数据：</font></span></span></span></h3>
<p><font face=宋体><span>1</span><span>、<span>FULL CLOSED</span>备份</span></font></p>
<p><font face=宋体><span>shutdown</span><span>数据库（不要用<span>shutdown abort</span>强行关闭），实施一个文件级备份，备份全部的<span>Oracle</span>相关文件，包括<span>Windows</span>系统文件，系统状态和<span>Oracle</span>程序文件和数据文件等内容。</span></font></p>
<p><span><font face=宋体>这个冷备份对于快速恢复<span>Oracle</span>数据库系统非常关键，如果没有它，系统被破坏后只能重新安装再恢复，这要比直接恢复冷备份慢得多，也更复杂。</font></span></p>
<p><span><font face=宋体>每当数据库或表单的物理结构或逻辑结构有变化时都应该重新创建这个冷备份。</font></span></p>
<p><font face=宋体><span>2. FULL ONLINE</span><span>备份</span></font></p>
<p><span><font face=宋体>这个备份要通过<span>Backup Exec Agent for Oracle Server</span>来完成，要备份全部表空间，归档日志和控制文件，通过这种方式备份，<span>Oracle</span>会将所有缓存内容写入文件，将<span>online redo log</span>做归档，所以数据库备份中包含的是备份时数据库的即时点信息，完整而且有效。以后做恢复时，可以恢复到最后一次<span>FULL ONLINE</span>备份的状态。</font></span></p>
<h3><a name=_Toc134852042></a><a name=_Toc132594706><span><span><font face="Times New Roman" size=5>2</font></span></span></a><span><span><span><font size=5>、恢复过程：</font></span></span></span></h3>
<p><font face=宋体><span>1. </span><span>重新安装<span>Windows</span>系统和<span>Remote Agent for Windows Server</span>，为恢复<span>Oracle</span>服务器准备环境。</span></font></p>
<p><font face=宋体><span>2. </span><span>恢复最后一次<span>FULL CLOSED</span>备份，重新启动计算机。</span></font></p>
<p><span><font face=宋体>此时<span>Windows</span>系统，<span>Oracle</span>数据库系统都是完整的，只是<span>Oracle</span>数据库中可能不是最新的数据。<span>Backup Exec Agent for Oracle Server</span>也不用重新安装了。</font></span></p>
<p><font face=宋体><span>3. </span><span>用<span>SQLPlus</span>用<span>SYS</span>以<span>sysdba</span>身份连接到数据库系统，关闭数据库。&nbsp;</span></font></p>
<p><span><font face=宋体>shutdown immediate + &lt;&nbsp;enter &gt;</font></span></p>
<p><font face=宋体><span>4. </span><span>通过介质服务器恢复最新的<span>FULL ONLINE</span>备份，恢复作业属性的高级选项中，确保选中了<span>&#8220;Restore over Existing files</span>（覆盖现存文件）<span>&#8221; </span>选项。</span></font></p>
<p><span><font face=宋体>要想成功的恢复数据库，在最后一次<span>FULL CLOSED</span>备份之后的所有<span>redo log</span>必须都已经成功归档并备份。少了哪一个，数据库就无法恢复到最后的<span>FULL ONLI NE</span>备份时的状态。</font></span></p>
<p><span><font face=宋体>通过<span>Oracle</span>的<span>alert log</span>可以看到数据库的恢复需要哪些归档日志，以及你应该把它们恢复到什么位置。</font></span></p>
<p><font face=宋体><span>5. </span><span>恢复完成后，用<span>SYS</span>用户以<span>sysdba</span>身份连接到数据库，将数据库加载到<span>mount</span>阶段：</span></font></p>
<p><span><font face=宋体>startup mount + &lt;&nbsp;enter &gt;</font></span></p>
<p><span><font face=宋体>6. </font></span><span><font face=宋体>数据库<span>mount</span>完成后，执行<span>recover</span>过程：</font><span><br><br><font face=宋体>recover database using backup controlfile + &lt;&nbsp;enter &gt;</font></span></span></p>
<p><span><font face=宋体>数据库会提示你需要哪些日志：</font></span></p>
<p><span><font face=宋体>ORA-00279: Change 36579 generated at needed for thread 1<br><br>ORA-00289: Suggestion : \Oracle_Home\Oradata\\%SID%T00036579.ARC<br><br>ORA-00280: {=Suggested | filename | AUTO | FROM logsource | CANCEL}</font></span></p>
<p><span><font face=宋体>最简单的方法是选自动恢复：</font><span><font face=宋体>&nbsp;<br><br>auto + &lt; enter &gt;</font></span></span></p>
<p><span><font face=宋体>系统会在<span>init.ora</span>文件中定义的位置上查找所有必需的日志并依次应用它们，最后一个要应用的日志是<span>online redo log</span>，实际上它并不包括任何的<span>transaction</span>，只有一个<span>SCN</span>，可以略过，但是自动恢复过程会因为找不到相应的文件而报错：</font></span></p>
<p><span><font face=宋体>ORA-00308: cannot open archived log<br><br>E:\ORACLE\ORADATA\KIMSTAD\ARCHIVE\KIMSTADT00036949.ARC'<br><br>ORA-27041: unable to open file<br><br>OSD-04002: unable to open file<br><br>O/S-Error: (OS 2) The system cannot find the file specified.</font></span></p>
<p><span><font face=宋体>为此输入以下命令（<span>until cancel</span>参数使我们可以在需要的时候中止恢复过程）：</font><span><br><br><font face=宋体>recover database until cancel using backup controlfile + </font></span></span></p>
<p><span><font face=宋体>这样在数据库恢复的最后阶段再次提示前面的错误时，我们就可以中止恢复过程：</font><span><br><br><font face=宋体>cancel + &lt;&nbsp;enter &gt;</font></span></span></p>
<p><span><font face=宋体>这时除了最后一个<span>online redo log</span>以外，所有的<span>commit transaction</span>都已经提交到数据库之中了，完成后会显示：</font><span><br><br><font face=宋体>Media recovery canceled</font></span></span></p>
<p><span><font face=宋体>实际上恢复过程已经正常完成了。</font></span></p>
<p><span><font face=宋体>最后是打开数据库并同步日志序列号：</font><span><br><br><font face=宋体>alter database open resetlogs + &lt;&nbsp;enter &gt;</font></span></span></p>
<p><span><font face=宋体>至此，<span>Oracle</span>数据库被成功恢复到最后一次<span>Full Online</span>备份。</font></span></p>
<p><font size=3><strong><span><font face="Times New Roman">&nbsp;</font></span></strong><strong><span>说明：</span></strong><span><font face="Times New Roman">Oracle 8i</font></span><span>可以用</span><span><font face="Times New Roman">internal</font></span><span>账号完成</span><span><font face="Times New Roman">DBA</font></span><span>操作。</span><span><font face="Times New Roman">9i</font></span><span>取消了</span><span><font face="Times New Roman">internal</font></span><span>账号，</span><span><font face="Times New Roman">SYS</font></span><span>账号代替它了。为了以</span><span><font face="Times New Roman">DBA</font></span><span>身份登录，启动</span><span><font face="Times New Roman">SQL Plus</font></span><span>时应该加</span><span><font face="Times New Roman">nolog</font></span><span>参数，进入之后再登录，</span><span><font face="Times New Roman">connect username/password as sysdba</font></span><span>。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<h2><a name=_Toc134852043></a><a name=_Toc132594707><span><span>例子：</span></span></a><span><span>（网上原资料）</span></span></h2>
<h3><a name=_Toc134852044></a><a name=_Toc132594708><span><span><span><font face="Times New Roman"><font size=5>1.</font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size=5><span>用</span><span><font face="Times New Roman">Oracle</font></span></font></span></a><span><span><span><font size=5>的热备份重建数据库</font></span></span></span></h3>
<p><span>为了检验我为公司开发的</span><span><font face="Times New Roman">Oracle</font></span><span>数据库在线自动备份系统，我根据&#8220;</span><span><font face="Times New Roman">Oracle</font></span><span>数据库在线自动备份系统&#8221;产生的备份文件来重建和恢复</span><span><font face="Times New Roman">Oracle</font></span><span>数据库。为了让大家共享其方法和步骤（也适合于用其它方式对</span><span><font face="Times New Roman">Oracle</font></span><span>做的热备份进行重建数据库）现整理如下。</span><span><br><br></span><strong><span>一、系统环境</span></strong><span><br><br></span><span>本次测试所使用的系统环境如下：</span><span><br><br><span><font face="Times New Roman">1</font></span></span><span>．</span><span><font face="Times New Roman"> </font></span><span>硬件环境</span><span><br><br></span><span>服务器：</span><span><font face="Times New Roman">Dell PowerEdge 1300 (CPU</font></span><span>：</span><span><font face="Times New Roman">P</font></span><span>Ⅲ</span><span><font face="Times New Roman"> 550MHz </font></span><span>内存：</span><span><font face="Times New Roman">128MB </font></span><span>硬盘：</span><span><font face="Times New Roman">36GB)<br><br><span>2</span></font></span><span>．</span><span><font face="Times New Roman"> </font></span><span>软件环境</span><span><br><br></span><span>操作系统：</span><span><font face="Times New Roman">UnixWare 7.1<br><br></font></span><span>数据库：　</span><span><font face="Times New Roman">Oracle <st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899">8.1.6</st1:chsdate> for Unix </font></span><span>企业版，</span><span><font face="Times New Roman">SID</font></span><span>：</span><span><font face="Times New Roman">ora816<br><br>Oracle</font></span><span>安装路径：</span><span><font face="Times New Roman">/home/oracle<br><br></font></span><span>备份文件：所有数据库文件、控制文件、初始化文件、数据库备份以来的所有归档日志文件。</span><span><br><br></span><strong><span>二、恢复步骤</span></strong><span><br><br></span><span>下面根据从用户处带回来的备份数据，在一台新的服务器重建</span><span><font face="Times New Roman">Oracle</font></span><span>数据库。其详细步骤如下：</span><span><font face="Times New Roman"> <br><br><span>1. </span></font></span><span>创建数据库恢复使用的环境</span><span><br></span><span><br></span><span>在新的</span><span><font face="Times New Roman">Dell</font></span><span>服务器上，安装与原来的数据库服务器相同的操作系统</span><span><font face="Times New Roman">UnixWare 7.1</font></span><span>；然后安装与原数据库相同版本的</span><span><font face="Times New Roman">Oracle 8.1.6 for Unix </font></span><span>企业版。</span><span><br><br><span><font face="Times New Roman">2. </font></span></span><span>删除新服务器上的</span><span><font face="Times New Roman">Oracle</font></span><span>实例</span><span><br><br></span><span>启动新数据库服务器上的</span><span><font face="Times New Roman">Oracle</font></span><span>，在</span><span><font face="Times New Roman">sqlplus</font></span><span>中，查找到数据库文件的路径，并保存在当前路径下的文件</span><span><font face="Times New Roman">file_name.txt</font></span><span>中：</span><span><br><br><font face="Times New Roman">$ sqlplus system/manager<br><br>SQL&gt; spool file_name.txt<br><br>SQL&gt; select file_name from sys.dba_data_files;<br><br>SQL&gt; spool end<br><br>SQL&gt;exit<br><br></font></span><span>关闭新服务器的</span><span><font face="Times New Roman">Oracle</font></span><span>，然后根据文件</span><span><font face="Times New Roman">file_name.txt</font></span><span>中的路径，删除新装的</span><span><font face="Times New Roman">Oracle</font></span><span>实例的所有数据库文件。</span><span><br><br></span><span>注：从本步开始所有操作都是用</span><span><font face="Times New Roman">Oracle</font></span><span>用户登录操作系统（</span><span><font face="Times New Roman">Unix</font></span><span>）后进行。文中所有的黑色粗体</span><span><font face="Times New Roman">5</font></span><span>号字符</span><span><font face="Times New Roman">(</font></span><span>标题除外</span><span><font face="Times New Roman">)</font></span><span>的语句可以直接执行，黑色倾斜粗体</span><span><font face="Times New Roman">5</font></span><span>号字符的语句需要修改后执行。</span><span><br><br><span><font face="Times New Roman">3. </font></span></span><span>恢复数据库文件</span><span><br><br></span><span>把备份的所有数据库文件用</span><span><font face="Times New Roman">Ftp</font></span><span>上传新的数据库服务器中的相同路径下。如果原来的路径已不存在，可以拷贝到其他路径下，恢复时详细处理方法见步骤</span><span><font face="Times New Roman">7</font></span><span>中</span><span><font face="Times New Roman">&lt;2&gt;</font></span><span>。</span><span><br><br><span><font face="Times New Roman">4. </font></span></span><span>恢复初始化参数文件</span><span><br></span><span><br></span><span>把备份的</span><span><font face="Times New Roman">initSID.ora</font></span><span>文件用</span><span><font face="Times New Roman">Ftp</font></span><span>上传到新数据库服务器中</span><span><font face="Times New Roman">Oracle</font></span><span>实例的</span><span><font face="Times New Roman">initSID.ora</font></span><span>文件位置，覆盖之。其位置一般在</span><span><font face="Times New Roman">$ORACLE_HOME/dbs</font></span><span>目录下。</span><span><br><br><span><font face="Times New Roman">5. </font></span></span><span>恢复控制文件</span><span><br></span><span><br></span><span>把备份的</span><span><font face="Times New Roman">ControlFile.bak</font></span><span>文件用</span><span><font face="Times New Roman">Ftp</font></span><span>上传到新数据库服务器中</span><span><font face="Times New Roman">Oracle</font></span><span>实例的各个镜像路径下，并按初始化参数文件</span><span><font face="Times New Roman">initSID.ora</font></span><span>中的该项的位置和名称命名。</span><span><br><br><font face="Times New Roman">control_files = ("/home/oracle/app/oracle/oradata/ora816/control01.ctl", "/home/oracle/app/oracle/oradata/ora816/control02.ctl","/home/oracle/app/oracle/oradata/ora816/control03.ctl")<br><br></font></span><span>其路径如有变动，在初始化参数文件</span><span><font face="Times New Roman">initSID.ora</font></span><span>中修改如上内容的路径和名称，使其实际路径与该参数的路径一致。</span><span><font face="Times New Roman"> <br><br><span>6. </span></font></span><span>恢复归档日志文件</span><span><br><br></span><span>把数据库备份后的归档日志用</span><span><font face="Times New Roman">Ftp</font></span><span>上传到新数据库服务器的相同路径下。路径如有变动可以根据初始化参数文件</span><span><font face="Times New Roman">initSID.ora</font></span><span>中如下位置进行修改，使其实际路径与该参数的路径一致。</span><span><br><br><font face="Times New Roman">log_archive_dest_1 = "location=/home/oracle/app/oracle/admin/ora816/arch"<br><br><br><br><span>7. </span></font></span><span>恢复数据库</span><span><br><br></span><span>经过以上</span><span><font face="Times New Roman">6</font></span><span>个步骤，把所有的备份文件已经上传到了新数据库服务器中。下面开始根据这些文件恢复并启动数据库，先在操作系统的提示符下做如下操作：</span><span><br><br><font face="Times New Roman">$svrmgrl<br><br>SVRMGR&gt;connect internal<br><br>SVRMGR&gt;startup mount<br><br>&lt;1&gt; </font></span><span>创建口令文件</span><span><br><br></span><span>如果原来的数据库配置了口令文件，并且在</span><span><font face="Times New Roman">mount</font></span><span>数据库时报如下错误：</span><span><br><br><font face="Times New Roman">ORA-01990: error opening password file '/home/oracle/app/oracle/product/8.1.6/dbs/orapw'<br><br></font></span><span>可以到</span><span><font face="Times New Roman">/home/oracle/app/oracle/product/8.1.6/dbs/</font></span><span>路径下，用以下命令创建口令文件：</span><span><br><br><font face="Times New Roman">orapwd<br><br></font></span><span>其用法如下：</span><span><br><br><font face="Times New Roman">Usage: orapwd file=&lt;fname&gt; password=&lt;password&gt; entries=&lt;users&gt;<br><br>where<br><br>file - name of password file (mand),</font></span><span>（口令文件的命名方式为：</span><span><font face="Times New Roman">orapwSID</font></span><span>）</span><span><br><br><font face="Times New Roman">password - password for SYS and INTERNAL (mand),<br><br>entries - maximum number of distinct DBA and OPERs (opt),<br><br>There are no spaces around the equal-to (=) character.<br><br></font></span><span>例如：</span><span><font face="Times New Roman"> orapwd file=orapwora816 password=manager<br><br></font></span><span>然后重新执行如下语句</span><span><font face="Times New Roman">mount</font></span><span>数据库：</span><span><br><br><font face="Times New Roman">SVRMGR&gt;startup mount</font></span><span>。</span><span><br><br><font face="Times New Roman">&lt;2&gt; </font></span><span>修改数据库文件的路径</span><span><br><br></span><span>如果在上述的步骤</span><span><font face="Times New Roman">3</font></span><span>中修改了恢复的数据库文件的路径，可以用如下语句对数据库文件重新命名</span><span><font face="Times New Roman"> </font></span><span>：</span><span><br><br><font face="Times New Roman">alter database rename file 'old_file' to 'new_file';<br><br></font></span><span>如把原来路径</span><span><font face="Times New Roman">/home/oracle/app/oracle/oradata/ora816</font></span><span>下的文件</span><span><font face="Times New Roman">system01.dbf</font></span><span>改到了</span><span><font face="Times New Roman">/u21/oracle/app/oracle/oradata/ora816</font></span><span>下：</span><span><br><br><font face="Times New Roman">SVRMGR&gt;alter database rename file<br><br>'/home/oracle/app/oracle/oradata/ora816/system01.dbf' <br><br>to '/u21/oracle/app/oracle/oradata/ora816/system01.dbf';<br><br></font></span><span>按照上面的方法把所有修改路径的数据库文件重新命名。</span><span><br><br><font face="Times New Roman">&lt;3&gt; </font></span><span>根据控制文件和归档日志文件恢复数据库</span><span><br><br></span><span>下面开始用控制文件和归档日志文件恢复数据库：</span><span><br><br><font face="Times New Roman">SVRMGR&gt;recover database using backup controlfile until cancel;<br><br></font></span><span>出现如下提示：</span><span><br><br><font face="Times New Roman">ORA-00279: change 50971 generated at 08/23/2002 09:21:27 needed for thread 1<br><br>ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc<br><br>ORA-00280: change 50971 for thread 1 is in sequence #399<br><br>Specify log: {&lt;RET&gt;=suggested | filename | AUTO | CANCEL}</font></span><span>输入：</span><span><br><br><font face="Times New Roman">auto<br><br></font></span><span>如果有如下提示，则表示成功。</span><span><br><br><font face="Times New Roman">ORA-00279: change 51007 generated at 08/23/2002 11:23:13 needed for thread 1<br><br>ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc<br><br>ORA-00280: change 51007 for thread 1 is in sequence #400<br><br>ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc' noy<br><br>Log applied.<br><br></font></span><span>意外处理：如果其它提示可能是需要的日志文件不存在，检查</span><span><font face="Times New Roman">ORA-00289</font></span><span>中该文件是否存在。</span><span><br><br></span><span>直到出现如下提示：</span><span><br><br><font face="Times New Roman">ORA-00279: change 51011 generated at 08/23/2002 11:23:45 needed for thread 1<br><br>ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_401.arc<br><br>ORA-00280: change 51011 for thread 1 is in sequence #401<br><br>ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc' noy<br><br>ORA-00308: cannot open archived log '/home/oracle/app/oracle/admin/ora8/arch<br><br>/arch_1_401.arc'<br><br>ORA-27037: unable to obtain file status<br><br>Intel SVR4 UNIX Error: 2: No such file or directory<br><br>Additional information: 3<br><br>&lt;4&gt; </font></span><span>重置日志</span><span><br><br><font face="Times New Roman">SVRMGR&gt;alter database open resetlogs;<br><br></font></span><span>意外处理：如果提示创建日志的路径不存在，按提示路径创建目录。然后再重置日志。</span><span><br><br><font face="Times New Roman">&lt;5&gt; </font></span><span>重启数据库，完成恢复</span><span><br><br><font face="Times New Roman">SVRMGR&gt;shutdown immediate<br><br>SVRMGR&gt;startup <br><br>ORACLE instance started.<br><br>Total System Global Area 123437040 bytes<br><br>Fixed Size 69616 bytes<br><br>Variable Size 106418176 bytes<br><br>Database Buffers 16777216 bytes<br><br>Redo Buffers 172032 bytes<br><br>Database mounted.<br><br>Database opened. <br><br></font></span><span>数据库正常打开，数据库重建恢复成功。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<h3><a name=_Toc134852045></a><a name=_Toc132594709><span><font face="Times New Roman"><span><span><font size=5>2.</font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><font size=5>Oracle9i RMAN </font></span></font></span></a><span><span><span><font size=5>备份及恢复步骤</font></span></span></span></h3>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>在这里没有讨论多么深入的</span><span>RMAN</span><span>技术，也没有告诉大家这样去编写备份脚本，这并不是我的初衷，我只想把我会的写出来，和大家一起学习，一起进步，谢谢。</span><span><br><br>1</span><span>、切换服务器归档模式，如果已经是归档模式可跳过此步：</span><span><br>%sqlplus /nolog&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>启动</span><span>sqlplus)<br>SQL&gt; conn / as sysdba&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>以</span><span>DBA</span><span>身份连接数据库</span><span>)<br>SQL&gt; shutdown immediate;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>立即关闭数据库</span><span>)<br>SQL&gt; startup mount&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>启动实例并加载数据库，但不打开</span><span>)<br>SQL&gt; alter database archivelog;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>更改数据库为归档模式</span><span>)<br>SQL&gt; alter database open;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>打开数据库</span><span>)<br>SQL&gt; alter system archive log start;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>启用自动归档</span><span>)<br>SQL&gt; exit&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>退出</span><span>)<br><br>2</span><span>、连接：</span><span><br>%rman target=rman/rman@mydb&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>启动恢复管理器</span><span>)<br><br>3</span><span>、基本设置：</span><span><br>RMAN&gt; configure default device type to disk;&nbsp; &nbsp; (</span><span>设置默认的备份设备为磁盘</span><span>)<br>RMAN&gt; configure device type disk parallelism 2;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>设置备份的并行级别，通道数</span><span>)<br>RMAN&gt; configure channel 1 device type disk fromat '/backup1/backup_%U';&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>设置备份的文件格式，只适用于磁盘设备</span><span>)<br>RMAN&gt; configure channel 2 device type disk fromat '/backup2/backup_%U';&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>设置备份的文件格式，只适用于磁盘设备</span><span>)<br>RMAN&gt; configure controlfile autobackup on;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>打开控制文件与服务器参数文件的自动备份</span><span>)<br>RMAN&gt; configure controlfile autobackup format for device type disk to '/backup1/ctl_%F';&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>设置控制文件与服务器参数文件自动备份的文件格式</span><span>)<br><br>4</span><span>、查看所有设置：</span><span><br>RMAN&gt; show all<br><br>5</span><span>、查看数据库方案报表：</span><span><br>RMAN&gt; report schema;<br><br>6</span><span>、备份全库：</span><span><br>RMAN&gt; backup database plus archivelog delete input;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>备份全库及控制文件、服务器参数文件与所有归档的重做日志，并删除旧的归档日志</span><span>)<br><br>7</span><span>、备份表空间：</span><span><br>RMAN&gt; backup tablespace system plus archivelog delete input;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>备份指定表空间及归档的重做日志，并删除旧的归档日志</span><span>)<br><br>8</span><span>、备份归档日志：</span><span><br>RMAN&gt; backup archivelog all delete input;<br><br>9</span><span>、复制数据文件：</span><span><br>RMAN&gt; copy datafile 1 to '/oracle/dbs/system.copy';<br><br>10</span><span>、查看备份和文件复本：</span><span><br>RMAN&gt; list backup;<br><br>11</span><span>、验证备份：</span><span><br>RMAN&gt; validate backupset 3;<br><br>12</span><span>、从自动备份中恢复服务器参数文件：</span><span><br>RMAN&gt; shutdown immediate;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>立即关闭数据库</span><span>)<br>RMAN&gt; startup nomount;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>启动实例</span><span>)<br>RMAN&gt; restore spfile to pfile '/backup1/mydb.ora' from autobackup;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>从自动备份中恢复服务器参数文件</span><span>)<br><br>13</span><span>、从自动备份中恢复控制文件：</span><span><br>RMAN&gt; shutdown immediate;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>立即关闭数据库</span><span>)<br>RMAN&gt; startup nomount;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>启动实例</span><span>)<br>RMAN&gt; restore controlfile to '/backup1' from autobackup;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>从自动备份中恢复控制文件</span><span>)<br><br>13</span><span>、恢复和复原全数据库：</span><span><br>RMAN&gt; shutdown immediate;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>立即关闭数据库</span><span>)<br>RMAN&gt; exit&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>退出</span><span>)<br>%mv /oracle/dbs/tbs_12.f /oracle/dbs/tbs_12.bak&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>将数据文件重命名</span><span>)<br>%mv /oracle/dbs/tbs_13.f /oracle/dbs/tbs_13.bak&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>将数据文件重命名</span><span>)<br>%mv /oracle/dbs/tbs_14.f /oracle/dbs/tbs_14.bak&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>将数据文件重命名</span><span>)<br>%mv /oracle/dbs/tbs_15.f /oracle/dbs/tbs_15.bak&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>将数据文件重命名</span><span>)<br>%rman target=rman/rman@mydb&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>启动恢复管理器</span><span>)<br>RMAN&gt; startup pfile=/oracle/admin/mydb/pfile/initmydb.ora&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>指定初始化参数文件启动数据库</span><span>)<br>RMAN&gt; restore database;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>还原数据库</span><span>)<br>RMAN&gt; recover database;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>恢复数据库</span><span>)<br>RMAN&gt; alter database open;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>打开数据库</span><span>)<br><br>14</span><span>、恢复和复原表空间：</span><span><br>RMAN&gt; sql 'alter tablespace users offline immediate';&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>将表空间脱机</span><span>)<br>RMAN&gt; exit&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>退出恢复管理器</span><span>)<br>%mv /oracle/dbs/users01.dbf /oracle/dbs/users01.bak&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>将表空间重命名</span><span>)<br>%rman target=rman/rman@mydb&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>启动恢复管理器</span><span>)<br>RMAN&gt; restore tablespace users;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>还原表空间</span><span>)<br>RMAN&gt; recover tablespace users;&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>恢复表空间</span><span>)<br>RMAN&gt; sql 'alter tablespace users online';&nbsp; &nbsp;&nbsp;&nbsp;(</span><span>将表空间联机</span><span>)<br><br>15</span><span>、增量备份与恢复：</span><span><br></span><span>第一天的增量基本备份：</span><span><br>RMAN&gt; backup incremental level=0 database plus archivelog delete input;<br></span><span>第二天的增量差异备份：</span><span><br>RMAN&gt; backup incremental level=2 database plus archivelog delete input;<br></span><span>第三天的增量差异备份：</span><span><br>RMAN&gt; backup incremental level=2 database plus archivelog delete input;<br></span><span>第四天的增量差异备份：</span><span><br>RMAN&gt; backup incremental level=1 database plus archivelog delete input;<br></span><span>第五天的增量差异备份：</span><span><br>RMAN&gt; backup incremental level=2 database plus archivelog delete input;<br></span><span>第六天的增量差异备份：</span><span><br>RMAN&gt; backup incremental level=2 database plus archivelog delete input;<br></span><span>第七天的增量差异备份：</span><span><br>RMAN&gt; backup incremental level=0 database plus archivelog delete input;<br><br></span><span>增量恢复：</span><span><br>RMAN&gt; shutdown immediate;<br>RMAN&gt; exit<br>%mv /oracle/dbs/tbs_12.f /oracle/dbs/tbs_12.bak<br>%mv /oracle/dbs/tbs_13.f /oracle/dbs/tbs_13.bak<br>%mv /oracle/dbs/tbs_14.f /oracle/dbs/tbs_14.bak<br>%mv /oracle/dbs/tbs_15.f /oracle/dbs/tbs_15.bak<br>%rman target=rman/rman@mydb<br>RMAN&gt; startup pfile=/oracle/admin/mydb/pfile/initmydb.ora<br>RMAN&gt; restore database;<br>RMAN&gt; recover database;<br>RMAN&gt; alter database open;</span></p>
</div>
<img src ="http://www.blogjava.net/larry/aggbug/121745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/larry/" target="_blank">larryjava</a> 2007-06-04 09:25 <a href="http://www.blogjava.net/larry/articles/121745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化--让你的SQL运行速度明显提高</title><link>http://www.blogjava.net/larry/articles/116663.html</link><dc:creator>larryjava</dc:creator><author>larryjava</author><pubDate>Fri, 11 May 2007 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/larry/articles/116663.html</guid><wfw:comment>http://www.blogjava.net/larry/comments/116663.html</wfw:comment><comments>http://www.blogjava.net/larry/articles/116663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/larry/comments/commentRss/116663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/larry/services/trackbacks/116663.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;人们在使用SQL时往往会陷入一个误区，即太关注于所得的结果是否正确，而忽略了不同的实现方法之间可能存在的性能差异，这种性能差异在大型的或是复杂的数据库环境中（如联机事务处理OLTP或决策支持系统DSS）中表现得尤为明显。
<tbody>
</tbody>
笔者在工作实践中发现，不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后，其运行速度有了明显地提高！下面我将从这三个方面分别进行总结：（为了更直观地说明问题，所有实例中的SQL运行时间均经过测试，不超过１秒的均表示为（&lt; 1秒）。 ）<br><br><strong>一、不合理的索引设计</strong> <br>　　例：表record有620000行，试看在不同的索引下，下面几个 SQL的运行情况： <br>　　1.在date上建有一非个群集索引<br>
<p class=code>select count(*) from record where date &gt; <br>''19991201'' and date &lt; ''19991214''and amount &gt; <br>2000 (25秒) <br>select date,sum(amount) from record group by date <br>(55秒) <br>select count(*) from record where date &gt; <br>''19990901'' and place in (''BJ'',''SH'') (27秒)</p>
<br>　　分析： <br>　　date上有大量的重复值，在非群集索引下，数据在物理上随机存放在数据页上，在范围查找时，必须执行一次表扫描才能找到这一范围内的全部行。 <br><br><br>　　2.在date上的一个群集索引<br>
<p class=code>select count(*) from record where date &gt; <br>''19991201'' and date &lt; ''19991214'' and amount &gt; <br>2000 （14秒） <br>select date,sum(amount) from record group by date <br>（28秒） <br>select count(*) from record where date &gt; <br>''19990901'' and place in (''BJ'',''SH'')（14秒）</p>
<br>　　分析： <br>　　在群集索引下，数据在物理上按顺序在数据页上，重复值也排列在一起，因而在范围查找时，可以先找到这个范围的起末点，且只在这个范围内扫描数据页，避免了大范围扫描，提高了查询速度。 <br><br><br>　　3.在place，date，amount上的组合索引 <br>
<p class=code>select count(*) from record where date &gt; <br>''19991201'' and date &lt; ''19991214'' and amount &gt; <br>2000 （26秒） <br>select date,sum(amount) from record group by date <br>（27秒） <br>select count(*) from record where date &gt; <br>''19990901'' and place in (''BJ, ''SH'')（&lt; 1秒）</p>
<br>　　分析： <br>　　这是一个不很合理的组合索引，因为它的前导列是place，第一和第二条SQL没有引用place，因此也没有利用上索引；第三个SQL使用了place。<br><br><br>　　4.在date，place，amount上的组合索引 <br>
<p class=code>select count(*) from record where date &gt; <br>''19991201'' and date &lt; ''19991214'' and amount &gt; <br>2000(&lt; 1秒) <br>select date,sum(amount) from record group by date <br>（11秒） <br>select count(*) from record where date &gt; <br>''19990901'' and place in (''BJ'',''SH'')（&lt; 1秒）</p>
<p><br>　　分析： <br>　　这是一个合理的组合索引。它将date作为前导列，使每个SQL都可以利用索引，并且在第一和第三个SQL中形成了索引覆盖，因而性能达到了最优。 <br><br><br>　　5.总结： <br>　　缺省情况下建立的索引是非群集索引，但有时它并不是最佳的；合理的索引设计要建立在对各种查询的分析和预测上。一般来说： <br><br>　　①.有大量重复值、且经常有范围查询 <br><br>　　（between, &gt;,&lt; ，&gt;=,&lt; =）和order by、group by发生的列，可考虑建立群集索引； <br><br>　　②.经常同时存取多列，且每列都含有重复值可考虑建立组合索引； <br><br>　　③.组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。</p>
<p><strong>二、不充份的连接条件</strong> <br><br>　　例：表card有7896行，在card_no上有一个非聚集索引，表account有191122行，在 account_no上有一个非聚集索引，试看在不同的表连接条件下，两个SQL的执行情况： <br>
<tbody>
</tbody>
</p>
<p class=code>select sum(a.amount) from account a, <br>card b where a.card_no = b.card_no（20秒）</p>
<p><br><br>　　将SQL改为： <br></p>
<p class=code>select sum(a.amount) from account a, <br>card b where a.card_no = b.card_no and a. <br>account_no=b.account_no（&lt; 1秒）</p>
<p><br>　　分析： <br>　　在第一个连接条件下，最佳查询方案是将account作外层表，card作内层表，利用card上的索引，其I/O次数可由以下公式估算为： <br>　　外层表account上的22541页+（外层表account的191122行*内层表card上对应外层表第一行所要查找的3页）=595907次I/O <br><br>　　在第二个连接条件下，最佳查询方案是将card作外层表，account作内层表，利用account上的索引，其I/O次数可由以下公式估算为： <br>　　外层表card上的1944页+（外层表card的7896行*内层表account上对应外层表每一行所要查找的4页）= 33528次I/O <br><br>　　可见，只有充份的连接条件，真正的最佳方案才会被执行。 <br><br><br>　　总结： <br>　　1.多表操作在被实际执行前，查询优化器会根据连接条件，列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表；内外表的选择可由公式：外层表中的匹配行数*内层表中每一次查找的次数确定，乘积最小为最佳方案。 <br><br>　　2.查看执行方案的方法-- 用set showplanon，打开showplan选项，就可以看到连接顺序、使用何种索引的信息；想看更详细的信息，需用sa角色执行dbcc(3604,310,302)。 <br><br><br><strong>三、不可优化的where子句</strong> <br><br>　　1.例：下列SQL条件语句中的列都建有恰当的索引，但执行速度却非常慢： <br></p>
<p class=code>select * from record where <br>substring(card_no,1,4)=''5378''(13秒) <br>select * from record where <br>amount/30&lt; 1000（11秒） <br>select * from record where <br>convert(char(10),date,112)=''19991201''（10秒）</p>
<p><br>　　分析： <br>　　where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的，因此它不得不进行表搜索，而没有使用该列上面的索引；如果这些结果在查询编译时就能得到，那么就可以被SQL优化器优化，使用索引，避免表搜索，因此将SQL重写成下面这样： <br></p>
<p class=code>select * from record where card_no like <br>''5378%''（&lt; 1秒） <br>select * from record where amount <br>&lt; 1000*30（&lt; 1秒） <br>select * from record where date= ''1999/12/01'' <br>（&lt; 1秒）</p>
<p><br>　　你会发现SQL明显快起来！ </p>
<p>　　2.例：表stuff有200000行，id_no上有非群集索引，请看下面这个SQL： <br></p>
<p class=code>select count(*) from stuff where id_no in(''0'',''1'')（23秒）</p>
<p>
<tbody>
</tbody>
<br>　　分析： <br>　　where条件中的''in''在逻辑上相当于''or''，所以语法分析器会将in (''0'',''1'')转化为id_no =''0'' or id_no=''1''来执行。我们期望它会根据每个or子句分别查找，再将结果相加，这样可以利用id_no上的索引；但实际上（根据 showplan）,它却采用了"OR策略"，即先取出满足每个or子句的行，存入临时数据库的工作表中，再建立唯一索引以去掉重复行，最后从这个临时表中计算结果。因此，实际过程没有利用id_no上索引，并且完成时间还要受tempdb数据库性能的影响。 <br><br>　　实践证明，表的行数越多ぷ鞅淼男阅芫驮讲睿眘tuff有620000行时，执行时间竟达到220秒！还不如将or子句分开： <br></p>
<p class=code>select count(*) from stuff where id_no=''0'' <br>select count(*) from stuff where id_no=''1''</p>
<p><br>　　得到两个结果，再作一次加法合算。因为每句都使用了索引，执行时间只有3秒，在620000行下，时间也只有4秒。或者，用更好的方法，写一个简单的存储过程： <br></p>
<p class=code>create proc count_stuff as <br>declare @a int <br>declare @b int <br>declare @c int <br>declare @d char(10) <br>begin <br>select @a=count(*) from stuff where id_no=''0'' <br>select @b=count(*) from stuff where id_no=''1'' <br>end <br>select @c=@a+@b <br>select @d=convert(char(10),@c) <br>print @d</p>
<p><br>　　直接算出结果，执行时间同上面一样快！ <br><br>　　总结：<br><br>　　可见，所谓优化即where子句利用了索引，不可优化即发生了表扫描或额外开销。 <br><br>　　1.任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。 <br><br>　　2.in、or子句常会使用工作表，使索引失效；如果不产生大量重复值，可以考虑把子句拆开；拆开的子句中应该包含索引。 <br><br>　　3.要善于使用存储过程，它使SQL变得更加灵活和高效。 <br><br>　　从以上这些例子可以看出，SQL优化的实质就是在结果正确的前提下，用优化器可以识别的语句，充份利用索引，减少表扫描的I/O次数，尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程，上述这些只是在应用层次的一种体现，深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。 </p>
<img src ="http://www.blogjava.net/larry/aggbug/116663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/larry/" target="_blank">larryjava</a> 2007-05-11 09:55 <a href="http://www.blogjava.net/larry/articles/116663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>