10g闪来总结

10g闪回总结
转http://litterbaby.itpub.net/post/16841/276210
Oracle从9i就有了闪回这个新功能,在Oracle 10g中这个功能被大大增强。在Oracle 9i中只是以闪回查询的形式查看某一时间点上的数据,就是某一时刻的数据的快照,而不是在两个时间点之间的被更改数据的运行状态的表示,在Oracle 10g中就提供了这样的功能。


优点


闪回应该说是一个技术革新,比传统意义上的恢复更快更加简单方便。传统意义上的恢复需要还原数据库和数据文件,而这些数据文件则是在前一阶段备份而来的。然后在通过数据库日值在数据文件上的前滚来实现数据的每一次改变。这样的过程相对而言是比较慢的。而闪回通过事务或者行的改变来构架闪回,只有数据的改变的前像和后像被存储。


闪回技术应用的范围


闪回技术恢复在Oracle 10g上提供了三个级别的恢复。我们可以根据不同的应用来实现不同的级别的数据库恢复实现。

数据库级

n Drop user (Flashback Database)

n Truncate table (Flashback Database)

n Batch job : partial change (Flashback Database)


表级

n Drop table (flashback drop)

n Update with wrong where clause (Flashback table)

n Compare current data against the data at some time in the past (Flashback Query)


事务级

Batch job runs twice, but you are unsure of the objects affected (Flashback Query)


需要的权限


由于需要使用不同的闪回版本则是需要不同的权限:

n Flashback Database:

– SYSDBA database connection

n Flashback Table or Flashback Versions Query:

– FLASHBACK ANY TABLE

– Appropriate object privileges

n Flashback Transaction Query:

– SELECT ANY TRANSACTION


闪回数据库


这个功能是非常强大的,在上面也介绍了,当发生错误使用drop user,删除用户这样的错误的时候,是必须使用数据库闪回来进行恢复的,这项功能能够使得快速将你的数据库返回到以前某个时间点上的状态,从而恢复你的数据库。能够使用这个功能实现逻辑数据实效的错误,在这里需要解释的是,在闪回恢复和通常的日志恢复的不同。

闪回恢复是将你现在的数据库回退到以前的某个时间点,主要目的是为了解决数据库上人为的逻辑错误,注意这是逻辑错误,意义就是说,是由于人为的错误,而发现的相对比较早,在闪回恢复的时间期限内。

而日志恢复则是将数据库还原到以前的某个时间点(实在你需要恢复的时间点之前的时间点),这里的根据你恢复的不同而还原,如果是只是恢复数据文件,只是需要还原这个数据文件。使用归档和联机日志文件将你的数据库应用到当前或者以前的某个时间点。主要目的是为了恢复物理上的错误。

闪回恢复数据库之所以说要比普通意义上的恢复快的原因就是因为,在闪回恢复数据库是没有还原这一说的。

闪回数据库也是通过应用日志来恢复数据库,只不过不是使用重做日志,而是使用的是闪回日志。


机制


由图上可以看到,闪回数据库使用的是一个新的日志:闪回数据库日志,Oracle数据库服务器定期在闪回数据库日志数据块的前像写入到日志文件中去。当进行闪回数据库恢复的时候,日志上的前像将被回滚应用在数据库的数据文件中。闪回数据库日志是被自动管理和添加到恢复区域的。当闪回数据库被开启的时候,会有一个新的恢复写进程RVWR被开启。


启动配置闪回数据库


1、 配置flash 恢复区域

2、 设置参数db_flashback_retention_target


这个参数的单位是分钟。指定的是一个数据库可以使用闪回恢复的时间,这个时间越长,需要的闪回恢复区域就月大。

引用

SQL> show parameter flashback

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440

3、使用ALTER DATABASE FLASHBACK ON;将数据库启动为闪回数据库状态。

引用

ALTER DATABASE FLASHBACK ON;

这里需要注意的是数据库需要是在archivelog模式之下启动闪回数据库,并使用MOUNT EXCLUSIVE模式下运行的。

开启闪回数据库以后可以通过查询视图v$database的列flashback_on来查看闪回数据库是否开启。
引用

SQL> select flashback_on from v$database;

FLA
---
YES

实例:
引用

SQL> startup mount

ORACLE 例程已经启动。


Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 67110724 bytes

Database Buffers 12582912 bytes

Redo Buffers 2945024 bytes

数据库装载完毕。

SQL> alter database flashback on;


数据库已更改。


SQL> select flashback_on from v$database;


FLASHBACK_ON

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

YES


SQL> alter database open;


数据库已更改。


SQL>


关闭闪回数据库


关闭闪回数据库状态需要使用命令:

引用

ALTER DATABASE FLASHBACK OFF;
SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON

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

NO

闪回数据库


闪回数据库由三种方式进行,一种是使用OEM的UI操作,二种是使用RMAN进行。三是使用SQL PLUS来实现。OEM在这里就不介绍了。

使用RMAN

将数据库恢复到一个时间点

引用

RMAN> FLASHBACK DATABASE

2> TO TIME = TO_DATE

3> ('2002-12-10 16:00:00',

4> 'YYYY-MM-DD HH24:MI:SS');

将数据库闪回恢复到一个SCN
引用
RMAN> FLASHBACK DATABASE TO SCN=23565;

指定一个redo日志的SEQUENCE和THREAD号,作为闪回恢复的上限。这个功能是RMAN特有的。

引用
RMAN> FLASHBACK DATABASE

2> TO SEQUENCE=223 THREAD=1;

使用SQL*Plus

将数据库恢复到一个时间点

引用
SQL> FLASHBACK DATABASE

2 TO TIMESTAMP(SYSDATE-1/24);

将数据库闪回恢复到一个SCN
引用
SQL> FLASHBACK DATABASE TO SCN 53943;

闪回数据库实例:

引用
SQL> conn test/test

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as test


SQL> select table_name from user_tables;


TABLE_NAME

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


SQL> select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER

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

609755


SQL> create table t as select * from all_objects where rownum < 11;


Table created


SQL> select dbms_flashback.get_system_change_number from dual;


GET_SYSTEM_CHANGE_NUMBER

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

609841


SQL> select table_name from user_tables;


TABLE_NAME

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

T


引用
SQL>

现在数据库中有一个表t,然后进行恢复。

SQL> archive log list

数据库日志模式 存档模式

自动存档 启用

存档终点 USE_DB_RECOVERY_FILE_DEST

最早的联机日志序列 2

下一个存档日志序列 4

当前日志序列 4

SQL> flashback database to scn 609755

2 ;

flashback database to scn 609755

*

第 1 行出现错误:

ORA-38757: 要闪回数据库, 数据库必须已装载但不能打开。


SQL> conn /as sysdba

已连接。

SQL> show user

USER 为 "SYS"

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已经启动。


Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 71305028 bytes

Database Buffers 8388608 bytes

Redo Buffers 2945024 bytes

数据库装载完毕。

SQL> flashback database to scn 609755;


闪回完成。


SQL> alter database open;

alter database open

*

第 1 行出现错误:

ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项


SQL> alter database open resetlogs;


数据库已更改。


SQL> conn test/test

已连接。

SQL> select table_name from user_tables;


未选定行




查询闪回数据库的状态


Oracle提供了三个视图有关于闪回数据库的

v$flashback_database_log

v$flashback_database_logfile

v$flashback_database_stat


排除某个表空间出闪回恢复数据库

使用命令将某个表空间排除出闪回数据库恢复。

ALTER TABLESPACE <ts_name> FLASHBACK {ON|OFF}


并可以通过查询视图v$tablespace的flashback_on来查看表空间的状态。


需要注意的问题


在以下的情况下是不能使用闪回数据库的:

n 控制文件被还原或者重新添加

n 表空间被删除

n 一个数据文件被收缩


Resetlogs和闪回(这个似乎容易出错。我做的时候就出现ORA-600的错误,后来解决办法就是重建控制文件恢复的。至今不知道为什么,以后有机会好好检查一下。)


每一次使用FLASHBACK DATABASE闪回数据库的时候,需要使用resetlogs打开数据库。假如在使用resetlogs打开数据库的时候,发现有错误的时候。只需要简单执行FLASHBACK DATABASE TO BEFORE RESETLOGS命令就能够将数据库安装并恢复到前像的(incarnation)最后的SCN。

引用
SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已经启动。


Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 67110724 bytes

Database Buffers 12582912 bytes

Redo Buffers 2945024 bytes

数据库装载完毕。

SQL> flashback database to before resetlogs;

闪回完成。 这个地方正常恢复,从后来的恢复的数据库上看也是恢复了数据。


SQL> alter database open;

alter database open

*

第 1 行出现错误:

ORA-00600: 内部错误代码, 参数: [kcvcrv_fb_inc_mismatch], [0], [556264],

[598815894], [0], [609776], [598877589], []


但是这里为什么出现内部错误。

因为没有metalink帐号,也没有深究,在这里存档,以后查看


随后使用重建控制文件的重建日志文件来恢复数据库。


SQL> select status from v$instance;


STATUS

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

MOUNTED


SQL> shutdown immediate;

ORA-01109: 数据库未打开



已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已经启动。


Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 67110724 bytes

Database Buffers 12582912 bytes

Redo Buffers 2945024 bytes

数据库装载完毕。

ORA-00600: 内部错误代码, 参数: [kcvcrv_fb_inc_mismatch], [0], [556264],

[598815894], [0], [609776], [598877589], []



SQL> alter database backup controlfile to trace;

在mount状态下执行的这个语句。


数据库已更改。


SQL> shutdown immediate;

ORA-01109: 数据库未打开



已经卸载数据库。

ORACLE 例程已经关闭。

SQL> STARTUP NOMOUNT

ORA-32004: obsolete and/or deprecated parameter(s) specified

ORACLE 例程已经启动。


Total System Global Area 83886080 bytes

Fixed Size 1247420 bytes

Variable Size 67110724 bytes

Database Buffers 12582912 bytes

Redo Buffers 2945024 bytes

SQL> CREATE CONTROLFILE REUSE DATABASE "ORA10" RESETLOGS ARCHIVELOG

2 MAXLOGFILES 16

3 MAXLOGMEMBERS 3

4 MAXDATAFILES 100

5 MAXINSTANCES 8

6 MAXLOGHISTORY 292

7 LOGFILE

8 GROUP 1 'E:ORACLEORADATAORA10REDO01.LOG' SIZE 10000K,

9 GROUP 2 'E:ORACLEORADATAORA10REDO02.LOG' SIZE 10000K,

10 GROUP 3 'E:ORACLEORADATAORA10REDO03.LOG' SIZE 10000K

11 -- STANDBY LOGFILE

12 DATAFILE

13 'E:ORACLEORADATAORA10SYSTEM01.DBF',

14 'E:ORACLEORADATAORA10UNDOTBS01.DBF',

15 'E:ORACLEORADATAORA10SYSAUX01.DBF',

16 'E:ORACLEORADATAORA10USERS01.DBF'

17 CHARACTER SET ZHS16GBK

18 ;


控制文件已创建。


SQL> -- Commands to re-create incarnation table

SQL> -- Below log names MUST be changed to existing filenames on

SQL> -- disk. Any one log file from each branch can be used to

SQL> -- re-create incarnation records.

SQL> -- ALTER DATABASE REGISTER LOGFILE 'E:ORACLEFLASH_RECOVERY_AREAORA10ARC

HIVELOG2006_08_19O1_MF_1_1_%U_.ARC';

SQL> -- ALTER DATABASE REGISTER LOGFILE 'E:ORACLEFLASH_RECOVERY_AREAORA10ARC

HIVELOG2006_08_19O1_MF_1_1_%U_.ARC';

SQL> -- ALTER DATABASE REGISTER LOGFILE 'E:ORACLEFLASH_RECOVERY_AREAORA10ARC

HIVELOG2006_08_19O1_MF_1_1_%U_.ARC';

SQL> -- Recovery is required if any of the datafiles are restored backups,

SQL> -- or if the last shutdown was not normal or immediate.

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE

ORA-00279: ?? 609775 (? 08/19/2006 10:40:41 ??) ???? 1 ????

ORA-00289: ??:

E:ORACLEFLASH_RECOVERY_AREAORA10ARCHIVELOG2006_08_19O1_MF_1_4_%U_.ARC

ORA-00280: ?? 609775 (???? 1) ??? #4 ?



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

-- Database can now be opened zeroing the online logs.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ALTER DATABASE OPEN RESETLOGS;

ORA-00308: ???????? 'ALTER'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

-- Commands to add tempfiles to temporary tablespaces.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

-- Online tempfiles have complete space information.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

-- Other tempfiles may require adjustment.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

ALTER TABLESPACE TEMP ADD TEMPFILE 'E:ORACLEORADATAORA10TEMP01.DBF' REUSE;

ORA-00308: ???????? 'ALTER'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

-- End of tempfile additions.

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}

--

ORA-00308: ???????? '--'

ORA-27041: ??????

OSD-04002: ????????????

O/S-Error: (OS 2) ??????????????????????



指定日志: {<RET>=suggested | filename | AUTO | CANCEL}


已应用的日志。

完成介质恢复。

SQL> ALTER DATABASE OPEN RESETLOGS;


数据库已更改。


SQL> -- Commands to add tempfiles to temporary tablespaces.

SQL> -- Online tempfiles have complete space information.

SQL> -- Other tempfiles may require adjustment.

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'E:ORACLEORADATAORA10TEMP01.DBF' REU

SE;


表空间已更改。


SQL>

这时候数据库正常的。





闪回版本查询


闪回版本查询就是指能够在数据库上查询某一时间点或者用户指定的特定的SCN的版本数据。在查询的时候,需要使用versions子句来使用在两个时间点之间的所有版本。通过闪回提取的是行的历史,这里的行的历史是事务行的改变。所有只是查询已经提交的行,没有提交的行版本并不会被查询。

伪列

VERSIONS_OPERATION

VERSIONS_XID

VERSIONS_ENDTIME

VERSIONS_ENDSCN

VERSIONS_STARTTIME

VERSIONS_STARTSCN

SELECT [Pseudocolumns]…

FROM …

VERSIONS BETWEEN

{SCN|TIMESTAMP {expr|MINVALUE} AND

{expr|MAXVALUE}}

[AS OF {SCN|TIMESTAMP expr}]

WHERE [Pseudocolumns…]…



需要注意的问题

VERSIONS子句不能用于以下情况的查询:

n 外部表

n 临时表

n Fixed表

n 视图

VERSIONS子句不能跨DDL查询,意思就是在使用VERSIONS子句的时候,如果对这个表有DDL操作的时候,只能查看DDL之后的信息。当段被收缩操作的时候也是被排除出去的。


实例:

SQL> create table rates (currency varchar2(4) not null,rate number(15,10));


Table created


SQL> insert into rates values('euro',1.1012);


1 row inserted


SQL> update rates set rate = 1.1014;


1 row updated


SQL> commit;


Commit complete


SQL> update rates set rate = 1.1013;


1 row updated


SQL> commit;


Commit complete


SQL> delete rates;


1 row deleted<





分类: ( Oracle 10g ) :: 评论 (1) :: 静态链接网址 :: 引用 (0)
有关flashback database to before incarnation 的ORA-600错误 [回复]


在报了ORA-600错误后,查看alert_sid.log文件,可以发现报了以下的错误
---------------------------
Database incarnation does not match that in flashback
database logs. You can workaround this internal error and
restart database by turning flashback off first.
Wed Nov 14 16:37:12 2007
Errors in file d:oracleproduct10.2.0adminzyyudumpzyy_ora_3824.trc:
ORA-00600: 内部错误代码, 参数: [kcvcrv_fb_inc_mismatch], [0], [1], [637272271], [0], [964437], [638641226], []

可以看到,是由于化身(incarnation)的不同,需要先把flashback disable,然后再打开

步骤:
sql> shutdown immediate
sql> startup mount
sql> alter database flashback off;
sql> alter database open resetlogs;