??xml version="1.0" encoding="utf-8" standalone="yes"?> 客户?br>机器名称QJoy Q=4:安装分发服务?br>A:配置分发服务?br>工具->复制->配置发布、订阅服务器和分?>下一?>下一?所有的均采用默认配|? Q=6:试数据 L看同步的 joy:stores 是否插入了一条新的记?/p>
试完毕Q通过?/p>
Q=7修改数据库的同步旉,一般选择夜晚执行数据库同步处?br>(具体操作? :D 卸蝲方式Q工?>复制->止发布->是在"ZehuaDb"上静止发?卸蝲所有的数据库同步配|服务器 注意Q发布服务器、分发服务器中的SQLServerAgent服务必须启动 量数据库同步可以采用触发器实现,同步单表卛_?br> 在SQL Server 2000里设|和使用数据库复制之前,应先查相关的几台SQL Server服务器下面几Ҏ否满I USE master
]]>
说明Q?br> 为方便操?所有操作均在发布服务器(分发服务?上操?q用推模式Q在客户机器使用强制订阅方式?br>
试通过Q?br>Q=1:环境
服务器环?
机器名称Q?serverDB
操作pȝQWindows 2000 Server
数据库版本:SQL 2000 Server 企业?
操作pȝQWindows 2000 Server
数据库版本:SQL 2000 Server 企业?br>
Q=2:建用户帐?br>在服务器端徏立域用户帐号
我的电脑理->本地用户和组->用户->建立
UserNameQJoy
UserPwdQJoy
==3:重新启动服务器MSSQLServer
我的电脑->控制面版->理工具->服务->MSSQLServer 服务
(更改为:域用户帐?我们新徏的joy用户 .\joy,密码:joy)
B:配置发布服务?br>工具->复制->创徏和管理发?>选择要发布的数据?pubs)->下一?>快照发布->下一?>
选择要发布的内容->下一?>下一?>下一?>完成
C:强制配置订阅服务?推模?拉模式与此雷?
工具->复制->配置发布、订阅服务器和分?>订阅服务?>新徏->SQL Server数据?>输入客户端服务器名称(joy)->使用SQL Server w䆾验证(sa,sa)->定->应用->定
D:初始化订?br>复制监视?>发布服务?serverDB)->双击订阅->强制新徏->下一?>选择启用的订阅服务器->joy->
下一?>下一?>下一?>下一?>完成
--在服务器执行:
选择表storesQ手动或者通过sql语句修改其中的数据,insert ,update ,delete均可?br>
复制监视?>发布服务?serverDB)->->快照->启动代理E序
->ZLP:SZ(强制)->启动同步处理
〔注意说明?/strong>
服务器一端不能以(local)q行数据的发布与分发,需要先删除注册Q然后新建注册本地计机名称
采用推模? "D:\Microsoft SQL Server\MSSQL\REPLDATA\unc" 目录文g可以不设|共?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程中可能出现的问题
1、MSSQLserver和Sqlserveragent服务是否是以域用戯n份启动ƈq行的(.\administrator用户也是可以的)
如果d用的是本地系l帐户localQ将不具备网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=0Q也是本机器)但srvname和datasource不一? 需要按如下Ҏ修改:
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>
如果pingLIP地址可以Q但pingL名不通的时候,需要在
winnt\system32\drivers\etc\hosts (WIN2000)
windows\system32\drivers\etc\hosts (WIN2003)
文g里写入数据库服务器IP地址和主机名的对应关pR?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企业理器里[复制]-> 右键选择
->[配置发布、订阅服务器和分发]的图形界面来配置数据库复制了
2?nbsp; 避免使用不兼容的数据cd。例如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())
卻IM对列的操作都导致表扫描Q它包括数据库函数、计表辑ּ{等Q查询时要尽可能操作移至等号右辏V?/p>
4?nbsp; 避免使用!=或<Q、IS NULL或IS NOT NULL、IN QNOT 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接条gQ这时在 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.nameQrcvbles.balanceQ?#8230;…other columns
FROM custQrcvbles
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.nameQrcvbles.balanceQ?#8230;…other columns
FROM custQrcvbles
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/OQ所以查询工作量可以得到大幅减少?/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回Ml果集,但是会消耗系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两个对性能影响最大)QM上看询成本百分比卛_?br>单的存储q程可以用向D动生成:在企业管理器工具栏点击运行向导图标,点击”数据?#8221;?#8221;创徏存储q程向导”。复杂存储过E的调试Q在查询分析器左边的对象览器(没有Q按F8Q选择要调试的存储q程,点右键,点调试,输入参数执行Q出C个Q动工hQ上面有单步执行Q断点设|等?/p>
冷备?/span>...................................................................................................................... 1
1、备份步骤:................................................................................................... 1
2、恢复步骤:................................................................................................... 2
热备?/span>...................................................................................................................... 2
1、备份步骤:................................................................................................... 2
2、恢复步骤:................................................................................................... 4
Windowsq_?/span>oracle备䆾(Veritas BE)...................................................................... 5
1、需要的数据Q?/span>............................................................................................... 5
2、恢复过E:................................................................................................... 5
例子Q(|上原资料)............................................................................................... 7
1. ?/span>Oracle的热备䆾重徏数据?/span>..................................................................... 7
2. Oracle9i RMAN 备䆾及恢复步?/span>................................................................ 12
冷备份具有很多优良特性,快速,方便Q以及高效。一ơ完整的冷备份步骤是Q?/span>
1Q首先关闭数据库Q?/font>shutdown normalQ?/span>
2Q拷贝相x件到安全区域Q利用操作系l命令拷贝数据库的所有的数据文g、日志文件、控制文件、参数文件、口令文件等Q包括\径)Q?/span>
3Q重新启动数据库Q?/font>startupQ?/span>
以上的步骤可以用一个脚本来完成操作Q?/span>
su – oracle < sqlplus /nolog
connect / as sysdba
shutdown immediate;
!cp 文g 备䆾位置Q所有的日志、数据、控制及参数文gQ?/font>;
startup;
exit;
恢复的时候,相对比较单了Q我停掉数据库,文件拷贝回相应位置Q重启数据库可以了Q当然也可以用脚本来完成?/span>
当需要做一个精度比较高的备份,而且我们的数据库不可能停掉(许讉K量)Ӟq个情况下,我们需要归档方式下的备份,是下面讨论的热备䆾。热备䆾可以非常_的备份表I间U和用户U的数据Q由于它是根据归档日志的旉轴来备䆾恢复的,理论上可以恢复到前一个操作,甚至是前一U的操作。具体步骤如下:
1Q通过视图v$database,查看数据库是否在Archive模式?/font>:
SQL> select log_mode from v$database;
如果不是Archive模式
则设定数据库q行于归档模式下Q?/font>SQL>shutdown immediate
SQL>startup mount
SQL> alter database archivelog;
SQL> alter database open;
如果Automaticarchival昄?/font>“Enabled”Q则数据库归档方式ؓ自动归档。否则需要手工归档,或者将归档方式修改动归档,如:
正常shutdown数据库,在参数文件中init.ora中加入如下参?/font>
SQL>shutdown immediate
修改init.oraQ?/font>
LOG_ARCHIVE_START=TRUE
LOG_ARCHIVE_DEST1=ORACLE_HOME/admin/o816/arch(归档日值存放位|可以自己定?/font>)
SQL>startup
然后Q重新启动数据库Q此?/font>Oracle数据库将以自动归档的方式工作?/font>Archive模式下。其中参?/font>LOG_ARCHIVE_DEST1是指定的归档日志文g的\径,?/font>Oracle数据库文件存在不同的盘Q一斚w减少盘I/O竞争Q另外一斚w也可以避免数据库文g所在硬盘毁坏之后的文g丢失。归档\径也可以直接指定为磁带等其它物理存储讑֤Q但可能要考虑d速度、可写条件和性能{因素?/font>
注意Q当数据库处?/font>ARCHIVE模式下时Q一定要保证指定的归档\径可写,否则数据库就会挂P直到能够归档所有归档信息后才可以用。另外,为创Z个有效的备䆾,当数据库在创建时,必须履行一个全数据库的冷备?/font>,是说数据库需要运行在归档方式,然后正常关闭数据?/font>,备䆾所有的数据库组成文件。这一备䆾是整个备份的基础,因ؓ该备份提供了一个所有数据库文g的拷贝。(体现了冷备䆾与热备䆾的合作关p,以及强大的能力)
2Q备份表I间文gQ?/font>
a,首先Q修改表I间文g为备份模?/font> ALTER TABLESPACE tablespace_name BEGIN BACKUP;
b,然后Q拷贝表I间文g到安全区?/font> !CP tablespace_name D_PATH;
c,最后,表I间的备份模式关?/font> ALTER TABLESPACE tablespace_name END BACKUP;
3Q对归档日志文g的备份:
停止归档q程Q->备䆾归档日志文gQ->启动归档q程
如果日志文档比较多,我们它们写入一个文件成Z个恢复的参考:$ files `ls <归档文g路径>/arch*.dbf`;export files
4Q备份控制文?/font>:
SQL> alter database backup controlfile to 'controlfile_back_nameQ一般用
当然Q我们也可以上面的东东写ؓ一个脚本,在需要的时候执行就可以?/font>:
脚本范例Q?/span>
su – oracle < sqlplus /nolog
connect / as sysdba
ALTER TABLESPACE tablespace_name BEGIN BACKUP
!CP tablespace_name D_PATH
ALTER TABLESPACE tablespace_name END BACKUP
alter database backup controlfile to 'controlfile_back_nameQ一般用
!files `ls <归档文g路径>/arch*.dbf`;export files
热备份的恢复Q对于归档方式数据库的恢复要求不但有有效的日志备份还要求有一个在归档方式下作的有效的全库备䆾。归档备份在理论上可以无数据丢失Q但是对于硬件以及操作h员的要求都比较高。在我们使用归档方式备䆾的时候,全库物理备䆾也是非常重要的。归档方式下数据库的恢复要求从全备䆾到失败点所有的日志都要完好无缺?/span>
恢复步骤Q?/font>LOG_ARCHIVE_DEST_1
shutdown数据库?/font>
全备䆾的数据文件放到原来系l的目录中?/font>
全备䆾到失败点的所有归档日志放到参?/font>LOG_ARCHIVE_DEST_1所指定的位|?/font>
利用sqlplus登陆到空实例。(connect / as sysdbaQ?/font>
然后 startup mount
set autorecovery on
recover database;
alter database open;
q样Q热恢复q完工?/span>
通过Backup Exec实施OracleN恢复很简单?/span>
1?span>FULL CLOSED备䆾
shutdown数据库(不要?span>shutdown abort关闭Q,实施一个文件备䆾Q备份全部的Oracle相关文gQ包?span>Windowspȝ文gQ系l状态和OracleE序文g和数据文件等内容?/span>
q个冷备份对于快速恢?span>Oracle数据库系l非常关键,如果没有它,pȝ被破坏后只能重新安装再恢复,q要比直接恢复冷备䆾慢得多,也更复杂?/font>
每当数据库或表单的物理结构或逻辑l构有变化时都应该重新创个冷备䆾?/font>
2. FULL ONLINE备䆾
q个备䆾要通过Backup Exec Agent for Oracle Server来完成,要备份全部表I间Q归档日志和控制文gQ通过q种方式备䆾Q?span>Oracle会将所有缓存内容写入文Ӟ?span>online redo log做归档,所以数据库备䆾中包含的是备份时数据库的x点信息,完整而且有效。以后做恢复Ӟ可以恢复到最后一?span>FULL ONLINE备䆾的状态?/font>
1. 重新安装Windowspȝ?span>Remote Agent for Windows ServerQؓ恢复Oracle服务器准备环境?/span>
2. 恢复最后一?span>FULL CLOSED备䆾Q重新启动计机?/span>
此时WindowspȝQ?span>Oracle数据库系l都是完整的Q只?span>Oracle数据库中可能不是最新的数据?span>Backup Exec Agent for Oracle Server也不用重新安装了?/font>
3. ?span>SQLPlus?span>SYS?span>sysdbaw䆾q接到数据库pȝQ关闭数据库?nbsp;
shutdown immediate + < enter >
4. 通过介质服务器恢复最新的FULL ONLINE备䆾Q恢复作业属性的高选项中,保选中?span>“Restore over Existing filesQ覆盖现存文Ӟ” 选项?/span>
要想成功的恢复数据库Q在最后一?span>FULL CLOSED备䆾之后的所?span>redo log必须都已l成功归档ƈ备䆾。少了哪一个,数据库就无法恢复到最后的FULL ONLI NE备䆾时的状态?/font>
通过Oracle?span>alert log可以看到数据库的恢复需要哪些归档日志,以及你应该把它们恢复C么位|?/font>
5. 恢复完成后,?span>SYS用户?span>sysdbaw䆾q接到数据库Q将数据库加载到mount阶段Q?/span>
startup mount + < enter >
6. 数据?span>mount完成后,执行recoverq程Q?/font>
recover database using backup controlfile + < enter >
数据库会提示你需要哪些日志:
ORA-00279: Change 36579 generated at needed for thread 1
ORA-00289: Suggestion : \Oracle_Home\Oradata\\%SID%T00036579.ARC
ORA-00280: {=Suggested | filename | AUTO | FROM logsource | CANCEL}
最单的Ҏ是选自动恢复:
auto + < enter >
pȝ会在init.ora文g中定义的位置上查找所有必需的日志ƈ依次应用它们Q最后一个要应用的日志是online redo logQ实际上它ƈ不包括Q何的transactionQ只有一?span>SCNQ可以略q,但是自动恢复q程会因为找不到相应的文件而报错:
ORA-00308: cannot open archived log
E:\ORACLE\ORADATA\KIMSTAD\ARCHIVE\KIMSTADT00036949.ARC'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) The system cannot find the file specified.
为此输入以下命oQ?span>until cancel参数使我们可以在需要的时候中止恢复过E)Q?/font>
recover database until cancel using backup controlfile +
q样在数据库恢复的最后阶D再ơ提C前面的错误Ӟ我们可以中止恢复过E:
cancel + < enter >
q时除了最后一?span>online redo log以外Q所有的commit transaction都已l提交到数据库之中了Q完成后会显C:
Media recovery canceled
实际上恢复过E已l正常完成了?/font>
最后是打开数据库ƈ同步日志序列P
alter database open resetlogs + < enter >
xQ?span>Oracle数据库被成功恢复到最后一?span>Full Online备䆾?/font>
说明Q?/span>Oracle 8i可以?/span>internal账号完成DBA操作?/span>9i取消?/span>internal账号Q?/span>SYS账号代替它了。ؓ了以DBAw䆾dQ启?/span>SQL Plus时应该加nolog参数Q进入之后再dQ?/span>connect username/password as sysdba?/span>
Z验我为公司开发的Oracle数据库在U自动备份系l,我根?#8220;Oracle数据库在U自动备份系l?#8221;产生的备份文件来重徏和恢?/span>Oracle数据库。ؓ了让大家׃n其方法和步骤Q也适合于用其它方式?/span>Oracle做的热备份进行重建数据库Q现整理如下?/span>
一、系l环?/span>
本次试所使用的系l环境如下:
1Q?/span> g环境
服务器:Dell PowerEdge 1300 (CPUQ?/span>P?/span> 550MHz 内存Q?/span>128MB 盘Q?/span>36GB)
2Q?/span> 软g环境
操作pȝQ?/span>UnixWare 7.1
数据库: Oracle
Oracle安装路径Q?/span>/home/oracle
备䆾文gQ所有数据库文g、控制文件、初始化文g、数据库备䆾以来的所有归档日志文件?/span>
二、恢复步?/span>
下面Ҏ从用户处带回来的备䆾数据Q在一台新的服务器重徏Oracle数据库。其详细步骤如下Q?/span>
1. 创徏数据库恢复用的环境
在新?/span>Dell服务器上Q安装与原来的数据库服务器相同的操作pȝUnixWare 7.1Q然后安装与原数据库相同版本?/span>Oracle 8.1.6 for Unix 企业版?/span>
2. 删除新服务器上的Oracle实例
启动新数据库服务器上?/span>OracleQ在sqlplus中,查找到数据库文g的\径,q保存在当前路径下的文gfile_name.txt中:
$ sqlplus system/manager
SQL> spool file_name.txt
SQL> select file_name from sys.dba_data_files;
SQL> spool end
SQL>exit
关闭新服务器?/span>OracleQ然后根据文?/span>file_name.txt中的路径Q删除新装的Oracle实例的所有数据库文g?/span>
注:从本步开始所有操作都是用Oracle用户d操作pȝQ?/span>UnixQ后q行。文中所有的黑色_体5号字W?/span>(标题除外)的语句可以直接执行,黑色倾斜_体5号字W的语句需要修改后执行?/span>
3. 恢复数据库文?/span>
把备份的所有数据库文g?/span>Ftp上传新的数据库服务器中的相同路径下。如果原来的路径已不存在Q可以拷贝到其他路径下,恢复时详l处理方法见步骤7?/span><2>?/span>
4. 恢复初始化参数文?/span>
把备份的initSID.ora文g?/span>Ftp上传到新数据库服务器?/span>Oracle实例?/span>initSID.ora文g位置Q覆盖之。其位置一般在$ORACLE_HOME/dbs目录下?/span>
5. 恢复控制文g
把备份的ControlFile.bak文g?/span>Ftp上传到新数据库服务器?/span>Oracle实例的各个镜像\径下Qƈ按初始化参数文ginitSID.ora中的该项的位|和名称命名?/span>
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")
其\径如有变动,在初始化参数文ginitSID.ora中修改如上内容的路径和名Uͼ使其实际路径与该参数的\径一致?/span>
6. 恢复归档日志文g
把数据库备䆾后的归档日志?/span>Ftp上传到新数据库服务器的相同\径下。\径如有变动可以根据初始化参数文ginitSID.ora中如下位|进行修改,使其实际路径与该参数的\径一致?/span>
log_archive_dest_1 = "location=/home/oracle/app/oracle/admin/ora816/arch"
7. 恢复数据?/span>
l过以上6个步骤,把所有的备䆾文g已经上传C新数据库服务器中。下面开始根据这些文件恢复ƈ启动数据库,先在操作pȝ的提C符下做如下操作Q?/span>
$svrmgrl
SVRMGR>connect internal
SVRMGR>startup mount
<1> 创徏口o文g
如果原来的数据库配置了口令文Ӟq且?/span>mount数据库时报如下错误:
ORA-01990: error opening password file '/home/oracle/app/oracle/product/8.1.6/dbs/orapw'
可以?/span>/home/oracle/app/oracle/product/8.1.6/dbs/路径下,用以下命令创建口令文Ӟ
orapwd
其用法如下:
Usage: orapwd file=<fname> password=<password> entries=<users>
where
file - name of password file (mand),Q口令文件的命名方式为:orapwSIDQ?/span>
password - password for SYS and INTERNAL (mand),
entries - maximum number of distinct DBA and OPERs (opt),
There are no spaces around the equal-to (=) character.
例如Q?/span> orapwd file=orapwora816 password=manager
然后重新执行如下语句mount数据库:
SVRMGR>startup mount?/span>
<2> 修改数据库文件的路径
如果在上q的步骤3中修改了恢复的数据库文g的\径,可以用如下语句对数据库文仉新命?/span> Q?/span>
alter database rename file 'old_file' to 'new_file';
如把原来路径/home/oracle/app/oracle/oradata/ora816下的文gsystem01.dbf改到?/span>/u21/oracle/app/oracle/oradata/ora816下:
SVRMGR>alter database rename file
'/home/oracle/app/oracle/oradata/ora816/system01.dbf'
to '/u21/oracle/app/oracle/oradata/ora816/system01.dbf';
按照上面的方法把所有修改\径的数据库文仉新命名?/span>
<3> Ҏ控制文g和归档日志文件恢复数据库
下面开始用控制文g和归档日志文件恢复数据库Q?/span>
SVRMGR>recover database using backup controlfile until cancel;
出现如下提示Q?/span>
ORA-00279: change 50971 generated at 08/23/2002 09:21:27 needed for thread 1
ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc
ORA-00280: change 50971 for thread 1 is in sequence #399
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}输入Q?/span>
auto
如果有如下提C,则表C成功?/span>
ORA-00279: change 51007 generated at 08/23/2002 11:23:13 needed for thread 1
ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc
ORA-00280: change 51007 for thread 1 is in sequence #400
ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_399.arc' noy
Log applied.
意外处理Q如果其它提C可能是需要的日志文g不存在,?/span>ORA-00289中该文g是否存在?/span>
直到出现如下提示Q?/span>
ORA-00279: change 51011 generated at 08/23/2002 11:23:45 needed for thread 1
ORA-00289: suggestion: /home/oracle/app/oracle/admin/ora8/arch/arch_1_401.arc
ORA-00280: change 51011 for thread 1 is in sequence #401
ORA-00278: log file '/home/oracle/app/oracle/admin/ora8/arch/arch_1_400.arc' noy
ORA-00308: cannot open archived log '/home/oracle/app/oracle/admin/ora8/arch
/arch_1_401.arc'
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3
<4> 重置日志
SVRMGR>alter database open resetlogs;
意外处理Q如果提C创建日志的路径不存在,按提C\径创建目录。然后再重置日志?/span>
<5> 重启数据库,完成恢复
SVRMGR>shutdown immediate
SVRMGR>startup
ORACLE instance started.
Total System Global Area 123437040 bytes
Fixed Size 69616 bytes
Variable Size 106418176 bytes
Database Buffers 16777216 bytes
Redo Buffers 172032 bytes
Database mounted.
Database opened.
数据库正常打开Q数据库重徏恢复成功?/span>
在这里没有讨论多么深入的RMAN技术,也没有告诉大家这样去~写备䆾脚本Q这q不是我的初P我只x我会的写出来Q和大家一起学习,一赯步,谢谢?/span>
1、切换服务器归档模式Q如果已l是归档模式可蟩q此步:
%sqlplus /nolog (启动sqlplus)
SQL> conn / as sysdba (?/span>DBAw䆾q接数据?/span>)
SQL> shutdown immediate; (立即关闭数据?/span>)
SQL> startup mount (启动实例q加载数据库Q但不打开)
SQL> alter database archivelog; (更改数据库ؓ归档模式)
SQL> alter database open; (打开数据?/span>)
SQL> alter system archive log start; (启用自动归档)
SQL> exit (退?/span>)
2、连接:
%rman target=rman/rman@mydb (启动恢复理?/span>)
3、基本设|:
RMAN> configure default device type to disk; (讄默认的备份设备ؓ盘)
RMAN> configure device type disk parallelism 2; (讄备䆾的ƈ行别,通道?/span>)
RMAN> configure channel 1 device type disk fromat '/backup1/backup_%U'; (讄备䆾的文件格式,只适用于磁盘设?/span>)
RMAN> configure channel 2 device type disk fromat '/backup2/backup_%U'; (讄备䆾的文件格式,只适用于磁盘设?/span>)
RMAN> configure controlfile autobackup on; (打开控制文g与服务器参数文g的自动备?/span>)
RMAN> configure controlfile autobackup format for device type disk to '/backup1/ctl_%F'; (讄控制文g与服务器参数文g自动备䆾的文件格?/span>)
4、查看所有设|:
RMAN> show all
5、查看数据库Ҏ报表Q?/span>
RMAN> report schema;
6、备份全库:
RMAN> backup database plus archivelog delete input; (备䆾全库及控制文件、服务器参数文g与所有归档的重做日志Qƈ删除旧的归档日志)
7、备份表I间Q?/span>
RMAN> backup tablespace system plus archivelog delete input; (备䆾指定表空间及归档的重做日志,q删除旧的归档日?/span>)
8、备份归档日志:
RMAN> backup archivelog all delete input;
9、复制数据文Ӟ
RMAN> copy datafile 1 to '/oracle/dbs/system.copy';
10、查看备份和文g复本Q?/span>
RMAN> list backup;
11、验证备份:
RMAN> validate backupset 3;
12、从自动备䆾中恢复服务器参数文gQ?/span>
RMAN> shutdown immediate; (立即关闭数据?/span>)
RMAN> startup nomount; (启动实例)
RMAN> restore spfile to pfile '/backup1/mydb.ora' from autobackup; (从自动备份中恢复服务器参数文?/span>)
13、从自动备䆾中恢复控制文Ӟ
RMAN> shutdown immediate; (立即关闭数据?/span>)
RMAN> startup nomount; (启动实例)
RMAN> restore controlfile to '/backup1' from autobackup; (从自动备份中恢复控制文g)
13、恢复和复原全数据库Q?/span>
RMAN> shutdown immediate; (立即关闭数据?/span>)
RMAN> exit (退?/span>)
%mv /oracle/dbs/tbs_12.f /oracle/dbs/tbs_12.bak (数据文仉命名)
%mv /oracle/dbs/tbs_13.f /oracle/dbs/tbs_13.bak (数据文仉命名)
%mv /oracle/dbs/tbs_14.f /oracle/dbs/tbs_14.bak (数据文仉命名)
%mv /oracle/dbs/tbs_15.f /oracle/dbs/tbs_15.bak (数据文仉命名)
%rman target=rman/rman@mydb (启动恢复理?/span>)
RMAN> startup pfile=/oracle/admin/mydb/pfile/initmydb.ora (指定初始化参数文件启动数据库)
RMAN> restore database; (q原数据?/span>)
RMAN> recover database; (恢复数据?/span>)
RMAN> alter database open; (打开数据?/span>)
14、恢复和复原表空_
RMAN> sql 'alter tablespace users offline immediate'; (表I间脱机)
RMAN> exit (退出恢复管理器)
%mv /oracle/dbs/users01.dbf /oracle/dbs/users01.bak (表I间重命?/span>)
%rman target=rman/rman@mydb (启动恢复理?/span>)
RMAN> restore tablespace users; (q原表空?/span>)
RMAN> recover tablespace users; (恢复表空?/span>)
RMAN> sql 'alter tablespace users online'; (表I间联机)
15、增量备份与恢复Q?/span>
W一天的增量基本备䆾Q?/span>
RMAN> backup incremental level=0 database plus archivelog delete input;
W二天的增量差异备䆾Q?/span>
RMAN> backup incremental level=2 database plus archivelog delete input;
W三天的增量差异备䆾Q?/span>
RMAN> backup incremental level=2 database plus archivelog delete input;
W四天的增量差异备䆾Q?/span>
RMAN> backup incremental level=1 database plus archivelog delete input;
W五天的增量差异备䆾Q?/span>
RMAN> backup incremental level=2 database plus archivelog delete input;
W六天的增量差异备䆾Q?/span>
RMAN> backup incremental level=2 database plus archivelog delete input;
W七天的增量差异备䆾Q?/span>
RMAN> backup incremental level=0 database plus archivelog delete input;
增量恢复Q?/span>
RMAN> shutdown immediate;
RMAN> exit
%mv /oracle/dbs/tbs_12.f /oracle/dbs/tbs_12.bak
%mv /oracle/dbs/tbs_13.f /oracle/dbs/tbs_13.bak
%mv /oracle/dbs/tbs_14.f /oracle/dbs/tbs_14.bak
%mv /oracle/dbs/tbs_15.f /oracle/dbs/tbs_15.bak
%rman target=rman/rman@mydb
RMAN> startup pfile=/oracle/admin/mydb/pfile/initmydb.ora
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;
select count(*) from record where date >
''19991201'' and date < ''19991214''and amount >
2000 (25U?
select date,sum(amount) from record group by date
(55U?
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'') (27U?
select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000 Q?4U)
select date,sum(amount) from record group by date
Q?8U)
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'')Q?4U)
select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000 Q?6U)
select date,sum(amount) from record group by date
Q?7U)
select count(*) from record where date >
''19990901'' and place in (''BJ, ''SH'')Q?lt; 1U)
select count(*) from record where date >
''19991201'' and date < ''19991214'' and amount >
2000(< 1U?
select date,sum(amount) from record group by date
Q?1U)
select count(*) from record where date >
''19990901'' and place in (''BJ'',''SH'')Q?lt; 1U)
分析Q?
q是一个合理的l合索引。它date作ؓ前导列,使每个SQL都可以利用烦引,q且在第一和第三个SQL中Ş成了索引覆盖Q因而性能辑ֈ了最优?
5.ȝQ?
~省情况下徏立的索引是非集索引Q但有时它ƈ不是最佳的Q合理的索引设计要徏立在对各U查询的分析和预上。一般来_
?有大量重复倹{且l常有范围查?
Qbetween, >,< 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_noQ?0U)
SQL改ؓQ?
select sum(a.amount) from account a,
card b where a.card_no = b.card_no and a.
account_no=b.account_noQ?lt; 1U)
分析Q?
在第一个连接条件下Q最x询方案是account作外层表Qcard作内层表Q利用card上的索引Q其I/Oơ数可由以下公式估算为:
外层表account上的22541?Q外层表account?91122?内层表card上对应外层表W一行所要查扄3)=595907ơI/O
在第二个q接条g下,最x询方案是card作外层表Qaccount作内层表Q利用account上的索引Q其I/Oơ数可由以下公式估算为:
外层表card上的1944?Q外层表card?896?内层表account上对应外层表每一行所要查扄4)= 33528ơI/O
可见Q只有充份的q接条gQ真正的最x案才会被执行?
ȝQ?
1.多表操作在被实际执行前,查询优化器会Ҏq接条gQ列出几l可能的q接Ҏq从中找出系l开销最的最x案。连接条件要充䆾考虑带有索引的表、行数多的表Q内外表的选择可由公式Q外层表中的匚w行数*内层表中每一ơ查扄ơ数定Q乘U最ؓ最x案?
2.查看执行Ҏ的方?- 用set showplanonQ打开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''(13U?
select * from record where
amount/30< 1000Q?1U)
select * from record where
convert(char(10),date,112)=''19991201''Q?0U)
分析Q?
where子句中对列的M操作l果都是在SQLq行旉列计算得到的,因此它不得不q行表搜索,而没有用该列上面的索引Q如果这些结果在查询~译时就能得刎ͼ那么可以被SQL优化器优化,使用索引Q避免表搜烦Q因此将SQL重写成下面这P
select * from record where card_no like
''5378%''Q?lt; 1U)
select * from record where amount
< 1000*30Q?lt; 1U)
select * from record where date= ''1999/12/01''
Q?lt; 1U)
你会发现SQL明显快v来!
2.例:表stuff?00000行,id_no上有非群集烦引,L下面q个SQLQ?
select count(*) from stuff where id_no in(''0'',''1'')Q?3U)
select count(*) from stuff where id_no=''0''
select count(*) from stuff where id_no=''1''
得到两个l果Q再作一ơ加法合。因为每句都使用了烦引,执行旉只有3U,?20000行下Q时间也只有4U。或者,用更好的Ҏ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设计?