Oracle 闪回归档(Flashback Database)

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:\app\flashdb'
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

posted @ 2018-02-22 18:36  昨日微风  阅读(866)  评论(0编辑  收藏  举报