二、Oracle闪回利用详解 1、闪回开启 (1)开启闪回必要条件 a.开启归档日记
SQL> archive log list; b.设置合理的闪回区
db_recovery_file_dest:指定闪回规复区的位置
db_recovery_file_dest_size:指定闪回规复区的可用空间巨细
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟(1天),实际取决于闪回区巨细 (2)查抄是否开启闪回
SQL> select flashback_on from v$database; (3)开启闪回 a.开启归档
mount状态:alter database archivelog; b.设置闪回区(先巨细,后位置,反之报错) 设置闪回区位置:
SQL> alter system set db_recovery_file_dest='/app/fast_recovery_area' scope=both; 设置闪回区巨细:
SQL> alter system set db_recovery_file_dest_size=10G scope=both; 设置闪回区位置:
SQL> alter system set db_recovery_file_dest='/app/fast_recovery_area' scope=both; 设置闪回目的为5天,以分钟为单位,每天为1440分钟:
SQL> alter system set db_flashback_retention_target=4320 scope=both; c.开启flashback (10g在mount开启)
SQL> alter database flashback on; (4)确定闪回开启
SQL> select flashback_on from v$database; (5)关闭闪回
SQL> alter database flashback off; 2、闪回利用 (1)闪回查询
SQL> select * from yangqingbo_ghq.dept;
DEPTNO DNAME LOC
———— ———— ————
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> delete from yangqingbo_ghq.dept where deptno=40; commit;
查询两分钟时 表的信息
SQL> select * from yangqingbo_ghq.dept as of timestamp sysdate - 2/1440;
SQL> select * from yangqingbo_ghq.dept;
查询指定时间表的信息(丢失数据时加筛选条件,找到这部分这个时候的数据给开发)
SQL> select * from scott.dept as of timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
SQL> select * from scott.dept as of scn 1166880011552233;
b.闪回版本查询
用于查询行级数据库随时间变化的方法 c.闪回事务查询
用于提供查看事务级别数据库变化的方法 (2)闪回表(update/insert/delete) A.闪回表示例: a.将表闪回到指定时间点(2024-03-03 16:30:00删除DEPTNO=40)
SQL> flashback table yangqingbo_ghq.dept to timestamp to_timestamp('2024-03-03 16:30:00','yyyy-mm-dd hh24:mi:ss'); b.查看scott.dept表是否开启行迁移
SQL>select row_movement from dba_tables where table_name='DEPT' and owner='YANGQINGBO_GHQ'; c.被闪回的表必须启用行移动功能
SQL> alter table YANGQINGBO_GHQ.dept enable row movement;
d.再次将表闪回到指定时间点
SQL> flashback table scott.dept to timestamp to_timestamp('2024-03-03 16:30:00','yyyy-mm-dd hh24:mi:ss'); e.验证表信息,已闪回到2024-03-03 16:30:00
SQL> select * from scott.dept; f.关闭表的行移动功能 (如果一块数据磁盘空间无法保存某个数据时(比如以前是1k,现在update到2k,而当前块的空闲空间不足1k),则会将新的数据保存到别的一个新的块里,然后在以前的块保存一个新位置的地点连接) 但是“行移动”在默认情况下是禁用的,所以启用它会导致一些性能问题。固然,当一行移动时 - 它将被更新,删除并重新插入,并相应调整所有相关的索引条目。 rowid在行被移动后会被修改(我很确定我们的系统中不利用rowid,所以这不会成为问题) SQL> alter table YANGQINGBO_GHQ.dept disable row movement; (3)闪回DROP(drop table) 当一个表被drop掉,表会被放入recyclebin接纳站,可通过接纳站做表的闪回。表上的索引、约束等同样会被规复不支持sys/system用户表空间对象,可通过alter system set recyclebin=off;关闭接纳站功能 A.闪回DROP示例: 接纳站功能要打开 开启接纳站
SQL> ALTER SYSTEM SET RECYCLEBIN=ON;
SQL> SHOW PARAMETER RECYCLEBIN; a.查看表
SQL> select * from yangqingbo_ghq.dept; ; b.删除表
SQL> drop table yangqingbo_ghq.dept; c.接纳站里查看被删除表的信息
SQL> show recyclebin; d.闪回drop表
SQL> flashback table yangqingbo_ghq.dept to before drop; e.查看表(已规复)
SQL> select * from yangqingbo_ghq.dept; 备注:即使不开始flashback,只要开启了recyclebin,那么就可以闪回DROP表。 但如果连续覆盖,就必要指定规复的表名,如果已经存在表,则必要规复重命名。 三、备注 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; (2)获取当前数据库的系统时间和SCN
SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt , dbms_flashback.get_system_change_number scn from dual;
(3)查看数据库可规复的时间点
SQL> select * from V$FLASHBACK_DATABASE_LOG; (4)查看闪回日记空间情况
SQL> select * from V$flashback_database_stat; (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;