Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2840367
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2010-01-21 22:53:23

    如果备系统没有接收到一个或多个主数据库生成的归档重做日志文件,在备系统上就会出现归档中断。丢失的归档重做日志文件就是中断。如果有中断,则Data Guard 自动探测到并通过拷贝丢失的日志文件序列到备目的地来解决。例如,当网络变得不可用时,从主数据库到备数据库的自动归档临时停止,就会出现归档中断。当网络再次可用时,从主数据库到故障的备数据库的重做数据的自动传输继续。
    Data Guard 不需要DBA 的手工干预来探测和解决这样的中断。下面的小节描述了中断探测和解决。
 
何时发现归档中断?

    无论何时主数据库本地归档一个日志,但是备站点没有接受到该日志就会发生归档中断。每分钟,主数据库调查其备数据库以查看是否在归档重做日志文件的序列中有中断。
 
如何解决中断?

    中断恢复通过轮询机制解决。对于物理和逻辑备数据库、Oracle Change Data Capture、和Oracle Streams,Data Guard 通过自动从主数据库检索丢失的归档重做日志文件来执行中断探测和解决。不需要额外的配置设置来调查备数据库,来探测任何中断或解决中断。
    这里很重要的考虑是自动中断恢复是依主数据库的可用性而定的。如果主数据库不可用了,并且你配置了多个物理备数据库,你能设置额外的初始化参数使得重做应用能从其它备数据库解决归档中断。
 
注:
在Oracle 数据库10g 版本1 以前,FAL 客户端和服务器用于从主数据库解决中断。
 
使用取归档日志(FAL)来解决归档中断

    取归档日志(FAL)客户端和服务期解决在主数据库生成的与物理备数据库接收到的归档重做日志文件的范围中探测到的中断。
􀁺 FAL 客户端自动请求归档重做日志文件的传递。
􀁺 FAL 服务器服务从FAL 客户端来的FAL 请求。

FAL 机制处理下述类型的归档中断和问题:
􀁺 当创建一个物理或逻辑备数据库时,FAL 机制能自动检索在主数据库的热备期间生成的任何归档重做日志文件。
􀁺 当有在备数据库上已经有接收到的归档重做日志文件的问题时,FAL 机制能自动检索归档重做日志文件来解决任何下述情况:
􀁻 当归档重做日志文件在应用到备数据之前被从磁盘删除。
􀁻 当归档重做日志文件因为磁盘损坏不能应用。
􀁻 当归档重做日志文件在重做数据应用到被数据库之前,意外被不是归档重做日志文件的其它文件替换(例如,一个文本文件)。
􀁺 当你有多个物理备数据库,FAL 机制能从其它物理备数据库自动检索丢失的归档重做日志文件。
FAL 客户端和服务器使用在备数据库上设置的FAL_CLIENT 和FAL_SERVER 初始化参数来配置。在初始化参数文件中定义的FAL_CLIENT 和FAL_SERVER 初始化参数只针对于物理备数据库,如下表中所示:
 
 参数      功能      语法
 FAL_SERVER 指定备数据库应该用于连接 FAL服务器的网络服务名。它可以在一个列表中包含多个值。 语法
FAL_SERVER=net_service_name
例子
FAL_SERVER=standby2_db,standby3_db
 FAL_CLIENT 指定 FAL 服务器应该用于连接到备数据库的网络服务名。 语法
FAL_CLIENT=net_service_name
例子
FAL_CLIENT=standby1_db
 
手工探测和解决归档中断

    在一些情况下,自动中断恢复可能不会发生,你将会需要手工执行中断恢复。例如,如果你使用逻辑备数据库并且主数据库不可用时,你将需要手工执行中断恢复。
下面的小节描述了如何查询适当的视图以确定哪个日志文件丢失了并且执行手工恢复。

在物理备数据库:

要确定在你的物理备数据库上是否有归档中断,查询V$ARCHIVE_GAP 视图,如下面例子所示:

SQL> SELECT * FROM V$ARCHIVE_GAP;

THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
----------- ------------- --------------
1           7               10

    前面例子的输出指出你的物理备数据库当前丢失日志文件从线程 1 的序号7 到序号10。在你确定中断后,在主数据库上执行下面的SQL 语句来在你的主数据库上定位归档重做日志文件(假设在主数据库上的本地归档目的地是LOG_ARCHIVE_DEST_1):

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1
2> AND SEQUENCE# BETWEEN 7 AND 10;

NAME
-----------------------------------------------------------------
/primary/thread1_dest/arcr_1_7.arc
/primary/thread1_dest/arcr_1_8.arc
/primary/thread1_dest/arcr_1_9.arc

拷贝这些日志文件到你的物理备数据库并在你的物理备数据库上使用 ALTER DATABASE REGISTER LOGFILE 语句来注册它们。例如:

SQL> ALTER DATABASE REGISTER LOGFILE
'/physical_standby1/thread1_dest/arcr_1_7.arc';
SQL> ALTER DATABASE REGISTER LOGFILE
'/physical_standby1/thread1_dest/arcr_1_8.arc';

在你在物理备数据库上注册这些日志文件之后,你能重启重做应用。
 
注:
物理备数据库上的V$ARCHIVE_GAP 固定视图只返回当前妨碍重做应用继续的下一个中断。在解决中断并重启重做应用后,再次在物理备数据库上查询V$ARCHIVE_GAP 固定视图来确定下一个中断序号,如果有的话。重复这个过程直到没有更多的中断。
 
在逻辑备数据库:

    要确定是否有归档中断,在逻辑备数据库上查询DBA_LOGSTDBY_LOG 视图。例如,下面的查询指出在归档重做日志文件的序号中有中断,因为它在逻辑备数据上对于THREAD1 显示有两个文件。(如果没有中断的话,查询应该每个线程只显示一个文件。)输出显示最高的注册文件是序列号10,但是在所示文件序列号6 有中断:

SQL> COLUMN FILE_NAME FORMAT a55

SQL> SELECT THREAD#, SEQUENCE#, FILE_NAME FROM DBA_LOGSTDBY_LOG L
2> WHERE NEXT_CHANGE# NOT IN
3> (SELECT FIRST_CHANGE# FROM DBA_LOGSTDBY_LOG WHERE L.THREAD# =
THREAD#)
4> ORDER BY THREAD#,SEQUENCE#;

THREAD# SEQUENCE# FILE_NAME
--------- ---------- ---------------------------------------------
1           6      /disk1/oracle/dbs/log-1292880008_6.arc
1           10     /disk1/oracle/dbs/log-1292880008_10.arc

拷贝丢失的日志文件,序列号 7、8 和9,到逻辑备系统,并在你的逻辑备数据库上使用ALTER DATABASE REGISTER LOGICAL LOGFILE 语句来注册它们。

例如:
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE
'/disk1/oracle/dbs/log-1292880008_10.arc';

在你在逻辑备数据库上注册这些日志文件之后,你能重启 SQL 应用。
 
注:
在逻辑备数据库上的DBA_LOGSTDBY_LOG 视图只返回当前妨碍SQL 应用继续的下一个中断。在解决指定的中断并重启SQL 应用之后,再次在逻辑备数据库上查询DBA_LOGSTDBY_LOG 视图以确定下一个中断序号,如果有的话。重复这个过程直到没有更多的中断。
阅读(1303) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~