ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美激情另类校园,精品国产一区二区三区av性色,欧美日韩一二三区http://www.aygfsteel.com/larry/articles/140495.htmllarryjavalarryjavaTue, 28 Aug 2007 06:34:00 GMThttp://www.aygfsteel.com/larry/articles/140495.htmlhttp://www.aygfsteel.com/larry/comments/140495.htmlhttp://www.aygfsteel.com/larry/articles/140495.html#Feedback0http://www.aygfsteel.com/larry/comments/commentRss/140495.htmlhttp://www.aygfsteel.com/larry/services/trackbacks/140495.html阅读全文

larryjava 2007-08-28 14:34 发表评论
]]>
两个sql server数据库同步数æ?转脓) http://www.aygfsteel.com/larry/articles/132700.htmllarryjavalarryjavaFri, 27 Jul 2007 02:01:00 GMThttp://www.aygfsteel.com/larry/articles/132700.htmlhttp://www.aygfsteel.com/larry/comments/132700.htmlhttp://www.aygfsteel.com/larry/articles/132700.html#Feedback0http://www.aygfsteel.com/larry/comments/commentRss/132700.htmlhttp://www.aygfsteel.com/larry/services/trackbacks/132700.html  不是使用写sql 的方式来实现åQŒè€Œæ˜¯é‡‡ç”¨åQ?span>强制订阅实现数据库同步操作,大量和批量的数据可以用数据库的同步机制处理ã€?br>  
说明åQ?br>  为方便操ä½?所有操作均在发布服务器(分发服务å™?上操ä½?òq¶ä‹É用推模式åQŒåœ¨å®¢æˆ·æœºå™¨ä½¿ç”¨å¼ºåˆ¶è®¢é˜…方式ã€?br>
‹¹‹è¯•通过åQ?br>åQï¼1:环境
服务器环�
机器名称åQ?serverDB
操作¾pȝ»ŸåQšWindows 2000 Server
数据库版本:SQL 2000 Server 企业�

 

客户ç«?br>机器名称åQšJoy
操作¾pȝ»ŸåQšWindows 2000 Server
数据库版本:SQL 2000 Server 企业�br>
åQï¼2:建用户帐å?br>在服务器端徏立域用户帐号
我的电脑½Ž¡ç†->本地用户和组->用户->建立
UserNameåQšJoy
UserPwdåQšJoy

==3:重新启动服务器MSSQLServer
我的电脑->控制面版->½Ž¡ç†å·¥å…·->服务->MSSQLServer 服务
(更改为:域用户帐�我们新徏的joy用户 .\joy,密码:joy)

åQï¼4:安装分发服务å™?br>A:配置分发服务å™?br>工具->复制->配置发布、订阅服务器和分å?>下一æ­?>下一æ­?所有的均采用默认配¾|?
B:配置发布服务�br>工具->复制->创徏和管理发�>选择要发布的数据�pubs)->下一�>快照发布->下一�>
选择要发布的内容->下一�>下一�>下一�>完成
C:强制配置订阅服务�推模�拉模式与此雷�
工具->复制->配置发布、订阅服务器和分å?>订阅服务å™?>新徏->SQL Server数据åº?>输入客户端服务器名称(joy)->使用SQL Server íw«ä†¾éªŒè¯(sa,sa)->¼‹®å®š->应用->¼‹®å®š
D:初始化订�br>复制监视�>发布服务�serverDB)->双击订阅->强制新徏->下一�>选择启用的订阅服务器->joy->
下一�>下一�>下一�>下一�>完成

åQï¼6:‹¹‹è¯•数据
--在服务器执行:
选择表storesåQŒæ‰‹åŠ¨æˆ–è€…é€šè¿‡sql语句修改其中的数据,insert ,update ,delete均可ã€?br>
复制监视å™?>发布服务å™?serverDB)->->å¿«ç…§->启动代理½E‹åº
                                      ->ZLP:SZ(强制)->启动同步处理

åŽÀLŸ¥çœ‹åŒæ­¥çš„ joy:stores 是否插入了一条新的记å½?/p>

‹¹‹è¯•完毕åQŒé€šè¿‡ã€?/p>

åQï¼7修改数据库的同步旉™—´,一般选择夜晚执行数据库同步处ç?br>(具体操作ç•? :D


〔注意说明�/strong>
服务器一端不能以(local)˜q›è¡Œæ•°æ®çš„发布与分发,需要先删除注册åQŒç„¶åŽæ–°å»ºæ³¨å†Œæœ¬åœ°è®¡½Ž—机名称

卸蝲方式åQšå·¥å…?>复制->¼›æ­¢å‘布->是在"ZehuaDb"上静止发å¸?卸蝲所有的数据库同步配¾|®æœåС噍

注意åQšå‘布服务器、分发服务器中的SQLServerAgent服务必须启动
      采用推模å¼? "D:\Microsoft SQL Server\MSSQL\REPLDATA\unc" 目录文äšg可以不设¾|®å…±äº?br>      拉模å¼?则需要共享~!

ž®‘量数据库同步可以采用触发器实现,同步单表卛_¯ã€?br>
åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQ?br>配置˜q‡ç¨‹ä¸­å¯èƒ½å‡ºçŽ°çš„é—®é¢˜

在SQL Server 2000里设¾|®å’Œä½¿ç”¨æ•°æ®åº“复制之前,应先‹‚€æŸ¥ç›¸å…³çš„几台SQL Server服务器下面几ç‚ÒŽ˜¯å¦æ»¡­‘»I¼š
   
    1、MSSQLserverå’ŒSqlserveragent服务是否是以域用戯‚ínä»½å¯åŠ¨åÆˆ˜qè¡Œçš„(.\administrator用户也是可以的)
   
        如果ç™Õd½•用的是本地系¾lŸå¸æˆ·localåQŒå°†ä¸å…·å¤‡ç½‘¾lœåŠŸèƒ½ï¼Œä¼šäñ”生以下错è¯?
       
        ˜q›ç¨‹æœªèƒ½˜qžæŽ¥åˆ°Distributor '@Server name'
       
      (如果您的服务器已¾lç”¨äº†SQL Server全文‹‚€ç´¢æœåŠ? 请不要修改MSSQLserverå’ŒSqlserveragent服务的local启动ã€?br>       会照成全文检索服务不能用。请换另外一台机器来做SQL Server 2000里复制中的分发服务器ã€?   
       
      ä¿®æ”¹æœåŠ¡å¯åŠ¨çš„ç™»å½•ç”¨æˆøP¼Œéœ€è¦é‡æ–°å¯åЍMSSQLserverå’ŒSqlserveragent服务才能生效ã€?nbsp;  
       
    2、检查相关的几台SQL Server服务器是否改˜q‡å¿U?需要srvid=0的本地机器上srvnameå’Œdatasource一æ ?
   
       在查询分析器里执è¡?
         use master
         select srvid,srvname,datasource from sysservers   
        
       如果没有srvid=0或者srvid=0åQˆä¹Ÿž®±æ˜¯æœ¬æœºå™¨ï¼‰ä½†srvnameå’Œdatasource不一æ ? 需要按如下æ–ÒŽ³•修改:

  USE master
        GO
        -- 讄¡½®ä¸¤ä¸ªå˜é‡
        DECLARE @serverproperty_servername  varchar(100),
                @servername    varchar(100)
        -- 取得Windows NT 服务器和与指定的 SQL Server 实例兌™”的实例信æ?br>        SELECT @serverproperty_servername = CONVERT(varchar(100), SERVERPROPERTY('ServerName'))
        -- ˜q”回˜qè¡Œ Microsoft SQL Server 的本地服务器名称
        SELECT @servername = CONVERT(varchar(100), @@SERVERNAME)
        -- 昄¡¤ºèŽ·å–çš„è¿™ä¸¤ä¸ªå‚æ•°
        select @serverproperty_servername,@servername
        --如果@serverproperty_servernameå’Œ@servername不同(å› äØ“ä½ æ”¹˜q‡è®¡½Ž—机名字),再运行下面的
        --删除错误的服务器å?br>        EXEC sp_dropserver @server=@servername
        --æ·ÕdŠ æ­£ç¡®çš„æœåŠ¡å™¨å?br>        EXEC sp_addserver @server=@serverproperty_servername, @local='local'

修改˜q™é¡¹å‚æ•°åQŒéœ€è¦é‡æ–°å¯åЍMSSQLserverå’ŒSqlserveragent服务才能生效ã€?nbsp;  
      
       ˜q™æ ·ä¸€æ¥å°±ä¸ä¼šåœ¨åˆ›å»ºå¤åˆ¶çš„˜q‡ç¨‹ä¸­å‡ºçŽ?8482ã€?8483错误了ã€?br>
3、检查SQL Server企业½Ž¡ç†å™¨é‡Œé¢ç›¸å…³çš„几台SQL Server注册名是否和上面½W¬äºŒç‚šw‡Œä»‹ç»çš„srvname一æ ?br>   
        不能用IP地址的注册名ã€?br>       
      åQˆæˆ‘们可以删掉IP地址的注册,新徏以SQL Server½Ž¡ç†å‘˜çñ”别的用户注册的服务器名)
       
       ˜q™æ ·ä¸€æ¥å°±ä¸ä¼šåœ¨åˆ›å»ºå¤åˆ¶çš„˜q‡ç¨‹ä¸­å‡ºçŽ?4010ã€?0084ã€?8456ã€?8482ã€?8483错误了ã€?nbsp;  
       
    4、检查相关的几台SQL Server服务器网¾lœæ˜¯å¦èƒ½å¤Ÿæ­£å¸¸è®¿é—?br>   
        如果pingä¸ÀLœºIP地址可以åQŒä½†pingä¸ÀLœºåä¸é€šçš„æ—¶å€™ï¼Œéœ€è¦åœ¨   
       
            winnt\system32\drivers\etc\hosts   (WIN2000)
            windows\system32\drivers\etc\hosts (WIN2003)
           
               æ–‡äšg里写入数据库服务器IP地址和主机名的对应关¾p…R€?br>               
 ä¾‹å¦‚åQ?nbsp;   
               

           127.0.0.1       localhost
           192.168.0.35    oracledb    oracledb
           192.168.0.65    fengyu02    fengyu02
           202.84.10.193   bj_db       bj_db   

 æˆ–者在SQL Server客户端网¾lœå®žç”¨å·¥å…·é‡Œå»ºç«‹åˆ«ååQŒä¾‹å¦?


     5、系¾lŸéœ€è¦çš„æ‰©å±•存储˜q‡ç¨‹æ˜¯å¦å­˜åœ¨(如果不存在,需要恢å¤?:

         sp_addextendedproc 'xp_regenumvalues',@dllname ='xpstar.dll'
         go
         sp_addextendedproc 'xp_regdeletevalue',@dllname ='xpstar.dll'
         go
         sp_addextendedproc 'xp_regdeletekey',@dllname ='xpstar.dll'
         go             
         sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll' 

     接下来就可以用SQL Server企业½Ž¡ç†å™¨é‡Œ[复制]-> 右键选择
        ->[配置发布、订阅服务器和分发]的图形界面来配置数据库复制了



]]>
sql Server性能优化(转脓) http://www.aygfsteel.com/larry/articles/132699.htmllarryjavalarryjavaFri, 27 Jul 2007 02:00:00 GMThttp://www.aygfsteel.com/larry/articles/132699.htmlhttp://www.aygfsteel.com/larry/comments/132699.htmlhttp://www.aygfsteel.com/larry/articles/132699.html#Feedback0http://www.aygfsteel.com/larry/comments/commentRss/132699.htmlhttp://www.aygfsteel.com/larry/services/trackbacks/132699.html1ã€?用程序中åQŒä¿è¯åœ¨å®žçŽ°åŠŸèƒ½çš„åŸº¼‹€ä¸Šï¼Œž®½é‡å‡å°‘å¯ÒŽ•°æ®åº“的访问次敎ͼ›é€šè¿‡æœçƒ¦å‚æ•°åQŒå°½é‡å‡ž®‘对表的讉K—®è¡Œæ•°,最ž®åŒ–¾l“果集,从而减è½È½‘¾lœè´Ÿæ‹…;能够分开的操作尽量分开处理åQŒæé«˜æ¯‹Æ¡çš„响应速度åQ›åœ¨æ•°æ®½H—口使用SQLæ—Óž¼Œž®½é‡æŠŠä‹É用的索引攑֜¨é€‰æ‹©çš„首列;½Ž—法的结构尽量简单;在查询时åQŒä¸è¦è¿‡å¤šåœ°ä½¿ç”¨é€šé…½W¦å¦‚SELECT * FROM T1语句åQŒè¦ç”¨åˆ°å‡ åˆ—ž®±é€‰æ‹©å‡ åˆ—如:SELECT COL1,COL2 FROM T1åQ›åœ¨å¯èƒ½çš„æƒ…况下ž®½é‡é™åˆ¶ž®½é‡¾l“果集行数如åQšSELECT TOP 300 COL1,COL2,COL3 FROM T1,å› äØ“æŸäº›æƒ…å†µä¸‹ç”¨æˆäh˜¯ä¸éœ€è¦é‚£ä¹ˆå¤šçš„æ•°æ®çš„。不要在应用中ä‹É用数据库游标åQŒæ¸¸æ ‡æ˜¯éžå¸¸æœ‰ç”¨çš„工典P¼Œä½†æ¯”使用常规的、面向集的SQL语句需要更大的开销åQ›æŒ‰ç…§ç‰¹å®šé¡ºåºæå–数据的查找ã€?/p>

2ã€?nbsp;  避免使用不兼容的数据¾cÕdž‹ã€‚例如floatå’Œint、charå’Œvarchar、binaryå’Œvarbinary是不兼容的。数据类型的不兼容可能ä‹É优化器无法执行一些本来可以进行的优化操作。例å¦?
SELECT name FROM employee WHERE salary åQ?60000
在这条语句中,如salary字段是money型的,则优化器很难对其˜q›è¡Œä¼˜åŒ–,因䨓60000是个整型数。我们应当在¾~–ç¨‹æ—¶å°†æ•´åž‹è½¬åŒ–æˆäØ“é’±å¸åž?而不要等到运行时转化ã€?

3ã€?nbsp;  ž®½é‡é¿å…åœ¨WHERE子句中对字段˜q›è¡Œå‡½æ•°æˆ–表辑ּæ“ä½œåQŒè¿™ž®†å¯¼è‡´å¼•擎放弃ä‹É用烦引而进行全表扫描。如åQ?
SELECT * FROM T1 WHERE F1/2=100
应改�
SELECT * FROM T1 WHERE F1=100*2

SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改�
SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’

SELECT member_number, first_name, last_name  FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改�
SELECT member_number, first_name, last_name  FROM members
WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
卻I¼šä»ÖM½•对列的操作都ž®†å¯¼è‡´è¡¨æ‰«æåQŒå®ƒåŒ…括数据库函数、计½Ž—表辑ּ½{‰ç­‰åQŒæŸ¥è¯¢æ—¶è¦å°½å¯èƒ½ž®†æ“ä½œç§»è‡³ç­‰å·å³è¾V€?/p>

4ã€?nbsp;  避免使用!=或<åQžã€IS NULL或IS NOT NULL、IN åQŒNOT IN½{‰è¿™æ ïLš„æ“ä½œ½W?因䨓˜q™ä¼šä½¿ç³»¾lŸæ— æ³•ä‹É用烦å¼?而只能直接搜索表中的数据。例å¦?
SELECT id FROM employee WHERE id != 'B%'
优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行ã€?br> 
5ã€?nbsp;  ž®½é‡ä½¿ç”¨æ•°å­—型字ŒDµï¼Œä¸€éƒ¨åˆ†å¼€å‘äh员和数据库管理äh员喜‹Æ¢æŠŠåŒ…含数å€ég¿¡æ¯çš„字段
设计为字½W¦åž‹åQŒè¿™ä¼šé™ä½ŽæŸ¥è¯¢å’Œ˜qžæŽ¥çš„æ€§èƒ½åQŒåƈ会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字½W¦ï¼Œè€Œå¯¹äºŽæ•°å­—型而言只需要比较一‹Æ¡å°±å¤Ÿäº†ã€?/p>

6ã€?nbsp;  合理使用EXISTS,NOT EXISTS子句。如下所½Cºï¼š
1.SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
  SELECT * FROM T2 WHERE T2.C2=T1.C2)
两者äñ”生相同的¾l“æžœåQŒä½†æ˜¯åŽè€…的效率昄¡„¶è¦é«˜äºŽå‰è€…。因为后者不会äñ”生大量锁定的表扫描或是烦引扫描ã€?br>如果你想校验表里是否存在某条¾Uªå½•åQŒä¸è¦ç”¨count(*)那样效率很低åQŒè€Œä¸”‹¹ªè´¹æœåŠ¡å™¨èµ„æºã€‚å¯ä»¥ç”¨EXISTS代替。如åQ?br>IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
可以写成åQ?br>IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')

¾lå¸¸éœ€è¦å†™ä¸€ä¸ªT_SQL语句比较一个父¾l“果集和子结果集åQŒä»Žè€Œæ‰¾åˆ°æ˜¯å¦å­˜åœ¨åœ¨çˆ¶ç»“果集中有而在子结果集中没有的记录åQŒå¦‚åQ?br>1.SELECT a.hdr_key  FROM hdr_tbl a---- tbl a 表示tbl用别名a代替
WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key)

2.SELECT a.hdr_key  FROM hdr_tbl a
LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key  WHERE b.hdr_key IS NULL

3.SELECT hdr_key  FROM hdr_tbl
WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)
      三种写法都可以得到同æ äh­£¼‹®çš„¾l“æžœåQŒä½†æ˜¯æ•ˆçŽ‡ä¾‹Æ¡é™ä½Žã€?/p>

7ã€?nbsp;  ž®½é‡é¿å…åœ¨çƒ¦å¼•过的字½W¦æ•°æ®ä¸­åQŒä‹É用非打头字母搜烦。这也ä‹É得引擎无法利用烦引ã€?nbsp;
见如下例子:
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
SELECT * FROM T1 WHERE NAME LIKE ‘L%’
即ä‹ÉNAME字段建有索引åQŒå‰ä¸¤ä¸ªæŸ¥è¯¢ä¾ç„¶æ— æ³•利用索引完成加快操作åQŒå¼•擎不得不对全表所有数据逐条操作来完成ä“Q务。而第三个查询能够使用索引来加快操作ã€?/p>

8ã€?nbsp;  分利用连接条ä»Óž¼Œåœ¨æŸ¿Uæƒ…况下åQŒä¸¤ä¸ªè¡¨ä¹‹é—´å¯èƒ½ä¸åªä¸€ä¸ªçš„˜qžæŽ¥æ¡äšgåQŒè¿™æ—¶åœ¨  WHERE 子句中将˜qžæŽ¥æ¡äšg完整的写上,有可能大大提高查询速度ã€?br>例:
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO  AND A.ACCOUNT_NO=B.ACCOUNT_NO
½W¬äºŒå¥å°†æ¯”第一句执行快得多ã€?/p>

9ã€?nbsp;   消除对大型表行数据的™åºåºå­˜å–
      ž®½ç®¡åœ¨æ‰€æœ‰çš„‹‚€æŸ¥åˆ—上都有烦引,但某些åŞ式的WHEREå­å¥å¼ø™¿«ä¼˜åŒ–器ä‹É用顺序存取。如åQ?br>SELECT * FROM orders WHERE (customer_num=104  AND order_num>1001) OR
order_num=1008
解决办法可以使用òq‰™›†æ¥é¿å…é¡ºåºå­˜å–:
SELECT åQ?FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT åQ?FROM orders WHERE order_num=1008
˜q™æ ·ž®Þpƒ½åˆ©ç”¨ç´¢å¼•路径处理查询ã€?/p>

10ã€?避免困难的正规表辑ּ
      LIKE关键字支持通配½W¦åŒ¹é…ï¼ŒæŠ€æœ¯ä¸Šå«æ­£è§„表辑ּã€‚但˜q™ç§åŒšw…ç‰¹åˆ«è€—费旉™—´ã€‚例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即ä‹É在zipcode字段上徏立了索引åQŒåœ¨˜q™ç§æƒ…况下也˜q˜æ˜¯é‡‡ç”¨™åºåºæ‰«æçš„æ–¹å¼ã€‚如
æžœæŠŠè¯­å¥æ”¹äØ“SELECT åQ?FROM customer WHERE zipcode >“98000”åQŒåœ¨æ‰§è¡ŒæŸ¥è¯¢
时就会利用烦引来查询åQŒæ˜¾ç„¶ä¼šå¤§å¤§æé«˜é€Ÿåº¦ã€?br>11ã€?使用视图加速查è¯?br>æŠŠè¡¨çš„ä¸€ä¸ªå­é›†è¿›è¡ŒæŽ’åºåÆˆåˆ›å¾è§†å›¾åQŒæœ‰æ—¶èƒ½åŠ é€ŸæŸ¥è¯¢ã€‚å®ƒæœ‰åŠ©äºŽé¿å…å¤šé‡æŽ’åº?br>操作åQŒè€Œä¸”在其他方面还能简化优化器的工作。例如:
SELECT cust.nameåQŒrcvbles.balanceåQ?#8230;…other columns
FROM custåQŒrcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
如果˜q™ä¸ªæŸ¥è¯¢è¦è¢«æ‰§è¡Œå¤šæ¬¡è€Œä¸æ­¢ä¸€‹Æ¡ï¼Œå¯ä»¥æŠŠæ‰€æœ‰æœªä»˜æ¬¾çš„客æˆäh‰¾å‡ºæ¥æ”‘Öœ¨ä¸€ä¸?br>视图中,òq¶æŒ‰å®¢æˆ·çš„名字进行排序:
CREATE VIEW DBO.V_CUST_RCVLBES
AS
SELECT cust.nameåQŒrcvbles.balanceåQ?#8230;…other columns
FROM custåQŒrcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name

然后以下面的方式在视图中查询åQ?
SELECT åQ?FROM  V_CUST_RCVLBES
WHERE postcode>“98000”
视图中的行要比主表中的行ž®‘,而且物理™åºåºž®±æ˜¯æ‰€è¦æ±‚的顺序,减少了磁ç›?br>I/OåQŒæ‰€ä»¥æŸ¥è¯¢å·¥ä½œé‡å¯ä»¥å¾—到大幅减少ã€?/p>

12�能够用BETWEEN的就不要用IN
SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)
æ”ÒŽˆåQ?br>SELECT * FROM T1 WHERE ID BETWEEN 10 AND 14
因䨓IN会ä‹É¾pȝ»Ÿæ— æ³•使用索引,而只能直接搜索表中的数据ã€?/p>

13�DISTINCT的就不用GROUP BY
      SELECT OrderID  FROM Details WHERE UnitPrice > 10 GROUP BY OrderID
      可改为:
      SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10
     

14ã€?nbsp;  部分利用索引
      1.SELECT employeeID, firstname, lastname
FROM names
WHERE dept = 'prod' or city = 'Orlando' or division = 'food'

      2.SELECT employeeID, firstname, lastname FROM names WHERE dept = 'prod'
UNION ALL
SELECT employeeID, firstname, lastname FROM names WHERE city = 'Orlando'
UNION ALL
SELECT employeeID, firstname, lastname FROM names WHERE division = 'food'
如果dept 列徏有烦引则查询2可以部分利用索引åQŒæŸ¥è¯?则不能ã€?/p>

15ã€?nbsp;  能用UNION  ALLž®×ƒ¸è¦ç”¨UNION
UNION  ALL不执行SELECT DISTINCT函数åQŒè¿™æ ·å°±ä¼šå‡ž®‘很多不必要的资æº?/p>

16ã€?nbsp;  不要写一些不做ä“Q何事的查è¯?br>如:SELECT COL1 FROM T1 WHERE 1=0
    SELECT COL1 FROM T1 WHERE COL1=1 AND COL1=2
˜q™ç±»æ­È ä¸ä¼š˜q”回ä»ÖM½•¾l“果集,但是会消耗系¾lŸèµ„源ã€?/p>

17ã€?nbsp; ž®½é‡ä¸è¦ç”¨SELECT INTO语句ã€?br>SELECT INOT 语句会导致表锁定åQŒé˜»æ­¢å…¶ä»–用戯‚®¿é—®è¯¥è¡¨ã€?/p>

18�必要时强制查询优化器使用某个索引
     SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45)
æ”ÒŽˆåQ?br>SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND processid IN (8,32,45)
则查询优化器ž®†ä¼šå¼ø™¡Œåˆ©ç”¨ç´¢å¼•IX_ProcessID 执行查询ã€?br>    
19ã€?nbsp; 虽然UPDATE、DELETE语句的写法基本固定,但是˜q˜æ˜¯å¯¹UPDATE语句¾l™ç‚¹å»ø™®®åQ?br>a) ž®½é‡ä¸è¦ä¿®æ”¹ä¸»é”®å­—段ã€?br>b) 当修改VARCHAR型字ŒD‰|—¶åQŒå°½é‡ä‹É用相同长度内容的å€ég»£æ›Ñ€?br>c) ž®½é‡æœ€ž®åŒ–对于含有UPDATE触发器的表的UPDATE操作ã€?br>d) 避免UPDATEž®†è¦å¤åˆ¶åˆ°å…¶ä»–数据库的列ã€?br>e) 避免UPDATE建有很多索引的列ã€?br>f) 避免UPDATE在WHERE子句条äšg中的列ã€?/p>


上面我们提到的是一些基本的提高查询速度的注意事™å?但是在更多的情况ä¸?往往需要反复试验比较不同的语句以得到最ä½Ïx–¹æ¡ˆã€‚最好的æ–ÒŽ³•当然是测试,看实现相同功能的SQL语句哪个执行旉™—´æœ€ž®‘,但是数据库中如果数据量很ž®‘,是比较不出来的,˜q™æ—¶å¯ä»¥ç”¨æŸ¥çœ‹æ‰§è¡Œè®¡åˆ’,卻I¼šæŠŠå®žçŽ°ç›¸åŒåŠŸèƒ½çš„å¤šæ¡SQL语句考到查询分析器,按CTRL+L看查所利用的烦引,表扫描次敎ͼˆ˜q™ä¸¤ä¸ªå¯¹æ€§èƒ½å½±å“æœ€å¤§ï¼‰åQŒæ€ÖM½“上看询成本百分比卛_¯ã€?br>½Ž€å•的存储˜q‡ç¨‹å¯ä»¥ç”¨å‘坯D‡ªåŠ¨ç”Ÿæˆï¼šåœ¨ä¼ä¸šç®¡ç†å™¨å·¥å…·æ ç‚¹å‡»è¿è¡Œå‘å¯¼å›¾æ ‡ï¼Œç‚¹å‡»”数据åº?#8221;ã€?#8221;创徏存储˜q‡ç¨‹å‘导”。复杂存储过½E‹çš„调试åQšåœ¨æŸ¥è¯¢åˆ†æžå™¨å·¦è¾¹çš„对象‹¹è§ˆå™¨ï¼ˆæ²¡æœ‰åQŸæŒ‰F8åQ‰é€‰æ‹©è¦è°ƒè¯•的存储˜q‡ç¨‹,点右键,点调试,输入参数执行åQŒå‡ºçŽîC¸€ä¸ªæÕQ动工å…äh¡åQŒä¸Šé¢æœ‰å•步执行åQŒæ–­ç‚¹è®¾¾|®ç­‰ã€?/p>

]]>
【è{载】oracle备䆾与恢复精华资æ–?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/larry/articles/121745.html</guid><wfw:comment>http://www.aygfsteel.com/larry/comments/121745.html</wfw:comment><comments>http://www.aygfsteel.com/larry/articles/121745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/larry/comments/commentRss/121745.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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>òq›_°çš?/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>、需要的数据åQ?/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>、恢复过½E‹ï¼š</span><font face="Times New Roman"><span><span>................................................................................................... </span></span><span>5</span></font></font></p> <p><font size=3><span>例子åQšï¼ˆ¾|‘上原资料)</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>    </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>    </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> </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>冷备份具有很多优良特性,快速,方便åQŒä»¥åŠé«˜æ•ˆã€‚一‹Æ¡å®Œæ•´çš„冷备份步骤是åQ?/span></font></p> <p><span><font face=宋体>  </font></span><span>1</span><span><font face=宋体>åQŒé¦–先关闭数据库åQ?/font></span><span>shutdown normal</span><font face=宋体><span>åQ?/span></font></p> <p><span><font face=宋体>  </font></span><span>2</span><font face=宋体><span>åQŒæ‹·è´ç›¸å…Ïx–‡ä»¶åˆ°å®‰å…¨åŒºåŸŸåQˆåˆ©ç”¨æ“ä½œç³»¾lŸå‘½ä»¤æ‹·è´æ•°æ®åº“的所有的数据文äšg、日志文件、控制文件、参数文件、口令文件等åQˆåŒ…括èµ\径)åQ?/span></font></p> <p><span><font face=宋体>  </font></span><span>3</span><span><font face=宋体>åQŒé‡æ–°å¯åŠ¨æ•°æ®åº“åQ?/font></span><span>startup</span><font face=宋体><span>åQ?/span></font></p> <p><font face=宋体><span>  以上的步骤可以用一个脚本来完成操作åQ?/span></font></p> <p><span>      su – oracle < sqlplus /nolog <br>      connect / as sysdba<br>      shutdown immediate;<br>      !cp </span><span><font face=宋体>æ–‡äšg</font></span><span>   </span><span><font face=宋体>备䆾位置åQˆæ‰€æœ‰çš„æ—¥å¿—、数据、控制及参数文äšgåQ?/font></span><span>;<br>      startup;<br>      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>恢复的时候,相对比较½Ž€å•了åQŒæˆ‘停掉数据库,ž®†æ–‡ä»¶æ‹·è´å›žç›¸åº”位置åQŒé‡å¯æ•°æ®åº“ž®±å¯ä»¥äº†åQŒå½“然也可以用脚本来完成ã€?/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>当需要做一个精度比较高的备份,而且我们的数据库不可能停掉(ž®‘许讉K—®é‡ï¼‰æ—Óž¼Œ˜q™ä¸ªæƒ…况下,我们ž®±éœ€è¦å½’档方式下的备份,ž®±æ˜¯ä¸‹é¢è®¨è®ºçš„热备䆾。热备䆾可以非常¾_„¡¡®çš„备份表½Iºé—´¾U§å’Œç”¨æˆ·¾U§çš„æ•°æ®åQŒç”±äºŽå®ƒæ˜¯æ ¹æ®å½’档日志的旉™—´è½´æ¥å¤‡ä†¾æ¢å¤çš„,理论上可以恢复到前一个操作,甚至ž®±æ˜¯å‰ä¸€¿U’的操作。具体步骤如下:</span></font></p> <p><span><font face=宋体>  </font></span><span>1</span><span><font face=宋体>åQŒé€šè¿‡è§†å›¾</font></span><span>v$database,</span><span><font face=宋体>查看数据库是否在</font></span><span>Archive</span><span><font face=宋体>模式ä¸?/font></span><span>:<br><br>        SQL> 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=宋体>  则设定数据库˜qè¡ŒäºŽå½’档模式下åQ?/font></span><span>SQL>shutdown immediate<br><br>        SQL>startup mount<br>        SQL> alter database archivelog;<br>        SQL> alter database open;<br><br></span><span><font face=宋体>  如果</font></span><span>Automaticarchival</span><span><font face=宋体>昄¡¤ºä¸?/font></span><span>“Enabled”</span><span><font face=宋体>åQŒåˆ™æ•°æ®åº“å½’æ¡£æ–¹å¼äØ“è‡ªåŠ¨å½’æ¡£ã€‚å¦åˆ™éœ€è¦æ‰‹å·¥å½’æ¡£ï¼Œæˆ–è€…å°†å½’æ¡£æ–¹å¼ä¿®æ”¹ä¸ø™‡ªåŠ¨å½’æ¡£ï¼Œå¦‚ï¼š</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>        SQL>shutdown immediate<br><br></span><span><font face=宋体>  修改</font></span><span>init.ora</span><span><font face=宋体>åQ?/font></span><span><br><br>        LOG_ARCHIVE_START=TRUE<br>        LOG_ARCHIVE_DEST1=ORACLE_HOME/admin/o816/arch(</span><span><font face=宋体>归档日值存放位¾|®å¯ä»¥è‡ªå·±å®šä¹?/font></span><span>)<br>        SQL>startup<br><br></span><span><font face=宋体>  然后åQŒé‡æ–°å¯åŠ¨æ•°æ®åº“åQŒæ­¤æ—?/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=宋体>是指定的归档日志文äšgçš„èµ\å¾„ï¼Œå»ø™®®ä¸?/font></span><span>Oracle</span><span><font face=宋体>数据库文件存在不同的¼‹¬ç›˜åQŒä¸€æ–šw¢å‡å°‘¼‚ç›˜</font></span><span>I/O</span><span><font face=宋体>竞争åQŒå¦å¤–一斚w¢ä¹Ÿå¯ä»¥é¿å…æ•°æ®åº“æ–‡äšg所在硬盘毁坏之后的文äšg丢失。归档èµ\径也可以直接指定为磁带等其它物理存储讑֤‡åQŒä½†å¯èƒ½è¦è€ƒè™‘è¯Õd†™é€Ÿåº¦ã€å¯å†™æ¡ä»¶å’Œæ€§èƒ½½{‰å› ç´ ã€?/font></span><span>       </span></p> <p><span><font face=宋体>  注意åQšå½“数据库处åœ?/font></span><span>ARCHIVE</span><span><font face=宋体>模式下时åQŒä¸€å®šè¦ä¿è¯æŒ‡å®šçš„å½’æ¡£èµ\å¾„å¯å†™ï¼Œå¦åˆ™æ•°æ®åº“å°±ä¼šæŒ‚èµøP¼Œç›´åˆ°èƒ½å¤Ÿå½’档所有归档信息后才可以ä‹É用。另外,为创å»ÞZ¸€ä¸ªæœ‰æ•ˆçš„备䆾</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>å› äØ“è¯¥å¤‡ä»½æä¾›äº†ä¸€ä¸ªæ‰€æœ‰æ•°æ®åº“æ–‡äšg的拷贝。(体现了冷备䆾与热备䆾的合作关¾p»ï¼Œä»¥åŠå¼ºå¤§çš„能力)</span></font></p> <p><span><font face=宋体>  </font></span><span>2</span><span><font face=宋体>åQŒå¤‡ä»½è¡¨½Iºé—´æ–‡äšgåQ?/font></span><span> </span></p> <p><span>        a,</span><span><font face=宋体>首先åQŒä¿®æ”¹è¡¨½Iºé—´æ–‡äšg为备份模å¼?/font></span><span>  ALTER TABLESPACE tablespace_name BEGIN BACKUP;</span></p> <p><span>        b,</span><span><font face=宋体>然后åQŒæ‹·è´è¡¨½Iºé—´æ–‡äšg到安全区åŸ?/font></span><span> !CP tablespace_name D_PATH;</span></p> <p><span>        c,</span><span><font face=宋体>最后,ž®†è¡¨½Iºé—´çš„备份模式关é—?/font></span><span>    ALTER TABLESPACE tablespace_name END BACKUP;</span></p> <p><span><font face=宋体>  </font></span><span>3</span><font face=宋体><span>åQŒå¯¹å½’档日志文äšg的备份:</span></font></p> <p><span>        </span><span><font face=宋体>停止归档˜q›ç¨‹åQï¼</font></span><span>></span><span><font face=宋体>备䆾归档日志文äšgåQï¼</font></span><span>></span><font face=宋体><span>启动归档˜q›ç¨‹</span></font></p> <p><span>        </span><span><font face=宋体>如果日志文档比较多,我们ž®†å®ƒä»¬å†™å…¥ä¸€ä¸ªæ–‡ä»¶æˆä¸ÞZ¸€ä¸ªæ¢å¤çš„参考:</font></span><span>$   files `ls <</span><span><font face=宋体>归档文äšg路径</font></span><span>>/arch*.dbf`;export files</span></p> <p><span><font face=宋体>  </font></span><span>4</span><span><font face=宋体>åQŒå¤‡ä»½æŽ§åˆ¶æ–‡ä»?/font></span><span>:<br><br>        SQL> alter database backup controlfile to 'controlfile_back_name</span><span><font face=宋体>åQˆä¸€èˆ¬ç”¨</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=宋体>  当然åQŒæˆ‘们也可以ž®†ä¸Šé¢çš„ä¸œä¸œå†™äØ“ä¸€ä¸ªè„šæœ¬ï¼Œåœ¨éœ€è¦çš„æ—¶å€™æ‰§è¡Œå°±å¯ä»¥äº?/font></span><span>:</span></p> <p><font face=宋体><span>  脚本范例åQ?/span></font></p> <p><span>        su – oracle < sqlplus /nolog <br>        connect / as sysdba<br>        ALTER TABLESPACE tablespace_name BEGIN BACKUP</span></p> <p><span>        !CP tablespace_name D_PATH</span></p> <p><span>        ALTER TABLESPACE tablespace_name END BACKUP<br>   <br>        alter database backup controlfile to 'controlfile_back_name</span><span><font face=宋体>åQˆä¸€èˆ¬ç”¨</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>        !files `ls <</span><span><font face=宋体>归档文äšg路径</font></span><span>>/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>  热备份的恢复åQŒå¯¹äºŽå½’档方式数据库的恢复要求不但有有效的日志备份还</span><span>要求有一个在归档方式下作的有效的全库备䆾</span><span>。归档备份在理论上可以无数据丢失åQŒä½†æ˜¯å¯¹äºŽç¡¬ä»¶ä»¥åŠæ“ä½œäh员的要求都比较高。在我们使用归档方式备䆾的时候,全库物理备䆾也是非常重要的。归档方式下数据库的恢复要求从全备䆾到失败点所有的日志都要完好无缺ã€?/span></font><span><br><br>        </span><span><font face=宋体>恢复步骤åQ?/font></span><span>LOG_ARCHIVE_DEST_1<br>                     shutdown</span><span><font face=宋体>数据库ã€?/font></span><span><br>                     </span><span><font face=宋体>ž®†å…¨å¤‡ä†¾çš„æ•°æ®æ–‡ä»¶æ”¾åˆ°åŽŸæ¥ç³»¾lŸçš„目录中ã€?/font></span><span><br>                     </span><span><font face=宋体>ž®†å…¨å¤‡ä†¾åˆ°å¤±è´¥ç‚¹çš„æ‰€æœ‰å½’档日志放到参æ•?/font></span><span>LOG_ARCHIVE_DEST_1</span><span><font face=宋体>所指定的位¾|®ã€?/font></span><span><br>                     </span><span><font face=宋体>利用</font></span><span>sqlplus</span><span><font face=宋体>登陆到空实例。(</font></span><span>connect / as sysdba</span><span><font face=宋体>åQ?/font></span><span><br>                     </span><span><font face=宋体>然后</font></span><span>  startup mount<br>                            set autorecovery on<br>                            recover database;<br>                            alter database open;</span></p> <p><font face=宋体><span>˜q™æ ·åQŒçƒ­æ¢å¤ž®Þq®—完工ã€?/span></font></p> <h2><a name=_Toc134852040></a><a name=_Toc132594704><span><span><font face=Arial>Windows</font></span></span></a><span><span><span>òq›_°çš?/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>çùN𾿁¢å¤å¾ˆç®€å•ã€?/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>、需要的数据åQ?/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>å¼ø™¡Œå…³é—­åQ‰ï¼Œå®žæ–½ä¸€ä¸ªæ–‡ä»¶çñ”备䆾åQŒå¤‡ä»½å…¨éƒ¨çš„<span>Oracle</span>相关文äšgåQŒåŒ…æ‹?span>Windows</span>¾pȝ»Ÿæ–‡äšgåQŒç³»¾lŸçŠ¶æ€å’Œ<span>Oracle</span>½E‹åºæ–‡äšg和数据文件等内容ã€?/span></font></p> <p><span><font face=宋体>˜q™ä¸ªå†·å¤‡ä»½å¯¹äºŽå¿«é€Ÿæ¢å¤?span>Oracle</span>数据库系¾lŸéžå¸¸å…³é”®ï¼Œå¦‚果没有它,¾pȝ»Ÿè¢«ç ´ååŽåªèƒ½é‡æ–°å®‰è£…再恢复,˜q™è¦æ¯”直接恢复冷备䆾慢得多,也更复杂ã€?/font></span></p> <p><span><font face=宋体>每当数据库或表单的物理结构或逻辑¾l“æž„æœ‰å˜åŒ–æ—¶éƒ½åº”è¯¥é‡æ–°åˆ›å»ø™¿™ä¸ªå†·å¤‡ä†¾ã€?/font></span></p> <p><font face=宋体><span>2. FULL ONLINE</span><span>备䆾</span></font></p> <p><span><font face=宋体>˜q™ä¸ªå¤‡ä†¾è¦é€šè¿‡<span>Backup Exec Agent for Oracle Server</span>来完成,要备份全部表½Iºé—´åQŒå½’档日志和控制文äšgåQŒé€šè¿‡˜q™ç§æ–¹å¼å¤‡ä†¾åQ?span>Oracle</span>会将所有缓存内容写入文ä»Óž¼Œž®?span>online redo log</span>做归档,所以数据库备䆾中包含的是备份时数据库的åÏx—¶ç‚¹ä¿¡æ¯ï¼Œå®Œæ•´è€Œä¸”有效。以后做恢复æ—Óž¼Œå¯ä»¥æ¢å¤åˆ°æœ€åŽä¸€‹Æ?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>、恢复过½E‹ï¼š</font></span></span></span></h3> <p><font face=宋体><span>1. </span><span>重新安装<span>Windows</span>¾pȝ»Ÿå’?span>Remote Agent for Windows Server</span>åQŒäؓ恢复<span>Oracle</span>服务器准备环境ã€?/span></font></p> <p><font face=宋体><span>2. </span><span>恢复最后一‹Æ?span>FULL CLOSED</span>备䆾åQŒé‡æ–°å¯åŠ¨è®¡½Ž—机ã€?/span></font></p> <p><span><font face=宋体>此时<span>Windows</span>¾pȝ»ŸåQ?span>Oracle</span>数据库系¾lŸéƒ½æ˜¯å®Œæ•´çš„åQŒåªæ˜?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>íw«ä†¾˜qžæŽ¥åˆ°æ•°æ®åº“¾pȝ»ŸåQŒå…³é—­æ•°æ®åº“ã€?nbsp;</span></font></p> <p><span><font face=宋体>shutdown immediate + < enter ></font></span></p> <p><font face=宋体><span>4. </span><span>通过介质服务器恢复最新的<span>FULL ONLINE</span>备䆾åQŒæ¢å¤ä½œä¸šå±žæ€§çš„高çñ”选项中,¼‹®ä¿é€‰ä¸­äº?span>“Restore over Existing files</span>åQˆè¦†ç›–现存文ä»Óž¼‰<span>” </span>选项ã€?/span></font></p> <p><span><font face=宋体>要想成功的恢复数据库åQŒåœ¨æœ€åŽä¸€‹Æ?span>FULL CLOSED</span>备䆾之后的所æœ?span>redo log</span>必须都已¾læˆåŠŸå½’æ¡£åÆˆå¤‡ä†¾ã€‚å°‘äº†å“ªä¸€ä¸ªï¼Œæ•°æ®åº“å°±æ— æ³•æ¢å¤åˆ°æœ€åŽçš„<span>FULL ONLI NE</span>备䆾时的状态ã€?/font></span></p> <p><span><font face=宋体>通过<span>Oracle</span>çš?span>alert log</span>可以看到数据库的恢复需要哪些归档日志,以及你应该把它们恢复åˆîC»€ä¹ˆä½¾|®ã€?/font></span></p> <p><font face=宋体><span>5. </span><span>恢复完成后,ç”?span>SYS</span>用户ä»?span>sysdba</span>íw«ä†¾˜qžæŽ¥åˆ°æ•°æ®åº“åQŒå°†æ•°æ®åº“加载到<span>mount</span>阶段åQ?/span></font></p> <p><span><font face=宋体>startup mount + < enter ></font></span></p> <p><span><font face=宋体>6. </font></span><span><font face=宋体>数据åº?span>mount</span>完成后,执行<span>recover</span>˜q‡ç¨‹åQ?/font><span><br><br><font face=宋体>recover database using backup controlfile + < enter ></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=宋体> <br><br>auto + < enter ></font></span></span></p> <p><span><font face=宋体>¾pȝ»Ÿä¼šåœ¨<span>init.ora</span>æ–‡äšgä¸­å®šä¹‰çš„ä½ç½®ä¸ŠæŸ¥æ‰¾æ‰€æœ‰å¿…éœ€çš„æ—¥å¿—åÆˆä¾æ¬¡åº”ç”¨å®ƒä»¬åQŒæœ€åŽä¸€ä¸ªè¦åº”用的日志是<span>online redo log</span>åQŒå®žé™…ä¸Šå®ƒåÆˆä¸åŒ…æ‹¬ä“Q何的<span>transaction</span>åQŒåªæœ‰ä¸€ä¸?span>SCN</span>åQŒå¯ä»¥ç•¥˜q‡ï¼Œä½†æ˜¯è‡ªåŠ¨æ¢å¤˜q‡ç¨‹ä¼šå› ä¸ºæ‰¾ä¸åˆ°ç›¸åº”的文件而报错:</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=宋体>为此输入以下命ä×oåQ?span>until cancel</span>参数使我们可以在需要的时候中止恢复过½E‹ï¼‰åQ?/font><span><br><br><font face=宋体>recover database until cancel using backup controlfile + </font></span></span></p> <p><span><font face=宋体>˜q™æ ·åœ¨æ•°æ®åº“恢复的最后阶ŒDµå†‹Æ¡æ½Cºå‰é¢çš„错误æ—Óž¼Œæˆ‘们ž®±å¯ä»¥ä¸­æ­¢æ¢å¤è¿‡½E‹ï¼š</font><span><br><br><font face=宋体>cancel + < enter ></font></span></span></p> <p><span><font face=宋体>˜q™æ—¶é™¤äº†æœ€åŽä¸€ä¸?span>online redo log</span>以外åQŒæ‰€æœ‰çš„<span>commit transaction</span>都已¾læäº¤åˆ°æ•°æ®åº“之中了åQŒå®ŒæˆåŽä¼šæ˜¾½Cºï¼š</font><span><br><br><font face=宋体>Media recovery canceled</font></span></span></p> <p><span><font face=宋体>实际上恢复过½E‹å·²¾læ­£å¸¸å®Œæˆäº†ã€?/font></span></p> <p><span><font face=宋体>æœ€åŽæ˜¯æ‰“å¼€æ•°æ®åº“åÆˆåŒæ­¥æ—¥å¿—åºåˆ—åøP¼š</font><span><br><br><font face=宋体>alter database open resetlogs + < enter ></font></span></span></p> <p><span><font face=宋体>è‡Ïx­¤åQ?span>Oracle</span>数据库被成功恢复到最后一‹Æ?span>Full Online</span>备䆾ã€?/font></span></p> <p><font size=3><strong><span><font face="Times New Roman"> </font></span></strong><strong><span>说明åQ?/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>账号åQ?/span><span><font face="Times New Roman">SYS</font></span><span>è´¦å·ä»£æ›¿å®ƒäº†ã€‚äØ“äº†ä»¥</span><span><font face="Times New Roman">DBA</font></span><span>íw«ä†¾ç™Õd½•åQŒå¯åŠ?/span><span><font face="Times New Roman">SQL Plus</font></span><span>时应该加</span><span><font face="Times New Roman">nolog</font></span><span>参数åQŒè¿›å…¥ä¹‹åŽå†ç™Õd½•åQ?/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> </font></span></p> <h2><a name=_Toc134852043></a><a name=_Toc132594707><span><span>例子åQ?/span></span></a><span><span>åQˆç½‘上原资料åQ?/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>      </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>ä¸ÞZº†‹‚€éªŒæˆ‘为公司开发的</span><span><font face="Times New Roman">Oracle</font></span><span>数据库在¾U¿è‡ªåŠ¨å¤‡ä»½ç³»¾lŸï¼Œæˆ‘æ ¹æ?#8220;</span><span><font face="Times New Roman">Oracle</font></span><span>数据库在¾U¿è‡ªåŠ¨å¤‡ä»½ç³»¾l?#8221;产生的备份文件来重徏和恢å¤?/span><span><font face="Times New Roman">Oracle</font></span><span>æ•°æ®åº“ã€‚äØ“äº†è®©å¤§å®¶å…׃ín其方法和步骤åQˆä¹Ÿé€‚合于用其它方式å¯?/span><span><font face="Times New Roman">Oracle</font></span><span>做的热备份进行重建数据库åQ‰çŽ°æ•´ç†å¦‚ä¸‹ã€?/span><span><br><br></span><strong><span>一、系¾lŸçޝå¢?/span></strong><span><br><br></span><span>本次‹¹‹è¯•所使用的系¾lŸçŽ¯å¢ƒå¦‚ä¸‹ï¼š</span><span><br><br><span><font face="Times New Roman">1</font></span></span><span>åQ?/span><span><font face="Times New Roman"> </font></span><span>¼‹¬äšg环境</span><span><br><br></span><span>服务器:</span><span><font face="Times New Roman">Dell PowerEdge 1300 (CPU</font></span><span>åQ?/span><span><font face="Times New Roman">P</font></span><span>â…?/span><span><font face="Times New Roman"> 550MHz </font></span><span>内存åQ?/span><span><font face="Times New Roman">128MB </font></span><span>¼‹¬ç›˜åQ?/span><span><font face="Times New Roman">36GB)<br><br><span>2</span></font></span><span>åQ?/span><span><font face="Times New Roman"> </font></span><span>软äšg环境</span><span><br><br></span><span>操作¾pȝ»ŸåQ?/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>åQ?/span><span><font face="Times New Roman">ora816<br><br>Oracle</font></span><span>安装路径åQ?/span><span><font face="Times New Roman">/home/oracle<br><br></font></span><span>备䆾文äšgåQšæ‰€æœ‰æ•°æ®åº“æ–‡äšg、控制文件、初始化文äšg、数据库备䆾以来的所有归档日志文件ã€?/span><span><br><br></span><strong><span>二、恢复步éª?/span></strong><span><br><br></span><span>下面æ ÒŽ®ä»Žç”¨æˆ·å¤„带回来的备䆾数据åQŒåœ¨ä¸€å°æ–°çš„æœåŠ¡å™¨é‡å¾</span><span><font face="Times New Roman">Oracle</font></span><span>数据库。其详细步骤如下åQ?/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>服务器上åQŒå®‰è£…与原来的数据库服务器相同的操作¾pȝ»Ÿ</span><span><font face="Times New Roman">UnixWare 7.1</font></span><span>åQ›ç„¶åŽå®‰è£…与原数据库相同版本çš?/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>åQŒåœ¨</span><span><font face="Times New Roman">sqlplus</font></span><span>中,查找到数据库文äšgçš„èµ\径,òq¶ä¿å­˜åœ¨å½“前路径下的文äšg</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> spool file_name.txt<br><br>SQL> select file_name from sys.dba_data_files;<br><br>SQL> spool end<br><br>SQL>exit<br><br></font></span><span>关闭新服务器çš?/span><span><font face="Times New Roman">Oracle</font></span><span>åQŒç„¶åŽæ ¹æ®æ–‡ä»?/span><span><font face="Times New Roman">file_name.txt</font></span><span>中的路径åQŒåˆ é™¤æ–°è£…çš„</span><span><font face="Times New Roman">Oracle</font></span><span>实例的所有数据库文äšgã€?/span><span><br><br></span><span>注:从本步开始所有操作都是用</span><span><font face="Times New Roman">Oracle</font></span><span>用户ç™Õd½•操作¾pȝ»ŸåQ?/span><span><font face="Times New Roman">Unix</font></span><span>åQ‰åŽ˜q›è¡Œã€‚文中所有的黑色¾_—体</span><span><font face="Times New Roman">5</font></span><span>号字½W?/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>号字½W¦çš„语句需要修改后执行ã€?/span><span><br><br><span><font face="Times New Roman">3. </font></span></span><span>恢复数据库文ä»?/span><span><br><br></span><span>把备份的所有数据库文äšgç”?/span><span><font face="Times New Roman">Ftp</font></span><span>上传新的数据库服务器中的相同路径下。如果原来的路径已不存在åQŒå¯ä»¥æ‹·è´åˆ°å…¶ä»–路径下,恢复时详¾l†å¤„理方法见步骤</span><span><font face="Times New Roman">7</font></span><span>ä¸?/span><span><font face="Times New Roman"><2></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>æ–‡äšgç”?/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>æ–‡äšg位置åQŒè¦†ç›–之。其位置一般在</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>恢复控制文äšg</span><span><br></span><span><br></span><span>把备份的</span><span><font face="Times New Roman">ControlFile.bak</font></span><span>æ–‡äšgç”?/span><span><font face="Times New Roman">Ftp</font></span><span>上传到新数据库服务器ä¸?/span><span><font face="Times New Roman">Oracle</font></span><span>实例的各个镜像èµ\径下åQŒåƈ按初始化参数文äšg</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>å…¶èµ\径如有变动,在初始化参数文äšg</span><span><font face="Times New Roman">initSID.ora</font></span><span>中修改如上内容的路径和名¿UŽÍ¼Œä½¿å…¶å®žé™…路径与该参数的èµ\径一致ã€?/span><span><font face="Times New Roman"> <br><br><span>6. </span></font></span><span>恢复归档日志文äšg</span><span><br><br></span><span>把数据库备䆾后的归档日志ç”?/span><span><font face="Times New Roman">Ftp</font></span><span>上传到新数据库服务器的相同èµ\径下。èµ\径如有变动可以根据初始化参数文äšg</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>¾lè¿‡ä»¥ä¸Š</span><span><font face="Times New Roman">6</font></span><span>个步骤,把所有的备䆾文äšg已经上传åˆîCº†æ–°æ•°æ®åº“æœåŠ¡å™¨ä¸­ã€‚ä¸‹é¢å¼€å§‹æ ¹æ®è¿™äº›æ–‡ä»¶æ¢å¤åÆˆå¯åŠ¨æ•°æ®åº“ï¼Œå…ˆåœ¨æ“ä½œ¾pȝ»Ÿçš„æ½Cºç¬¦ä¸‹åšå¦‚下操作åQ?/span><span><br><br><font face="Times New Roman">$svrmgrl<br><br>SVRMGR>connect internal<br><br>SVRMGR>startup mount<br><br><1> </font></span><span>创徏口ä×oæ–‡äšg</span><span><br><br></span><span>如果原来的数据库配置了口令文ä»Óž¼Œòq¶ä¸”åœ?/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=<fname> password=<password> entries=<users><br><br>where<br><br>file - name of password file (mand),</font></span><span>åQˆå£ä»¤æ–‡ä»¶çš„命名方式为:</span><span><font face="Times New Roman">orapwSID</font></span><span>åQ?/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>例如åQ?/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>startup mount</font></span><span>ã€?/span><span><br><br><font face="Times New Roman"><2> </font></span><span>修改数据库文件的路径</span><span><br><br></span><span>如果在上˜q°çš„æ­¥éª¤</span><span><font face="Times New Roman">3</font></span><span>中修改了恢复的数据库文äšgçš„èµ\径,可以用如下语句对数据库文仉™‡æ–°å‘½å?/span><span><font face="Times New Roman"> </font></span><span>åQ?/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>下的文äšg</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>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"><3> </font></span><span>æ ÒŽ®æŽ§åˆ¶æ–‡äšg和归档日志文件恢复数据库</span><span><br><br></span><span>下面开始用控制文äšg和归档日志文件恢复数据库åQ?/span><span><br><br><font face="Times New Roman">SVRMGR>recover database using backup controlfile until cancel;<br><br></font></span><span>出现如下提示åQ?/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: {<RET>=suggested | filename | AUTO | CANCEL}</font></span><span>输入åQ?/span><span><br><br><font face="Times New Roman">auto<br><br></font></span><span>如果有如下提½Cºï¼Œåˆ™è¡¨½CºæˆåŠŸã€?/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>意外处理åQšå¦‚果其它提½Cºå¯èƒ½æ˜¯éœ€è¦çš„æ—¥å¿—æ–‡äšg不存在,‹‚€æŸ?/span><span><font face="Times New Roman">ORA-00289</font></span><span>中该文äšg是否存在ã€?/span><span><br><br></span><span>直到出现如下提示åQ?/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><4> </font></span><span>重置日志</span><span><br><br><font face="Times New Roman">SVRMGR>alter database open resetlogs;<br><br></font></span><span>意外处理åQšå¦‚果提½Cºåˆ›å»ºæ—¥å¿—的路径不存在,按提½Cø™µ\径创建目录。然后再重置日志ã€?/span><span><br><br><font face="Times New Roman"><5> </font></span><span>重启数据库,完成恢复</span><span><br><br><font face="Times New Roman">SVRMGR>shutdown immediate<br><br>SVRMGR>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>数据库正常打开åQŒæ•°æ®åº“重徏恢复成功ã€?/span></p> <p><span><font face="Times New Roman"> </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>      </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"> </font></span></p> <p><span>在这里没有讨论多么深入的</span><span>RMAN</span><span>技术,也没有告诉大家这样去¾~–写备䆾脚本åQŒè¿™òq¶ä¸æ˜¯æˆ‘çš„åˆè¡øP¼Œæˆ‘只æƒÏxŠŠæˆ‘ä¼šçš„å†™å‡ºæ¥åQŒå’Œå¤§å®¶ä¸€èµ·å­¦ä¹ ï¼Œä¸€èµ¯‚¿›æ­¥ï¼Œè°¢è°¢ã€?/span><span><br><br>1</span><span>、切换服务器归档模式åQŒå¦‚果已¾læ˜¯å½’档模式可蟩˜q‡æ­¤æ­¥ï¼š</span><span><br>%sqlplus /nolog     (</span><span>启动</span><span>sqlplus)<br>SQL> conn / as sysdba     (</span><span>ä»?/span><span>DBA</span><span>íw«ä†¾˜qžæŽ¥æ•°æ®åº?/span><span>)<br>SQL> shutdown immediate;     (</span><span>立即关闭数据åº?/span><span>)<br>SQL> startup mount     (</span><span>启动实例òq¶åŠ è½½æ•°æ®åº“åQŒä½†ä¸æ‰“å¼€</span><span>)<br>SQL> alter database archivelog;     (</span><span>æ›´æ”¹æ•°æ®åº“äØ“å½’æ¡£æ¨¡å¼</span><span>)<br>SQL> alter database open;     (</span><span>打开数据åº?/span><span>)<br>SQL> alter system archive log start;     (</span><span>启用自动归档</span><span>)<br>SQL> exit     (</span><span>退å‡?/span><span>)<br><br>2</span><span>、连接:</span><span><br>%rman target=rman/rman@mydb     (</span><span>启动恢复½Ž¡ç†å™?/span><span>)<br><br>3</span><span>、基本设¾|®ï¼š</span><span><br>RMAN> configure default device type to disk;    (</span><span>讄¡½®é»˜è®¤çš„å¤‡ä»½è®¾å¤‡äØ“¼‚ç›˜</span><span>)<br>RMAN> configure device type disk parallelism 2;     (</span><span>讄¡½®å¤‡ä†¾çš„åÆˆè¡Œçñ”别,通道æ•?/span><span>)<br>RMAN> configure channel 1 device type disk fromat '/backup1/backup_%U';     (</span><span>讄¡½®å¤‡ä†¾çš„æ–‡ä»¶æ ¼å¼ï¼Œåªé€‚用于磁盘设å¤?/span><span>)<br>RMAN> configure channel 2 device type disk fromat '/backup2/backup_%U';     (</span><span>讄¡½®å¤‡ä†¾çš„æ–‡ä»¶æ ¼å¼ï¼Œåªé€‚用于磁盘设å¤?/span><span>)<br>RMAN> configure controlfile autobackup on;     (</span><span>打开控制文äšg与服务器参数文äšg的自动备ä»?/span><span>)<br>RMAN> configure controlfile autobackup format for device type disk to '/backup1/ctl_%F';     (</span><span>讄¡½®æŽ§åˆ¶æ–‡äšg与服务器参数文äšg自动备䆾的文件格å¼?/span><span>)<br><br>4</span><span>、查看所有设¾|®ï¼š</span><span><br>RMAN> show all<br><br>5</span><span>、查看数据库æ–ÒŽ¡ˆæŠ¥è¡¨åQ?/span><span><br>RMAN> report schema;<br><br>6</span><span>、备份全库:</span><span><br>RMAN> backup database plus archivelog delete input;     (</span><span>备䆾全库及控制文件、服务器参数文äšg与所有归档的重做日志åQŒåƈ删除旧的归档日志</span><span>)<br><br>7</span><span>、备份表½Iºé—´åQ?/span><span><br>RMAN> backup tablespace system plus archivelog delete input;     (</span><span>备䆾指定表空间及归档的重做日志,òq¶åˆ é™¤æ—§çš„归档日å¿?/span><span>)<br><br>8</span><span>、备份归档日志:</span><span><br>RMAN> backup archivelog all delete input;<br><br>9</span><span>、复制数据文ä»Óž¼š</span><span><br>RMAN> copy datafile 1 to '/oracle/dbs/system.copy';<br><br>10</span><span>、查看备份和文äšg复本åQ?/span><span><br>RMAN> list backup;<br><br>11</span><span>、验证备份:</span><span><br>RMAN> validate backupset 3;<br><br>12</span><span>、从自动备䆾中恢复服务器参数文äšgåQ?/span><span><br>RMAN> shutdown immediate;     (</span><span>立即关闭数据åº?/span><span>)<br>RMAN> startup nomount;     (</span><span>启动实例</span><span>)<br>RMAN> restore spfile to pfile '/backup1/mydb.ora' from autobackup;     (</span><span>从自动备份中恢复服务器参数文ä»?/span><span>)<br><br>13</span><span>、从自动备䆾中恢复控制文ä»Óž¼š</span><span><br>RMAN> shutdown immediate;     (</span><span>立即关闭数据åº?/span><span>)<br>RMAN> startup nomount;     (</span><span>启动实例</span><span>)<br>RMAN> restore controlfile to '/backup1' from autobackup;     (</span><span>从自动备份中恢复控制文äšg</span><span>)<br><br>13</span><span>、恢复和复原全数据库åQ?/span><span><br>RMAN> shutdown immediate;     (</span><span>立即关闭数据åº?/span><span>)<br>RMAN> exit     (</span><span>退å‡?/span><span>)<br>%mv /oracle/dbs/tbs_12.f /oracle/dbs/tbs_12.bak     (</span><span>ž®†æ•°æ®æ–‡ä»‰™‡å‘½å</span><span>)<br>%mv /oracle/dbs/tbs_13.f /oracle/dbs/tbs_13.bak     (</span><span>ž®†æ•°æ®æ–‡ä»‰™‡å‘½å</span><span>)<br>%mv /oracle/dbs/tbs_14.f /oracle/dbs/tbs_14.bak     (</span><span>ž®†æ•°æ®æ–‡ä»‰™‡å‘½å</span><span>)<br>%mv /oracle/dbs/tbs_15.f /oracle/dbs/tbs_15.bak     (</span><span>ž®†æ•°æ®æ–‡ä»‰™‡å‘½å</span><span>)<br>%rman target=rman/rman@mydb     (</span><span>启动恢复½Ž¡ç†å™?/span><span>)<br>RMAN> startup pfile=/oracle/admin/mydb/pfile/initmydb.ora     (</span><span>指定初始化参数文件启动数据库</span><span>)<br>RMAN> restore database;     (</span><span>˜q˜åŽŸæ•°æ®åº?/span><span>)<br>RMAN> recover database;     (</span><span>恢复数据åº?/span><span>)<br>RMAN> alter database open;     (</span><span>打开数据åº?/span><span>)<br><br>14</span><span>、恢复和复原表空é—ß_¼š</span><span><br>RMAN> sql 'alter tablespace users offline immediate';     (</span><span>ž®†è¡¨½Iºé—´è„±æœº</span><span>)<br>RMAN> exit     (</span><span>退出恢复管理器</span><span>)<br>%mv /oracle/dbs/users01.dbf /oracle/dbs/users01.bak     (</span><span>ž®†è¡¨½Iºé—´é‡å‘½å?/span><span>)<br>%rman target=rman/rman@mydb     (</span><span>启动恢复½Ž¡ç†å™?/span><span>)<br>RMAN> restore tablespace users;     (</span><span>˜q˜åŽŸè¡¨ç©ºé—?/span><span>)<br>RMAN> recover tablespace users;     (</span><span>恢复表空é—?/span><span>)<br>RMAN> sql 'alter tablespace users online';     (</span><span>ž®†è¡¨½Iºé—´è”机</span><span>)<br><br>15</span><span>、增量备份与恢复åQ?/span><span><br></span><span>½W¬ä¸€å¤©çš„增量基本备䆾åQ?/span><span><br>RMAN> backup incremental level=0 database plus archivelog delete input;<br></span><span>½W¬äºŒå¤©çš„增量差异备䆾åQ?/span><span><br>RMAN> backup incremental level=2 database plus archivelog delete input;<br></span><span>½W¬ä¸‰å¤©çš„增量差异备䆾åQ?/span><span><br>RMAN> backup incremental level=2 database plus archivelog delete input;<br></span><span>½W¬å››å¤©çš„增量差异备䆾åQ?/span><span><br>RMAN> backup incremental level=1 database plus archivelog delete input;<br></span><span>½W¬äº”天的增量差异备䆾åQ?/span><span><br>RMAN> backup incremental level=2 database plus archivelog delete input;<br></span><span>½W¬å…­å¤©çš„增量差异备䆾åQ?/span><span><br>RMAN> backup incremental level=2 database plus archivelog delete input;<br></span><span>½W¬ä¸ƒå¤©çš„增量差异备䆾åQ?/span><span><br>RMAN> backup incremental level=0 database plus archivelog delete input;<br><br></span><span>增量恢复åQ?/span><span><br>RMAN> shutdown immediate;<br>RMAN> 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> startup pfile=/oracle/admin/mydb/pfile/initmydb.ora<br>RMAN> restore database;<br>RMAN> recover database;<br>RMAN> alter database open;</span></p> </div> <img src ="http://www.aygfsteel.com/larry/aggbug/121745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/larry/" target="_blank">larryjava</a> 2007-06-04 09:25 <a href="http://www.aygfsteel.com/larry/articles/121745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化--让你的SQL˜qè¡Œé€Ÿåº¦æ˜Žæ˜¾æé«˜http://www.aygfsteel.com/larry/articles/116663.htmllarryjavalarryjavaFri, 11 May 2007 01:55:00 GMThttp://www.aygfsteel.com/larry/articles/116663.htmlhttp://www.aygfsteel.com/larry/comments/116663.htmlhttp://www.aygfsteel.com/larry/articles/116663.html#Feedback0http://www.aygfsteel.com/larry/comments/commentRss/116663.htmlhttp://www.aygfsteel.com/larry/services/trackbacks/116663.html ½W”者在工作实践中发玎ͼŒä¸è‰¯çš„SQL往往来自于不恰当的烦引设计、不充䆾的连接条件和不可优化的where子句。在对它们进行适当的优化后åQŒå…¶˜qè¡Œé€Ÿåº¦æœ‰äº†æ˜Žæ˜¾åœ°æé«˜ï¼ä¸‹é¢æˆ‘将从这三个斚w¢åˆ†åˆ«˜q›è¡Œæ€È»“åQšï¼ˆä¸ÞZº†æ›´ç›´è§‚地说明问题åQŒæ‰€æœ‰å®žä¾‹ä¸­çš„SQL˜qè¡Œæ—‰™—´å‡ç»˜q‡æµ‹è¯•,不超˜q‡ï¼‘¿U’的均表½CÞZØ“åQ?lt; 1¿U’)ã€?åQ?br>
一、不合理的烦引设�/strong>
  例:表record�20000行,试看在不同的索引下,下面几个 SQL的运行情况:
  1.在date上徏有一非个¾Ÿ¤é›†ç´¢å¼•

select count(*) from record where date >
''19991201'' and date < ''19991214''and amount >
2000 (25¿U?
select date,sum(amount) from record group by date
(55¿U?
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'') (27¿U?


  分析åQ?
  date上有大量的重复å€û|¼Œåœ¨éž¾Ÿ¤é›†ç´¢å¼•下,数据在物理上随机存放在数据页上,在范围查找时åQŒå¿…™åÀL‰§è¡Œä¸€‹Æ¡è¡¨æ‰«ææ‰èƒ½æ‰‘Öˆ°˜q™ä¸€èŒƒå›´å†…的全部行ã€?


  2.在date上的一个群集烦�br>

select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000 åQ?4¿U’)
select date,sum(amount) from record group by date
åQ?8¿U’)
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'')åQ?4¿U’)


  分析åQ?
  在群集烦引下åQŒæ•°æ®åœ¨ç‰©ç†ä¸ŠæŒ‰™åºåºåœ¨æ•°æ®é¡µä¸Šï¼Œé‡å¤å€ég¹ŸæŽ’åˆ—åœ¨ä¸€èµøP¼Œå› è€Œåœ¨èŒƒå›´æŸ¥æ‰¾æ—Óž¼Œå¯ä»¥å…ˆæ‰¾åˆ°è¿™ä¸ªèŒƒå›´çš„èµähœ«ç‚¹ï¼Œä¸”只在这个范围内扫描数据™åµï¼Œé¿å…äº†å¤§èŒƒå›´æ‰«æåQŒæé«˜äº†æŸ¥è¯¢é€Ÿåº¦ã€?


  3.在placeåQŒdateåQŒamount上的¾l„合索引

select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000 åQ?6¿U’)
select date,sum(amount) from record group by date
åQ?7¿U’)
select count(*) from record where date >
''19990901'' and place in (''BJ, ''SH'')åQ?lt; 1¿U’)


  分析åQ?
  ˜q™æ˜¯ä¸€ä¸ªä¸å¾ˆåˆç†çš„¾l„合索引åQŒå› ä¸ºå®ƒçš„前导列是placeåQŒç¬¬ä¸€å’Œç¬¬äºŒæ¡SQL没有引用placeåQŒå› æ­¤ä¹Ÿæ²¡æœ‰åˆ©ç”¨ä¸Šçƒ¦å¼•ï¼›½W¬ä¸‰ä¸ªSQL使用了placeã€?br>

  4.在dateåQŒplaceåQŒamount上的¾l„合索引

select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000(< 1¿U?
select date,sum(amount) from record group by date
åQ?1¿U’)
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'')åQ?lt; 1¿U’)


  分析åQ?
  ˜q™æ˜¯ä¸€ä¸ªåˆç†çš„¾l„合索引。它ž®†dateä½œäØ“å‰å¯¼åˆ—ï¼Œä½¿æ¯ä¸ªSQL都可以利用烦引,òq¶ä¸”在第一和第三个SQL中åŞ成了索引覆盖åQŒå› è€Œæ€§èƒ½è¾‘Öˆ°äº†æœ€ä¼˜ã€?


  5.æ€È»“åQ?
  ¾~ºçœæƒ…况下徏立的索引是非¾Ÿ¤é›†ç´¢å¼•åQŒä½†æœ‰æ—¶å®ƒåƈ不是最佳的åQ›åˆç†çš„索引设计要徏立在对各¿UæŸ¥è¯¢çš„分析和预‹¹‹ä¸Šã€‚一般来è¯ß_¼š

  â‘?有大量重复倹{€ä¸”¾lå¸¸æœ‰èŒƒå›´æŸ¥è¯?

  åQˆbetween, >,< åQ?gt;=,< =åQ‰å’Œorder by、group by发生的列åQŒå¯è€ƒè™‘建立¾Ÿ¤é›†ç´¢å¼•åQ?

  â‘?¾lå¸¸åŒæ—¶å­˜å–多列åQŒä¸”每列都含有重复值可考虑建立¾l„合索引åQ?

  â‘?¾l„合索引要尽量ä‹É关键查询形成索引覆盖åQŒå…¶å‰å¯¼åˆ—一定是使用最频繁的列ã€?/p>

二、不充䆾的连接条�/strong>

  例:表cardæœ?896行,在card_no上有一个非聚集索引åQŒè¡¨accountæœ?91122行,åœ?account_no上有一个非聚集索引åQŒè¯•看在不同的表˜qžæŽ¥æ¡äšg下,两个SQL的执行情况:

select sum(a.amount) from account a,
card b where a.card_no = b.card_noåQ?0¿U’)



  ž®†SQLæ”¹äØ“åQ?

select sum(a.amount) from account a,
card b where a.card_no = b.card_no and a.
account_no=b.account_noåQ?lt; 1¿U’)


  分析åQ?
  在第一个连接条件下åQŒæœ€ä½ÏxŸ¥è¯¢æ–¹æ¡ˆæ˜¯ž®†account作外层表åQŒcard作内层表åQŒåˆ©ç”¨card上的索引åQŒå…¶I/O‹Æ¡æ•°å¯ç”±ä»¥ä¸‹å…¬å¼ä¼°ç®—为:
  外层表account上的22541™å?åQˆå¤–层表accountçš?91122è¡?内层表card上对应外层表½W¬ä¸€è¡Œæ‰€è¦æŸ¥æ‰„¡š„3™åµï¼‰=595907‹Æ¡I/O

  在第二个˜qžæŽ¥æ¡äšg下,最ä½ÏxŸ¥è¯¢æ–¹æ¡ˆæ˜¯ž®†card作外层表åQŒaccount作内层表åQŒåˆ©ç”¨account上的索引åQŒå…¶I/O‹Æ¡æ•°å¯ç”±ä»¥ä¸‹å…¬å¼ä¼°ç®—为:
  外层表card上的1944™å?åQˆå¤–层表cardçš?896è¡?内层表account上对应外层表每一行所要查扄¡š„4™åµï¼‰= 33528‹Æ¡I/O

  可见åQŒåªæœ‰å……份的˜qžæŽ¥æ¡äšgåQŒçœŸæ­£çš„æœ€ä½Ïx–¹æ¡ˆæ‰ä¼šè¢«æ‰§è¡Œã€?


  æ€È»“åQ?
  1.多表操作在被实际执行前,查询优化器会æ ÒŽ®˜qžæŽ¥æ¡äšgåQŒåˆ—出几¾l„可能的˜qžæŽ¥æ–ÒŽ¡ˆòq¶ä»Žä¸­æ‰¾å‡ºç³»¾lŸå¼€é”€æœ€ž®çš„æœ€ä½Ïx–¹æ¡ˆã€‚连接条件要充䆾考虑带有索引的表、行数多的表åQ›å†…外表的选择可由公式åQšå¤–层表中的匚w…è¡Œæ•°*内层表中每一‹Æ¡æŸ¥æ‰„¡š„‹Æ¡æ•°¼‹®å®šåQŒä¹˜¿U¯æœ€ž®äؓ最ä½Ïx–¹æ¡ˆã€?

  2.查看执行æ–ÒŽ¡ˆçš„æ–¹æ³?- 用set showplanonåQŒæ‰“å¼€showplan选项åQŒå°±å¯ä»¥çœ‹åˆ°˜qžæŽ¥™åºåºã€ä‹É用何¿Uçƒ¦å¼•的信息åQ›æƒ³çœ‹æ›´è¯¦ç»†çš„信息,需用sa角色执行dbcc(3604,310,302)ã€?


三、不可优化的where子句

  1.例:下列SQL条äšg语句中的列都建有恰当的烦引,但执行速度却非常慢åQ?

select * from record where
substring(card_no,1,4)=''5378''(13¿U?
select * from record where
amount/30< 1000åQ?1¿U’)
select * from record where
convert(char(10),date,112)=''19991201''åQ?0¿U’)


  分析åQ?
  where子句中对列的ä»ÖM½•操作¾l“果都是在SQL˜qè¡Œæ—‰™€åˆ—计算得到的,因此它不得不˜q›è¡Œè¡¨æœç´¢ï¼Œè€Œæ²¡æœ‰ä‹É用该列上面的索引åQ›å¦‚果这些结果在查询¾~–译时就能得刎ͼŒé‚£ä¹ˆž®±å¯ä»¥è¢«SQL优化器优化,使用索引åQŒé¿å…è¡¨æœçƒ¦åQŒå› æ­¤å°†SQLé‡å†™æˆä¸‹é¢è¿™æ øP¼š

select * from record where card_no like
''5378%''åQ?lt; 1¿U’)
select * from record where amount
< 1000*30åQ?lt; 1¿U’)
select * from record where date= ''1999/12/01''
åQ?lt; 1¿U’)


  你会发现SQL明显快è“v来!

  2.例:表stuffæœ?00000行,id_no上有非群集烦引,è¯ïLœ‹ä¸‹é¢˜q™ä¸ªSQLåQ?

select count(*) from stuff where id_no in(''0'',''1'')åQ?3¿U’)


  分析åQ?
  where条äšg中的''in''在逻辑上相当于''or''åQŒæ‰€ä»¥è¯­æ³•分析器会将in (''0'',''1'')转化为id_no =''0'' or id_no=''1''来执行。我们期望它会根据每个or子句分别查找åQŒå†ž®†ç»“果相加,˜q™æ ·å¯ä»¥åˆ©ç”¨id_no上的索引åQ›ä½†å®žé™…上(æ ÒŽ® showplanåQ?它却采用äº?OR½{–ç•¥"åQŒå³å…ˆå–出满­‘Ïx¯ä¸ªor子句的行åQŒå­˜å…¥äÍ时数据库的工作表中,再徏立唯一索引以去掉重复行åQŒæœ€åŽä»Ž˜q™ä¸ªä¸´æ—¶è¡¨ä¸­è®¡ç®—¾l“果。因此,实际˜q‡ç¨‹æ²¡æœ‰åˆ©ç”¨id_no上烦引,òq¶ä¸”完成旉™—´˜q˜è¦å—tempdb数据库性能的媄响ã€?

  实践证明åQŒè¡¨çš„行数越多ぷ鞅淼男阅芫驮讲睿眘tuffæœ?20000行时åQŒæ‰§è¡Œæ—¶é—´ç«Ÿè¾‘Öˆ°220¿U’!˜q˜ä¸å¦‚å°†or子句分开åQ?

select count(*) from stuff where id_no=''0''
select count(*) from stuff where id_no=''1''


  得到两个¾l“æžœåQŒå†ä½œä¸€‹Æ¡åŠ æ³•åˆ½Ž—。因为每句都使用了烦引,执行旉™—´åªæœ‰3¿U’,åœ?20000行下åQŒæ—¶é—´ä¹Ÿåªæœ‰4¿U’。或者,用更好的æ–ÒŽ³•åQŒå†™ä¸€ä¸ªç®€å•的存储˜q‡ç¨‹åQ?

create proc count_stuff as
declare @a int
declare @b int
declare @c int
declare @d char(10)
begin
select @a=count(*) from stuff where id_no=''0''
select @b=count(*) from stuff where id_no=''1''
end
select @c=@a+@b
select @d=convert(char(10),@c)
print @d


  直接½Ž—出¾l“æžœåQŒæ‰§è¡Œæ—¶é—´åŒä¸Šé¢ä¸€æ ·å¿«åQ?

  æ€È»“åQ?br>
  可见åQŒæ‰€è°“优化即where子句利用了烦引,不可优化卛_‘生了表扫描或额外开销ã€?

  1.ä»ÖM½•对列的操作都ž®†å¯¼è‡´è¡¨æ‰«æåQŒå®ƒåŒ…括数据库函数、计½Ž—表辑ּ½{‰ç­‰åQŒæŸ¥è¯¢æ—¶è¦å°½å¯èƒ½ž®†æ“ä½œç§»è‡³ç­‰å·å³è¾V€?

  2.in、orå­å¥å¸æ€¼šä½¿ç”¨å·¥ä½œè¡¨ï¼Œä½¿çƒ¦å¼•失效;如果不äñ”生大量重复å€û|¼Œå¯ä»¥è€ƒè™‘把子句拆开åQ›æ‹†å¼€çš„子句中应该包含索引ã€?

  3.要善于ä‹É用存储过½E‹ï¼Œå®ƒä‹ÉSQL变得更加灉|´»å’Œé«˜æ•ˆã€?

  从以上这些例子可以看出,SQL优化的实质就是在¾l“果正确的前提下åQŒç”¨ä¼˜åŒ–器可以识别的语句åQŒå……份利用烦引,减少表扫描的I/O‹Æ¡æ•°åQŒå°½é‡é¿å…è¡¨æœçƒ¦çš„发生。其实SQL的性能优化是一个复杂的˜q‡ç¨‹åQŒä¸Š˜q°è¿™äº›åªæ˜¯åœ¨åº”用层次的一¿Uä½“玎ͼŒæ·±å…¥ç ”ç©¶˜q˜ä¼šæ¶‰åŠæ•°æ®åº“层的资源配¾|®ã€ç½‘¾lœå±‚的流量控制以及操作系¾lŸå±‚çš„æ€ÖM½“设计ã€?



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÉÜÐËÏØ| ËÞÖÝÊÐ| Æ½É½ÏØ| Îå»ªÏØ| ¸ßÌÆÏØ| °¢À­ÉÆ×óÆì| µÂÐËÊÐ| ÷ëÓÎÏØ| Æ½Â½ÏØ| ¸§Ë³ÏØ| ¼ªÁÖÊÐ| Âí°°É½ÊÐ| °²Â½ÊÐ| ¸ñ¶ûľÊÐ| ¾ÆÈªÊÐ| ͨµÀ| ¹ãÄÏÏØ| ÍòÖÝÇø| Ó¢µÂÊÐ| ÉϸßÏØ| ÎåÔ­ÏØ| Ä«Öñ¹¤¿¨ÏØ| ºÍÁÖ¸ñ¶ûÏØ| ʯÖù| »áÔóÏØ| ´óÓàÏØ| ÉÌÄÏÏØ| ÒÊÄÏÏØ| ÑôÇúÏØ| Á鱦ÊÐ| ÓéÀÖ| ½ðÃÅÏØ| ˼éÊÐ| ÕýÏâ°×Æì| Õ´ÒæÏØ| ̨ÖÐÊÐ| Õã½­Ê¡| ¸»Ô£ÏØ| µÂ»¯ÏØ| ºéºþÊÐ| ÒËÑôÏØ|