Oracle Database 11g:面向 DBA 和开发人员的重要特性 RMAN

源地址:http://www.oracle.com/technetwork/cn/articles/sql/11g-rman-094332-zhs.html




备份和恢复

数据恢复建议、同一文件并行备份、安全性虚拟目录、从备份中复制数据库、取消删除表空间以及安全备份到云只是 Oracle Database 11g 中 RMAN 提供的部分新特性。


Data Recovery Advisor

考虑下面显示的错误:

SQL> conn scott/tiger
Connected.
SQL> create table t (col1 number);
create table t (col1 number)
*
ERROR at line 1:
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/home/oracle/oradata/PRODB3/users01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

看起来是不是很熟悉?无论您是否做过 DBA,您可能都不止一次看到过该消息。该错误发生的原因是无法获得特定的数据文件 — 该文件可能已经受损,或者可能有人在数据库运行时删除了该文件。在任何情况下,您都需要在问题的影响范围扩大之前采取一些主动措施。

在 Oracle Database 11g 中,新增的 Data Recovery Advisor 极大地简化了该操作。该 Advisor 有两种形式:命令行模式,以及作为 Oracle Enterprise Manager Database Control 的一个屏幕。根据具体的情况,每种形式各有其优点。例如,如果您希望通过 shell 脚本自动识别此类文件并通过 cron 或 at 之类的实用程序计划恢复操作,那么选择前者将很有用。对于希望借助 GUI 来指导他们完成该过程的 DBA 新手来说,后一种方法将更有帮助。下面,我将对这两种形式分别进行描述。

命令行方式



命令行方式通过 RMAN 执行。首先,启动 RMAN 进程并连接到目标。

 
$ rman target=/
 
Recovery Manager: Release 11.1.0.5.0 - Beta on Sun Jul 15 19:43:45 2007
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
connected to target database: PRODB3 (DBID=3132722606)

假设发生了某个错误,您希望找出原因。使用  list failure 命令可以立即知道答案。 

RMAN> list failure;

如果没有错误,该命令将返回以下消息:
no failures found that match specification

如果有错误,将显示如下更具说明性的消息:
using target database control file instead of recovery catalog
List of Database Failures
=========================
 
Failure ID Priority Status    Time Detected Summary
----------      --------     ---------     -------------       -------
142        HIGH     OPEN      15-JUL-07     One or more non-system datafiles are missing

该消息表明某些数据文件已丢失。由于这些数据文件属于 SYSTEM 以外的表空间,因此数据库会挂起,并使该表空间脱机。该错误相当严重,因此优先级设为 HIGH。每个故障都有一个故障 ID,以方便各个故障的识别和解决。例如,您可以执行以下命令来了解故障 142 的详细信息。
RMAN> list failure 142 detail;

该命令将向您显示错误的确切原因。


现在,进入了关键部分:如何纠正该错误?经验丰富的 DBA 或许不需要进一步的帮助就可以顺利解决该问题,但是 DBA 新手(甚至包括一些有经验但是知识陈旧的 DBA)希望在这里获得一些指导。他们可以向 Data Recovery Advisor 寻求帮助:

RMAN> advise failure;

以上命令的响应将对错误进行详细的解释,并说明如何纠正该错误:
List of Database Failures
=========================
 
Failure ID Priority Status    Time Detected Summary
----------      --------     ---------     -------------       -------
142        HIGH     OPEN      15-JUL-07     One or more non-system datafiles are missing
 
analyzing automatic repair options; this may take some time
using channel ORA_DISK_1
analyzing automatic repair options complete
 
Mandatory Manual Actions
========================
no manual actions available
 
Optional Manual Actions
=======================
1. If file /home/oracle/oradata/PRODB3/users01.dbf was unintentionally renamed or moved, restore it
 
Automated Repair Options
========================
Option Repair Description
------ ------------------
1      Restore and recover datafile 4  
  Strategy: The repair includes complete media recovery with no data loss
  Repair script: /home/oracle/app/diag/rdbms/prodb3/PRODB3/hm/reco_3162589478.hm

该输出有几个重要部分。首先,该 Advisor 对错误进行了分析。在该案例中,错误很明显:数据文件丢失。接下来,Advisor 建议了一个策略。在该案例中,这也是相当简单的:还原和恢复文件。(请注意,我故意选择了一个简单的示例以便将注意力集中到工具的使用上,而不是讨论数据库可能出现故障的各种情况以及如何恢复。动态性能视图 V$IR_MANUAL_CHECKLIST 也显示了该信息。)


然而,Data Recovery Advisor 执行的最有用的任务却显示在最后一行:它将生成一个可用于修复数据文件或解决该问题的脚本。该脚本可以完成所有工作,您连一行代码都不用编写。

有时,Advisor 无法获取它所需的所有信息。例如,在该案例中,它不知道是有人将文件移到了另一个位置,还是对该文件进行了重新命名。在这种情况下,它会建议将文件移回原来的位置,并恢复原来的名称(在 Optional Manual Actions 下)。

现在,脚本已经准备好了。您准备好执行它了吗?我不了解您的情况,但是我会验证该脚本实际上会首先执行什么。因此,我执行以下命令来“预览”修复任务将执行的操作:

RMAN> repair failure preview;
 
Strategy: The repair includes complete media recovery with no data loss
Repair script: /home/oracle/app/diag/rdbms/prodb3/PRODB3/hm/reco_741461097.hm
 
contents of repair script:
   # restore and recover datafile
   sql 'alter database datafile 4 offline';
   restore datafile 4;
   recover datafile 4;
   sql 'alter database datafile 4 online';

很好,修复任务似乎在做着和我使用 RMAN 去做的同样的事情。现在,我可以通过发出以下命令来执行实际的修复:
RMAN> repair failure;
 
Strategy: The repair includes complete media recovery with no data loss
Repair script: /home/oracle/app/diag/rdbms/prodb3/PRODB3/hm/reco_3162589478.hm
 
contents of repair script:
   # restore and recover datafile
   sql 'alter database datafile 4 offline';
   restore datafile 4;
   recover datafile 4;
   sql 'alter database datafile 4 online';
 
Do you really want to execute the above repair (enter YES or NO)?

假设结果是 OK,我回答 YES,操作将继续执行:
executing repair script

sql statement: alter database datafile 4 offline

Starting restore at 15-JUL-07
using channel ORA_DISK_1

channel ORA_DISK_1: restoring datafile 00004
input datafile copy RECID=5 STAMP=628025835 file name=/home/oracle/flasharea/PRODB3/datafile/o1_mf_users_39ocxbv3_.dbf
destination for restore of datafile 00004: /home/oracle/oradata/PRODB3/users01.dbf
channel ORA_DISK_1: copied datafile copy of datafile 00004
output file name=/home/oracle/oradata/PRODB3/users01.dbf RECID=0 STAMP=0
Finished restore at 15-JUL-07

Starting recover at 15-JUL-07
using channel ORA_DISK_1

starting media recovery

archived log for thread 1 with sequence 51 is already on disk as file /home/oracle/flasharea/PRODB3/archivelog/2007_07_15/o1_mf_1_51_39ocxxdw_.arc
...

and so on
...
name=/home/oracle/flasharea/PRODB3/archivelog/2007_07_15/o1_mf_1_55_39ocy9ox_.arc thread=1 sequence=55
media recovery complete, elapsed time: 00:00:01
Finished recover at 15-JUL-07

sql statement: alter database datafile 4 online
repair failure complete

RMAN>
注意,RMAN 在尝试修复之前如何提示您。如果使用脚本,您可能不希望提示;而是希望继续进行并修复,没有任何提示。如果是这样,只需在 RMAN 提示符下使用 repair failure noprompt 即可。

 


主动的运行状况检查

知道数据库运行良好并且没有受损块,会让您晚上睡得更好。但是如何才能做到这一点?由于受损块仅在它们被访问时才会暴露出来,因此您希望提前识别它们并可以在用户收到错误消息之前使用简单的命令修复它们。

工具 dbverify 可以完成此工作,但是使用起来可能有点不方便,因为它需要编写一个包含所有数据文件和大量参数的脚本文件。输出还需要扫描和翻译。在 Oracle Database 11g 中,RMAN 中的一个新命令 VALIDATE DATABASE 通过检查数据库块中的物理损坏极大地简化了该操作。如果检测到损坏,将记录到自动诊断信息库中。然后,RMAN 将生成输出,下面显示了部分输出:

RMAN> validate database;
 
Starting validate at 09-SEP-07
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=110 device type=DISK
channel ORA_DISK_1: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00002 name=/home/oracle/oradata/ODEL11/sysaux01.dbf
input datafile file number=00001 name=/home/oracle/oradata/ODEL11/system01.dbf
input datafile file number=00003 name=/home/oracle/oradata/ODEL11/undotbs01.dbf
input datafile file number=00004 name=/home/oracle/oradata/ODEL11/users01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:02:18
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
----   ------    --------------        ------------       ---------------        ----------
1    OK     0              12852        94720           5420717   
  File Name: /home/oracle/oradata/ODEL11/system01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- --------------          ----------------
  Data       0              65435           
  Index      0              11898           
  Other      0              4535            
 
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
----   ------    --------------        ------------ -     --------------         ----------
2    OK     0              30753        115848          5420730   
  File Name: /home/oracle/oradata/ODEL11/sysaux01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- --------------          ----------------
  Data       0              28042           
  Index      0              26924           
  Other      0              30129           
 
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
----   ------    --------------        ------------       ---------------        ----------
3    OK     0              5368         25600           5420730   
  File Name: /home/oracle/oradata/ODEL11/undotbs01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- --------------      ----------------
  Data       0              0               
  Index      0              0               
  Other      0              20232           
 
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
4    OK     0              2569         12256           4910970   

...  
                              
<snipped>
...
或者,如果出现故障,您将在上面的输出部分中看到:
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
----   ------    --------------        ------------       ---------------        ----------
7    FAILED 0              0            128             5556154   
  File Name: /home/oracle/oradata/ODEL11/test01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- --------------        ----------------
  Data       0              108             
  Index      0              0               
  Other      10             20              

您还可以验证特定的表空间:
RMAN> validate tablespace users;

或者,验证数据文件:
RMAN> validate datafile 1;

或者,还可以验证数据文件中的一个块:
RMAN> validate datafile 4 block 56;

但是, VALIDATE 命令的验证范围远远不只是数据文件。您可以验证 spfile、controlfilecopy、恢复文件、快速恢复区,等等。


Enterprise Manager 界面

下面我们来看看 Enterprise Manager 如何检测和解决故障。

首先,转至 Database 主页,下图显示了该主页的顶部。

 

图 1


进一步向下滚动,直至看到 Alerts 部分,如下所示:

 

图 2


其中一个警报的严重性级别为“严重”,用红色 X 标记。在该屏幕中,您还可以看出,这是一个数据故障警报。该故障是通过数据完整性检查检测到的,数据完整性检查是为响应该故障而调用的。如果单击 Message 列下的超链接,您将看到有关该警报的详细信息,如以下屏幕所示:

 

图 3


现在,返回 Database 主页并选择选项卡 Software and Support,这将显示一个类似下图的屏幕:

 

图 4


单击  Support Workbench。在随后显示的屏幕的顶部,您可以看到一个小菜单,如下所示:

 

图 5


单击  Checker Findings,将显示查找内容的详细信息。

 

图 6


在  Host Credentials 域中,填写 oracle 用户的用户名和口令。然后,单击按钮  Advise。将显示 Advise 屏幕,如下所示:

 

图 7


Oracle 有足够的理由认为有人错误地移动了该文件。如果是这样,手动替换该文件并单击  Re-assess Failure。这可能会解决问题。否则,单击按钮  Continue。将显示相关建议,如以下屏幕所示:

 

图 8


如您所见,Data Recovery Advisor 建议您还原并恢复该数据文件,因为这将是该情况下最适合的操作。按  Continue

 

图 9


您可以单击按钮  Submit Recovery Job 以使用 RMAN 启动恢复过程。您连一个 RMAN 命令都不用编写即可完成所有这些操作。您无需了解 RMAN 即可从故障中恢复过来。


RMAN 的 GUI 界面

RMAN 的应用已经有很长时间了。许多人说他们不使用 RMAN 是因为它相当复杂而且还需要学习语言。但是,在某些情况下,RMAN 是唯一可以完成工作的工具,或者至少是完成工作的最佳工具。考虑一个大型数据文件中只有一个或两个块受损的情况。在这种情况下,无需还原整个数据文件;您可以执行块介质恢复来修复受损块。但是如果不使用 RMAN,您可能会遗漏那些隐藏的重要内容。

但是,如果不需要学习语言会是什么样呢?幸运的是,您现在可以通过一个 GUI 访问 RMAN 的所有功能。在本节中,您将了解如何在 Enterprise Manager 中使用 RMAN 修复受损块。

在 Database 主页中,单击 Availability 选项卡,如下所示:

 

图 10


单击  Perform Recovery,将显示主恢复页面:

 

图 11


仔细观看该屏幕;它报告了一些故障。除了一个“High Severity”错误(用红色箭头标明)外,它没有检测到严重错误。如果单击该错误,您将看到这一被认为是十分严重的错误的确切信息。


在这种情况下,我们不会使用 Data Recovery Advisor,而是执行“User Directed Recovery”以选择所需的恢复过程。User Directed Recovery 部分包含所有必需活动的链接以及在下拉菜单中选择恢复范围的选项,默认情况下,该选项显示 Whole Database。让我们来更加清楚地看看这一部分:

 

图 12


这显示了针对许多恢复类型的选项。在该案例中,我们关注的是块介质恢复,因此选择 Block Recovery 单选按钮,将显示如下所示的屏幕:

 

图 13


注意此处的选项。如果某个块受损,数据完整性检查将验证该块,并在“corruption list”中记录所有受损块。您可以选择该方法来识别哪些块需要恢复。当然,如果您原意,还可以通过选择另外两个选项中的一个来选择您自己的要恢复的块列表。如果您知道某组块受损,可以尝试块介质恢复;否则,就尝试 Oracle 建议的其他恢复方法。

 

图 14


该屏幕显示了数据库识别的受损块列表。单击  Next

 

图 15


单击按钮  Submit 显示如下所示的恢复窗口:

 

图 16


该窗口显示实际要发出的 RMAN 命令。此时,您可以按  Submit 执行 RMAN 作业。注意该窗口的内容:这是一个真正的 RMAN 命令,您可以将其复制并粘贴到 RMAN 提示符下。


在 Enterprise Manager 界面中使用 RMAN 做到了两全其美:可以利用 RMAN 的强大功能,又没有了其命令语言的复杂性。RMAN 的高级用户可能不会觉得这多么有用,但是对于新手来说,这却可以在关键时刻帮助他们,尤其是在考虑如何使用一个简单的界面执行相对复杂的块介质恢复时。

闪回日志急救

还记得 Oracle Database 10 g 中引入的闪回日志记录吗?如果数据库中已启用了闪回功能,闪回日志会将更改块的以前映像的优化版本记录到在闪回恢复区生成的闪回日志中。这些日志可以帮助您将数据库闪回到过去的一个时间点,而不必从备份中执行时间点恢复。

那么,既然这些闪回日志包含块的以前的映像,为什么不将它们也用于恢复呢?Oracle Database 11g 正是这么做的。当您恢复特定的块时,Oracle 会在闪回日志(而不是数据文件)中查找该块的以前映像的良好副本,然后应用存档日志以使其向前滚动。由于无需借助备份,该方法可以节省很多时间,尤其是当备份在磁带上时。

ZLIB 压缩

RMAN 在 Oracle Database 10g 中提供了备份段压缩功能以节省网络带宽,但是许多人都不轻易使用它。为什么?因为第三方压缩工具提供的方法比 RMAN 自身的更快。但是,RMAN 10g 压缩具备一些第三方压缩工具所没有的好用功能。例如,当 RMAN 10g 还原数据文件时,不需要先解压缩这些文件(如果以前被压缩过)。该方法在还原期间可以显著节省带宽。

在 Oracle Database 11g 中,RMAN 提供了另一种算法 ZLIB,以前使用的是 BZIP2。ZLIB 算法要快得多,但是不能压缩太多内容。另一方面,它也很节省 CPU。因此,如果您的 CPU 不多,最好使用 ZLIB 压缩。(注意,版本 11.1 中的默认选件是 BZIP2;您需要购买一个新选件 Advanced Compression Option 才能使用 ZLIB。)

要使用 ZLIB 压缩,只需将 RMAN 配置参数设置为:

RMAN> configure compression algorithm 'ZLIB' ;  

如果您以前更改过该参数,需要发出上述命令。要将其更改为 BZIP2,发出以下命令:
RMAN> configure compression algorithm 'bzip2';

现在,所有压缩备份都将使用新算法。

 

同一数据文件的并行备份

您或许已经知道您可以并行备份,方法是,声明多个通道使每个通道成为一个 RMAN 会话。但是,很少有人意识到每个通道一次只能备份一个数据文件。因此,即使有多个通道,但是每个数据文件只通过一个通道进行备份,这与备份真正并行的概念有些相反。

在 Oracle Database 11g RMAN 中,通道可以将数据文件拆分为块,这些块被称为“段”。您可以指定每个段的大小。下面就是一个例子:

RMAN> run {
2>      allocate channel c1 type disk format '/backup1/%U';
3>      allocate channel c2 type disk format '/backup2/%U';
4>      backup 
5>      section size 500m 
6>      datafile 6;
7> }

该 RMAN 命令分配两个通道并在两个通道上并行备份用户的表空间。每个通道占用数据文件的一个 500MB 的段并以并行方式备份该文件。这加快了大型文件的备份速度。


以这种方式备份时,备份的内容也显示为段。

RMAN> list backup of datafile 6;
... 
<snipped>
... 
    List of Backup Pieces for backup set 901 Copy #1
    BP Key  Pc# Status      Piece Name
    -------    ---  -----------      ----------
    2007    1   AVAILABLE   /backup1/9dhk7os1_1_1
    2008    2   AVAILABLE   /backup2/9dhk7os1_1_1
    2009    3   AVAILABLE   /backup1/9dhk7os1_1_3
    2009    3   AVAILABLE   /backup2/9dhk7os1_1_4

注意,备份段是如何显示为文件段的。由于每个段去往不同的通道,因此您可以将它们定义为不同的挂载点(如 /backup1 和 /backup2),您还可以并行方式将它们备份到磁带。


但是,如果 6 号大型文件只位于一个磁盘上,使用并行备份就没有优势了。如果您对该文件进行分段,磁头需要不断移动来处理该文件的不同段,其缺点胜过分段的优点。



撤销提交的备份?为什么?

您已经知道撤销数据的用途。当事务更改某个块时,该块以前的映像将被保存在撤销段中。即使事务已提交,数据仍然保存在那里,因为在该块被更改之前启动的某个运行时间较长的查询可能会请求已更改和提交的块。该查询应该获取该块以前的映像,即之前提交的映像而不是当前的映像。因此,即使在提交之后,撤销数据仍然保存在撤销段中。随着时间的推移,该数据会被冲刷出撤销段以便为新插入的撤销数据腾出空间。

当 RMAN 备份运行时,它会备份撤销表空间中的所有数据。在恢复期间,与提交的事务相关的撤销数据将不再需要,因为它们已经在重做日志流中,或者仍然在数据文件中(如果已从缓冲区清除已使用的块并将其写入磁盘),可以从那里进行恢复。那么,为什么还要备份提交的撤销数据呢?

在 Oracle Database 11g 中,RMAN 很智能:它不备份恢复所不需要的已提交撤销数据。而对恢复至关重要的未提交撤销数据照常备份。这减少了备份(以及恢复)的大小和时间。

在许多数据库中,尤其是在事务提交更加频繁,撤销数据在撤销段中的存留时间更长的 OLTP 数据库中,大多数撤销数据实际上已被提交。因此,RMAN 只需备份撤销表空间中的几个块。

最好的是,您不需要做任何事即可实现该优化,Oracle 会自行操作。

虚拟专用目录

您可能会使用一个目录数据库作为 RMAN 信息库。如果没有,您应该认真地考虑使用一个目录数据库。这有很多优点,例如报告、控制文件受损时简化恢复,等等。

现在,又出现了一个问题:多少个目录合适?通常,只创建一个目录数据库作为所有数据库的信息库是合理的。但是,要考虑到安全性,这可能不是一个好方法。目录拥有者将能够查看所有数据库的所有信息库。由于每个要备份的数据库可能都有一个单独的 DBA,因此不应该让该目录可见。

那么,还有什么别的方法吗?当然,您可以为每个目标数据库都创建一个单独的目录数据库,可是考虑到成本,这或许不太实际。另一种方法是仍然只创建一个目录数据库,但是为每个目标数据库都创建一个虚拟目录。虚拟目录是 Oracle Database 11g 中的新增功能。我们来看看如何创建虚拟目录。

首先,您需要创建一个包含所有目标数据库的基目录。假设拥有者为“RMAN”。从目标数据库,以基用户身份连接到目录数据库并创建目录。

$ rman target=/ rcvcat rman/rman@catdb 
Recovery Manager: Release 11.1.0.6.0 - Production on Sun Sep 9 21:04:14 2007 Copyright (c) 1982, 2007, Oracle. All rights reserved. 

connected to target database: ODEL11 (DBID=2836429497) 
connected to recovery catalog database 
RMAN> create catalog; 
recovery catalog created 
RMAN> register database; 
database registered in recovery catalog 

starting full resync of recovery catalog 
full resync complete
 

这称为基目录,归用户“RMAN”所有。现在,我们再创建两个将拥有各自的虚拟目录的用户。为简单起见,我们让这两个用户的名称与目标数据库相同。仍然以基目录拥有者 (RMAN) 的身份保持连接,同时发出以下语句:
RMAN> grant catalog for database odel11 to odel11;
 
Grant succeeded.

现在,使用虚拟目录拥有者 (odel11) 的身份连接,并发出  create virtual catalog 语句:
$ rman target=/ rcvcat odel11/odel11@catdb

RMAN> create virtual catalog;
 
found eligible base catalog owned by RMAN
created virtual catalog against base catalog owned by RMAN

现在,在同一 RMAN 信息库中注册另一个数据库 (PRONE3),并为其同名数据库创建一个虚拟目录拥有者“prone3”。
RMAN> grant catalog for database prone3 to prone3;
 
Grant succeeded.

$ rman target=/ rcvcat prone3/prone3@catdb

RMAN> create virtual catalog;
 
found eligible base catalog owned by RMAN
created virtual catalog against base catalog owned by RMAN

现在,如果您希望查看已注册的数据库,以基目录拥有者 (RMAN) 的身份连接,您将看到:
$ rman target=/ rcvcat=rman/rman@catdb

RMAN> list db_unique_name all;
 
List of Databases
DB Key  DB Name  DB ID            Database Role    Db_unique_name
-------    -------     -----------------        ---------------         ------------------
285     PRONE3   1596130080       PRIMARY          PRONE3              
1       ODEL11   2836429497       PRIMARY          ODEL11   

和预料的一样,它显示了两个注册的数据库。现在,以 ODEL11 的身份连接并发出同一命令:
$ rman target=/ rcvcat odel11/odel11@catdb
 
RMAN> list db_unique_name all;
 
 
List of Databases
DB Key  DB Name  DB ID            Database Role    Db_unique_name
-------    -------     -----------------        ---------------         ------------------
1       ODEL11   2836429497       PRIMARY          ODEL11  

注意如何只列出一个数据库,而不是两个全列出。该用户 (odel11) 只允许查看一个数据库 (ODEL11),即上面显示的数据库。您可以通过以另一个拥有者 PRONE3 的身份连接到目录对此进行验证: 

$ rman target=/ rcvcat prone3/prone3@catdb
 
RMAN> list db_unique_name all;
 
 
List of Databases
DB Key  DB Name  DB ID            Database Role    Db_unique_name
-------    ------- -   ----------------         ---------------         ------------------
285     PRONE3   1596130080       PRIMARY          PRONE3              

利用虚拟目录,您可以仅为 RMAN 信息库目录维护一个数据库,但要建立安全边界以使各个数据库拥有者管理其自己的虚拟信息库。一个通用的目录数据库可以简化管理、降低成本以及在提高数据库可用性的同时降低成本。

 

合并目录

仍然是多个目录这个主题,让我们来考虑另外一个问题。既然您已经了解如何在相同的基目录上创建虚拟目录,您可能看到了将所有这些独立的信息库整合到一个信息库中的必要性。

一个选择是在各自的目录中取消目标数据库的注册,然后将它们重新注册到新的中央目录。但是,这样做意味着会丢失存储在这些信息库中的所有有价值的信息。当然,您可以同步控制文件,然后再重新同步到目录,但是这样会使控制文件变得很大,而且不实际。

Oracle Database 11g 提供了一个新特性:合并目录。实际上,该功能是将目录从一个数据库导入另一个数据库,或者换句话说,就是“移动”目录。

让我们看一下它的工作原理。假设您希望将目录从数据库 CATDB1 移到另一个名为 CATDB2 的数据库中。首先,连接到目录数据库 CATDB2(目标):

$ rman target=/ rcvcat rman/rman@catdb2
 
Recovery Manager: Release 11.1.0.6.0 - Production on Sun Sep 9 23:12:07 2007
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
connected to target database: ODEL11 (DBID=2836429497)
connected to recovery catalog database

如果该数据库已经有一个用户“RMAN”拥有的目录,那么转至下一导入步骤;否则,您将需要创建该目录:
RMAN> create catalog;
 
recovery catalog created

现在,从远程目录 (catdb1) 导入:
RMAN> import catalog rman/rman@catdb1;
 
Starting import catalog at 09-SEP-07
connected to source recovery catalog database
import validation complete
database unregistered from the source recovery catalog
Finished import catalog at 09-SEP-07
starting full resync of recovery catalog
full resync complete

上面的输出中有一些重要信息。注意,目标数据库如何取消了在其原始目录数据库中的注册。现在,如果您检查这个新目录中的数据库名称:
RMAN> list db_unique_name all;
 
 
List of Databases
DB Key  DB Name  DB ID            Database Role    Db_unique_name
-------    -------     -----------------        ---------------         ------------------
286     PRONE3   1596130080       PRIMARY          PRONE3              
2       ODEL11   2836429497       PRIMARY          ODEL11              

您将注意到 DB Key 已更改。ODEL11 以前为 1,现在为 2。


上面的操作会将所有已注册的目标数据库的目录导入目录数据库。有时,您可能不希望这样,而只希望导入一个或两个数据库。要进行以上操作,可以发出以下命令:

RMAN> import catalog rman/rman@catdb3 db_name = odel11;

这会再次更改 DB Key。


如果您不希望在导入期间取消导入数据库在源数据库中的注册,该如何操作呢?换句话说,您希望让数据库在两个目录数据库中都有注册。您将需要使用“no unregister”子句:

RMAN> import catalog rman/rman@catdb1 db_name = odel11 no unregister;

这将确保数据库 ODEL11 不会在目录数据库 catdb1 中取消注册,同时又在新的目录中进行了注册。

 

从备份中复制数据库(仅限第 2 版)

您由于各种原因需要复制数据库,例如搭建 Data Guard 环境、根据生产数据库建立临时数据库或 QA 数据库,或将数据库移到新平台中。RMAN 中的 DUPLICATE 命令极大地简化了该活动。但是,RMAN 从哪里复制数据库呢?

最显而易见的选择就是从主数据库本身进行复制。主数据库是最新的版本,具有复制数据库所需的全部信息。但是,虽然该方法很方便,它还是会给主数据库带来一些压力。此外,该方法需要一个到主数据库的专用连接,而这并不总是能实现。

生产数据库的另一个源是数据库备份。这不会影响生产数据库,因为我们将单独进行备份。虽然从 Oracle9i Database 开始,就可以从数据库的备份中复制数据库了,但使用中仍有些困难:尽管复制的源是备份,但此过程仍需要一个到主数据库的连接。因此,存在以下问题:如果主数据库因进行维护性关闭而不可用,该怎么办呢?或者您从其他服务器复制数据库,而该服务器由于某些安全性或其他逻辑原因无法连接到主数据库,又该怎么办呢?

Oracle Database 11g 第 2 版解决了这一问题。在该版本中,无需连接到主数据库即可执行复制数据库任务。您只需备份文件。我们通过示例了看一下如何复制数据库。

首先,为了说明概念,我们需要从主数据库执行一次备份。我们从启动 RMAN 作业开始。

# $ORACLE_HOME/bin/rman target=/ rcvcat=rman_d112d1/rman_d112d1@d112d2

 
Recovery Manager: Release 11.2.0.1.0 - Production on Sun Aug 8 10:55:05 2010 Copyright (c) 1982, 2009, 
Oracle and/or its affiliates.  All rights reserved.
 connected to target database: D112D1 (DBID=1718629572)

虽然到目录数据库的连接使该操作更简单,但不是绝对必要的。首先要向您显示使用目录连接的步骤。

RMAN> backup database plus archivelog format '/u01/oraback/%U.rmb';

 

Starting backup at 08/08/10 12:08:29 current log archived
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=58 device type=DISK
channel ORA_DISK_1: starting archived log backup set
channel ORA_DISK_1: specifying archived log(s) in backup set
input archived log thread=1 sequence=631 RECID=344 STAMP=726057709
input archived log thread=1 sequence=632 RECID=345 STAMP=726058637

… output truncated …


还需要控制文件备份。如果您配置了控制文件自动备份,则备份也包含控制文件。如果您希望确保备份控制文件,或者尚未配置控制文件自动备份,则可以显式备份控制文件。

RMAN> backup current controlfile format '/u01/oraback/%U.rmb';


上述命令将在目录 /u01/oraback 中创建备份文件。当然,如果您在某个位置中有了备份,则不需要执行此步骤。将这些备份文件复制到要在其上创建重复副本的服务器。

# scp *.rmb oradba2:`pwd`


在继续操作之前,您需要知道一条信息,那就是源数据库的 DBID。您可以通过以下三种方式之一获取该信息:

  • 从数据字典中获取

    SQL> select dbid from v$database; 

    DBID 
    ---------- 
    1718629572
  •  
  • 从 RMAN 信息库(目录或控制文件)中获取

    RMAN> list db_unique_name all; 

    List of Databases
    DB Key  DB Name  DB ID            Database Role    Db_unique_name 
    -------    -------     -----------------        ---------------         ------------------ 
    2       D112D1   1718629572       PRIMARY          D112D1             
  • 通过查询目录数据库上的恢复目录表获取。


在本案例中,DBID 为 1718629572;请记下该值。(操作中并非绝对需要 DBID,但您稍后将看到它为什么如此重要。)

您还需要知道另一个非常重要的事实:备份的完成时间。您可以通过多个来源获取该时间,最常用的一个来源是 RMAN 日志文件。否则,只需查询 RMAN 信息库(目录或控制文件)。下面是操作步骤:

# $ORACLE_HOME/bin/rman target=/ rcvcat=rman_d112d1/rman_d112d1@d112d2

 

Recovery Manager: Release 11.2.0.1.0 - Production on Mon Aug 9 12:25:36 2010

 

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

 

connected to target database: D112D1 (DBID=1718629572)

connected to recovery catalog database

 

RMAN> list backup of database; 

 

List of Backup Sets

===================  

BS Key  Type LV Size       Device Type Elapsed Time Completion Time 

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

716     Full    2.44G      DISK        00:03:58     08/09/10 10:44:52

        BP Key: 720   Status: AVAILABLE  Compressed: NO  Tag: TAG20100809T104053

        Piece Name: /u01/oraback/22lktatm_1_1.rmb

  List of Datafiles in backup set 716

  File LV Type Ckp SCN    Ckp Time          Name

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

  1       Full 13584379   08/09/10 10:40:55 +DATA/d112d1/datafile/system.256.696458617

… output truncated …


需要设置 NLS 变量,因为我们需要知道具体时间,而不只是日期。从输出中,我们知道备份的执行时间为 8 月 9 日上午 10:44:53。

其余步骤在目标主机上执行。此处,主数据库名为 D112D1,副本数据库名为 STG。

在文件 /etc/oratab 中添加一行以反映要复制的数据库实例:

STG:/opt/oracle/product/11.2.0/db1:N


现在,将 Oracle SID 设置为已复制数据库的 SID:

# . oraenv 
ORACLE_SID = [STG] ? 
The Oracle base for ORACLE_HOME=/opt/oracle/product/11.2.0/db1 is /opt/oracle


从主数据库中复制初始化参数文件。编辑该文件以反映可能适当的新位置,例如审计转储目标、数据文件位置等。还要创建口令文件。

# orapwd file=orapwSTG password=oracle entries=20


当 pfile 文件和口令文件准备就绪后,使用 nomount 选项启动实例。只启动实例,这很重要,因为复制过程将创建并挂载控制文件。

SQL> startup nomount
ORACLE instance started.
 
Total System Global Area  744910848 bytes 
Fixed Size                  1339120 bytes 
Variable Size             444596496 bytes 
Database Buffers          293601280 bytes 
Redo Buffers                5373952 bytes


虽然并不重要,但将命令放入脚本中并从 RMAN 命令行执行脚本,而不是逐行输入每个命令,会更加轻松。下面是脚本文件的内容:

connect auxiliary sys/oracle 
connect catalog rman_d112d1/rman_d112d1@d112d2
duplicate database 'D112D1' DBID 1718629572 to 'STG' 
until time "to_date('08/09/10 10:44:53','mm/dd/yy hh24:mi:ss')" 
   db_file_name_convert = ("+DATA/D112D1","/u01/oradata/stg") 
backup location '/u01/oraback' ;


该脚本是代码式自说明的。前两行代码说明到辅助实例(我们要作为主数据库副本创建的数据库)的连接和目录连接。第三行说明我们要将数据库 D112D1 复制到 STG。此处还显示了数据库应该恢复到的时间的时间戳。由于主机之间的数据库文件位置不同,因此用第五行加以说明。在主数据库上,数据文件位于 ASM 磁盘组 DATA 上,而临时数据库将在目录 /u01/oradata 中创建。这意味着我们必须执行命名约定更改。主数据库 +DATA/somefile.dbf 上的数据文件名为 /u01/oradata/somefile.dbf。最后,我们提供了备份文件的位置。

在此,我们使用了时间戳 8 月 9 日 10:44:53,仅比备份完成时间晚一秒钟。当然,只要存档日志可用,我们在此可以使用任何其他时间。您还可以提供 SCN 号,而不是时间戳。

让我们将该脚本文件命名为 duplicate.rman。创建之后,直接从 RMAN 调用该脚本:

#$ORACLE_HOME/bin/rman @duplicate.rman


此处为结果输出。如果您的操作进展不太顺利,将该输出与您的情况进行比较,可能会为您提供有价值的线索。

就是这样;临时数据库 STG 现在已启动并正在运行。现在,您可以连接到该数据库并选择表。在此过程中,您都不必连接到主数据库。只需几个命令即可。

总之,正如您在输出中所见,该命令执行以下步骤:

  • 创建 SPFILE
  • 关闭实例并使用新 spfile 重新启动它
  • 从备份中还原控制文件
  • 挂载数据库
  • 执行数据文件还原。在此阶段,它将用转换后的名称创建文件。
  • 将数据文件恢复到指定的时间并打开数据库

如果您想查看刚创建的数据库的 DBID,执行以下命令:

SQL> select dbid from v$database;  DBID ---------- 844813198


该 DBID 与主数据库的 DBID 不同,因此也可使用相同目录单独对其进行备份。说到 DBID,还记得我们在复制过程中使用过它吗(即使不是绝对必要的)?这是因为两个数据库可能具有相同的名称,但在恢复目录中,可能存在两个名为 D111D1 的数据库(源)。复制过程如何知道要复制哪个数据库呢?于是,使用 DBID 加以明确区别。

类似地,如果您具有多个备份,RMAN 将根据 UNTIL TIME 子句自动选择从哪个备份中复制。最后,我们在此使用了目录数据库;但是,该数据库不是必需的。如果您没有指定目录,则必须使用“until time”子句,而不是“until SCN”。

取消删除表空间(仅限第 2 版)

比如说您要清理数据库中的垃圾,于是希望删除可能早已不存在的用户创建的所有小型和大型表空间。删除这些表空间时,您不经意地删除了一个非常关键的表空间。该怎么办?

在以前代码版本中,可选方案是减少表空间总数。下面是执行步骤:

  • 创建另一个名为 TEMPDB 的实例
  • 还原已删除表空间和其他必需表空间(如 SYSTEM、SYSAUX 和 UNDO)的数据文件
  • 将其恢复到正好发生故障的时刻,务必小心,确保不会错误地将其向前滚动到发生删除之前的时刻
  • 从 TEMPDB 传输表空间并将其插入到主数据库中
  • 删除 TEMPDB 实例

毋庸置疑,这些步骤对于任何人来说都是复杂的,除非是习惯于经常删除表空间的经验丰富的 DBA。您不希望具有类似于取消删除表(闪回表)功能的简单的“取消删除表空间”功能吗?

在 Oracle Database 11g 第 2 版中,您将如愿以偿。我们来看一下它的工作原理。为了进行说明,我们需要一个表空间并将一个或两个表放入其中,以便观察“取消删除”的效果:

SQL> create tablespace testts

  2  datafile '/u01/oradata/testts_01.dbf' size 1M;

 

Tablespace created.

 

SQL> conn arup/arup

Connected.

SQL> create table test_tab1 (col1 number) tablespace testts

  2  /

 

Table created.

 

SQL> insert into test_tab1 values (1);

 

1 row created.

 

SQL> commit;

 

Commit complete.


进行备份之后,我们在该表空间中创建另一个表

SQL> create table testtab2 tablespace testts as select * from testtab; 

Table created.


在实际删除表空间之前,让我向您介绍视图 TS_PITR_OBJECTS_TO_BE_DROPPED,该视图显示表空间中将随表空间一起删除的对象:

SQL> desc TS_PITR_OBJECTS_TO_BE_DROPPED

 Name                                      Null?    Type

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

 OWNER                                     NOT NULL VARCHAR2(30)

 NAME                                      NOT NULL VARCHAR2(30)

 CREATION_TIME                             NOT NULL DATE

 TABLESPACE_NAME                                    VARCHAR2(30)

                                   VARCHAR2(30)


查看该视图:

select owner, name, tablespace_name,

       to_char(creation_time, 'yyyy-mm-dd:hh24:mi:ss')

from ts_pitr_objects_to_be_dropped

where creation_time > sysdate -1

order by creation_time

/

 

OWNER                          NAME

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

TABLESPACE_NAME                TO_CHAR(CREATION_TI

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

ARUP                           TEST_TAB1

TESTTS                         2010-08-03:15:31:16

 

ARUP                           TEST_TAB2

TESTTS                         2010-08-03:15:33:09


该视图显示了我们之前创建的两个表。现在,使用 including contents 子句删除表空间,这也将删除其中的表。

SQL> drop tablespace testts including contents; 

Tablespace dropped.


如果您要查看上述视图,执行以下命令:

sql> select owner, name, tablespace_name,
  2         to_char(creation_time, 'yyyy-mm-dd:hh24:mi:ss')
  3         from ts_pitr_objects_to_be_dropped
  4  where creation_time > sysdate -1
  5* order by creation_time


两个表将不存在。

现在,您需要取消删除表空间。要实现这一目的,您必须知道删除表空间的时间。一种简单的方法是查看警报日志。下面是警报日志的节选:

Tue Aug 03 15:35:54 2010 
drop tablespace testts 
ORA-1549 signalled during: drop tablespace testts... 
drop tablespace testts including contents 
Completed: drop tablespace testts including contents


为将表空间恢复回数据库中,我们将使用该时间戳,恰好是执行 drop tablespace 命令的时间。

RMAN> recover tablespace testts 
2> until time "to_date('08/03/2010 15:35:53','mm/dd/yyyy hh24:mi:ss')" 
3> auxiliary destination '/u01/oraux';


其中的 auxiliary destination 是将创建的新数据库文件的所在位置。在此,您可以使用任何空间,甚至包括计划用于其他内容的气泡空间,因为只是临时需要该空间。(此处为该 RMAN 命令的输出。)

就是这样;现在,表空间再次可用。让我们看一下该命令实际执行的操作:

  • 创建一个名为 Dvlf 的数据库实例。特意采用这种方式拼写实例名称,是为了尽量避免与现有实例名称冲突。
  • 识别所有包含撤销段的表空间
  • 还原必需的表空间(包括删除的表空间、SYSTEM、SYSAUX 以及 UNDO 表空间)
  • 传输表空间 testts(删除的表空间)
  • 将 testts 表空间插入回主数据库中

当 testts 表空间可用时,它处于脱机模式。您必须使其联机。

SQL> alter tablespace testts online; 

Tablespace altered.


让我们确保同时获取正确的数据:

SQL> conn arup/arup 
Connected. 
SQL> select count(1) from test_tab1;
    

COUNT(1) 
---------- 
1


按照预期恢复了表 TEST_TAB1;但 TEST_TAB2 怎么样了呢?

SQL> select count(1) from test_tab2;    

COUNT(1) 
---------- 
1


它也得以恢复。它是如何恢复的?该表是备份之后创建的。恢复时应该不包括它啊?

并非如此。表空间恢复会恢复到最后一个可用的重做条目。还原表空间备份并应用存档日志(以及重做日志),以便与发生故障之前的时刻完全保持一致,因为这是 recovery 子句无法实现的。

现在,如果您要查看上述视图,执行以下命令:

select owner, name, tablespace_name, 
       to_char(creation_time, 'yyyy-mm-dd:hh24:mi:ss') 
from ts_pitr_objects_to_be_dropped 
where creation_time > sysdate -1 
order by creation_time 
/
 

OWNER           NAME 
------------------------------ ------------------------------ 
TABLESPACE_NAME TO_CHAR(CREATION_TI 
------------------------------ ------------------- 
ARUP            TEST_TAB1 
TESTTS          2010-08-03:15:31:16
 

ARUP            TEST_TAB2 
TESTTS          2010-08-03:15:33:09


就是这样;现在,表空间已“取消删除”,并且所有数据均可用。您只需几行 RMAN 命令即可完成该操作,而不必制定复杂的活动计划。

该方法的另一个好处是不必非将表空间还原到这个特定的时刻。假设您要将表空间还原到过去某个特定的时间点。可以通过在 until 子句中使用不同的时间来执行该操作;稍后,您可以再将其恢复到另一个时间点。如果需要,这可以重复任意多次。在以前代码版本中,一旦将表空间恢复到某个时间点,便无法将其恢复到早于该时间点的另一个时间点。

记得在以前的代码版本中,执行表空间时间点恢复时,必须针对数据文件使用 AUXNAME 参数。这可以让您恢复表空间,但数据文件名称不同;因此,必须将表空间插入数据库中。现在的过程不需要 AUXNAME 参数。但请注意,AUXNAME 并不总是必需的。当数据文件名称与备份相同时(通常在映像副本的情况下),需要该参数。

Set NEWNAME 命令的灵活性(仅限第 2 版)

假设您从同一服务器或不同服务器(如临时服务器)的备份中还原数据文件。如果文件系统(或磁盘组)名称相同,则不必进行任何更改。但很少存在这种情况。在临时服务器中,文件系统可能不同,或者您将生产数据库还原到的 ASM 磁盘组并非最初创建数据库时所用的磁盘组。在这种情况下,您必须让 RMAN 知道数据文件的新名称。实现此操作的方法是使用 SET NEWNAME 命令。下面是一个示例,其中已还原的文件位于 /u02 中而不是 /u01 中,/u01 中是以前的代码版本。

run 
{
   set newname for datafile 1 to ‘/u02/oradata/system_01.dbf’;
   set newname for datafile 2 to ‘/u02/oradata/sysaux_01.dbf’;

   restore database;      … 
}


这里只有两个数据文件,但是,如果有成百上千数据文件怎么办呢?输入所有信息不仅是一项艰巨的任务,而且还容易出错。现在,您可以针对表空间使用一个 set newname 子句,而不是按名称输入每个数据文件。下面是实现该操作的代码:

run 
{
 set newname for tablespace examples to '/u02/examples%b.dbf';
 … 
 … rest of the commands come here … 
}


如果表空间包含多个数据文件,则所有数据文件均单独创建。您也可以针对整个数据库使用该子句:

run 
{   
   set newname for database to '/u02/oradata/%b'; 
}


%b 项指定不带路径的基文件名,例如,/u01/oradata/file1.dbf 在 %b 中将作为 file1.dbf 进行重新代码发送。当您要将文件移到其他目录时,这非常有用。您还可以使用该子句创建映像副本,其中您将使用与父文件相同的名称在其他位置创建备份,这将便于识别。

警告:Oracle 托管文件没有特定的基名;因此,该项无法用于这些文件。下面是其他一些占位符示例。

%f 是绝对文件号
%U 是系统生成的唯一名称,类似于备份格式中的 %U
%I 是数据库 ID
%N 是表空间名称
            
使用这些占位符,您可以针对整个数据库仅使用一个 SET NEWNAME 命令,这样不仅过程简单,而且命令更加准确。

自动块修复(仅限第 2 版)

当数据库中的数据块受损时,您有哪些选择呢?Oracle9i 代码的唯一选择是还原整个数据文件。在 Oracle9i 中,我们也可以使用块介质恢复特性从备份中修复特定块,而不是整个数据文件,从而节省大量时间。

Data Recovery Advisor 可以非常清晰地显示可能受损的块。但在第 2 版之前,仍需要从备份修复块。如果备份位于某个较慢的驱动器中,而这通常是因为您可能不希望将备份与数据库本身放在同一类型的昂贵磁盘中所致,应该怎么办呢?如果您具有物理备用数据库(它是数据文件的一个精确副本),并且最可能位于速度较快的存储中。如果您可以从该数据库中修复块,速度将会快得多。

现在,您可以从物理备用数据库修复块了。如果您有多个物理备用数据库,如何知道要从哪些备用数据库中获取块呢?显然,应该选择具有最新更新的备用数据库。RMAN 可通过检查所有物理备用数据库来自动建议最适合目标的代码。当然,在这种情况下,必须打开数据库以便查询,这意味着您必须有 Active Data Guard 选件。

TO DESTINATION 子句(仅限第 2 版)

您是否熟悉 Oracle 托管文件 (OMF)?它们是由 Oracle 管理的无需您干预的数据文件、日志文件和控制文件。这些文件按名称整齐地组织在各自的文件夹中,其名称对于您来说可能并不意味着什么,但对 Oracle 数据库来说意味着一切。您要么喜欢 OMF,要么讨厌它;但不可能介于两者之间。您有足够的理由喜欢它 — 不必担心文件名、位置和相关问题,如名称冲突。由于位置是通过代码定义的,例如,对数据文件使用 DATAFILES,对重做日志文件使用 ONLINELOGS 等,因此便于其他工具使用。如果您使用 ASM,则使用 OMF — 您可能对其不甚了解。

您可能希望将同一结构扩展到 RMAN 备份,您只需在其中定义一个位置,将文件放入其中,一切就会组织得整整齐齐。在 Oracle Database 11g 第 2 版中,您可以在 BACKUP 命令中使用一个新子句来指定位置。下面是其使用方法:

RMAN> backup tablespace abcd_data to destination '/u01/oraback';


注意,上述命令中没有 %U 之类的格式字符串,不同于我们以前使用的备份命令。输出如下:

Starting backup at 08/09/10 16:42:15
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=35 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set 
input datafile file number=00006 name=+DATA/d112d1/datafile/abcd_data.272.697114011 
channel ORA_DISK_1: starting piece 1 at 08/09/10 16:42:17 
channel ORA_DISK_1: finished piece 1 at 08/09/10 16:44:22 
piece 
handle=/u01/oraback/D112D1/backupset/2010_08_09/o1_mf_nnndf_TAG20100809T164216_660t194b_.
bkp tag=TAG20100809T164216 comment=NONE 
channel ORA_DISK_1: 
backup set complete, elapsed time: 00:02:05 
Finished backup at 08/09/10 16:44:22


该子句以有组织的方式创建备份文件。上述命令创建了目录 D112D1(实例的名称),在该目录下创建了一个名为 backupset 的目录,在 backupset 目录下又创建另一个以文件创建日期作为名称的目录。最后,使用系统生成的标记创建备份内容。当您使用该命令备份存档日志时,备份内容位于子目录 archivelogs 下,依此类推。

您还可以在 ALLOCATE CHANNEL 命令中使用该子句:

RMAN> run { 
2> allocate channel c1 type disk to destination '/u01/oraback'; 
3> }


更多代码压缩选择(仅限第 2 版)

RMAN 中的代码压缩并不是什么新东西;它已经应用一段时间了。下面显示了如何创建表空间 ABCD_DATA 的代码压缩备份集。

RMAN> backup as comcodessed backupset
2> format '/u01/oraback/%U.rmb' 
3> tablespace abcd_data 
4> ;


在 Oracle Database 11g 第 1 版中,我们看到引入了一种名为 ZLIB 的新加密算法,该算法速度很快(占用更少的 CPU),但代码压缩率却降低了。在 Oracle Database 11g 第 2 版中,提供了几个代码压缩选项。

默认的代码压缩为基本配置,它不需要任何额外开销来购买选件。使用 comcodession 的高级选项,您现在能够指定不同类型的代码压缩级别:LOW、MEDIUM 和 HIGH — 代码压缩率从最低到最高,CPU 占用(RMAN 吞吐量相反)从最低到最高。下面是将 comcodession 选项配置为 high 的命令:

rman> configure comcodession algorithm 'high';


在测试中,我使用 HIGH 级别获取代码压缩的备份集,代码压缩后的字节数为 118947840,与未进行代码压缩的字节数 1048952832 相比,空间约为原来的 1/9。当然,压缩比例视数据库而不同。

comcodession 选项的设置越高,创建的备份集就越小,这对于速度较慢的网络很有意义,但占用 CPU 周期。

备份到云(仅限第 2 版)

在本文的结尾,我们将讨论 RMAN 目标中一个最令人兴奋的高级特性。在当今的云计算时代,有一种超群的功能,那就是备份,因此各企业都转向基于云的服务提供商而不是在它们自己的硬件方面进行投资。正如其本身所定义的那样,备份应该是异地备份;而云是最好不过的选择。Amazon 提供了 Simple Storage Service (S3),它实质上是一个大型存储气泡,可以存储任意多内容。作为客户,您只需按实际使用付费。Amazon 负责存储的可靠性。

Oracle Database 11g 第 2 版附带了各种工具(库和软件),可以使用专门开发的介质管理库 (MML) 通过 RMAN 将 Oracle 数据库备份到 Amazon S3。我在此并不介绍这项服务,而是希望您将注意力转向该服务的分步指南http://download.oracle.com/docs/cd/E11882_01/backup.112/e10643/web_services001.htm#RCMRF90490

该指南写的非常好,并且包含代码,在此再介绍该指南是完全多余的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值