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

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

上一篇:IP,IP地址,mac地址


下一篇:oracle 闪回功能详解