1.  情景描述: 
  2.  
  3.   
  4.  
  5. 有朋友问,MSSQLSERVER将数据库备份还原到其它机器很方便,基本就是傻瓜式操作,oracle有控制文件、参数文件一堆东西, 
  6.  
  7. 觉得还原很复杂;其实不然,我抽出了点时间,简单演示下案例,朋友们,参考下!为了简单快速,我采用RMAN备份和还原 
  8.  
  9.   
  10.  
  11.   
  12.  
  13.   
  14.  
  15.   
  16.  
  17. --说明: 
  18. (1).RMAN备份到异机恢复的时候,db_name需要相同。 
  19.  
  20. 如果说要想改成其他的实例名,可以在恢复成功后,用nid 命令修改。 实例名的信息会 
  21. 记录到控制文件里,所以如果在恢复的时候,如果实例名不一致,恢复的时候会报错。 
  22.  
  23.  
  24. (2).恢复的路径和源库不一致时,就需要在restore命令中使用set 命令指定新位置, 
  25. 并且使用switch datafile all将变更信息更新的到控制文件中。 
  26.  
  27.   
  28.  
  29.  
  30. 测试环境: 
  31.  
  32. 源数据库服务器A,安装在E,备份目录已在E盘; 
  33.  
  34.  
  35. 源数据库服务器B,安装在F盘. 
  36.  
  37.   
  38.  
  39.   
  40.  
  41.   
  42.  
  43. ------------------------------------ 
  44.  
  45. 一、源数据库准备工作 
  46.  
  47. ------------------------------------ 
  48.  
  49. --1. 查询DBID 
  50.  
  51.   
  52.  
  53. SQL> select name,dbid from v$database
  54.  
  55. NAME            DBID 
  56. --------- ---------- 
  57. ORCL       1320546556 
  58.  
  59.   
  60.  
  61. --2. 备份源数据DB 
  62.  
  63. run { 
  64. configure retention policy to recovery window of 14 days; 
  65. configure controlfile autobackup on;  --自动开启控制文件备份 
  66. configure controlfile autobackup format for device type disk to 'E:\backup\controlfile\bak_%F'
  67. allocate channel c1 device type disk format  'E:\backup\data\bak_%u'
  68. allocate channel c2 device type disk format 'E:\backup\data\bak_%u'
  69. sql 'alter system archive log current'
  70. backup incremental level=0 database skip inaccessible  
  71. plus archivelog filesperset 20 
  72. delete all input; 
  73. release channel c1; 
  74. release channel c2; 
  75. allocate channel for maintenance device type disk; 
  76. crosscheck backupset; 
  77. delete noprompt obsolete; 
  78.  
  79.  
  80. --或 
  81.  
  82. run { 
  83. configure retention policy to recovery window of 14 days; 
  84. allocate channel c1 device type disk format  'E:\backup\data\bak_%u'
  85. allocate channel c2 device type disk format 'E:\backup\data\bak_%u'
  86. sql 'alter system archive log current'
  87. backup incremental level=0 database skip inaccessible  
  88. plus archivelog filesperset 20 
  89. delete all input; 
  90. --手动直接指明备份文件名和路径 
  91. backup current controlfile tag='bak_ctrollfile' format='E:\backup\controlfile\bak_ctl_file_%U_%T'
  92. backup spfile tag='bak_spfile' format='E:\backup\controlfile\bak_spfile_%U_%T'
  93. release channel c1; 
  94. release channel c2; 
  95. allocate channel for maintenance device type disk; 
  96. crosscheck backupset; 
  97. delete noprompt obsolete; 
  98.  
  99.   
  100.  
  101. --3.手动备份spfile 
  102.  
  103. create pfile='E:\backup\inittest.ora' from spfile; 
  104.  
  105.  
  106. ------------------------------------ 
  107.  
  108. 二、目标库准备工作: 
  109.  
  110. ------------------------------------ 
  111.  
  112. ---步骤1. 创建口令文件 
  113.  
  114. --如果有就不需要新建. 
  115.  
  116. orapwd file=F:\app\Administrator\product\11.2.0\dbhome_1\database\PWDorcl.ora password=password 
  117.  
  118.   
  119.  
  120. --步骤2.恢复参数文件 
  121.  
  122.  
  123. --方法1.源数据库spfile并拷贝到B数据库服务器 
  124.  
  125.  
  126. \\192.168.2.25\e$\backup\inittest.ORA 
  127. 复制到 
  128. E:\bk\inittest.ORA 
  129.  
  130.   
  131.  
  132.   
  133.  
  134.  
  135. --步骤3.编辑参数文件中的文件路径 
  136.  
  137. 如路径和原来一样,则不需修改 
  138.  
  139.  eg: 
  140.  - *_DUMP_DEST 
  141.  - LOG_ARCHIVE_DEST* 
  142.  - CONTROL_FILES 
  143.   
  144.  
  145. ---实例: 
  146.  
  147. orcl.__db_cache_size=939524096 
  148. orcl.__java_pool_size=16777216 
  149. orcl.__large_pool_size=16777216 
  150. orcl.__oracle_base='F:\app\Administrator'#修改路径 
  151. orcl.__pga_aggregate_target=855638016 
  152. orcl.__sga_target=2550136832 
  153. orcl.__shared_io_pool_size=0 
  154. orcl.__shared_pool_size=1526726656 
  155. orcl.__streams_pool_size=16777216 
  156. *.audit_file_dest='F:\app\Administrator\admin\orcl\adump'  #修改路径 
  157. *.audit_trail='db' 
  158. *.compatible='11.2.0.0.0' 
  159. #修改路径 
  160. *.control_files='F:\app\Administrator\oradata\orcl\control01.ctl','F:\app\Administrator\oradata\orcl\control02.ctl','F:\app\Administrator\oradata\orcl\control03.ctl' 
  161. *.db_block_size=8192 
  162. *.db_domain='' 
  163. *.db_name='orcl' 
  164. *.db_recovery_file_dest='F:\arch'  #修改路径 
  165. *.db_recovery_file_dest_size=6442450944 
  166. *.diagnostic_dest='F:\app\Administrator'  #修改路径 
  167. *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' 
  168. *.log_archive_dest_1='location=f:\arch'  #修改路径 
  169. *.nls_date_format='yyyy-mm-dd hh:mi:ss' 
  170. *.open_cursors=300 
  171. *.optimizer_capture_sql_plan_baselines=TRUE 
  172. *.pga_aggregate_target=845152256 
  173. *.processes=150 
  174. *.remote_login_passwordfile='EXCLUSIVE' 
  175. *.sga_target=2536505344 
  176. *.skip_unusable_indexes=TRUE 
  177. *.undo_tablespace='UNDOTBS1' 
  178.  
  179.   
  180.  
  181.   
  182.  
  183. --步骤4.重启实例,使用已编辑好的参数文件 
  184.  
  185. 将用pfile将B数据库服务器启动到nomout 状态 
  186.  
  187. rman target / 
  188.  
  189. startup nomount pfile='e:\bk\inittest.ora' 
  190.  
  191.   
  192.  
  193.   
  194.  
  195.  
  196. --步骤5.恢复控制文件,装载数据库 
  197.   
  198.  
  199.  
  200. rman target / 
  201.  
  202.  
  203. set dbid 1320546556 
  204.  
  205.  
  206. restore controlfile from 'e:\bk\controlfile\BAK_CTL_FILE_6LO6SON4_1_1_20130412'
  207.  
  208.  
  209. 启动 restore 于 2013-04-11 13:58:58 
  210. 使用目标数据库控制文件替代恢复目录 
  211. 分配的通道: ORA_DISK_1 
  212. 通道 ORA_DISK_1: SID=129 设备类型=DISK 
  213.  
  214. 通道 ORA_DISK_1: 正在还原控制文件 
  215. 通道 ORA_DISK_1: 还原完成, 用时: 00:00:01 
  216. 输出文件名=F:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL 
  217. 输出文件名=F:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL02.CTL 
  218. 输出文件名=F:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL03.CTL 
  219. 完成 restore 于 2013-04-11 13:59:00 
  220.  
  221.   
  222.  
  223.  
  224. --步骤6.将DB启动到mout状态 
  225.  
  226. alter database mount; 
  227.  
  228. 数据库已装载 
  229. 释放的通道: ORA_DISK_1 
  230.  
  231.  
  232. --加载备份目录 
  233.  
  234. CATALOG START WITH 'E:\bk'
  235.  
  236. 搜索与样式 E:\bk 匹配的所有文件 
  237.  
  238. 数据库未知文件的列表 
  239. ==================================== 
  240. 文件名: E:\bk\controlfile\BAK_C-1320546556-20130411-03 
  241. 文件名: E:\bk\controlfile\BAK_CTL_FILE_65O6QILO_1_1_20130411 
  242. 文件名: E:\bk\controlfile\BAK_SPFILE_66O6QILQ_1_1_20130411 
  243. 文件名: E:\bk\data\BAK_60O6QIGV 
  244. 文件名: E:\bk\data\BAK_61O6QIGV 
  245. 文件名: E:\bk\data\BAK_62O6QIH1 
  246. 文件名: E:\bk\data\BAK_63O6QIH1 
  247. 文件名: E:\bk\data\BAK_64O6QILM 
  248.  
  249. 是否确实要将上述文件列入目录 (输入 YES 或 NO)? yes 
  250. 正在编制文件目录... 
  251. 目录编制完毕 
  252.  
  253. 已列入目录的文件的列表 
  254. ====================== 
  255. 文件名: E:\bk\controlfile\BAK_C-1320546556-20130411-03 
  256. 文件名: E:\bk\controlfile\BAK_CTL_FILE_65O6QILO_1_1_20130411 
  257. 文件名: E:\bk\controlfile\BAK_SPFILE_66O6QILQ_1_1_20130411 
  258. 文件名: E:\bk\data\BAK_60O6QIGV 
  259. 文件名: E:\bk\data\BAK_61O6QIGV 
  260. 文件名: E:\bk\data\BAK_62O6QIH1 
  261. 文件名: E:\bk\data\BAK_63O6QIH1 
  262. 文件名: E:\bk\data\BAK_64O6QILM 
  263.  
  264.   
  265.  
  266.   
  267.  
  268.  
  269. --步骤7.restore 数据库 
  270.  
  271.  
  272. 7.1 恢复目录不同的情况: 
  273.  
  274.   
  275.  
  276.  
  277. 到Target 库查询一下: 
  278. SQL>  select trim(file_id),trim(file_name) from dba_data_files ORDER BY FILE_ID ASC
  279.  
  280. 1 E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF 
  281. 2 E:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF 
  282. 3 E:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF 
  283. 4 E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF 
  284. 6 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY02.DBF 
  285. 7 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY03.DBF 
  286. 8 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY04.DBF 
  287. 9 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY05.DBF 
  288. 11 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY06.DBF 
  289. 12 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY07.DBF 
  290. 13 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY08.DBF 
  291. 14 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY09.DBF 
  292. 15 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY10.DBF 
  293. 16 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY01.DBF 
  294. 17 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY11.DBF 
  295. 18 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY12.DBF 
  296. 19 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY13.DBF 
  297. 20 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY14.DBF 
  298. 21 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY15.DBF 
  299. 22 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY16.DBF 
  300. 23 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY17.DBF 
  301. 24 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY18.DBF 
  302. 25 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY19.DBF 
  303. 26 E:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY20.DBF 
  304.  
  305.   
  306.  
  307.  
  308. SQL>select trim(file_id),trim(file_name) from dba_temp_files; 
  309.  
  310. 1 E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP01.DBF 
  311.  
  312.   
  313.  
  314.   
  315.  
  316. select 'SET NEWNAME FOR DATAFILE'|| ' '||file_id||' '||'TO'|| ' '||''''||trim(file_name)||'''' ||';' 
  317. from dba_data_files ORDER BY FILE_ID ASC
  318.  
  319. ---如下实例: 
  320.  
  321.  
  322. RUN 
  323. # rename the datafiles  
  324. SET NEWNAME FOR DATAFILE 1 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF'
  325. SET NEWNAME FOR DATAFILE 2 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF'
  326. SET NEWNAME FOR DATAFILE 3 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF'
  327. SET NEWNAME FOR DATAFILE 4 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF'
  328. SET NEWNAME FOR DATAFILE 6 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY02.DBF'
  329. SET NEWNAME FOR DATAFILE 7 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY03.DBF'
  330. SET NEWNAME FOR DATAFILE 8 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY04.DBF'
  331. SET NEWNAME FOR DATAFILE 9 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY05.DBF'
  332. SET NEWNAME FOR DATAFILE 11 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY06.DBF'
  333. SET NEWNAME FOR DATAFILE 12 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY07.DBF'
  334. SET NEWNAME FOR DATAFILE 13 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY08.DBF'
  335. SET NEWNAME FOR DATAFILE 14 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY09.DBF'
  336. SET NEWNAME FOR DATAFILE 15 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY10.DBF'
  337. SET NEWNAME FOR DATAFILE 16 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY01.DBF'
  338. SET NEWNAME FOR DATAFILE 17 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY11.DBF'
  339. SET NEWNAME FOR DATAFILE 18 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY12.DBF'
  340. SET NEWNAME FOR DATAFILE 19 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY13.DBF'
  341. SET NEWNAME FOR DATAFILE 20 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY14.DBF'
  342. SET NEWNAME FOR DATAFILE 21 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY15.DBF'
  343. SET NEWNAME FOR DATAFILE 22 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY16.DBF'
  344. SET NEWNAME FOR DATAFILE 23 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY17.DBF'
  345. SET NEWNAME FOR DATAFILE 24 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY18.DBF'
  346. SET NEWNAME FOR DATAFILE 25 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY19.DBF'
  347. SET NEWNAME FOR DATAFILE 26 TO 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\VPAY20.DBF'
  348. SQL "ALTER DATABASE RENAME FILE ''E:\app\Administrator\oradata\orcl\REDO01.LOG'' 
  349. TO ''F:\app\Administrator\oradata\orcl\REDO01.LOG'' "; 
  350. SQL "ALTER DATABASE RENAME FILE ''E:\app\Administrator\oradata\orcl\REDO02.LOG'' 
  351. TO ''F:\app\Administrator\oradata\orcl\REDO02.LOG'' "; 
  352. SQL "ALTER DATABASE RENAME FILE ''E:\app\Administrator\oradata\orcl\REDO03.LOG'' 
  353. TO ''F:\app\Administrator\oradata\orcl\REDO03.LOG'' "; 
  354. RESTORE DATABASE
  355. SWITCH DATAFILE ALL
  356.  
  357.   
  358.  
  359.  
  360. 对switch datafile all的说明: 
  361. --对于nocatalog 模式下,rman备份的信息是保存在控制文件里的,包括文件的路径信息。 这里的switch datafile all的作用,就是更新控制文件里的信息。 
  362.  
  363.  
  364. --步骤8.recover 数据库 
  365.  
  366. RECOVER DATABASE
  367.  
  368.  
  369. /***常见错误: 
  370.  
  371. 归档日志线程=1 序列=1696 
  372. RMAN-00571: =========================================================== 
  373. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== 
  374. RMAN-00571: =========================================================== 
  375. RMAN-03002: recover 命令 (在 04/11/2013 15:18:07 上) 失败 
  376. RMAN-06054: 介质恢复正在请求未知的线程 1 序列 1696 的归档日志以及起始 SCN 240793 
  377. 29 
  378.  
  379.  
  380. ---解决方法: 
  381.  
  382. RMAN> recover database until scn 24159677; 
  383.  
  384. 启动 recover 于 2013-04-11 15:29:05 
  385. 使用通道 ORA_DISK_1 
  386.  
  387. 正在开始介质的恢复 
  388. 介质恢复完成, 用时: 00:00:02 
  389.  
  390. 完成 recover 于 2013-04-11 15:29:11 
  391.  
  392. ***/ 
  393.  
  394.   
  395.  
  396.   
  397.  
  398. ----步骤9.open...resetlogs打开数据库 
  399.  
  400. alter database open resetlogs; 
  401.  
  402.   
  403.  
  404.  
  405. /*******常见错误: 
  406.  
  407. RMAN> alter database open resetlogs; 
  408.  
  409. RMAN-00571: =========================================================== 
  410. RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== 
  411. RMAN-00571: =========================================================== 
  412. RMAN-03002: alter db 命令 (在 04/11/2013 15:38:25 上) 失败 
  413. ORA-00392: 日志 1 (用于线程 1) 正被清除, 不允许操作 
  414. ORA-00312: 联机日志 1 线程 1: 'F:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG' 
  415.  
  416.   
  417.  
  418. ----解决办法: 
  419.  
  420.  
  421. SQL> select group#,bytes/1024/1024||'M',status from v$log; 
  422.  
  423.     GROUP# BYTES/1024/1024||'M'                      STATUS 
  424. ---------- ----------------------------------------- ---------------- 
  425.          1 50M                                       CLEARING_CURRENT 
  426.          3 50M                                       CLEARING 
  427.          2 50M                                       CLEARING 
  428.  
  429.   
  430.  
  431. SQL> alter database clear logfile group 1;  --清空日志文件 
  432.  
  433.   
  434.  
  435. SQL> alter database clear logfile group 2; 
  436.  
  437.   
  438.  
  439. SQL> alter database clear logfile group 3; 
  440.  
  441.  
  442. SQL> select group#,bytes/1024/1024||'M',status from v$log; 
  443.  
  444.    GROUP# BYTES/1024/1024||'M'                      STATUS 
  445. --------- ----------------------------------------- ---------------- 
  446.         1 50M                                       CURRENT 
  447.         3 50M                                       UNUSED 
  448.         2 50M                                       UNUSED 
  449.  
  450.   
  451.  
  452.   
  453.  
  454. *******/ 
  455.  
  456.   
  457.  
  458. ---步骤10:处理temp 临时表空间 
  459.  
  460. sqlplus / as sysdba 
  461.  
  462.  
  463. SQL> select name from v$tempfile; 
  464.  
  465. NAME 
  466.  
  467. -------------------------------------------------------------------------------- 
  468.  
  469. E:\app\Administrator\oradata\orcl\TEMP01.DBF   --控制文件中路径还在E盘 
  470.  
  471.   
  472.  
  473. --A数据库表空间offline 
  474.  
  475. SQL> alter database tempfile 'E:\app\Administrator\oradata\orcl\TEMP01.DBF' offline; 
  476.  
  477. Database altered. 
  478.  
  479.   
  480.  
  481. --在OS 级别移动temp的数据文件到B数据库服务器 
  482.  
  483. SQL> mv E:\app\Administrator\oradata\orcl\TEMP01.DBF  F:\app\Administrator\oradata\orcl\TEMP01.DBF 
  484.  
  485.   
  486.  
  487. --修改控制文件中temp文件的信息 
  488.  
  489. SQL> alter database rename file 'E:\app\Administrator\oradata\orcl\TEMP01.DBF' to 'F:\app\Administrator\oradata\orcl\TEMP01.DBF'
  490.  
  491.   
  492.  
  493.   
  494.  
  495. --temp 表空间online 
  496.  
  497. SQL> alter database tempfile 'F:\app\Administrator\oradata\orcl\TEMP01.DBF' online; 
  498.  
  499. Database altered. 
  500.  
  501.   
  502.  
  503. --验证 
  504.  
  505. SQL> select name from v$tempfile; 
  506.  
  507. NAME 
  508.  
  509. -------------------------------------------------------------------------------- 
  510.  
  511. F:\app\Administrator\oradata\orcl\TEMP01.DBF 
  512.  
  513.   
  514.  
  515.  
  516.