嘉善博客
张康乐的笔记
111
个人首页管理博客
个人资料
张康乐
博主:张康乐 [GG]
等级:4级
注册:2007-5-31 8:27:19
[加为好友] [友情链接]
文章分类
我的相册
暂无任何照片
上一张下一张
最新消息
最新评论

维护存储库目录 如果我们的备份文件中一部分是其他RMAN程序产生的,而我们的RMAN存储库中没有这些备份的记录,我们可以用CATALOG命令来维护我们的备份记录。 以下情况需要维护存储库的备份记录: 1、 我们利用其他命令(如系统命令等)产生了备份文件,想把这些文件加入RMAN存储库。 2、 利用备份控制文件执行恢复并且在恢复过程中改变了归档日志的路径或者格式,存储库中没有恢复需要的归档日志文件,我们必须把这些日志加入到RAMN存储库。 如果我们执行数据文件拷贝备份,没有LEVEL0备份而我们又想直接可以执行LEVEL1的增量备份,我们可以通过增加RMAN存储库的目录来实现。虽然不建议这么做,但是的确可以。 数据库版本升级,开始使用RMAN,我们可以把以前的热备份文件等加入到RMAN存储库。 给几个例子,维护用户备份文件到存储库目录: SQL> ALTER TABLESPACE users BEGIN BACKUP; % cp $ORACLE_HOME/oradata/trgt/users01.dbf /tmp/users01.dbf; SQL> ALTER TABLESPACE users END BACKUP; RMAN> CATALOG DATAFILECOPY '/tmp/users01.dbf'; CATALOG BACKUPPIECE '/disk2/09dtq55d_1_2', '/disk2/0bdtqdou_1_1'; 维护备份集到存储库目录: CATALOG BACKUPPIECE '/disk2/09dtq55d_1_2', '/disk2/0bdtqdou_1_1'; 备份集文件加入到存储库目录后可以在如下系统视图查找: V$BACKUP_PIECE, V$BACKUP_SET, V$BACKUP_DATAFILE, V$BACKUP_REDOLOG, and V$BACKUP_SPFILE. 维护所有备份文件到存储库目录: RMAN> CATALOG RECOVERY AREA; # catalog all files in the recovery area RMAN> CATALOG START WITH '+disk'; # catalog all files from an ASM disk group RMAN> CATALOG START WITH '/fs1/datafiles/'; # catalog all files in directory 从存储库目录删除记录: CHANGE ARCHIVELOG ... UNCATALOG. CHANGE CONTROLFILECOPY '/tmp/control01.ctl' UNCATALOG; CHANGE DATAFILECOPY '/tmp/system01.dbf' UNCATALOG; 至此我们粗略的讲述了RMAN的基本使用和功能,文中错误和不足敬请大家批评指正,以后有机会将完成RMAN的高级应用,共同期待。 1

多个通道执行交叉验证和删除备份 在执行CROSSCHECK和DELETE之前可以配置或者手工分配多个通道,RMAN将搜索和删除在不同类型的设备上执行的备份文件。适用以下情况: 1、 用一个命令交叉验证或者删除在不同设备上备份的文件(例如磁带和磁盘上都有备份文件)。 2、 交叉验证或者删除工作在RAC环境下备份到每个节点上的备份文件。 RMAN如何在多通道下执行CROSSCHECK和DELETE: 举个例子,我们的备份文件全部在磁盘上,磁带上没有备份文件,而我们给出了如下备份脚本,那么RMAN将会执行前边的两个磁盘CROSSCHECK而不会执行第三条磁带CROSSCHECK。 RUN ...{ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK CONNECT 'SYS/oracle@node1'; AlLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE DISK CONNECT 'SYS/oracle@node2'; ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE sbt; CROSSCHECK BACKUP OF DATABASE; } 注意:如果RMAN标记为EXPIRED状态的备份文件被修复后,我们执行DELETE EXPIRED BACKUP;命令后将会收到如下提示: RMAN> delete expired backup; 使用通道 ORA_DISK_1 备份段列表 BP 关键字 BS 关键字 Pc# Cp# 状态 设备类型段名称 ------- ------- --- --- ----------- ----------- ---------- 112 117 1 1 EXPIRED DISK D:\ORACLE\PRODUCT\10.2.0\FLASH_R ECOVERY_AREA\ROME\BACKUPSET\2007_02_05\O1_MF_NNNDF_TAG20070205T113315_2WF9CYG5_. BKP 是否确定要删除以上对象 (输入 YES 或 NO)? yes RMAN-06207: 警告: 由于状态不匹配, 所以不能删除 1 对象 (对于 DISK 通道)。 RMAN-06208: 请用 CROSSCHECK 命令修正状态 RMAN-06210: 不匹配对象的列表 RMAN-06211: ========================== RMAN-06212: 对象类型 文件名/句柄 RMAN-06213: --------------- --------------------------------------------------- RMAN-06214: Backup Piece D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BA CKUPSET\2007_02_05\O1_MF_NNNDF_TAG20070205T113315_2WF9CYG5_.BKP 一个命令交叉验证磁盘和磁带备份的例子: CONFIGURE DEVICE TYPE sbt PARALLELISM 1; CONFIGURE DEFAULT DEVICE TYPE to sbt; CROSSCHECK BACKUP OF DATABASE; 示例输出文件如下: allocated channel: ORA_SBT_TAPE_1 channel ORA_SBT_TAPE_1: sid=12 devtype=SBT_TAPE channel ORA_SBT_TAPE_1: WARNING: Oracle Test Disk API using channel ORA_DISK_1 crosschecked backup piece: found to be 'AVAILABLE' backup piece handle=/oracle/dbs/16c5esv4_1_1 recid=36 stamp=408384484 crosschecked backup piece: found to be 'AVAILABLE' backup piece handle=/oracle/dbs/c-674966176-20000915-01 recid=37 stamp=408384496 crosschecked backup piece: found to be 'AVAILABLE' backup piece handle=12c5erb2_1_1 recid=32 stamp=408382820 crosschecked backup piece: found to be 'AVAILABLE' backup piece handle=13c5erba_1_1 recid=33 stamp=408382829 crosschecked backup piece: found to be 'AVAILABLE' backup piece handle=14c5erce_1_1 recid=34 stamp=408382863 crosschecked backup piece: found to be 'AVAILABLE' backup piece handle=c-674966176-20000915-00 recid=35 stamp=408382869 如果没有配置磁带备份设备,也可以手工执行分配通道: ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE sbt; CROSSCHECK BACKUP OF DATABASE; RAC环境下交叉验证的例子: CONFIGURE DEVICE TYPE DISK PARALLELISM 2; CONFIGURE CHANNEL 1 DEVICE TYPE DISK CONNECT 'SYS/oracle@node_1'; CONFIGURE CHANNEL 2 DEVICE TYPE DISK CONNECT 'SYS/oracle@node_2'; CROSSCHECK BACKUP; 一个删除磁带和磁盘备份的例子: CONFIGURE DEVICE TYPE sbt PARALLELISM 1; CONFIGURE DEFAULT DEVICE TYPE TO sbt; DELETE BACKUPSET; 示例输出文件如下: using channel ORA_SBT_TAPE_1 using channel ORA_DISK_1 List of Backup Pieces BP Key BS Key Pc# Cp# Status Device Type Piece Name ------- ------- --- --- ----------- ----------- ---------- 388 387 1 1 AVAILABLE SBT_TAPE 12c5erb2_1_1 397 396 1 1 UNAVAILABLE SBT_TAPE 13c5erba_1_1 424 423 1 1 AVAILABLE SBT_TAPE 14c5erce_1_1 428 427 1 1 AVAILABLE SBT_TAPE c-674966176-20000915-00 433 432 1 1 AVAILABLE DISK /oracle/dbs/16c5esv4_1_1 437 436 1 1 AVAILABLE DISK /oracle/dbs/c-674966176-20000915-01 Do you really want to delete the above objects (enter YES or NO)? y deleted backup piece backup piece handle=/oracle/dbs/16c5esv4_1_1 recid=36 stamp=408384484 deleted backup piece backup piece handle=/oracle/dbs/c-674966176-20000915-01 recid=37 stamp=408384496 deleted backup piece backup piece handle=12c5erb2_1_1 recid=32 stamp=408382820 deleted backup piece backup piece handle=13c5erba_1_1 recid=33 stamp=408382829 deleted backup piece backup piece handle=14c5erce_1_1 recid=34 stamp=408382863 deleted backup piece backup piece handle=c-674966176-20000915-00 recid=35 stamp=408382869 释放多个通道,如下命令可以释放所有通道: RELEASE CHANNEL; 使用RMAN删除数据库 RMAN连接到处于MOUNT状态的TARGET数据库,就可以删除TARGET数据库,而不需要连接恢复目录;如果RMAN同时连接到恢复目录,并且指定INCLUDE COPIES AND BACKUPS参数,RMAN将删除恢复目录中的备份记录。 生成备份文件目录: RMAN>catalog start with 'd:\oracle\product\10.2.0\flash_recovery_area'; RMAN> DELETE BACKUPSET; # deletes all backups RMAN> DELETE COPY; # delete all image copies (including archived logs) RMAN> DROP DATABASE; # delete all database files and unregister the database 修改备份记录的状态: CHANGE DATAFILECOPY '/tmp/control01.ctl' UNAVAILABLE; CHANGE COPY OF ARCHIVELOG SEQUENCE BETWEEN 1000 AND 1012 UNAVAILABLE; CHANGE BACKUPSET 12 UNAVAILABLE; CHANGE BACKUP OF SPFILE TAG "TAG20020208T154556" UNAVAILABLE; CHANGE DATAFILECOPY '/tmp/system01.dbf' AVAILABLE; CHANGE BACKUPSET 12 AVAILABLE; CHANGE BACKUP OF SPFILE TAG "TAG20020208T154556" AVAILABLE; 修改备份记录状态使得保留冗余策略外的备份不被删除。 我们可以在执行备份的时候直接指定BACKUP...KEEP来把备份文件标记为长期备份。有一点需要注意,如果使用恢复目录来存储备份记录的话,我们应该执行BACKUP...KEEP FOREVER。 我们也可以用CHANGE命令来把一个备份标记为长期备份: CHANGE BACKUPSET 231 KEEP; CHANGE BACKUPSET 231 NOKEEP; CHANGE DATAFILECOPY '/tmp/system01.dbf' KEEP UNTIL 'SYSDATE+180';

恢复管理维护任务 这部分主要介绍一下如何管理维护RMAN存储库和快速恢复区: 1、 没有恢复目录的情况下如何管理RMAN存储库 2、 交叉验证备份(CROSSCHECKING BACKUP) 3、 删除备份 4、 利用RMAN删除数据库 5、 多个通道的情况下交叉验证和删除操作 6、 如何改变一个备份记录的状态 7、 归档日志目录和手工拷贝 8、 修改RMAN存储库目录 9、 维护快速恢复区 没有恢复目录的情况下管理RMAN存储库 备份控制文件: 如果没有恢复目录,控制文件的备份更加重要。要通过多个镜像控制文件或者操作系统镜像来备份变化了的控制文件。另外最好要配置控制文件的自动备份。 CONTROLFILE AUTOBACKUP ON 注意:如果从自动备份或者其他备份恢复了控制文件,最近执行的CONFIGURE配置内容将会被覆盖,回到备份时刻的设置。 监控控制文件记录重写: 没有恢复目录的情况下,oracle的控制文件记录了所有的历史备份记录,为了保证控制文件不会无限制的增长,oracle提供了一个可以设置控制文件保留时间的阀值的初始化参数:CONTROL_FILE_RECORD_KEEP_TIME。 例如我们设置了CONTROL_FILE_RECORD_KEEP_TIME=14,任何超过14天的纪录都有可能被覆盖,如果没有超过14天的记录,oracle将扩展控制文件的大小,如果由于受到操作系统的限制(比如磁盘空间满)无法扩展控制文件的大小,oracle会强制覆盖最老的记录并且在alter.log中记录这一情况。如下所示: kccwnc: following controlfile record written over: RECID #72 Recno 72 Record timestamp 07/28/00 22:15:21 Thread=1 Seq#=3460 Backup set key: stamp=372031415, count=17 Low scn: 0x0000.3af33f36 07/27/00 21:00:08 Next scn: 0x0000.3af3871b 07/27/00 23:23:54 Resetlogs scn and time scn: 0x0000.00000001 08/05/99 10:46:44 Block count=102400 Blocksize=512 快速恢复区Flash Recovery Area和 控制文件记录保存时间 参数 CONTROL_FILE_RECORD_KEEP_TIME之间的相互作用 如果我们在使用快速恢复区保留RMAN备份的话,控制文件将记录恢复区中文件的创建记录,因为一般来讲文件创建的记录要比执行备份的信息要晚,如果有备份文件超过了CONTROL_FILE_RECORD_KEEP_TIME参数所规定的时间,ORACLE试图删除这些这些文件,否则ORACLE将增加控制文件的大小并且在alter.log中记录这一情况。如下所示: kccwnc: tring to expand controlfile section nnnn for Oracle Managed Files 如果无法扩展控制文件,则alter.log中将出现以下信息: WARNING: Oracle Managed File filename is unknown to controlfile. This is the result of limitation in control file size that could not keep all recovery area files. 也就是不能满足备份的保留冗余策略来保存备份了。 为了避免和降低这种情况的发生,我们可以采取以下措施: 使用32K大小的块创建控制文件,如果想设置控制文件32K大小的BLOCK,我们必须首先把SYSTEM表空间设置成为大于或者等于控制文件使用的BLOCK SIZE。修改了控制文件BLOCK_SIZE后,必须重建控制文件。 使用BACKUP RECOVERY AREA命令备份快速恢复区使得快速恢复区的文件称为可以删除的文件, 或者减小备份保留时间或者减小备份保留冗余度 维护控制文件中的RMAN备份存储库 交叉验证备份CROSESSCHECK BACKUPS 验证备份存储库中的备份记录和磁盘(或者磁带)上的备份文件是否一致。如果用磁盘保存备份,CROSSCHECK检查文件头是否有效,如果用磁带保存备份,CROSSCHECK检查文件是否存在。备份文件的三种可能的状态为:AVAILABLE, UNAVAILABLE, and EXPIRED,我们可以用LIST命令查看或者直接查询V$BACKUP_FILES、RC_DATAFILE_COPY、RC_ARCHIVED_LOG等视图。 给出几个CORSSCHECK示例命令: CROSSCHECK BACKUP; # checks backup sets, proxy copies, and image copies CROSSCHECK COPY OF DATABASE; CROSSCHECK BACKUPSET 1338, 1339, 1340; CROSSCHECK BACKUPPIECE TAG = 'nightly_backup'; CROSSCHECK CONTROLFILECOPY '/tmp/control01.ctl'; CROSSCHECK DATAFILECOPY 113, 114, 115; CROSSCHECK PROXY 789; 交叉验证指定数据库文件的备份 # these CROSSCHECK commands use configured channels, which means that they # always check the disk device. If you configured an sbt channel, then RMAN # checks the sbt device, too CROSSCHECK BACKUP OF DATAFILE "ora_home/oradata/trgt/system01.dbf" COMPLETED AFTER 'SYSDATE-180'; CROSSCHECK BACKUP OF ARCHIVELOG ALL SPFILE; 删除备份 删除指定的备份: 1、 先用LIST命令找到备份唯一标识。 LIST BACKUP OF DATABASE ARCHIVELOG ALL; # lists backups of db files and logs LIST COPY; # lists only image copies LIST BACKUP; # lists everything 2、 删除指定的备份存储库记录和备份文件。 DELETE BACKUPPIECE 101; DELETE CONTROLFILECOPY '/tmp/control01.ctl'; DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE = 300; 批量删除: DELETE BACKUP; # deletes all backups on disk and tape DELETE BACKUP OF TABLESPACE users DEVICE TYPE sbt; # delete only from tape DELETE COPY OF CONTROLFILE LIKE '/tmp/%'; # LIKE specifies name of the copy DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 3 TIMES TO sbt; # backs up only if already backed up 3X to tape 删除无效备份: RMAN>CROSSCHECK BAKCUP; RMAN>DELETE EXPIRED BACKUP; 删除过期备份: RMAN>DELETE OBSOLETE; 如果没有指定其他参数RMAN默认按照保留冗余策略找到过期备份后执行删除,等效于: DELETE OBSOLETE REDUNDANCY = 1; 删除过期备份也可以指定按照时间冗余策略来删除,例如: DELETE OBSOLETE RECOVERY WINDOW OF 7 DAYS; 强制删除备份 如果没有执行CROSSCHECK,而磁盘上备份文件确实被删除了,我们执行删除备份的时候会从RMAN收到错误提示,如下: RMAN> delete backup tag 'TAG20070130T161822'; 使用通道 ORA_DISK_1 备份段列表 BP 关键字 BS 关键字 Pc# Cp# 状态 设备类型段名称 ------- ------- --- --- ----------- ----------- ---------- 110 115 1 1 AVAILABLE DISK D:\ORACLE\PRODUCT\10.2.0\FLASH_R ECOVERY_AREA\ROME\BACKUPSET\2007_01_30\O1_MF_NNNDF_TAG20070130T161822_2VXZTH2G_. BKP 是否确定要删除以上对象 (输入 YES 或 NO)? yes RMAN-06207: 警告: 由于状态不匹配, 所以不能删除 1 对象 (对于 DISK 通道)。 RMAN-06208: 请用 CROSSCHECK 命令修正状态 RMAN-06210: 不匹配对象的列表 RMAN-06211: ========================== RMAN-06212: 对象类型 文件名/句柄 RMAN-06213: --------------- --------------------------------------------------- RMAN-06214: Backup Piece D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BA CKUPSET\2007_01_30\O1_MF_NNNDF_TAG20070130T161822_2VXZTH2G_.BKP 我们可以用带有force参数的选项来强制删除备份: RMAN> delete force backup tag 'TAG20070130T161822'; 使用通道 ORA_DISK_1 备份段列表 BP 关键字 BS 关键字 Pc# Cp# 状态 设备类型段名称 ------- ------- --- --- ----------- ----------- ---------- 110 115 1 1 AVAILABLE DISK D:\ORACLE\PRODUCT\10.2.0\FLASH_R ECOVERY_AREA\ROME\BACKUPSET\2007_01_30\O1_MF_NNNDF_TAG20070130T161822_2VXZTH2G_. BKP 是否确定要删除以上对象 (输入 YES 或 NO)? yes 已删除备份段 备份段 handle=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_0 1_30\O1_MF_NNNDF_TAG20070130T161822_2VXZTH2G_.BKP recid=110 stamp=613239503 1 对象已删除

恢复案例四:恢复参数文件 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 删除参数文件。 数据库关闭状态丢失参数文件: C:\Documents and Settings\Administrator>rman target / 恢复管理器: Release 10.2.0.2.0 - Production on 星期三 1月 24 16:16:25 2007 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已连接到目标数据库 (未启动) RMAN> set dbid 252956976 正在执行命令: SET DBID RMAN> RESTORE SPFILE FROM 'D:\oracle\product\10.2.0\flash_recovery_area\ROME\BAC KUPSET\2007_01_24\O1_MF_NCSNF_TAG20070124T152907_2VG2PZ6C_.BKP'; 启动 restore 于 24-1月 -07 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 已找到的自动备份: D:\oracle\product\10.2.0\flash_recovery_area\ ROME\BACKUPSET\2007_01_24\O1_MF_NCSNF_TAG20070124T152907_2VG2PZ6C_.BKP 通道 ORA_DISK_1: 从自动备份复原 SPFILE 已完成 完成 restore 于 24-1月 -07 数据库打开状态丢失参数文件: SQL> alter system set sga_max_size=100M scope=spfile; alter system set sga_max_size=100M scope=spfile * 第 1 行出现错误: ORA-01565: 标识文件 'D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\SPFILEROME.ORA' 时出错 ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 这是我们应该先关闭数据库,然后执行数据库关闭状态丢失参数文件的操作。 另外我们也可以从控制文件自动备份中恢复参数文件,操作过程类似从控制文件自动备份恢复控制文件的操作,这里就不再赘述。 恢复案例五:隐含参数_allow_resetlogs_corruption的使用 用RMAN做好备份后,删除所有归档日志文件和备份。 恢复自动备份的控制文件。 SQL> startup nomount ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1288340 bytes Variable Size 104859500 bytes Database Buffers 54525952 bytes Redo Buffers 7098368 bytes RMAN> set dbid 252956976 正在执行命令: SET DBID RMAN> restore controlfile from autobackup; 启动 restore 于 31-1月 -07 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=155 devtype=DISK 恢复区域目标: d:\oracle\product\10.2.0\flash_recovery_area 用于搜索的数据库名 (或数据库的唯一名称): ROME 通道 ORA_DISK_1: 在恢复区域中找到自动备份 通道 ORA_DISK_1: 已找到的自动备份: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ ROME\AUTOBACKUP\2007_01_30\O1_MF_S_613239538_2VXZVMGN_.BKP 通道 ORA_DISK_1: 从自动备份复原控制文件已完成 输出文件名=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\CONTROL01.CTL 输出文件名=F:\ORACLE\ORADATA\ROME\CONTROL02.CTL 输出文件名=E:\ORACLE\ORADATA\ROME\CONTROL03.CTL 完成 restore 于 31-1月 -07 RMAN> sql 'alter database mount'; sql 语句: alter database mount 释放的通道: ORA_DISK_1 RMAN> restore database; SQL> recover database using backup controlfile; ORA-00279: ?? 1151325 (? 01/30/2007 16:18:22 ??) ???? 1 ???? ORA-00289: ??: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\ARCHIVELOG\2007_01_30\O1_MF_1_ 1_%U_.ARC ORA-00280: ?? 1151325 (???? 1) ??? #1 ? 指定日志: ...{<RET>=suggested | filename | AUTO | CANCEL} auto ORA-00308: ???????? 'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\ARCHIVELOG\2007_01_30\O1_MF_1 _1_%U_.ARC' ORA-27041: ?????? OSD-04002: ???????????? O/S-Error: (OS 2) ?????????????????????? ORA-00308: ???????? 'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\ARCHIVELOG\2007_01_30\O1_MF_1 _1_%U_.ARC' ORA-27041: ?????? OSD-04002: ???????????? O/S-Error: (OS 2) ?????????????????????? SQL> alter database open resetlogs; alter database open resetlogs * 第 1 行出现错误: ORA-01113: 文件 1 需要介质恢复 ORA-01110: 数据文件 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSTEM01.DBF' SQL> recover database using backup controlfile; ORA-00279: 更改 1151325 (在 01/30/2007 16:18:22 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\ARCHIVELOG\2007_01_30\O1_MF_1_ 1_%U_.ARC ORA-00280: 更改 1151325 (用于线程 1) 在序列 #1 中 指定日志: ...{<RET>=suggested | filename | AUTO | CANCEL} auto ORA-00308: 无法打开归档日志 'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\ARCHIVELOG\2007_01_30\O1_MF_1 _1_%U_.ARC' ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 ORA-00308: 无法打开归档日志 'D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\ARCHIVELOG\2007_01_30\O1_MF_1 _1_%U_.ARC' ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 SQL> create pfile='d:\rome.ora' from spfile; 文件已创建。 修改rome.ora加入 *._allow_resetlogs_corruption=TRUE SQL> startup pfile='d:\rome.ora' ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1288340 bytes Variable Size 104859500 bytes Database Buffers 54525952 bytes Redo Buffers 7098368 bytes 数据库装载完毕。 ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项 SQL> alter database open resetlogs; 数据库已更改。 SQL> show parameter _allow_ NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ _allow_resetlogs_corruption boolean TRUE 列举几个恢复命令,这里就不再一并给出示例了。 RMAN> RECOVER DATABASE SKIP TABLESPACE users; RMAN> RECOVER TABLESPACE users, tools; RMAN> RECOVER DATAFILE '/newdisk/users01.dbf','/newdisk/tools01.dbf'; RMAN> RECOVER DATAFILE 4; RMAN> RECOVER TABLESPACE users, tools DELETE ARCHIVELOG; 恢复表空间和数据文件到新位置: RUN ...{ SET NEWNAME FOR DATAFILE 3 to 'new_location'; RESTORE DATAFILE 3; SWITCH DATAFILE 3; RECOVER DATAFILE 3; } 如果没有指定新位置,将按照OMF命名规则创建新文件: RUN ...{ SET NEWNAME FOR DATAFILE 3 to NEW; RESTORE DATAFILE 3; SWITCH DATAFILE 3; RECOVER DATAFILE 3; } 基于时间点和SCN的恢复我们将在RMAN高级应用讲述。 归档日志文件恢复这里也不举例子了,比较简单。

恢复案例二:恢复个别表空间或者数据文件 1、 确认数据库处于MOUNT或者OPEN状态。 2、 将表空进OFFLINE:ALTER TABLESPACE ... OFFLINE IMMEDIATE。 3、 恢复表空间或者数据文件。 SQL> alter tablespace test read write; 表空间已更改。 RMAN> sql 'alter tablespace test offline immediate'; sql 语句: alter tablespace test offline immediate RMAN> restore tablespace "TEST"; 启动 restore 于 23-1月 -07 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在开始恢复数据文件备份集 通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件 正将数据文件00005恢复到E:\ORACLE\ORADATA\ROME\TEST.DBF 通道 ORA_DISK_1: 正在读取备份段 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROM E\BACKUPSET\2007_01_23\O1_MF_NNNDF_TAG20070123T160914_2VCJOCY8_.BKP 通道 ORA_DISK_1: 已恢复备份段 1 段句柄 = D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_23\ O1_MF_NNNDF_TAG20070123T160914_2VCJOCY8_.BKP 标记 = TAG20070123T160914 通道 ORA_DISK_1: 恢复完成, 用时: 00:00:03 完成 restore 于 23-1月 -07 RMAN> recover tablespace "TEST"; 启动 recover 于 23-1月 -07 使用通道 ORA_DISK_1 正在开始介质的恢复 介质恢复完成, 用时: 00:00:04 完成 recover 于 23-1月 -07 RMAN> sql 'alter tablespace test online'; sql 语句: alter tablespace test online 几个不同类型的文件恢复案例 恢复案例三:恢复控制文件 全部控制文件丢失,需要从备份的控制文件恢复。恢复了控制文件后必须要进行RECOVER恢复然后用RESETLOGS参数打开数据库,我们也可以把控制文件恢复到其他位置(不是在参数文件中给出的控制文件位置)。本例假定没有使用恢复目录,我们将在以后介绍带有恢复目的RMAN备份如何恢复控制文件。如果没有恢复目录,用RMAN只能在NOMOUNT状态从备份中进行控制文件的恢复。 从自动备份控制文件恢复: RMAN> configure controlfile autobackup on; 旧的 RMAN 配置参数: CONFIGURE CONTROLFILE AUTOBACKUP OFF; 新的 RMAN 配置参数: CONFIGURE CONTROLFILE AUTOBACKUP ON; 已成功存储新的 RMAN 配置参数: RMAN> show all; RMAN 配置参数为: CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default CONFIGURE BACKUP OPTIMIZATION OFF; # default CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO BACKUPSET PARALLELISM 1; CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE MAXSETSIZE TO UNLIMITED; # default CONFIGURE ENCRYPTION FOR DATABASE OFF; # default CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\S NCFROME.ORA'; # default RMAN> backup database; 启动 backup 于 24-1月 -07 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=143 devtype=DISK 通道 ORA_DISK_1: 启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集中的数据文件 输入数据文件 fno=00002 name=F:\ORACLE\ORADATA\ROME\UNDOTBS01.DBF 输入数据文件 fno=00001 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSTEM01.DBF 输入数据文件 fno=00003 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSAUX01.DBF 输入数据文件 fno=00004 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\USERS01.DBF 输入数据文件 fno=00005 name=E:\ORACLE\ORADATA\ROME\TEST.DBF 通道 ORA_DISK_1: 正在启动段 1 于 24-1月 -07 通道 ORA_DISK_1: 已完成段 1 于 24-1月 -07 段句柄=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_24\O1 _MF_NNNDF_TAG20070124T091006_2VFDHGYR_.BKP 标记=TAG20070124T091006 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:25 完成 backup 于 24-1月 -07 启动 Control File and SPFILE Autobackup 于 24-1月 -07段 handle=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\AUTOBACKUP\2007_01_2 4\O1_MF_S_612695432_2VFDJ95V_.BKP comment=NONE 完成 Control File and SPFILE Autobackup 于 24-1月 -07 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 删除所有的控制文件。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1288340 bytes Variable Size 104859500 bytes Database Buffers 54525952 bytes Redo Buffers 7098368 bytes ORA-00205: ?????????, ??????, ??????? SQL> shutdown immediate ORA-01507: ?????? ORACLE 例程已经关闭。 SQL> startup nomount ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1288340 bytes Variable Size 104859500 bytes Database Buffers 54525952 bytes Redo Buffers 7098368 bytes RMAN> SET DBID 252956976; 正在执行命令: SET DBID RMAN> restore controlfile from autobackup; 启动 restore 于 24-1月 -07 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=155 devtype=DISK 恢复区域目标: d:\oracle\product\10.2.0\flash_recovery_area 用于搜索的数据库名 (或数据库的唯一名称): ROME 通道 ORA_DISK_1: 在恢复区域中找到自动备份 通道 ORA_DISK_1: 已找到的自动备份: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ ROME\AUTOBACKUP\2007_01_24\O1_MF_S_612695432_2VFDJ95V_.BKP 通道 ORA_DISK_1: 从自动备份复原控制文件已完成 输出文件名=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\CONTROL01.CTL 输出文件名=F:\ORACLE\ORADATA\ROME\CONTROL02.CTL 输出文件名=E:\ORACLE\ORADATA\ROME\CONTROL03.CTL 完成 restore 于 24-1月 -07 RMAN> sql 'alter database mount'; sql 语句: alter database mount 释放的通道: ORA_DISK_1 RMAN> recover database; 启动 recover 于 24-1月 -07 启动 implicit crosscheck backup 于 24-1月 -07 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=155 devtype=DISK 已交叉检验的 21 对象 完成 implicit crosscheck backup 于 24-1月 -07 启动 implicit crosscheck copy 于 24-1月 -07 使用通道 ORA_DISK_1 已交叉检验的 1 对象 完成 implicit crosscheck copy 于 24-1月 -07 搜索恢复区域中的所有文件 正在编制文件目录... 目录编制完毕 已列入目录的文件的列表 ======================= 文件名: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\AUTOBACKUP\2007_01_24\ O1_MF_S_612714183_2VFYT8Y8_.BKP 使用通道 ORA_DISK_1 正在开始介质的恢复 存档日志线程 1 序列 1 已作为文件 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\REDO02A.L OG 存在于磁盘上 存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\REDO02A.LOG 线程 =1 序列 = 1 介质恢复完成, 用时: 00:00:03 完成 recover 于 24-1月 -07 RMAN> sql 'alter database open resetlogs'; sql 语句: alter database open resetlogs 从包含控制文件的全库备份恢复: RMAN> configure controlfile autobackup off; 旧的 RMAN 配置参数: CONFIGURE CONTROLFILE AUTOBACKUP ON; 新的 RMAN 配置参数: CONFIGURE CONTROLFILE AUTOBACKUP OFF; 已成功存储新的 RMAN 配置参数 RMAN> backup database; 启动 backup 于 24-1月 -07 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=157 devtype=DISK 通道 ORA_DISK_1: 启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集中的数据文件 输入数据文件 fno=00002 name=F:\ORACLE\ORADATA\ROME\UNDOTBS01.DBF 输入数据文件 fno=00001 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSTEM01.DBF 输入数据文件 fno=00003 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSAUX01.DBF 输入数据文件 fno=00004 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\USERS01.DBF 输入数据文件 fno=00005 name=E:\ORACLE\ORADATA\ROME\TEST.DBF 通道 ORA_DISK_1: 正在启动段 1 于 24-1月 -07 通道 ORA_DISK_1: 已完成段 1 于 24-1月 -07 段句柄=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_24\O1 _MF_NNNDF_TAG20070124T152907_2VG2P400_.BKP 标记=TAG20070124T152907 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:25 通道 ORA_DISK_1: 启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集中的数据文件 备份集中包括当前控制文件 在备份集中包含当前的 SPFILE 通道 ORA_DISK_1: 正在启动段 1 于 24-1月 -07 通道 ORA_DISK_1: 已完成段 1 于 24-1月 -07 段句柄=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_24\O1 _MF_NCSNF_TAG20070124T152907_2VG2PZ6C_.BKP 标记=TAG20070124T152907 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03 完成 backup 于 24-1月 -07 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 删除所有控制文件。 SQL> startup nomount ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1288340 bytes Variable Size 104859500 bytes Database Buffers 54525952 bytes Redo Buffers 7098368 bytes C:\Documents and Settings\Administrator>rman target / 恢复管理器: Release 10.2.0.2.0 - Production on 星期三 1月 24 15:37:54 2007 Copyright (c) 1982, 2005, Oracle. All rights reserved. 连接到目标数据库: rome (未装载) RMAN> RESTORE CONTROLFILE FROM 'D:\oracle\product\10.2.0\flash_recovery_area\ROM E\BACKUPSET\2007_01_24\O1_MF_NCSNF_TAG20070124T152907_2VG2PZ6C_.BKP'; 启动 restore 于 24-1月 -07 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=155 devtype=DISK 通道 ORA_DISK_1: 正在复原控制文件 通道 ORA_DISK_1: 恢复完成, 用时: 00:00:04 输出文件名=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\CONTROL01.CTL 输出文件名=F:\ORACLE\ORADATA\ROME\CONTROL02.CTL 输出文件名=E:\ORACLE\ORADATA\ROME\CONTROL03.CTL 完成 restore 于 24-1月 -07 RMAN> sql 'alter database mount'; sql 语句: alter database mount 释放的通道: ORA_DISK_1 RMAN> recover database; 启动 recover 于 24-1月 -07 启动 implicit crosscheck backup 于 24-1月 -07 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=155 devtype=DISK 已交叉检验的 24 对象 完成 implicit crosscheck backup 于 24-1月 -07 启动 implicit crosscheck copy 于 24-1月 -07 使用通道 ORA_DISK_1 已交叉检验的 1 对象 完成 implicit crosscheck copy 于 24-1月 -07 搜索恢复区域中的所有文件 正在编制文件目录... 目录编制完毕 已列入目录的文件的列表 ======================= 文件名: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_24\O 1_MF_NCSNF_TAG20070124T152907_2VG2PZ6C_.BKP 使用通道 ORA_DISK_1 正在开始介质的恢复 存档日志线程 1 序列 1 已作为文件 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\REDO02A.L OG 存在于磁盘上 存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\REDO02A.LOG 线程 =1 序列 = 1 介质恢复完成, 用时: 00:00:02 完成 recover 于 24-1月 -07 RMAN> sql 'alter database open resetlogs'; sql 语句: alter database open resetlogs 我们可以利用dbms_backup_restore包来恢复控制文件。 RMAN> backup database; 启动 backup 于 24-1月 -07 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=143 devtype=DISK 通道 ORA_DISK_1: 启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集中的数据文件 输入数据文件 fno=00002 name=F:\ORACLE\ORADATA\ROME\UNDOTBS01.DBF 输入数据文件 fno=00001 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSTEM01.DBF 输入数据文件 fno=00003 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSAUX01.DBF 输入数据文件 fno=00004 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\USERS01.DBF 输入数据文件 fno=00005 name=E:\ORACLE\ORADATA\ROME\TEST.DBF 通道 ORA_DISK_1: 正在启动段 1 于 24-1月 -07 通道 ORA_DISK_1: 已完成段 1 于 24-1月 -07 段句柄=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_24\O1 _MF_NNNDF_TAG20070124T120738_2VFPWCXS_.BKP 标记=TAG20070124T120738 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:25 通道 ORA_DISK_1: 启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集中的数据文件 备份集中包括当前控制文件 在备份集中包含当前的 SPFILE 通道 ORA_DISK_1: 正在启动段 1 于 24-1月 -07 通道 ORA_DISK_1: 已完成段 1 于 24-1月 -07 段句柄=D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_24\O1 _MF_NCSNF_TAG20070124T120738_2VFPX6G5_.BKP 标记=TAG20070124T120738 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03 完成 backup 于 24-1月 -07 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 删除所有控制文件。 SQL> startup nomount ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1288340 bytes Variable Size 104859500 bytes Database Buffers 54525952 bytes Redo Buffers 7098368 bytes SQL> DECLARE 2 devtype varchar2(256); 3 done boolean; 4 BEGIN 5 devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>''); 6 sys.dbms_backup_restore.restoreSetDatafile; 7 sys.dbms_backup_restore.restoreControlfileTo(cfname=>'D:\oracle\product\10. 2.0\oradata\rome\Control01.ctl'); 8 sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:\oracle\pr oduct\10.2.0\flash_recovery_area\ROME\BACKUPSET\2007_01_24\O1_MF_NCSNF_TAG200701 24T120738_2VFPX6G5_.BKP', params=>null); 9 sys.dbms_backup_restore.deviceDeallocate; 10 exception when others then 11 dbms_output.put_line(sqlerrm); 12 END; 13 / PL/SQL 过程已成功完成。 RMAN> restore database; 启动 restore 于 24-1月 -07 启动 implicit crosscheck backup 于 24-1月 -07 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=155 devtype=DISK 已交叉检验的 17 对象 完成 implicit crosscheck backup 于 24-1月 -07 启动 implicit crosscheck copy 于 24-1月 -07 使用通道 ORA_DISK_1 已交叉检验的 1 对象 完成 implicit crosscheck copy 于 24-1月 -07 搜索恢复区域中的所有文件 正在编制文件目录... 目录编制完毕 已列入目录的文件的列表 ======================= 文件名: D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_24\O 1_MF_NCSNF_TAG20070124T120738_2VFPX6G5_.BKP 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在开始恢复数据文件备份集 通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件 正将数据文件00001恢复到D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSTEM01.DBF 正将数据文件00002恢复到F:\ORACLE\ORADATA\ROME\UNDOTBS01.DBF 正将数据文件00003恢复到D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\SYSAUX01.DBF 正将数据文件00004恢复到D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\USERS01.DBF 正将数据文件00005恢复到E:\ORACLE\ORADATA\ROME\TEST.DBF 通道 ORA_DISK_1: 正在读取备份段 D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROM E\BACKUPSET\2007_01_24\O1_MF_NNNDF_TAG20070124T120738_2VFPWCXS_.BKP 通道 ORA_DISK_1: 已恢复备份段 1 段句柄 = D:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ROME\BACKUPSET\2007_01_24\ O1_MF_NNNDF_TAG20070124T120738_2VFPWCXS_.BKP 标记 = TAG20070124T120738 通道 ORA_DISK_1: 恢复完成, 用时: 00:01:45 完成 restore 于 24-1月 -07 RMAN> recover database; 启动 recover 于 24-1月 -07 使用通道 ORA_DISK_1 正在开始介质的恢复 存档日志线程 1 序列 26 已作为文件 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\REDO02A. LOG 存在于磁盘上 存档日志文件名 =D:\ORACLE\PRODUCT\10.2.0\ORADATA\ROME\REDO02A.LOG 线程 =1 序列 = 26 介质恢复完成, 用时: 00:00:02 完成 recover 于 24-1月 -07 RMAN> sql 'alter database open resetlogs'; sql 语句: alter database open resetlogs 如果使用了Flash Recovery Area,RMAN自动执行CROSSCHECK检查控制文件中涉及到的备份文件和竞相拷贝(磁盘备份),如果是使用磁带备份RMAN不会自动进行CROSSCHECK检查,需要我们恢复完控制文件后执行下列检查操作: RMAN> CROSSCHECK BACKUP DEVICE TYPE SBT; 如果我们的RMAN是带有恢复目录的话,则在恢复的时候不用进行SET DBID操作,直接执行如下命令即可: RMAN> restore controlfile; 我们可以在数据库处于任何状态的情况下把控制文件恢复到参数文件中设置的控制文件以外的位置: RMAN〉restore controlfile to ‘...’ from ‘...’;
最新留言
[匿名网友]
老同学现在在搞oracle数据库啊,很有前途啊。 以后有是问题就请多指教了

请你系统介绍一些通俗实用而又易懂的电脑技能,如何?
统计信息
日志:42篇
照片:0张
留言:2条
访问:2772人次
RSS2.0
我的文章
exp
将数据库内的各对象以二进制方式下载成dmp文件,方便数据迁移。
buffer:下载数据缓冲区,以字节为单位,缺省依赖操作系统
consistent:下载期间所涉及的数据保持read only,缺省为n
direct:使用直通方式        ,缺省为n
feeback:显示处理记录条数,缺省为0,即不显示
file:输出文件,缺省为expdat.dmp
filesize:输出文件大小,缺省为操作系统最大值
indexes:是否下载索引,缺省为n,这是指索引的定义而非数据,exp不下载索引数据
log:log文件,缺省为无,在标准输出显示
owner:指明下载的用户名
query:选择记录的一个子集
rows:是否下载表记录
tables:输出的表名列表
导出整个实例
exp dbuser/oracle file=oradb.dmp log=oradb.log full=y consistent=y direct=y
user应具有dba权限
导出某个用户所有对象
exp dbuser/oracle file=dbuser.dmp log=dbuser.log owner=dbuser buffer=4096000 feedback=10000
导出一张或几张表
exp dbuser/oracle file=dbuser.dmp log=dbuser.log tables=table1,table2 buffer=4096000 feedback=10000
导出某张表的部分数据
exp dbuser/oracle file=dbuser.dmp log=dbuser.log tables=table1 buffer=4096000 feedback=10000 query=\”where col1=\’…\’ and col2 \<…\”
不可用于嵌套表
以多个固定大小文件方式导出某张表
exp dbuser/oracle file=1.dmp,2.dmp,3.dmp,… filesize=1000m tables=emp buffer=4096000 feedback=10000
这种做法通常用在:表数据量较大,单个dump文件可能会超出文件系统的限制
直通路径方式
direct=y,取代buffer选项,query选项不可用
有利于提高下载速度
consistent选项
自export启动后,consistent=y冻结来自其它会话的对export操作的数据对象的更新,这样可以保证dump结果的一致性。但这个过程不能太长,以免回滚段和联机日志消耗完
imp
将exp下载的dmp文件上载到数据库内。
buffer:上载数据缓冲区,以字节为单位,缺省依赖操作系统
commit:上载数据缓冲区中的记录上载后是否执行提交
feeback:显示处理记录条数,缺省为0,即不显示
file:输入文件,缺省为expdat.dmp
filesize:输入文件大小,缺省为操作系统最大值
fromuser:指明来源用户方
ignore:是否忽略对象创建错误,缺省为n,在上载前对象已被建立往往是一个正常现象,所以此选项建议设为y
indexes:是否上载索引,缺省为n,这是指索引的定义而非数据,如果上载时索引已建立,此选项即使为n也无效,imp自动更新索引数据
log:log文件,缺省为无,在标准输出显示
rows:是否上载表记录
tables:输入的表名列表
touser:指明目的用户方
导入整个实例
imp dbuser/oracle file=oradb.dmp log=oradb.log full=y buffer=4096000 commit=y ignore=y feedback=10000
导入某个用户所有对象
imp dbuser/oracle file=dbuser.dmp log=dbuser.log fromuser=dbuser touser=dbuser2 buffer=2048000 commit=y ignore=y feedback=10000
导入一张或几张表
imp dbuser2/oracle file=user.dmp log=user.log tables=table1,table2 fromuser=dbuser touser=dbuser2 buffer=2048000 commit=y ignore=y feedback=10000
以多个固定大小文件方式导入某张表
imp dbuser/oracle file=\(1.dmp,2.dmp,3.dmp,…\) filesize=1000m tables=emp fromuser=dbuser touser=dbuser2 buffer=4096000 commit=y ignore=y feedback=10000
查看原文┆评论(0)┆类别(默认类别)┆发表于 2008-8-6 21:25:10

游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。

 游标可分为:

1.       静态游标:分为显式(explicit)游标和隐式(implicit)游标。

2.       REF游标:是一种引用类型,类似于指针。

 

1、静态游标

1.1显式游标

定义格式:   

CURSOR 游标名 ( 参数 )  IS

Select 语句 FOR UPDATE [OF [schema.]table.column[,[schema.]table.column]..

[nowait]

例子1 :无参数,打开关闭游标

set serveroutput on size 10000000 ;

 

 create or replace procedure TEST is
  cursor c1 is
    select tname from tab;
  pname varchar2(
32);
begin
  open c1;
  loop
    fetch c1
      into pname;
    exit when c1%notfound;
    dbms_output.put_line(pname);
  end loop;
  close c1;

end TEST

exec test;

例子2 :参数使用,参数使用方法和存储过程一样

create or replace procedure TEST is
  cursor c1(pname in varchar2) is
    select tname from tab where tname like pname;
  pname varchar2(
32);
begin
  open c1(
'T%');
  loop
    fetch c1
      into pname;
    exit when c1%notfound;
    dbms_output.put_line(pname);
  end loop;
  close c1;

end TEST;

1.2隐式游标

不用明确建立游标变量,分两种:

1.在PL/SQL中使用DML语言,使用ORACLE提供的名为“SQL”的隐示游标。

举例:

declare
begin
  update departments set department_name = department_name;
 
--where 1=2;
  dbms_output.put_line(
'update ' || sql%rowcount || ' records');
end;
/

2CURSOR FOR LOOP,用于for loop 语句

举例:

例子1:无参数,使用循环,无须打开关闭,本人这种方式

create or replace procedure TEST is
  cursor c1 is
    select tname from tab;
begin
  for rr in c1 loop
    dbms_output.put_line(rr.tname);
  end loop;

end TEST;

例子1:有参数,使用循环,无须打开关闭,本人这种方式

 

create or replace procedure TEST is
  cursor c1(pname in varchar2) is
    select tname from tab where tname like pname;
begin
  for rr in c1(
'T%') loop
    dbms_output.put_line(rr.tname);
  end loop;

end TEST;

 

 

1.3游标常用属性:

%FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。

%NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。

%ROWCOUNT:当前时刻已经从游标中获取的记录数量。

%ISOPEN:是否打开。

 

Declare  /* /* 定义静态游标 */ */
  Cursor emps is
    Select * from employees where rownum <
6 order by 1;

  Emp employees%rowtype;
  Row number :=
1;
Begin
  Open emps;
/* ´打开静态游标 */
  Fetch emps
    into emp;
/*  读取游标当前行  */

  Loop
    If emps%found then
      Dbms_output.put_line(
'Looping over record ' || row || ' of ' ||
                           emps%rowcount);
      Fetch emps
        into emp;
      Row := row +
1;
    Elsif emps%notfound then
      Exit;
    End if;
  End loop;

  If emps%isopen then
    Close emps;
/*  关闭游标  */
  End if;
End;
/

 

 1.4 游标的更新和删除

在PL/SQL中依然可以使用UPDATE和DELETE语句更新或删除数据行。显式游标只有在需要获得多行数据的情况下使用。PL/SQL提供了仅仅使用游标就可以执行删除或更新记录的方法。

 

 

UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR UPDATE子串,当对话使用FOR UPDATE子串打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT...FOR UPDATE操作。

在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。

在UPDATE和DELETE中使用WHERE CURRENT OF子串的语法如下:

WHERE{CURRENT OF cursor_name|search_condition}

 

 

 

create or replace procedure pc_SetVersionValid(PFlowsID in integer) is
  Cursor c1 is
    select *
      from wf_flows
     where flowname in
           (select flowname from wf_flows where flowsid = PFlowsID)
       for update;

  r c1%rowtype;
  v integer;
begin
  open c1;
  fetch c1
    into r;
  while c1%found loop
    if r.flowsid = PFlowsID then
      v :=
1;
    else
      v :=
0;
    end if;
 
    UPDATE wf_flows SET isValid = v WHERE CURRENT OF c1;
 
    fetch c1
      into r;
 
  end loop;
  close c1;
  commit;
end;

 显式和隐式游标的区别:

尽量使用隐式游标,避免编写附加的游标控制代码(声明,打开,获取,关闭),也不需要声明变量来保存从游标中获取的数据。

 

2REF CURSOR游标

动态游标,在运行的时候才能确定游标使用的查询。可以分为:

create or replace procedure TEST is
  sqlstr varchar2(
500);
  type RefCur is ref cursor;
  c1 refcur;
begin
  sqlstr :=
'select * from tab';
  open c1 for sqlstr;
  close c1;
end;

 

 

REF CURSOR实现BULK功能

1. 可以加速INSERT, UPDATE, DELETE语句的执行,也就是用FORALL语句来替代循环语句。

2. 加速SELECT,用BULK COLLECT INTO 来替代INTO

 

SQL> create table tab2  as select empno ID, ename NAME, sal SALARY from emp where 1=2;

create or replace procedure REF_BULK is

/*  定义复杂类型 */

type empcurtyp  is ref cursor;

type idlist  is table of emp.empno%type;

type namelist  is table of emp.ename%type;

type sallist  is table of emp.sal%type;

  /* 定义变量  */

emp_cv  empcurtyp;

ids  idlist;

names namelist;

sals sallist;

row_cnt number;

begin

open emp_cv for select empno, ename, sal from emp;

fetch emp_cv  BULK COLLECT  INTO ids, names, sals;

--将字段成批放入变量中,此时变量是一个集合

close emp_cv;

 

for i in ids.first .. ids.last loop

dbms_output.put_line(' || ids(i) || ' || names(i) ||' salary=' || sals(i));

end loop;

 

FORALL  i  IN  ids.first .. ids.last

insert into tab2 values (ids(i), names(i), sals(i));

commit;

select count(*) into row_cnt from tab2;

dbms_output.put_line('-----------------------------------');

dbms_output.put_line('The row number of tab2 is ' || row_cnt);

end REF_BULK;

 

 

 

 

3cursor ref cursor的区别

从技术底层看,两者是相同的。普通plsql cursor在定义时是“静态”的。而

Ref cursors可以动态打开。

例如下面例子:

Declare

type rc is ref cursor;

cursor c is select * from dual;

 

l_cursor rc;

begin

if ( to_char(sysdate,'dd') = 30 ) then

       open l_cursor for 'select * from emp';

elsif ( to_char(sysdate,'dd') = 29 ) then

       open l_cursor for select * from dept;

else

       open l_cursor for select * from dual;

end if;

open c;

end;

/

rc根据逻辑动态打开;而游标c定义好了只有就无法修改了。

ref cursor可以返回给客户端,cursor则不行。

cursor可以是全局的global