暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 闪回数据库——把整个数据库闪回到过去某个时刻

oracleEDU 2017-09-28
3230

Flashback Database

闪回数据库用的是闪回日志和日志,不用备份集

闪回数据库不执行restore,所以比不完全恢复快

前提条件:

flashback log(闪回日志)

 FRA存储

 redo log 归档模式

判断一个库是否可执行闪回

检查数据库是否处于归档模式,闪回数据库是否开启

SQL> select DBID, NAME, LOG_MODE,FLASHBACK_ON from v$database;

DBID NAME      LOG_MODE     FLASHBACK_ON

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

1380804050 ORCL      NOARCHIVELOG  NO

从上可知:数据库是非归档模式 ,闪回数据库没有打开

要使闪回数据库可用,需开启归档模式,开启闪回数据库。

1

确保是归档模式

SQL> archive log list ;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     7

Next log sequence to archive   9

Current log sequence           9

如何启用归档模式请参见前文:如何启用归档模式

检查是否数据是否是归档

SQL> select DBID , NAME  , LOG_MODE ,FLASHBACK_ON from v$database ; 

 DBID NAME                 LOG_MODE     FLASHBACK_ON

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

1356322301 ORCL          ARCHIVELOG   YES

2

开启闪回数据库

检查数据库是否开启闪回日志

SQL> select  FLASHBACK_ON  from v$database ;

FLASHBACK_ON

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

NO      #没启用数据闪回

开启数据库闪回 (必须在mount模式下)

SHUTDOWN IMMEDIATE

SQL> STARTUP MOUNT 

SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440 SCOPE=BOTH;

SQL> ALTER DATABASE FLASHBACK ON;    #启用数据闪回

SQL> ALTER DATABASE OPEN;

依赖:闪回日志和日志

闪回日志存在快速恢复区

SQL> show parameter recovery;

NAME                                 TYPE        VALUE

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

db_recovery_file_dest                string      +FRA

db_recovery_file_dest_size           big integer 3882M

recovery_parallelism                 integer     0

闪回数据库的时间依赖于闪回日志保留多久

闪回日志存在fra 存多久,参数DB_FLASHBACK_RETENTION_TARGET设置,单位分钟

SQL> show parameter flashback;

NAME                                 TYPE        VALUE

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

db_flashback_retention_target        integer     1440     #分钟

以上设置闪回日志在闪回恢复区保留1天,数据库可以闪回1天内任何时刻

alter system set db_flashback_retention_target=2880;    #保留2天

SQL> show parameter flashback;

NAME                                 TYPE        VALUE

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

db_flashback_retention_target        integer     2880     #闪回存储2天

案例

SQL> select to_char(sysdate ,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY

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

2017-09-28 02:43:36

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

1089651

日志序列

SQL> select group#,SEQUENCE#, STATUS from v$log ;

    GROUP#  SEQUENCE# STATUS

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

         1          7 CURRENT

         2          5 INACTIVE

         3          6 INACTIVE

创建还原点

create restore point a; 

SQL> create table scott.sw(id number) ;

Table created.

SQL> insert into scott.sw values(1);

1 row created.

SQL> commit;

Commit complete.

select * from scott.sw; 

        ID

----------

         1

truncate  table scott.emp ;    #模拟故障点

QL> select count(*) from scott.emp ;

  COUNT(*)

----------

         0

SQL>  select count(*) from scott.emp as of timestamp(sysdate -1/1440);

select count(*) from scott.emp as of timestamp(sysdate -1/1440)

                            *

ERROR at line 1:

ORA-01466: unable to read data - table definition has changed

不能成功,闪回查询不能跨越DDL ,truncate 是一个ddl语句。

使用闪回数据库恢复flashback database

1. 找到要闪回的点

先找一个大概是时间点 scn: 1089651 ,timestmap :2017-09-28 02:43:36,还原点 a

SQL> SELECT oldest_flashback_scn,to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss') FROM  V$FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN TO_CHAR(OLDEST_FLAS

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

             1089215 2017-09-28 02:41:28

scn 1089651   > 1089215

时间 2017-09-28 02:43:36  >2017-09-28 02:41:28

还原点a

SQL> select name ,SCN  ,to_char( TIME ,'yyyy-mm-dd hh24:mi:ss') from  V$RESTORE_POINT;

NAME        SCN TO_CHAR(TIME,'YYYY-

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

A               1089663 2017-09-28 02:44:06

这里选择scn 时间 还原点都是对 都在可闪回的范围内  可以实施数据库闪回.

2. 开始实施闪回

    a. 关闭数据库到mount

        shutdown immediate ;

        startup mount ;

    b. flashback database to 选择的点

        flashback database to timestamp to_timestamp('2017-09-28 02:43:36', 'YYYY-MM-DD HH24:MI:SS');

        或

        FLASHBACK DATABASE TO SCN 1089651;

        或

        FLASHBACK DATABASE  TO SEQUENCE 7  THREAD=1;

        或

        FLASHBACK DATABASE TO RESTORE POINT  a;

    c. read only打开数据库去确认是否是要的还原点,如果不是,重复a、b、c直到你要的还原点

        alter database open read only;

查看scott.emp是否找回

SQL> select * from scott.emp ;

     EMPNO JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7839 PRESIDENT            17-NOV-81       5000                    10

      7844 SALESMAN        7698 08-SEP-81       1500          0         30

      7876 CLERK           7788 23-MAY-87       1100                    20

      7900 CLERK           7698 03-DEC-81        950                    30

      7902 ANALYST         7566 03-DEC-81       3000                    20

      7934 CLERK           7782 23-JAN-82       1300                    10

6 rows selected.

SQL> select * from scott.sw;

select * from scott.sw    #闪回点后的数据都丢失

                    *

ERROR at line 1:

ORA-00942: table or view does not exist

3. 最后resetlogs打开数据库

shutdown immediate ;

startup mount;

alter database open resetlogs;

一般在测试库上做,把数据找回后导处来,再导入生产库。

建立强制还原点,和你的保留策略无关,一定能够把数据库闪回到你创建的还原点

CREATE RESTORE POINT 还原点名 GUARANTEE FLASHBACK DATABASE;

如:

CREATE RESTORE POINT before_upgrade GUARANTEE FLASHBACK DATABASE;

select name ,SCN  ,to_char( TIME ,'yyyy-mm-dd hh24:mi:ss'), GUARANTEE_FLASHBACK_DATABASE from V$RESTORE_POINT;

NAME                   SCN TO_CHAR(TIME,'YYYY- GUA

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

BEFORE_UPGRADE     1186403 2017-09-28 19:22:11 YES

A                  1185964 2017-09-28 19:08:58 NO

        删除强制还原点:

drop restore point BEFORE_UPGRADE

最后修改时间:2021-04-28 20:11:27
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论