cmd --管理员身份打开 sqlplus / as sysdba --管理数据库 shu immediate; --独占方式开始 startup mount --修改日期模式 alter database archivelog; --开始DB闪回 alter database flashback on; --开启数据库 alter database open; --查看数据库的归档模式及闪回是否启用 select log_mode,open_mode,flashback_on from v$database; ARCHIVELOG READ WRITE NO --FLASHBACK_ON为NO,则表示闪回特性尚未启用 --she设置闪回参数 alter SYSTEM set db_recovery_file_dest_size=500M; alter system set db_recovery_file_dest='D:appflashdb';
alter system set db_flashback_retention_target=30; --设定保留时间为半小时 --查看闪回参数 show parameter db_recovery ;
-- 查看数据库运行状态 select status from v$instance;
-- 给T_USER赋予所有权限 grant all privileges to T_USER
----查看闪回 select * from v$flashback_database_stat; --查看sga中分配的闪回空间大小 select * from v$sgastat where name like 'flashback%';
闪回测试
常用指令
--查看闪回支持的时间 SELECT Begin_time,--闪回最早支持时间 end_time,--闪回最晚支持时间 flashback_data,--闪回的数据大小 db_data,--数据库大小 redo_data --,--操作记录大小 estimated_flashback_size -- FROM v$flashback_database_stat; 2018-02-23 09:28:34 2018-02-23 09:50:46 827392 1253376 386560 -- 查看闪回占用空间大小 SELECT * FROM v$sgastat WHERE name LIKE 'flashback%'; --查看闪回记录 SELECT oldest_flashback_scn ,--允许返回的最早的SCN oldest_flashback_time ,--允许返回的最早的时间点 retention_target , flashback_size / 1024 / 1024 flhbck_siz, estimated_flashback_size / 1024 / 1024 est_flhbck_size FROM v$flashback_database_log; 1095821 2018-02-23 08:35:05 1 11.71875 0
dbflashback.bat
echo 进入sqlplus
sqlplus / as sysdba @dbflashback.sql
dbflashback.sql
shutdown immediate; startup mount; flashback database to timestamp to_timestamp('2018-02-23 10:29:00','yyyy-mm-dd hh24:mi:ss'); alter database open resetlogs; quit;
查询表历史资料
SELECT a."ID",a."Name" from "TUser" AS OF TIMESTAMP to_timestamp('2018-02-23 11:30:04','yyyy-mm-dd hh24:mi:ss') a;
遇到的问题:
1.ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效
alter database open; --启动数据库
2.ORA-01466: 无法读取数据 - 表定义已更改
如果查询表历史资料的时间戳,在table的结构(目前发信删除字段有影响,添加字段没有影响,查询出来资料新增字段值为Null)改变之后,则回报ORA-01466异常。
--------------------------------------------------------------------------------------
1.使用sqlplus实现闪回
可以接受一个时间标记或一个系统改变号实参
sqlplus几种常用的闪回数据库方法
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] SCN <system_change_number> --基于SCN闪回
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] TIMESTMP <system_timestamp_value>--基于时间戳闪回
FLASHBACK [STANDBY] DATABASE [<database_name>] TO [BEFORE] RESTORE POINT <restore_point_name>--基于时点闪回
如下面的示例:
SQL> flashback database to timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss');
SQL> flashback database to scn 918987;
SQL> flashback database ro restore point b1_load;
a.基于时间戳闪回
SQL> select count(1) from usr1.tb1; --查询用户usr1下表tb1中的记录数
COUNT(1)
----------
404944
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual; --获得系统当前的时间
TM
-------------------
2010-10-24 13:04:30
SQL> drop user usr1 cascade; --删除帐户usr1,同时帐户usr1下的所有对象将被删除
SQL> conn scott/tiger; --使用scott 帐户登陆
SQL> create table tb_emp as select * from emp; --新创建表tb_emp
SQL> shutdown immediate; --关系系统
SQL> startup mount ; --重新到mount状态
SQL> flashback database to timestamp --实施闪回
2 to_timestamp('2010-10-24 13:04:30','yyyy-mm-dd hh24:mi:ss') ;
SQL> alter database open resetlogs;
SQL> select count(1) from usr1.tb1; --帐户usr1及其对象tb1被成功闪回
COUNT(1)
----------
404944
SQL> select count(1) from scott.tb_emp; --闪回成功后,在闪回点之后修改的数据全部丢失
select count(1) from scott.tb_emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
b.基于SCN号闪回
SQL> select current_scn from v$database; --获得当前的SCN号
CURRENT_SCN
-----------
918987
SQL> drop table usr1.tb1; --删除用户usr1下的表tb1
SQL> alter system checkpoint; --手动执行检查点
SQL> select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
5 921478
SQL> shutdown abort;
SQL> startup mount;
SQL> flashback database to scn 918987;
SQL> select count(1) from usr1.tb1;
COUNT(1)
----------
404944
c.基于时点闪回
SQL> create table t(id int,col varchar2(20)); --创建表t
SQL> insert into t values(1,'ABC');
SQL> insert into t values(2,'DEF');
SQL> commit;
SQL> create restore point bef_damage; --创建闪回点
SQL> insert into t values(3,'GHI');
SQL> select ora_rowscn,id,col from t; --查看表t的记录
ORA_ROWSCN ID COL
---------- ---------- --------------------
1874406 1 ABC
1874406 2 DEF
1874406 3 GHI
SQL> shutdown immediate;
SQL> startup mount exclusive;
SQL> flashback database to restore point bef_damage; --实施时点闪回
SQL> alter database open resetlogs;
SQL> select * from t; --闪回成功后,闪回点之后的数据丢失
ID COL
---------- --------------------
1 ABC
2 DEF
2.使用RMAN进行flashback database
使用RMAN进行闪回数据库的几种常用办法
RMAN> flashback database to scn=918987;
RMAN> flashback database to sequence=85 thread=1;
SQL> create table scott.tb_emp as select * from scott.emp;
SQL> select count(1) from scott.tb_emp;
COUNT(1)
----------
14
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;
TM
-------------------
2010-10-24 13:59:38
SQL> drop table scott.tb_emp;
SQL> shutdown abort;
SQL> startup mount;
RMAN> flashback database
2> to time="to_date('2010-10-24 13:59:00','yyyy-mm-dd hh24:mi:ss')";
SQL> select count(1) from scott.tb_emp;
COUNT(1)
----------
14
查询视图:v$recovery_file_dest将显示闪回区的使用情况
SQL> select name,space_limit/1024/1024 sp_limt
2 ,space_used/1024/1024 sp_usd,space_reclaimable/1024/1024 sp_recl,
3 number_of_files num_fils from v$recovery_file_dest;
NAME SP_LIMT SP_USD SP_RECL NUM_FILS
--------------------------------------------- ---------- ---------- ---------- ----------
/u01/app/oracle/flash_recovery_area 2048 472.070313 380.671875 18
可以将某些表空间排除在闪回之外
SQL> alter tablespace users flashback off;
SQL> select name,flashback_on from v$tablespace where ts#=4;
NAME FLA
--------------- ---
USERS NO
如果需要对上述表空间启用闪回功能,则需要在mount模式下对该表空间进行开启该功能。
http://blog.csdn.net/leshami/article/details/6100429