嘉善博客
张康乐的笔记
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条
访问:3323人次
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 ref cursor则必须定义在过程或函数中。

ref cursor可以在子程序间传递,cursor则不行。

cursor中定义的静态sqlref cursor效率高,所以ref cursor通常用在:向客户端返回结果集

查看原文┆评论(0)┆类别(默认类别)┆发表于 2008-7-24 22:55:02

目的:创建一个实体化视图站点,定时刷新,获取主站点中指定表的变化,这个实体化站点可以作为查询服务器使用

步骤:

1。主站点上创建实体化视图日志表

CREATE MATERIALIZED VIEW LOG ON kamus.account2004;

2。实体化视图站点上创建公用数据库链接

conn system/password

CREATE PUBLIC DATABASE LINK orcl using 'ORCL';

3。实体化视图站点上创建刷新组,本例中3分钟刷新一次

conn system/password

BEGIN
   DBMS_REFRESH.MAKE (
      name => 'kamus.test_repg',
      list => '',
      next_date => SYSDATE,
      interval => 'SYSDATE + 3/(24*60)',
      implicit_destroy => FALSE,
      rollback_seg => '',
      push_deferred_rpc => TRUE,
      refresh_after_errors => FALSE);
END;
/
COMMIT;
注意:此处必须commit,否则创建的刷新组并没有真正生效。

4。实体化视图站点上创建用户私有数据库链接

conn kamus/password

CREATE DATABASE LINK orcl CONNECT TO kamus IDENTIFIED BY password;

5。实体化视图站点上创建实体化视图

conn kamus/password

CREATE MATERIALIZED VIEW KAMUS.ACCOUNT2004 REFRESH FAST WITH PRIMARY KEY  AS SELECT * FROM   KAMUS.ACCOUNT2004@orcl;

6。实体化视图站点上将创建的视图加入刷新组

conn kamus/password

exec DBMS_REFRESH.ADD(name => 'kamus.TEST_REPG', list => 'kamus.ACCOUNT2004', lax => TRUE);

7。测试,在主站点中更新ACCOUNT2004表,过3分钟检查实体化试图站点中的视图,发现更新已经复制成功。

以上为建立只读实体化视图站点的最简单方法:

不需要创建其它的任何用户,比如复制环境中需要的传播者,刷新者,接收者等等

不需要创建任何复制组

不需要生成任何复制对象,不需要生成任何对象的复制支持

查看原文┆评论(0)┆类别(默认类别)┆发表于 2008-7-23 22:16:00
一、优化磁盘配置

Oracle是一个磁盘I/O强烈的应用,要确保你恰当地配置磁盘和文件系统:

在磁盘上建立数据文件前首先运行磁盘碎片整理程序

为了安全地整理磁盘碎片,需关闭打开数据文件的实例,并且停止服务。如果你有足够的连续磁盘空间建立数据文件,那么你就很容易避免数据文件产生碎片。

不要使用磁盘压缩

Oracle数据文件不支持磁盘压缩。

不要使用磁盘加密

加密象磁盘压缩一样增加了一个处理层降低磁盘读写速度。如果你担心自己的数据可能泄密,就使用dbms_obfuscation包和label security选择性地加密数据的敏感部分。

不要使用超过70%的磁盘空间

剩余的磁盘空间存放系统临时数据和作为磁盘碎片整理程序存放中间数据。

使用RAID

选择硬件RAID超过软件RAID;

带有硬件RAID控制器;

日志文件不要放在RAID 5卷上,因为RAID 5读性能高而写性能差。

把日志文件和归档日志放在与控制文件和数据文件分离的磁盘控制系统。

分离页面交换文件到多个磁盘物理卷

跨越至少两个磁盘建立两个页面文件。你可以建立四个页面文件并在性能上受益,确保所有页面文件的大小之和至少是物理内存的两倍。

  二、优化CPU使用和配置

取消屏幕保护

屏幕保护吸取大量的CPU资源而且提供的是对数据库服务器毫无意义的用处,特别要禁止3GL屏幕保护,如果你必须使用屏幕保护就用“空屏幕”减少CPU使用。

把系统配置为应用服务器

运行控制面板的“系统”,在高级选项卡中设置“性能选项”到“后台程序”,这提供优先权给应用程序,象类似Oracle的服务,反对用户在图形用户界面启动一个笨拙的程序。

监视系统中消耗中断的硬件

消耗CPU中断和时间的硬件应该避免使用。通常这样的硬件是便宜的因为它把工作载入CPU,而CPU要处理外围的高级性能的硬件,通常需要注意:

1、支持总线控制的网卡

2、支持DMA而不支持PIO的磁盘控制器

使用性能监视器跟踪处理器对象的%Interrupt Time 计数器数值,和这个计数器的基线和标准,然后监视问题。

3、有利避免中断的方式是使用硬件RAID控制器代替Windows 2000支持的软件RAID。

保持最小的安全审计记录

在专用服务器上运行Oracle

Oracle是内存消耗大户,不要在执行下列功能的系统上运行Oracle数据库:

1、主域或备份域控制器(Windows 2000下都称域控制器)

2、文件服务器

3、打印服务器

4、远程访问服务器

5、路由器、代理或防火墙

不要使用花哨的壁纸(如果使用,要尽量减小壁纸文件大小)

禁止非必须的服务

最好禁止系统里非必须的服务,如果时而需要某些服务功能,可将启动类型设置为“手动”,要做到这一点首先同网络管理员验证实际的服务需求:

1、如果你的系统不需要打印机,通常停止这个服务并设置为手动;

2、停止License Logging Service服务除非你对它有特殊要求;

3、不应该使用DHCP服务,并禁止它;

4、不要自动启动你不需要的程序;

检查菜单“开始/程序/启动”里的内容,删除不需要的程序。

三、优化网络配置

网络配置是性能调整的一项很重要的内容,而且很容易隐藏性能瓶颈。

配置网卡使用最快速度和有效模式

这针对自动检测,大多数缺省安装是NIC,如果这是可选的就尽量调整为“全双工”和最大化线速度。

删除不需要的网络协议

只保留TCP/IP协议。

优化网络协议绑定顺序

在每个网卡上设置主协议,典型地是TCP/IP,到协议列表的顶端。

为Oracle禁止或优化文件共享

理想地应该禁止文件共享功能来最小化安全泄露和网络交通,但如果你需要使用文件和打印共享,那么就配置系统中每个网卡的“连接属性”,设置“最大化网络应用程序数据吞吐量”

四、内存调优

内存优化是Windows平台的关键设置,首先了解一下Windows 2000平台的Oracle结构:

基于线程的结构

Windows2000是基于线程的结构,相反,Unix操作系统是基于进程的结构。这意味着Windows中更多的应用,包括Oracle在内,是以带有多个线程的单个进程的形式执行,这种基于线程的结构的确给Window2000带来优势——更容易共享内存。内存空间为每个进程分配,进程间共享内存很笨拙,要使用附加编码,线程是进程的子集,使用比进程少得多的内存。特定进程的所有线程共享同样的进程内存空间,同一进程的线程间共享内存比不同进程共享内存要快,这给基于线程的结构很大优势,更有效。

在服务器上运行的每个应用程序都有一个,而且只有一个进程。进程是应用程序的载体,是用来容纳执行应用程序实际工作的线程的。从用户角度看,进程是不用任何专门工具就可以看到的组件。进程对其他应用程序组件的作用就像容器一样。它持有虚拟的存储空间、数据、系统资源和应用程序设置。虽然线程可以分配、重新分配和释放内存,但是进程接受初始的内存分配,并将它分配到请求内存的所有线程。线程是包含在进程内共享所有进程资源的单个执行路径。它还包含堆栈(存储在内存中的变量和其他数据)、CPU寄存器的状态信息(所以,线程可以恢复它的环境)、和在系统调度程序的执行列表中的一个登录项。每个线程规定了完成任务应用程序需要作的某种工作。

使用Task Manager的主要问题是看不到任何线程。Task Manager被设计成从进程层将应用程序作为整体看待。当然还可以使用性能监视器来监视Windows下的Oracle内存使用。

从“开始/程序/管理工具”选择“性能”启动“系统监视器”。注意,“性能”包括两个MMC插件:“系统监视器”和“性能日志和变更”。这时,需要一些被监视的计数器(计数器是一些性能指示器,用于对 Windows 2000的特殊对象进行统计,例如统计特定线程所要求的处理器时间)。单击“添加”按钮(在图中看起来象一个加号),将看到“添加计数器”对话框。首先需要选择想监视的“性能”对象。在包含“进程”对象和“线程”对象的“性能”下拉列表中选择。

进程观察器(Process Viewer)是比较容易检查线程和进程的方法之一。可以在 Windows 2000 Support Tools 或Windows 2000 Resource Kit内找到一些工具。Windows 2000 Support Tools是Windows 2000的一部分,但是并不自动安装。支持安装的Windows Installer文件在%CDROM%\SUPPORT\TOOLS\目录下。只要在2000RKST.MSJ上右击,并从context菜单上选择安装即可。

内存

基于线程的结构的确有一些内存限制,因为单个进程由线程组成,而进程的地址空间是受限的,因此很少有空间是机动的。因为Windows 2000仍然是32为操作系统,单个进程地址空间被限制在4GB内,其中一半被操作系统保留,这2GB被OS保留的系统内存也被视为系统地址空间,他包括 OS内核编码、硬件抽象层编码(HAL)和需要管理进程和OS交互的不同的其它结构,这2GB的系统地址空间是禁止应用程序进程访问的。

因此,Windows 2000标准服务器单个应用程序进程可使用内存空间共2GB。在Windows 2000高级服务器启动文件boot.ini中有/3GB开关,改变这个比例到3GB,这项技术被称作4GB调优(4-gigabyte tuning,或4GT),我们将针对这个问题展开详细讨论。

保留的内存是分配给线程的内存并且留作将来使用,但没有实际使用的内存。因为没有实际使用,因此它对其它进程仍然有效。但是,因为它已经被分配,它仍然由对拥有线程的进程的总的内存限制产生,因此,保留内存的计算针对2GB或3GB的限制,并且进程保留的和使用的内存的总和不能超过这个限制。

除了系统中安装的物理内存之外,Windows 2000还使用虚拟内存。这实际上是驻留在硬盘上的内存。但是Windows 2000使得它对应用程序来说,就像是安装在机器上内存一样。当某个应用程序块要求访问那个内存时,Windows 2000就把另外的内存块复制到磁盘上,而把所要求的内存放到物理内存中,这些内存块的大小是4KB。也就是说,每次应用程序提出对内存的要求时,内存就被分配在4KB的页面内。在磁盘上模拟内存的文件叫做页面调度文件。Virtual Memory Manager(VMM虚拟内存管理器)是操作系统管理机器上的虚拟内存组件。所有的内存访问都通过VMM。这意味着每当操作系统需要进行内存调页时,就要提出VMM请求。

内存调优方法:

(一)使用超过4GB的内存

另外,有办法允许为单个进程或应用分配超过32位地址空间的内存,为实现这一点,Windows 2000使用物理地址扩展(physical address extensions ,或PAE),PAE本质上把地址空间从32位增加到36位,但是必须有Pentium Pro或更新的处理器才能享受这个优势。在Windows NT 4.0下,Intel提供PSE36驱动程序享受全部36位地址空间的优势,但是在Windows 2000 Advanced Server中36位地址空间的支持已经建立在操作系统中,然而,应用程序必须使用地址窗口扩展(Address Windowing Extensions ,或AWE)API写成,Oracle9i 发行号1(Release 1)不支持AWE,所有的Oracle 8i发行号(releases 8.1.5–8.1.7)都支持AWE。Oracle在9i发行号2(Release 2)中实现了对AWE的支持。

(二)AWE和Windows 2000

AWE允许你使用系统中任何附加的超过4GB的内存,为了体现这个优势,你必须有超过 4GB的内存,必须有Pentium Pro或更新的处理器,必须运行Windows 2000高级服务器或Windows 2000数据中心服务器,不需要特殊的驱动程序,因为Windows 2000已经支持AWE。

为了利用这项优势,必须在启动Windows 2000机器时在boot.ini文件中使用/PAE开关,你必须确保运行Oracle服务的帐户有Lock Pages in Memory权限。给运行Oracle服务的帐户增加Lock Pages in Memory权限后,要重新启动OracleService 服务。

(三)AWE和Oracle

可以确定,Oracle8i所有发行号版本和Oracle9i发行号2只允许你为数据库块缓冲区配置超过4GB限制的内存空间,因此,要为用户连接释放标准进程地址空间的内存(低于3GB界限的内存)、PGA内存和组成SGA的不同内存缓冲池。

在初始化参数文件init.ora中要设置参数USE_INDIRECT_DATA_BUFFERS=TRUE,没有这个参数,Oracle不能寻址到4GB以上的地址空间。接下来要设置决定内存使用总量的缓冲池大小,设定DB_BLOCK_SIZE和DB_BLOCK_BUFFERS两个参数。

在Oracle9i发行号2中,参数DB_BLOCK_BUFFERS被参数DB_CACHE_SIZE所代替,这样就改变了原来指定缓冲区块数到指定缓冲区字节数,同样,也解释了在Oracle9i发行号2的一个数据库中支持多个数据库块大小。无论用哪种办法,如果你设定参数 USE_INDIRECT_BUFFERS=TRUE,你将只能定义和使用单个数据库块大小和块缓冲区(就象在9i以前的发行号中),因此,如果缺省数据库块大小是4k、8k或其它,而设置DB_2k_CACHE_SIZE是不允许的。

接下来需要在注册表中为ORACLE_HOME设置合适的AWE_WINDOW_MEMORY参数值,也就是在 HKEY_LOCAL_MACHINE\ Software\Oracle\HOME0下,这个参数指定字节数,如果没有设置,缺省值是1 GB。这个参数的大小取决于你要设置多少缓冲区大小,并视为来自3GB进程地址空间的常规内存。以缓冲区大小为6 GB为例,设置AWE_WINDOW_MEMORY为缺省值1GB,你希望1GB 视为常规内存,并且剩余5GB缓冲区来自4GB限制以上的地址空间。你希望更多的缓冲池尽可能保留在常规地址空间,因为访问超过4GB以上的缓冲池比访问虚拟地址空间缓冲池要慢(尽管仍然比磁盘I/O操作快)。

(四)解决与AWE相关的内存问题

需要注意的是每个4GB界限以上的块缓冲区需要在常规地址空间保留大约200字节的缓冲区头,因此,在上面的例子中,我们大约有312000个缓冲区头指向扩展地址空间的缓冲区,缓冲区头大约占80MB常规内存空间,如果数据库块很小,那么这个数量会相当高,因此,必须确保这些缓冲区头、AWE_WINDOW_MEMORY、和所有Oracle.exe进程的内存需求,包括编码、SGA其它组件、 PGA内存和每个用户连接栈都适合Oracle.exe进程的常规3GB虚拟地址空间。

确认你有足够的物理内存处理超过AWE_WINDOW_MEMORY之外的DB_BLOCK_BUFFERS,在我们的例子中定义缓冲池大小为 6GB,1GB来自常规地址空间,剩余5GB来自4GB以外的对整个进程有效的系统和进程地址空间,因此,这个例子只能工作在至少有9GB内存的机器上,你还应该为其它进程保留一些空间,只有一个进程可以在某一时刻访问附加的内存。

象前面所说的那样,/PAE开关只用于系统有超过4GB物理内存的时候,但如果系统内存少于4GB时,也可模仿这项功能。在boot.ini文件中设置MAXMEM参数的值,如下面例子,设为2GB,意味着任何2GB以上的内存都将保留为AWE内存。

multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced

Server" /fastdetect /PAE /MAXMEM:2048

为一个数据库使用附加的多个进程

真正的应用集群(Real Applications Clusters,RAC)提供有多个实例运行和访问同一数据的能力。通常,这用于有两个或多个节点的项目,一个实例运行在每个节点。无论如何,它支持在 Oracle9i有两个实例运行在一个节点访问同一个数据库。这能克服每个进程的内存限制,又提供某些其它的利益,如应用程序失败检测。

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-24 12:44:27
关于SGA设置的一点总结
本总结不针对特例,仅对服务器只存在OS + ORACLE 为例,如果存在其他应用请酌情考虑
写这个也是因为近来这种重复性的问题发生的太多所导致的

首先不要迷信STS,SG,OCP,EXPERT 等给出的任何建议、内存百分比的说法
基本掌握的原则是, data buffer 通常可以尽可能的大,shared_pool_size 要适度,log_buffer 通常大到几百K到1M就差不多了

设置之前,首先要明确2个问题
1: 除去OS和一些其他开销,能给ORACLE使用的内存有多大
2:oracle是64bit or 32 bit,32bit 通常 SGA有 1.7G 的限制(某些OS的处理或者WINDOWS上有特定设定可以支持到2G以上甚至达到3.7G,本人无这方面经验)

下面是我的windows2000下的oracle :

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
PL/SQL Release 8.1.7.0.0 - Production
CORE 8.1.7.0.0 Production
TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
NLSRTL Version 3.4.1.0.0 - Production

SQL>

windows上存在32bit的限制,如AIX、HP UNIX 等有明确的64BIT OS and ORACLE的版本,32bit oracle可以装在64bit os 上,64 bit oracle不能装在32 bit OS上

不管oracle是32 bit ORACLE还是 64 bit 的,假定应用存在没有很好的使用bind var 的情况,也不能设置 shared_pool_size 过大,通常应该控制在200M--300M,如果是 ORACLE ERP 一类的使用了很多存储过程函数、包 ,或者很大的系统,可以考虑增大shared_pool_size ,但是如果超过500M可能是危险的,达到1G可能会造成CPU的严重负担,系统甚至瘫痪。所以shared_pool_size 如果超过300M还命中率不高,那么应该从应用上找原因而不是一味的增加内存,shared_pool_size 过大主要增加了管理负担和latch 的开销。

log_buffer : 128K ---- 1M 之间通常问题不大,不应该太大

large_pool_size :如果不设置MTS,通常在 RMAN 、OPQ 会使用到,但是在10M --- 50M 应该差不多了。假如设置 MTS,则由于 UGA 放到large_pool_size 的缘故,这个时候依据 session最大数量和 sort_ares_size 等参数设置,必须增大large_pool_size 的设置,可以考虑为 session * (sort_area_size + 2M)。这里要提醒一点,不是必须使用MTS,我们都不主张使用MTS,尤其同时在线用户数小于500的情况下。

java_pool_size : 若不使用java,给30M通常就够了

data buffer ,在做了前面的设置后,凡可以提供给oracle的内存,都应该给data buffer = (db_block_size * db_block_buffers)
在9i 中可以是 db_cache_size

还有2个重要参数我们需要注意

sort_area_size and hash_area_size
这两个参数在非MTS下都是属于PGA ,不属于SGA,是为每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑这两部分

(****) : OS 使用内存+ SGA + session*(sort_area_size + hash_area_size + 2M) < 总物理RAM 为好


这样归结过来,假定oracle是 32 bit ,服务器RAM大于2G ,注意你的PGA的情况,,则建议

shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G


再具体化,注意满足上面(****) 的原则的基础上可以参考如下设置
如果512M RAM
建议 shared_pool_size = 50M, data buffer = 200M

如果1G RAM
shared_pool_size = 100M , data buffer = 500M

如果2G
shared_pool_size = 150M ,data buffer = 1.2G

物理内存再大已经跟参数没有关系了


假定64 bit ORACLE

内存4G
shared_pool_size = 200M , data buffer = 2.5G

内存8G
shared_pool_size = 300M , data buffer = 5G

内存 12G
shared_pool_size = 300M-----800M , data buffer = 8G



以上仅为参考值,不同系统可能差异比较大,需要根据具体情况调整。建议在设置参数的同时,init中使用 lock_sga ,在不同的平台上可能有不同的方式,使得SGA锁定在物理内存中而不被放入 SWAP 中,这样对效率有好处


关于内存的设置,要再进行细致的调整,起的作用不大,但可根据statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch 等view信息来考虑微调
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-24 12:25:37
对于oracle来说,存在着32bit与64bit的问题。这个问题影响到的主要是SGA的大小。在32bit的数据库下,通常oracle只能使用不超过1.7G的内存,即使我们拥有12G的内存,但是我们却只能使用1.7G,这是一个莫大的遗憾。假如我们安装64bit的数据库,我们就可以使用很大的内存,几乎不可能达到上限。但是64bit的数据库必须安装在64bit的操作系统上,可惜目前windows上只能安装32bit的数据库,我们通过下面的方式可以查看数据库是32bit还是64bit:

  SQL> select * from v$version;

  BANNER

  ----------------------------------------------------------------

  Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production

  PL/SQL Release 8.1.7.0.0 - Production

  CORE 8.1.7.0.0 Production

  TNS for 32-bit Windows: Version 8.1.7.0.0 - Production

  NLSRTL Version 3.4.1.0.0 - Production

  但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过1.7G的内存,达到2G以上甚至更多。

  对于oracle 来说,存在着32bit 与64bit 的问题。这个问题影响到的主要是SGA 的大小。在32bit 的数据库下,通常oracle 只能使用不超过1.7G 的内存,即使我们拥有12G 的内存,但是我们却只能使用1.7G,这是一个莫大的遗憾。假如我们安装64bit 的数据库,我们就可以使用很大的内存,我们几乎不可能达到上限。但是64bit 的数据库必须安装在64bit 的操作系统上,可惜目前windows 上只能安装32bit 的数据库,我们通过下面的方式可以查看数据库是32bit 还是64bit:

  SQL> select * from v$version; BANNER

  Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production PL/SQL Release 8.1.7.0.0 - Production CORE 8.1.7.0.0 Production TNS for 32-bit Windows: Version 8.1.7.0.0 - Production NLSRTL Version 3.4.1.0.0 - Production

  但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过1.7G 的内存,达到2G 以上甚至更多。在这里我们针对不同的平台下的具体实现方式做一个总结。
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-24 12:20:03

任何事情都有它的源头,要解决问题,也得从源头开始,影响ORACLE性能的源头非常多,主要包括如下方面:

数据库的硬件配置:CPU、内存、网络条件

1. CPU:在任何机器中CPU的数据处理能力往往是衡量计算机性能的一个标志,并且ORACLE是一个提供并行能力的数据库系统,在CPU方面的要求就更高了,如果运行队列数目超过了CPU处理的数目,性能就会下降,我们要解决的问题就是要适当增加CPU的数量了,当然我们还可以将需要许多资源的进程KILL掉;

2. 内存:衡量机器性能的另外一个指标就是内存的多少了,在ORACLE中内存和我们在建数据库中的交换区进行数据的交换,读数据时,磁盘I/O必须等待物理I/O操作完成,在出现ORACLE的内存瓶颈时,我们第一个要考虑的是增加内存,由于I/O的响应时间是影响ORACLE性能的主要参数,我将在这方面进行详细的讲解

3. 网络条件:NET*SQL负责数据在网络上的来往,大量的SQL会令网络速度变慢。比如10M的网卡和100的网卡就对NET*SQL有非常明显的影响,还有交换机、集线器等等网络设备的性能对网络的影响很明显,建议在任何网络中不要试图用3个集线器来将网段互联。

OS参数的设置

下表给出了OS的参数设置及说明,DBA可以根据实际需要对这些参数进行设置

内核参数名

说明

bufpages

对buffer空间不按静态分配,采用动态分配,使bufpages值随nbuf一起对buffer空间进行动态分配。

create_fastlinks

对HFS文件系统允许快速符号链接

dbc_max_pct

加大最大动态buffer空间所占物理内存的百分比,以满足应用系统的读写命中率的需要。

dbc_min_pct

设置最小动态buffer空间所占物理内存的百分比

desfree

提高开始交换操作的最低空闲内存下限,保障系统的稳定性,防止出现不可预见的系统崩溃(Crash)。

fs_async

允许进行磁盘异步操作,提高CPU和磁盘的利用率

lotsfree

提高系统解除换页操作的空闲内存的上限值,保证应用程序有足够的可用内存空间。

maxdsiz

针对系统数据量大的特点,加大最大数据段的大小,保证应用的需要。(32位)

maxdsiz_64bit

maximum process data segment size for 64_bit

Maxssiz

加大最大堆栈段的大小。(32_bit)

maxssiz_64bit

加大最大堆栈段的大小。(64_bit)

Maxtsiz

提高最大代码段大小,满足应用要求

maxtsiz_64bit

原值过大,应调小

Minfree

提高停止交换操作的自由内存的上限

Shmem

允许进行内存共享,以提高内存的利用率

Shmmax

设置最大共享内存段的大小,完全满足目前的需要

Timeslice

由于系统的瓶颈主要反映在磁盘I/O上,因此 降低时间片的大小,一方面可避免因磁盘I/O不畅造成CPU的等待,从而提高了CPU的综合利用率。另一方面减少了进程的阻塞量。

unlockable_mem

提高了不可锁内存的大小,使可用于换页和交换的内存空间扩大,用以满足系统对内存管理的要求。

用户SQL质量

以上讲的都是硬件方面的东西,在条件有限的条件下,我们可以调整应用程序的SQL质量:

1. 不要进行全表扫描(Full Table Scan):全表扫描导致大量的I/O

2. 尽量建好和使用好索引:建索引也是有讲究的,在建索引时,也不是索引越多越好,当一个表的索引达到4个以上时,ORACLE的性能可能还是改善不了,因为OLTP系统每表超过5个索引即会降低性能,而且在一个sql 中, Oracle 从不能使用超过 5个索引;当我们用到GROUP BY和ORDER BY时,ORACLE就会自动对数据进行排序,而ORACLE在INIT.ORA中决定了sort_area_size区的大小,当排序不能在我们给定的排序区完成时,ORACLE就会在磁盘中进行排序,也就是我们讲的临时表空间中排序, 过多的磁盘排序将会令 free buffer waits 的值变高,而这个区间并不只是用于排序的,对于开发人员我提出如下忠告:

1)、select,update,delete 语句中的子查询应当有规律地查找少于20%的表行.如果一个语句查找的行数超过总行数的20%,它将不能通过使用索引获得性能上的提高.   

2)、索引可能产生碎片,因为记录从表中删除时,相应也从表的索引中删除.表释放的空间可以再用,而索引释放的空间却不能再用.频繁进行删除操作的被索引的表,应当阶段性地重建索引,以避免在索引中造成空间碎片,影响性能.在许可的条件下,也可以阶段性地truncate表,truncate命令删除表中所有记录,也删除索引碎片.

3)、在使用索引时一定要按索引对应字段的顺序进行引用。

4)、用(+)比用NOT IN更有效率。

降低ORACLE的竞争

先讲几个ORACLE的几个参数,这几个参数关系到ORACLE的竞争:
1)、freelists 和 freelist 组:他们负责ORACLE的处理表和索引的空间管理;
2)、pctfree 及 pctused:该参数决定了freelists 和 freelist 组的行为,pctfree 和pctused 参数的唯一目的就是为了控制块如何在 freelists 中进出
设置好pctfree 及 pctused对块在freelists的移走和读取很重要。

其他参数的设置
1)、包括SGA区(系统全局区):系统全局区(SGA)是一个分配给Oracle 的包含一个 Oracle 实例的数据库的控制信息内存段。
主要包括数据库高速缓存(the database buffer cache),
重演日志缓存(the redo log buffer),
共享池(the shared pool),
数据字典缓存(the data dictionary cache)以及其它各方面的信息
2)、db_block_buffers(数据高速缓冲区)访问过的数据都放在这一片内存区域,该参数越大,Oracle在内存中找到相同数据的可能性就越大,也即加快了查询速度。
3)、share_pool_size (SQL共享缓冲池):该参数是库高速缓存和数据字典的高速缓存。
4)、Log_buffer (重演日志缓冲区)
5)、sort_area_size(排序区)
<6)、processes (同时连接的进程数)
7)、db_block_size (数据库块大小):Oracle默认块为2KB,太小了,因为如果我们有一个8KB的数据,则2KB块的数据库要读4次盘,才能读完,而8KB块的数据库只要1次就读完了,大大减少了I/O操作。数据库安装完成后,就不能再改变db_block_size的值了,只能重新建立数据库并且建库时,要选择手工安装数据库。
8)、open_links (同时打开的链接数)
9)、dml_locks
10)、open_cursors (打开光标数)
11)、dbwr_io_slaves (后台写进程数)

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-21 23:23:13

上周一个朋友的数据库发生误删除操作,请我帮忙进行恢复。
由于备份比较充分,所以只需要通过RMAN进行一个基于时间点(这个时间点需要根据故障时间进行判断选取)。

首先启动实例:

[oracle@stat ~]$ export ORACLE_SID=order
[oracle@stat ~]$ rman target /

Recovery Manager: Release 10.2.0.2.0 - Production on Thu Sep 14 22:43:50 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database (not started)

RMAN> set DBID=1341966532

executing command: SET DBID

RMAN> startup nomount;

Oracle instance started

Total System Global Area 2483027968 bytes

Fixed Size 1262344 bytes
Variable Size 654314744 bytes
Database Buffers 1811939328 bytes
Redo Buffers 15511552 bytes

恢复数据文件并加载(mount)数据库:

RMAN> restore controlfile from autobackup;

Starting restore at 14-SEP-06
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=541 devtype=DISK

channel ORA_DISK_1: looking for autobackup on day: 20060914
channel ORA_DISK_1: autobackup found: c-1341966532-20060914-02
channel ORA_DISK_1: control file restore from autobackup complete
output filename=/oradata/controlfile/o1_mf_28spy45z_.ctl
output filename=/oradata/controlfile/o2_mf_28spy45z_.ctl
Finished restore at 14-SEP-06

RMAN> alter database mount;

database mounted
released channel: ORA_DISK_1

Restore数据库:

RMAN> restore database;

Starting restore at 14-SEP-06
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=541 devtype=DISK

channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /oradata/datafile/o1_mf_system_28spy7kl_.dbf
restoring datafile 00002 to /oradata/datafile/o1_mf_undotbs1_28spykdh_.dbf
restoring datafile 00003 to /oradata/datafile/o1_mf_sysaux_28spyo9s_.dbf
restoring datafile 00004 to /oradata/datafile/o1_mf_users_28spyvm8_.dbf
restoring datafile 00005 to /oradata/datafile/o1_mf_vascms_2c444bhj_.dbf
restoring datafile 00006 to /oradata/datafile/o1_mf_wapgame_2c44gz55_.dbf
restoring datafile 00007 to /oradata/datafile/o1_mf_vascms_2c4kn0b2_.dbf
channel ORA_DISK_1: reading from backup piece /data3/ordrbak/full_ORDER_20060913_169
channel ORA_DISK_1: restored backup piece 1
piece handle=/data3/ordrbak/orderfullback_ORDER_20060913_169 tag=order
channel ORA_DISK_1: restore complete, elapsed time: 00:03:06
Finished restore at 14-SEP-06

进行基于时间点的恢复:

RMAN> recover database until time '2006-09-14 19:00:00'
2> ;

Starting recover at 14-SEP-06
using channel ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 09/14/2006 22:49:54
ORA-01861: literal does not match format string

RMAN> exit


Recovery Manager complete.

这个错误是由于时间日期格式设置的问题。

设置正确的时间格式,进行基于时间点的不完全恢复:

[oracle@stat ~]$ export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'
[oracle@stat ~]$ rman target /

Recovery Manager: Release 10.2.0.2.0 - Production on Thu Sep 14 22:50:22 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

connected to target database: order (DBID=1341966532, not open)

RMAN> recover database until time '2006-09-14 19:00:00'
2> ;

Starting recover at 2006-09-14 22:50:26
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=544 devtype=DISK

starting media recovery

archive log thread 1 sequence 303 is already on disk as file
/oradata/archive/1_303_592917188.dbf
archive log thread 1 sequence 304 is already on disk as file
/oradata/archive/1_304_592917188.dbf
channel ORA_DISK_1: starting archive log restore to default destination
channel ORA_DISK_1: restoring archive log
archive log thread=1 sequence=299
channel ORA_DISK_1: reading from backup piece /data3/ordrbak/arch_order_20060913_171
channel ORA_DISK_1: restored backup piece 1
piece handle=/data3/ordrbak/orderarch_order_20060913_171 tag=order
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
archive log filename=/oradata/archive/1_299_592917188.dbf thread=1 sequence=299
channel ORA_DISK_1: starting archive log restore to default destination
channel ORA_DISK_1: restoring archive log
archive log thread=1 sequence=300
channel ORA_DISK_1: restoring archive log
archive log thread=1 sequence=301
channel ORA_DISK_1: restoring archive log
archive log thread=1 sequence=302
channel ORA_DISK_1: reading from backup piece /data3/ordrbak/arch_order_20060914_173
channel ORA_DISK_1: restored backup piece 1
piece handle=/data3/ordrbak/orderarch_order_20060914_173 tag=TAG20060914T033004
channel ORA_DISK_1: restore complete, elapsed time: 00:00:08
archive log filename=/oradata/archive/1_300_592917188.dbf thread=1 sequence=300
archive log filename=/oradata/archive/1_301_592917188.dbf thread=1 sequence=301
archive log filename=/oradata/archive/1_302_592917188.dbf thread=1 sequence=302
archive log filename=/oradata/archive/1_303_592917188.dbf thread=1 sequence=303
archive log filename=/oradata/archive/1_304_592917188.dbf thread=1 sequence=304
media recovery complete, elapsed time: 00:00:57
Finished recover at 2006-09-14 22:51:39

Resetlogs打开数据库:

RMAN> alter database open resetlogs;

database opened

RMAN>

此时可以检查数据的正确性,如果无误就可以通过exp导出数据,再imp进生产数据库,完成恢复。

在有了充分的备份的前提下,这样的恢复是非常容易的。
这个故事再次告诉我们:备份重于一切

-The End-

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-21 7:00:10
[oracle@ora64-2 ~]$ export ORACLE_SID=ora64-----------另一实例
[oracle@ora64-2 ~]$ $ORACLE_HOME/bin/rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Thu Jun 14 09:33:22 2007
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
connected to target database (not started)
RMAN> startup nomount;
startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/opt/oracle/app/product/10.2.0/db/dbs/initora64.ora'
starting Oracle instance without parameter file for retrival of spfile
Oracle instance started
Total System Global Area     159383552 bytes
Fixed Size                     2019256 bytes
Variable Size                 67108936 bytes
Database Buffers              88080384 bytes
Redo Buffers                   2174976 bytes
RMAN> restore spfile from autobackup;---------------------恢复spfile
Starting restore at 14-JUN-07
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=33 devtype=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 06/14/2007 09:34:23
RMAN-06495: must explicitly specify DBID with SET DBID command
RMAN> set dbid=1241032619
executing command: SET DBID
RMAN> restore spfile from autobackup;
Starting restore at 14-JUN-07
using channel ORA_DISK_1
channel ORA_DISK_1: looking for autobackup on day: 20070614
channel ORA_DISK_1: looking for autobackup on day: 20070613
channel ORA_DISK_1: autobackup found: c-1241032619-20070613-05
channel ORA_DISK_1: SPFILE restore from autobackup complete
Finished restore at 14-JUN-07
RMAN> restore controlfile from autobackup;-----------------------恢复控制文件
Starting restore at 14-JUN-07
using channel ORA_DISK_1
channel ORA_DISK_1: looking for autobackup on day: 20070614
channel ORA_DISK_1: looking for autobackup on day: 20070613
channel ORA_DISK_1: autobackup found: c-1241032619-20070613-05
channel ORA_DISK_1: control file restore from autobackup complete
output filename=/opt/oracle/app/product/10.2.0/db/dbs/cntrlora64.dbf
Finished restore at 14-JUN-07
RMAN> shutdown immediate
Oracle instance shut down
RMAN> exit

Recovery Manager complete.
[oracle@ora64-2 ~]$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on Thu Jun 14 09:38:29 2007
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup nomount
ORA-29760: instance_number parameter not specified---------------启动实例失败,原库为一RAC库,创建pfile修改参数
SQL>
SQL> create pfile ='/home/oracle/pfile' from spfile;
File created.
SQL> exit
编辑pfile文件,修改instance_number
[oracle@ora64-2 dbs]$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on Thu Jun 14 09:45:06 2007
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup nomount pfile='/home/oracle/pfile'
ORACLE instance started.
Total System Global Area 1027604480 bytes
Fixed Size                  2025904 bytes
Variable Size             251659856 bytes
Database Buffers          771751936 bytes
Redo Buffers                2166784 bytes
SQL> alter database mount;---------------------------------mount 库
Database altered.

[oracle@ora64-2 ~]$ $ORACLE_HOME/bin/rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Thu Jun 14 09:51:39 2007
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
connected to target database: ORA (DBID=1241032619, not open)
using target database control file instead of recovery catalog
RMAN> restore database;
Starting restore at 14-JUN-07
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=260 instance=ora64 devtype=DISK
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00002 to /dev/raw/raw11
channel ORA_DISK_1: reading from backup piece /data/oraback/database/incr0_ORA_20070613_14_1.bak
channel ORA_DISK_1: restored backup piece 1
piece handle=/data/oraback/database/incr0_ORA_20070613_14_1.bak tag=TAG20070613T131920
channel ORA_DISK_1: restore complete, elapsed time: 00:01:36
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /dev/raw/raw9
restoring datafile 00003 to /dev/raw/raw10
restoring datafile 00004 to /dev/raw/raw15
channel ORA_DISK_1: reading from backup piece /data/oraback/database/incr0_ORA_20070613_15_1.bak
channel ORA_DISK_1: restored backup piece 1
piece handle=/data/oraback/database/incr0_ORA_20070613_15_1.bak tag=TAG20070613T131920
channel ORA_DISK_1: restore complete, elapsed time: 00:01:05
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00005 to /dev/raw/raw16
restoring datafile 00006 to /dev/raw/raw18
restoring datafile 00007 to /dev/raw/raw19
channel ORA_DISK_1: reading from backup piece /data/oraback/database/incr0_ORA_20070613_16_1.bak
channel ORA_DISK_1: restored backup piece 1
piece handle=/data/oraback/database/incr0_ORA_20070613_16_1.bak tag=TAG20070613T131920
channel ORA_DISK_1: restore complete, elapsed time: 00:00:55
Finished restore at 14-JUN-07
RMAN> recover database;
Starting recover at 14-JUN-07
using channel ORA_DISK_1
starting media recovery
archive log thread 1 sequence 2 is already on disk as file /data/archlog/arch_1_2_625151260.arc
archive log thread 2 sequence 3 is already on disk as file /data/archlog/arch_2_3_625151260.arc
archive log filename=/data/archlog/arch_2_3_625151260.arc thread=2 sequence=3
archive log filename=/data/archlog/arch_1_2_625151260.arc thread=1 sequence=2
media recovery complete, elapsed time: 00:00:08
Finished recover at 14-JUN-07
RMAN> alter database open;------------------------------------open库
database opened
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-20 23:42:29
RMAN 的list 命令
  
  1 列出对应物  RMAN>list incarnation;
  
  2 列出备份
  
  2.1概述可用的备份    RMAN>list backup summary;
               B 表示 backup
               F 表示 FULL
               A 表示 archive log
               0 1 表示 incremental backup
               S 说明备份状态 (A AVAILABLE   X EXPIRED )
  
  2.2按备份类型列出备份  RMAN>list backup by file;
               按照 数据文件备份,归档日志备份,控制文件备份,服务器参数文件备份 列出
  
  2.3列出详细备份     RMAN>list backup;
  
  2.4列出过期备份     RMAN>list expired backup;
  
  2.5列出表空间和数据文件备份
              list backup of tablespace 和list backup of datafile 输出和list backup 相似
               如:list backup of tablespace user_tbs;
                 list backup of datafile 3;
  
  2.6列出归档日志备份   RMAN>list archivelog all;      简要信息
    RMAN>list backup of archivelog all; 详细信息
  
  2.7列出控制文件和服务器参数文件
               RMAN>list backup of controfile;
               RMAN>list backup of spfile;
  
  =====================================================
  =====================================================
  RMAN 的 report命令
  
  1. 报告最近没有被备份的数据文件
    RMAN>report need backup days=3;
   
  2. 报告备份冗余或恢复窗口
    RMAN>report need backup redundancy=2;
    RMAN>report need backup recovery window of 2 days;
   
  3. 报告数据文件的不可恢复操作
    RMAN>report unrecoverable;
  
  4. 报告数据库模式
    RMAN>report schema;
   
  5. 报告丢弃的备份
    如果使用了保存策略,备份会标记为丢弃状态  RMAN>report obsolete; 删除丢弃状态备份RMAN>delete obsolete;
  
  =====================================================
  =====================================================
  RMAN的crosscheck 命令
  
  1 备份集有两种状态A(Available,RMAN认为该项存在于备份介质上)X(Expired,备份存在于控制文件或恢复目录中,但是并没有物理存在于备份介质上)
   
  2 crosscheck 的目的是检查RMAN 的目录以及物理文件,如果物理文件不存在于介质上,将标记为Expired。如果物理文件存在,将维持Available。如果原先标记为Expired的备份集再次存在于备份介质上(如恢复了损坏的磁盘驱动器后),crosscheck将把状态重新从Expired标记回Available。
  
  3 crosscheck 输出分两部分。第一部分列出确定存在于备份介质上的所有备份集片,第二部分列出不存在于备份介质上的备份集片,并将其标记为Expired。当设置备份保存策略后,一个备份过期,crosscheck之后标记为丢弃的备份状态依旧为availabel,要删除丢弃备份delete obsolete。
  
  4 示例:
   crosscheck backup
   crosscheck backup of datafile 1;
   crosscheck backup of tablespace users;
   crosscheck backup of controfile;
   crosscheck backup of controlfile;
   crosscheck backup tag='SAT_BACKUP';
   crosscheck backup completed after 'sysdate - 2'
   crosscheck backup completed between 'sysdate - 5' and 'sysdate -2 '
   crosscheck backup device type sbt;
   crosscheck archivelog all;
   crosscheck archivelog like '%ARC00012.001'
   crosscheck archivelog from sequence 12;
   crosscheck archivelog until sequence 522;
  
  =====================================================
  =====================================================
  RMAN 的validate 命令
  
  1 validate 命令验证备份集片是否能够被还原
  
  2 list backup summary; 得到了备份集得主键ID如40,然后validate backupset 40;
  =====================================================
  =====================================================
  RMAN 的备份保存策略以及change ,delete命令
  
  0.带delete参数的change 命令删除备份集,从备份介质,并且从控制文件和恢复目录中删除。
   change backupset 117,118 delete;
   change backuppiece 1304 delete;
   change archivelog until logseq =544 delete;
  
  1.两类策略:恢复窗口备份保存策略(recovery windows backup retension policy) 基于时间
        备份冗余备份保存策略(backup redundancy backup retension policy) 基于备份的数量
  
   两类策略互相排斥
   
  2.即使使用了备份保存策略,备份到期并不删除,只是在RMAN目录中标记为丢弃,看到的状态依旧为available;
   要查看标记为丢弃的备份 report obsolete,只有使用delete obsolete才真正物理删除。
  
  3.configure retension policy to recovery window of 7 days;
   configure retension policy to redundancy 3;
   显示结果 show all;
   
  4.查看到期丢弃的备份时,可能需要手工保存一些备份 ,可以使用change 命令带keep 参数,使用这个命令后,那些被修改的备份将被认为是个long-term backup,不在受保存策略影响也就是说delete obsolete 也不删除。
  
  5.要使备份时候不受保存策略影响 ,使用带keep参数的backup 命令
   backup database keep forever;
   backup database keep 5 days;
  
  6.change 命令功能
  
    可以修改备份为永久保存并将以及该备份的相关的日志保存下来,保证总能将备份恢复到当前时间点
    change backupset 31 keep forever logs;
    可以设置备份丢弃的新日期 ,将备份在多保存7 天,7 天后将删除
    change backupset 32 keep until time 'sysdata + 7' logs;
  
  7.change 可以将备份集设置为unavailable
    change backupset 33 unavailable;
    标记为unavailable状态的备份集并不参与crosscheck;
  =====================================================
  =====================================================
  恢复目录的记录删除
  
  1. $ORACLE_HOME/rdbms/admin/prgrmanc.sql 脚本定期删除恢复目录中具有DELETED状态的记录
  
  2. 要删除旧的对应物记录incarnation.必须从DBINC 表中删除这些对应物,使用RC_DATABASE_INCARNATION 视图来确定要删除的对应物。记录要删除的每个对应物的DBINC_KEY
    随后启动SQL*Plus,执行delete from dbinc where dbinc_key=2;
  =====================================================
  =====================================================
  手工同步恢复目录
  
  resync catalog;
  
  Oracle同步恢复目录的时候,首先创建快照控制文件,然后比较这个文件和恢复目录,完成后,Oracle 更新恢复目录,使恢复目录和控制文件同步
  =====================================================
  =====================================================
  在RMAN 中存储脚本
  
  1,连接到目标数据库和恢复目录
    rman target / catalog rman/rman@rman9i
   
  2,创建脚本
    RMAN>create script my_bk_script
    2>{backup database plus archivelog;}
     create script my_bk_script
    
  3,打印脚本
   RMAN>print script my_bk_script;
   printing stored scipt:my_bk_script
   {backup database plus archivelog;}
   
  4,运行这个脚本,备份目标数据库
   RMAN>run {execute scipt my_bk_script;}
   
  5 删除脚本
   RMAN>delete script my_bk_script;
  =====================================================
  =====================================================
  archivelog模式下的完全恢复
  
  step1:set oracle_sid=recover
      rman target rman_backup/password
      configure controlfile autobackup on;
      
  step2:backup database plus archivelog delete input;
  
  step3:shutdown immediate;
  
  step4:重命名所有的数据文件和控制文件,不重命名联机重做日志。
  
  step5: startup nomount;
      set DBID=****
      restore controlfile from autobackup;
      alter database mount;
     
  step6: restore database;
      recover database;
      alter database open resetlogs;
  
  表空间恢复
  
  sql"alter tablespace users offline";
  sql"alter tablespace tools offline";
  restore tablespace users,tools;
  recover tablespace users,tools;
  sql"alter tablespace users online";
  sql"alter tablespace tools online";
  
  数据文件恢复
  
  sql"alter database datafile 3 offline";
  sql"alter database datafile 'd:oracleoradatausers01.dbf' offline";
  restore datafile 3
  restore datafile 'd:oracleoradatausers01.dbf';
  recover datafile 3
  recover datafile 'd:oracleoradatausers01.dbf';
  sql"alter database datafile 3 online";
  sql"alter database datafile 'd:oracleoradatausers01.dbf'online";
  
  =====================================================
  =====================================================
  切换当前的incarnation 回到resetlogs 前RESET DATABASE TO INCARNATION inc_key
  
  =====================================================
  =====================================================
  
  RMAN 高级恢复
  
  1 基于时间点的恢复
  run
  {
  set until time "to_date('07/01/02 15:00:00','mm/dd/yy hh24:mi:ss')"'
  restore database;
  recover database;
  alter database open resetlogs;
  }
  
  2 基于SCN 的恢复
  startup mount;
  restore database UNTIL SCN 10000;
  recover database UNTIL SCN 10000;
  alter database open resetlogs;
  
  3 基于日志序列的恢复
  startup mount;
  restore database UNTIL SEQUENCE 100 thread 1;
  recover database UNTIL SEQUENCE 100 thread 1;
  alter database open resetlogs;
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-20 23:20:17

alter system switch logfile和alter system archive log current的区别

alter system switch logfile 是强制日志切换,不一定就归档当前的重做日志文件(若自动归档打开,就归档前的重做日志,若自动归档没有打开,就不归档当前重做日志。)
alter system archive log current 是归档当前的重做日志文件,不管自动归档有没有打都归档。
以上有问题。

yangtingkun版主
主要的区别在于
ALTER SYSTEM SWITCH LOGFILE对单实例数据库或RAC中的当前实例执行日志切换。
而ALTER SYSTEM ARCHIVE LOG CURRENT会对数据库中的所有实例执行日志切换

为什么执行热备后要执行alter system archive log current 这个语句,看到很多脚本都是这样写的。
是不是必须的?至今想不通。

一般的RMAN脚本都是这样写的,因为RMAN是可以备份归档日志的。alter system archive log current 这样后就可以将所有的归档都备份出来了。这样做是为了保证数据的完整和一致。

是为了把热备份过程中发生的所有变化进行归档,否则如果热备份做完了,这时候发生媒介错误,ONLINE REDO丢失的话,你想想是
什么后果?说白了,就是为了更好的保护数据。

ALTER SYSTEM SWITCH LOGFILE VS ALTER SYSTEM ARCHIVE LOG CURRENT
===========================================================


ALTER SYSTEM SWITCH LOGFILE ;

SWITCH LOGFILE Clause

The SWITCH LOGFILE clause lets you explicitly force Oracle to begin writing to a new redo log file group, regardless of whether the files in the current redo log file group are full. When you force a log switch, Oracle begins to perform a checkpoint but returns control to you immediately rather than when the checkpoint is complete. To use this clause, your instance must have the database open.

ALTER SYSTEM ARCHIVE LOG CURRENT ;
CURRENT Clause

Specify CURRENT to manually archive the current redo log file group of the specified thread(instance), forcing a log switch. If you omit the THREAD parameter, then Oracle archives all redo log file groups from all enabled threads(instances), including logs previous to current logs. You can specify CURRENT only when the database is open.

ALTER SYSTEM ARCHIVE LOG CURRENT NOSWITCH;
NOSWITCH

Specify NOSWITCH if you want to manually archive the current redo log file group without forcing a log switch. This setting is used primarily with standby databases to prevent data divergence when the primary database shuts down. Divergence implies the possibility of data loss in case of primary database failure.

You can use the NOSWITCH clause only when your instance has the database mounted but not open. If the database is open, then this operation closes the database automatically. You must then manually shut down the database before you can reopen it.

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-20 22:52:42

--首先来个不完全恢复

PENG(sys)>select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

RMAN> backup database ;


C:Documents and SettingsAdministrator>sqlplus sys/sys@orcl36 as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 8月 20 17:54:34 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

PENG(sys)>create table test(a varchar2(10));

表已创建。

PENG(sys)>insert into test select 'test' from dual;

已创建 1 行。

PENG(sys)>commit;

提交完成。

PENG(sys)>select * from test;

A
----------
test

PENG(sys)>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

PENG(sys)>select sysdate from dual
2 ;

SYSDATE
-------------------
2004-08-21 10:55:32


PENG(sys)>truncate table test;

表被截断。

PENG(sys)>select * from test;

未选定行

PENG(sys)>shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

C:>set nls_date_formate=yyyy-mm-dd hh24:mi:ss

C:>rman target sys/sys@orcl36

恢复管理器: Release 10.2.0.1.0 - Production on 星期一 8月 20 17:58:52 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup mount;

Oracle 实例已启动
数据库已装载

系统全局区域总计 167772160 字节

Fixed Size 1247900 字节
Variable Size 75498852 字节
Database Buffers 88080384 字节
Redo Buffers 2945024 字节

/*
run{
set until time '2004-08-21 10:55:32';
restore database;
recover database;
}

*/

RMAN> run{
2> set until time '2004-08-21 10:55:32';
3> restore database;
4> recover database;
5> }

正在执行命令: SET until clause
使用目标数据库控制文件替代恢复目录

启动 restore 于 2007-08-21 11:04:29
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=157 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF
正将数据文件00005恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLEXAMPLE01.DBF
正将数据文件00006恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLPERFSTAT.DBF
通道 ORA_DISK_1: 正在读取备份段 C:ORACLEBACKDB_FULL_PENG_20040820_534708122_246_7MFTTVSQ_1_1.BAK
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:ORACLEBACKDB_FULL_PENG_20040820_534708122_246_7MFTTVSQ_1_1.BAK 标记 = TAG20040820T180202
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:55
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00002恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLUSERS02.DBF
正将数据文件00003恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLSYSAUX01.DBF
正将数据文件00004恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLUSERS01.DBF
正将数据文件00007恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_ROW.DBF
正将数据文件00008恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART1.DBF
正将数据文件00009恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART2.DBF
正将数据文件00010恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART3.DBF
正将数据文件00011恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART4.DBF
正将数据文件00012恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLUNDOTBS02.DBF
正将数据文件00013恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_BACK.DBF
通道 ORA_DISK_1: 正在读取备份段 C:ORACLEBACKDB_FULL_PENG_20040820_534708178_247_7NFTTVUI_1_1.BAK
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:ORACLEBACKDB_FULL_PENG_20040820_534708178_247_7NFTTVUI_1_1.BAK 标记 = TAG20040820T180202
通道 ORA_DISK_1: 恢复完成, 用时: 00:01:05
完成 restore 于 2007-08-21 11:06:35

启动 recover 于 2007-08-21 11:06:35
使用通道 ORA_DISK_1

正在开始介质的恢复
介质恢复完成, 用时: 00:00:04

完成 recover 于 2007-08-21 11:06:47

RMAN> alter database open resetlogs;

数据库已打开

C:Documents and SettingsAdministrator>sqlplus sys/sys@orcl36 as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 8月 21 11:12:17 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

PENG(sys)>select * from test;

A
----------
test


--接着进行恢复试验

PENG(sys)>shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

C:oracleproduct10.2.0oradataorcl>dir *.dbf
驱动器 C 中的卷没有标签。
卷的序列号是 48B6-4D9D

C:oracleproduct10.2.0oradataorcl 的目录

2004-08-21 11:09 104,865,792 EXAMPLE01.DBF
2004-08-21 11:09 209,723,392 PERFSTAT.DBF
2004-08-21 11:09 251,666,432 SYSAUX01.DBF
2004-08-21 11:09 503,324,672 SYSTEM01.DBF
2004-08-16 15:54 20,979,712 TEMP01.DBF
2004-08-21 11:09 1,056,768 TS_BACK.DBF
2004-08-21 11:09 6,889,472 TS_PART1.DBF
2004-08-21 11:09 1,056,768 TS_PART2.DBF
2004-08-21 11:09 1,908,736 TS_PART3.DBF
2004-08-21 11:00 1,056,768 TS_PART4.DBF
2004-08-21 11:09 1,056,768 TS_ROW.DBF
2004-08-21 11:09 10,493,952 UNDOTBS02.DBF
2004-08-21 11:09 266,084,352 USERS01.DBF
2004-08-21 11:09 1,056,768 USERS02.DBF
14 个文件 1,381,220,352 字节
0 个目录 849,252,352 可用字节



C:oracleproduct10.2.0oradataorcl>del TS_BACK.DBF

PENG(sys)>startup
ORACLE 例程已经启动。

Total System Global Area 100663296 bytes
Fixed Size 1247516 bytes
Variable Size 62916324 bytes
Database Buffers 33554432 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 13 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 13: 'C:ORACLEPRODUCT10.2.0ORADATAORCLTS_BACK.DBF'

C:>rman target sys/sys@orcl36

恢复管理器: Release 10.2.0.1.0 - Production on 星期二 8月 21 11:17:35 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.

已连接到目标数据库: PENG (DBID=497086482, 未打开)

/*
run{
restore database;
recover database;
}

*/

RMAN> run{
2> restore database;
3> recover database;
4> }

启动 restore 于 2007-08-21 11:18:32
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=155 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF
正将数据文件00005恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLEXAMPLE01.DBF
正将数据文件00006恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLPERFSTAT.DBF
通道 ORA_DISK_1: 正在读取备份段 C:ORACLEBACKDB_FULL_PENG_20040820_534708122_246_7MFTTVSQ_1_1.BAK
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:ORACLEBACKDB_FULL_PENG_20040820_534708122_246_7MFTTVSQ_1_1.BAK 标记 = TAG20040820T180202
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:55
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00002恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLUSERS02.DBF
正将数据文件00003恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLSYSAUX01.DBF
正将数据文件00004恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLUSERS01.DBF
正将数据文件00007恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_ROW.DBF
正将数据文件00008恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART1.DBF
正将数据文件00009恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART2.DBF
正将数据文件00010恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART3.DBF
正将数据文件00011恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART4.DBF
正将数据文件00012恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLUNDOTBS02.DBF
正将数据文件00013恢复到C:ORACLEPRODUCT10.2.0ORADATAORCLTS_BACK.DBF
通道 ORA_DISK_1: 正在读取备份段 C:ORACLEBACKDB_FULL_PENG_20040820_534708178_247_7NFTTVUI_1_1.BAK
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:ORACLEBACKDB_FULL_PENG_20040820_534708178_247_7NFTTVUI_1_1.BAK 标记 = TAG20040820T180202
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:55
完成 restore 于 2007-08-21 11:20:25

启动 recover 于 2007-08-21 11:20:25
使用通道 ORA_DISK_1

正在开始介质的恢复

存档日志线程 1 序列 3 已作为文件 C:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAPENGARCHIVELOG2004_08_21O1_MF_1_3_0LFH2
HWB_.ARC 存在于磁盘上
通道 ORA_DISK_1: 正在启动到默认目标的存档日志恢复
通道 ORA_DISK_1: 正在恢复存档日志
存档日志线程 =1 序列=2
通道 ORA_DISK_1: 正在读取备份段 C:ORACLEBACKARCH_FULL_PENG_20040820_534708238_249_7PFTU00E_1_1.BAK
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:ORACLEBACKARCH_FULL_PENG_20040820_534708238_249_7PFTU00E_1_1.BAK 标记 = TAG20040820T180358
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:01
存档日志文件名 =C:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAPENGARCHIVELOG2004_08_21O1_MF_1_2_0LFHM7RF_.ARC 线程 =1
序列 =2
通道 default: 正在删除存档日志
存档日志文件名 =C:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAPENGARCHIVELOG2004_08_21O1_MF_1_2_0LFHM7RF_.ARC 记录 ID=
106 时间戳 =534770151
存档日志文件名 =C:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAPENGARCHIVELOG2004_08_21O1_MF_1_3_0LFH2HWB_.ARC 线程 =1
序列 =3
介质恢复完成, 用时: 00:00:03
完成 recover 于 2007-08-21 11:20:33

RMAN> alter database open;

数据库已打开



PENG(sys)>select * from test;

A
----------
test

PENG(sys)>select file#,name from v$datafile;

FILE# NAME
---------- ------------------------------------------------------------
1 C:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF
2 C:ORACLEPRODUCT10.2.0ORADATAORCLUSERS02.DBF
3 C:ORACLEPRODUCT10.2.0ORADATAORCLSYSAUX01.DBF
4 C:ORACLEPRODUCT10.2.0ORADATAORCLUSERS01.DBF
5 C:ORACLEPRODUCT10.2.0ORADATAORCLEXAMPLE01.DBF
6 C:ORACLEPRODUCT10.2.0ORADATAORCLPERFSTAT.DBF
7 C:ORACLEPRODUCT10.2.0ORADATAORCLTS_ROW.DBF
8 C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART1.DBF
9 C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART2.DBF
10 C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART3.DBF
11 C:ORACLEPRODUCT10.2.0ORADATAORCLTS_PART4.DBF
12 C:ORACLEPRODUCT10.2.0ORADATAORCLUNDOTBS02.DBF
13 C:ORACLEPRODUCT10.2.0ORADATAORCLTS_BACK.DBF

已选择13行。

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-20 22:48:59
1、切换服务器归档模式,如果已经是归档模式可跳过此步:

%sqlplus /nolog (启动sqlplus)

SQL> conn / as sysdba (以DBA身份连接数据库)

SQL> shutdown immediate; (立即关闭数据库)

SQL> startup mount (启动实例并加载数据库,但不打开)

SQL> alter database archivelog; (更改数据库为归档模式)

SQL> alter database open; (打开数据库)

SQL> alter system archive log start; (启用自动归档)

SQL> exit (退出)

2、连接:

%rman target=rman/rman@mydb (启动恢复管理器)

3、基本设置:

RMAN> configure default device type to disk; (设置默认的备份设备为磁盘)

RMAN> configure device type disk parallelism 2; (设置备份的并行级别,通道数)

RMAN> configure channel 1 device type disk fromat '/backup1/backup_%U'; (设置备份的文件格式,只适用于磁盘设备)

RMAN> configure channel 2 device type disk fromat '/backup2/backup_%U'; (设置备份的文件格式,只适用于磁盘设备)

RMAN> configure controlfile autobackup on; (打开控制文件与服务器参数文件的自动备份)

RMAN> configure controlfile autobackup format for device type disk to '/backup1/ctl_%F'; (设置控制文件与服务器参数文件自动备份的文件格式)

4、查看所有设置:

RMAN> show all

5、查看数据库方案报表:

RMAN> report schema;

6、备份全库:

RMAN> backup database plus archivelog delete input; (备份全库及控制文件、服务器参数文件与所有归档的重做日志,并删除旧的归档日志)

7、备份表空间:

RMAN> backup tablespace system plus archivelog delete input; (备份指定表空间及归档的重做日志,并删除旧的归档日志)

8、备份归档日志:

RMAN> backup archivelog all delete input;

9、复制数据文件:

RMAN> copy datafile 1 to '/oracle/dbs/system.copy';

10、查看备份和文件复本:

RMAN> list backup;

11、验证备份:

RMAN> validate backupset 3;

12、从自动备份中恢复服务器参数文件:

RMAN> shutdown immediate; (立即关闭数据库)

RMAN> startup nomount; (启动实例)

RMAN> restore spfile to pfile '/backup1/mydb.ora' from autobackup; (从自动备份中恢复服务器参数文件)

13、从自动备份中恢复控制文件:

RMAN> shutdown immediate; (立即关闭数据库)

RMAN> startup nomount; (启动实例)

RMAN> restore controlfile to '/backup1' from autobackup; (从自动备份中恢复控制文件)

13、恢复和复原全数据库:

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; (打开数据库)

14、恢复和复原表空间:

RMAN> sql 'alter tablespace users offline immediate'; (将表空间脱机)

RMAN> exit (退出恢复管理器)

%mv /oracle/dbs/users01.dbf /oracle/dbs/users01.bak (将表空间重命名)

%rman target=rman/rman@mydb (启动恢复管理器)

RMAN> restore tablespace users; (还原表空间)

RMAN> recover tablespace users; (恢复表空间)

RMAN> sql 'alter tablespace users online'; (将表空间联机)

15、增量备份与恢复:

第一天的增量基本备份:

RMAN> backup incremental level=0 database plus archivelog delete input;

第二天的增量差异备份:

RMAN> backup incremental level=2 database plus archivelog delete input;

第三天的增量差异备份:

RMAN> backup incremental level=2 database plus archivelog delete input;

第四天的增量差异备份:

RMAN> backup incremental level=1 database plus archivelog delete input;

第五天的增量差异备份:

RMAN> backup incremental level=2 database plus archivelog delete input;

第六天的增量差异备份:

RMAN> backup incremental level=2 database plus archivelog delete input;

第七天的增量差异备份:

RMAN> backup incremental level=0 database plus archivelog delete input;

增量恢复:

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;
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-20 13:55:11
1 测试说明
1.1 测试目的
验证RMAN备份与恢复全过程。记录整个过程的操作细节。
利用RMAN的备份与恢复可完成如下工作:
(1) 数据库备份/恢复;
(2) 同一主机,不同磁盘阵列,相同数据存储路径(模式)的数据迁移;(在恢复过程中改变数据存储路径/模式过程待验证)
(3) 不同主机,相同操作系统、同一数据库版本之间的的数据库迁移。(不同数据库版本之间是否可利用RMAN 备份与恢复进行数据迁移待验证。)
1.2 测试环境说明
• OS:Windows XP
• ORACLE VERSION: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 – Prod
• ORACLE运行模式:归档模式
• ORACLE数据存储:文件系统,存储于D:\oracle\product\10.1.0\oradata\orcl 包含文件如下:
2007-08-15 08:43 2,867,200 CONTROL01.CTL
2007-08-15 08:43 2,867,200 CONTROL02.CTL
2007-08-15 08:43 2,867,200 CONTROL03.CTL
2007-08-15 08:42 10,486,272 REDO03.LOG
2007-08-15 08:42 10,486,272 REDO04.LOG
2007-08-15 08:42 10,486,272 REDO05.LOG
2007-08-15 08:42 10,486,272 REDO06.LOG
2007-08-15 08:53 220,209,152 SYSAUX01.DBF
2007-08-15 08:43 461,381,632 SYSTEM01.DBF
2007-08-15 08:43 26,222,592 UNDOTBS01.DBF
2007-08-15 08:43 5,251,072 USERS01.DBF

2 数据备份过程
2.1 RMAN 数据库全备份
rman nocatalog target /
run
{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup database format 'C:\db_full_%U' include current controlfile;
sql 'alter system archive log current';
#crosscheck archivelog all;
backup format 'c:\arch_full_%U' archivelog all delete input;
release channel c1;
release channel c2;
release channel c3;
}
【注意】
 RMAN采用无恢复目录模式
 备份数据库过程包含当前控制文件备份
 数据库处于归档模式,备份过程包含所有归档日志的备份
 数据库必须处于mount或者open状态,才能进行数据库备份
2.2 数据库在数据全备份后继续操作
(1)在RMAN全备份后继续数据库的操作。即在测试表中插入数据。
SQL> conn kfzjd/kfzjd
已连接。
SQL> insert into t values(100);

已创建 1 行。

SQL> insert into t values(200);

已创建 1 行。

SQL> insert into t values(300);

已创建 1 行。

SQL> insert into t values(400);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t;

ID
----------
1
2
3
100
200
300
400

已选择7行。


(2)正常关闭数据库。并删除原数据库所有文件,包括:控制文件、数据文件、日志文件。以模拟更换磁盘阵列或者文件丢失的情况。
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host move D:\oracle\product\10.1.0\oradata\orcl D:\oracle\product\10.1.0\oradata\orcl.bak
【注意】
 删除文件过程,将以更目录名称的方式,用以模拟新盘阵上的文件存储路径与原系统不同。(^_^)
此时,重新启动数据库过程必然失败。
SQL> conn / as sysdba
已连接。
SQL> startup
ORACLE instance started.

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
ORA-00205: ?????????, ??????, ???????
【注意】此时由于实例存在,但是database全部丢失,则INSTANCE启动成功,但是database启动失败。即可,NOMOUNT状态(只启动INSTANCE)成功;进入MOUNT状态时,由于控制文件丢失,MOUNT 失败。数据库启动过程不能继续。
3 数据库恢复过程
当前情况下,所有的控制文件、数据库文件、联机日志文件均全部丢失。按照数据库恢复/启动过程,应按照先恢复数据库控制文件,再恢复数据文件的步骤进行。
3.1 恢复数据库控制文件
控制文件的恢复,依托于控制文件的备份方式。以下将分别进行说明。
3.1.1 从RMAN备份中恢复控制文件
在本例子中,RMAN备份脚本进行了控制文件的备份。所以,控制文件的恢复过程可以利用RMAN的备份完成。
此时,也存在两种情况。
• RMAN设置了控制文件自动备份。
• RMAN未设置控制文件自动备份,而由RMAN脚本进行控制文件备份。如本例所示。
对于此两种情况,分别说明如下。
3.1.1.1 RMAN未设置控制文件自动备份(本例)
C:\>rman nocatalog target /

恢复管理器: 版本10.1.0.2.0 - Production

Copyright (c) 1995, 2004, Oracle. All rights reserved.

连接到目标数据库: ORCL (DBID=1158376346)
正在使用目标数据库控制文件替代恢复目录

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 OFF;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
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 ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S
NCFORCL.ORA'; # default
【注意】RMAN 未设置控制文件自动备份。此时如果RMAN 的直接恢复将不成功。如下所示。
RMAN> startup nomount;

Oracle 例程已启动

系统全局区域总计 171966464 字节

Fixed Size 787988 字节
Variable Size 145750508 字节
Database Buffers 25165824 字节
Redo Buffers 262144 字节

RMAN> restore controlfile from autobackup;(由于没有设置自动备份控制文件所以出错)

启动 restore 于 15-8月 -07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=160 devtype=DISK

恢复区域目标: D:\oracle\product\10.1.0\flash_recovery_area
用于搜索的数据库名 (或锁定名称空间): ORCL
通道 ORA_DISK_1: 在恢复区域中找到自动备份
通道 ORA_DISK_1: 已找到的自动备份: D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\
ORCL\AUTOBACKUP\2007_08_14\O1_MF_S_630614292_3D31JOHN_.BKP
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 08/15/2007 09:54:16
ORA-19504: 无法创建文件"D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL"
ORA-27040: 文件创建错误, 无法创建文件
OSD-04002: 无法打开文件
O/S-Error: (OS 3) 系统找不到指定的路径。

RMAN> restore controlfile;(语法就错误了)

启动 restore 于 15-8月 -07
使用通道 ORA_DISK_1

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 08/15/2007 09:54:31
RMAN-06563: controlfile or SPFILE must be restored using FROM AUTOBACKUP

RMAN> restore database;(数据库未到MOUNT状态,不能进行^_^)

启动 restore 于 15-8月 -07
使用通道 ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 08/15/2007 09:56:57
ORA-01507: 未装载数据库



RMAN> recover database using backup controlfile;(曾经见过ITPUB上有人怎么写,但是无法通过)

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01005: syntax error: found "identifier": expecting one of: "archivelog, aux
iliary, allow, check, delete, from, high, noredo, noparallel, parallel, ;, skip,
tablespace, test, until"
RMAN-01008: the bad identifier was: using
RMAN-01007: at line 1 column 18 file: standard input

RMAN> restore database using backup controlfile; (数据库未到MOUNT状态,不能进行^_^)

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00558: error encountered while parsing input commands
RMAN-01005: syntax error: found "identifier": expecting one of: "archivelog, cha
nnel, check, controlfile, clone, database, datafile, device, from, force, high,
(, preview, ;, skip, spfile, standby, tablespace, until, validate"
RMAN-01008: the bad identifier was: using
RMAN-01007: at line 1 column 18 file: standard input

RMAN>

由于RMAN未设置控制文件自动备份。则可以利用程序包,从备份集中恢复。如下:
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
SQL> alter session set nls_language=american;

Session altered.

SQL> declare
2 devtype varchar2(256);
3 done boolean;
4 begin
5 devtype := dbms_backup_restore.deviceallocate(NULL);
6 dbms_backup_restore.restoresetdatafile;
7 dbms_backup_restore.restorecontrolfileto('D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL'
);
8 dbms_backup_restore.restorebackuppiece('c:\DB_FULL_0JIPED0I_1_1',done => done);
9 end;
10 /
declare
*
ERROR at line 1:
ORA-19624: operation failed, retry possible
ORA-19504: failed to create file
"D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL"
ORA-27040: file create error, unable to create file
OSD-04002: ????????????
O/S-Error: (OS 3) ??????????????????????
ORA-06512: at "SYS.X$DBMS_BACKUP_RESTORE", line 4772
ORA-06512: at line 8
【注意】由出错了!报告无法创建指定的控制文件,是过程有错误吗?不是,是由于文件目录并不存在。(此时是测试时,故意留下的问题。还记得前面采用修改目录名的方式启动删除所有文件的步骤吗?^_^)
创建D:\oracle\product\10.1.0\oradata\orcl目录后继续。此时该目录下无任何文件。(再留下一个问题,文件存储采用裸设备呢?)
SQL>
declare
2 devtype varchar2(256);
3 done boolean;
4 begin
5 devtype := dbms_backup_restore.deviceallocate(NULL);
6 dbms_backup_restore.restoresetdatafile;
7 dbms_backup_restore.restorecontrolfileto('D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL'
);
8 dbms_backup_restore.restorebackuppiece('c:\DB_FULL_0JIPED0I_1_1',done => done);
9 end;
10 /

PL/SQL 过程已成功完成。

此时在D:\oracle\product\10.1.0\oradata\orcl目录中,可看到一个控制文件。D:\oracle\product\10.1.0\oradata\orcl\CONTROL01.CTL。


此时启动数据库试验一下。
SQL> startup nomount
ORACLE 例程已经启动。

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
SQL> alter database mount;
alter database mount
*
第 1 行出现错误:
ORA-00205: ?????????, ??????, ???????

有出错了!看看ORA-00205的说明
ORA-00205 error in identifying controlfile, check alert log for more info
Cause: The system could not find a control file of the specified name and size.
Action: One of the following:
Check that the proper control file name is referenced in the CONTROL_FILES initialization parameter in the initialization parameter file and try again.
When using mirrored control files, that is, more than one control file is referenced in the initialization parameter file, remove the control file name listed in the message from the initialization parameter file and restart the instance. If the message does not recur, remove the problem control file from the initialization parameter file and create another copy of the control file with a new file name in the initialization parameter file.

明白了!原来是缺少控制文件。检查一下spfile的设置。
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------
control_files string D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL, D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL02.CTL, D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL03.CTL

果然如此。简单,复制controlfile即可。复制该名后继续。

SQL> alter database mount;

数据库已更改。

SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: ??????????? RESETLOGS ? NORESETLOGS ??

OK!数据库可以MOUNT了,但是不能OPEN。和预期目标一样。此时D:\oracle\product\10.1.0\oradata\orcl目录下文件如下。
2007-08-15 10:45 .
2007-08-15 10:45 ..
2007-08-15 10:37 2,867,200 CONTROL01.CTL
2007-08-15 10:37 2,867,200 CONTROL02.CTL
2007-08-15 10:37 2,867,200 CONTROL03.CTL
该目录下只有三个控制文件。和预计的一样。

至此,控制文件恢复完成,可以进行下一步了。
【注意】遗留一个问题。此时是由RMAN备份的控制文件中恢复。那么如果RMAN没有备份控制文件,同时RMAN没有设置自动备份控制文件,那么该如何恢复呢?当然,如果完全没有控制文件的备份,那么就彻底歇菜了!
对于控制文件的手工备份,可以采用
 Alter database backup controlfile to trace;(此恢复有点难度)
 Alter database backup control to ‘c:\control.bak’;(此恢复简单)
3.1.1.2 RMAN设置了控制文件自动备份
建议开启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 OFF; (未开启控制文件自动备份)
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
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 ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S
NCFORCL.ORA'; # default

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 PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
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 ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\ORACLE\PRODUCT\10.1.0\DB_1\DATABASE\S
NCFORCL.ORA'; # default(控制文件自动备份存储位置)

RMAN>
经过以上设置后,会在数据库的结构发生变化的时候自动备份控制文件。
从RMAN设置了控制文件自动备份后,恢复控制文件的过程如下:
RMAN> startup nomount
Oracle 例程已启动
系统全局区域总计 171966464 字节
Fixed Size 787988 字节
Variable Size 145750508 字节
Database Buffers 25165824 字节
Redo Buffers 262144 字节
RMAN> restore controlfile from autobackup;(从控制文件的自动备份集合中恢复控制文件)

启动 restore 于 15-8月 -07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=160 devtype=DISK

恢复区域目标: D:\oracle\product\10.1.0\flash_recovery_area
用于搜索的数据库名 (或锁定名称空间): ORCL
通道 ORA_DISK_1: 在恢复区域中找到自动备份
通道 ORA_DISK_1: 已找到的自动备份: D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\AUTOBACKUP\2007_08_15\O1_MF_S_63070
8486_3D5XJB9R_.BKP
通道 ORA_DISK_1: 从自动备份复原控制文件已完成
输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL01.CTL
输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL02.CTL
输出文件名=D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\CONTROL03.CTL
完成 restore 于 15-8月 -07

RMAN> alter database mount;(将数据库启动到MOUNTED状态,继续后续的文件恢复)
数据库已装载
释放的通道: ORA_DISK_1
利用以上语句完成控制文件自从控制文件自动备份集中恢复。完成控制文件的恢复操作。将在D:\oracle\product\10.1.0\oradata\orcl目录中生成新的控制文件。注意,此时恢复的控制文件为全部的控制文件。本例中为3个控制文件。
3.1.2 从手动控制文件备份中恢复
手动备份控制文件的方式有两种。
控制文件备份方式(1)
SQL> alter database backup controlfile to 'c:\contrilfile.bak';
数据库已更改。

方式(1)相当于为控制文件进行了一份COPY。在恢复时间,参看spfile中的control_files参数的设置进行恢复即可。

控制文件备份方式(2)
SQL> alter database backup controlfile to trace;
数据库已更改。

方式(2)将在user_dump_dest目录中生成一个trace文件。该文件中将生成控制文件的生成脚本。
本例中user_dump_dest路径为D:\oracle\product\10.1.0\admin\orcl\udump。控制文件生成脚本如下:


STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 454
LOGFILE
GROUP 3 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO03.LOG' SIZE 10M,
GROUP 4 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO04.LOG' SIZE 10M,
GROUP 5 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO05.LOG' SIZE 10M,
GROUP 6 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG' SIZE 10M
-- STANDBY LOGFILE
DATAFILE
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF',
'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF'
CHARACTER SET ZHS16GBK
;

下面将对利用方法(2)生成的控制文件脚本进行控制文件恢复的步骤说明如下:
SQL> conn / as sysdba
已连接到空闲例程。
SQL> startup nomount(只是启动INSTANCE)
ORACLE 例程已经启动。

Total System Global Area 171966464 bytes
Fixed Size 787988 bytes
Variable Size 145750508 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
SQL> select status from v$instance;

STATUS
------------------------
STARTED

利用trace中的创建控制文件脚本,创建控制文件。注意,此时创建的控制文件为所有控制文件,本例中为3个控制文件。创建控制文件位置、数量均由spfile指定。
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 454
7 LOGFILE
8 GROUP 3 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO03.LOG' SIZE 10M,
9 GROUP 4 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO04.LOG' SIZE 10M,
10 GROUP 5 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO05.LOG' SIZE 10M,
11 GROUP 6 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG' SIZE 10M
12 -- STANDBY LOGFILE
13 DATAFILE
14 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF',
15 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF',
16 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF',
17 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF'
18 CHARACTER SET ZHS16GBK
19 ;

控制文件已创建

注意:控制文件一旦创建,则数据库将启动到MOUNTED状态。
SQL> select status from v$instance;

STATUS
------------------------
MOUNTED

SQL> alter session set nls_language=american;
Session altered.

根据实际情况,看是否需要进行介质恢复
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required

SQL> alter database open;
Database altered.

3.2 恢复数据库数据文件
在控制文件恢复后,可以开始数据库文件的恢复。
D:\oracle\product\10.1.0>rman nocatalog target /
恢复管理器: 版本10.1.0.2.0 - Production
Copyright (c) 1995, 2004, Oracle. All rights reserved.
已连接到目标数据库 (未启动)
RMAN> startup nomount
Oracle 例程已启动
系统全局区域总计 171966464 字节
Fixed Size 787988 字节
Variable Size 145750508 字节
Database Buffers 25165824 字节
Redo Buffers 262144 字节
RMAN> alter database mount;
数据库已装载
RMAN> restore database;
启动 restore 于 15-8月 -07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=160 devtype=DISK
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00002恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF
正将数据文件00003恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\DB_FULL_0IIPED0H_1_1 标记 = TAG20070815T090417
通道 ORA_DISK_1: 恢复完成
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF
正将数据文件00004恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\DB_FULL_0HIPED0H_1_1 标记 = TAG20070815T090417
通道 ORA_DISK_1: 恢复完成
完成 restore 于 15-8月 -07
(至此数据库恢复存储完成,但是注意并非数据库恢复完成。)
检查D:\oracle\product\10.1.0\oradata\orcl目录内容多了各数据库文件。
2007-08-15 11:34 2,867,200 CONTROL01.CTL
2007-08-15 11:34 2,867,200 CONTROL02.CTL
2007-08-15 11:34 2,867,200 CONTROL03.CTL
2007-08-15 11:40 220,209,152 SYSAUX01.DBF
2007-08-15 11:40 461,381,632 SYSTEM01.DBF
2007-08-15 11:40 26,222,592 UNDOTBS01.DBF
2007-08-15 11:40 5,251,072 USERS01.DBF
7 个文件 721,666,048 字节
但是注意,此时并没有应有的连接日志文件?那么难道日志文件并非CONTROLFILE文件创建?的确如此!那么日志文件的创建,在什么时候呢?后面有所交代。

如果此时强行打开数据库则报告需要介质恢复。(正常)
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF'

继续进行RMAN数据库恢复操作
RMAN> recover database;
启动 recover 于 15-8月 -07
使用通道 ORA_DISK_1
正在开始介质的恢复
无法恢复介质
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 08/15/2007 11:40:38
ORA-00283: recovery session canceled due to errors
RMAN-11003: failure during parse/execution of SQL statement: alter database reco
ver if needed
start
ORA-00283: 恢复会话因错误而取消
ORA-00313: 无法打开日志组 6 (用于线程 1) 的成员
ORA-00312: 联机日志 6 线程 1: 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO06.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


出错了?!不应该呀。检查以上过程发现,其实是数据库日志组丢失了。是这样吗?回想以上过程,的确如此,因为在进行了RMAN全备份后,进行了kfzjd用户表t中插入数据的操作,并且此过程,我们假设了所有的文件均丢失,那么意味着日志文件也丢失了。那么是否会丢失数据呢?结果是必然丢失数据,待验证吧。

既然此时日志组不存在,那么只能进行不完全恢复了。

SQL> recover database until cancel;
ORA-00279: 更改 361912 (在 08/15/2007 09:05:30 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1_
14_%U_.ARC
ORA-00280: 更改 361912 (用于线程 1) 在序列 #14 中

指定日志: {=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1
_14_%U_.ARC'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.1.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2007_08_15\O1_MF_1
_14_%U_.ARC'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。

SQL> alter database open resetlogs;
数据库已更改。
SQL> conn kfzjd/kfzjd
已连接。
SQL> select * from t;

ID
----------
1
2
3

SQL>

检查D:\oracle\product\10.1.0\oradata\orcl目录,所有文件均得到恢复。
2007-08-15 12:36 2,867,200 CONTROL01.CTL
2007-08-15 12:36 2,867,200 CONTROL02.CTL
2007-08-15 12:36 2,867,200 CONTROL03.CTL
2007-08-15 12:32 10,486,272 REDO03.LOG
2007-08-15 12:32 10,486,272 REDO04.LOG
2007-08-15 12:32 10,486,272 REDO05.LOG
2007-08-15 12:32 10,486,272 REDO06.LOG
2007-08-15 12:32 220,209,152 SYSAUX01.DBF
2007-08-15 12:32 461,381,632 SYSTEM01.DBF
2007-08-15 12:32 26,222,592 UNDOTBS01.DBF
2007-08-15 12:32 5,251,072 USERS01.DBF
11 个文件 763,611,136 字节
2 个目录 5,616,484,352 可用字节

【注意】自此数据库成功打开。但是,由于在数据库恢复过程中,由于日志文件全部丢失。那么自上一次数据库全备份后的所有数据必然全部丢失。由此看到如果需要数据库完全恢复,日志文件是多么的重要。
4 附加的测试过程
4.1 假设1,日志文件没有丢失
修改以上的测试条件。假设除日志文件外,其他文件均丢失。在完成restore database后,将日志文件复制到原路径,之后进行数据恢复测试。
D:\oracle\product\10.1.0\oradata\orcl>rman nocatalog target /

恢复管理器: 版本10.1.0.2.0 - Production

Copyright (c) 1995, 2004, Oracle. All rights reserved.

已连接到目标数据库 (未启动)

RMAN> startup mount

Oracle 例程已启动
数据库已装载

系统全局区域总计 171966464 字节

Fixed Size 787988 字节
Variable Size 145750508 字节
Database Buffers 25165824 字节
Redo Buffers 262144 字节

RMAN> restore database;

启动 restore 于 15-8月 -07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=160 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00002恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS01.DBF
正将数据文件00003恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\DB_FULL_0IIPED0H_1_1 标记 = TAG20070815T090417
通道 ORA_DISK_1: 恢复完成
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\SYSTEM01.DBF
正将数据文件00004恢复到D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = C:\DB_FULL_0HIPED0H_1_1 标记 = TAG20070815T090417
通道 ORA_DISK_1: 恢复完成
完成 restore 于 15-8月 -07

RMAN> recover database;

启动 recover 于 15-8月 -07
使用通道 ORA_DISK_1
正在开始介质的恢复
完成介质的恢复
完成 recover 于 15-8月 -07
RMAN> alter database open;
数据库已打开
RMAN>

SQL> conn kfzjd/kfzjd
已连接。
SQL> select * from t;

ID
----------
1
2
3
100
200
300
400

已选择7行。
【注意】由于日志文件并没有丢失,那么数据库可进行完全恢复(数据均可恢复,不会丢失)。数据库打开时,不需要进行日志重置。

5 测试总结
• 基于RMAN 备份,除COPY后,必须在数据库MOUNT或者OPEN状态。建议对于数据涉及数据库迁移的工作,在数据库可以停机的情况下,最好采用非OPEN状态的备份。注意此时在备份脚本中,不要加入如“sql 'alter system archive log current';”的对数据库操作的语句。同时数据库必须处于归档模式。
• 建议开启RMAN 自动备份控制文件选项。同时建议做好手工控制文件备份工作。
• 控制文件中记录的信息为一个控制文件包含数据库名称和身份认证、数据库创建的时间戳、表空间名字、数据文件的名称、位置和在线重做日志文件、当前在线重做日志文件序列号、同步信息、回滚段的开始和结束、重做日志归档信息、备份信息等等。所以,在发生类似创建、删除新表空间等动作后,建议生成新的控制文件备份。(是否能够利用旧的控制文件备份,即在发生数据库改变前的控制文件进行数据库恢复,将在其他的测试文档中进行测试)
• 联机日志文件极为重要。如果联机日志文件丢失,则只能进行数据库不完全恢复。例如:上午10:00对数据库进行了一次全备份(包括所有归档日志)。之后数据库继续运行。至15:00发生了数据库故障,所有连接日志文件全部丢失。在次期间,数据库未生成任何归档日志。那么,数据恢复只能恢复到10:00的时间点的所有数据。
• 数据库恢复时,ORACLE不会自动创建所需要的目录。恢复时,应根据相关信息创建所需要的目录(路径)并赋予适合的权限(UNIX系统)。
• 对于利用裸设备存储的数据库,由于裸设备不能由ORACLE创建(相对本例子中的控制文件恢复)。必须利用操作系统命令,事先创建响应的裸设备,并根据信息进行裸设备命令。
• 与此相关的测试,还有很多,有时间再进行相应的备份/恢复测试。例如是否可在不同ORACLE版本间利用备份/恢复进行数据迁移?是否可利用旧的控制文件进行数据库恢复?等等。
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-20 12:36:22

71. 内核参数的应用?

shmmax

  含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定

了最多可以使用的内存数目。

这个设置也不影响操作系统的内核资源。

  设置方法:0.5*物理内存

  例子:Set shmsys:shminfo_shmmax=10485760

  shmmin

  含义:共享内存的最小大小。

  设置方法:一般都设置成为1

  例子:Set shmsys:shminfo_shmmin=1

  shmmni

  含义:系统中共享内存段的最大个数。

  例子:Set shmsys:shminfo_shmmni=100

  shmseg

  含义:每个用户进程可以使用的最多的共享内存段的数目。

  例子:Set shmsys:shminfo_shmseg=20

  semmni

  含义:系统中semaphore identifierer的最大个数。

  设置方法:把这个变量的值设置为这个系统上的所有Oracle的实例的init.ora中的最

大的那个processes的那个值加10

  例子:Set semsys:seminfo_semmni=100

  semmns

  含义:系统中emaphores的最大个数。

  设置方法:这个值可以通过以下方式计算得到:各个Oracle实例的initSID.ora里边的

processes的值的总和(除去最大的Processes参数)+最大的那个Processes×210×Or

acle实例的个数。

  例子:Set semsys:seminfo_semmns=200

  semmsl:

  含义:一个setsemaphore的最大个数。

  设置方法:设置成为10+所有Oracle实例的InitSID.ora中最大的Processes的值。

  例子:Set semsys:seminfo_semmsl=-200

72. 怎样查看哪些用户拥有SYSDBASYSOPER权限?

SQL>conn sys/change_on_install

SQL>select * from V_$PWFILE_USERS;

73. 如何单独备份一个或多个表?

exp 用户/密码 tables=(1,…,2)

74. 如何单独备份一个或多个用户?

exp system/manager owner=(用户1,用户2,…,用户n) file=导出文件

75. 如何对CLOB字段进行全文检索?

SELECT * FROM A WHERE dbms_lob.instr(a.a,'K',1,1)>0;

76. 如何显示当前连接用户?

SHOW USER

77. 如何查看数据文件放置的路径

col file_name format a50

SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_fi

les order by file_id;

78. 如何查看现有回滚段及其状态

SQL> col segment format a30

SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM

DBA_ROLLBACK_SEGS

79. 如何改变一个字段初始定义的Check范围?

SQL> alter table xxx drop constraint constraint_name;

之后再创建新约束:

SQL> alter table xxx add constraint constraint_name check();

80. Oracle常用系统文件有哪些?

通过以下视图显示这些文件信息:v$database,v$datafile,v$logfile v$controlfile v$

parameter;

81. 内连接INNER JOIN

Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no;

82. 如何外连接?

Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+);

Select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no;

83. 如何执行脚本SQL文件?

SQL>@$PATH/filename.sql;

84. 如何快速清空一个大表?

SQL>truncate table table_name;

85. 如何查有多少个数据库实例?

SQL>SELECT * FROM V$INSTANCE;

86. 如何查询数据库有多少表?

SQL>select * from all_tables;

87. 如何测试SQL语句执行所用的时间?

SQL>set timing on ;

SQL>select * from tablename;

88. CHR()的反函数是?

ASCII()

SELECT CHAR(65) FROM DUAL;

SELECT ASCII('A') FROM DUAL;

89. 字符串的连接

SELECT CONCAT(COL1,COL2) FROM TABLE ;

SELECT COL1||COL2 FROM TABLE ;

90. 怎么把select出来的结果导到一个文本文件中?

SQL>SPOOL C:\ABCD.TXT;

SQL>select * from table;

SQL >spool off;

91. 怎样估算SQL执行的I/O数?

SQL>SET AUTOTRACE ON ;

SQL>SELECT * FROM TABLE;

OR

SQL>SELECT * FROM v$filestat ;

可以查看IO数。

92. 如何在sqlplus下改变字段大小?

alter table table_name modify (field_name varchar2(100));

改大行,改小不行(除非都是空的)。

93. 如何查询某天的数据?

select * from table_name where trunc(日期字段)to_date('2003-05-02','yyyy-mm-

dd');

94. sql 语句如何插入全年日期?

create table BSYEAR (d date);

insert into BSYEAR

select to_date('20030101','yyyymmdd')+rownum-1

from all_objects

where rownum <= to_char(to_date('20031231','yyyymmdd'),'ddd');

95. 如果修改表名?

alter table old_table_name rename to new_table_name;

96. 如何取得命令的返回状态值?

sqlcode=0

97. 如何知道用户拥有的权限?

SELECT * FROM dba_sys_privs ;

98. 从网上下载的ORACLE9I与市场上卖的标准版有什么区别?

从功能上说没有区别,只不过oracle公司有明文规定;从网站上下载的oracle产品不得用

商业用途,否则侵权。

99. 怎样判断数据库是运行在归档模式下还是运行在非归档模式下?

进入dbastudio,历程--〉数据库---〉归档查看。

100. sql>startup pfileifile,spfiled有什么区别?

pfile就是Oracle传统的初始化参数文件,文本格式的。

ifile类似于c语言里的include,用于把另一个文件引入

spfile9i里新增的并且是默认的参数文件,二进制格式

startup后应该只可接pfile.
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-19 22:37:27

51. 如何将小表放入keep池中?

alter table xxx storage(buffer_pool keep);

52. 如何检查是否安装了某个patch

check that oraInventory

53. 如何使select语句使查询结果自动生成序号?

select rownum,COL from table;

54. 如何知道数据裤中某个表所在的tablespace

select tablespace_name from user_tables where table_name='TEST';

select * from user_tables中有个字段TABLESPACE_NAME,(oracle;

select * from dba_segments where …;

55. 怎么在sqlplus下修改procedure

select line,trim(text) t from user_source where name =’A’ order by line;

56. 怎样解除PROCEDURE被意外锁定?

alter system kill session ,把那个session给杀掉,不过你要先查出她的session id

or

把该过程重新改个名字就可以了。

57. SQL Reference是个什么东西?

是一本sql的使用手册,包括语法、函数等等,oracle官方网站的文档中心有下载。

58. 如何查看数据库的状态?

unix

ps -ef | grep ora

windows

看服务是否起来;

是否可以连上数据库。

59. 请问如何修改一张表的主键?

alter table aaa

drop constraint aaa_key ;

alter table aaa

add constraint aaa_key primary key(a1,b1) ;

60. 改变数据文件的大小?

ALTER DATABASE .... DATAFILE .... ;

手工改变数据文件的大小,对于原来的 数据文件有没有损害。

61. 怎样查看ORACLE中有哪些程序在运行之中?

查看v$sessions表。

62. 怎么可以看到数据库有多少个tablespace

select * from dba_tablespaces;

63. 如何修改oracle数据库的用户连接数?

修改initSID.ora,将process加大,重启数据库。

64. 如何查出一条记录的最后更新时间?

可以用logminer 察看。

65. 如何在PL/SQL中读写文件?

UTL_FILE包允许用户通过PL/SQL读写操作系统文件。

66. 怎样把“&”放入一条记录中?

insert into a values (translate ('at{&}t','at{}','at'));

67. EXP 如何加QUERY参数?

EXP USER/PASS FILE=A.DMP TABLES(BSEMPMS)

QUERY='"WHERE EMP_NO=\'S09394\'\"

68. 关于oracle8i支持简体和繁体的字符集问题?

ZHS16GBK可以支持。

69. Data Guard是什么软件?

就是Standby的换代产品。

70. 如何创建SPFILE

SQL> connect / as sysdba

SQL> select * from v$version;

SQL> create pfile from spfile;

SQL> CREATE SPFILE FROM PFILE='E:\ora9i\admin\eygle\pfile\init.ora';

文件已创建。

SQL> CREATE SPFILE='E:\ora9i\database\SPFILEEYGLE.ORA' FROM PFILE='E:\ora9i\ad

min\eygle\pfile\init.ora';

文件已创建。

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-19 22:36:24

1. Oracle安装完成后的初始口令?

 internal/oracle

  sys/change_on_install

  system/manager

  scott/tiger

  sysman/oem_temp

2. ORACLE9IAS WEB CACHE的初始默认用户和密码?

administrator/administrator

3. oracle 8.0.5怎么创建数据库

orainst。如果有motif界面,可以用orainst /m

4. oracle 8.1.7怎么创建数据库?

dbassist

5. oracle 9i 怎么创建数据库?

dbca

6. oracle中的裸设备指的是什么?

裸设备就是绕过文件系统直接访问的储存空间。

7. oracle如何区分 64-bit/32bit 版本???

$ sqlplus '/ AS SYSDBA'

SQL*Plus: Release 9.0.1.0.0 - Production on Mon Jul 14 17:01:09 2003

(c) Copyright 2001 Oracle Corporation. All rights reserved.

Connected to:

Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production

With the Partitioning option

JServer Release 9.0.1.0.0 - Production

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production

PL/SQL Release 9.0.1.0.0 - Production

CORE 9.0.1.0.0 Production

TNS for Solaris: Version 9.0.1.0.0 - Production

NLSRTL Version 9.0.1.0.0 - Production

SQL>

8. SVRMGR什么意思?

svrmgrlServer Manager.

9i下没有,已经改为用SQLPLUS了。

sqlplus /nolog

变为归档日志型的。

9. 请问如何分辨某个用户是从哪台机器登陆ORACLE的?

SELECT machine , terminal FROM V$SESSION;

10. 用什么语句查询字段呢?

desc table_name 可以查询表的结构

select field_name,... from ... 可以查询字段的值

select * from all_tables where table_name like '%'

select * from all_tab_columns where table_name='??'

11. 怎样得到触发器、过程、函数的创建脚本?

desc user_source

user_triggers

12. 怎样计算一个表占用的空间的大小?

select owner,table_name,

NUM_ROWS,

BLOCKS*AAA/1024/1024 "Size M",

EMPTY_BLOCKS,

LAST_ANALYZED

from dba_tables

where table_name='XXX';

Here: AAA is the value of db_block_size ;

XXX is the table name you want to check

13. 如何查看最大会话数?

SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%';

SQL>

SQL> show parameter processes

NAME TYPE VALUE

------------------------------------ ------- ------------------------------

aq_tm_processes integer 1

db_writer_processes integer 1

job_queue_processes integer 4

log_archive_max_processes integer 1

processes integer 200

这里为200个用户。

select * from v$license;

其中sessions_highwater纪录曾经到达的最大会话数。

14. 如何查看系统被锁的事务时间?

select * from v$locked_object ;

15. 如何以archivelog的方式运行oracle

init.ora

log_archive_start = true

RESTART DATABASE

16. 怎么获取有哪些用户在使用数据库

select username from v$session;

17. 数据表中的字段最大数是多少?

表或视图中的最大列数为 1000

18. 怎样查得数据库的SID

select name from v$database;

也可以直接查看 init.ora文件。

19. 如何在Oracle服务器上通过SQLPLUS查看本机IP地址

select sys_context('userenv','ip_address') from dual;

如果是登陆本机数据库,只能返回127.0.0.1,呵呵。

20. unix 下怎么调整数据库的时间?

su -root

date -u 08010000

21. ORACLE TABLE中如何抓取MEMO类型栏位为空的资料记录?

select remark from oms_flowrec where trim(' ' from remark) is not null ;

22. 如何用BBB表的资料去更新AAA表的资料(有关联的字段)

UPDATE AAA SET BNS_SNM=(SELECT BNS_SNM FROM BBB WHERE AAA.DPT_NO=BBB.DPT_NO) W

HERE BBB.DPT_NO IS NOT NULL;

23. P4电脑安装方法

SYMCJIT.DLL改为SYSMCJIT.OLD

24. 何查询SERVER是不是OPS

SELECT * FROM V$OPTION;

如果PARALLEL SERVER=TRUE则有OPS能。

25. 何查询每个用户的权限?

SELECT * FROM DBA_SYS_PRIVS;

26. 如何将表移动表空间?

ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME;

27. 如何将索引移动表空间?

ALTER INDEX INDEX_NAME REBUILD TABLESPACE TABLESPACE_NAME;

28. LINUX,UNIX下如何启动DBA STUDIO

OEMAPP DBASTUDIO

29. 查询锁的状况的对象有?

V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS ;

查询锁的表的方法:

SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'R

ow-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', T

O_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)

', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(RE

QUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')',

S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2 FROM V$LOCK L, SYS.DBA_OBJEC

TS O, V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;

30. 如何解锁?

ALTER SYSTEM KILL SESSION ‘SID,SERIR#’;

31. SQLPLUS下如何修改编辑器?

DEFINE _EDITOR="<编辑器的完整路经>" -- 必须加上双引号

来定义新的编辑器,也可以把这个写在$ORACLE_HOME/sqlplus/admin/glogin.sql里面使它

永久有效。

32. ORACLE产生随机函数是?

DBMS_RANDOM.RANDOM

33. LINUX下查询磁盘/CPU竞争状况命令?

Sar -d

sar -r

34. 查询当前用户对像?

SELECT * FROM USER_OBJECTS;

SELECT * FROM DBA_SEGMENTS;

35. 如何获取错误信息?

SELECT * FROM USER_ERRORS;

36. 如何获取链接状况?

SELECT * FROM DBA_DB_LINKS;

37. 查看数据库字符状况?

SELECT * FROM NLS_DATABASE_PARAMETERS;

SELECT * FROM V$NLS_PARAMETERS;

38. 查询表空间信息?

SELECT * FROM DBA_DATA_FILES;

39. ORACLEINTERAL用户要口令?

修改 SQLNET.ORA

SQLNET.AUTHENTICATION_SERVICES=(NTS)

40. 出现JAVA.EXE的解决办法?

一般是将ORACLEORAHOMEXIHTTPSERVER改成手工启动可以的,X89

41. 如何给表、列加注释?

SQL>comment on table is '表注释';

注释已创建。

SQL>comment on column . is '列注释';

注释已创建。

SQL> select * from user_tab_comments where comments is not null;

42. 如何查看各个表空间占用磁盘情况?

SQL> col tablespace format a20

SQL> select

b.file_id 文件ID,

b.tablespace_name 表空间名,

b.bytes 字节数,

(b.bytes-sum(nvl(a.bytes,0))) 已使用,

sum(nvl(a.bytes,0)) 剩余空间,

sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比

from dba_free_space a,dba_data_files b

where a.file_id=b.file_id

group by b.tablespace_name,b.file_id,b.bytes

order by b.file_id

43. 如把ORACLE设置为MTS或专用模式?

#dispatchers="(PROTOCOL=TCP) (SERVICE=SIDXDB)"

加上就是MTS,注释就是专用模式,SID是指你的实例名。

44. 如何才能得知系统当前的SCN

select max(ktuxescnw * power(2, 32) + ktuxescnb) from x$ktuxe;

45. 请问如何在ORACLE中取毫秒?

9i之前不支持,9i开始有timestamp.

9i可以用select systimestamp from dual;

46. 如何在字符串里加回车?

select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual ;

47. 中文是如何排序的?

Oracle9i之前,中文是按照二进制编码进行排序的。

oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT

SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序

SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序

SCHINESE_PINYIN_M 按照拼音排序

48. Oracle8i中对像名可以用中文吗?

可以。

49. 如何改变WINSQL*Plus启动选项?

SQL*PLUS自身的选项设置我们可以在$ORACLE_HOME/sqlplus/admin/glogin.sql中设置。

50. 怎样修改oracel数据库的默认日期?

alter session set nls_date_format='yyyymmddhh24miss';

OR

可以在init.ora中加上一行

nls_date_format='yyyymmddhh24miss'

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-19 22:37:46
(一)内存结构进程结构 Oracle数据库的总体结构如下图:
Oracle体系结构:内存结构和进程结构(图一)

 1:Oracle实例(Instance)        
  在一个服务器中,每一个运行的Oracle数据库都与一个数据库实例相联系,实例是我们
 访问数据库的手段。
  实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识,
 它们两个的值是相同的。数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),
 构成了Oracle的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了Oracle的
 进程结构,内存区域和后台进程合称为一个Oracle实例。
                 

Oracle体系结构:内存结构和进程结构(图二)


  数据库与实例之间是1对1/n的关系,在非并行的数据库系统中每个Oracle数据库与一个
 实例相对应;在并行的数据库系统中,一个数据库会对应多个实例,同一时间用户只与一个
 实例相联系,当某一个实例出现故障时,其他实例自动服务,保证数据库正常运行。在任何
 情况下,每个实例都只可以对应一个数据库。

 2:Oracle 10g动态内存管理
  内存是影响数据库性能的重要因素,Oracle8i使用静态内存管理,Oracle 10g使用动态
 内存管理。所谓静态内存管理,就是在数据库系统中,无论是否有用户连接,也无论并发用
 量大小,只要数据库服务在运行,就会分配固定大小的内存;动态内存管理允许在数据库服
 务运行时对内存的大小进行修改,读取大数据块时使用大内存,小数据块时使用小内存,读
 取标准内存块时使用标准内存设置。
  按照系统对内存使用方法的不同,Oracle数据库的内存可以分为以下几个部分:
  •系统全局区:SGA(System Global Area)
  •程序全局区:PGA(Programe Global Area)
  •排序池:(Sort Area)
  •大池:(Large Pool)
  •Java池:(Java Pool)

 2-1:系统全局区SGA(System Global Area)
   SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信
  息。如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享。
  当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。
  SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
  SGA的有关信息可以通过下面的语句查询,sga_max_size的大小是不可以动态调整的。
   =====================================
   SQL> show parameter sga
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- --------
   lock_sga                             boolean     FALSE
   pre_page_sga                         boolean     FALSE
   sga_max_size                         big integer 164M
   sga_target                           big integer 0
   
   SQL> alter system set sga_max_size=100m;
   alter system set sga_max_size=100m
                 *
   ERROR at line 1:
   ORA-02095: specified initialization parameter cannot be modified
   ======================================  
  

系统全局区按作用不同可以分为:
   •数据缓冲区
   •日志缓冲区
   •共享池

  2-1-1:数据缓冲区(Database Buffer Cache)
    如果每次执行一个操作时,Oracle都必须从磁盘读取所有数据块并在改变它之后
   又必须把每一块写入磁盘,显然效率会非常低。数据缓冲区存放需要经常访问的数据,
   供所有用户使用。修改数据时,首先从数据文件中取出数据,存储在数据缓冲区中,
   修改/插入数据也存储在缓冲区中,commit或DBWR(下面有详细介绍)进程的其他条
   件引发时,数据被写入数据文件。
    数据缓冲区的大小是可以动态调整的,但是不能超过sga_max_size的限制。
   ======================================
   SQL> show parameter db_cache_size
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----------------
   db_cache_size                        big integer 24M
   
   SQL> alter system set db_cache_size=128m;
   alter system set db_cache_size=128m
   *
   ERROR at line 1:
   ORA-02097: parameter cannot be modified because specified value is invalid
   ORA-00384: Insufficient memory to grow cache

   SQL> alter system set db_cache_size=20m;
   System altered.
   
   SQL> show parameter db_cache_size;
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----------------
   db_cache_size                        big integer 20M
   
   #此处我仅增加了1M都不行?
   SQL> alter system set db_cache_size=25m;
   alter system set db_cache_size=25m
   *
   ERROR at line 1:
   ORA-02097: parameter cannot be modified because specified value is invalid
   ORA-00384: Insufficient memory to grow cache

   #修改显示格式,方便查看。
   SQL> column name format a40 wrap
   SQL> column value format a20 wrap
   
   #下面语句可以用来查看内存空间分配情况,注意SGA各区大小总和。
   SQL> select name,value from v$parameter where name like '%size' and value <> '0';
   
   #先将java_pool_size调小,然后再修改db_cache_size
   SQL> show parameter java_pool_size;
   NAME                                 TYPE        VALUE
   ------------------------------------ ----------- -----
   java_pool_size                       big integer 48M

   SQL> alter system set java_pool_size=20m;
   System altered.

   SQL> alter system set java_pool_size=30m;
   System altered.
   #上面说明SGA中各区大小总和不能超过sga_max_size。
   =====================================
    数据缓冲区的大小对数据库的存区速度有直接影响,多用户时尤为明显。有些应
   用对速度要求很高,一般要求数据缓冲区的命中率在90%以上。
    下面给出一种计算数据缓冲区命中率的方法:
    •使用数据字典v$sysstat
    =====================================
    SQL> select name, value from v$sysstat
         2  where name in('session logical reads',
         3  'physical reads',
         4  'physical reads direct',
         5  'physical reads direct (lob)')
    NAME                              VALUE
    ------------------------------- ----------
    session logical reads               895243
    physical reads                       14992
    physical reads direct                   34
    physical reads direct (lob)              0
    ======================================
    命中率=1-(14992-34-0)/895243

    可以让Oracle给出数据缓冲区大小的建议:
    ======================================
    SQL> alter system set db_cache_advice=on;#打开该功能
    System altered.

    SQL> alter system set db_cache_advice=off;#关闭该功能
    System altered.
    ======================================

2-1-2:日志缓冲区(Log Buffer Cache)
    日志缓冲区用来存储数据库的修改信息。该区对数据库性能的影响很小,有关日
   志后面还会有详细的介绍。
    查询日志缓冲区大小:

   SQL> show parameter log_buffer
   NAME            TYPE          VALUE
   ----------     -----------  -------
   log_buffer     integer       262144 

  2-1-3:共享池(Share Pool)
    共享池是对SQL,PL/SQL程序进行语法分析,编译,执行的内存区域。
    它包含三个部分:(都不可单独定义大小,必须通过share pool间接定义)。
    •库缓冲区(Library Cache)包含SQL,PL/SQL语句的分析码,执行计划。
    •数据字典缓冲区(Data Dictionary Cache)表,列定义,权限。
    •用户全局区(Usr Global Area)用户MTS会话信息。
   共享池的大小可以动态修改:
    ======================================
    SQL> show parameter shared_pool_size
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------
    __shared_pool_size                   big integer 80M
    shared_pool_size                     big integer 80M
    
    SQL> alter system set shared_pool_size=78m 
    System altered.
    ======================================
    #上面的__shared_pool_size一行奇怪?

 2-2:程序全局区PGA(Programe Global Area)
   程序全局区是包含单个用户或服务器数据和控制信息的内存区域,它是在用户进程
  接到Oracle并创建一个会话时由Oracle自动分配的,不可共享,主要用于用户在编程存
  储变量和数组。
  

 Oracle体系结构:内存结构和进程结构(图三)


   如上图:
    •Stack Space是用来存储用户会话变量和数组的存储区域;
    •User Session Data是为用户会话使用的附加存储区。
     |--Session Information
     |--Sort Area
     |--Cursor Information   
   注意Session information(用户会话信息)在独占服务器中与在共享服务器中所处
  的内存区域是不同的。


 2-3:排序区,大池,Java
   排序区(Sort Area)为有排序要求的SQL语句提供内存空间。系统使用专用的内存区
  域进行数据排序,这部分空间就是排序区。在Oracle数据库中,用户数据的排序可使用
  两个区域,一个是内存排序区,一个是磁盘临时段,系统优先使用内存排序区进行排序。
  如果内存不够,Orcle自动使用磁盘临时表空间进行排序。为提高数据排序的速度,建议
  尽量使用内存排序区,而不要使用临时段。
   参数sort_area_size用来设置排序区大小。(好象不能动态修改?)

   大池(Large Pool)用于数据库备份工具--恢复管理器(RMAN:Recovery Manager)。
  Large Pool的大小由large_pool_size确定,可用下面语句查询和修改:
  =========================================
  SQL> show parameter large_pool_size
  NAME                  TYPE        VALUE
  -----------------   ----------- -------
  large_pool_size     big integer      8M

  SQL> alter system set large_pool_size=7m;
  System altered. 
  =========================================
   
   Java池主要用于Java语言开发,一般来说不低于20M。其大小由java_pool_size来
  确定,可以动态调整。

 2-4:Oracle自动共享内存管理(Automatic Shared Memory(SGA) Management)
  在Oracle 8i/9i中数据库管理员必须手动调整SGA各区的各个参数取值,每个区要根据
 负荷轻重分别设置,如果设置不当,比如当某个区负荷增大时,没有调整该区内存大小,则
 可能出现ORA-4031:unable to allocate ...bytes of shared memory错误。
  在Oracle 10g中,将参数STATISTICS_LEVEL设置为TYPICAL/ALL,使用SGA_TARGET指
 定SGA区总大小,数据库会根据需要在各个组件之间自动分配内存大小。
 下面是系统自动调整的区域:
  •固定SGA区及其他•共享池•数据缓冲区• Java池•大池。
  注意:如果不设置SGA_TARGET,则自动共享内存管理功能被禁止。
  ==========================================
  SQL> show parameter statistics_level
  NAME                     TYPE        VALUE
  --------------------- ----------- ------------
  statistics_level      string      TYPICAL
  
  SQL> alter system set statistics_level=all;
  System altered.

  #typical和all有什么区别?
  
  SQL> alter system set statistics_level=typical;
  System altered.

  SQL> show parameter sga_target
  NAME            TYPE        VALUE
  ------------- ----------- ----------
  sga_target    big integer 0

  SQL> alter system set sga_target=170m;
  alter system set sga_target=170m
  *
  ERROR at line 1:
  ORA-02097: parameter cannot be modified because specified value is invalid
  ORA-00823: Specified value of sga_target greater than sga_max_size

  SQL> alter system set sga_target=20m;
  System altered.

  #不过后来又发现sga_target的值变成了140M? 下面是语句执行情况。
  SQL> show parameter sga_target
  NAME          TYPE        VALUE
  ------------- ----------- -------
  sga_target    big integer 140M
  
  SQL> alter system set sga_target=0;
  System altered.

  SQL> show parameter sga_target
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------
  sga_target                           big integer 0

  #改为20M
  SQL> alter system set sga_target=20m;
  System altered.

  #显示的是140M
  SQL> show parameter sga_target
  NAME                                 TYPE        VALUE
  ------------------------------------ ----------- ------
  sga_target                           big integer 140M

  #不可缩减?
  SQL> alter system set sga_target=130m;
  alter system set sga_target=130m
  *
  ERROR at line 1:
  ORA-02097: parameter cannot be modified because specified value is invalid
  ORA-00827: could not shrink sga_target to specified value
  
  #不可增加
  SQL> alter system set sga_target=141m;
  alter system set sga_target=141m
  *
  ERROR at line 1:
  ORA-02097: parameter cannot be modified because specified value is invalid
  ORA-00823: Specified value of sga_target greater than sga_max_size
  
3:Oracle实例的进程结构(Process Structure)
 Oracle包含三类进程:
 •用户进程(User Process)
 •服务器进程(Server Process)
 •后台进程(Background Process)
 
 3-1:用户进程和服务器进程
  当数据库用户请求连接到Oracle的服务时启动用户进程(比如启动SQLPlus时)。
  •用户进程首先必须建立一个连接。
  •用户不能直接与Oracle服务器,必须通过服务器进程交互。
  •服务器进程是用户进程与服务器交互的桥梁,它可以与Oracle Server直接交互。
  •服务器进程可以有共享和独占两种形式。
               
Oracle体系结构:内存结构和进程结构(图四) 

3-2:后台进程(Backgroung Process)
  数据库的物理结构与内存结构之间的交互要通过后台进程来完成。数据库的后台进程包
 含两类,一类是必须的,一类是可选的:
  •Mandatory background processes

   |--DBWn(Database Writer):数据写入
   |--PMON(Process Moniter):进程监控
   |--LGWR(Log Writer):日志写入
   |--SMON(System Moniter):系统监控
   |--RECO(Recovery):恢复
   |--CKPT(Chekpoint):检查点
  •Optional background processes
   |--ARCn(Archiver):归档
   |--LCKn(Lock):锁
   |--Dnnn(Dispatcher):调度
   |--......
  可以用下面的语句查看正在运行的后台进程:
  =========================================
  SQL> select * from v$bgprocess where paddr<>'00';
  PADDR      PSERIAL# NAME  DESCRIPTION                          
  -------- ---------- ----- -------------------------------
  6B0ED064          1 PMON  process cleanup                      
  6B0ED4E4          1 MMAN  Memory Manager                       
  6B0ED964          1 DBW0  db writer process 0                  
  6B0EDDE4          1 LGWR  Redo etc.                            
  6B0EE264          1 CKPT  checkpoint                           
  6B0EE6E4          1 SMON  System Monitor Process               
  6B0EEB64          1 RECO  distributed recovery                 
  6B0EEFE4          1 CJQ0  Job Queue Coordinator                
  6B0F01E4          1 QMNC  AQ Coordinator                       
  6B0F0664          1 MMON  Manageability Monitor Process        
  6B0F0AE4          1 MMNL  Manageability Monitor Process 2
  ========================================

 3-2-1:DBWR(Database Writer,数据写入进程)
  将数据缓冲区的数据写入数据文件,是负责数据缓冲区管理的一个后台进程。
  当数据缓冲区中的一数据被修改后,就标记为dirty,DBWR进程将数据缓冲区中“脏”
 数据写入数据文件,保持数据缓冲区的”干净“。由于数据缓冲区的数据被用户修改并占
 用,空闲数据缓冲区会不断减少,当用户进程要从磁盘读取数据块到数据缓冲区却无法找
 到足够的空闲数据缓冲区时,DBWR将数据缓冲区内容写入磁盘,使用户进程总可以得到足
 够的空闲数据缓冲区。
  DBWR的作用:
  •管理数据缓冲区,以便用户进程总能够找到足够的空闲缓冲区。
  •将所有修改后的缓冲区数据写入数据文件。
  •使用LRU(最近最少使用)算法保持缓冲区数据是最近经常使用的。
  •通过延迟写来优化磁盘I/0读写。
  

Oracle体系结构:内存结构和进程结构(图五)

点击查看大图

 3-2-2:LGWR(Log Writer,日志写入进程)
  将日志数据从日志缓冲区写入磁盘日志文件组。数据库在运行时,如果对数据库进行修
 改则产生日志信息,日志信息首先产生于日志缓冲区。当日志达到一定数量时,由LGWR将
 将日志数据写入到日志文件组,再经过日志切换,由归档进程(ARCH)将日志数据写入归
 档进程(前提是数据库运行在归档模式下)。数据库遵循写日志优先原则,即在写数据之前
 先写日志。
    

Oracle体系结构:内存结构和进程结构(图六)

点击查看大图

简单介绍
  •ARCH(Archiver,归档进程)
  Oracle数据库有两种运行模式,归档(ARCHIVELOG),非归档(NOARCHIVELOG)模式。
 以非归档模式运行时日志在切换时被直接覆盖,不产生归档日志,这是数据库默认的运行模
 式。数据库运行在归档模式时,在日志切换之前,由ARCH进程将日志信息写入磁盘,也就是
 自动备份在线日志。
  Oracle数据库的Redo文件数量是有限的,所以Oracle以循环的方式向它们中写入。它顺
 序写满每一个Redo文件,当达到最后一个时,再循环回去开始填写第一个Redo文件。如果为
 了能恢复数据库而想保存日志文件,那么在它们被重新使用之前需要对其进行备份,归档进
 程管理此工作。

  •CKPT(Check Point,检查点进程)
  运行CKPT时,系统对全部数据文件及控制文件文件头的同步信号进行修改,以保证数据
 库的同步。检查点出现在以下情况:
  |--在每个日志切换时产生。
  |--上一个检验点之后又经过了指定时间。
  |--从上一个检验点之后,当预定义数量的日志块被写入磁盘之后。
  |--数据库关闭。
  |--DBA强制产生。
  |--当表空间设置为OFFLINE时。

  •SMON(System Moniter,系统监控进程)
  SMON在实例启动时执行实例恢复,并负责清理不再使用的临时段。

  •PMON(Process Monitor,进程监控)
  PMON在用户进程出现故障时进行恢复,负责清理内存区域和释放该进程所使用的资源。

  •RECO(Recovery,恢复进程)
  RECO用于分布式数据库维持在分布式环境中的数据的一致性。

  •LCKn(Lock,锁进程)
  在并行服务器中用于多个实例间的封锁。

  •Dnnn(Dispatcher,调度进程)
  Dnnn存在于多线程服务器体系结构中,负责将用户进程连接到服务器进程,再把结果返
  回给用户进程。

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-19 13:43:25

要了解Oracle体系结构必须先了解两个基本的概念: 数据库和实例.

一 数据库

数据库(database)是一个数据集合.

无论数据库是采用关系结构还是面向对象结构, oracle数据库都将

其数据存放在数据文件中. 在其内部, 数据库结构数据对文件的逻辑

映射, 使不同的数据分开存储, 这些逻辑划分称为表空间.

表空间和文件介绍:

1: 表空间

表空间(tablespace)是数据库的逻辑划分, 每个数据库至少有一个表空间,叫做系统表空间(system 表空间). 一个表空间只能属于一个数据库。

每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件称为数据文件.

表空间的特性:

(1)控制数据库数据磁盘分配

(2)限制用户在表空间中可以使用的磁盘空间大小

(3)表空间具有 online, offline, readonly, readwrite属性

修改表空间的属性:

SQL> alter tablespace 表空间名称 属性;
查询表空间状态:
SQL> select tablespace_name, status from dba_tablespaces;

注意: system, undo, temp表空间不能设为offline属性.

(4)完成部分数据库的备份与恢复

(5)表空间通过数据文件来扩大, 表空间的大小等于构成该表空间的所以数据文件的大小只和.

查询表空间与数据文件对应关系:

SQL> select tablespace_name, bytes, file_name from dba_data_files;

基于表空间的几个操作:

(1)查询用户缺省表空间:
SQL> select username, default_tablespace from dba_users;
(2)查询表与存储该表的表空间:
SQL> select table_name, tablespace_name from user_tables;
(3)修改用户缺省表空间:
SQL> alter user username default tablespace tablespace_name;
(4)将数据从一个表空间移动到另一个表空间:
SQL> alter table table_name move tablespace tablespace_name;

2.数据文件

每个表空间由同一个磁盘上的一个或多个文件组成, 这些文件叫做数据文件(datafile),数据文件只能属于一个表空间. 数据文件创建后可以改变大小. 创建新的表空间需要创建新的数据文件. 数据文件一旦加入到表空间中, 就不能从表空间中移走, 也不能与其他表空间发生联系。

数据库必须的三类文件是 data file, control file, redolog file. 其他文件 prameter file,password file, archived log files并不是数据库必须的, 他们只是辅助数据库的。

查看数据库的物理文件组成:

(1)查看数据文件: SQL> select * from v$datafile;
(2)查看控制文件: SQL> select * from v$controlfile;
(3)查看日志文件: SQL> select * from v$logfile;

二: 实例

通俗的讲实例就是操作Oracle数据库的一种手段.

数据库实例也称作服务器, 是用来访问数据库文件集的存储结构及后台进程的集合.

一个数据库可以被多个实例访问(称为真正的应用群集选项).

决定实例的大小及组成的各种参数或者存储在名称init.ora的初始化文件中, 或者隐藏

在数据库内部的服务器参数文件中. 通过spfile引用该文件, spfile存储在spfile.ora文件中.

实例启动时读取初始化文件, 数据库系统管理员可以修改该文件, 对初始化文件的修改只有在下次启动时才有效。

Instance分为两部分:

1: memory structure(内存结构)

memory structure分为两部分:SGA(System Global Area)区是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。

包括:

.share pool
.datafase buffer cache
.redo log buffer
.other structures

PGA(Program Global Area)区包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收。

2: background process(后台进程)

包括:

.PMON 负责在一个Oracle 进程失败时清理资源

.SMON 检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复

.DBWR 负责将更改的数据从数据库缓冲区高速缓存写入数据文件

.LGWR 将重做日志缓冲区中的更改写入在线重做日志文件

.CKPT 负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-19 13:22:56
Oracle的SQL调优是一个复杂的主题,甚至是需要整本书来介绍OracleSQL调优的细微差别。不过有一些基本的规则是每个OracleDBA都需要跟从的,这些规则可以改善他们系统的性能。SQL调优的目标是简单的:

  .消除不必要的大表全表搜索:不必要的全表搜索导致大量不必要的I/O,从而拖慢整个数据库的性能。调优专家首先会根据查询返回的行数目来评价SQL。在一个有序的表中,如果查询返回少于40%的行,或者在一个无序的表中,返回少于7%的行,那么这个查询都可以调整为使用一个索引来代替全表搜索。对于不必要的全表搜索来说,最常见的调优方法是增加索引。可以在表中加入标准的B树索引,也可以加入bitmap和基于函数的索引。要决定是否消除一个全表搜索,你可以仔细检查索引搜索的I/O开销和全表搜索的开销,它们的开销和数据块的读取和可能的并行执行有关,并将两者作对比。在一些情况下,一些不必要的全表搜索的消除可以通过强制使用一个index来达到,只需要在SQL语句中加入一个索引的提示就可以了。

  .在全表搜索是一个最快的访问方法时,将小表的全表搜索放到缓存中,调优专家应该确保有一个专门的数据缓冲用作行缓冲。在Oracle7中,你可以使用altertablexxxcache语句,在Oracle8或以上,小表可以被强制为放到KEEP池中缓冲。

  .确保最优的索引使用:对于改善查询的速度,这是特别重要的。有时Oracle可以选择多个索引来进行查询,调优专家必须检查每个索引并且确保Oracle使用正确的索引。它还包括bitmap和基于函数的索引的使用。

  .确保最优的JOIN操作:有些查询使用NESTEDLOOPjoin快一些,有些则是HASHjoin快一些,另外一些则是sort-mergejoin更快。

  这些规则看来简单,不过它们占SQL调优任务的100%,并且它们也无需完全懂得OracleSQL的内部运作。以下我们来简单概览以下OracleSQL的优化。

  我们首先简要查看Oracle的排序,并且看一看排序操作是如何影响性能的。

  调整Oracle的排序操作

  排序是SQL语法中一个小的方面,但很重要,在Oracle的调整中,它常常被忽略。当使用createindex、ORDERBY或者GROUPBY的语句时,Oracle数据库将会自动执行排序的操作。通常,在以下的情况下Oracle会进行排序的操作:

  使用Orderby的SQL语句

  使用Groupby的SQL语句

  在创建索引的时候

  进行tablejoin时,由于现有索引的不足而导致SQL优化器调用MERGESORT

  当与Oracle建立起一个session时,在内存中就会为该session分配一个私有的排序区域。如果该连接是一个专用的连接(dedicatedconnection),那么就会根据init.ora中sort_area_size参数的大小在内存中分配一个ProgramGlobalArea(PGA)。如果连接是通过多线程服务器建立的,那么排序的空间就在large_pool中分配。不幸的是,对于所有的session,用做排序的内存量都必须是一样的,我们不能为需要更大排序的操作分配额外的排序区域。因此,设计者必须作出一个平衡,在分配足够的排序区域以避免发生大的排序任务时出现磁盘排序(disksorts)的同时,对于那些并不需要进行很大排序的任务,就会出现一些浪费。当然,当排序的空间需求超出了sort_area_size的大小时,这时将会在TEMP表空间中分页进行磁盘排序。磁盘排序要比内存排序大概慢14,000倍。

  上面我们已经提到,私有排序区域的大小是有init.ora中的sort_area_size参数决定的。每个排序所占用的大小由init.ora中的sort_area_retained_size参数决定。当排序不能在分配的空间中完成时,就会使用磁盘排序的方式,即在Oracle实例中的临时表空间中进行。

  磁盘排序的开销是很大的,有几个方面的原因。首先,和内存排序相比较,它们特别慢;而且磁盘排序会消耗临时表空间中的资源。Oracle还必须分配缓冲池块来保持临时表空间中的块。无论什么时候,内存排序都比磁盘排序好,磁盘排序将会令任务变慢,并且会影响Oracle实例的当前任务的执行。还有,过多的磁盘排序将会令freebufferwaits的值变高,从而令其它任务的数据块由缓冲中移走。

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-19 12:45:00
Oracle中的归档日志(Archive Log)

     在Oracle中,数据一般是存放在数据文件中,不过数据库与Oracle最大的区别之一就是数据库可以在数据出错的时候进行恢复。 这个也就是我们常见的Oracle中的重做日志(REDO FILE)的功能了。在重做日志分成2部分,一个是在线重做日志文件,另外一个就是归档日志文件。

     这里不详细说明在线重做日志,而是说一下归档日志(Archive Log)。在线重做日志大小毕竟是有限的,当都写满了的时候,就面临着2个选择,第一个就是把以前在线重做日志从头擦除开始继续写,第二种就是把以前的在线重做日志先进行备份,然后对被备份的日志擦除开始写新的在线Redo File。这种备份的在线重做日志就是归档日志。而数据库如果采用这种生成归档日志的模式的话,就是归档日志模式(ARCHIVELOG模式),反之如果不生成归档日志,就是非归档日志模式(NOARCHIVELOG模式)。

     有了归档日志有什么好处了。比如在这个月1号的时候备份了一次数据,然后过了10天,这10天生成了成百上千个在线重做日志,突然发现其中有一个数据磁盘出问题了,不能用了,那我该如何是好呢。

     如果没有采用归档日志,那么实际上磁盘中只会有几个最新的在线重做日志。那么我只能要不然把出问题的数据磁盘上所占据的表空间都删除掉。但是如果是SYSTEM表空间所涉及的磁盘出错,就没办法这么做了,只能用第二种方法。那第二种方法就是把1号备份的数据拿出来恢复。那么1号到10号之间的10天的数据都丢了,如果是关键系统,比如证券金融什么的系统,就要让你赔钱赔死掉。

     但是如果有了归档日志,那么你这10天的重做日志都会存放起来,那么DBA首先把1号的备份数据恢复,然后再拿这10天的REDO日志来进行一次数据操作重放,那么就可以完全恢复最新的数据库,不会有什么后果了。

     在软件开发的时候,由于测试服务器的配置有限,特别是磁盘空间有限,所以有可能要限制REDO文件的大小,有可能就把系统设置为NOARCHIVELOG模式了。但是在实际的生产运行环境下,基本上一定要使用ARCHIVELOG模式,否则万一出了问题,真是哭都来不及了。

     有人可能会怕归档日志造成性能损失。其实这个完全是杞人忧天的,归档日志只是做一个备份,其实也就是多耗一些磁盘空间而已。在当前的软件系统中,硬盘的存储容量成本已经属于低到可以忽略的地步,而最重要的是数据库的安全。DBA的任务本来就是确保数据的安全,如果连安全都保证不了,那点微乎其微的性能提高又有什么用呢。

归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档日志中.当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库.


日志操作模式:ARCHIVELOG NOARCHIVELOG


1,改变日志操作模式:

检查当前日志操作模式

SELECT log_mode from v$database;

关闭数据库,然后装载数据库

SHUTDOWN IMMEDIATE

STARTUP MOUNT

改变日志操作模式,然后打开数据库

ALTER DATABASE ARCHIVELOG;

ALTER DATABASE OPEN;


2,执行手工归档

从oracle database 10g开始,当将日志操作模式转变未ARCHIVELOG模式时,oracle会自动启动ARCH进程.如果要使用手工归档.那么在改变日志操作模式时必须使用命令ALTER DATABASE ARCHIVELOG MANUAL.

需要注意,使用手工归档方式,数据库管理员必须手工执行归档命令.如果没有执行手工归档命令,日志组的原有内容将不能被覆盖.ALTER DATABASE ARCHIVELOG MANUAL 命令是为了与先前的版本兼容而保留的,.将来的oracle版本会淘汰该命令,使用手工归档方式是,数据库管理员可以执行以下命令归档重做日志:

SLTER SYSTEM ARCHIVELOG ALL;


3,配置归档进程

初始化参数LOG_ARCHIVE_MAX_PROCESSES用于指定例程初始启动的最大归档进程个数,当将数据库转变为ARCHIVELOG模式时,默认情况下oracle会自动启动两个归档进程.通过改变初始化参数LOG_ARCHIVE_MAX_PROCESS的值,可以动态地增加或降低归档进程的个数:

ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=3;



配置归档位置和文件格式

当数据库处于ARCHIVELOG模式时,如果进行日志切换,后台进程将自动生成归档日志,归档日志的默认位置为%oracle_home%rdbms,在oracle database 10g中,归档日志的默认文件格式为ARC%S_%R.%T.为了改变归档日志的位置和名称格式,必须改变相应的初始化参数,


1,初始化参数LOG_ARCHIVE_FORMAT用于指定归档日志的文件名格式,设置该初始化参数时,可以指定以下匹配符:

%s: 日志序列号:

%S: 日志序列号(带有前导0)

%t: 重做线程编号.

%T: 重做线程编号(带有前导0)

%a: 活动ID号

%d: 数据库ID号

%r RESETLOGS的ID值.

从10g开始,配置归档日志文件格式时,必须带有%s,%t和%r匹配符,配置了归档文件格式后,必须重启数据库.


2,使用LOG_ARCHIVE_DEST配置归档位置

如果不使用备用数据库,只需要将归档日志存放到本地目录.配置本地归档位置可以使用初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST,其中,第一个参数用于设置第一个归档位置,第二个参数用于指定第二个归档位置.

ALTER SYSTEM SET log_archive_dest=’d:demoarchive1’;

ALTER SYSTEM SET log_archive_duplex_dest=’d:demoarchive2’;


3,使用LOG_ARCHIVE_DEST_n配置多个归档位置.

初始化参数LOG_ARCHIVE_DEST_n用于指定多个归档位置,该参数最多可以指定10个归档位置.通过使用初始化参数LOG_ARCHIVE_DEST_n,不仅可以配置本地归档位置,还可以配置远程归档位置.

如果既要在主节点上生成归档日志,又要将归档日志传递到备用节点,那么必须使用参数LOG_ARCHIVE_DEST_n.该参数与LOG_ARCHIVE_DEST具有如下区别;

初始化参数LOG_ARCHIVE_DEST_n可以配置本地归档位置和远程归档位置,而初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST只能配置本地归档位置.

初始化参数LOG_ARCHIVE_DEST_n可以配置多达10个归档位置,而初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST最多只能配置两个归档位置.

初始化参数LOG_ARCHIVE_DEST_n 不能与初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST同时使用.

因为初始化参数LOG_ARCHIVE_DEST_n不能与初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST同时使用,所以必须禁用初始化参数LOG_ARCHVE_DEST和LOG_ARCHIVE_DUPLEX_DEST.当使用初始化参数LOG_ARCHIVE_DEST_n配置本地归档位置时,需要指定LOCALTION选项.当配置远程归档位置时,需要指定SERVICE选项.


示例如下:

ALTER SYSTEM SET log_archive_duplex_dest=’’;

ALTER SYSTEM SET log_archive_dest=’’;

ALTER SYSTEM SET log_archive_dest_1=’location=d:demoarchive1’;

ALTER SYSTEM SET log_archive_dest_2=’location=d:demoarchive2’;

ALTER SYSTEM SET log_archive_dest_3=’location=d:demoarchive3’;

ALTER SYSTEM SET log_archive_dest_4=’service=standby’;


配置远程归档位置时,SERVICE选项需要指定远程数据库的网络服务名(在tnsnames.ora文件中配置)


4,使用LOG_ARCHIVE_DEST_n选项

使用初始化参数LOG_ARCHIVE_DEST_n配置归档位置时,可以在归档位置上指定OPTIONAL或MANDATORY选项.指定MANDATORY选项时,可以设置REOPEN属性.

OPTIONAL:该选项是默认选项.使用该选项时,无论归档是否成功,都可以覆盖重做日志.

MANDATORY:强制归档.使用该选项时,只有在归档成功之后,重做日志才能被覆盖.

REOPEN:该属性用于指定重新归档的时间间隔,默认值为300秒,必须跟在MANDATORY后.

例:

Alter system set log_archive_dest_1=’location=d:demoarchive1 mandatory’;

Alter system set log_archive_dest_2=’location=d:demoarchive2 mandatory reopen=500’;

Alter system set log_archive_dest_3=’location=d:demoarchive3 optional’;


5,控制本地归档成功的最小个数.

使用初始化参数LOG_ARCHIVE_MIN_SUCCEED_DEST控制本地归档的最小成功个数

Alter system set log_archive_min_succeed_dest=2;


6,使用初始化参数LOG_ARCHIVE_DEST_STATE_n控制归档位置的可用性.设置该参数为ENABLE(默认值),表示会激活相应的归档位置;设置该参数为DEFER,表示禁用相应归档位置.当归档日志所在磁盘损坏或填满时,DBA需要暂时禁用该归档位置.

Alter system set log_archive_dest_state_3=defer;(禁用)

Alter system set log_archive_dest_state_3=enable;(启用)


显示归档日志信息

1,使用ARCHIVE LOG LIST命令可以显示日志操作模式,归档位置,自动归档机器要归档的日志序列号等信息.


2显示日志操作模式

SELECT name,log_mode FROM v$database;


3,显示归档日志信息.

Col name format a40

Select name, swquence#, first_change# FROM v$archived_log;

Name用于表示归档日志文件名,sequence#用于表示归档日志对应的日志序列号,firs_change#用于标识归档日志的起始SCN值.


4执行介质恢复时,需要使用归档日志文件,此四必须准确定位归档日志的存放位置.通过查询动态性能视图v$archive_dest可以取得归档日志所在目录.

SELECT destination FROM v$archive dest;


5,显示日志历史信息

SELECT * FROM v$loghist;

THREAD#用于标识重做线程号,SEQUNCE#用于标识日志序列号,FIRST_CHANGE#用于标识日志序列号对应的起始SCN值,FIRST_TIME用于标识起始SCN的发生时间.SWICTH_CHANGE#用于标识日志切换的SCN值.


6.显示归档进程信息.

进行日志切换时,ARCH进程会自动将重做日志内容复制到归档日志中,为了加快归档速度,应该启用多个ARCH进程.通过查询动态性能视图V$ARCHIVE_PROCESSES可以显示所有归档进程的信息!

SELECT * FROM v$archive_processes;

Porcess用于标识ARCH进程的编号,status用于标识ARCH进程的状态(ACTIVE:活动,STOPPED:未启动),log_sequence用于标识正在进行归档的日志序列号,state用于标识ARCH进程的工作状态

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-18 18:14:36
我们知道Oracle里联机日志文件(Online redo logfile)循环记录了数据库所有的事务(transaction)。
  它的大小、个数和存储位置对数据库性能和恢复也是有重要影响的。本文总结一下关于redo logfile的一些
  内容。
  
  一、redo logfile的简单介绍
  它一般有大小相同的一组文件构成。我们可以查看数据库视图v$logfile知道它的个数和存储位置。
  
  SVRMGRL> select * from v$logfile;
  
  查看数据库视图v$log知道它当前的状态。
  
  SVRMGRL> select * from v$log;
  
  一个时间只有一组logfile group是工作状态(current), redo logfile满了后会自动切换到下一个
  logfile group, 如果数据库是归档方式同时写到归档日志文件。这些文件不能用常规的文本编辑器查看,
  它以特定的格式存放, 只有数据库或者专门的软件可以看懂它。
  
  redo logfile的最大数目是在创建数据库时指明的。如果你想知道当前数据库redo logfile的最大数值
  是多少,重新生成控制文件, 就可以知道。
  
  SVRMGRL>alter database backup controlfile to trace;
  
  这条语句会在$ORACLE_BASE/admin/dbname/udump/路径下生成当前时间的一个*.trc文件, 也就是数据库
  的控制文件, 用文本编辑器, 即可看到数据库创建时用的一些参数, 包括redo logfile的最大数(maxlogfiles)。
  
  二、 redo logfile的大小和位置对数据库性能的影响
  如果用ORACLE的安装向导创建的典型数据库, 它的redo logfile大小为500K, 这基本上是不能满足典型的
  OLTP应用的, 在数据库日志文件(alert_orasid.log)里会记录着频繁的log switch。ORACLE推荐log switch
  时间最好在15--30分钟之间, 所以redo logfile的大小由数据库DML操作数据的大小决定其最佳大小。
  
  redo logfile最好有多个存储位置, 多组成员, 使数据库恢复时有更多的选择。
  
  典型的OLTP应用,redo logfile大小可以为16M。当然繁忙的数据库, 例如当今的门户网站, 这个值可以达
  到100M以上.
  
  如果你发现当前数据库日志文件里log switch的时间偏大或者偏小,不要紧。ORACLE提供了在数据库联机状
  态来改变redo logfile大小的方法。
  
  三、在联机状态改变redo logfile大小的方法
  假如原来有3个小的redo log file, 下面是UNIX环境下的一个例子:
  
  第一步: 往数据库添加三个大的redo logfile
  
  SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 4
  ('/opt/oradata/app/redo04.log',
  '/ora_bak/oradata2/redolog/redo04.log') size 16M reuse;
  
  SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 5
  ('/opt/oradata/app/redo05.log',
  '/ora_bak/oradata2/redolog/redo05.log') size 16M reuse;
  
  SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 6
  ('/opt/oradata/app/redo06.log',
  '/ora_bak/oradata2/redolog/redo06.log') size 16M reuse;
  
  第二步: 手工地做log switch, 使新建的redo logfile起作用.
  
  SVRMGRL>alter system switch logfile;
  
  此操作可以执行一到几次, 使旧的redo logfile成invalid状态.
  
  
  第三步: 删除原来旧的redo logfile.
  
  SVRMGRL>alter database drop logfile group 1;
  
  SVRMGRL>alter database drop logfile group 2;
  
  SVRMGRL>alter database drop logfile group 3;
  
  
  四、跟redo logfile有关的其它数据库参数
  1、log_buffer
  
  log_buffer是ORACLE SGA的一部分, 所有DML命令修改的数据块先放在log_buffer里, 如果满了或者
  到 了check_point时候通过lgwr后台进程写到redo logfile里去。它不能设得太大,这样在意
  外发生时会丢失很多改变过的数据。它最好不要大于512K或者128K*CPU个数。
  
  我们可以用下面的SQL语句检测log_buffer使用情况:
  
  SVRMGRL> select rbar.name,rbar.value,re.name,re.value,(rbar.value*100)/re.value||'%' "radio"
  from v$sysstat rbar,v$sysstat re
  where rbar.name='redo buffer allocation retries'
  and re.name='redo entries';
  
  这个比率小于1%才好,否则增加log_buffer的大小
  
  2、log_checkpoint_interval
  
  Oracle8.1 版本后log_checkpoint_interval指的是两次checkpoint之间操作系统数据块的个数。
  
  checkpoint时Oracle把内存里修改过的数据块用DBWR写到物理文件,用LGWR写到日志和控制文件。
  
  一般UNIX操作系统的数据块为 512 bytes。
  
  从性能优化来说 log_checkpoint_interval = redo logfile size bytes / 512 bytes
  
  3、log_checkpoint_timeout
  
  Oracle8.1 版本后log_checkpoint_timeout指的是两次checkpoint之间时间秒数。
  Oracle建议不用这个参数来控制,因为事务(transaction)大小不是按时间等量分布的。
  log_checkpoint_timeout = 0
  log_checkpoint_timeout = 900
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-18 18:06:03
解释Undo Size = Undo_retention * UPS

    最近oracle8i频频在exp的时候发生ora-1555,才深感oracle9i的undo 表空间自动管理模式好处;

    oracle9i使用参数undo_retention 设置undo 的保留时间;

SQL> show parameters undo

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                      string      AUTO

undo_retention                       integer     10800

undo_suppress_errors                 boolean     FALSE

undo_tablespace                      string      UNDOTBS1

    通过在undo segment header中引入extent commit time,记录每个区间涉及到的事务最近一次commit的时间。

  Extent Map

  -----------------------------------------------------------------

   0x0080005a  length: 7

   0x00800061  length: 8

   0x00800989  length: 128

   0x00800a89  length: 128


 Retention Table

  -----------------------------------------------------------

 Extent Number:0  Commit Time: 1113807175

 Extent Number:1  Commit Time: 1113809908

 Extent Number:2  Commit Time: 1113965650

 Extent Number:3  Commit Time: 1114067240

    如何设置undo表空间的大小才能保证undo_retention   ?使用公式

          Undo Size = Undo_retention * UPS

UPS是undo block per second, 我们可以通过V$UNDOSTAT. UNDOBLKS获得       .

SQL> select avg(undoblks)/(10*60) UPS from v$undostat;

 UPS

-------------

   0.03

    则undo_retention=10800,至少需要  10800*0.03=324个数据块。

查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-18 18:03:56
照字面的意思,UNDO就是撤销,REDO就是重做,意义十分容易分明,但是看ORACLE的文档,却常常把它们弄混。
我们在理解ORACLE的时候,常常会因为他价格的昂贵,迷失了自己,事实上,ORACLE这种软件,用时间长了,对于我们来讲,就是一款数据库产品,作为商用关系数据库,他与其他数据库软件,在很多道理上是一样的。
UNDO,撤销,当我们进行数据库操作的时候,比如,更新一个表,ORACLE会将我们要进行修改的地方镜像到UNDO段中。如果事务不提交,执行ROLLBACK命令,之前我们对数据库进行的修改会变回原样,其依据就是回退段中的内容。再有就是依照撤销段,进行数据库实例的恢复。UNDO机制还可以保证读取一致性。
REDO,重做,我们对数据库所做的修改,如同历史纪录般的记录下来,我们对数据库进行恢复的时候,我们从某一基点,按照从此基点以后的历史纪录,重现原来对数据库进行修改的历程。从而达到恢复数据库的目的。
相信各种不同的商用数据库软件,都会有不同的机制来完成类似的功能,因为关系数据库的构架都是基本相同的
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-18 18:02:15

数据块有坏块时,不能访问坏块上的数据,如果没有备份,那么,坏块上的数据就会丢失掉。

>>>>>>

SQL> select count(*) from t1;

  COUNT(*)
----------
       238

已用时间:  00: 00: 00.00

>>>>>>>Table T1总共有238行数据

>>>以dba身份登陆数据库
SQL> conn / as sysdba
已连接。

>>>关闭数据库
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

>>>用UltraEdit编辑数据文件TS_TEST01.DBF,随便改几个地方然后保存,模拟数据块坏掉

>>>启动数据库
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> conn scott/tiger
已连接。

>>>查询数据的时候报错
SQL> select count(*) from t1;
select count(*) from t1
                     *
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号28,块号20)
ORA-01110: 数据文件 28: 'E:ORACLEORADATAORABD02TS_TEST01.DBF'


已用时间:  00: 00: 00.01
SQL> conn / as sysdba
已连接。
SQL> SELECT tablespace_name, segment_type, owner, segment_name
  2  FROM dba_extents
  3  WHERE file_id =28
  4  and 20 between block_id AND block_id + blocks - 1
  5  /

TABLESPACE_NAME SEGMENT_TYPE    OWNER      SEGMENT_NAME
--------------- --------------- ---------- ---------------------------------------------
TS_TEST01       TABLE           SCOTT      T1

>>>这时候的数据表示不可以被exp出来的:

C:Documents and SettingsAdministrator>exp scott/tiger file=c: .dmp tables=t1

Export: Release 9.2.0.1.0 - Production on 星期六 11月 27 12:07:19 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
服务器使用 AL32UTF8 字符集 (可能的字符集转换)

即将导出指定的表通过常规路径 ...
. . 正在导出表                              T1
EXP-00056: 遇到 ORACLE 错误 1578
ORA-01578: ORACLE 数据块损坏(文件号28,块号20)
ORA-01110: 数据文件 28: 'E:ORACLEORADATAORABD02TS_TEST01.DBF'
导出成功终止,但出现警告。

C:Documents and SettingsAdministrator>

>>>这时可以通过设置内部事件,使exp跳过这些损坏的block
SQL> ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;

系统已更改。

已用时间:  00: 00: 00.00
SQL> host

>>>exp 出数据

SQL>
SQL> conn scott/tiger
已连接。

>>> drop掉旧的Table
SQL> drop table t1;

表已丢弃。

已用时间:  00: 00: 01.03
SQL> host

>>>imp 数据

SQL> conn scott/tiger
已连接。

>>>查询数据,可以看到有损失了54行数据
SQL> select count(*) from t1;

  COUNT(*)
----------
       184

已用时间:  00: 00: 00.00
SQL>

查看原文┆评论(1)┆类别(默认类别)┆发表于 2007-9-18 15:33:32
可能:
1、安装源目录太长
2、安装源目录包含有汉字
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-18 10:01:26
 数据库系统运行一段时间后有很多参数需要调整,有些参数可在$ORACLE_HOME/dbs/initXXX.ora文件中调整,而有些参数必须要在ORACLE的控制文件中调整。如ORACLE的缺省数据文件个数为30个,在系统需要扩表空间而数据文件个数不够时就需要进行调整。
一种方法是将所有数据全倒出来,重建库,再将数据倒进出。这种方法较麻烦。
二种方法是只重建控制文件,因为数据文件个数的限制参数存放在控制文件中。
以下是一种较好的重建控制文件的方法:
1. 备份数据库中的数据,以防不测。
2. svrmgrl
3. svrmgrl>connect internal
4. svrmgrl>alter database backup controlfile to trace; 备份控制文件
5. 在/home/oracle//admin/ora7/udump下可找到最新生成的TRACE文件,假设为ora_15269.trc,此文件就包含了当前控制文件的参数及生成语法。
6. 提取ora_15269.trc中有关控制文件生成的语句另存为creatctl.sql。
7. creatctl.sql的内容为:
  STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA7" NORESETLOGS NOARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 50
    MAXINSTANCES 8
    MAXLOGHISTORY 800
LOGFILE
GROUP 1 '/dev/vg00/roraredoa1'  SIZE 500K,
GROUP 2 '/dev/vg00/roraredoa2'  SIZE 500K,
  GROUP 3 '/dev/vg00/roraredoa3'  SIZE 500K
DATAFILE
  '/dev/vg00/rorasys',
  '/dev/vg00/rorarbs',
  '/dev/vg00/roratemp',
  '/dev/vg00/roratools',
  '/dev/vg00/rorauser'

8. 可按自己的需要编辑creatctl.sql中的参数,如maxdatafiles、maxinstances等。
9. svrmgrl
10. svrmgrl>connect internal
11. svrmgrl>shutdown immediate
12. svrmgrl>@creatctl.sql
13. svrmgrl>alter database open;
此时数据库已按新的参数运行。 更多文章 更多内容请看Oracle 10g基础应用专题,或进入讨论组讨论。
查看原文┆评论(0)┆类别(默认类别)┆发表于 2007-9-13 22:22:11

摘要:任何数据库在长期使用过程中,都会存在一定的安全隐患。对于数据库管理员来说不能仅寄希望于计算机操作系统的安全运行,而是要建立一整套的数据库备份与恢复机制。当任何人为的或是自然的灾难一旦出现,而导致数据库崩溃、物理介质损坏等,就可以及时恢复系统中