dg切换手动自动 oracle_oracle dg自动切换 - CSDN
精华内容
参与话题
  • dataguard 主从切换

    2016-10-17 16:47:12
    一、如何主从的手动切换 ...二、如何完成自动切换? 一、 如何主从的手动切换 1)在主数据库上: SQL> alter database commit to switchover to physical standby; Database altered. (如果遇到O

    原文地址:http://blog.sina.com.cn/s/blog_74c70b1101010jwh.html

    一、如何主从的手动切换

    二、如何完成自动切换?

    一、 如何主从的手动切换
    1)在主数据库上:
    SQL> alter database commit to switchover to physical standby;
    Database altered.
    (如果遇到ORA-01093错误,就执行alter database commit to switchover to physical standby with session shutdown该语句)

    SQL> shutdown immediate
    ORA-01507: database not mounted
    ORACLE instance shut down.

    以备用模式启用原主库
    SQL> startup nomount;
     

    SQL> alter database mount standby database;
    Database altered.

    SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
    NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
    --------- ---------- -------------------- ----------------
    GE MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY


    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
    Database altered.

    2)在从数据库上:
    (一.非正常切换)
    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
    SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

    然后正常关闭再打开后

    SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
    NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
    --------- ---------- -------------------- ----------------
    GE READ WRITE MAXIMUM PERFORMANCE PRIMARY

    (二.正常切换)
    SQL> alter database commit to switchover to primary;
    Database altered.


    如果碰到ORA-16139: media recovery required 就执行如下语句
    SQL> RECOVER MANAGED STANDBY DATABASE FINISH;


    SQL> shutdown immediate;
    ORA-01109: database not open
    Database dismounted.
    ORACLE instance shut down.

    SQL> startup;
    ORACLE instance started.
    Total System Global Area 167772160 bytes
    Fixed Size 1218316 bytes
    Variable Size 62916852 bytes
    Database Buffers 100663296 bytes
    Redo Buffers 2973696 bytes
    Database mounted.
    Database opened.

    SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
    NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
    --------- ---------- -------------------- ----------------
    GE READ WRITE MAXIMUM PERFORMANCE PRIMARY


    此时发现主从数据库已经被切换过来,下面是测试是否日志保持一致:

    SQL>alter system archive log current;
    System altered.

    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      88

    此时查询从数据库中的REDO应用情况:
    SQL> select sequence# ,applied from v$archived_log order by sequence#;
     SEQUENCE# APP
    ---------- ---
      1 YES
      1 NO
      2 YES
      。。。
      85 YES
      86 YES
      86 NO
    261 rows selected.

    分析:发现存在REDO应用中有几条记录中的APP字段是NO的 说明这些REDO没有被应用到从数据库
    解决:
    先停止Standby:
    SQL> alter database recover managed standby database cancel;
    Database altered.

    SQL> recover managed standby database disconnect from session;
    Media recovery complete.

    此时产生疑问,主从数据库切换之后从数据库中的REDO应用日志最大为86,而此时主数据库中的REDO日志的最大已经达到89,但是重新应用日志
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;之后还是这样 ,总是有主库的部分日志没有传到从数据库中
    并且没有应用。
    查看V$ARCHIVE_GAP表:
    SQL> select * FROM V$ARCHIVE_GAP;
    no rows selected

    试图将87,88,89这些在主数据库中的存在但是在从数据库中不存在的日志文件复制到从数据库中,然后再应用这些被遗漏的日志,过程如下:
    在主数据库中:
    [root@localhost archive]# scp log1_89_676393126.arc root@192.168.1.160:/opt/oracle/oradata/ge/archive/
    root@192.168.1.160's password:
    log1_89_676393126.arc 100% 50KB 50.0KB/s 00:00
    [root@localhost archive]# scp log1_88_676393126.arc root@192.168.1.160:/opt/oracle/oradata/ge/archive/
    root@192.168.1.160's password:
    log1_88_676393126.arc 100% 91KB 90.5KB/s 00:00
    [root@localhost archive]# scp log1_87_676393126.arc root@192.168.1.160:/opt/oracle/oradata/ge/archive/
    root@192.168.1.160's password:
    log1_87_676393126.arc 100% 1024 1.0KB/s 00:00
    [root@localhost archive]#

    在从数据库中:
    [root@localhost archive]# ls -lpth
    total 77M
    -rw-r----- 1 root root 1.0K Mar 8 15:27 log1_87_676393126.arc
    -rw-r----- 1 root root 91K Mar 8 15:27 log1_88_676393126.arc
    -rw-r----- 1 root root 50K Mar 8 15:26 log1_89_676393126.arc

    [root@localhost archive]# chown oracle.oinstall *.*

    [root@localhost archive]# ls -lpth
    total 77M
    -rw-r----- 1 oracle oinstall 1.0K Mar 8 15:27 log1_87_676393126.arc
    -rw-r----- 1 oracle oinstall 91K Mar 8 15:27 log1_88_676393126.arc
    -rw-r----- 1 oracle oinstall 50K Mar 8 15:26 log1_89_676393126.arc

    复制成功,此时试图在从数据库中应用这些被遗漏的日志:
    SQL> alter database recover managed standby database cancel;
    Database altered.

    SQL> recover managed standby database disconnect from session;
    Media recovery complete.

    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      86
       
    仍然没有被应用过来

    SQL> select * from V$ARCHIVE_GAP ;
    no rows selected

    此时试图使用在从数据库中手动注册这些没有被应用的REDO日志:

    下面试图使用在从数据库中注册日志的方法:
    在主数据库中查询没有被应用的日志的名称:
    SQL> select name from V$ARCHIVED_LOG;
    NAME
    ....
    --------------------------------------------------------------------------------
    /opt/oracle/oradata/ge/archive/log1_87_676393126.arc
    /opt/oracle/oradata/ge/archive/log1_88_676393126.arc
    /opt/oracle/oradata/ge/archive/log1_89_676393126.arc
    80 rows selected.

    在从数据库中注册没再从数据库中应用的日志:
    SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '/opt/oracle/oradata/ge/archive/log1_87_676393126.arc';
    Database altered.
    SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '/opt/oracle/oradata/ge/archive/log1_88_676393126.arc';
    Database altered.
    SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '/opt/oracle/oradata/ge/archive/log1_89_676393126.arc';
    Database altered.

    此时查看从数据库被日志应用情况:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      89

    SQL> select sequence# ,applied from v$archived_log order by sequence#;
     SEQUENCE# APP
    ---------- ---
      1 YES
      。。 。。
      87 YES
      88 YES
      89 YES
    264 rows selected.

    此时这些没有被应用的REDO日志终于被我手动应用到从数据库中了:) 哈哈哈,开心~~

    注:如果在查询$ARCHIVE_GAP出来有记录的话,也可以同样采用在复制到从数据库上然后在从数据库中注册这些日志,步骤如下:
    a. 备库上检查是否存在归档中断
    SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
    b. 在主库上执行语句并找出归档文件
    SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN XX AND XX;
    c、如果存在拷贝相应的归档到STANDBY数据库,并注册.
    SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'xxx';


    试验过程中遇到的问题归纳如下:
    问题1:
    SQL> recover managed standby database disconnect from session ;
    ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected
    解决方法:
    查询有那些活动的会话:
    SELECT SID, PROCESS, PROGRAM FROM V$SESSION
     WHERE TYPE = 'USER'
    AND SID <> (SELECT DISTINCT SID FROM V$MYSTAT);

    确实有活动会话,先关闭从数据库 然后重新启动

    问题2:
    SQL> alter database recover managed standby database disconnect from session;
    alter database recover managed standby database disconnect from session
    *
    ERROR at line 1:
    ORA-01153: an incompatible media recovery is active

    解决方法:
     alter database recover managed standby database cancel;

     问题3:
     SQL> select sequence# ,applied from v$archived_log where applied='NO' order by sequence# ;
     SEQUENCE# APP
    ---------- ---
      82 NO
      83 NO

    在REDO应用中有几条记录中的APP字段是NO的 说明这些REDO没有被应用到从数据库

    解决方法:
    SQL> alter database recover managed standby database cancel;
    Database altered.
    SQL> recover managed standby database disconnect from session;
    Media recovery complete.

    问题4:
    主数据库上查询:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      94
    从数据库上查询:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      94

    但是在主数据库上执行下面的语句时:
    SQL> alter database commit to switchover to physical standby;
    alter database commit to switchover to physical standby
    *
    ERROR at line 1:
    ORA-16416: Switchover target is not synchronized with the primary
    报上面的错误??

    分析:主从数据库的日志最大值都相等,并且都应用了,为什么不允许主从切换呢?
    解决方法:
    在从数据库上:
    SQL> shutdown immediate
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    SQL> startup nomount pfile='/opt/oracle/admin/ge/pfile/init.ora.10182008214357';
    ORACLE instance started.

    Total System Global Area 167772160 bytes
    Fixed Size 1218316 bytes
    Variable Size 62916852 bytes
    Database Buffers 100663296 bytes
    Redo Buffers 2973696 bytes
    SQL> alter database mount standby database;
    Database altered.

    然后重新还原从数据库以及日志:
    RMAN> restore database;
    RMAN> restore archivelog all;

    此时查询从数据库的日志应用情况:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      95
       
    此时查询主数据库的日志最大值:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      95

    然后在主数据库重新切换:
    SQL> alter database commit to switchover to physical standby;
    Database altered.
    执行成功!!

    问题5:
    SQL> alter database commit to switchover to primary;
    alter database commit to switchover to primary
    *
    ERROR at line 1:
    ORA-16139: media recovery required
    解决方法:
    SQL> alter database recover managed standby database disconnect from session;
    Database altered.

    参考网页:
    http://rdc.taobao.com/blog/dba/html/123_dataguard_physical_standby.html

       
    上面是讲述如何主从的手动切换,下面继续讲如何主从自动切换

    二、如何完成自动切换?
    Oracle Data Guard Broker是一个分布式管理框架,它不但自动化了 Data Guard 配置的创建、维护和监控,并对这些操作进行统一管理。
    可以通过Oracle Enterprise Manager(它使用 Broker)或 Broker 的专用命令行界面 (DGMGRL) 执行所有管理操作。
    以下列表说明了 Broker 自动化和简化的一些操作:
    ? 创建和启用 Data Guard 配置,此配置包括一个主数据库和最多九个备用(物理或逻辑)数据库,这些数据库的全部或某个组合可形成 RAC 集群。
    ? 从配置中的任意站点上管理整个 Data Guard 配置。
    ? 执行转换或故障切换操作,此类操作涉及到配置中的所有系统的复杂角色转换。
    ? 利用集中式监控、测试和事件通知,来监控日志使用率、捕获诊断信息并快速检测问题。
    Broker 的易于使用的界面和对 Data Guard 配置的集中管理和监控使 Data Guard 成为企业获得增强的高可用性和数据保护的解决方案。

    1创建 DG Broker 配置
    步骤1:前提条件
    步骤2:设置 DG_BROKER_START 初始化参数
    步骤3:创建用于监听器的服务
    步骤4:创建 Broker 配置
    步骤5:启用 Broker 配置

    步骤1:前提条件
    有主数据库和从数据库

    步骤2:设置 DG_BROKER_START 初始化参数
    设置 DG_BROKER_START 初始化参数
    在这一任务中,您将主数据库和物理备用数据库的 DG_BROKER_START 初始化参数设置为 TRUE。
    1). 连接到您的主数据库,检查 DG_BROKER_START 的值。
    SQL> show parameter DG_BROKER_START;
    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    dg_broker_start boolean FALSE
    2).在主数据库上,将 DG_BROKER_START 参数设为 TRUE。
    SQL> alter system set DG_BROKER_START=true;
    System altered.
    3).现在,连接到您的物理备用数据库,检查 DG_BROKER_START 的值。
    SQL> connect sys/test@GE as sysdba
    Connected.
    SQL> show parameter DG_BROKER_START;
    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    dg_broker_start boolean FALSE
    4)在您的备用数据库上将 DG_BROKER_START 的值设为 TRUE。
    SQL> alter system set DG_BROKER_START=true;
    System altered.

    步骤3:创建用于监听器的服务
    在这一任务中,您将定义用于监听器的服务,包括 GLOBAL_DBNAME 的 db_unique_name_DGMGRL.db_domain 值。
    1)在从数据库上修改$ORACLE_HOME/network/admin下的listener.ora文件,在
    SID_LIST_LISTENER =
      (SID_LIST =
      (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (PROGRAM = extproc)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge02)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (SID_NAME = ge02)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (SID_NAME = ge)
      )
      )
    中添加
      (SID_DESC =
      (GLOBAL_DBNAME = standby) --GLOBAL_DBNAME为db_unique_name_DGMGRL.db_domain
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
     (SID_DESC =
      (GLOBAL_DBNAME = standby_DGMGRL) --GLOBAL_DBNAME为db_unique_name_DGMGRL.db_domain
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
     )

    修改之后为:
    SID_LIST_LISTENER =
      (SID_LIST =
      (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (PROGRAM = extproc)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge02)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (SID_NAME = ge02)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = standby)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = standby_DGMGRL)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      )
    注:GLOBAL_DBNAME 应为初始参数 <db_unique_name>_DGMGRL.<db_domain> 的连接。
    注意:在主数据库上也需要修改$ORACLE_HOME/network/admin下的listener.ora文件
    添加下面:
      (SID_DESC =
      (GLOBAL_DBNAME = ge)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge_DGMGRL)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
    如果添加错误 ,会在switchover时报ORA-12514: TNS:listener does not currently know of service requested in connect descriptor错误
    修正参考:http://oracle-tech.blogspot.com/2009/01/ora-12514-during-switchover-using-data.html

       
    2)重新加载监听器。
    lsnrctl stop
    lsnrctl start
    或者执行
    lsnrctl reload

    步骤4:创建 Broker 配置
    在这一任务中,您将创建 Data Guard Broker 配置。
    1)调用 DGMGRL 并连接至您的主数据库。
    [oracle@localhost admin]$ dgmgrl
    DGMGRL for Linux: Version 10.2.0.1.0 - Production
    Copyright (c) 2000, 2005, Oracle. All rights reserved.
    Welcome to DGMGRL, type "help" for information.
    DGMGRL> connect sys/test;
    Connected.
    2)创建 Broker 配置,包括主数据库的档案。
    DGMGRL> create configuration 'DGConfig1' as
    > primary database is 'ge'
    > connect identifier is GE; --GE是Oracle Net Services name
    Configuration "DGConfig1" created with primary database "ge"

    3)显示有关配置的信息。
    DGMGRL> show configuration;
    Configuration
      Name: DGConfig1
      Enabled: NO
      Protection Mode: MaxPerformance
      Fast-Start Failover: DISABLED
      Databases:
      ge - Primary database
    Current status for "DGConfig1":
    DISABLED

    4)使用以下命令将您的物理备用数据库添加到 broker 配置中。
    DGMGRL> add database 'standby' as connect identifier is STANDBY MAINTAINED AS PHYSICAL; --GE是Oracle Net Services name
    Database "standby" added

    5)使用 SHOW CONFIGURATION 命令验证 orclsby1 数据库添加到了配置中。
    DGMGRL> show configuration;
    Configuration
      Name: DGConfig1
      Enabled: NO
      Protection Mode: MaxPerformance
      Fast-Start Failover: DISABLED
      Databases:
      ge - Primary database
      standby - Physical standby database
    Current status for "DGConfig1":
    DISABLED
    DGMGRL>

    步骤5:启用 Broker 配置
    成功为主数据库和备用数据库设置好 Data Guard 环境后,您现在可以启用 broker 配置。
    1)启用整个配置。这可能需要一些时间来完成。
    DGMGRL> enable configuration;
    Enabled.
    2)验证配置已成功启用。
    DGMGRL> show configuration;
    Configuration
      Name: DGConfig1
      Enabled: YES
      Protection Mode: MaxPerformance
      Fast-Start Failover: DISABLED
      Databases:
      ge - Primary database
      standby - Physical standby database

    Current status for "DGConfig1":
    SUCCESS
    可以注意到Enabled由NO变更为YES

    测试自动主从数据库切换操作
    在进行主从数据库切换操作之前,必须确保:
    1)主从数据库的状态是在线的;
    2)所有参与的数据库都必须是完好的,没有任何错误和警告;
    3)从数据库的属性也被设置在主数据库上,以便当主数据库转换为从数据库时原主数据库能够正常工作;
    4)如有必要的话, Standby redo日志文件需要在主数据库上创建;

    1)Check the primary database
    DGMGRL> SHOW DATABASE VERBOSE 'ge';
    Database
      Name: ge
      Role: PRIMARY
      Enabled: YES
      Intended State: ONLINE
      Instance(s):
      ge

      Properties:
      InitialConnectIdentifier = 'ge'
      LogXptMode = 'ASYNC'
      Dependency = ''
      DelayMins = '0'
      Binding = 'OPTIONAL'
      MaxFailure = '0'
      MaxConnections = '1'
      ReopenSecs = '300'
      NetTimeout = '180'
      LogShipping = 'ON'
      PreferredApplyInstance = ''
      ApplyInstanceTimeout = '0'
      ApplyParallel = 'AUTO'
      StandbyFileManagement = 'MANUAL'
      ArchiveLagTarget = '0'
      LogArchiveMaxProcesses = '2'
      LogArchiveMinSucceedDest = '1'
      DbFileNameConvert = ''
      LogFileNameConvert = ''
      FastStartFailoverTarget = ''
      StatusReport = '(monitor)'
      InconsistentProperties = '(monitor)'
      InconsistentLogXptProps = '(monitor)'
      SendQEntries = '(monitor)'
      LogXptStatus = '(monitor)'
      RecvQEntries = '(monitor)'
      HostName = 'localhost.localdomain'
      SidName = 'ge'
      LocalListenerAddress = '(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.160)(PORT=1521))'
      StandbyArchiveLocation = '?/dbs/arch'
      AlternateLocation = ''
      LogArchiveTrace = '0'
      LogArchiveFormat = '%t_%s_%r.dbf'
      LatestLog = '(monitor)'
      TopWaitEvents = '(monitor)'

    Current status for "ge":
    SUCCESS

    2)Check the standby database that is the target of the switchover.
    DGMGRL> SHOW DATABASE VERBOSE 'standby';
    Database
      Name: standby
      Role: PHYSICAL STANDBY
      Enabled: YES
      Intended State: ONLINE
      Instance(s):
      ge

      Properties:
      InitialConnectIdentifier = 'standby'
      LogXptMode = 'ARCH'
      Dependency = ''
      DelayMins = '0'
      Binding = 'OPTIONAL'
      MaxFailure = '0'
      MaxConnections = '1'
      ReopenSecs = '300'
      NetTimeout = '180'
      LogShipping = 'ON'
      PreferredApplyInstance = ''
      ApplyInstanceTimeout = '0'
      ApplyParallel = 'AUTO'
      StandbyFileManagement = 'AUTO'
      ArchiveLagTarget = '0'
      LogArchiveMaxProcesses = '2'
      LogArchiveMinSucceedDest = '1'
      DbFileNameConvert = ''
      LogFileNameConvert = ''
      FastStartFailoverTarget = ''
      StatusReport = '(monitor)'
      InconsistentProperties = '(monitor)'
      InconsistentLogXptProps = '(monitor)'
      SendQEntries = '(monitor)'
      LogXptStatus = '(monitor)'
      RecvQEntries = '(monitor)'
      HostName = 'localhost.localdomain'
      SidName = 'ge'
      LocalListenerAddress = '(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.161)(PORT=1521))'
      StandbyArchiveLocation = '/opt/oracle/oradata/ge/archive'
      AlternateLocation = ''
      LogArchiveTrace = '0'
      LogArchiveFormat = 'log%t_%s_%r.arc'
      LatestLog = '(monitor)'
      TopWaitEvents = '(monitor)'

    Current status for "standby":
    SUCCESS

    3)Issue the switchover command.
    DGMGRL> SWITCHOVER TO 'standby';
    Performing switchover NOW, please wait...
    Operation requires shutdown of instance "ge" on database "ge"
    Shutting down instance "ge"...
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    Operation requires shutdown of instance "ge" on database "standby"
    Shutting down instance "ge"...
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    Operation requires startup of instance "ge" on database "ge"
    Starting instance "ge"...
    ORACLE instance started.
    Database mounted.
    Operation requires startup of instance "ge" on database "standby"
    Starting instance "ge"...
    ORACLE instance started.
    Database mounted.
    Switchover succeeded, new primary is "standby"

    4)Show the configuration
    如果此时立即进行如下查看,会出现如下错误:
    DGMGRL> show configuration;
    Error:
    ORA-01034: ORACLE not available

    这种情况是正常的,因为在http://download.oracle.com/docs/cd/B13789_01/server.101/b10822/dgmgrl.htm#i78344 中的SWITCHOVER命令的使用的最后有如下说明:
    You must manually issue the SHUTDOWN and STARTUP commands to restart the new primary and standby database instances in this configuration.
    也就是说:在这个配置中你必须手动对新主从数据库进行 SHUTDOWN和STARTUP命令的操作。
    If the standby database that is assuming the primary role is a physical standby database, then both the primary and standby databases will
    be restarted after the switchover completes.If the standby database is a logical standby database, then neither the primary database nor
    the logical standby database is restarted.
    也就是说:也就是如果在主从数据库切换之前从数据库是物理从数据库,那么在主从切换之后需要重新启动下新的主从数据库;如果在主从数据库切换之前从数据库是
      逻辑从数据库,则新的主从数据库都不需要重新启动。

    在新主数据库中执行:
    SQL> connect / as sysdba
    Connected to an idle instance.
    SQL> startup;

    在新从数据库中执行:
    SQL> startup nomount;
    SQL> alter database mount standby database;
    Database altered.

    SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
    NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
    --------- ---------- -------------------- ----------------
    GE MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
    Database altered.

    注:过程中会遇到ORA-01102: cannot mount database in EXCLUSIVE mode错误,可以通过执行:
    [root@localhost dbs]# pwd
    /opt/oracle/product/10.2.0/dbs
    [root@localhost dbs]# fuser -u lkSTANDBY
    [root@localhost dbs]# fuser -k lkSTANDBY
    [root@localhost dbs]# fuser -u lkGE
    [root@localhost dbs]# fuser -k lkGE
    来解决:)

    新的主从数据库在重新启动过之后,查看:
    DGMGRL> show configuration;
    Configuration
      Name: DGConfig1
      Enabled: YES
      Protection Mode: MaxPerformance
      Fast-Start Failover: DISABLED
      Databases:
      ge - Physical standby database
      standby - Primary database

    Current status for "DGConfig1":
    SUCCESS

    此时发现主从数据库确实做了切换。自动切换成功!!


    #########################################################################################################################################
    问题1:
    DGMGRL> SWITCHOVER TO 'standby';
    Performing switchover NOW, please wait...
    Operation requires shutdown of instance "ge" on database "ge"
    Shutting down instance "ge"...
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    Operation requires shutdown of instance "ge" on database "standby"
    Shutting down instance "ge"...
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    Operation requires startup of instance "ge" on database "ge"
    Starting instance "ge"...
    Unable to connect to database
    ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

    Failed.
    You are no longer connected to ORACLE
    Please connect again.
    Unable to start instance "ge"
    You must start instance "ge" manually
    Operation requires startup of instance "ge" on database "standby"
    You must start instance "ge" manually
    Switchover succeeded, new primary is "standby"

    错误原因:
    创建用于监听器的服务出错,主数据库的listener.ora中添加为如下错误:
    (SID_DESC =
      (GLOBAL_DBNAME = standby)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = standby_DGMGRL)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
    应该改为:
    (SID_DESC =
      (GLOBAL_DBNAME = ge)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge_DGMGRL)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
    修正参考:http://oracle-tech.blogspot.com/2009/01/ora-12514-during-switchover-using-data.html

    问题2:
    在LOG文件中发现在SWITCHOVER过程中有如下提示:
    LD_LIBRARY_PATH is not set!
    The default library directories are /lib and /usr/lib
    Unable to find dynamic library libocrb10.so in search paths
    Unable to find dynamic library libocrutl10.so in search paths
    Unable to find dynamic library libocrutl10.so in search paths

    解决:
    在.bash_profile文件中添加如下:
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
    参考:http://dbataj.blogspot.com/2008/08/lblibrarypath-is-not-set-on-startup.html

    DGMGRL> show configuration
    Error:
    ORA-01034: ORACLE not available

    DGMGRL> exit
    [oracle@localhost ~]$ dgmgrl
    DGMGRL for Linux: Version 10.2.0.1.0 - Production

    Copyright (c) 2000, 2005, Oracle. All rights reserved.

    Welcome to DGMGRL, type "help" for information.
    DGMGRL> connect sys/test
    Connected.
    Error:
    ORA-01034: ORACLE not available

    DGMGRL> exit
    [oracle@localhost ~]$ export ORACLE_SID=ge
    [oracle@localhost ~]$ dgmgrl
    DGMGRL for Linux: Version 10.2.0.1.0 - Production

    Copyright (c) 2000, 2005, Oracle. All rights reserved.

    Welcome to DGMGRL, type "help" for information.
    DGMGRL> connect sys/test
    Connected.
    Error:
    ORA-01034: ORACLE not available

    DGMGRL> show database 'ge' 'LogXptStatus';
    Error:
    ORA-01034: ORACLE not available


    参考网页:
    创建 DG Broker 配置
    http://www.oracle.com/technology/global/cn/obe/11gr1_db/ha/dataguard/dg_broker/dg_broker.htm
    http://chenyan995.itpub.net/post/29348/475967
    http://download.oracle.com/docs/cd/B13789_01/server.101/b10822/cli.htm#i1007698
    http://download.oracle.com/docs/cd/B13789_01/server.101/b10822/dgmgrl.htm#i78344
    展开全文
  • 【DATAGUARD】物理dg配置客户端无缝切换 (八.3)--客户端TAF 配置 1.1 BLOG文档结构图       1.2 前言部分   1.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的...

    DATAGUARD】物理dg配置客户端无缝切换 (.3)--客户端TAF 配置

    1.1  BLOG文档结构图

    wps55A4.tmp 

     

     

    1.2  前言部分

     

    1.2.1  导读

    各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

     Data Guard Broker 的配置

    Fast-Start Failover 的配置

    Oracle DataGuard 之客户端TAF 配置

    ④ 使用DGMGRL 来管理数据库

     物理dg管理和维护的一些sql

    ⑥ DataGuard 客户端特级配置

     

    注意:本篇BLOG中代码部分需要特别关注的地方我都用黄色背景和红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33thread 2的最大归档日志号为43是需要特别关注的地方。

      List of Archived Logs in backup set 11

      Thrd Seq     Low SCN    Low Time            Next SCN   Next Time

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

      1    32      1621589    2015-05-29 11:09:52 1625242    2015-05-29 11:15:48

      1    33      1625242    2015-05-29 11:15:48 1625293    2015-05-29 11:15:58

      2    42      1613951    2015-05-29 10:41:18 1625245    2015-05-29 11:15:49

      2    43      1625245    2015-05-29 11:15:49 1625253    2015-05-29 11:15:53

     

     

     

     

     

    本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

    1.2.2  实验环境介绍

     

     项目

    主库

    dg

    db 类型

    单实例

    单实例

    db version

    11.2.0.3

    11.2.0.3

    db 存储

    FS type

    FS type

    ORACLE_SID

    oradg11g

    oradgphy

    db_name

    oradg11g

    oradg11g

    主机IP地址:

    192.168.59.130

    192.168.59.130

    OS版本及kernel版本

    RHEL6.5 64位,2.6.32-504.16.2.el6.x86_64

    RHEL6.5 64位,2.6.32-504.16.2.el6.x86_64

    OS hostname

    rhel6_lhr

    rhel6_lhr

     

     

     

    1.2.3  相关参考文章链接

     

    dg的系列文章参考:

    【DATAGUARD】 基于同一个主机建立物理备库和逻辑备库(一): http://blog.itpub.net/26736162/viewspace-1448197/
    【DATAGUARD】 基于同一个主机建立物理备库和逻辑备库(二 ):  http://blog.itpub.net/26736162/viewspace-1448207/

    【DATAGUARD】 基于同一个主机建立物理备库和逻辑备库(三 ):  http://blog.itpub.net/26736162/viewspace-1481972/
    【DATAGUARD】 基于同一个主机建立物理备库和逻辑备库 (四)--添加一个物理dg节点 :http://blog.itpub.net/26736162/viewspace-1484878/

    【DATAGUARD】物理dg的switchover切换(五) http://blog.itpub.net/26736162/viewspace-1753111/

    【DATAGUARD】物理dg的failover切换(六)   http://blog.itpub.net/26736162/viewspace-1753130/

    【DATAGUARD】物理dg在主库丢失归档文件的情况下的恢复(七)  http://blog.itpub.net/26736162/viewspace-1780863/

    DATAGUARD】物理dg配置客户端无缝切换 (八.1)--Data Guard Broker 的配置:http://blog.itpub.net/26736162/viewspace-1811839/

    【DATAGUARD】物理dg配置客户端无缝切换 (八.2)--Fast-Start Failover 的配置http://blog.itpub.net/26736162/viewspace-1811936/

     

     

     

     

    1.2.4  本文简介

     

    本篇blog是基于cuug的公开课内容,我自己进行实践的操作,视频可以参考:http://blog.itpub.net/26736162/viewspace-1624453/ ,简介我就不多写了,把cuug的内容直接copy过来吧,觉得还是比较有用的。

     

    这个技术如果你不知道,不能算是ORACLE高手

    这个技术如果你不知道,就不能说你会DataGuard

    这个技术如果你不知道,......

     

    本次网络课程,研究当主备库发生切换时,如何在主库启动一个service,保证客户端的连接能够继续,而且还能够继续select查询操作,而不管主备库是在哪台服务器上;同时保证新的客户连接没有任何的问题。本课程网络上的例子不多,陈老师花了将近一年的时间人肉搜索,最近才找到,急不可待的要分享给大家。

     

    1DataGuard的配置(快速)

    2、创建service

    3、创建触发器

    4、主备库切换测试

     

    由于内容较多,我打算分为4个章节来共享给大家,贴个图,不要奇怪,还有一个章节是实验过程中配到的问题解决。

    wps55B4.tmp 

     

    本篇为第二节,Fast-Start Failover配置

     

     

     

    1.3  实验部分

     

    1.3.1  实验目标

     

    完成Oracle DataGuard 之客户端TAF 配置,并测试无缝切换。

     

    1.3.2  客户端TAF 配置

    1.3.2.1  首先在主库上配置一个TAFservice

    此服务在数据库出现故障时会发送通知给客户端,允许查询语句在故障转移发生后继续运行。

    在主库端运行:

    14:51:45 SQL> begin

    14:52:10   2    DBMS_SERVICE.CREATE_SERVICE(service_name        => 'dg_taf_lhr',

    14:52:10   3                                network_name        => 'dg_taf_lhr',

    14:52:10   4                                aq_ha_notifications => TRUE,

    14:52:10   5                                failover_method     => 'BASIC',

    14:52:10   6                                failover_type       => 'SELECT',

    14:52:10   7                                failover_retries    => 30,

    14:52:10   8                                failover_delay      => 5);

    14:52:10   9  end;

    14:52:10  10  /

     

    PL/SQL 过程已成功完成。

     

    已用时间:  00: 00: 00.07

    14:52:10 SQL>

     

     

     

    1.3.2.2  建立一个存储过程,用于调用service,确保只在主库运行

    我们创建一个存储过程来实现此目的,如果当前数据库是主库它就启动此服务,如果是备库就停止。

     

    主库执行:

    14:54:58 SQL> create or replace procedure dg_taf_proc_lhr is

    14:59:46   2    v_role VARCHAR(30);

    14:59:46   3  begin

    14:59:46   4    select DATABASE_ROLE into v_role from V$DATABASE;

    14:59:46   5    if v_role = 'PRIMARY' then

    14:59:46   6      DBMS_SERVICE.START_SERVICE('dg_taf_lhr');

    14:59:46   7    else

    14:59:46   8      DBMS_SERVICE.STOP_SERVICE('dg_taf_lhr');

    14:59:46   9    end if;

    14:59:46  10  end;

    14:59:46  11  /

     

    过程已创建。

     

    已用时间:  00: 00: 00.07

     

    1.3.2.3  创建1个触发器来确保服务可以运行

    创建两个触发器,让数据库在启动和角色转换时运行此存储过程。用于当数据库open时,不需要重启数据库,如果是主库则执行存储过程。当数据库切换后,如果是主库则执行存储过程。

     

    主库执行:

    14:59:47 SQL> create or replace TRIGGER dg_taf_trg_startup_lhr

    14:59:53   2    after startup or db_role_change on database

    14:59:53   3  begin

    14:59:53   4    dg_taf_proc_lhr;

    14:59:53   5  end;

    14:59:53   6  /

     

    触发器已创建

     

    已用时间:  00: 00: 00.26

    14:59:54 SQL>

     

    1.3.2.4  启动新创建的service

     在主库上执行该存储过程(或者重启数据库,在启动数据库时会触发执行dg_taf_proc的触发器)在主库做日志的切换,将变化应用到备库

     

     

    主库执行:

    14:59:54 SQL> exec dg_taf_proc_lhr ;

     

    PL/SQL 过程已成功完成。

     

    已用时间:  00: 00: 00.01

    15:06:57 SQL> alter system switch logfile;

     

    系统已更改。

     

    已用时间:  00: 00: 01.02

    15:20:01 SQL>

    [oracle@rhel6_lhr ~]$ lsnrctl status

     

    LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 29-9月 -2015 15:07:32

     

    Copyright (c) 1991, 2011, Oracle.  All rights reserved.

     

    正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.130)(PORT=1521)))

    LISTENER 的 STATUS

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

    别名                      LISTENER

    版本                      TNSLSNR for Linux: Version 11.2.0.3.0 - Production

    启动日期                  29-9月 -2015 12:14:49

    正常运行时间              0 天 2 小时 52 分 43 秒

    跟踪级别                  off

    安全性                    ON: Local OS Authentication

    SNMP                      OFF

    监听程序参数文件          /u01/app/grid/11.2.0/network/admin/listener.ora

    监听端点概要...

      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.130)(PORT=1521)))

    服务摘要..

    服务 "+ASM" 包含 1 个实例。

      实例 "+ASM", 状态 READY, 包含此服务的 1 个处理程序...

    服务 "PLSExtProc" 包含 1 个实例。

      实例 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    服务 "dg_taf_lhr.lhr.com" 包含 1 个实例。

      实例 "oradg11g", 状态 READY, 包含此服务的 1 个处理程序...

    服务 "ora11g" 包含 1 个实例。

      实例 "ora11g", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    服务 "oradg11g" 包含 1 个实例。

      实例 "oradg11g", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    服务 "oradg11g.lhr.com" 包含 2 个实例。

      实例 "oradg11g", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

      实例 "oradg11g", 状态 READY, 包含此服务的 1 个处理程序...

    服务 "oradg11gXDB.lhr.com" 包含 2 个实例。

      实例 "oradg11g", 状态 READY, 包含此服务的 1 个处理程序...

      实例 "oradgphy", 状态 READY, 包含此服务的 1 个处理程序...

    服务 "oradg11g_DGB.lhr.com" 包含 1 个实例。

      实例 "oradg11g", 状态 READY, 包含此服务的 1 个处理程序...

    服务 "oradg11g_DGMGRL.lhr.com" 包含 1 个实例。

      实例 "oradg11g", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    服务 "oradglg" 包含 1 个实例。

      实例 "oradglg", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    服务 "oradgphy" 包含 1 个实例。

      实例 "oradgphy", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    服务 "oradgphy.lhr.com" 包含 2 个实例。

      实例 "oradgphy", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

      实例 "oradgphy", 状态 READY, 包含此服务的 1 个处理程序...

    服务 "oradgphy_DGB.lhr.com" 包含 1 个实例。

      实例 "oradgphy", 状态 READY, 包含此服务的 1 个处理程序...

    服务 "oradgphy_DGMGRL.lhr.com" 包含 1 个实例。

      实例 "oradgphy", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    服务 "oradgss" 包含 1 个实例。

      实例 "oradgss", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    服务 "orclasm.lhr.com" 包含 1 个实例。

      实例 "orclasm", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    命令执行成功

     

    1.3.2.5  在备库查询确认触发器和存过已经应用到备库

     

    15:21:21 SQL> select trigger_name, trigger_name

    15:22:09   2    from dba_triggers where trigger_name = 'DG_TAF_TRG_STARTUP_LHR';

     

    TRIGGER_NAME                   TRIGGER_NAME

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

    DG_TAF_TRG_STARTUP_LHR         DG_TAF_TRG_STARTUP_LHR

     

    已用时间:  00: 00: 00.09

    15:22:09 SQL>

    15:24:28 SQL> select d.owner,d.OBJECT_NAME

    15:24:54   2    from dba_procedures d

    15:24:54   3   where d.OBJECT_NAME = 'DG_TAF_PROC_LHR';

     

    OWNER                          OBJECT_NAME

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

    SYS                            DG_TAF_PROC_LHR

     

    已用时间:  00: 00: 00.05

    15:24:54 SQL>

     

     

    1.3.2.6  客户端tnsnames 配置

    dg_taf =

        (DESCRIPTION =

            (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.59.130)(PORT = 1521))

            (ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.59.130)(PORT = 1521))

                (LOAD_BALANCE = yes)

                    (CONNECT_DATA =

                        (SERVER = DEDICATED)

                        (SERVICE_NAME = dg_taf_lhr.lhr.com)

                    (FAILOVER_MODE =

                        (TYPE = session)

                        (METHOD = basic)

                        (RETRIES = 180)

                        (DELAY = 5)

                   )

            )

    )

     

    注:我的dg环境由于部署在同一台机器,所以host一样,生产环境下必然不一样。

     

    1.3.3  验证客户端的TAF

    先说说测试过程,首先我们在windows环境下添加tnsnames,然后cmd中连接到dg环境,执行一个长久的查询(select * from (select * from sys.dba_objects);),此时在dgmgrl中手动shutdown abort掉主库,那么连接的cmd中会停顿一会,等待fast-start failover切换完成后,则继续返回结果。

    主备切换不影响用户的select操作,但是如果是dml操作,则所有事务回滚:

     

     

    D:\Users\xiaomaimiao>sqlplus lhr/lhr@dg_taf

     

    SQL*Plus: Release 11.2.0.1.0 Production on Tue Sep 29 15:37:20 2015

     

    Copyright (c) 1982, 2010, Oracle.  All rights reserved.

     

     

    Connected to:

    Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

    With the Partitioning, OLAP, Data Mining and Real Application Testing options

     

    SQL> set line 9999

    SQL> col name format a10

    SQL> col FS_FAILOVER_OBSERVER_HOST format a20

    SQL> col DB_UNIQUE_NAME format a15

    SQL> select dbid,name, DB_UNIQUE_NAME,RESETLOGS_CHANGE#,current_scn,protection_mode,protection_level,database_role,force_logging,open_mode,switchover_status from v$database;

     

          DBID NAME       DB_UNIQUE_NAME  RESETLOGS_CHANGE# CURRENT_SCN PROTECTION_MODE      PROTECTION_LEVEL     DATABASE_ROLE    FOR OPEN_MODE            SWITCHOVER_STATUS

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

    1403587593 ORADG11G   oradg11g                  2575356     2604578 MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY PRIMARY          YES READ WRITE           TO STANDBY

     

    SQL> SELECT d.DBID,

      2         d.DB_UNIQUE_NAME,

      3         d.FORCE_LOGGING,

      4         d.FLASHBACK_ON,

      5         DATAGUARD_BROKER,

      6         d.FS_FAILOVER_STATUS,

      7         d.FS_FAILOVER_CURRENT_TARGET,

      8         d.FS_FAILOVER_THRESHOLD,

      9         d.FS_FAILOVER_OBSERVER_PRESENT,

    10         d.FS_FAILOVER_OBSERVER_HOST

    11    FROM v$database d;

     

          DBID DB_UNIQUE_NAME  FOR FLASHBACK_ON       DATAGUAR FS_FAILOVER_STATUS     FS_FAILOVER_CURRENT_TARGET     FS_FAILOVER_THRESHOLD FS_FAIL FS_FAILOVER_OBSERVER

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

    1403587593 oradg11g        YES YES                ENABLED  SYNCHRONIZED           oradgphy                                  30 YES     rhel6_lhr

     

    SQL>

     

    可以看到连接到的是主库。

     

    wps55B5.tmp 

    Cmd卡住了,等待observer切换完成后cmd界面继续查询:

    15:44:42.75  2015929日 星期二

    正在为数据库 "oradgphy" 启动快速启动故障转移...

    立即执行故障转移, 请稍候...

    故障转移成功, 新的主数据库为 "oradgphy"

    15:44:49.93  2015929日 星期二

     

     

    wps55C6.tmp 

    SQL> set line 9999

    SQL> col name format a10

    SQL> col FS_FAILOVER_OBSERVER_HOST format a20

    SQL> col DB_UNIQUE_NAME format a15

    SQL> select dbid,name, DB_UNIQUE_NAME,RESETLOGS_CHANGE#,current_scn,protection_mode,protection_level,database_role,force_logging,open_mode,switchover_status from v$database;

     

          DBID NAME       DB_UNIQUE_NAME  RESETLOGS_CHANGE# CURRENT_SCN PROTECTION_MODE      PROTECTION_LEVEL     DATABASE_ROLE    FOR OPEN_MODE            SWITCHOVER_STATUS

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

    1403587593 ORADG11G   oradgphy                  2605058     2605468 MAXIMUM AVAILABILITY RESYNCHRONIZATION   PRIMARY          YES READ WRITE           NOT ALLOWED

     

    SQL> SELECT d.DBID,

      2         d.DB_UNIQUE_NAME,

      3         d.FORCE_LOGGING,

      4         d.FLASHBACK_ON,

      5         DATAGUARD_BROKER,

      6         d.FS_FAILOVER_STATUS,

      7         d.FS_FAILOVER_CURRENT_TARGET,

      8         d.FS_FAILOVER_THRESHOLD,

      9         d.FS_FAILOVER_OBSERVER_PRESENT,

    10         d.FS_FAILOVER_OBSERVER_HOST

    11    FROM v$database d;

     

          DBID DB_UNIQUE_NAME  FOR FLASHBACK_ON       DATAGUAR FS_FAILOVER_STATUS     FS_FAILOVER_CURRENT_TARGET     FS_FAILOVER_THRESHOLD FS_FAIL FS_FAILOVER_OBSERVER

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

    1403587593 oradgphy        YES YES                ENABLED  REINSTATE REQUIRED     oradg11g                                  30 YES     rhel6_lhr

     

    SQL>

     

     

     切换后,在备库上存储过程启动了TAF的service ,客户端再连接时,自动连接到了当前的主库(原备库)。

     

    @至此,在DG环境下客户端的TAF配置基本完成。

    1.3.4  题外话:Java中的配置

     

    1.3.4.1  使用tnsnames 配置

    原文链接:http://aijuans.iteye.com/blog/1488998

     

     

    格式一:  Oracle JDBC Thin using a ServiceName:

    jdbc:oracle:thin:@//:/
    Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE

     

    注意这里的格式,@后面有//, 这是与使用SID的主要区别。

    这种格式是Oracle 推荐的格式,因为对于集群来说,每个节点的SID 是不一样的,但是SERVICE_NAME 确可以包含所有节点。

     

    格式二: Oracle JDBC Thin using an SID:

    jdbc:oracle:thin:@::
    Example: jdbc:oracle:thin:192.168.2.1:1521:X01A

    Note: Support for SID is being phased out. Oracle recommends that users switch over to usingservice names.

     

     

    格式三:Oracle JDBC Thin using a TNSName:

    jdbc:oracle:thin:@
    Example: jdbc:oracle:thin:@GL

    Note:
    Support for TNSNames was added in the driver release 10.2.0.1

     

     

     

    二.测试

     

    2.1 准备工作:

     

    Oracle 是11gR2

     

    Listener.ora

    SID_LIST_LISTENER =

    (SID_LIST =

       (SID_DESC =

         (GLOBAL_DBNAME = dave)

             (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1)

         (SID_NAME = NEWCCS)

        )

      )

     

    Tnsnames.ora

    DVD =

    (DESCRIPTION =

       (ADDRESS_LIST =

         (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

        )

       (CONNECT_DATA =

         (SERVICE_NAME = dave)

        )

      )

     

    2.3 使用 service_namedave

    将2.2 节的dbUrl 改成如下:

    String dbUrl = "jdbc:oracle:thin:@//127.0.0.1:1521/dave";

     

    输出结果:

    MGMT_VIEW--97

    ANQING--94

    DVD--93

    SYSMAN--95

     

    如果在11g里遇到如下错误:

    测试运行Java 类,报错:

    java.sql.SQLException: The Network Adapter could not establish the connection

     

    可以尝试更换对应的 jdbc connection driver,官网的说明如下:

     

    JDBC Thin Driver 11g Causes"Java.Sql.Sqlexception: Io Exception: The Network Adapter Could NotEstablish The Connection" While Connecting to Oracle Database 11g [ID947653.1]

     

    Change the JDBC connection driver class inyour application server from:

    oracle.jdbc.driver.OracleDriver

    to

    oracle.jdbc.OracleDriver

     

     

    2.4 使用TNS namedvd

    String dbUrl = "jdbc:oracle:thin:@dvd";

     

    报错如下:

    java.sql.SQLException: Unknown host specified

     

    该问题是因为JVM 没有oracle.net.tns_admin的system property。 解决方法有2种:

     

    方法一:在启动VM 时添加如下参数:

    -Doracle.net.tns_admin=D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN
    wps55C7.tmp


    方法二:在java 代码里添加:

    System.setProperty("oracle.net.tns_admin","D:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\NETWORK\\ADMIN");

     

    添加之后,就可以正常在JDBC中使用tnsnama了。

     

     

     

    Java代码  wps55C8.tmp

    1. 2.2 测试1,使用SID:newccs 

    2.   

    3. [java] view plaincopy 

    4.  

    5. import java.sql.*;   

    6.     

    7. public class jdbc {   

    8.     String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:newccs";   

    9.     String theUser = "dave";   

    10.     String thePw = "dave";   

    11.     Connection c = null;   

    12.     Statement conn;   

    13.     ResultSet rs = null;   

    14.     

    15.     public jdbc() {   

    16.        try {   

    17.            Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();   

    18.            c = DriverManager.getConnection(dbUrl, theUser, thePw);   

    19.            conn = c.createStatement();   

    20.        } catch (Exception e) {   

    21.            e.printStackTrace();   

    22.        }   

    23.     }   

    24.     

    25.     public boolean executeUpdate(String sql) {   

    26.        try {   

    27.            conn.executeUpdate(sql);   

    28.            return true;   

    29.        } catch (SQLException e) {   

    30.            e.printStackTrace();   

    31.            return false;   

    32.        }   

    33.     }   

    34.     

    35.     public ResultSet executeQuery(String sql) {   

    36.        rs = null;   

    37.        try {   

    38.            rs = conn.executeQuery(sql);   

    39.        } catch (SQLException e) {   

    40.            e.printStackTrace();   

    41.        }   

    42.        return rs;   

    43.     }   

    44.     

    45.     public void close() {   

    46.        try {   

    47.            conn.close();   

    48.            c.close();   

    49.        } catch (Exception e) {   

    50.            e.printStackTrace();   

    51.        }   

    52.     }   

    53.     

    54.     public static void main(String[] args) {   

    55.        ResultSet rs;   

    56.        jdbc conn = new jdbc();   

    57.        rs = conn.executeQuery("select * from dave where rownum<5");   

    58.        try {   

    59.            while (rs.next()) {   

    60.               System.out.println(rs.getString("username")+"--"+rs.getString("user_id"));   

    61.            }   

    62.        } catch (Exception e) {   

    63.            e.printStackTrace();   

    64.        }   

    65.     }   

    66. }   

    67.     

    68. ---输出正常:   

    69. MGMT_VIEW--97   

    70. ANQING--94   

    71. DVD--93   

    72. SYSMAN--95   

     

     

    1.3.4.2  不使用tnsname

    jdbc:oracle:thin:@ 
    (description=
    (ADDRESS_LIST =
    (address=(protocol=tcp)(host=192.168.1.44)(port=1521))
    (address=(protocol=tcp)(host=192.168.1.45)(port=1521))
    (address=(protocol=tcp)(host=192.168.1.46)(port=1521))
    (load_balance=yes)
    )
    (connect_data =
    (service_name=ORACMS)
    (failover_mode =
    (type=session)
    (method=basic)
    (retries=5)
    (delay=15)
    )
    )
    )

    -- 加上注释后的TNS
    连接串 
    jdbc:oracle:thin:@
    (description=
    (ADDRESS_LIST =
    (address=(protocol=tcp)(host=192.168.1.44)(port=1521))
    (address=(protocol=tcp)(host=192.168.1.45)(port=1521))
    (address=(protocol=tcp)(host=192.168.1.46)(port=1521))
    (load_balance=yes)//表示是否负载均衡 
    )
    (connect_data =
    //(server = dedicated)//该参数表示专用服务器模式 
    (service_name=ORACMS)//要操作数据库的服务名 
    (failover_mode =//连接失败后处理的方式 
    (type=session)//TYPE =SESSION表示当一个连接好的会话的实例发生故障,系统会自动将会话切换到其他可用的实例,前台应用无须再度发起连接,但会话正在执行的SQL 需要重新执行。 
    (method=basic)//表示初始连接就连接一个接点 
    (retries=5)//连接失败后重试连接的次数 
    (delay=15)//连接失败后重试的延迟时间(以秒为单位)
    )
    )
    )

     

    1.4  总结

     

    本篇为第三节,请查看第四节: dgmgrl维护中的常见错误。
    展开全文
  • Dataguard的使用试验(一)-- 主从切换一、如何主从的手动切换二、如何完成自动切换?一、 如何主从的手动切换1)在主数据库上:SQL> alter database commit to switchover to physical standby;Database altered....

     Dataguard的使用试验(一)-- 主从切换
    一、如何主从的手动切换
    二、如何完成自动切换?

    一、 如何主从的手动切换
    1)在主数据库上:
    SQL> alter database commit to switchover to physical standby;
    Database altered.
    (如果遇到ORA-01093错误,就执行alter database commit to switchover to physical standby with session shutdown该语句)

    SQL> shutdown immediate
    ORA-01507: database not mounted
    ORACLE instance shut down.

    以备用模式启用原主库
    SQL> startup nomount;

    SQL> alter database mount standby database;
    Database altered.

    SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
    NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
    --------- ---------- -------------------- ----------------
    GE MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY


    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
    Database altered.

    2)在从数据库上:
    SQL> alter database commit to switchover to primary;
    Database altered.

    SQL> shutdown immediate;
    ORA-01109: database not open
    Database dismounted.
    ORACLE instance shut down.

    SQL> startup;
    ORACLE instance started.
    Total System Global Area 167772160 bytes
    Fixed Size 1218316 bytes
    Variable Size 62916852 bytes
    Database Buffers 100663296 bytes
    Redo Buffers 2973696 bytes
    Database mounted.
    Database opened.

    SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
    NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
    --------- ---------- -------------------- ----------------
    GE READ WRITE MAXIMUM PERFORMANCE PRIMARY


    此时发现主从数据库已经被切换过来,下面是测试是否日志保持一致:

    SQL>alter system archive log current;
    System altered.

    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      88

    此时查询从数据库中的REDO应用情况:
    SQL> select sequence# ,applied from v$archived_log order by sequence#;
     SEQUENCE# APP
    ---------- ---
      1 YES
      1 NO
      2 YES
      。。。
      85 YES
      86 YES
      86 NO
    261 rows selected.

    分析:发现存在REDO应用中有几条记录中的APP字段是NO的 说明这些REDO没有被应用到从数据库
    解决:
    先停止Standby:
    SQL> alter database recover managed standby database cancel;
    Database altered.

    SQL> recover managed standby database disconnect from session;
    Media recovery complete.

    此时产生疑问,主从数据库切换之后从数据库中的REDO应用日志最大为86,而此时主数据库中的REDO日志的最大已经达到89,但是重新应用日志
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;之后还是这样 ,总是有主库的部分日志没有传到从数据库中
    并且没有应用。
    查看V$ARCHIVE_GAP表:
    SQL> select * FROM V$ARCHIVE_GAP;
    no rows selected

    试图将87,88,89这些在主数据库中的存在但是在从数据库中不存在的日志文件复制到从数据库中,然后再应用这些被遗漏的日志,过程如下:
    在主数据库中:
    [root@localhost archive]# scp log1_89_676393126.arc root@192.168.1.160:/opt/oracle/oradata/ge/archive/
    root@192.168.1.160's password:
    log1_89_676393126.arc 100% 50KB 50.0KB/s 00:00
    [root@localhost archive]# scp log1_88_676393126.arc root@192.168.1.160:/opt/oracle/oradata/ge/archive/
    root@192.168.1.160's password:
    log1_88_676393126.arc 100% 91KB 90.5KB/s 00:00
    [root@localhost archive]# scp log1_87_676393126.arc root@192.168.1.160:/opt/oracle/oradata/ge/archive/
    root@192.168.1.160's password:
    log1_87_676393126.arc 100% 1024 1.0KB/s 00:00
    [root@localhost archive]#

    在从数据库中:
    [root@localhost archive]# ls -lpth
    total 77M
    -rw-r----- 1 root root 1.0K Mar 8 15:27 log1_87_676393126.arc
    -rw-r----- 1 root root 91K Mar 8 15:27 log1_88_676393126.arc
    -rw-r----- 1 root root 50K Mar 8 15:26 log1_89_676393126.arc

    [root@localhost archive]# chown oracle.oinstall *.*

    [root@localhost archive]# ls -lpth
    total 77M
    -rw-r----- 1 oracle oinstall 1.0K Mar 8 15:27 log1_87_676393126.arc
    -rw-r----- 1 oracle oinstall 91K Mar 8 15:27 log1_88_676393126.arc
    -rw-r----- 1 oracle oinstall 50K Mar 8 15:26 log1_89_676393126.arc

    复制成功,此时试图在从数据库中应用这些被遗漏的日志:
    SQL> alter database recover managed standby database cancel;
    Database altered.

    SQL> recover managed standby database disconnect from session;
    Media recovery complete.

    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      86
       
    仍然没有被应用过来

    SQL> select * from V$ARCHIVE_GAP ;
    no rows selected

    此时试图使用在从数据库中手动注册这些没有被应用的REDO日志:

    下面试图使用在从数据库中注册日志的方法:
    在主数据库中查询没有被应用的日志的名称:
    SQL> select name from V$ARCHIVED_LOG;
    NAME
    ....
    --------------------------------------------------------------------------------
    /opt/oracle/oradata/ge/archive/log1_87_676393126.arc
    /opt/oracle/oradata/ge/archive/log1_88_676393126.arc
    /opt/oracle/oradata/ge/archive/log1_89_676393126.arc
    80 rows selected.

    在从数据库中注册没再从数据库中应用的日志:
    SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '/opt/oracle/oradata/ge/archive/log1_87_676393126.arc';
    Database altered.
    SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '/opt/oracle/oradata/ge/archive/log1_88_676393126.arc';
    Database altered.
    SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE '/opt/oracle/oradata/ge/archive/log1_89_676393126.arc';
    Database altered.

    此时查看从数据库被日志应用情况:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      89

    SQL> select sequence# ,applied from v$archived_log order by sequence#;
     SEQUENCE# APP
    ---------- ---
      1 YES
      。。 。。
      87 YES
      88 YES
      89 YES
    264 rows selected.

    此时这些没有被应用的REDO日志终于被我手动应用到从数据库中了:) 哈哈哈,开心~~

    注:如果在查询$ARCHIVE_GAP出来有记录的话,也可以同样采用在复制到从数据库上然后在从数据库中注册这些日志,步骤如下:
    a. 备库上检查是否存在归档中断
    SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
    b. 在主库上执行语句并找出归档文件
    SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN XX AND XX;
    c、如果存在拷贝相应的归档到STANDBY数据库,并注册.
    SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'xxx';


    试验过程中遇到的问题归纳如下:
    问题1:
    SQL> recover managed standby database disconnect from session ;
    ORA-01093: ALTER DATABASE CLOSE only permitted with no sessions connected
    解决方法:
    查询有那些活动的会话:
    SELECT SID, PROCESS, PROGRAM FROM V$SESSION
     WHERE TYPE = 'USER'
    AND SID <> (SELECT DISTINCT SID FROM V$MYSTAT);

    确实有活动会话,先关闭从数据库 然后重新启动

    问题2:
    SQL> alter database recover managed standby database disconnect from session;
    alter database recover managed standby database disconnect from session
    *
    ERROR at line 1:
    ORA-01153: an incompatible media recovery is active

    解决方法:
     alter database recover managed standby database cancel;

     问题3:
     SQL> select sequence# ,applied from v$archived_log where applied='NO' order by sequence# ;
     SEQUENCE# APP
    ---------- ---
      82 NO
      83 NO

    在REDO应用中有几条记录中的APP字段是NO的 说明这些REDO没有被应用到从数据库

    解决方法:
    SQL> alter database recover managed standby database cancel;
    Database altered.
    SQL> recover managed standby database disconnect from session;
    Media recovery complete.

    问题4:
    主数据库上查询:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      94
    从数据库上查询:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      94

    但是在主数据库上执行下面的语句时:
    SQL> alter database commit to switchover to physical standby;
    alter database commit to switchover to physical standby
    *
    ERROR at line 1:
    ORA-16416: Switchover target is not synchronized with the primary
    报上面的错误??

    分析:主从数据库的日志最大值都相等,并且都应用了,为什么不允许主从切换呢?
    解决方法:
    在从数据库上:
    SQL> shutdown immediate
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    SQL> startup nomount pfile='/opt/oracle/admin/ge/pfile/init.ora.10182008214357';
    ORACLE instance started.

    Total System Global Area 167772160 bytes
    Fixed Size 1218316 bytes
    Variable Size 62916852 bytes
    Database Buffers 100663296 bytes
    Redo Buffers 2973696 bytes
    SQL> alter database mount standby database;
    Database altered.

    然后重新还原从数据库以及日志:
    RMAN> restore database;
    RMAN> restore archivelog all;

    此时查询从数据库的日志应用情况:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      95
       
    此时查询主数据库的日志最大值:
    SQL> select max(sequence#) from v$archived_log;
    MAX(SEQUENCE#)
    --------------
      95

    然后在主数据库重新切换:
    SQL> alter database commit to switchover to physical standby;
    Database altered.
    执行成功!!

    问题5:
    SQL> alter database commit to switchover to primary;
    alter database commit to switchover to primary
    *
    ERROR at line 1:
    ORA-16139: media recovery required
    解决方法:
    SQL> alter database recover managed standby database disconnect from session;
    Database altered.

    参考网页:
    http://rdc.taobao.com/blog/dba/html/123_dataguard_physical_standby.html

       
    上面是讲述如何主从的手动切换,下面继续讲如何主从自动切换

    二、如何完成自动切换?
    Oracle Data Guard Broker是一个分布式管理框架,它不但自动化了 Data Guard 配置的创建、维护和监控,并对这些操作进行统一管理。
    可以通过Oracle Enterprise Manager(它使用 Broker)或 Broker 的专用命令行界面 (DGMGRL) 执行所有管理操作。
    以下列表说明了 Broker 自动化和简化的一些操作:
    ? 创建和启用 Data Guard 配置,此配置包括一个主数据库和最多九个备用(物理或逻辑)数据库,这些数据库的全部或某个组合可形成 RAC 集群。
    ? 从配置中的任意站点上管理整个 Data Guard 配置。
    ? 执行转换或故障切换操作,此类操作涉及到配置中的所有系统的复杂角色转换。
    ? 利用集中式监控、测试和事件通知,来监控日志使用率、捕获诊断信息并快速检测问题。
    Broker 的易于使用的界面和对 Data Guard 配置的集中管理和监控使 Data Guard 成为企业获得增强的高可用性和数据保护的解决方案。

    1创建 DG Broker 配置
    步骤1:前提条件
    步骤2:设置 DG_BROKER_START 初始化参数
    步骤3:创建用于监听器的服务
    步骤4:创建 Broker 配置
    步骤5:启用 Broker 配置

    步骤1:前提条件
    有主数据库和从数据库

    步骤2:设置 DG_BROKER_START 初始化参数
    设置 DG_BROKER_START 初始化参数
    在这一任务中,您将主数据库和物理备用数据库的 DG_BROKER_START 初始化参数设置为 TRUE。
    1). 连接到您的主数据库,检查 DG_BROKER_START 的值。
    SQL> show parameter DG_BROKER_START;
    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    dg_broker_start boolean FALSE
    2).在主数据库上,将 DG_BROKER_START 参数设为 TRUE。
    SQL> alter system set DG_BROKER_START=true;
    System altered.
    3).现在,连接到您的物理备用数据库,检查 DG_BROKER_START 的值。
    SQL> connect sys/test@GE as sysdba
    Connected.
    SQL> show parameter DG_BROKER_START;
    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    dg_broker_start boolean FALSE
    4)在您的备用数据库上将 DG_BROKER_START 的值设为 TRUE。
    SQL> alter system set DG_BROKER_START=true;
    System altered.

    步骤3:创建用于监听器的服务
    在这一任务中,您将定义用于监听器的服务,包括 GLOBAL_DBNAME 的 db_unique_name_DGMGRL.db_domain 值。
    1)在从数据库上修改$ORACLE_HOME/network/admin下的listener.ora文件,在
    SID_LIST_LISTENER =
      (SID_LIST =
      (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (PROGRAM = extproc)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge02)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (SID_NAME = ge02)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (SID_NAME = ge)
      )
      )
    中添加
      (SID_DESC =
      (GLOBAL_DBNAME = standby) --GLOBAL_DBNAME为db_unique_name_DGMGRL.db_domain
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
     (SID_DESC =
      (GLOBAL_DBNAME = standby_DGMGRL) --GLOBAL_DBNAME为db_unique_name_DGMGRL.db_domain
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
     )

    修改之后为:
    SID_LIST_LISTENER =
      (SID_LIST =
      (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (PROGRAM = extproc)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge02)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (SID_NAME = ge02)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge)
      (ORACLE_HOME = /opt/oracle/product/10.2.0)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = standby)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = standby_DGMGRL)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      )
    注:GLOBAL_DBNAME 应为初始参数 <db_unique_name>_DGMGRL.<db_domain> 的连接。
    注意:在主数据库上也需要修改$ORACLE_HOME/network/admin下的listener.ora文件
    添加下面:
      (SID_DESC =
      (GLOBAL_DBNAME = ge)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge_DGMGRL)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
    如果添加错误 ,会在switchover时报ORA-12514: TNS:listener does not currently know of service requested in connect descriptor错误
    修正参考:http://oracle-tech.blogspot.com/2009/01/ora-12514-during-switchover-using-data.html

       
    2)重新加载监听器。
    lsnrctl stop
    lsnrctl start
    或者执行
    lsnrctl reload

    步骤4:创建 Broker 配置
    在这一任务中,您将创建 Data Guard Broker 配置。
    1)调用 DGMGRL 并连接至您的主数据库。
    [oracle@localhost admin]$ dgmgrl
    DGMGRL for Linux: Version 10.2.0.1.0 - Production
    Copyright (c) 2000, 2005, Oracle. All rights reserved.
    Welcome to DGMGRL, type "help" for information.
    DGMGRL> connect sys/test;
    Connected.
    2)创建 Broker 配置,包括主数据库的档案。
    DGMGRL> create configuration 'DGConfig1' as
    > primary database is 'ge'
    > connect identifier is GE; --GE是Oracle Net Services name
    Configuration "DGConfig1" created with primary database "ge"

    3)显示有关配置的信息。
    DGMGRL> show configuration;
    Configuration
      Name: DGConfig1
      Enabled: NO
      Protection Mode: MaxPerformance
      Fast-Start Failover: DISABLED
      Databases:
      ge - Primary database
    Current status for "DGConfig1":
    DISABLED

    4)使用以下命令将您的物理备用数据库添加到 broker 配置中。
    DGMGRL> add database 'standby' as connect identifier is STANDBY MAINTAINED AS PHYSICAL; --GE是Oracle Net Services name
    Database "standby" added

    5)使用 SHOW CONFIGURATION 命令验证 orclsby1 数据库添加到了配置中。
    DGMGRL> show configuration;
    Configuration
      Name: DGConfig1
      Enabled: NO
      Protection Mode: MaxPerformance
      Fast-Start Failover: DISABLED
      Databases:
      ge - Primary database
      standby - Physical standby database
    Current status for "DGConfig1":
    DISABLED
    DGMGRL>

    步骤5:启用 Broker 配置
    成功为主数据库和备用数据库设置好 Data Guard 环境后,您现在可以启用 broker 配置。
    1)启用整个配置。这可能需要一些时间来完成。
    DGMGRL> enable configuration;
    Enabled.
    2)验证配置已成功启用。
    DGMGRL> show configuration;
    Configuration
      Name: DGConfig1
      Enabled: YES
      Protection Mode: MaxPerformance
      Fast-Start Failover: DISABLED
      Databases:
      ge - Primary database
      standby - Physical standby database

    Current status for "DGConfig1":
    SUCCESS
    可以注意到Enabled由NO变更为YES

    测试自动主从数据库切换操作
    在进行主从数据库切换操作之前,必须确保:
    1)主从数据库的状态是在线的;
    2)所有参与的数据库都必须是完好的,没有任何错误和警告;
    3)从数据库的属性也被设置在主数据库上,以便当主数据库转换为从数据库时原主数据库能够正常工作;
    4)如有必要的话, Standby redo日志文件需要在主数据库上创建;

    1)Check the primary database
    DGMGRL> SHOW DATABASE VERBOSE 'ge';
    Database
      Name: ge
      Role: PRIMARY
      Enabled: YES
      Intended State: ONLINE
      Instance(s):
      ge

      Properties:
      InitialConnectIdentifier = 'ge'
      LogXptMode = 'ASYNC'
      Dependency = ''
      DelayMins = '0'
      Binding = 'OPTIONAL'
      MaxFailure = '0'
      MaxConnections = '1'
      ReopenSecs = '300'
      NetTimeout = '180'
      LogShipping = 'ON'
      PreferredApplyInstance = ''
      ApplyInstanceTimeout = '0'
      ApplyParallel = 'AUTO'
      StandbyFileManagement = 'MANUAL'
      ArchiveLagTarget = '0'
      LogArchiveMaxProcesses = '2'
      LogArchiveMinSucceedDest = '1'
      DbFileNameConvert = ''
      LogFileNameConvert = ''
      FastStartFailoverTarget = ''
      StatusReport = '(monitor)'
      InconsistentProperties = '(monitor)'
      InconsistentLogXptProps = '(monitor)'
      SendQEntries = '(monitor)'
      LogXptStatus = '(monitor)'
      RecvQEntries = '(monitor)'
      HostName = 'localhost.localdomain'
      SidName = 'ge'
      LocalListenerAddress = '(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.160)(PORT=1521))'
      StandbyArchiveLocation = '?/dbs/arch'
      AlternateLocation = ''
      LogArchiveTrace = '0'
      LogArchiveFormat = '%t_%s_%r.dbf'
      LatestLog = '(monitor)'
      TopWaitEvents = '(monitor)'

    Current status for "ge":
    SUCCESS

    2)Check the standby database that is the target of the switchover.
    DGMGRL> SHOW DATABASE VERBOSE 'standby';
    Database
      Name: standby
      Role: PHYSICAL STANDBY
      Enabled: YES
      Intended State: ONLINE
      Instance(s):
      ge

      Properties:
      InitialConnectIdentifier = 'standby'
      LogXptMode = 'ARCH'
      Dependency = ''
      DelayMins = '0'
      Binding = 'OPTIONAL'
      MaxFailure = '0'
      MaxConnections = '1'
      ReopenSecs = '300'
      NetTimeout = '180'
      LogShipping = 'ON'
      PreferredApplyInstance = ''
      ApplyInstanceTimeout = '0'
      ApplyParallel = 'AUTO'
      StandbyFileManagement = 'AUTO'
      ArchiveLagTarget = '0'
      LogArchiveMaxProcesses = '2'
      LogArchiveMinSucceedDest = '1'
      DbFileNameConvert = ''
      LogFileNameConvert = ''
      FastStartFailoverTarget = ''
      StatusReport = '(monitor)'
      InconsistentProperties = '(monitor)'
      InconsistentLogXptProps = '(monitor)'
      SendQEntries = '(monitor)'
      LogXptStatus = '(monitor)'
      RecvQEntries = '(monitor)'
      HostName = 'localhost.localdomain'
      SidName = 'ge'
      LocalListenerAddress = '(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.161)(PORT=1521))'
      StandbyArchiveLocation = '/opt/oracle/oradata/ge/archive'
      AlternateLocation = ''
      LogArchiveTrace = '0'
      LogArchiveFormat = 'log%t_%s_%r.arc'
      LatestLog = '(monitor)'
      TopWaitEvents = '(monitor)'

    Current status for "standby":
    SUCCESS

    3)Issue the switchover command.
    DGMGRL> SWITCHOVER TO 'standby';
    Performing switchover NOW, please wait...
    Operation requires shutdown of instance "ge" on database "ge"
    Shutting down instance "ge"...
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    Operation requires shutdown of instance "ge" on database "standby"
    Shutting down instance "ge"...
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    Operation requires startup of instance "ge" on database "ge"
    Starting instance "ge"...
    ORACLE instance started.
    Database mounted.
    Operation requires startup of instance "ge" on database "standby"
    Starting instance "ge"...
    ORACLE instance started.
    Database mounted.
    Switchover succeeded, new primary is "standby"

    4)Show the configuration
    如果此时立即进行如下查看,会出现如下错误:
    DGMGRL> show configuration;
    Error:
    ORA-01034: ORACLE not available

    这种情况是正常的,因为在http://download.oracle.com/docs/cd/B13789_01/server.101/b10822/dgmgrl.htm#i78344 中的SWITCHOVER命令的使用的最后有如下说明:
    You must manually issue the SHUTDOWN and STARTUP commands to restart the new primary and standby database instances in this configuration.
    也就是说:在这个配置中你必须手动对新主从数据库进行 SHUTDOWN和STARTUP命令的操作。
    If the standby database that is assuming the primary role is a physical standby database, then both the primary and standby databases will
    be restarted after the switchover completes.If the standby database is a logical standby database, then neither the primary database nor
    the logical standby database is restarted.
    也就是说:也就是如果在主从数据库切换之前从数据库是物理从数据库,那么在主从切换之后需要重新启动下新的主从数据库;如果在主从数据库切换之前从数据库是
      逻辑从数据库,则新的主从数据库都不需要重新启动。

    在新主数据库中执行:
    SQL> connect / as sysdba
    Connected to an idle instance.
    SQL> startup;

    在新从数据库中执行:
    SQL> startup nomount;
    SQL> alter database mount standby database;
    Database altered.

    SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
    NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
    --------- ---------- -------------------- ----------------
    GE MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
    Database altered.

    注:过程中会遇到ORA-01102: cannot mount database in EXCLUSIVE mode错误,可以通过执行:
    [root@localhost dbs]# pwd
    /opt/oracle/product/10.2.0/dbs
    [root@localhost dbs]# fuser -u lkSTANDBY
    [root@localhost dbs]# fuser -k lkSTANDBY
    [root@localhost dbs]# fuser -u lkGE
    [root@localhost dbs]# fuser -k lkGE
    来解决:)

    新的主从数据库在重新启动过之后,查看:
    DGMGRL> show configuration;
    Configuration
      Name: DGConfig1
      Enabled: YES
      Protection Mode: MaxPerformance
      Fast-Start Failover: DISABLED
      Databases:
      ge - Physical standby database
      standby - Primary database

    Current status for "DGConfig1":
    SUCCESS

    此时发现主从数据库确实做了切换。自动切换成功!!


    #########################################################################################################################################
    问题1:
    DGMGRL> SWITCHOVER TO 'standby';
    Performing switchover NOW, please wait...
    Operation requires shutdown of instance "ge" on database "ge"
    Shutting down instance "ge"...
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    Operation requires shutdown of instance "ge" on database "standby"
    Shutting down instance "ge"...
    ORA-01109: database not open

    Database dismounted.
    ORACLE instance shut down.
    Operation requires startup of instance "ge" on database "ge"
    Starting instance "ge"...
    Unable to connect to database
    ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

    Failed.
    You are no longer connected to ORACLE
    Please connect again.
    Unable to start instance "ge"
    You must start instance "ge" manually
    Operation requires startup of instance "ge" on database "standby"
    You must start instance "ge" manually
    Switchover succeeded, new primary is "standby"

    错误原因:
    创建用于监听器的服务出错,主数据库的listener.ora中添加为如下错误:
    (SID_DESC =
      (GLOBAL_DBNAME = standby)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = standby_DGMGRL)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
    应该改为:
    (SID_DESC =
      (GLOBAL_DBNAME = ge)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = ge_DGMGRL)
      (ORACLE_HOME =/opt/oracle/product/10.2.0/)
      (SID_NAME = ge)
      )
    修正参考:http://oracle-tech.blogspot.com/2009/01/ora-12514-during-switchover-using-data.html

    问题2:
    在LOG文件中发现在SWITCHOVER过程中有如下提示:
    LD_LIBRARY_PATH is not set!
    The default library directories are /lib and /usr/lib
    Unable to find dynamic library libocrb10.so in search paths
    Unable to find dynamic library libocrutl10.so in search paths
    Unable to find dynamic library libocrutl10.so in search paths

    解决:
    在.bash_profile文件中添加如下:
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
    参考:http://dbataj.blogspot.com/2008/08/lblibrarypath-is-not-set-on-startup.html

    DGMGRL> show configuration
    Error:
    ORA-01034: ORACLE not available

    DGMGRL> exit
    [oracle@localhost ~]$ dgmgrl
    DGMGRL for Linux: Version 10.2.0.1.0 - Production

    Copyright (c) 2000, 2005, Oracle. All rights reserved.

    Welcome to DGMGRL, type "help" for information.
    DGMGRL> connect sys/test
    Connected.
    Error:
    ORA-01034: ORACLE not available

    DGMGRL> exit
    [oracle@localhost ~]$ export ORACLE_SID=ge
    [oracle@localhost ~]$ dgmgrl
    DGMGRL for Linux: Version 10.2.0.1.0 - Production

    Copyright (c) 2000, 2005, Oracle. All rights reserved.

    Welcome to DGMGRL, type "help" for information.
    DGMGRL> connect sys/test
    Connected.
    Error:
    ORA-01034: ORACLE not available

    DGMGRL> show database 'ge' 'LogXptStatus';
    Error:
    ORA-01034: ORACLE not available


    参考网页:
    创建 DG Broker 配置
    http://www.oracle.com/technology/global/cn/obe/11gr1_db/ha/dataguard/dg_broker/dg_broker.htm
    http://chenyan995.itpub.net/post/29348/475967
    http://download.oracle.com/docs/cd/B13789_01/server.101/b10822/cli.htm#i1007698
    http://download.oracle.com/docs/cd/B13789_01/server.101/b10822/dgmgrl.htm#i78344



    展开全文
  • Oracle DG主备切换VIP

    千次阅读 2018-02-05 13:04:26
    在做DG主备切换时,为使应用端在不修改连接配置的情况下,正常连接DG数据库,方法有几种; 一是,应用端连接主机为主机名,可以通过域名解析调整实现; 二是,应用端连接主机为IP, 通过设置VIP(手动配置或者f5等...

           在做DG主备切换时,为使应用端在不修改连接配置的情况下,正常连接DG数据库,方法有几种;

    一是,应用端连接主机为主机名,可以通过域名解析调整实现;

    二是,应用端连接主机为IP, 通过设置VIP(手动配置或者f5等集群工具)

    三是,应用端连接主机为IP,直接修改主机IP

           本文为通过手动配置VIP的形式实现DG主备切换对应用透明;以下是配置过程:

    1.      Primary配置vip

    ifconfig eth1:0 192.168.206.95 netmask255.255.255.128 #配置vip

    ifconfig eth1:0down #取消配置

    2.      修改listener.ora

    LISTENER =

      (DESCRIPTION_LIST=

        (DESCRIPTION =

          (ADDRESS =(PROTOCOL = TCP)(HOST =192.168.206.95)(PORT = 1521))

          (ADDRESS =(PROTOCOL = TCP)(HOST =192.168.206.61)(PORT = 1521))

          (ADDRESS =(PROTOCOL = IPC)(KEY = EXTPROC1521))

        )

    )

    3.      重启监听

    lsnrctl stop

    lsnrctl start

    4.      Switchover(略)

    切换完成后,primary与standby角色互换完成;

    5.      手动配置vip

    a.      取消原primary的vip

    ifconfig eth1:0down #取消配置

    lsnrctl stop、lsnrctl start

    b.      原Standby配置vip

    重复步骤1-3。切换完成;
    展开全文
  • ORACLE RAC+DG(单实例)

    万次阅读 2019-07-02 14:55:43
    ORACLE RAC+DG(单实例) 前提条件: 1.主库RAC已经成功安装,数据库也已经创建。 2.DG备库已经安装完相同版本的oracle软件,无需创建数据库。 1、RAC开启归档。 任意节点: alter system set log_archive_format='%t_%s...
  • oracle datagurad dg failover dg_broker switchover failover fsfo
  • 不同Oracle数据库之间的数据同步

    万次阅读 2017-04-19 15:11:55
    Oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。对于中大型数据库,业务数据库里所有的数据同步到另外一个处理服务器上最佳的选择还是使用SnapShot方式,即快照的...
  • 最近的RAC环境中遭遇ORA-00254,ORA-15173,即无法进行归档。通常情况下归档失败我们考虑更多的是归档路径的不可达,或归档所在的磁盘空间不足造成的。在使用 ASM 存放归档日志的情形...Errors in file /u01/oracle/adm
  • 使用不同颜色标识后台进程 全面了解oracle 备份和恢复机制, 参照oracle体系结构图解析进程(机构图文章有)
  • oracle的主从复制技术ADG

    万次阅读 2018-09-06 09:25:04
    oracle 11g 主从复制技术ADG实施手册 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是实时的...
  • ORACLE数据库Dataguard dg broker 3大模式升级方式 主备库互相切换
  • 在blog:Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库 http://blog.csdn.net/tianlesoftware/archive/2011/03/08/6230498.aspx演示了11gR2 下duplicate from active database的例子。...
  • Oracle数据库主从同步配置详解1. 安装前准备 1.1.软件 1、数据库软件:Oracle 11g r1 (企业版) 2、操作系统:WINDOWS SERVER 2008 ENTERPRISE EDTION 64X 1.2.环境 主库主机: dbprimary 192.168.1.57 从库...
  • Oracle11g RAC集群启动关闭管理

    千次阅读 2015-11-05 09:42:57
    简单的Oracle11g RAC集群启动关闭管理1.切换到集群用户grid[root@rac1 ~]# su - grid2.查看集群资源状态(黄色标注11G不使用此资源 所以OFFLINE为正常状态)[grid@rac1 ~]$ crs_stat -t Name Type Target State Host...
  • Oracle 12c RAC 到单机实例 DATAGUARD搭建

    千次阅读 2016-10-15 10:32:03
    第二章:环境信息 2.1 系统平台 2.1.1 主机平台与版本 主机系统 ● HP-UX Itanium 11.31 主机数据库 ● 12.1.0.2 RAC 2.1.2 备机平台与版本 备机系统 ● HP-UX Itanium 11.31 备机数据库 ● 12.1.0.2 Single ...
  • Oracle DG 之--DG Broker 配置

    千次阅读 2015-03-31 11:51:38
    Oracle DG 之--DG Broker 配置系统环境:操作系统: RedHat EL55_64Oracle: Oracle 11.2.0.3.0650) this.width=650;" src=...
  • 11g搭建DataGuard的步骤

    千次阅读 2017-12-06 17:44:24
    11g搭建DataGuard的步骤(物理standby) 概要原理 DataGuard是通过建立一个PRIMARY和STANDBY组来确立其参照关系;STANDBY一旦创建,DataGuard就会通过将主数据库(PRIMARY)的REDO传递给STANDBY数据库,然后在...
  • 前面的文章提到,当用grid contorl中的broker页面配置的dataguard,进行switchover切换时,只需在页面中点击“切换”按钮,主备切换操作就会自动在后台完成,方便快捷。但是当我们无法登录grid control页面,而又...
  • Oracle 11g DG概念与进程详解

    万次阅读 2017-06-22 21:16:22
    RAC, Data Gurad, Stream 是Oracle 高可用性体系中的三种工具,每个工具即可以独立应用,也可以相互配合。 他们各自的侧重点不同,适用场景也不同。 RAC 它的强项在于解决单点故障和负载均衡,因此RAC ...
  • oracle dg主从切换

    千次阅读 2016-07-06 17:49:12
    用于有准备的、计划之中的切换,通常是系统升级、数据迁移等常态任务 1、检查主备库状态 确认主、备库正常运行: 查看主库状态为OPEN,备库为MOUNT,备库能顺利接收到主库日志。 确认没有其他会话连接: select...
1 2 3 4 5 ... 20
收藏数 1,278
精华内容 511
关键字:

dg切换手动自动 oracle