共计 5269 个字符,预计需要花费 14 分钟才能阅读完成。
这篇文章将为大家详细讲解有关 Redo 丢失的 4 种情况是什么,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一. 说明:
1. 以下所说的当前日志指日志状态为 CURRENT,ACTIVE, 非当前日志指日志状态为 INACTIVE
2. 不用考虑归档和非归档模式,2 种模式下的 Redo 丢失情况一样。
二. 丢失 Redo 的 4 种情况:
第一种情况:非当前日志,正常关闭。
第二种情况:非当前日志,非正常关闭。
第三种情况:当前日志,正常关闭。
第四种情况:当前日志,非正常关闭。
三. 处理方法:
第一、二种情况的处理方法一样,直接把日志文件 clear 即可。
SQL alter database clear logfile group 3;
SQL alter database clear unarchived logfile group 3;// 如果 INACTIVE 状态的在线 Redo 还未归档,增加关键字 unarchived 完成 clear 操作。(ACTIVE,INACTIVE 都有可能未完成归档,归档是否完成可以查看 v$log.archived 字段)。
例子:
SQL startup mount
ORACLE 例程已经启动。
Total System Global Area 263639040 bytes
Fixed Size 1384012 bytes
Variable Size 167772596 bytes
Database Buffers 88080384 bytes
Redo Buffers 6402048 bytes
数据库装载完毕。
SQL select group#,thread#,status,archived from v$log;
GROUP# THREAD# STATUS ARCHIV
———- ———- ——————————– ——
1 1 CURRENT NO
3 1 ACTIVE NO
2 1 INACTIVE YES
SQL alter database clear logfile group 3;
alter database clear logfile group 3
*
第 1 行出现错误:
ORA-01624: 日志 3 是紧急恢复实例 orcl (线程 1) 所必需的
ORA-00312: 联机日志 3 线程 1: E:\APP\ORADATA\ORCL\REDO03.LOG
SQL alter database clear logfile group 2;
数据库已更改。
第三种情况的处理办法:
SQL startup mount;
SQL recover database until cancel;
SQL alter database open resetlogs;
例子 1:
SQL shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL startup mount
ORACLE 例程已经启动。
Total System Global Area 263639040 bytes
Fixed Size 1384012 bytes
Variable Size 167772596 bytes
Database Buffers 88080384 bytes
Redo Buffers 6402048 bytes
数据库装载完毕。
SQL alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效
SQL recover database until cancel;
完成介质恢复。
SQL alter database open resetlogs;
数据库已更改。
例子 2(第三种情况的第二个处理方法):
SQL shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL startup mount
ORACLE 例程已经启动。
Total System Global Area 263639040 bytes
Fixed Size 1384012 bytes
Variable Size 167772596 bytes
Database Buffers 88080384 bytes
Redo Buffers 6402048 bytes
数据库装载完毕。
SQL select group#,thread#,status,archived from v$log;
GROUP# THREAD# STATUS ARCHIV
———- ———- ——————————– ——
1 1 CURRENT NO
3 1 INACTIVE YES
2 1 INACTIVE YES
SQL alter database clear logfile group 2;
数据库已更改。
SQL alter database clear logfile group 3;
数据库已更改。
SQL alter database clear unarchived logfile group 1;
数据库已更改。
这里 CURRENT 的 Redo 日志文件组能被 clear unarchived。
SQL alter database open;
数据库已更改。
如果 Redo 日志文件丢失,clear 操作完成之后将在原有位置创建新的 Redo 日志文件。
第四种情况的处理方法:
1. 通过备份来还原、恢复数据。
2. 通过修改参数文件中的参数
_allow_resetlogs_corruption=TRUE
来强制启动数据库。 虽然能够启动数据库到 open 状态,但是启动后的数据库数据字典、数据有可能导致不一致的情况出现,故需要在 open 下把整个数据库 export,然后删除库,重建,再将 export 的数据 import 到新的数据库中。
四. 验证数据库是否正常关闭的方法
SQL select open_mode from v$database;
OPEN_MODE
——————–
READ WRITE
SQL select status from v$instance;
STATUS
————
OPEN
SQL select file#,checkpoint_change#,fuzzy from v$datafile_header;
FILE# CHECKPOINT_CHANGE# FUZ
———- —————— —
1 1165820 YES
2 1165820 YES
3 1165820 YES
4 1165820 YES
FUZZY bit in datafile header means that there may have been writes into a datafile after the last checkpoint. E.g. there may be changes written to datafile with higher SCN than checkpoint_change# stored in datafile header (seen from v$datafile_header.checkpoint_change#).
FUZYY 表示模糊性,意思是,该数据文件处于模糊状态,在最近一次 CHECKPOINT 后,该文件上的数据可能被修改过了,但没来得及更新到该文件上(或者该文件不知道),需要读取日志信息来判断。
SQL select file#,checkpoint_change#,last_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
———- —————— ————
1 1165820
2 1165820
3 1165820
4 1165820
由于数据库是打开的状态,所以终止 SCN 是空,SCN 的内容可参考文章:http://space.itpub.net/23135684/viewspace-627343
SQL shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL startup mount
ORACLE 例程已经启动。
Total System Global Area 313860096 bytes
Fixed Size 1384352 bytes
Variable Size 155189344 bytes
Database Buffers 150994944 bytes
Redo Buffers 6291456 bytes
数据库装载完毕。
SQL select file#,checkpoint_change#,fuzzy from v$datafile_header;
FILE# CHECKPOINT_CHANGE# FUZ
———- —————— —
1 1166324 NO
2 1166324 NO
3 1166324 NO
4 1166324 NO
在正常关闭数据库的情况下,FUZZY 字段都应该是 NO,表示没有模糊不清的 SCN 存储在数据文件中。
SQL select file#,checkpoint_change#,last_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
———- —————— ————
1 1166324 1166324
2 1166324 1166324
3 1166324 1166324
4 1166324 1166324
正常关闭数据库的终止 SCN 应该和启动 SCN 相同。FUZZY 等于 NO,且数据库的终止 SCN 等于启动 SCN 等于数据文件 SCN,那么可以认为数据库是正常关闭,且在打开数据库之前不需要执行实例恢复或 Crash 恢复。
SQL alter database open;
数据库已更改。
SQL shutdown abort
ORACLE 例程已经关闭。
SQL startup mount
ORACLE 例程已经启动。
Total System Global Area 313860096 bytes
Fixed Size 1384352 bytes
Variable Size 155189344 bytes
Database Buffers 150994944 bytes
Redo Buffers 6291456 bytes
数据库装载完毕。
SQL select file#,checkpoint_change#,fuzzy from v$datafile_header;
FILE# CHECKPOINT_CHANGE# FUZ
———- —————— —
1 1166327 YES
2 1166327 YES
3 1166327 YES
4 1166327 YES
非正常关闭数据库实例,FUZZY 字段的值是 YES。
SQL select file#,checkpoint_change#,last_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
———- —————— ————
1 1166327
2 1166327
3 1166327
4 1166327
非正常关闭数据库实例,终止 SCN 依然为空。那么,在数据库被打开之前必须使用归档 Redo 日志完成实例恢复或 Crash 恢复。
关于“Redo 丢失的 4 种情况是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。