文章
SQL 和 PL/SQL
Data Guard了解 Active Data Guard 如何通过实时查询,同时应用归档的的日志、将物理备用数据库转换为快照备用数据库以及对基础架构的一系列改进措施,让您对备份环境的投资物有所值。
Oracle 数据库 11g 对 Data Guard 功能进行了多方面的增强,难以详尽说明。因此,在这里我将介绍一些我最感兴趣的功能增强。 备用数据库创建更加简单首先,我们从创建物理备用数据库开始。在 Oracle 数据库 11g 中,物理备用数据库的创建已经变得极为简单,一条 RMAN 命令就可完成整个过程。以前您可能需要使用 Grid Control 向导界面在两台计算机之间完成 Data Guard 设置。在撰写本文时,Oracle 企业管理器网格控制 11g 还未推出,且 Database Control 没有 Data Guard 向导。但不管您是否使用过 SQL 命令,在 Oracle 数据库 11g 中设置 Data Guard 都是非常轻松的。过程如此简单,因此我将在此处介绍所有步骤。 假设您的主数据库名称为 prolin11,运行于 prolin1 服务器上。您想在 prolin2 服务器上设置一个备用数据库。备用数据库实例的名称应当为 pro11sb。以下为设置步骤:
Active Data Guard许久以来,反对使用物理备用数据库构建 Data Guard 环境的传统因素之一是备用数据库的被动性。在 Oracle 数据库 10g 和以前的版本中,您可以打开物理备用数据库进行只读活动(卸去一些报告工作负载),但必须在停止恢复进程后。在这些版本中,如果 Data Guard 是您的 DR 解决方案的一部分,因为怕滞后,您不能承担长时暂停恢复进程的代价,所以物理备用数据库对于只读活动用处全无。 使用 Oracle 数据库 11g,情况将有所不同:您可以通过只读模式打开物理备用数据库,并重新启动恢复进程。这意味着您可以继续与主数据库保持同步,同时能使用备用数据库进行报告。(在以前的版本中,您也可从备用数据库中获取备份。)让我们看一下它的工作原理。 首选,取消管理备用数据库恢复: SQL> alter database recover managed standby database cancel; Database altered.然后以只读方式打开数据库: SQL> alter database open read only; Database altered.到这一步为止,过程与 11g 以前的版本相同。现在,11g 特性将显示其优势:以只读模式打开备用数据库时,您可以重新开始管理恢复进程。 SQL> alter database recover managed standby database disconnect; Database altered.现在备用数据库处于管理恢复模式,在数据库打开时会应用日志文件。如何进行确认?很简单,查看主数据库的最大日志序列号并将其与备用数据库的相对比。在主数据库上,进行日志切换,然后检查最大的日志序列号:
SQL> alter system switch logfile;
System altered.
SQL> select max(Sequence#) from v$log;
MAX(SEQUENCE#)
--------------
79
以只读模式打开备用数据库时进行了日志切换。检查备用数据库中的最大日志序列号:
SQL> select max(Sequence#) from v$log;
MAX(SEQUENCE#)
--------------
79
也是 79,与主数据库中的值一样。这表示日志应用程序仍然在运行中。然而,您可能会问,这是表示应用了日志,可以看到在这一模式中主数据库中的更改吗?让我们来看看。在主数据库上,创建一个表:
SQL> create table test2 (col1 number); Table created.然后进行几次日志切换,直至将那些日志应用至备用数据库。然后检查备用数据库: SQL> desc test2 Name Null? Type ----------------------------------------- -------- --------------------------- COL1 NUMBER立刻!表就出现在了备用数据库上,可供查询。 注意,在这一情况中我们可以使用“实时应用”,这样在网络可用时,对主数据库的更改可立即出现在备用数据库中。RTA 对 ADG 不是绝对必要的,但它可使 ADG 的帮助作用更大,因为您可以看到主数据库上最新的更改。 然而,具有安全意识的读者可能会有点担心。数据库处于只读模式中,所以不能向其中写入数据。如果主数据库的 audit_trail 参数设置为 DB(Oracle 数据库 11g 中的默认值),备用数据库中也相同,但因为是只读的,所以不能将审计跟踪写入数据库中。那这些审计跟踪到哪去了? 注意警报日志中显示的一行: AUDIT_TRAIL initialization parameter is changed to OS, as DB is NOT compatible for database opened with read-only access啊哈!审计跟踪并没有终止,在数据库打开时它们自动地转换为了 OS 文件。当您激活备用数据库时, audit_trail 将自动设置为 DB。 快照备用数据库下面是一个典型场景:假设数据库上部署了一个新应用程序,您想知道它对数据库性能的影响。在 Oracle 数据库 11g 中,提供有一个绝佳的工具(数据库重放),它可以捕获 SQL 语句并将它们“回放”,但要注意:您必须运行它们以了解其影响。从测试系统捕获 SQL 语句而在生产系统上“回放”是不可行的。第一,没有部署;第二,即使部署了,您也不能承担让程序对其他表进行更改的后果。那么应怎么做来查看应用程序的影响呢? Oracle 数据库 11g 给了您完美的答案,在 11g 中,您可以暂时将物理备用数据库转换为可更新的数据库,称为快照备用数据库 (Snapshot Standby Database)。在这一模式中,您可以运行您的应用程序(它可能会更改许多表),然后再分析其影响。评估影响后,您可以将数据库转换为备用数据库,然后进行常规恢复。您可以在数据库中创建一个恢复点来完成这一过程,使用 Flashback 数据库特性“闪回”至该点,恢复所有的更改。让我们看一下它的工作原理: 首先,在备用数据库上启动恢复进程(如尚未开始): SQL> alter database recover managed standby database disconnect; Database altered.直到恢复进程得到一些日志文件。然后终止恢复。 SQL> alter database recover managed standby database cancel; Database altered.在这一步,您可创建快照备用数据库。请谨记,它启用了闪回日志,因此,如果您没有配置闪回恢复区,将出现以下消息: ORA-38784: Cannot create restore point 'SNAPSHOT_STANDBY_REQUIRED_01/12/2008 00:23:14'. ORA-38786: Flash recovery area is not enabled.为了避免出现这种情况,您应先创建闪回恢复区。如果没有,不用担心,马上创建它: SQL> alter system set db_recovery_file_dest_size = 2G; System altered. SQL> alter system set db_recovery_file_dest= '/db_recov'; System altered.完成这些规定的步骤后,您可以使用以下简单的命令将这一备用数据库转换为快照备用数据库: SQL> alter database convert to snapshot standby; Database altered.现在重新利用数据库: SQL> shutdown immediate ORA-01507: database not mounted ... ORACLE instance shut down. SQL> startup ORACLE instance started.现在可以对数据库进行读写操作: SQL> select open_mode, database_role 2 from v$database; OPEN_MODE DATABASE_ROLE ---------- ---------------- READ WRITE SNAPSHOT STANDBY您可以在这一数据库中进行更改。这是使用数据库重放功能重放捕获负载的完美场所。然后,您可以在这一数据库中执行系统更改,并多次重放以分析更改的影响。因为这复制了生产数据库,所以“重放”真实地再现了工作负载。 完成测试后,您要将快照备用数据库恢复为普通的物理备用数据库。执行以下步骤: SQL> connect / as sysdba Connected. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount ORACLE instance started. ... Database mounted. SQL> alter database convert to physical standby; Database altered.关机,挂载数据库,启动管理恢复。 SQL> shutdown ORA-01507: database not mounted ORACLE instance shut down. SQL> startup mount ORACLE instance started. ... Database mounted.启动管理恢复进程: SQL> alter database recover managed standby database disconnect;现在备用数据库已恢复为管理恢复模式。当数据库处于快照备用模式时,主数据库的归档日志没有应用到其上,这自不必说。现在将应用它们,需要一些时间来进行弥补。 通过快照备用数据库,您可以使用备用数据库事先准确预计对生产数据库的更改。但这不是关键点,它还有另一个优势。请牢记,在这一情况中我们可以使用 RTA,这样在网络可用时,对主数据库的更改可立即出现在备用数据库中。但如果有人在主数据库上犯了一些错误,比如运行了大型的更新或更改了一些代码,那将如何呢?在以前的版本中,我们有意在备用数据库上采用延迟方法以阻止这些错误传送到备用数据库。但是有延迟也意味着不能正常激活备用数据库或作为生产数据库的活动副本。 现在不再需要这样了。因为您可以对备用数据库进行闪回操作,您不需要使用延迟了。如果有问题,您可以闪回到前一个状态。 物理到逻辑备用数据库的转换您可以轻松地将物理备用数据库转换为逻辑备用数据库。步骤如下:
滚动升级令 DBA 头痛的问题之一是确定合理关闭数据库一段时间以进行升级的必要性,这已经不是什么秘密。在 Oracle 数据库 11g 中, 如果您有备用数据库,通过滚动升级过程,这将变得极为简单:
但是,许多备用数据库实际上是物理数据库,便于使用和管理。如果备用数据库是物理而非逻辑数据库,步骤也非常相似,仅有很小的差别:您需要暂时将备用数据库转换为逻辑临时数据库,然后再转换回物理备用数据库。关键点是临时,而非永久,因此您在执行转换命令时要使用“keep identity”,如下所示: SQL> alter database recover to logical standby keep identity; Database altered.该文件提供了更为详细的步骤指南。 其他改进Data Guard 进程本身也有非常大的改进: 重做压缩将归档日志从主数据库发送到备用数据库服务器,再将它们应用到数据库上,这一过程是 Data Guard 的前提。主、备用数据库间时间差的一个重要部分是传输归档日志的时间。如果对重做流进行压缩,可以将这一过程加快一些。 在 Oracle 数据库 11g 中,您可使用 SQL*Net 并将压缩参数设为真,从而压缩传输至备用服务器的重做流。这一过程只适用于在 Gap Resolution 间传输的日志。以下命令可用于在本文开始时提供的示例中启用压缩。 alter system set log_archive_dest_2 = 'service=pro11sb LGWR ASYNC valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=pro11sb compression=enable' 网络超时Data Guard 环境的工具原理是:连接备用服务器端的数据库实例,向备用服务器发送重做数据。如果实例没有及时响应,日志传输服务将等待指定的超时值,然后放弃。可以在 Oracle 数据库中使用 net_timeout 参数设置超时值。在最大限度的保护模式下,日志传输服务将尝试 20 次后放弃。 但首选您要知道日志传输中当前的延迟。新视图 v$redo_dest_resp_histogram 以直方图形式表示了该时间值: SQL> desc v$redo_dest_resp_histogram Name Null? Type ---------------------- ------- -------------- DEST_ID NUMBER TIME VARCHAR2(20) DURATION NUMBER FREQUENCY NUMBER该视图在给定圆柱中向您显示了传输花费时间中的次数。如果运行几天后再查看此视图,您可以清楚要设置的超时时间。然后可使用以下命令设置超时时间: alter system set log_archive_dest_2 = 'service=pro11sb LGWR ASYNC valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=pro11sb compression=enable net_timeout=20'这还是来自于上面的示例。注意参数值中的子句“net_timeout=20”。 可动态修改的参数在运行逻辑备用数据库环境的过程中,您需要调整该过程并修改一些参数值。在 Oracle 数据库 11g 中,这些参数中的大部分可以在线更新。您可以通过查询视图 dba_logstdby_parameters 来查看这些参数。
col name format a30
col value format a10
col unit format a10
col setting a6
col setting format a6
col dynamic format a7
select *
from dba_logstdby_parameters
order by name
/
NAME VALUE UNIT SETTIN DYNAMIC
------------------------------ ---------- ---------- ------ -------
APPLY_SERVERS 5 SYSTEM YES
EVENT_LOG_DEST DEST_EVENT SYSTEM YES
S_TABLE
LOG_AUTO_DELETE TRUE SYSTEM YES
LOG_AUTO_DEL_RETENTION_TARGET 1440 MINUTE SYSTEM YES
MAX_EVENTS_RECORDED 10000 SYSTEM YES
MAX_SERVERS 9 SYSTEM YES
MAX_SGA 30 MEGABYTE SYSTEM YES
PREPARE_SERVERS 1 SYSTEM YES
PRESERVE_COMMIT_ORDER TRUE SYSTEM NO
RECORD_APPLIED_DDL FALSE SYSTEM YES
RECORD_SKIP_DDL TRUE SYSTEM YES
RECORD_SKIP_ERRORS TRUE SYSTEM YES
RECORD_UNSUPPORTED_OPERATIONS FALSE SYSTEM YES
注意列 DYNAMIC,其中显示了值是否可动态修改。几乎所有的参数都是动态的。例如,要更改参数 APPLY_SERVERS 同时不停止备用数据库,您可以使用:
SQL> begin
2 dbms_logstdby.apply_set('APPLY_SERVERS',2);
3 end;
4 /
这会将 apply_servers 设置为 2,从而无需关闭备用数据库即可完成这一任务。
SQL 应用事件表在 Oracle 数据库 10g 中,与 SQL Apply 相关的事件将写入到警报日志中,这没有很大的用处,因为您可能想编写脚本检查它们,用于警报或报告。在 Oracle 数据库 11g 中,默认将事件写入 SYSTEM 模式下的新表 LOGSTDBY$EVENTS。下面是一个查询示例: select event_time, error from system.logstdby$events order by 1;输出如下: EVENT_TIME ERROR ----------------------------- ------------------------------------------------- 13-JAN-08 11.24.14.296807 PM ORA-16111: log mining and apply setting up 13-JAN-08 11.24.14.320487 PM Apply LWM 2677727, HWM 2677727, SCN 2677727 14-JAN-08 07.22.10.057673 PM APPLY_SET: APPLY_SERVERS changed to 2 14-JAN-08 07.22.11.034029 PM APPLY_SERVERS changed to 2 14-JAN-08 07.45.15.579761 PM APPLY_SET: EVENT_LOG_DEST changed to DEST_ALL 14-JAN-08 07.45.16.430027 PM EVENT_LOG_DEST changed to DEST_ALL将事件保存在表中非常有用,原因众多,其中之一就是操作和报告更加方便。但有时将它们保存在警报日志中也很有用,特别是当使用一些监视工具来扫描警报日志以获取错误和消息时。您可以将逻辑备用数据库应用参数“event_log_dest”设置为“DEST_ALL”来达到这一目的:
begin
dbms_logstdby.apply_set('EVENT_LOG_DEST','DEST_ALL');
end;
该任务可以动态完成,现在事件将同时传输到表和警报日志中。执行这一命令后,您可以检查警报日志,除可能的大量的 SQL Apply 事件外,它至少还更改了这两行:
LOGSTDBY: APPLY_SET: EVENT_LOG_DEST changed to DEST_ALL LOGSTDBY status: EVENT_LOG_DEST changed to DEST_ALL 结论首先,您了解了从活动主数据库构建物理备用数据库是如此的简单。此外,您还知晓了将物理备用数据库转换为逻辑数据库是如此的轻而易举。而最大的优势是,现在,您可以高效地使用备用数据库通过某种方式来支持业务。Active Data Guard 特性允许您打开备用数据,在进行查询的同时应用归档的日志。快照备用数据库允许您在其中运行生产数据库负载,然后闪回到起始点,继续正常的管理器恢复进程。这两个特性使用户能够利用备用服务器的处理功能,极大地推动了到 11g 的升级。 返回到“Oracle 数据库 11g:面向 DBA 和开发人员的重要特性”主页 |