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之rman备份加密
下一个:Oracle之创建表与修改表详解
- 更多Oracle疑问解答:
- 运行exp备份oracle数据库提示oracle-12154错误
- 有没有,生产Oracle Rman 备份脚本的工具啊!
- 初学orcle,希望有大大帮忙解说一下详细步骤,从登录oracle到创建表的过程
- oracle语句问题:一张user表,三个字段,id,name,time,插入记录比如:张三2007,李四2008,张三2011
- 如何写一个ORACLE触发器同步两个表中的数据?
- oracle 如何查看一个服务器上有多少个数据库.
- oracle 创建包的时候错误 求解
- oracle 重复列的问题
- oracle 中如何查处2星期前的数据
- 请教oracle数据库安装中的问题
- 请问谁能提供给我标准的oracle ERP的数据库表结构并详细说明各表主要的作用?
- 安装oracle遇到的问题 invalid entry CRC (expected 0x3e12e795 but got 0x9db0e9fd)
- 我的是ORACLE 10G,在RMAN中如何按指定的时间恢复数据文件啊?
- oracle为什么没有自动增长列
- oracle快捷键都有哪些啊?