Oracle 闪回特性(FLASHBACK DATABASE)
本文来源于:gerainly 的《Oracle 闪回特性(FLASHBACK DATABASE) 》
-=====================================
-- Oracle 闪回特性(FLASHBACK DATABASE)
--=====================================
闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回、表级别闪回、事务级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询。闪回恢复将修改数据,闪回点之后的数据将全部丢失。而闪回查询则可以查询数据被DML的不同版本,也可以在此基础之上确定是否进行恢复等。本文主要描述flashback database的使用。
一、flashback database特性
flashback data1base闪回到过去的某一时刻 闪回点之后的工作全部丢失 使用resetlogs创建新的场景并打开数据库(一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点) 常用的场景:truncate table、多表发生意外错误等
使用闪回日志来实现数据库闪回,闪回点之后的数据将丢失
二、flashback database的组成
闪回缓冲区:当启用flashback database,则sga中会开辟一块新区域作为闪回缓冲区,大小由系统分配 启用新的rvwr进程:rvwr进程将闪回缓冲区的内容写入到闪回日志中,注意闪回日志不同于联机重做日志,闪回日志在联机重做日志基础之 上生成,是完整数据块映像的日志。联机日志则是变化的日志。闪回日志不能复用,也不能归档。闪回日志使用循环写方式。
三、flashback database的配置
flashback database要求数据库必须处于归档模式,且闪回之后必须使用resetlogs打开数据库
1 -- a.查看数据库的归档模式及闪回是否启用 2 3 SQL> select log_mode,open_mode,flashback_on from v$database; 4 5 LOG_MODE OPEN_MODE FLASHBACK_ON 6 7 ------------ ---------- ------------------ 8 9 ARCHIVELOG READ WRITE NO --FLASHBACK_ON为NO,则表示闪回特性尚未启用 10 11 -- b.查看及设置闪回目录、闪回目录空间大小等 12 13 --下面查看恢复目录及恢复目路分配的大小 14 15 --可以使用alter system set db_recovery_file_dest 来设置新路径 16 17 --可以使用alter system set db_recovery_file_dest_size来设定新的大小 18 19 SQL> show parameter db_recovery 20 21 NAME TYPE VALUE 22 23 ------------------------------------ ----------- ------------------------------ 24 25 db_recovery_file_dest string /u01/app/oracle/flash_recovery 26 27 _area 28 29 db_recovery_file_dest_size big integer 2G 30 31 -- c.设置闪回保留目标生存期 32 33 SQL> show parameter db_flashback --缺省为分钟,即小时 34 35 NAME TYPE VALUE 36 37 ------------------------------------ ----------- ------------------------------ 38 39 db_flashback_retention_target integer 1440 40 41 SQL> alter system set db_flashback_retention_target=30; --设定保留时间为半小时 42 43 -- d.在mount状态下来启用flashback,如在open状态下则出现下列错误提示 44 45 SQL> alter database flashback on; 46 47 alter database flashback on 48 49 * 50 51 ERROR at line 1: 52 53 ORA-38759: Database must be mounted by only one instance and not open. 54 55 --一致性关闭数据库后,在mount状态下设置flashback 56 57 SQL>startup mount exclusive; 58 59 SQL> select status from v$instance; 60 61 STATUS 62 63 ------------ 64 65 MOUNTED 66 67 SQL> alter database flashback on; --开启闪回数据库功能 68 69 SQL> ho ps -ef | grep rvw --可以看到新增了后台进程rvwr 70 71 oracle 3563 1 0 12:12 ? 00:00:00 ora_rvwr_orcl 72 73 --下面查看闪回区分配的大小为大约M,闪回分钟以内的数据则需要M左右的空间 74 75 --注意列oldest_flashback_time说明了允许返回的最早的时间点 76 77 SQL> select oldest_flashback_scn old_flhbck_scn,oldest_flashback_time old_flhbck_tim, 78 79 2 retention_target rete_trgt,flashback_size/1024/1024 flhbck_siz, 80 81 3 estimated_flashback_size/1024/1024 est_flhbck_size 82 83 4 from v$flashback_database_log; 84 85 OLD_FLHBCK_SCN OLD_FLHBC RETE_TRGT FLHBCK_SIZ EST_FLHBCK_SIZE 86 87 -------------- --------- ---------- ---------- --------------- 88 89 915137 24-OCT-10 30 7.8125 11.2519531 90 91 SQL> select * from v$flashback_database_stat; --查看闪回 92 93 BEGIN_TIM END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE 94 95 --------- --------- -------------- ---------- ---------- ------------------------ 96 97 24-OCT-10 24-OCT-10 7905280 86802432 96329728 0 98 99 SQL> select * from v$sgastat where name like 'flashback%'; --查看sga中分配的闪回空间大小 100 101 POOL NAME BYTES 102 103 ------------ -------------------------- ---------- 104 105 shared pool flashback generation buff 3981204 106 107 shared pool flashback_marker_cache_si 9196 108 109 SQL> ho ls -hlt $ORACLE_BASE/flash_recovery_area/ORCL/flashback --查看生成的闪回日志 110 111 total 7.9M 112 113 -rw-r----- 1 oracle oinstall 7.9M Oct 24 12:37 o1_mf_6d7dkogw_.flb 114
四、使用flashback database闪回数据库
步骤(前提归档日志可用)
关闭数据库
启动数据库到mount状态(exclusive模式)
闪回至某个时间点,SCN或log sequence number
使用resetlogs打开数据库
1.使用sqlplus实现闪回
1 可以接受一个时间标记或一个系统改变号实参 2 3 sqlplus几种常用的闪回数据库方法 4 5 FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] SCN <system_change_number> --基于SCN闪回 6 7 FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回 8 9 FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回 10 11 如下面的示例: 12 13 SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss'); 14 15 SQL> flashback database to scn 918987; 16 17 SQL> flashback database ro restore point b1_load; 18 19 a.基于时间戳闪回 20 21 SQL> select count(1) from usr1.tb1; --查询用户usr1下表tb1中的记录数 22 23 COUNT(1) 24 25 ---------- 26 27 404944 28 29 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual; --获得系统当前的时间 30 31 TM 32 33 ------------------- 34 35 2010-10-24 13:04:30 36 37 SQL> drop user usr1 cascade; --删除帐户usr1,同时帐户usr1下的所有对象将被删除 38 39 SQL> conn scott/tiger; --使用scott 帐户登陆 40 41 SQL> create table tb_emp as select * from emp; --新创建表tb_emp 42 43 SQL> shutdown immediate; --关系系统 44 45 SQL> startup mount ; --重新到mount状态 46 47 SQL> flashback database to timestamp --实施闪回 48 49 2 to_timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss') ; 50 51 SQL> alter database open resetlogs; 52 53 SQL> select count(1) from usr1.tb1; --帐户usr1及其对象tb1被成功闪回 54 55 COUNT(1) 56 57 ---------- 58 59 404944 60 61 SQL> select count(1) from scott.tb_emp; --闪回成功后,在闪回点之后修改的数据全部丢失 62 63 select count(1) from scott.tb_emp 64 65 * 66 67 ERROR at line 1: 68 69 ORA-00942: table or view does not exist 70 71 b.基于SCN号闪回 72 73 SQL> select current_scn from v$database; --获得当前的SCN号 74 75 CURRENT_SCN 76 77 ----------- 78 79 918987 80 81 SQL> drop table usr1.tb1; --删除用户usr1下的表tb1 82 83 SQL> alter system checkpoint; --手动执行检查点 84 85 SQL> select file#,checkpoint_change# from v$datafile; 86 87 FILE# CHECKPOINT_CHANGE# 88 89 ---------- ------------------ 90 91 5 921478 92 93 SQL> shutdown abort; 94 95 SQL> startup mount; 96 97 SQL> flashback database to scn 918987; 98 99 SQL> select count(1) from usr1.tb1; 100 101 COUNT(1) 102 103 ---------- 104 105 404944 106 107 c.基于时点闪回 108 109 SQL> create table t(id int,col varchar2(20)); --创建表t 110 111 SQL> insert into t values(1,'ABC'); 112 113 SQL> insert into t values(2,'DEF'); 114 115 SQL> commit; 116 117 SQL> create restore point bef_damage; --创建闪回点 118 119 SQL> insert into t values(3,'GHI'); 120 121 SQL> select ora_rowscn,id,col from t; --查看表t的记录 122 123 ORA_ROWSCN ID COL 124 125 ---------- ---------- -------------------- 126 127 1874406 1 ABC 128 129 1874406 2 DEF 130 131 1874406 3 GHI 132 133 SQL> shutdown immediate; 134 135 SQL> startup mount exclusive; 136 137 SQL> flashback database to restore point bef_damage; --实施时点闪回 138 139 SQL> alter database open resetlogs; 140 141 SQL> select * from t; --闪回成功后,闪回点之后的数据丢失 142 143 ID COL 144 145 ---------- -------------------- 146 147 1 ABC 148 149 2 DEF 150
2.使用RMAN进行flashback database
1 使用RMAN进行闪回数据库的几种常用办法 2 3 RMAN> flashback database to scn=918987; 4 5 RMAN> flashback database to sequence=85 thread=1; 6 7 SQL> create table scott.tb_emp as select * from scott.emp; 8 9 SQL> select count(1) from scott.tb_emp; 10 11 COUNT(1) 12 13 ---------- 14 15 14 16 17 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual; 18 19 TM 20 21 ------------------- 22 23 2010-10-24 13:59:38 24 25 SQL> drop table scott.tb_emp; 26 27 SQL> shutdown abort; 28 29 SQL> startup mount; 30 31 RMAN> flashback database 32 33 2> to time="to_date('2010-10-24 13:59:00','yyyy-mm-dd hh24:mi:ss')"; 34 35 SQL> select count(1) from scott.tb_emp; 36 37 COUNT(1) 38 39 ---------- 40 41 14 42 43 查询视图:v$recovery_file_dest将显示闪回区的使用情况 44 45 SQL> select name,space_limit/1024/1024 sp_limt 46 47 2 ,space_used/1024/1024 sp_usd,space_reclaimable/1024/1024 sp_recl, 48 49 3 number_of_files num_fils from v$recovery_file_dest; 50 51 NAME SP_LIMT SP_USD SP_RECL NUM_FILS 52 53 --------------------------------------------- ---------- ---------- ---------- ---------- 54 55 /u01/app/oracle/flash_recovery_area 2048 472.070313 380.671875 18 56 57 可以将某些表空间排除在闪回之外 58 59 SQL> alter tablespace users flashback off; 60 61 SQL> select name,flashback_on from v$tablespace where ts#=4; 62 63 NAME FLA 64 65 --------------- --- 66 67 USERS NO 68 69 如果需要对上述表空间启用闪回功能,则需要在mount模式下对该表空间进行开启该功能。 70
五、总结
闪回策略是针对Oracle撤销功能的增强,为快速恢复数据库提供了更多的便利。数据库的闪回恢复的速度要快于RMAN以及基于用户管理的备份与恢复,其主要原因是因为数据库闪回使用的是闪回日志,而闪回日志中保存的是数据块的完整镜像。其次闪回能够恢复的程度取决于闪回空间的大小以及闪回的保留策略,闪回空间大小会被循环使用,而闪回的保留策略则决定了闪回日志保留的时间长度。总之,合理的平衡恢复速度与可用空间依赖于具体服务要求
【Flashback】启用Flashback Database闪回数据库功能
本文来源:《【Flashback】启用Flashback Database闪回数据库功能》
1 --若想顺利的使用闪回数据库功能,需要先将数据库置于闪回数据库状态。此文记录开启闪回数据库功能的步骤,注意调整过程需要重启数据库并确保数据库处于归档模式。 2 3 --1.确认数据库是否开启Flashback Database功能 4 --若未开启,则继续,若已经开启,请从此小文儿飘过~~ 5 SYS@ora11g> select flashback_on from v$database; 6 7 FLASHBACK_ON 8 ------------------ 9 NO 10 11 --2.修改db_recovery_file_dest、db_recovery_file_dest_size及db_flashback_retention_target三个参数内容 12 ---1)db_recovery_file_dest、db_recovery_file_dest_size两个参数用于指定闪回日志存放位置及最大大小。可以根据具体环境做相应调整。 13 SYS@ora11g> show parameter recovery_file 14 15 NAME TYPE VALUE 16 -------------------------- ----------- ------------------------------ 17 db_recovery_file_dest string /u01/app/oracle/flash_recovery 18 _area 19 db_recovery_file_dest_size big integer 3852M 20 21 ---2)确认db_flashback_retention_target参数设置的内容。 22 --db_flashback_retention_target参数限定了闪回可恢复的时间范围,默认是1440分钟,一天的时间。 23 SYS@ora11g> show parameter db_flashback_retention_target 24 25 NAME TYPE VALUE 26 ------------------------------------ ----------- --------- 27 db_flashback_retention_target integer 1440 28 29 --3.重启数据库到mount状态 30 SYS@ora11g> shutdown immediate; 31 Database closed. 32 Database dismounted. 33 ORACLE instance shut down. 34 SYS@ora11g> startup mount; 35 ORACLE instance started. 36 37 Total System Global Area 313860096 bytes 38 Fixed Size 1336232 bytes 39 Variable Size 239078488 bytes 40 Database Buffers 67108864 bytes 41 Redo Buffers 6336512 bytes 42 Database mounted. 43 44 --4.在mount状态下启用Flashback功能 45 SYS@ora11g> alter database flashback on; 46 alter database flashback on 47 * 48 ERROR at line 1: 49 ORA-38706: Cannot turn on FLASHBACK DATABASE logging. 50 ORA-38707: Media recovery is not enabled. 51 52 ---此处报错是由于数据库未运行在归档模式,启用闪回数据库功能的前提是数据库运行在归档模式下。因此需要先调整数据库为归档模式。 53 54 SYS@ora11g> alter database archivelog; 55 56 Database altered. 57 58 SYS@ora11g> alter database flashback on; 59 60 Database altered. 61 62 --闪回数据库开启成功。 63 64 --5.打开数据库 65 SYS@ora11g> alter database open; 66 67 Database altered. 68 69 --6.验证Flashback功能已经成功开启 70 SYS@ora11g> select flashback_on from v$database; 71 72 FLASHBACK_ON 73 ------------------ 74 YES 75 76 --7.小结 77 -- 启用闪回数据库的过程相对简单,注意先保证数据库运行在归档模式下。这是使用闪回数据库的前提,需要熟练掌握。 78 79 Good luck. 80 81 secooler 82 12.04.06 83 84 -- The End --
Oracle数据库的闪回恢复区及多归档路径的设置
Oracle9i开始提供闪回查询,以便能在需要的时候查到过去某个时刻的一致性数据,这是通过Undo实现的。这个功能有很大的限制,就是相关事务的undo不能被覆盖,否则就无力回天了。oracle10g大大的增强了闪回查询的功能,并且提供了将整个数据库回退到过去某个时刻的能力,这是通过引入一种新的flashback log实现的。flashback log有点类似redo log,只不过redo log将数据库往前滚,flashback log则将数据库往后滚。为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery area)的新特性,可以将所有恢复相关的文件,比如flashback log,archive log,backup set等,放到这个区域集中管理。
1.设置闪回恢复区
闪回恢复区主要通过3个初始化参数来设置和管理
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟,也就是一天。当然,实际上可回退的时间还决定于闪回恢复区的大小,因为里面保存了回退所需要的 flash log。
所以这个参数要和db_recovery_file_dest_size配合修改。
2.启动flashback database
设置了闪回恢复区后,可以启动闪回数据库功能。
首先,数据库必须已经处于归档模式
那么如何设置归档呢?很简单的步骤
1 --1.关闭数据库 2 SQL> shutdown immediate; 3 --2.启动数据库为mount模式 4 SQL> startup mount 5 --3.显示和修改归档模式 6 SQL> archive log list 7 SQL> alter database archivelog; 8 SQL> alter database open 9 --4.设置归档日志的格式 10 SQL>alter system set log_archive_format='ARC%s%t%r.log' scope=spfile; 11 --5.设置归档日志的存放路径 12 SQL>alter system set log_archive_dest='+data/arcl' scope=spfile; 13 SQL>shutdown immediate 14 SQL>startup 15 --6.强制切换归档日至 16 SQL>alter system switch logfile; 17 --7.取消归档 18 SQL>alter database noarchivelog; 19 --参数 20 --1.格式参数 21 --%s 日志序列号 22 --%S 日志序列号(带前导的0) 23 --%t 重做线程编号 24 --%a 活动的ID号 25 --%d 数据库ID号 26 --%r RESELOGS的iD值 27 28 SQL> archive log list; 29 Database log mode Archive Mode 30 Automatic archival Enabled 31 Archive destination USE_DB_RECOVERY_FILE_DEST 32 Oldest online log sequence 156 33 Next log sequence to archive 158 34 Current log sequence 158 35 36 --然后,启动数据库到mount状态 37 SQL> shutdown immediate; 38 Database closed. 39 Database dismounted. 40 ORACLE instance shut down. 41 42 SQL> startup mount 43 ORACLE instance started. 44 45 Total System Global Area 285212672 bytes 46 Fixed Size 1218992 bytes 47 Variable Size 75499088 bytes 48 Database Buffers 205520896 bytes 49 Redo Buffers 2973696 bytes 50 Database mounted. 51 52 SQL>alter database flashback on; 53 --数据库已更改。 54 SQL> alter database open; 55 --数据库已更改。 56 SQL>selectFLASHBACK_ONfrom v$database; 57 FLASHBACK_ON 58 ------------------------------------ 59 YES 60
3.取消闪回恢复区
1 --将db_recovery_file_dest参数设置为空,可以停用闪回恢复区。如果已经启用flashback database,则不能取消闪回恢复区。 2 SQL> alter system set db_recovery_file_dest=''; 3 alter system set db_recovery_file_dest='' 4 * 5 第 1 行出现错误: 6 ORA-02097: 无法修改参数, 因为指定的值无效 7 ORA-38775: 无法禁用快速恢复区 - 闪回数据库已启用 8 9 --所以,必须先禁用flashback database,才能取消闪回恢复区 10 11 SQL> shutdown immediate; 12 数据库已经关闭。 13 已经卸载数据库。 14 ORACLE 例程已经关闭。 15 16 SQL> startup mount; 17 ORACLE 例程已经启动。 18 Total System Global Area 142606336 bytes 19 Fixed Size 1247732 bytes 20 Variable Size 83887628 bytes 21 Database Buffers 50331648 bytes 22 Redo Buffers 7139328 bytes 23 数据库装载完毕。 24 25 SQL>alter database flashback off; 26 数据库已更改。 27 28 SQL> alter database open; 29 数据库已更改。 30 31 SQL> alter system set db_recovery_file_dest=''; 32 系统已更改。 33
4.闪回恢复区的内容
1 --所有和恢复相关的文件都可以存放到闪回恢复区 2 SQL>select file_type from v$flash_recovery_area_usage; 3 FILE_TYPE 4 ------------------------ 5 CONTROLFILE 6 ONLINELOG 7 ARCHIVELOG 8 BACKUPPIECE 9 IMAGECOPY 10 FLASHBACKLOG 11 已选择6行。 12 13 --上面的视图中可以看出,包括controfile,online redo logfile,archive logfile,rman backup iece,rman image copy, flashback log等,都可以利用闪回恢复区来存放、管理。 14
5.闪回恢复区的一些限制
1 ---如果设置了闪回恢复区,则log_archive_dest和log_archive_duplex_dest将不可用 2 3 alter system set log_archive_dest='e:/' 4 * 5 第 1 行出现错误: 6 ORA-02097: 无法修改参数, 因为指定的值无效 7 ORA-16018: 无法将 LOG_ARCHIVE_DEST 与 LOG_ARCHIVE_DEST_n 或 8 DB_RECOVERY_FILE_DEST 一起使用 9 10 SQL> alter system set log_archive_duplex_dest='e:/'; 11 alter system set log_archive_duplex_dest='e:/' 12 * 13 第 1 行出现错误: 14 ORA-02097: 无法修改参数, 因为指定的值无效 15 ORA-16018: 无法将 LOG_ARCHIVE_DUPLEX_DEST 与 LOG_ARCHIVE_DEST_n 或 16 DB_RECOVERY_FILE_DEST 一起使用 17 18 设置闪回恢复区后,如果没有设置过log_archive_dest_n参数,则归档日志默认是保存到该区域的 19 20 SQL> archive log list 21 --数据库日志模式 存档模式 22 --自动存档 启用 23 --存档终点 USE_DB_RECOVERY_FILE_DEST 24 --最早的联机日志序列 245 25 --下一个存档日志序列 247 26 --当前日志序列 247 27 28 --实际上,oracle是通过隐式的设置log_archive_dest_10='location= USE_DB_RECOVERY_FILE_DEST'来实现的。所以,如果之后你修改过log_archive_dest_n将归档日志保存到其他位置,也可以修改该参数继续使用闪回恢复区。 29 30 --多个数据库的闪回恢复区可以指定到同一个位置,但是db_name不能一样,或者db_unique_name不一样。 31 32 --RAC的闪回恢复区必须位于共享磁盘上,能被所有实例访问。 33
6.闪回恢复区的空间管理
1 2 --当闪回恢复区空间不足(使用超过85%)时,alert中会有警告记录 3 Tue Dec 19 10:45:41 2006 4 Errors in file e:/oracle/ora10/admin/ning/bdump/ning_rvwr_31968.trc: 5 ORA-19815: 警告: db_recovery_file_dest_size 字节 (共 52428800 字节) 已使用 87.29%, 尚有665216 字节可用。 6 7 --同时,oracle在alert中还会给出解决该问题的建议 8 Tue Dec 19 10:45:41 2006 9 ************************************************************************ 10 You have following choices to free up space from flash recovery area: 11 1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard, 12 then consider changing RMAN ARCHIVELOG DELETION POLICY. 13 2. Back up files to tertiary device such as tape using RMAN 14 BACKUP RECOVERY AREA command. 15 3. Add disk space and increase db_recovery_file_dest_size parameter to 16 reflect the new space. 17 4. Delete unnecessary files using RMAN DELETE command. If an operating 18 system command was used to delete files, then use RMAN CROSSCHECK and 19 DELETE EXPIRED commands. 20 ************************************************************************ 21 22 --如果闪回恢复区空间耗尽,且归档路径设置到了闪回恢复区中,则由于日志无法归档,数据库会hang住。 23 24 Tue Dec 19 10:45:57 2006 25 Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc: 26 --ORA-19815: 警告: db_recovery_file_dest_size 字节 (共 52428800 字节) 已使用 100.00%, 尚有 0 字节可用。 27 28 Tue Dec 19 10:45:57 2006 29 Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc: 30 ORA-19809: 超出了恢复文件数的限制 31 ORA-19804: 无法回收 6836224 字节磁盘空间 (从 52428800 限制中) 32 33 ARC0: Error 19809 Creating archive log file to 34 'E:/ORACLE/ORA10/FLASH_RECOVERY_AREA/NING/ARCHIVELOG/2006_12_19/O1_MF_1_250_U_.ARC' 35 ARC0: Failed to archive thread 1 sequence 250 (19809) 36 ARCH: Archival stopped, error occurred. Will continue retrying 37 Tue Dec 19 10:45:58 2006 38 Errors in file e:/oracle/ora10/admin/ning/bdump/ning_arc0_32372.trc: 39 ORA-16038: 日志 1 序列号 250 无法归档 40 ORA-19809: 超出了恢复文件数的限制 41 ORA-00312: 联机日志 1 线程 1: 'E:/ORACLE/ORA10/ORADATA/NING/REDO01.LOG' 42 43 --所以,对于生产库,如果将归档放到闪回恢复区中,需要密切关注闪回恢复区的空间使用情况,否则一旦闪回恢复区的空间用尽,将导致数据库无法提供服务。 44 45 --通过查询视图v$flash_recovery_area_usage,可以获得当前闪回恢复区的空间使用情况,并且可以知道是哪些文件占中了空间,据此可以做出相应的处理,或者加大闪回恢复区,或者移走相应的文件。 46 PHP code:-------------------------------------------------------------------------------- 47 SQL> select * from v$flash_recovery_area_usage; 48 FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES 49 ------------------------ ------------------ ------------------------- --------------- 50 CONTROLFILE 0 0 0 51 ONLINELOG 0 0 0 52 ARCHIVELOG 91 0 16 53 BACKUPPIECE 0 0 0 54 IMAGECOPY 0 0 0 55 FLASHBACKLOG 8 4 2 56 已选择6行。 57 ---------------------------------------------------------------------------------- 58 --另外,v$recovery_file_dest视图也提供了闪回恢复区的概要信息。 59 SQL> select * from v$recovery_file_dest; 60 NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES 61 ----------------------------------- ----------- ---------- ----------------- --------------- 62 Eracleora10flash_recovery_area 104857600 101835264 0 17 63 64 65 66 --数据库现在用的是spfile参数,并且归档格式为: 67 SQL> show parameter log_archive 68 NAME TYPE value 69 ------------------------------------ ----------- ------------------------------ 70 log_archive_dest string /opt/oracle/product/9.2.0/dbs/arch 71 --现在想修改归档路径为多路径模式,也就是要使用log_archive_dest_n,那么该怎么操作? 72 --解释如下: 73 --1:首先查看oracle的版本,oracle标准版不支持standby database,如果设了log_archive_dest_n,就意味着有可能使用standby database,所以前提是你的数据库要是企业版本。 74 IXDBA.NET社区论坛 75 --2: oracle中log_archive_dest_n和log_archive_dest不能共存,也就是只能使用其一, 76 --如果同时使用,会报错如下信息: 77 ---ORA-16019: cannot use LOG_ARCHIVE_DEST_1 with LOG_ARCHIVE_DEST or LOG_ARCHIVE_DUPLEX_DEST 78 -- log_archive_dest_n可以设置10个归档路径,也就是n可以是1-10,接下来要作的是去除db现在的log_archive_dest参数设置,可以执行如下命令清除: 79 SQL> alter system reset log_archive_dest scope=spfile sid='*'; 80 --也可以这样操作: 81 SQL> alter system set log_archive_dest='' scope=spfile; 82 --然后重新启动数据库。 83 --3: 执行命令: 84 SQL> alter system set log_archive_dest_n="location=F:/oracle/product/10.2.0/db_1 85 /database/arch" scope=spfile; 86 n可以是1-10,最多可以设置10个归档路径。 87 -- 4:重新启动数据库,使设置生效。 88 --查看设置信息: 89 SQL> show parameter log_archive 90 NAME TYPE value 91 ------------------------------------ ----------- ------------------------------ 92 log_archive_config string 93 log_archive_dest string 94 log_archive_dest_1 string location=F:/oracle/product/10. 95 2.0/db_1/database/archive 96 97 log_archive_dest_10 string 98 log_archive_dest_2 string location=F:/oracle/product/10. 99 2.0/db_1/database/arch 100 看到设置已经生效了。 101 102 103 104 --〖环境(Environment)〗 105 106 --OS:LINUX 107 108 --DB:ORACLE10G 109 110 〖现象(Symptom)〗 111 112 -----以普通用户登录数据库时,报告错误:ORA-00257 : archiver error. Connect internal only, until freed。 113 --用ALTER SYSTEM ARCHIVE LOG CURRENT执行手工归档也不行。 114 115 --〖原理(Cause) 〗 116 117 Step01:用ps -ef|grep oracle查看归档进程,归档进程运行正常。 118 119 oracle 524 1 1 15:50:30 0:14 ora_arc0_nbo 120 121 oracle 518 1 0 15:50:23 0:01 ora_arc1_nbo 122 123 。。。 124 125 --Step02:查看归档路径。 126 127 SQL> show parameter LOG_ARCHIVE_DEST_ 128 129 NAME TYPE VALUE 130 131 ------------------------------------ ----------- ---------------- 132 133 log_archive_dest_1 string 134 135 log_archive_dest_10 string 136 137 log_archive_dest_2 string 138 139 log_archive_dest_3 string 140 141 log_archive_dest_4 string 142 143 log_archive_dest_5 string 144 145 log_archive_dest_6 string 146 147 log_archive_dest_7 string 148 149 log_archive_dest_8 string 150 151 log_archive_dest_9 string 152 153 log_archive_dest_state_1 string enable 154 155 。。。 156 157 ---从数据可以看出,归档路径LOG_ARCHIVE_DEST_n为空,没有设置归档路径。如果没有设置归档路径的时候,ORALCE默认会把归档文件(archived logs)放到闪回区(Flash Recovery Area)。 158 159 --Step03:得到闪回区(flash recovery area)的路径。 160 161 SQL> show parameter DB_RECOVERY_FILE_DEST 162 163 NAME TYPE VALUE 164 165 ------------------------------------ ----------- -------------------------- 166 167 db_recovery_file_dest string /wxxrdata/flash_recovery_area 168 169 --闪回区(flash recovery area)的路径是/wxxrdata/flash_recovery_area。 170 171 --Step04:查看闪回区(Flash Recovery Area)的使用情况。 172 173 SQL> SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE; 174 175 FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES 176 177 ------------ ------------------ ------------------------- --------------- 178 179 CONTROLFILE 0 0 0 180 181 ONLINELOG 0 0 0 182 183 ARCHIVELOG 74.05 0 31 184 185 BACKUPPIECE 10.95 0 8 186 187 IMAGECOPY 15 0 66 188 189 FLASHBACKLOG 0 0 0 190 191 ---从查询结果可以看出,在闪回区中,归档日志(ARCHIVELOG)占用74.05%的空间,备份(BACKUPPIECE)占用10.95%的空间,文件拷贝(IMAGECOPY)占用15%的空间。闪回区中已经没有空余的磁盘空间。 192 193 --〖方法(Action) 〗 194 195 --u 方法一:重新指定归档路径。 196 197 --●如果使用SPFILE启动数据库,则可以动态改变归档路径。 198 199 SQL>alter system set log_archive_dest_1='location=/proddata' scope=both; 200 201 ---这里指定一个新的归档路径。 202 203 ---●如果使用PFILE启动数据库,则需要执行下面的过程。 204 205 Step01:进入初始化参数文件所在的目录 206 207 $ cd $ORACLE_HOME/dbs(这是默认路径) 208 209 本例中的PFILE是initnbo.ora。 210 211 ---Step02:编辑初始化参数文件 212 213 $vi initnbo.ora 214 215 --添加参数: 216 217 log_archive_dest_1='location=/proddata'。 218 219 ---这里指定一个新的归档路径,这个路径要有足够的空间。 220 221 --Step03:关闭数据库 222 223 SQL> shutdown immediate; 224 225 Database closed. 226 227 Database dismounted. 228 229 ORACLE instance shut down. 230 231 ---Step04:重启数据库。 232 233 SQL> startup PFILE='/oracle/app/oracle/product/10.1.0/Db_1/dbs/initnbo.ora'; 234 235 ORACLE instance started. 236 237 Total System Global Area 289406976 bytes 238 239 Fixed Size 1248600 bytes 240 241 Variable Size 100663976 bytes 242 243 Database Buffers 184549376 bytes 244 245 Redo Buffers 2945024 bytes 246 247 Database mounted. 248 249 Database opened. 250 251 ---从此以后,数据库的归档日志将被写到/proddata下。 252 253 --- 方法二:增加闪回区(Flash Recovery Area)的大小。 254 255 SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE =20GSCOPE=BOTH SID='*'; 256 257 System altered. 258 259 ---闪回区的大小被提到20G。 260 261 ---- 方法三:删除闪回区(Flash Recovery Area)中多余的归档日志文件 262
-------------------------------