基于Oracle闪回详解(必看篇)


当前第2页 返回上一页

针对主库和备库都可以创建闪回快照点,然后恢复到指定的快照点,但主库一旦恢复到快照点,备库的同步则需要重新同步

SQL> select * from scott.dept;

  DEPTNO DNAME     LOC      ADDR
---------- -------------- ------------- ------------------------------
ACCOUNTING   NEW YORK
RESEARCH    DALLAS
SALES     CHICAGO
    
SQL> create restore point before_201712151111 guarantee flashback database;
Restore point created.

SQL> create table scott.t as select * from scott.dept;
Table created.

SQL> truncate table scott.t;
Table truncated.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 9.4067E+10 bytes
Fixed Size         2263936 bytes
Variable Size      9663677568 bytes
Database Buffers     8.4289E+10 bytes
Redo Buffers       112766976 bytes
Database mounted.
SQL> flashback database to restore point before_201712151111;
Flashback complete.
SQL> alter database open resetlogs;
Database altered.

此时主库scott.t已不存在:
SQL> select * from scott.t;
select * from scott.t
          *
ERROR at line 1:
ORA-00942: table or view does not exist
此时从库的scott.依旧存在,主备同步终止
解决方案:在主库创建快照时间点,从库自动停止应用日志,等主库闪回后,重新应用日志即可。
如果已经做了上述操作,从库可以选择重建
ALTER DATABASE REGISTER LOGFILE '/xx/xx/archive.dbf';

c.闪回snapshot standby

此功能在11GR2非常实用,可自动创建闪回点、开启闪回日志,可完成线上数据测试后,然后做数据库闪回恢复主备关系

select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;
select database_role,open_mode,db_unique_name,flashback_on from v$database;

SQL> set line 200;
SQL> set pagesize 2000;
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;

DATABASE_ROLE  OPEN_MODE      DB_UNIQUE_NAME         FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY      testdbms            NO


SQL> ALTER DATABASE CONVERT TO SNAPSHOT STANDBY; 

Database altered.

SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;

DATABASE_ROLE  OPEN_MODE      DB_UNIQUE_NAME         FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
SNAPSHOT STANDBY MOUNTED       testdbms            RESTORE POINT ONLY

SQL> alter database open;

Database altered.

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE


此时备库操作:
SQL> select * from scott.emp;

   EMPNO ENAME   JOB       MGR HIREDATE          SAL    COMM   DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
SMITH   CLERK      7902 1980-12-17 00:00:00    800          20
ALLEN   SALESMAN    7698 1981-02-20 00:00:00    1600    300     30
WARD    SALESMAN    7698 1981-02-22 00:00:00    1250    500     30
JONES   MANAGER     7839 1981-04-02 00:00:00    2975          20
MARTIN   SALESMAN    7698 1981-09-28 00:00:00    1250    1400     30
BLAKE   MANAGER     7839 1981-05-01 00:00:00    2850          30
CLARK   MANAGER     7839 1981-06-09 00:00:00    2450          10
SCOTT   ANALYST     7566 1987-04-19 00:00:00    3000          20
KING    PRESIDENT      1981-11-17 00:00:00    5000          10
TURNER   SALESMAN    7698 1981-09-08 00:00:00    1500     0     30
ADAMS   CLERK      7788 1987-05-23 00:00:00    1100          20
JAMES   CLERK      7698 1981-12-03 00:00:00    950          30
FORD    ANALYST     7566 1981-12-03 00:00:00    3000          20
MILLER   CLERK      7782 1982-01-23 00:00:00    1300          10
rows selected.

SQL> truncate table scott.emp;

Table truncated.

主库操作:
SQL> create table scott.t as select * from scott.dept;

Table created.

SQL> select * from scott.t;

  DEPTNO DNAME     LOC      ADDR
---------- -------------- ------------- ------------------------------
ACCOUNTING   NEW YORK
RESEARCH    DALLAS
SALES     CHICAGO

备库恢复到物理standby
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 9.4067E+10 bytes
Fixed Size         2263936 bytes
Variable Size      9663677568 bytes
Database Buffers     8.4289E+10 bytes
Redo Buffers       112766976 bytes
Database mounted.
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY; 

Database altered.
SQL> shutdown immediate;
ORA-01507: database not mounted


ORACLE instance shut down.
SQL> startup ;
ORACLE instance started.

Total System Global Area 9.4067E+10 bytes
Fixed Size         2263936 bytes
Variable Size      9663677568 bytes
Database Buffers     8.4289E+10 bytes
Redo Buffers       112766976 bytes
Database mounted.
Database opened.

##此时备库的数据已经恢复到转变snapshot standby时间点
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;

DATABASE_ROLE  OPEN_MODE      DB_UNIQUE_NAME         FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY      testdbms            NO

SQL> select * from scott.emp;

   EMPNO ENAME   JOB       MGR HIREDATE          SAL    COMM   DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
SMITH   CLERK      7902 1980-12-17 00:00:00    800          20
ALLEN   SALESMAN    7698 1981-02-20 00:00:00    1600    300     30
WARD    SALESMAN    7698 1981-02-22 00:00:00    1250    500     30
JONES   MANAGER     7839 1981-04-02 00:00:00    2975          20
MARTIN   SALESMAN    7698 1981-09-28 00:00:00    1250    1400     30
BLAKE   MANAGER     7839 1981-05-01 00:00:00    2850          30
CLARK   MANAGER     7839 1981-06-09 00:00:00    2450          10
SCOTT   ANALYST     7566 1987-04-19 00:00:00    3000          20
KING    PRESIDENT      1981-11-17 00:00:00    5000          10
TURNER   SALESMAN    7698 1981-09-08 00:00:00    1500     0     30
ADAMS   CLERK      7788 1987-05-23 00:00:00    1100          20
JAMES   CLERK      7698 1981-12-03 00:00:00    950          30
FORD    ANALYST     7566 1981-12-03 00:00:00    3000          20
MILLER   CLERK      7782 1982-01-23 00:00:00    1300          10
rows selected.


SQL> alter database recover managed standby database using current logfile disconnect;

Database altered.

SQL> select * from scott.t;

  DEPTNO DNAME     LOC      ADDR
---------- -------------- ------------- ------------------------------
ACCOUNTING   NEW YORK
RESEARCH    DALLAS
SALES     CHICAGO

    
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;

DATABASE_ROLE  OPEN_MODE      DB_UNIQUE_NAME         FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY WITH APPLY testdbms            NO

(5)闪回归档(增加、修改、重命名、删除表的列、truncate表、修改表的约束、以及修改分区表的分区规范)

3、闪回注意事项

(1)数据库闪回需要在mounted下进行,并且open时需要使用resetlogs

(2)闪回DROP只能用于非系统表空间和本地管理的表空间,外键约束无法恢复,对方覆盖、重命名需注意

(3)表DROP,对应的物化视图会被彻底删除,物化视图不会存放在recyclebin里

(4)闪回表,如果在做过dml,然后进行了表结构修改、truncate等DDL操作,新增/删除结构无法做闪回

(5)闪回归档,必须在assm管理tablespace和undo auto管理下进行

(6)注意闪回区管理,防止磁盘爆满,闪回区空间不足等

(7)主库做库的闪回,会影响备库,需要重新同步

(8)snapshot standby 不支持最高保护模式

三、备注

1、相关数据字典

V$FLASHBACK_DATABASE_LOG ##查看数据库可闪回的时间点/SCN等信息 V$flashback_database_stat ##查看闪回日志空间记录信息

2、常用查询语句

(1)查看数据库状态

SQL> select NAME,OPEN_MODE ,DATABASE_ROLE,CURRENT_SCN,FLASHBACK_ON from v$database;

NAME OPEN_MODE DATABASE_ROLE CURRENT_SCN FLASHBACK_ON
------------- -------------------- ---------------- ----------- ------------------
TESTDB READ WRITE PRIMARY 16812246 YES

(2)获取当前数据库的系统时间和SCN

SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt , dbms_flashback.get_system_change_number scn from dual;

SYSDT SCN
------------------- ----------
2017-12-14 14:28:33 16813234

(3)查看数据库可恢复的时间点

SQL> select * from V$FLASHBACK_DATABASE_LOG;

OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------- ---------------- -------------- ------------------------
16801523 2017-12-14 11:35:05 4320 104857600 244113408

(4)查看闪回日志空间情况

SQL> select * from V$flashback_database_stat;
BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
------------------- ------------------- -------------- ---------- ---------- ------------------------
2017-12-14 14:34:53 2017-12-14 14:56:43 1703936 9977856 1487872 0  

(5)SCN和timestamp装换关系查询

select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;

(6)查看闪回restore_point

select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;

(7)闪回语句

a.闪回数据库

FLASHBACK DATABASE TO TIMESTAMP to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd HH24:MI:SS');;
flashback database to scn 16813234;

b.闪回DROP

其中table_name可以是删除表名称,也可以是别名

flashback table table_name to before drop;
flashback table table_name to before drop rename to table_name_new;

c.闪回表

flashback table table_name to scn scn_number;
flashback table table_name to timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');

d.闪回查询

select * from table_name as of timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');
select * from scott.dept as of scn 16801523;

e.闪回快照

create restore point before_201712151111 guarantee flashback database;

flashback database to restore point before_201712151111;

(7)闪回空间爆满问题处理

请参照 基于ORA-19815闪回空间爆满问题的处理方法

以上这篇基于Oracle闪回详解(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...