Oracle 闪回


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 












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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值