当前位置:数据库 > Oracle >>

Oracle备份与恢复基础篇

Oracle备份与恢复基础篇
 
一、  oracle闪回技术
oracle闪回技术在9i中开始使用提供flashback queue操作,在10G中得到很大提升,增加了flashback table、flashbackdrop、flashback version query、flashback transaction query、flashback database、在11G中又增加了flashback data archive功能。
 
注意:除了flashback database 之外其他的闪回操作都是以undo segment中的内容为基础的,因此受限于undo_retenton参数,而且要启用flashback特性,必须启动自动撤销管理表空间。如下所示:
 
SQL> showparameter undo_



NAME                                 TYPE        VALUE

----------------------------------------------- ------------------------------

_optimizer_undo_cost_change          string      11.1.0.6

undo_management                      string      AUTO

undo_retention                       integer     900

undo_tablespace                      string      UNDOTBS1

SQL>

 

 
一) flashbacktable
 
闪回表的操作可以根据时间点,也可以根据具体的scn进行闪回操作,如下是根据时间点的操作。注意:这个过程完全是依赖于undo进行的,注意undo_retention和undo_management的设置。如下是操作内容:
 
 
 
 
如下是进行scn的恢复;
 
Select timestamp_to_scn(to_date(‘2012-12-24 18:01:27’,’yyyy-mm-ddhh24:mi:ss’));
 
Flashback to test9 to scn xxxxxx;
 
         注意:如果进行闪回表的操作时,提示需要启用行移动那么使用如下命令:
 
      Altertable test9 enable row movement;
 
二) flashbackdrop
 
当我们使用drop table删除一个表的时候,那么这个表只是形式上被删除了,那么如果前提是启用了oracle的回收站,那么该表则将放入回收站中。我们可以使用如下命令查看,是否启用了回收站:
 
 
此图表示已经启用。那么oracle的回收站到底在那呢?其实他就是在用户所在表空间中划分出来的一个逻辑的空间,其所能存储的数据依赖于该用户下的表空间。(当然此项功能对sys/system用户无效)
 
当发生空间不够时,Oracle会按照先入先出的顺序覆盖Recycle Bin中的对象。也可以手动的删除Recycle Bin占用的空间。
 
 
 
1). Purge tablespace tablespace_name : 用于清空表空间的Recycle Bin
 
 
 
2). Purge tablespace tablespace_name useruser_name: 清空指定表空间的Recycle Bin中指定用户的对象
 
 
 
3). Purge recyclebin: 删除当前用户的Recycle Bin中的对象
 
 
 
4). Purge dba_recyclebin: 删除所有用户的Recycle Bin中的对象,该命令要sysdba权限
 
 
 
5). Drop table table_name purge:  删除对象并且不放在Recycle Bin中,即永久的删除,不能用Flashback恢复。
 
 
 
6). Purge index recycle_bin_object_name:当想释放Recycle bin的空间,又想能恢复表时,可以通过释放该对象的index所占用的空间来缓解空间压力。因为索引是可以重建的
 
如下是一个使用实例:
 
 
上边所要操作的其实在一个用户数据字典中存在的一个数据事务。
 
当然我们可以通过user-recyclebin,查看更加详细的信息,如dropscn,operation等等。
 
思考:如果我删除的2个表明一样,那么我们怎么恢复呢。答案是通过ject_name进行查询事务,然后区别进行检索内容进行恢复,或是根据删除的时间orscn等等。
 
三) flashback queue
 
Flashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。Oracle就是采用多版本查询的一致性,应用undo的数据前镜像来保障查询的一致性,或者说通过undo进行构建一个查询的一个记录集,在此过程中不许要等待事务被提交或是事务回滚完成。Oracle有多中方式构建这个查询记录集,那么我们最简单的就是使用asof timestamp 或是as of scn。采用我的操作案例如下:
 
第一种方法:
 
SQL> select count(*) from test9;



  COUNT(*)

----------

         6



SQL> delete from test9 where rownum<3;



已删除2行。



SQL> commit;



提交完成。



SQL> select count(*) from test9;



  COUNT(*)

----------

         4



SQL> select count(*) from test9 as of timestampsysdate-3/1440;



  COUNT(*)

----------

         6



SQL> insert into test9 select * from test9 as oftimestamp sysdate-3/1440;



已创建6行。



SQL> select count(*) from test9;



  COUNT(*)

----------

        10

 

 
可以看出这个闪回操作比较适合delete from table;这样的语句。
 
当然我们这个技术使用也可以完全基于scn,那么在系统中就有一个smon_scn_time,我们可以通过如下命令进行查询:
 
Select scn,to_char(time_dp,’yyyy-mm-ddhh24:mi:ss’) from smon_scn_time;
 
这个scn和time是每隔5分钟进行一次同步。
 
 
 
可以看到我们已经发现具体操作的相关信息。注意,这个查询可以使基于时间的也可以使基于scn的。Starttime代表一行记录被执行时的时间,endtime代表被替代的时间。另外,我们还可以基于一段时间或是scn进行查询。当然了,这个功能也是受限于undo表空间的设置的。
 
四) flashbackversion query
 
通过flash query可以看出它只能看到某个时间点的操作变化,那么flashback version query就是在一个时间段内的操作变化。如:
 
Selectempno,versions_operation,versions_starttime,versions_endtime,versions_xid fromtest9 versions between timestamp minvalue and maxvalue;
 
另外注意ORA_ROWSCN伪劣的相关内容。当每次修改需要记录ORA_ROWSCN时可以在创建表时,使用rowdependencies.
 
五) flashbacktransaction query
 
同样该功能的实现都需要使用undo。那么该功能就是依赖于一个flashback_transaction_query这个视图,然后进行事务的修改。
 
我的操作如下:
 
SQL>select * from test9;



     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM    DEPTNO

-------------------- --------- ---------- -------------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-12月-80            800                    20

      7777 ALLEN      SALESMAN        7698 20-2月 -81          1600        300         30



SQL>update test9 set empno=3333 where empno=7369;

 

 
已更新 1 行。
 
 
 
SQL>commit;
 
 
 
提交完成。
 
 
SQL>select versions_operation,versions_xid from test9 versions between timestampminvalue and maxvalue;



VVERSIONS_XID

-----------------

U05001600200E0000

I 05001A001E0E0000

SQL>select xid,undo_sql from flashback_transaction_query wherexid='05001600200E0000';



XID

----------------

UNDO_SQL

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

05001600200E0000

update"SCOTT"."TEST9" set "EMPNO" = '7369' where ROWID= 'AAASE1AAEAAAABeAAA';



05001600200E0000


SQL>

 

 
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,