当前位置:  数据库>oracle

Oracle 闪回技术

    来源: 互联网  发布时间:2017-06-26

    本文导语: 一、配置闪回数据库1、数据库处于归档日志模式SQL> select log_mode from v$database;  LOG_MODE                                                                        ------------                                             ...

一、配置闪回数据库
1、数据库处于归档日志模式
SQL> select log_mode from v$database;
 
LOG_MODE                                                                       
------------                                                                   
ARCHIVELOG 
2、创建闪回恢复区
SQL> alter system set db_recovery_file_dest_size=10G;
System altered.
SQL> alter system set db_recovery_file_dest='D:Oracleproduct11.2.0dbhome_1RDBMS';
System altered.
3、设置闪回保留目标时间
SQL> alter system set db_flashback_retention_target=240;
System altered.
--DB_FLASHBACK_RETENTION_TARGET参数控制保留时间,单位是分钟,默认值是1天。闪回日志空间以循环的方式重用,更新的数据将覆盖旧的数据。(本例为保留4小时)
4、关闭数据库并启动到MOUNT状态
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 3373858816 bytes                                     
Fixed Size                  2180424 bytes                                     
Variable Size            1845496504 bytes                                     
Database Buffers        1509949440 bytes                                     
Redo Buffers              16232448 bytes                                     
Database mounted.
5、启用闪回日志记录并打开数据库
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
6、查看是否启用闪回日志记录
SQL> select flashback_on from v$database;
FLASHBACK_ON                                                                   
------------------                                                             
YES                                                                           
二、使用sqlplus闪回数据库
1、创建一个临时表
SQL> create table t as select * from dba_objects;
Table created.
2、查询当前系统时间表
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY                                                           
-------------------                                                           
2016-03-15 11:34:21                                                           
3、对t表做一些DML操作
SQL> delete from t;
72464 rows deleted.
SQL> commit;
Commit complete.
SQL> insert into t select * from dba_objects where rownum commit;
Commit complete.
SQL> select count(*) from t;
  COUNT(*)                                                                     
----------                                                                     
      100                                                                     
4、把数据库闪回到步骤2查询出的时间
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 3373858816 bytes                                     
Fixed Size                  2180424 bytes                                     
Variable Size            1845496504 bytes                                     
Database Buffers        1509949440 bytes                                     
Redo Buffers              16232448 bytes                                     
Database mounted.
SQL> flashback database to timestamp to_timestamp('2016-03-15 11:34:21','yyyy-mm-dd hh24:mi:ss');--可以接受时间戳或系统变更号(SCN)参数,不接受日期或日志世界的序列号
Flashback complete.
5、以只读方式打开数据库查询是否闪回成功 --注意使用read only方式打开数据库,验证闪回情况。
SQL> alter database open read only;
Database altered.
SQL> select count(*) from t;
  COUNT(*)                                                                     
----------                                                                     
    72464                                                                     
6、闪回成功后,以resetlogs方式打开数据库
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 3373858816 bytes                                     
Fixed Size                  2180424 bytes                                     
Variable Size            1845496504 bytes                                     
Database Buffers        1509949440 bytes                                     
Redo Buffers              16232448 bytes                                     
Database mounted.
SQL> alter database open resetlogs;
Database altered.
SQL> select count(*) from t;
  COUNT(*)                                                                     
----------                                                                     
    72464                                                                     
数据库闪回成功
注:如果flashback闪回的数据库时间太早,可以使用RECOVER DATABASE UNTILE TIME times恢复到后边的时间点。
--也可以使用RMAN进行闪回
RMAN>flashback database to time = to_date('2016-03-15 11:34:21','yyyy-mm-dd hh24:mi:ss');
RMAN>flashback database to scn = 2728665;
RMAN>flash backup to sequence = 2123 thread = 1;
三、限制生成的闪回数据量
1、关闭表空间闪回属性
ALTER TABLESPACE tablespace_name FLASHBACK OFF;
2、开启表空间闪回属性
ALTER TABLESPACE tablespace_name FLASHBACK ON;--只能在mount状态下执行
3、查看表空间的闪回属性
select name,flashback_on from v$tablespace;
四、设置sqlplus提示符
SQL> set sqlprompt "_user'@'_connect_identifier>"
SYS@ocp>
--为了对所有的sqlplus会话自动设置sqlprompt。将上面的命令放置在ORACLE_HOME/sqlplus/admin目录中的glogin.sql文件中
五、闪回删除
1、创建一个练习用户
SYS@ocp>create user dropper identified by dropper;
User created.
SYS@ocp>grant create session,resource to dropper;
Grant succeeded.
SYS@ocp>connect dropper/dropper;
Connected.
2、创建一个带有索引和约束的表,并插入一行
DROPPER@ocp>create table names(name varchar2(10));
Table created.
DROPPER@ocp>create index name_idx on names(name);
Index created.
DROPPER@ocp>alter table names add constraint name_u unique (name);
Table altered.
DROPPER@ocp>insert into names values('John');
1 row created.
DROPPER@ocp>commit;
Commit complete.
3、确认模式的内容
DROPPER@ocp>select object_name,object_type from user_objects;
OBJECT_NAME  OBJECT_TYPE                                                                   
-------------------------------------
      NAME_IDX      INDEX                                                       
  NAMES        TABLE                                                 
DROPPER@ocp>select constraint_name,constraint_type,table_name from user_constraints;
CONSTRAINT_NAME                C TABLE_NAME                                   
------------------------------ - ------------------------------               
NAME_U                        U NAMES                                         
4、删除该表
DROPPER@ocp>drop table names;
Table dropped.
5、查询回收站查看原始名称到回收站名称的映射
DROPPER@ocp>select object_name,original_name,type from user_recyclebin;
OBJECT_NAME                    ORIGINAL_NAME        TYPE                                   
------------------------------ ------------------  -------------------------             
 BIN$q+6VgWdBRGOykqOJfCyZNg==$0 NAME_IDX            INDEX                         
 BIN$u1TeIIlLS3isIPDvpSTblQ==$0 NAMES                TABLE                       
 --注:视图并没有显示约束                                                                           
6、可以使用回收站的对象名进行查询,但不可做DML语句
DROPPER@ocp>select * from "BIN$u1TeIIlLS3isIPDvpSTblQ==$0";
NAME                                                                           
----------                                                                     
John                                                                           
DROPPER@ocp>insert into "BIN$u1TeIIlLS3isIPDvpSTblQ==$0" values('Root');
insert into "BIN$u1TeIIlLS3isIPDvpSTblQ==$0" values('Root')
            *
ERROR at line 1:
ORA-38301: can not perform DDL/DML over objects in Recycle Bin
7、使用FLASHBACK drop恢复表
DROPPER@ocp>flashback table names to before drop;
Flashback complete.
8、查询模式中的内容
DROPPER@ocp>select * from names;
NAME                                                                           
----------                                                                     
John                                                                           
DROPPER@ocp>select object_name,original_name,type from user_recyclebin;
no rows selected
DROPPER@ocp>select object_name,object_type from user_objects;
OBJECT_NAME                      OBJECT_TYPE       
-------------------------------------------------
BIN$q+6VgWdBRGOykqOJfCyZNg==$0  INDEX                                                         
NAMES                            TABLE                               
DROPPER@ocp>select constraint_name,constraint_type,table_name from user_constraints;
CONSTRAINT_NAME                C TABLE_NAME                                   
------------------------------ - ------------------------------               
BIN$cLAR1tu9Toi3u5qKdAbvIw==$0 U NAMES                                         
9、将索引和约束重命名回原先的名称
DROPPER@ocp>alter index "BIN$q+6VgWdBRGOykqOJfCyZNg==$0" rename to name_idx;
Index altered.
DROPPER@ocp>alter table names rename constraint "BIN$cLAR1tu9Toi3u5qKdAbvIw==$0" to name_u;
Table altered.
DROPPER@ocp>select object_name,object_type from user_objects;
OBJECT_NAME    OBJECT_TYPE       
----------------------------------                                                           
NAME_IDX        INDEX                                                                                                                                             
NAMES            TABLE                                                                                     
DROPPER@ocp>select constraint_name,constraint_type,table_name from user_constraints;
CONSTRAINT_NAME                C TABLE_NAME                                   
------------------------------ - ------------------------------               
NAME_U                        U NAMES                                         
10、使用SYS用户删除DROPPER模式
SYS@ocp>drop user dropper cascade;
User dropped.
11、查询DBA_RECYCLEBIN视图来证实确实删除了用户DROPPER拥有的所有对象。
SYS@ocp>select count(*) from dba_recyclebin where owner='DROPPER';
  COUNT(*)                                                                     
----------                                                                     
        0                                                                     
注:如果回收站中两两个表的原始名称相同,默认情况下,Flashback Drop命令总是恢复最新版本的表,但如果不是想要的版本,可以指定希望恢复的版本的回收站名称,而不是原先的名称。
SQL>flashback table "BIN$q+6VgWdBRGOykqOJfCyZNg==$0" to before drop;
六、管理回收站
SQL>show recyclebin;
user_recyclebin
dba_recyclebin
注:Flashback Drop不适用于存储在SYSTEM表空间中的表,直接将它们删掉并清除了
永久清除删掉的对象
DROP TABLE table_name PURGE;--删除表并不将它转移到回收站
PURGE TABLE table_name;--从回收站中清除表。如果存在多个具有相同原始名称的对象,清除时间最久的对象。也可以通过指定回收站名称来避免这种混淆。
PURGE INDEX index_name;--从回收站中消除索引。同样可以指定原始名称或回收站名称。
PURGE TABLESPACE tablespace_name;--从表空间中清除所有删除的对象。
PURGE TABLESPACE tablespace_name USER user_name;--从表空间中清除属于一个用户的所有删除的对象。
PURGE USER_RECYCLEBIN;--清除用户删除文件的所有对象。
PURGE DBA_RECYCLEBIN;--清除所有删除的对象,需要dba权限。
七、闪回查询
--所有形式的闪回查询依赖撤销数据来重构它在过去某个时间点的数据。
1、基本的闪回查询
1.1创建测试表并插入测试数据
USER1@mydb>create table regions (region_id number,region_name varchar2(20));
Table created.
USER1@mydb>insert into regions values(1,'Europe');
1 row created.
USER1@mydb>insert into regions values(2,'Americas');
1 row created.
USER1@mydb>insert into regions values(3,'Asia');
1 row created.
USER1@mydb>insert into regions values(4,'Middle East');
1 row created.
USER1@mydb>commit;
Commit complete.
1.2查询系统当前时间,删除部分数据并确认
USER1@mydb>select sysdate from dual;
SYSDATE                                                                       
-------------------                                                           
2016-03-15 19:08:16                                                           
USER1@mydb>delete from regions where region_name like 'A%';
2 rows deleted.
USER1@mydb>commit;
Commit complete.
USER1@mydb>select * from regions;
 REGION_ID REGION_NAME                                                         
---------- --------------------                                               
        1 Europe                                                             
        4 Middle East                                                         
1.3进行闪回查询
USER1@mydb>select * from regions as of timestamp to_timestamp('2016-03-15 19:08:16','yyyy-mm-dd hh24:mi:ss');
 REGION_ID REGION_NAME                                                         
---------- --------------------                                               
        1 Europe                                                             
        2 Americas                                                           
        3 Asia                                                               
        4 Middle East                                                         
1.4查询闪回时间点到现在的差异
USER1@mydb>select * from regions as of timestamp to_timestamp('2016-03-15 19:08:16','yyyy-mm-dd hh24:mi:ss') minus select * from regions;
 REGION_ID REGION_NAME                                                         
---------- --------------------                                               
        2 Americas                                                           
        3 Asia                                                               
可以使用DBMS_FLASHBACK程序包将整个会话回退到过去某个时间,对其他会话没有影响。处于闪回模式中不支持DMS语句。
USER1@mydb>execute dbms_flashback.enable_at_time(to_timestamp('2016-03-15 19:08:16','yyyy-mm-dd hh24:mi:ss'));
PL/SQL procedure successfully completed.
USER1@mydb>select * from regions;
 REGION_ID REGION_NAME
---------- --------------------
        1 Europe
        2 Americas
        3 Asia
        4 Middle East
USER1@mydb>execute dbms_flashback.disable;
PL/SQL procedure successfully completed.
select * from table_name as of timestamp(systimestamp-interval '30' minute);
select * from table_name as of timestamp(systimestamp-interval '1' hour);
2、闪回表查询  --启用表闪回的第一步是在表上支持行移动。
2.1创建测试表插入测试数据
HR@mydb>create table dept (dept_id number,dept_name varchar2(20));
Table created.
HR@mydb>alter table dept add constraint pk_dept primary key (dept_id);
Table altered.
HR@mydb>create table emp (emp_id number,name varchar2(20),dept_id number);
Table created.
HR@mydb>alter table emp add constraint fk_emp foreign key (dept_id) references dept(dept_id);
Table altered.
HR@mydb>insert into dept values(1,'SUPPORT');
1 row created.
HR@mydb>select * from dept;
  DEPT_ID DEPT_NAME                                                           
---------- --------------------                                               
        1 SUPPORT                                                             
HR@mydb>commit;
Commit complete.
HR@mydb>insert into emp values(101,'John',1);
1 row created.
HR@mydb>commit;
Commit complete.
HR@mydb>select * from emp;
    EMP_ID NAME                    DEPT_ID                                     
---------- -------------------- ----------                                     
      101 John                          1   
2.2、查看当前系统时间
HR@mydb>select sysdate from dual;
SYSDATE                                                                       
-------------------                                                           
2016-03-15 21:37:36 
2.3、删除测试表数据
HR@mydb>delete from emp where emp_id=101;
1 row deleted.
HR@mydb>delete from dept where dept_id=1;
1 row deleted.
HR@mydb>commit;
Commit complete.
2.4、开始闪回表
flashback table table_name to timestamp to_timestamp(systimestamp-interval '30' minute);
HR@mydb>flashback table emp to timestamp to_timestamp('2016-03-15 21:37:36','yyyy-mm-dd hh24:mi:ss');
flashback table emp to timestamp to_timestamp('2016-03-15 21:37:36','yyyy-mm-dd hh24:mi:ss')
                *
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
--提示需要打开表的row movement
HR@mydb>alter table emp enable row movement;
Table altered.
HR@mydb>alter table dept enable row movement;
Table altered.
HR@mydb>flashback table emp to timestamp to_timestamp('2016-03-15 21:37:36','yyyy-mm-dd hh24:mi:ss');
flashback table emp to timestamp to_timestamp('2016-03-15 21:37:36','yyyy-mm-dd hh24:mi:ss')
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02291: integrity constraint (HR.FK_EMP) violated - parent key not found
--提示有外键约束
--两个表同时闪回避免约束问题
HR@mydb>flashback table emp,dept to timestamp to_timestamp('2016-03-15 21:37:36','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
2.5、检查闪回结果
HR@mydb>select * from dept;
  DEPT_ID DEPT_NAME                                                           
---------- --------------------                                               
        1 SUPPORT           
HR@mydb>select * from emp;
    EMP_ID NAME                    DEPT_ID                                     
---------- -------------------- ----------                                     
      101 John                          1   
--语法的变型允许闪回到一个系统变更号并在操作期间激活DML触发器。
flashback table emp,dept to scn 6539425 enable triggers;
3、闪回版本查询
--使用VERSIONS BETWEEN关键字
--根据scn的返回版本
select emp_id, versions_xid,versions_startscn,versions_endscn,versions_operation from emp versions between scn minvalue and maxvalue where emp_id=101;
--根据时间戳的返回版本
select emp_id, versions_xid,versions_starttime,versions_endtime,versions_operation from emp versions between timestamp (systimestamp - 25/1440) and systimestamp where emp_id=101;
4、闪回事务
--使用闪回事务需要开启库的最小附加日志 alter database add supplemental log data;
4.1创建测试表并插入数据
USER1@mydb>create table countries(name varchar2(10));
Table created.
USER1@mydb>alter table countries enable row movement;
Table altered.
USER1@mydb>insert into countries values('Zambia');
1 row created.
USER1@mydb>insert into countries values('Zimbabwe');
1 row created.
USER1@mydb>insert into countries values('Zamibia');
1 row created.
USER1@mydb>commit;
Commit complete.
USER1@mydb>select * from countries;
NAME                                                                           
----------                                                                     
Zambia                                                                         
Zimbabwe                                                                       
Zamibia   
4.2对测试表进行更新                                                                   
USER1@mydb>update countries set name='Namibia';
3 rows updated.
USER1@mydb>commit;
Commit complete.
USER1@mydb>select * from countries;
NAME                                                                           
----------                                                                     
Namibia                                                                       
Namibia                                                                       
Namibia 
4.3查询行的所有版本,确定错误的事务ID                                                                     
USER1@mydb>select name,versions_xid,versions_operation from countries versions between scn minvalue and maxvalue ;
NAME      VERSIONS_XID    V                                                 
---------- ---------------- -                                                 
Namibia    080007000F040000 U                                                 
Namibia    080007000F040000 U                                                 
Namibia    080007000F040000 U                                                 
Zamibia    040009003C030000 I                                                 
Zimbabwe  040009003C030000 I                                                 
Zambia    040009003C030000 I                                                 
6 rows selected.
4.4查询FLASHBACK_TARNSACTION_QUERY视图看到该事务影响的行,并给出如何取消影响的SQL语句。
--XID列是RAW类型的,VERSIONS_XID伪列是十六进制的,需要使用类型强制转换函数。
SYS@mydb>select operation,undo_sql from flashback_transaction_query where xid=hextoraw('080007000F040000');
OPERATIO UNDO_SQL
-------- ------------------------------------------------------------------------------------------------------------------------
UPDATE  update "USER1"."COUNTRIES" set "NAME" = 'Zamibia' where ROWID = 'AAASjKAAEAAAACVAAC';
UPDATE  update "USER1"."COUNTRIES" set "NAME" = 'Zimbabwe' where ROWID = 'AAASjKAAEAAAACVAAB';
UPDATE  update "USER1"."COUNTRIES" set "NAME" = 'Zambia' where ROWID = 'AAASjKAAEAAAACVAAA';
--还可以使用DBMS_FLASHBACK包进行闪回事务
execute sys.dbms_flashback.transaction_backout(numtxns=>2,xids=>sys.xid_array('080007000F040000'),options=>dbms_flashback.cascade);
5、闪回数据归档  --保证将表闪回到过去任何时间。
可以在预先存在的表空间中创建归档,但在新表空间中更加明智。
create flashback archive default hrarch tablespace fbda1 quota 10g retention 5 year;
--default关键字表示除非另行说明将用作所有表的归档。
alter flashback archive hrarch set default;
--quota显示归档在表空间中占用的空间。可以在原有的表空间或另一个表空间中添加更多的空间。
alter flashback archive hrarch add tablespace fbda2 quota 10g;
--可以调整保留时间
alter flashback archive hrarch modify retention 7 year;
--数据超过了指定的保留期限,FBDA进程自动从归档中删除。在过期之前也可以手动进行删除
alter flashback archive hrarch purge before timestamp to_timestamp('01-01-2009','dd-mm-yyyy');
--只有FLASHBACK ARCHIVE ADMINISTER系统权限能够创建、修改或删除归档以及控制归档的保留和清除。
grant flashback archive administer to fbdaadmin;
--必须授予用户归档的FLASHBACK ARCHIVE权限以便能够对表进行归档。
grant flashback archive on hrarch to hr;
--启用表的归档保护
alter table hr.employees flashback archive hrarch;
--删除表的归档保护
alter table hr.employees no flashback archive;
--删除闪回数据归档
drop flashback archive hrarch;

参考 OCP/OCA认证考试指南全册 Oracle 11g(1Z0-051,1Z0-052,1Z0-053)中文完整版PDF 下载见


    
 
 

您可能感兴趣的文章:

  • Oracle 10g和Oracle 11g网格技术介绍
  • Oracle数据库技术(38)
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Oracle数据库技术(37)
  • Oracle 12c的九大最新技术特性介绍
  • 聘请JSP/BEA/Oracle辅导老师解决技术问题
  • oracle远程复制及异地容灾的技术解决方案
  • 如何从Oracle技术支持获得更多
  • 详解如何应用改变跟踪技术加速Oracle递增备份
  • Oracle公司的据中心很大部分采用开源技术
  • Oracle注射技术——Oracle+nc注射
  • Oracle如何致力于增强Linux技术
  • 基于Oracle的面向对象技术入门基础简析开发者网络Oracle
  • 入侵Oracle数据库能用到的技术
  • Oracle三种上载文件技术
  • Oracle新技术对Linux的影响
  • Oracle数据库重复数据删除技术的四大优势
  • Oracle的数据字典技术简析
  • Oracle数据库常见技术问题解答篇
  • 详解Oracle分布式系统数据复制技术
  • Oracle技术平台助力数字化城市管理进程
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • javascript开源软件 iis7站长之家
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • ORACLE日期相关操作
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • ORACLE数据库常用字段数据类型介绍
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE中DBMS_RANDOM随机数生成包
  • Linux系统下Oracle的启动与Oracle监听的启动
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • 网间Oracle的连接,远程连接Oracle服务器??
  • 请教:.profile中:if [ -d /opt/oracle/db01/app/oracle/product/9.2.0 ]是什么意思?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3