ORACLE FLASHBACK DATABASE 知识整理
1、知识储备
1) 只有SYSDBA有权执行,闪回前一定要记录当前SCN
2) 需要停机,并要求处于ARCHIVELOG模式中
3) 闪回日志不能被复用和归档,是自动管理的。RVWR进程负责读SGA中的FLASHBACK BUFFER,写闪回日志,写的的内容是完整的数据块映像的日志。
4) 使用FALSHBACK DATABASE闪回后的各数据块SCN很可能不一致,即闪回结果不是一个确定的时间点,而是该时间点前后的一个范围,所以必须用RESETLOGS打开数据库,或者使用alter database open readonly打开查看是否所需(如果在生产环境,read only后就可以EXP重要的表甚至是整个库了),如果是,再RESETLOGS打开,如果不是,shutdown abort后重新闪回。
5) 闪回的结果与不完全恢复一样,闪回点之后的工作都丢失。
6) 不能返回物理讹误,只能返回用户错误导致的逻辑错误。
7) TRUNCATE的表如果选择闪回,只能应用闪回数据库。
8) 闪回数据库将忽略脱机的表空间
2、配置
SQL> select name,flashback_on from v$database; //查看是否已经启用了闪回,如果启用了就不必重复配置了
NAME FLASHBACK_ON
--------------- ------------------
TEST3 NO
SQL> ARCHIVE LOG LIST;//必须位于ARCHIVEMODE
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 11
Next log sequence to archive 13
Current log sequence 13
(可选)需要重启,如果已经设置可以不必重复设置,设置闪回区的地址,这个存储路径应该是结合硬件的具体情况,因为闪回区如果需要较大空间,或者日后可能做调整,则应该放在一个较大的磁盘分区上或独立磁盘,给日后空间调整留有余地。
SQL>alter system set db_recovery_file_dest='/ss' scope=both;
System altered.
(可选)需要重启,如果已经设置可以不必重复设置,设置闪回区的大小。
SQL>alter system setdb_recovery_file_dest_size=20G scope=both;
System altered.
(可选)需要重启,如果已经设置可以不必重复设置,设置保留时间,1440单位为分钟,即24小时,前提是,闪回区提供了足够的空间,可以存放24小时的内容
SQL>alter system set db_flashback_retention_target=1440 scope=both;
System altered.
SQL>shutdown immediate;
Oracle instance shut down
SQL>startup mount;
connected to target database (not started)
Oracle instance started
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 788532284 bytes
Database Buffers 469762048 bytes
Redo Buffers 12582912 bytes
database mounted
SQL>alter database flashback on;//打开闪回
Database altered.
/**************************************注释************************************************/
SQL>alter tablespace xxx flashback off;//关闭某个表空间的闪回
- 能够容忍长时间停机的表空间可以关闭闪回
- 允许任意删除的表空间可以关闭闪回
- 能够被非常快还原与恢复的表空间可以关闭闪回
- 如果某表空间没有打开闪回,则在闪回数据库之前,必须将此表空间OFFLINE,闪回将忽略脱机的表空间。否则会报ORA-38753和ORA-01110
/**************************************注释结束*********************************************/
SQL>alter database open; //打开数据库
Database altered
3、查看
1) 查看闪回恢复区及大小是否设置
SQL>showparameter db_recovery;
NAME TYPE VALUE
--------------------------------------- --------------------------
db_recovery_file_dest string /u01/app/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 3852M
2) 查询目前的设置能够最远闪回多久的数据库
SQL> select oldest_flashback_scn as oldest_scn,to_char(oldest_flashback_time,'yyyy-mm-ddhh24:mi:ss') as oldest_time from v$flashback_database_log;
OLDEST_SCNOLDEST_TIME
-----------------------------
837455 2013-07-27 16:50:30
3)
select oldest_flashback_scn as oldest_scn,to_char(oldest_flashback_time,'yyyy-mm-ddhh24:mi:ss') as oldest_time,retention_target,flashback_size/1024/1024 as fb_size_mb,estimated_flashback_size/1024/1024 as estimated_size_mb from v$flashback_database_log;
4) 查找每个时间段内闪回数据库所需的数据
SQL>select to_char(begin_time,'yyyy-mm-dd hh24:mi:ss') as begin_time,to_char(end_time,'yyyy-mm-dd hh24:mi:ss') as end_time,flashback_data/1024/1024 as fb_date_mb,db_data/1024/1024 as db_date_mb,redo_data/1024/1024 as redo_date_mb,estimated_flashback_size as estimated_size from v$flashback_database_stat;
5) SGA 中自动分配的闪回缓冲区
SQL>select * from v$sgastat where name='flashback generation buff';
POOL NAME BYTES
---------------------------------------------------- ----------
shared pool flashback generation buff 8388608
6) 查找具体的表空间是否打开闪回
SQL>select name,flashback_on from v$tablespace;
NAME FLASHBACK_ON
----------------------------------------------------------
SYSTEM YES
SYSAUX YES
UNDOTBS1 YES
USERS YES
TEMP YES
TEST_SPACE YES
READONLY_SPACE YES
OFFLINE_SPACE YES
INDEX_SPACE YES
4、使用方法
4.1 SQLPLUS
4.1.1环境模拟
1) 确定当前时间
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2013-07-27 20:56:32
2) 确定当前SCN
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
839748
3) 指定表原始状态
SQL> select * from knight.books;
ID NAME PRICE
------------------------------ ----------
1 LINUX 25.55
2 AIX 50.5
3 NETWORK 125.89
4 JAVA 88.99
5 JQUERY 102.98
4) 插入新数据,这些数据在闪回后应该不存在。
SQL> insert into knight.books values(200,'WEBWORK',299.9);
1 row created.
5) 插入新数据,这些数据在闪回后应该不存在。
SQL> insert into knight.books values(201,'PMP',56.99);
1 row created.
SQL> commit;
Commit complete.
6) 表的新状态。
SQL> select * from knight.books;
ID NAME PRICE
------------------------------ ----------
200 WEBWORK 299.9
201 PMP 56.99
1 LINUX 25.55
2 AIX 50.5
3 NETWORK 125.89
4 JAVA 88.99
5 JQUERY 102.98
7 rows selected.
7) 模拟断电关机
SQL>shutdown abort;
4.1.2 开始闪回数据库
I SQL>startup mount;
II SQL>flashback database to timestamp to_timestamp('2013-07-27 20:56:32','yyyy-MM-dd hh24:mi:ss');//最细粒度为百万分之一秒
Flashback complete.
III SQL>alter database open read only;
查看数据库在该时间点下是否为所需状态,如果不是,更换新的时间点后,重复执行I-III。如果已经为所需状态
IV SQL>startup abort;
V SQL>alter database open resetlogs;
4.2 RMAN
在RMAN环境下,针对SQLPLUS中的第3步,可以选择另外三种实现方式
RMAN>flashbackdatabase to time=to_date('2013-07-26 18:00:00','yyyy-mm-dd hh24:mi:ss');//最细粒度为秒
RMAN>flashbackdatabase to scn=3655894;
RMAN>flashbackdatabase to sequence=56 thread=1;
5 OFFLINE状态对闪回的影响实例分析
闪回点指历史上的时间点。
操作点指执行闪回操作时的时间点,这个时间点理论上晚于闪回点。
经过后边的实验,证明在闪回点是OFFLINE的文件都将在闪回过程中被忽略,并且在之后的打开过程中会用到不安全的隐含参数。所以在执行全库闪回的时候,推荐按照以下步骤进行
- 记录所有数据文件的OFFLINE/ONLINE状态
- 将所有数据文件都上线
- Flashback database
- 按照记录情况,手动改回各数据文件的状态
5.1 闪回点OFFLINE,操作点OFFLINE
这是很麻烦的情况,闪回结果是数据没有被闪回,状态出现错误,最后要求做全备份
1) 确定当前时间
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2013-07-27 20:56:32
2) 确定当前SCN
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
839748
3)插入另外一个表knight.keyboards新数据
SQL> insert into knight.keyboards values(200,'SANSUMG','MECHINE');
1 row created.
4)插入另外一个表新数据
SQL> insert into knight.keyboards values(201,'SNAKE','MECHINE');
1 row created.
SQL> commit;
Commit complete.
5)新表状态
SQL> select * from knight.keyboards;
ID COMPANY TYPE
------------------------------ --------------------
200 SANSUMG MECHINE
201 SNAKE MECHINE
1 IBM 500.55
2 HP 200.5
3 SONY 1200.5
4 ACER 55.6
5 MICROSOFT 108
6)将表knight.keyboards所在空间OFFLINE
SQL> alter tablespace offline_space offline;
Tablespace altered.
7)检查一下,已经不能访问了
SQL> select * from knight.keyboards;
select * from knight.keyboards
*
ERROR at line1:
ORA-00376: file7 cannot be read at this time
ORA-01110: datafile 7: '/ss/offline_space01.dbf'
8)模拟断电关机
SQL>shutdown abort;
9)启动到mount模式
SQL>startup mount;
10)
开始闪回
SQL>flashback database to timestamp to_timestamp('2013-07-27 20:56:32','yyyy-MM-dd hh24:mi:ss');
Flashback complete.
11)resetlogs打开数据库
SQL>alter database open resetlogs;
Database altered.
12)尝试将表空间online,结果报错了,糟糕的01190
SQL> alter tablespace offline_space online;
altert ablespace offline_space online
*
ERROR at line1:
ORA-01190:control file or data file 7 is from before the last RESETLOGS
ORA-01110: datafile 7: '/ss/offline_space01.dbf'
13)使用隐藏参数设置
SQL> alter system set"_allow_resetlogs_corruption"=TRUE scope=spfile;
System altered.
SQL> ALTER SESSIONSET EVENTS 'IMMEDIATE TRACE NAME ADJUST_SCN LEVEL 1';
Session altered.
14)重启数据库后尝试不完全恢复
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 822086716 bytes
Database Buffers 436207616 bytes
Redo Buffers 12582912 bytes
Database mounted.
SQL> recover database until cancel;
Media recovery complete.
SQL> alter database datafile 7 online;
Database altered.
SQL> alter database open resetlogs;
Database altered.
SQL> alter tablespace offline_space online;
Tablespace altered.
SQL> select * from knight.keyboards;
ID COMPANY TYPE
------------------------------ --------------------
200 SANSUMG MECHINE
201 SNAKE MECHINE
1 IBM 500.55
2 HP 200.5
3 SONY 1200.5
4 ACER 55.6
5 MICROSOFT 108
7 rows selected.
从结果可以看出,新加入的记录被保存了,并没有按照被闪回到指定的时间点,由此说明,闪回数据库时是忽略操作点OFFLINE表空间的。但是此时SCN已经很乱了,必须全备数据库。
5.2 闪回点OFFLINE,操作点ONLINE
闪回被很好的执行了,无论是数据还是数据文件的状态都恢复到之前的状态。
1)确定当前时间
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2013-07-2720:56:32
2)确定当前SCN
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
839748
3)插入knight.keyboards新数据
SQL>alter tablespace offline_space online;
Tablespace altered.
4)插入knight.keyboards新数据
SQL> insert into knight.keyboards values(200,'SANSUMG','MECHINE');
1 row created.
5)插入knight.keyboards新数据
SQL> insert into knight.keyboards values(201,'SNAKE','MECHINE');
1 row created.
SQL> commit;
Commit complete.
6) 查看一下表新状态
SQL> select * from knight.keyboards;
ID COMPANY TYPE
------------------------------ --------------------
200 SANSUMG MECHINE
201 SNAKE MECHINE
1 IBM 500.55
2 HP 200.5
3 SONY 1200.5
4 ACER 55.6
5 MICROSOFT 108
7)模拟断电关机
SQL>shutdown abort;
8)启动到mount模式
SQL>startup mount;
9)
开始闪回
SQL>flashback database to timestamp to_timestamp('2013-07-27 20:56:32','yyyy-MM-dd hh24:mi:ss');
Flashback complete.
10)闪回后各数据文件的状态。
SQL> select file#,status from v$datafile;
FILE# STATUS
-----------------
1 SYSTEM
2 RECOVER
3 RECOVER
4 RECOVER
5 RECOVER
6 ONLINE
7 RECOVER
8 RECOVER
8 rows selected.
11)打开前查看一下
SQL> alter database open read only;
Database altered.
12)看到此时新加入的数据已经不存在了。
SQL> select * from knight.keyboards;
ID COMPANY TYPE
------------------------------ --------------------
1 IBM 500.55
2 HP 200.5
3 SONY 1200.5
4 ACER 55.6
5 MICROSOFT 108
13)重新启动并尝试打开数据库
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 822086716 bytes
Database Buffers 436207616 bytes
Redo Buffers 12582912 bytes
Database mounted.
SQL> alter database open resetlogs;
Database altered.
14) 打开后,指定表空间是OFFLINE的状态,符合闪回点的状态。
SQL> select * from knight.keyboards;
select * from knight.keyboards
*
ERROR at line1:
ORA-00376: file7 cannot be read at this time
ORA-01110: datafile 7: '/ss/offline_space01.dbf'
15)使表空间online
SQL> alter tablespace offline_space online;
Tablespace altered.
16) 没有新加入的数据
SQL> select * from knight.keyboards;
ID COMPANY TYPE
------------------------------ --------------------
1 IBM 500.55
2 HP 200.5
3 SONY 1200.5
4 ACER 55.6
5 MICROSOFT 108
5.3 闪回点ONLINE,操作点OFFLINE
闪回失败,闪回后无论数据还是数据文件状态都是操作点的状态,并且使用了隐含参数,需要做全库备份。
1)确定当前时间
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2013-07-2720:56:32
2)确定当前SCN
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
839748
3)查看表原始状态
SQL> select * from knight.books;
ID NAME PRICE
------------------------------ ----------
1 LINUX 25.55
2 AIX 50.5
3 NETWORK 125.89
4 JAVA 88.99
5 JQUERY 102.98
4) 插入新数据,这些数据在闪回后应该不存在。
SQL> insert into knight.books values(200,'WEBWORK',299.9);
1 row created.
5) 插入新数据,这些数据在闪回后应该不存在。
SQL> insert into knight.books values(201,'PMP',56.99);
1 row created.
SQL> commit;
Commit complete.
6) 表的新状态。
SQL> select * from knight.books;
ID NAME PRICE
------------------------------ ----------
200 WEBWORK 299.9
201 PMP 56.99
1 LINUX 25.55
2 AIX 50.5
3 NETWORK 125.89
4 JAVA 88.99
5 JQUERY 102.98
7 rows selected.
7) 将表空间离线
SQL> alter tablespace test_space offline;
Tablespace altered.
8)已经无法查询了
SQL> select * from knight.books;
select * from knight.books
*
ERROR at line1:
ORA-00376: file5 cannot be read at this time
ORA-01110: datafile 5: '/ss/test_space01.dbf'
9)模拟断电
SQL> shutdown abort;
ORACLE instance shut down.
10)启动至mount
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 822086716 bytes
Database Buffers 436207616 bytes
Redo Buffers 12582912 bytes
Database mounted.
11)闪回至指定SCN
SQL> flashback database to scn 839748;
Flashback complete.
12)查看数据文件状态,注意文件5是OFFLINE的状态。与闪回点状态不一致,与操作点状态一致。
SQL> select file#,status from v$datafile;
FILE# STATUS
-----------------
1 SYSTEM
2 RECOVER
3 RECOVER
4 RECOVER
5 OFFLINE
6 ONLINE
7 OFFLINE
8 RECOVER
8 rows selected.
13)打开数据库
SQL> alter database open resetlogs;
Database altered.
14)无法查看
SQL> select * from knight.books;
select * from knight.books
*
ERROR at line1:
ORA-00376: file5 cannot be read at this time
ORA-01110: datafile 5: '/ss/test_space01.dbf'
15)无法上线
SQL> alter tablespace test_space online;
alter tablespace test_space online
ERROR at line1:
ORA-01190: control file or data file 5 is from before the last RESETLOGS
ORA-01110: datafile 5: '/ss/test_space01.dbf'
无法上线
SQL> alter database datafile 5 online;
alter database datafile 5 online
*
ERROR at line1:
ORA-01190: control file or data file 5 is from before the last RESETLOGS
ORA-01110: datafile 5: '/ss/test_space01.dbf'
16)使用隐含参数
SQL> alter system set "_allow_resetlogs_corruption"=TRUE scope=spfile;
System altered.
SQL> ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME ADJUST_SCN LEVEL1';
Session altered.
17)重启数据库至mount
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 822086716 bytes
Database Buffers 436207616 bytes
Redo Buffers 12582912 bytes
Database mounted.
18)不完全恢复
SQL> recover database until cancel;
Media recovery complete.
19)此时可以上线
SQL> alter database datafile 5 online;
Database altered.
SQL> alter database open resetlogs;
Database altered.
20)报内部错误
SQL> select * from knight.books;
select * from knight.books
*
ERROR at line1:
ORA-00600:internal error code, arguments: [2662], [0], [840208], [0],
[840576],[20971648], [], [], [], [], [], []
21)再次重启
SQL> shutdown immediate;
ORA-00600:internal error code, arguments: [2662], [0], [840230], [0], [840576],[20971648], [], [], [], [], [], []
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 1272213504 bytes
Fixed Size 1336260 bytes
Variable Size 822086716 bytes
Database Buffers 436207616 bytes
Redo Buffers 12582912 bytes
SQL> alter database mount;
Database altered.
SQL> alter database open;
Database altered.
22)文件5已经上线
SQL> select file#,status from v$datafile;
FILE# STATUS
-----------------
1 SYSTEM
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 OFFLINE
8 ONLINE
8 rows selected.
23)可以查看,但结果不是闪回点的结果,而是操作点的结果。
SQL> select * from knight.books;
ID NAME PRICE
------------------------------ ----------
200 WEBWORK 299.9
201 PMP 56.99
1 LINUX 25.55
2 AIX 50.5
3 NETWORK 125.89
4 JAVA 88.99
5 JQUERY 102.98
7 rows selected.
全备数据库
从结果可以看出,新加入的记录被保存了,并没有按照被闪回到指定的时间点,由此说明,闪回数据库时是忽略操作点OFFLINE表空间的。但是此时SCN已经很乱了,必须全备数据库。
(完)
ORACLE FLASHBACK DATABASE 知识整理的更多相关文章
- Oracle Flashback Database
Oracle Flashback Database Ensure that the prerequisites described in Prerequisites of Flashback Data ...
- ORACLE DATABASE 10G FALSHBACK 知识整理
1.知识储备 1) 当出现介质损坏时(如数据文件丢失),任何闪回方法都毫无用处,只能执行标准的备份.还原与恢复. 2.SCN记录方法 SQL>variable x_scn number; ...
- oracle flashback
一.Flashback闪回技术概述:当Oracle数据库发生逻辑错误时,必须使用flashback技术,实现快速和方便的恢复数据.对于人为错误,要确定受到错误事务影响的对象或者记录是非常困难的.使用f ...
- 跨数据文件删除flashback database
Oracle flashback database的使用有一些限制,其中最主要的是flashback database不支持跨数据文件删除闪回和不支持跨数据文件shrink闪回.对于已经删除的数据文件 ...
- Oracle 闪回特性(FLASHBACK DATABASE)
--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --======================= ...
- Oracle 闪回归档(Flashback Database)
cmd --管理员身份打开 sqlplus / as sysdba --管理数据库 shu immediate; --独占方式开始 startup mount --修改日期模式 alter datab ...
- 【体系结构】有关Oracle SCN知识点的整理
[体系结构]有关Oracle SCN知识点的整理 1 BLOG文档结构图 BLOG_Oracle_lhr_Oracle SCN的一点研究.pdf 2 前言部分 2.1 导读和注意事项 各位技 ...
- 数据库知识整理<一>
关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...
- 【OGG】OGG基础知识整理
[OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...
随机推荐
- 使用RadioGroup与RadioButton实现多选一
RadioGroup是RadioButton的集合, RadioGroup里面可以包含很多RadioButton,提供多选一机制,只能选择其中一个 RadioGroup的orientation(方向) ...
- TextView实现多个TextView对象的走马灯效果
1:自定义一个控件继承TextView,重写isFocused方法,返回值为true; package com.example.helloandroid; import android.R.bool; ...
- java键盘录入
System.out:标准输出设备(默认是:控制台) System.in:标准输入设备(默认是:键盘) --------------------- InputStream in = System.in ...
- 搭建zend framework1开发环境
1.和常规开发大致相同,首先下载zend framework1,下载地址如下 http://www.zendframework.com/downloads/latest 挑选其中一个下载,我下载的是f ...
- JDBC_获取数据库连接
<span style="font-size:24px;">package src.com.jdbc.java; import java.io.IOException; ...
- ASP.NET MVC3中的路由系统 Routes
MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...
- Error Unable to start the Genymotion virtual device.解决
The Genymotion virtual device could not obtain an IP address.For an unknown reason.VirtualBox DHCP h ...
- myeclipse部署时An internal error occurred 错误的几种情况
myecplise上将工程部署到应用下时,经常出现 An internal error occurred during: "Add Deployment". java.lang.N ...
- 17.2?Replication Implementation 复制实施:
17.2?Replication Implementation 复制实施: 17.2.1 Replication Implementation Details 17.2.2 Replication R ...
- BZOJ 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
1607: [Usaco2008 Dec]Patting Heads 轻拍牛头 Description 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏. 贝茜让N(1≤N≤10 ...