闪回级别 | 闪回场景 | 闪回技术 | 对象依赖 | 影响数据 |
数据库 | 表截断、逻辑错误、其他多表意外事件 | 闪回 DATABASE | 闪回日志、undo | 是 |
DROP | 删除表 | 闪回 DROP | 回收站 (recyclebin) | 是 |
表 | 更新、删除、插入记录 | 闪回 TABLE | 还原数据, undo | 是 |
查询 | 当前数据和历史数据对比 | 闪回 QUERY | 还原数据, undo | 否 |
版本查询 | 比较行版本 | 闪回 Version Query | 还原数据, undo | 否 |
事务查询 | 比较 | 闪回 Transaction Query | 还原数据, undo | 否 |
归档 | DDL、DML | 闪回 Archive | 归档日志 | 是 |
1、闪回开启 (1) 开启闪回必要条件 a. 开启归档日志
- SQL> archive log list;
- Database log mode Archive Mode
- Automatic archival Enabled
- Archive destination /home/U01/app/oracle/oradata/testdb/arch
- Oldest online log sequence 844
- Next log sequence to archive 846
- Current log sequence 846
- ##如未开启,在mount状态执行alter database archivelog;
b. 设置合理的闪回区
db_recovery_file_dest:指定闪回恢复区的位置 db_recovery_file_dest_size:指定闪回恢复区的可用空间大小 db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认 1440 分钟 (1 天), 实际取决于闪回区大小(2) 检查是否开启闪回
(3) 开启闪回
- SQL> select flashback_on from v$database;
- FLASHBACK_ON
- ------------------
- NO
a. 开启归档
- mount状态:alter database archivelog;
b. 设置闪回区
- SQL> alter system set db_recovery_file_dest='/home/U01/app/oracle/fast_recovery_area' scope=both;
- System altered.
- SQL> alter system set db_recovery_file_dest_size=60G scope=both;
- System altered.
- SQL> alter system set db_flashback_retention_target=4320 scope=both;
- System altered.
c. 开启 flashback (10g 在 mount 开启)
(4) 确定闪回开启
- SQL > alter database flashback on;
- Database altered.
(5) 关闭闪回
- SQL> select flashback_on from v$database;
- FLASHBACK_ON
- ------------------
- YES
2、闪回使用
- SQL > alter database flashback off;
- Database altered.
(1) 闪回查询闪回查询主要是根据 Undo 表空间数据进行多版本查询,针对 v$ 和 x$ 动态性能视图无效,但对 DBA_、ALL_、USER_是有效的 a. 闪回查询允许用户查询过去某个时间点的数据,用以重构由于意外删除或更改的数据,数据不会变化。
- SQL> select * from scott.dept;
- DEPTNO DNAME LOC
- ---------- -------------- -------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
- SQL> delete from scott.dept where deptno=40;
- 1 row deleted.
- SQL> commit;
- Commit complete.
- SQL> select * from scott.dept as of timestamp sysdate-10/1440;
- DEPTNO DNAME LOC
- ---------- -------------- -------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
- SQL> select * from scott.dept as of timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
- DEPTNO DNAME LOC
- ---------- -------------- -------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
- SQL> select * from scott.dept as of scn 16801523;
- DEPTNO DNAME LOC
- ---------- -------------- -------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
b. 闪回版本查询
用于查询行级数据库随时间变化的方法 c. 闪回事务查询用于提供查看事务级别数据库变化的方法 (2) 闪回表 (update/insert/delete) 闪回表就是对表的数据做回退,回退到之前的某个时间点,其利用的是 undo 的历史数据,与 undo_retention 设置有关,默认是 14400 分钟(1 天)同样,sys 用户表空间不支持闪回表, 要想表闪回,需要允许表启动行迁移 (row movement) 闪回表示例:
(3) 闪回 DROP(drop table)
- SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
- flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss')
- ERROR at line 1:
- ORA-08189: cannot flashback the table because row movement is not enabled
- SQL> select row_movement from dba_tables where table_name='DEPT' and owner='SCOTT';
- ROW_MOVE
- --------
- DISABLED
- SQL> alter table scott.dept enable row movement;
- Table altered.
- SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
- Flashback complete.
- SQL> select * from scott.dept;
- DEPTNO DNAME LOC
- ---------- -------------- -------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
- SQL> alter table scott.dept disable row movement;
- Table altered.
当一个表被 drop 掉,表会被放入 recyclebin 回收站,可通过回收站做表的闪回。表上的索引、约束等同样会被恢复不支持 sys/system 用户表空间对象,可通过 alter system set recyclebin=off; 关闭回收站功能闪回 DROP 示例:
- SQL> select * from t ;
- ID NAME
- ---------- ---------------------------------------
- 1
- 2
- 3
- 4
- 30
- SQL> drop table t;
- Table dropped.
- SQL> show recyclebin;
- ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
- ---------------- ------------------------------ ------------ -------------------
- T BIN$YEh2QcvZdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:02:06
- SQL> flashback table t to before drop;
- Flashback complete.
- SQL> select * from t;
- ID NAME
- ---------- -------------------------------------
- 1
- 2
- 3
- 4
- 30
备注:即使不开始 flashback,只要开启了 recyclebin,那么就可以闪回 DROP 表。
但如果连续覆盖,就需要指定恢复的表名,如果已经存在表,则需要恢复重命名。
(4) 闪回数据库 (truncate / 多表数据变更)
- SQL> show recyclebin;
- ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
- ---------------- ------------------------------ ------------ -------------------
- T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54
- T BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:27
- SQL> flashback table "BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0" to before drop ;
- Flashback complete.
- SQL> show recyclebin;
- ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
- ---------------- ------------------------------ ------------ -------------------
- T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54
- SQL> flashback table t to before drop rename to tt;
- Flashback complete.
数据库闪回必须在 mounted 状态下进行,基于快照的可以再 open 下进行闪回库闪回数据库主要是将数据库还原值过去的某个时间点或 SCN,用于数据库出现逻辑错误时,需要 open database resetlogsa. 全库闪回数据库闪回示例
b. 快照闪回
- SQL> select * from scott.EMP;
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
- 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
- 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
- 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
- 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
- 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
- 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
- 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
- 7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
- 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
- 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
- 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
- 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
- 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
- 14 rows selected.
- SQL> truncate table scott.EMP;
- 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 9395242112 bytes
- Database Buffers 8.4557E+10 bytes
- Redo Buffers 112766976 bytes
- Database mounted.
- SQL> flashback database to timestamp to_timestamp('2017-12-14 14:12:46','yyyy-mm-dd HH24:MI:SS');
- Flashback complete.
- SQL> alter database open resetlogs;
- Database altered.
- SQL> select * from scott.emp;
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
- 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
- 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
- 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
- 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
- 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
- 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
- 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
- 7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
- 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
- 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
- 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
- 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
- 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
- 14 rows selected.
针对主库和备库都可以创建闪回快照点,然后恢复到指定的快照点,但主库一旦恢复到快照点,备库的同步则需要重新同步
c. 闪回 snapshot standby
- SQL> select * from scott.dept;
- DEPTNO DNAME LOC ADDR
- ---------- -------------- ------------- ------------------------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 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';
此功能在 11GR2 非常实用,可自动创建闪回点、开启闪回日志,可完成线上数据测试后,然后做数据库闪回恢复主备关系
(5) 闪回归档 (增加、修改、重命名、删除表的列、truncate 表、修改表的约束、以及修改分区表的分区规范)
- 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
- ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
- 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
- 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
- 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
- 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
- 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
- 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
- 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
- 7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
- 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
- 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
- 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
- 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
- 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
- 14 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
- ---------- -------------- ------------- ------------------------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 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
- ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
- 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
- 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
- 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
- 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
- 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
- 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
- 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
- 7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
- 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
- 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
- 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
- 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
- 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
- 14 rows selected.
- SQL> alter database recover managed standby database using current logfile disconnect;
- Database altered.
- SQL> select * from scott.t;
- DEPTNO DNAME LOC ADDR
- ---------- -------------- ------------- ------------------------------
- 10 ACCOUNTING NEW YORK
- 20 RESEARCH DALLAS
- 30 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
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) 查看数据库状态
(2) 获取当前数据库的系统时间和 SCN
- 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
(3) 查看数据库可恢复的时间点
- 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
(4) 查看闪回日志空间情况
- 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
(5)SCN 和 timestamp 装换关系查询
- 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
(6) 查看闪回 restore_point
- select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
(7) 闪回语句
- select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;
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) 闪回空间爆满问题处理请参照: http://www.linuxidc.com/Linux/2017-11/148512.htm来源: http://www.linuxidc.com/Linux/2017-12/149630.htm