zoukankan      html  css  js  c++  java
  • 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 












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

  • 相关阅读:
    指令到底是什么?机器码又是什么?
    汇编基础最后一篇--机器语言指令
    剑指OFFER----面试题34. 二叉树中和为某一值的路径
    剑指OFFER----面试题33. 二叉搜索树的后序遍历序列
    剑指OFFER----面试题32
    剑指OFFER----面试题31. 栈的压入、弹出序列
    剑指OFFER----面试题30. 包含min函数的栈
    剑指OFFER----面试题29. 顺时针打印矩阵
    剑指OFFER----面试题28. 对称的二叉树
    剑指OFFER----面试题27. 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/ios9/p/7710613.html
Copyright © 2011-2022 走看看