Archive

Archive for the ‘备份与恢复’ Category

Oracle10GR2 中的RESTORE POINT

July 2nd, 2010 1 comment

RESTORE POINT

还原点是10GR2新增加的一个功能,它是建立在数据库层面上的, 跟savepoint不同. 必须在数据库处于ARCHIVELOG模式下才可以使用,主题思想是在数据库的某个时间点创建一个restore point,在随后的某个时间点可以将表或数据库falshback 到这个restore point.那么能否真正的完成flashback,依赖于创建的restore point类型和flashback要操作的对象.flashback database需要SYSDBA权限,flashback table需要 FLASHBACK ANY TABLE的权限.
Read more…

Categories: 备份与恢复, oracle Tags:

32位oracle数据库迁移至64位oracle的实例(rman Convert database)

February 12th, 2010 No comments

1、原来在64位win7下装的是32位的oracle,启动数据库后不断在alert.log报错:  

OER 7451 in Load Indicator : Error Code = OSD-04500: 指定了非法选项
O/S-Error: (OS 1) 函数不正确。 !  

 很烦人。查了一下,必须使用64位的oracle。  

正好可以使用rman的Convert database特性进行跨平台迁移数据了。  
Read more…

Categories: 备份与恢复 Tags: , ,

oracle10G的闪回数据库

March 6th, 2009 No comments

最近终于体会了一下,这个功能太实用了,大家可以参考以下我的体会结果

闪回查询
(1).查询闪回
例如:
1)在删除员工smith记录后,希望查询到删除该行记录前的值,则可以查询emp在’2007-02-11 23:34:05′时的数据,查询方法如下:
select * from emp as of timestamp to_timestamp(’2007-02-11 23:34:05′,’yyyy-mm-dd hh24:mi:ss’) where ename=’SMITH’;
2)查询当前时间
alter session set nls_date_format=’yyyy-mm-dd hh24:mi;ss’;
select sysdate from dual;
delete from emp;
commit;
select * from emp as of timestamp to_timestamp(’2007-02-11 23:34:05′,’yyyy-mm-dd hh24:mi:ss’);
可以将闪回的数据重新插入到表中:
insert into empbak (select * from empbak as of timestamp to_timestamp(’2007-02-11 23:34:05′,’yyyy-mm-dd hh24:mi:ss’));
(2).表闪回
表闪回要求用户必须要有flash any table权限,首先,必须对表进行下以下操作:
alter table empbak enable row movement;
执行闪回操作
flashback table emp to timestamp to_timestamp(’2007-02-11 23:34:05′,’yyyy-mm-dd hh24:mi:ss’);
注:如果表结构发生改变就没有办法闪回。
(3).删除闪回
删除闪回为删除oracle10g中的数据库实体提供了一个安全机制,当用删除一个表时,oracle10g 会将该表放到回收站中,回收站中的对象一真会保留,直到用户决定永久删除它们或出现表空间的空间不足时才会被删除。回收站是一个虚拟容器,用于存储所有被删除的对象。数据字典user_tables中的列dropped表示被删除的表.查询方法如下:
select table_name,dropped from user_tables;
也可以使用show命令显示回收站信息
sql>show recyclebin
或查询数据字典user_recyclebin获得回收站信息
SQL> select object_name,original_name,type,droptime from user_recyclebin;
例如;恢复被删除的表emp.
SQL>flashback table emp to before drop;
如果不知道原表名,可以直接使用回收站中的名称进行闪回。
SQL>flashback table “Bin$DSbdfd4rdfdfdfegdfsf==$0″ to before drop;
在回收的同时可以修改表名:
SQL>flashback table “Bin$DSbdfd4rdfdfdfegdfsf==$0″ to before drop rename to emp1;
真正删除某一个表,而不进入回收站,可以在删除表时增加purge选项.如将emp表彻底删除.
SQL>drop table emp purge;
也可以通过删除recyclebin区域来永久性删除表 ,原始删除表drop table emp cascade constraints
SQL>purge table emp;
删除当前用户的回收站
SQL>purge recyclebin;
删除全体用户在回收站的数据.
SQL>purge dba_recyclebin
(4).数据库闪回
使用数据库闪回功能,可以使数据库回到过去某一状态, 语法如下:
SQL>alter database flashback on
SQL>flashback database to scn 46963;
SQL>flashback database to timestamp to_timestamp(’2007-2-12 12:00:00′,’yyyy-mm-dd hh24:mi:ss’);

Categories: 备份与恢复 Tags:

Oracle 10g R2新特性之备份和可用性特性

March 5th, 2009 No comments

 Oracle 的自身备份

  到现在为止,许多开发人员已经认识到 RMAN 的潜力以及它作为数据库备份工具的实用性。 您可能还记得 RMAN 可以将数据直接备份到磁盘和磁带。 当涉及磁带解决方案时,RMAN 使用名为介质管理库 (MML) 的 API 来操纵磁带子系统。

  此 MML 特定于所涉及的磁带管理系统和硬件。 (例如,如果涉及 Tivoli Storage Manager,则必须使用特定的 MML — Tivoli Data Protector,RMAN 需要它来通过 Tivoli 管理磁带。) 尽管 RMAN 是数据库引擎的一个特性,但 MML 不是引擎的一部分,而是由别人提供的;实际上,其价格可能相当高。 此外,如果您的主要目的是备份 Oracle 数据库,则在 MML 方面进行额外的投资就显得不适当了。

  在 Oracle 数据库 10g 第 2 版中,一个名为 Oracle Secure Backup (OSB) 的新工具代替了特定于第三方磁带管理系统的 MML,从而使此要求变得更容易接受。 OSB 可以直接备份到磁带库,因此您不需要任何其他介质管理层。 而其最大的优点是,OSB 与数据库引擎紧密集成,因此可以通过 Oracle EntERPrise Manager 对它进行控制和管理。
  但其他非数据库备份(如备份 Oracle Home、初始化文件、集群注册表文件(就 RAC 而言)以及其他重要文件)又如何呢? 您可能会问,这些备份不需要备份工具吗?

  回答是“不需要”。就像任何独立工具一样,OSB 也可以执行文件系统备份。 显而易见,无需使用 MML 来进行 RMAN 备份再加上备份文件系统这一功能提供了一个低成本和简化的备份和恢复方法。

  下面介绍如何在 Oracle Enterprise Manager 中使用 MML 组件。 首先,在 Oracle Enterprise Manager GUI 中选择 Maintenance 选项卡:

  从以上菜单中,选择标题为“Configure Backup Settings”的超链接,随即将显示一个如下所示的屏幕:

  注意此屏幕上的“Tape Settings”部分,您将在该部分中配置 Oracle Backup 工具。

  Oracle Backup Administrative 软件可以在一台独立的主机上运行,在此主机中,该软件通过数据服务器上运行的代理进行管理。 在本示例中,Administrative 主机安装在主机 proliback.proligence.com 上并在其上运行,且 Oracle Backup 工具已经安装到 /bin/obt 目录中。

  当然,许多 DBA 仍喜欢使用命令行和编写脚本。 OSB 提供了一个名为 obtool 的命令行工具。 可以通过键入以下命令调用该命令行版本:

obtool

  该命令调出 OSB 提示符 ob>。 可以在此处键入“help”来查看可用的命令。

ob > help

  或者,可以在命令名之后使用关键字“glossary”以获得有关此命令的更多详细信息:

ob> help restore glossary

  要备份 Oracle Home,应使用:

ob> backup --level incr --at 2005/03/29.09:00
--priority 1 --family Pool1 --privileged --dataset OracleHome --expirerequest 7days

  我们需要对以上命令进行一些说明。 第一个参数 (level) 指示备份级别。 在此您指定了增量备份来备份自上次增量备份以来更改的所有文件。 第二个参数 2005/03/29.09:00 指定备份运行的时间, 即 2005 年 3 月 29 日上午 9 点。

  如果有多个备份作业,那么它们按照什么顺序执行? 此顺序由优先级选项(此处设置为 1,表示“最高优先级”)指定。 可以指定一个小于等于 100 的值来指定较低的优先级。

  您还为不同类型的备份指定了几个介质池。 例如,您可以有一个用于数据文件备份的介质池,一个用于归档日志的介质池,和一个用于其他非数据库备份的介质池。 此处,您将名为 Pool1 的池指定为用于此备份的池。

  您已经通过参数数据集指定了要备份的文件。 当您期望另一个增量备份发生时,您已经通过参数 expirerequest 请求在 7 天后使此备份过期。

  我在这里的目的是提供一个非常简要的介绍;完整介绍将需要一本书的篇幅。 有关 OSB 的更多信息,请参考可用的文档集。

既往作业和当前作业的动态 RMAN 视图

  与许多其他 DBA 一样,自从 Oracle8 中引入 RMAN 后不久,我便对它情有独钟。 但我从不认为对它的活动有一个彻底的了解。

  在 Oracle 数据库 10g 第 2 版中,为 RMAN 作业提供的动态视图简化了对这些作业(无论是当前作业还是既往作业)的理解。

  第一个新视图 V$RMAN_BACKUP_JOB_DETAILS 记录所有备份的历史。 除显示像备份历时这样的简单详细信息外,此视图还显示了许多对事后分析很重要的其他详细信息。 下面,我们将介绍一些重要的详细信息,以及它们如何帮助您分析 RMAN 会话。

  假设您要对有关该历史记录的所有内容有一个或多或少的了解: 已经发出的 RMAN 作业数、每个作业的状态、这些作业的开始和完成时间、这些作业的类型等。 您将按如下所示发出一个查询:

SQL> col STATUS format a9
SQL> col hrs format 999.99
SQL> select
  2     SESSION_KEY, INPUT_TYPE, STATUS,
  3     to_char(START_TIME,'mm/dd/yy hh24:mi') start_time,
  4     to_char(END_TIME,'mm/dd/yy hh24:mi')   end_time,
  5     elapsed_seconds/3600                   hrs
  6  from V$RMAN_BACKUP_JOB_DETAILS
  7* order by session_key

  输出可能类似如下所示:

SESSION_KEY    INPUT_TYPE      STATUS    START_TIME     END_TIME          HRS
-----------    -------------   --------  -------------- -------------     -------
          1    DATAFILE FULL   COMPLETED 03/25/05 00:48 03/25/05 00:48    .00
          4    DB FULL         COMPLETED 03/27/05 02:09 03/27/05 02:11    .04
          7    DB FULL         FAILED    03/27/05 02:18 03/27/05 02:24    .10

  SESSION KEY 列是显示其他相关信息的其他视图的关键之处。 (稍后将介绍有关该列的更多信息。) 列 START_TIME 和 END_TIME 非常直观。 列 ELAPSED_SECONDS 显示已用时间(以秒为单位),为便于阅读,我已将该时间转换为小时格式。 STATUS 列显示 RMAN 作业的状态。 在该作业执行过程中,此状态列显示 RUNNING。

  记录的另一个重要信息是生成备份的速率以及进程读取和数据写入的速度。 该信息可以帮助您诊断 RMAN 作业中的拖沓现象。

SQL> col ins format a10
SQL> col outs format a10
SQL> select SESSION_KEY,
  2     OPTIMIZED,
  3     COMPRESSION_RATIO,
  4     INPUT_BYTES_PER_SEC_DISPLAY ins,
  5     OUTPUT_BYTES_PER_SEC_DISPLAY outs,
  6     TIME_TAKEN_DISPLAY
  7  from V$RMAN_BACKUP_JOB_DETAILS
  8  order by session_key;

SESSION_KEY OPT COMPRESSION_RATIO       INS        OUTS TIME_TAKEN
----------- --- ----------------- ---------- ---------- ----------
          1 NO         2.23776224      3.33M      1.49M  00:00:06
          4 NO         1.31065794      6.92M      5.28M  00:02:16
          7 NO         1.32363058      3.68M      2.78M  00:06:00

  注意如何以可读格式(小时:分钟:秒)显示时间。列 INS 和 OUTS 以更易于阅读的格式(如用 M 表示兆字节)显示每秒的数据输入或输出。 在以上示例中,您可以看到由会话键 4 标记的作业有着 6.92MB/s 和 5.2MB/s 的读取速率。您现在可以查看多个 RMAN 执行的输出,并从中搜索某个模式。 该模式分析将帮助您识别通过波动昭示的任何潜在瓶颈。

  还可以按备份类型过滤备份信息。 新视图 V$RMAN_BACKUP_JOB_DETAILS 提供了 RMAN 执行的备份类型以及输出的组织方式。

SQL> select * from V$RMAN_BACKUP_TYPE;

    WEIGHT INPUT_TYPE
---------- -------------
         1 BACKUPSET
         2 SPFILE
         3 CONTROLFILE
         4 ARCHIVELOG
         5 DATAFILE INCR
         6 DATAFILE FULL
         7 DB INCR
         8 RECVR AREA
         9 DB FULL

  对象类型 weight 决定视图中记录的排列顺序。

  另一个非常有用的视图是 RMAN 输出。 假设您已经通过 shell 脚本运行了 RMAN 作业,但某个地方出现了故障。 这样,您就有了一个记录 RMAN 输出的输出文件,但不幸的是,您已经把它给丢了。您该怎么办呢? 幸运的是,新视图 V$RMAN_OUTPUT 记录 RMAN 作业中的输出,以便稍后查看。 该视图对用脚本编制的 RMAN 作业以及即席作业很有用。

SQL> select output
  2  from v$rman_output
  3  where session_key = 4
  4  order by recid;
OUTPUT
----------------------------------------------------------------------
connected to target database: TEST (DBID=1849323268)

Starting backup at 27-MAR-05
using target database controlfile instead of recovery catalog
allocated channel:ORA_DISK_1
channel ORA_DISK_1: sid=201 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00001 name=/u01/app/oracle/oradata/TEST/system01.dbf
input datafile fno=00003 name=/u01/app/oracle/oradata/TEST/sysaux01.dbf
input datafile fno=00002 name=/u01/app/oracle/oradata/TEST/undotbs01.dbf
input datafile fno=00004 name=/u01/app/oracle/oradata/TEST/users01.dbf
input datafile fno=00005 name=/u01/app/oracle/oradata/TEST/accdata01.dbf
channel ORA_DISK_1: starting piece 1 at 27-MAR-05
channel ORA_DISK_1: finished piece 1 at 27-MAR-05
piece handle=/u01/app/oracle/product/10.2.0/db_1/dbs/07ggc7qr_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:46
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including current controlfile in backupset
channel ORA_DISK_1: starting piece 1 at 27-MAR-05
channel ORA_DISK_1: finished piece 1 at 27-MAR-05
piece handle=/u01/app/oracle/product/10.2.0/db_1/dbs/08ggc7u6_1_1 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 27-MAR-05

  您可以看到,此处捕获了 RMAN 作业的整个输出。 这是一个保存在内存中的视图,在实例关闭时会从内存中清除。 如果希望保存 RMAN 输出,可以将这些行复制到一个永久表。 列 SESSION_KEY 显示与视图 V$RMAN_BACKUP_JOB_DETAILS 中显示的 RMAN 作业关联的记录。 现在,您将不会再丢失 RMAN 作业中的输出了。

  通过 Oracle EntERPrise Manager,您可以利用新视图创建新备份报表。 此报表提供了已经在您的企业中执行的备份操作的瞬时概要。 可以按备份类型和状态过滤数据。

为 Oracle RAC 集群动态分配通道

  当然,在 Oracle RAC 环境中,有多个数据库运行在多个主机上。 但在这样的环境中调用 RMAN 时,不得不只连接到一个实例(使用 TARGET=/)上,从而导致一个节点执行所有工作而其他节点却相对空闲。

  在 Oracle 数据库 10g 第 2 版之前,让两个节点执行该工作的一个方法就是创建多个连接到多个实例的通道。 以下显示了一个相关 RMAN 命令的示例:

 

allocate channel = c1 type sbt_tape connect = 'rman/rmanpass@inst1';
allocate channel = c2 type sbt_tape connect = 'rman/rmanpass@inst2';

  该命令假设您有两个实例,即 inst1 和 inst2。 但该选项并不完全满足要求,这是因为它无法揭示某个节点出现了故障;当某个节点出现故障时,整个 RMAN 作业将发生故障。 此外,它并不创建真正的负载平衡配置。

  在 Oracle 数据库 10g 第 2 版中,不必再为每个 RAC 节点显式分配一个通道来执行备份;您只需为操作定义并行度即可。 RMAN 自动创建多个并行流,并根据集群资源管理器连接到负载最小的实例。 除了负载平衡以外,它还提供了通道故障切换功能,以便将一个实例的连接故障切换到幸存节点。 此新特性增强了 RMAN 进程的强健度。

  通过 RMAN 恢复临时文件

  当您从 RMAN 备份恢复数据库时,所需执行的第一个操作就是重新创建临时表空间文件。 由于临时表空间不包含要恢复的永久对象,因此 RMAN 不备份它们 – 没有必要为非永久对象浪费备份资源。 但 Oracle 数据库需要临时表空间才能使许多操作高效运行。 因此,如果 RMAN 也备份它们岂不是很好?

  在 Oracle 数据库 10g 第 2 版中,它做到了。 当您恢复数据库时,还将自动重新创建临时表空间文件。 以下是警报日志文件的片段:

ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: '/u01/app/oracle/oradata/TEST/temp01.dbf'
ORA-27037: unable to obtain file status
Linux Error:2: No such file or directory
Additional information: 3
Sun Mar 27 20:29:00 2005
Errors in file /u01/app/oracle/admin/TEST/bdump/test_dbw0_15457.trc:
ORA-01186: file 201 failed verification tests
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: '/u01/app/oracle/oradata/TEST/temp01.dbf'
Sun Mar 27 20:29:00 2005
File 201 not verified due to error ORA-01157
Sun Mar 27 20:29:00 2005
Dictionary check complete
Sun Mar 27 20:29:00 2005
SMON: enabling tx recovery
Sun Mar 27 20:29:00 2005
Re-creating tempfile /u01/app/oracle/oradata/TEST/temp01.dbf

  通过 RESETLOGS 实现闪回数据库/查询

  Oracle 数据库 10g 引入了闪回数据库,它通过撤消存储在闪回日志中的更改回滚整个数据库。 但请考虑以下情形:

  1. 数据库活动正常。 记录已更新。
  2. 数据库因重做日志文件中存在的物理损坏而崩溃。
  3. 使用备份控制文件从备份恢复了数据库。
  4. 使用 RESETLOGS 选项打开了数据库。
  5. 数据库活动恢复。 以正常方式更新记录。 开发人员喊到“帮帮忙”! 他更新了错误的记录集。 他请求闪回该数据库。

  当使用 RESETLOGS 选项打开数据库时,该数据库从编号为 1 的 SCN 开始。因此,新配置文件不知道过去更新的 SCN 编号。 由于闪回数据库依赖 SCN 编号,因此该特性能否在该情形下起作用?

  在 Oracle 数据库 10g 第 2 版中,它将起作用,这是因为该数据库将它的前一个副本存储在控制文件中,并对频繁地使用它。 这种情况下将查询前一个副本,并使用它将数据库闪回到不同的时间,即使在同时重置了 SCN 编号的情况下也是如此。

  我们来看一个示例: 首先,检查帐号 3 的帐户持有者。

SQL> select first_name, last_name
  2  from accounts
  3  where acc_no = 3;

FIRST_NAME                     LAST_NAME
------------------------------ -----------
Alan                           Smith

  现在更新名称:

SQL> update accounts
  2  set first_name = 'John'
  3  where acc_no = 3;

  现在,毁坏数据库,从备份恢复,然后在 RESETLOGS 选项中打开已恢复的数据库。

  假设一段时间过后,大厅角落里传来了一个气急败坏的声音“靠”,然后就有人请您将数据库闪回到先前的某个时间点,而这个时间点恰好位于 RESETLOGS 操作之前。

  这时只需发出以下命令即可。

SQL> flashback database to before resetlogs;

  该命令恰好把数据库闪回到 RESETLOGS 之前的 SCN。 执行该命令后,再次检查该表。

SQL> select first_name, last_name
  2  from accounts
  3  where acc_no = 3;

FIRST_NAME                     LAST_NAME
------------------------------ -----------
Alan                           Smith

  您可以看到,RESETLOGS 操作没有影响闪回操作。

  该特性使闪回数据库非常强大和有用。 它的行为对闪回查询也适用。

 

闪回数据库中的恢复点

  还记得 SQL 中保存点的概念吗? 在一个事务中,您可以创建保存点,进行某些修改,创建另一个保存点,等等。 如果这些更改不是您想要的,则您所要做的就是将它们回滚到某个具体的保存点。

  现在,我们将介绍 Oracle 数据库 10g 中引入的一个新功能 — 闪回数据库。通过它您可以将数据库倒回到前一个时间点。 在这种情况下拥有一个与保存点类似的功能(即能够倒回到一个有名称的点,而不仅仅是一个时间点)岂不是很好? 

  在 Oracle 数据库 10g 第 2 版中,您可以使用一个名为恢复点的新功能来实现该操作。以下是它的工作方式。 假设有一个长期运行的处理(涉及多个必须按顺序运行的批处理程序)。以下是事件序列:

  1. 创建恢复点 rp1
  2. 运行批处理作业 1
  3. 创建恢复点 rp2
  4. 运行批处理作业 2

等等。 批处理作业 2 在执行过程中失败,您需要将数据库恢复到一致的状态。 您不必将它一直恢复到运行的开始阶段。 由于恢复点 rp2 是在批处理作业执行之前创建的,因此只需将数据库闪回到该恢复点。

  使用以下代码创建一个恢复点

create restore point before_monthend_200503;

  现在根据当前的数据库时间和 SCN 创建了恢复点 BEFORE_MONTHEND_200503。 如果要确保可以将数据库闪回到某个特定恢复点,可以通过按如下所示创建有保证的恢复点来指定 guarantee:

create restore point before_monthend_200503
guarantee flashback database;

  可以通过从动态性能视图 V$RESTORE_POINT 中执行 SELECT 来确认该恢复点是否存在:

SQL> select * from v$restore_point;

       SCN DATABASE_INCARNATION# GUA STORAGE_SIZE
---------- --------------------- --- ------------
TIME
---------------------------------------------------
NAME
---------------------------------------------------

   1429811                     1 YES      8192000
27-MAR-05 05.18.39.000000000 PM
BEFORE_MONTHEND_200503

  稍后当您要将数据库闪回到该恢复点时,您只需发出:

flashback database to restore point before_monthend_200503;

  如果检查警报日志,它将显示一个类似如下的行:

Media Recovery Applied UNTIL CHANGE 1429814

  恢复点(尤其是有保证的恢复点)在许多与数据库相关的任务中非常有用。 QA 数据库就是一个典型示例。在该数据库中,您可能要建立一个恢复点、运行某些测试并闪回到恢复点,从而使数据库看起来好象什么也没发生一样。 然后,您可以执行另一轮测试,并再次将它恢复到恢复点。

  研究快速恢复区

  您可能已经配置了快速恢复区来备份不同类型的文件。 但您怎么知道其中有哪些可用的备份类型呢?

  一个新视图 V$FLASH_RECOVERY_AREA_USAGE 显示了快速恢复区中可用的备份类型。

SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;

        FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
        ------------ ------------------ ------------------------- ---------------
        CONTROLFILE                   0                         0               0
        ONLINELOG                     0                         0               0
        ARCHIVELOG                  .02                       .02               1
        BACKUPPIECE               68.98                      1.02              10
        IMAGECOPY                     0                         0               0
        FLASHBACKLOG                .95                         0               3

  使用该视图,您可以立即看到快速恢复区中的可用文件类型。 但它只显示百分比,因此您如何确定实际值? 只需查询视图 $RECOVERY_FILE_DEST 即可。

SQL> select * from V$RECOVERY_FILE_DEST;

NAME
----------------------------------------------------------
SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----------- ---------- ----------------- ---------------
/home/oracle
 2147483648 1502122496          22201856              14

  该查询显示恢复区的总大小为 16384000。闪回日志占用 SPACE_LIMIT 列的 0.95%(上一个查询中所示),因此您可以计算所占用空间的实际大小。 它还显示了从快速恢复区中不同类型的备份中可以回收的空间大小。 例如,您可以因为备份可能已过期而回收 1.02% 的已占用空间。 使用该视图,您可以针对快速恢复区使用率和大小进行智能化的预测。

  Oracle EntERPrise Manager 通过向 Recovery Settings 页(显示快速恢复区域中的文件细分)中添加一个饼图来利用新的 V$RECOVERY_FILE_DEST 视图:


  DBA 工作(尤其是生产支持 DBA 的工作)的独特方面之一就是成功、可靠以及高效地进行备份和恢复的能力。 在 Oracle 数据库 10g 第 2 版中,该领域中的增强使 DBA 的工作变得更加容易和可靠。

Categories: 备份与恢复, oracle Tags:

Oracle 9i新特性研究 六 闪回查询

March 5th, 2009 No comments

 

一、简介

在过去,如果用户误删/更新了数据后,作为用户并没有什么直接的方法来进行恢复,他们必须求助DBA来对数据库进行恢复,到了Oracle9i,这一个难堪局面有所改善。Oracle 9i中提供了一项新的技术手段–闪回查询,用户使用闪回查询可以及时取得误操作前的数据,并可以针对错误进行相应的恢复措施,而这一切都无需DBA干预。

下面我们通过一个例子来具体说明闪回查询的用法。

二、示例

1、使用闪回查询前必须确定下面两个参数:

UNDO_MANAGEMENT = AUTO

undo_retention = 1200; #这个时间可以随便设,他表示在系统中保留提交了的UNDO信息的时间,1200就是保留20分钟。

2、使用闪回查询

SQL> conn sys/sys as sysdba

Connected.

SQL> create user flash identified by flash;

User created.

SQL> grant connect, resource to flash;

Grant succeeded.

SQL> grant execute on dbms_flashback to flash;

Grant succeeded.

SQL> conn flash/flash

Connected.

SQL> set echo on

SQL> create table t (a varchar2(10));

Table created.

SQL> insert into t values(‘gototop’);

1 row created.

SQL> insert into t values(‘www.ncn.cn’);

1 row created.

SQL> /

SQL> select * from t;

A

———-

gototop

www.ncn.cn

www.ncn.cn

SQL> set time on

15:00:22 SQL>

15:00:22 SQL>

15:00:23 SQL> delete t where a=’gototop’;

1 row deleted.

15:00:35 SQL> commit;

Commit complete.

15:00:38 SQL> select * from t;

A

———-

www.ncn.cn

www.ncn.cn

15:08:22 SQL> execute DBMS_FLASHBACK.ENABLE_AT_TIME(to_date(’2003-05-16 15:00:00′));

PL/SQL procedure successfully completed.

15:09:02 SQL> select * from t;

A

———-

gototop

www.ncn.cn

www.ncn.cn

15:16:43 SQL> execute DBMS_FLASHBACK.DISABLE;

PL/SQL procedure successfully completed.

15:17:05 SQL> select * from t;

A

———-

www.ncn.cn

www.ncn.cn

3、使用闪回查询恢复数据:

15:36:55 SQL> select * from t;

no rows selected

15:36:57 SQL> insert into t values(‘www.ncn.cn’);

1 row created.

15:37:15 SQL> /

1 row created.

15:37:16 SQL> /

1 row created.

15:37:17 SQL> /

1 row created.

15:37:18 SQL> /

1 row created.

15:37:19 SQL> commit;

Commit complete.

15:37:21 SQL> /

Commit complete.

15:37:22 SQL> /

Commit complete.

15:37:23 SQL> select * from t;

A

———-

www.ncn.cn

www.ncn.cn

www.ncn.cn

www.ncn.cn

www.ncn.cn

www.ncn.cn

6 rows selected.

15:37:28 SQL>

15:38:44 SQL> delete t;

6 rows deleted.

15:38:50 SQL> commit;

Commit complete.

15:38:53 SQL> commit;

Commit complete.

15:38:54 SQL> /

Commit complete.

15:38:57 SQL> declare

15:39:28 2 cursor flash_recover is

15:39:28 3 select * from t;

15:39:28 4 t_recode t%rowtype;

15:39:28 5 begin

15:39:28 6 DBMS_FLASHBACK.ENABLE_AT_TIME(to_date(’2003-05-16 15:37:23′));

15:39:28 7 open FLASH_RECOVER;

15:39:28 8 DBMS_FLASHBACK.DISABLE;

15:39:28 9 loop

15:39:28 10 FETCH FLASH_RECOVER INTO t_recode;

15:39:28 11 EXIT WHEN FLASH_RECOVER%NOTFOUND;

15:39:28 12 insert into t values (t_recode.a);

15:39:28 13 end loop;

15:39:28 14 CLOSE FLASH_RECOVER;

15:39:28 15 commit;

15:39:28 16 end;

15:39:28 17 /

PL/SQL procedure successfully completed.

15:39:28 SQL> 15:39:28 SQL>

15:39:31 SQL> select * from t;

A

———-

www.ncn.cn

www.ncn.cn

www.ncn.cn

www.ncn.cn

www.ncn.cn

15:39:35 SQL>

我们可以已经恢复了5条纪录,但我们要恢复的6条纪录,为什么会少一条呢?原因就在下面。

三、局限性

1、闪回查询是基于SCN的,虽然我执行的是:

DBMS_FLASHBACK.ENABLE_AT_TIME(to_date(’2003-05-16 15:37:23′));

但Oracle并不会精确的这个时间点,而是ROUND DOWN到最近的一次SCN,然后从这个SCN开始进行恢复。而Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。

这正是上面我们进行恢复时少了一条的原因。因此如果使用DBMS_FLASHBACK.ENABLE_AT_TIME来进行恢复,为了避免恢复失败,我可以先等5分钟,然后再进行恢复。

使用DBMS_FLASHBACK.ENABLE_AT_TIME进行恢复还有一个缺点,那就是在Oracle 9i中SCN和对应时间的映射信息只会保留5天,因此我们无法通过DBMS_FLASHBACK.ENABLE_AT_TIME来恢复5天前的数据。如果你想使用闪回查询来恢复5天前的数据,你必须自己来确定需要恢复的SCN,然后使用

DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(SCN_NUMBER); 来定位你的恢复时间点,下面是使用方法:

15:58:58 SQL> VARIABLE SCN_SAVE NUMBER;

16:13:43 SQL> EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;

PL/SQL procedure successfully completed.

16:13:50 SQL> print SCN_SAVE;

SCN_SAVE

———-

2.1202E+11

16:28:34 SQL> execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE);

PL/SQL procedure successfully completed.

另外,在使用DBMS_FLASHBACK.ENABLE_AT_TIME前,你必须设定你的NLS_DATE_FORMAT的精确程度,Oracle默认的是精确到天,如果你不设定,像上面的例子你不会得到预期结果。

2、如果你使用sysdate和DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER来获取时间点或者SCN值,你必须注意它们取得都是当前的时间点和SCN值。

3、你只能在事务开始时进入闪回查询模式,如果之前有DML操作,则必须COMMIT。

4、闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。

Categories: 备份与恢复, oracle Tags:

Videos, Slideshows and Podcasts by Cincopa Wordpress Plugin