一、闪回技术配置
1、oracle 处于归档模式
2、用 alter database flashback on 开启闪回
1)配置oracle运行的模式
在sqlplus下以sys用户运行archive log list 命令
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 481
Current log sequence 483
SQL>
database log mode 显示为No Archive Mode 证明数据库不处于归档模式,所以要开启归档模式,但是要开启归档模式,数据库必须要处于mount状态,因此要关闭数据库,重启数据库到mount状态
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 722366464 bytes
Fixed Size 2216864 bytes
Variable Size 511708256 bytes
Database Buffers 205520896 bytes
Redo Buffers 2920448 bytes
Database mounted.
SQL> alter database archivelog ;
Database altered.
现在输入archivelog list命令可以查看到
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 483
Next log sequence to archive 485
Current log sequence 485
SQL>
Database log mode Archive Mode 证明数据库已经处于归档模式
注* alter database archivelog 是在oracle mount状态下使用
2)开启闪回
直接在mount状态执行alter database flashback on; 命令
SQL> alter database flashback on;
Database altered.
修改完之后可以在v$database里面查看运行模式和是否开启了闪回
SQL> select LOG_MODE,FLASHBACK_ON from v$database ;
LOG_MODE FLASHBACK_ON
ARCHIVELOG YES
SQL>
注*该命令也可以在oracle open状态下执行
二、闪回数据库
1、闪回命令
sql: 1、flashback database to timestamp (sysdate-1/24);–闪回一个小时
2、flashback database to scn 53943;
3、flashback database to restore point b4_load;
SQL> conn scott/oracle
Connected.
SQL> select * from t2;
no rows selected
SQL> show user;
USER is “SCOTT”
SQL> drop table t2; ———–册除表
Table dropped.
SQL> conn /as sysdba
Connected.
SQL> shutdown immediate —-关闭数据库
ORACLE instance shut down.
SQL> startup mount;——-开启数据到mount状态
ORACLE instance started.
Total System Global Area 722366464 bytes
Fixed Size 2216864 bytes
Variable Size 511708256 bytes
Database Buffers 205520896 bytes
Redo Buffers 2920448 bytes
Database mounted.
SQL> flashback database to timestamp (sysdate-1/144);—–闪回到十分钟前
Flashback complete.
SQL> alter database open read only ; —–开启数据只读验证数据
Database altered.
SQL> select * from t2;
select * from t2
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> conn scott/oracle
Connected.
SQL> select * from t2;——-t2表已经恢复
no rows selected
SQL> conn /as sysdba
Connected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 722366464 bytes
Fixed Size 2216864 bytes
Variable Size 511708256 bytes
Database Buffers 205520896 bytes
Redo Buffers 2920448 bytes
Database mounted.
SQL> alter database open resetlogs ;——–开启数据库并且重置日志
Database altered.
SQL> conn scott/oracle
Connected.
SQL> select* from t2;
no rows selected
SQL>
注*此例权是一个简单的举例,在实际中不可能因为一个表的数据被删或者表被drop而回滚数据库
不能使用闪回数据库例子
1、 数据库文件被删除
2、当控制文件被标志为脱节
3、 数据库被删除
4 、当数据库data file 被reset之后,只可以闪回reset之后的操作
二、闪回册除的平
1、recyclebin(回收站)
oracle 的回收站类似于windows的回收站,当我们drop table 的时候它会像windows一样把表信息从数据字典删除并且放到回收站存放着。此时表里面的数据还存在数据块上没有删除。
2、查看recyclebin功能是否开启
SQL> show parameter recyclebin;
NAME TYPE VALUE
recyclebin string on
SQL>
此时recyclebin的状态为on,表示回收功能已经开启
3、闪回删除的表
1)SQL> select * from tt;
ID
1
SQL>
现有表tt里面存在一条数据
2)删除表tt
SQL> drop table tt;
Table dropped.
SQL> select * from tt;
select * from tt
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL>
表tt已经不存在
3)查看回收站信息
SQL> select object_name,original_name from user_recyclebin;
OBJECT_NAME
ORIGINAL_NAME
BIN
YUGR1XSVuELgUAB/AQAL4g==
0
TT
SQL>
或者
SQL> select object_name,original_name from recyclebin;
OBJECT_NAME
ORIGINAL_NAME
BIN
YUGR1XSVuELgUAB/AQAL4g==
0
TT
SQL>
或者
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
TT BIN
YUGR1XSVuELgUAB/AQAL4g==
0 TABLE 2017-12-27:00:13:56
SQL>
又或者可以以超级管理员查看dba_recyclebin信息
OBJECT_NAME:册除后存放到回收站的表名
ORIGINAL_NAME:删除前的表名
4)闪回删除的表
SQL> flashback table tt to before drop;
Flashback complete.
SQL>
SQL> select * from tt;
ID
1
SQL>
表已经闪回,并且可以查询
ps:平时我们drop table 时 都会经过回收站 如果想删除不经过回收站可以用以下语句
drop table tt purge;
purge table tt;
drop tablespace test including contents;
如果某个表空间多个表被drop 并且数据还存在硬盘上,如果想完全释放些空间
purge table “object_name”
purge tablespace tablespacesname;
三、闪回表数据
SQL> show parameter undo;
NAME TYPE VALUE
—————- ——————– ———————-
undo_management string AUTO
undo_retention integer 86400
undo_tablespace string UNDOTBS1
SQL>
undo_retention 表示保留删回时长
alter tablespace undotbs1 retention guarantee;
如果设置retention guarantee 那么undo表空间不够用时数据库会hang住 具体内容可参照 http://www.linuxidc.com/Linux/2016-05/131842.htm(这个不是必选项)
1)测试
SQL> conn scott/scott;
Connected.
SQL> select * from tt;
ID
1
SQL>
SQL> select to_char(sysdate ,’yyyy-mm-dd hh24:mi:ss’)from dual;
TO_CHAR(SYSDATE,’YYYY-MM-DDHH24:MI:SS’
2017-12-27 00:28:58
SQL>
SQL> delete from tt;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from tt;
no rows selected
SQL> flashback table tt to timestamp to_date(‘2017-12-27 00:28:58’,’yyyy-mm-dd hh24:mi:ss’);
flashback table tt to timestamp to_date(‘2017-12-27 00:28:58’,’yyyy-mm-dd hh24:mi:ss’)
*
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
SQL> alter table tt enable row movement;
Table altered.
SQL> flashback table tt to timestamp to_date(‘2017-12-27 00:28:58’,’yyyy-mm-dd hh24:mi:ss’);
Flashback complete.
SQL> select * from tt;
ID
1
SQL>
alter table tt enable row movement; 此语句是开启行移动