ORACLE DATAGUARD 配置

时间:2013年07月23日 | 分类:Oracle高可用 | 评论:0 条 | 浏览:2,411 次

1、Data Guard的概念:

Data Guard是一个集合,由一个 primary 数据库(生产数据库)及一个或多个 standby 数据库(最多 9 个)组成。组成

Data Guard 的数据库通过 Oracle Net 连接,并且有可能分布于不同地域。只要各库之间可以相互通信,它们的物理位置并没有什么限制。

(1).Primary 数据库Data Guard 包含一个 primary 数据库即被大部分应用访问的生产数据库,该库即可以是单实例数据库,也可以是 RAC。

(2).Standby 数据库

Standby 数据库是 primary 数据库的复制(事务上一致)。在同一个 Data Guard 中你可以最多创建 9 个 standby数据库。一旦创建完成,Data Guard 通过应用 primary 数据库的 redo 自动维护每一个 standby 数据库。Standby数据库同样即可以是单实例数据库,也可以是 RAC 结构。

关于 standby 数据库,通常分两类:逻辑 standby物理 standby

逻辑 standby:逻辑 standby 是通过接收 primary 数据库的 redo log,并转换成 sql 语句,然后在 standby 数据库上执行 SQL 语句(SQL Apply)实现同步

物理 standby:物理 standby 是通过接收并应用 primary 数据库的 redo log 以介质恢复的方式(Redo Apply)实现同步

2、Data Guard 服务(Data Guard Services)

(1)、REDO 传输服务(Redo Transport Services)
控制 redo 数据的传输到一个或多个归档目的地,也就是发送(源)和接收(目标)

(2)、Log 应用服务(Log Apply Services)
应用 redo 数据到 standby 数据库,以保持与 primary 数据库的事务一致。
分为 redo应用(恢复的方法)sql应用(日志挖掘sql)

(3)、角色转换服务(Role Transitions)
Dg 中只有两种角色:primary 和 standby。
所谓角色转换就是让数据库在这两个角色中切换,切换也分两种:switchover(正常切换)failover(发生故障)
switchover:转换 primary 数据库与 standby 数据库。switchover 可以确保不会丢失数据。
failover:当 primary 数据库出现故障并且不能被及时恢复时,会调用 failover 将一个 standby 数据库转换为新的 primary 数据库。在最大保护模式或最高可用性模式下,failover 可以保证不会丢失数据。

3、Data Guard 保护模式(Data Guard Protection Modes)

(1)、最大保护(Maximum protection):
这种模式能够确保绝无数据丢失。对网络要求比较高,发送需要对方回复,不回复就不继续工作

(2)、最高性能(Maximum performance):
这种模式提供在不影响 primary 数据库性能前提下最高级别的数据保护策略。不需要回复

(3)、最高可用性(Maximum availability):
这种模式提供在不影响 primary 数据库可用前提下最高级别的数据保护策略。用归档日志,不实时。

4、Data Guard 的软硬件需求

(1)、硬件及操作系统需求
同一个 Data Gurid 配置中的所有 oracle 数据库必须运行于相同的平台。
不同服务器的硬件配置可以不同,比如 cpu ,内存,存储设备
primary 数据库和 standby 数据库的操作系统必须一致,不过操作系统版本可以略有差异,

(2)、软件需求
Data Guard 是 Oracle 企业版的一个特性,标准版是不支持
通过 Data Guard 的 SQL 应用,可以实现滚动升级服务器数据库版本(数据库版本不低于 10.1.0.3)。
同一个 Data Guard 配置中所有数据库初始化参数:COMPATIBLE 的值必须相同。
Primary 数据库必须运行于归档模式,并且务必确保在打开 FORCE LOGGING,
Primary 和 standby 数据库均可应用于单实例或RAC架构下,同一个 data guard 配置可以混合使用逻辑 standby 和物理 standby。
Primary 和 standby 数据库可以在同一台服务器,但需要注意各自的数据文件存放目录,避免重写
或覆盖。
使用具有 sysdba 系统权限的用户管理 primary 和 standby 数据库。
建议数据库必须采用相同的存储架构。
注意各服务器之间的时间一致。

5、data guard 配置:
注意Data Guard 启动顺序:

启动顺序:先standby ,后primary;

关闭顺序:先primary 后standby;

(1).环境说明

host      databasetype        db_unique_name       Oracle Net Service Name
server1   primary             primary              primary
server2   physical standby    standby              standby

(2).配置步骤(默认在主库):

A.强制写日志(Enable Forced Logging)

    SQL> ALTER DATABASE FORCE LOGGING;(ALTER DATABASE no FORCE LOGGING;)

B.创建密码文件(Create a Password File): 如果有了,就不需要再创建

    orapwd file='/u01/standby/orapworcl' password=oracle  entries=10

C.配置standby 日志组(Configure a Standby Redo Log)

  SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/app/oracle/oradata/primary/redo4.log') SIZE 50M;
  SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 '/u01/app/oracle/oradata/primary/redo5.log') SIZE 50M;
  SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 '/u01/app/oracle/oradata/primary/redo6.log') SIZE 50M; 
  SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 '/u01/app/oracle/oradata/primary/redo7.log') SIZE 50M; 

  # 查看日志组信息,是否创建成功
  SQL>SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;

D.修改主库初始化参数文件(Set Primary Database Initialization Parameters) ==> 添加修改

    DB_NAME=orcl
    DB_UNIQUE_NAME=primary
    LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'
    LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary'
    LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'
    LOG_ARCHIVE_DEST_STATE_1=ENABLE
    LOG_ARCHIVE_DEST_STATE_2=ENABLE
    LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
    FAL_SERVER=standby
  FAL_CLIENT=primary
  # 下面指定数据文件位置,为了防止主库和备库之间数据路径不一致的情况
    DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
    LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
    STANDBY_FILE_MANAGEMENT=AUTO

E.修改主库为归档模式(Enable Archiving)

   SQL> SHUTDOWN IMMEDIATE;
   SQL> STARTUP MOUNT;
   SQL> ALTER DATABASE ARCHIVELOG;
   SQL> ALTER DATABASE OPEN;

F.在主库上创建备库的控制文件(Create a Control File for the Standby Database)

   SQL> STARTUP MOUNT;
   SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby.ctl';
   SQL> ALTER DATABASE OPEN;

G.复制一份主库的初始化参数文件,修改为备库的初始化参数文件,并进行修改
(Prepare an Initialization Parameter File for the Standby Database)

    DB_NAME=orcl
    DB_UNIQUE_NAME=standby
    CONTROL_FILES='/../../standby.ctl'
    LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'
    LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'
    LOG_ARCHIVE_DEST_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
    LOG_ARCHIVE_DEST_STATE_1=ENABLE
    LOG_ARCHIVE_DEST_STATE_2=ENABLE
    LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
    FAL_SERVER=primary
    FAL_CLIENT=standby
    DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
    LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
    STANDBY_FILE_MANAGEMENT=AUTO

H.复制主库的数据文件、日志文件、备库控制文件、密码文件到备库(在备库机上需要创建相应目录)
(Copy Files from the Primary System to the Standby System) # 需要关库

     copy data file
          log file 
          standby control file
          password file

I.在主库和备库配置监听器(Configure listeners for the primary and standby databases)
Listener.ora:主库/备库 Lsnrctl 配置(默认配置就可以,必须要有静态注册)
Tnsnames.ora:
主库:服务名为:primary,需要配置primary和standby两个监听器,方便互传
备库:服务名为:standby,需要配置primary和standby两个监听器,方便互传
Lsnrctl start(主库和备库都开启,tnsping primary和tnsping standby 来测试连通性)

J.启动备库到mount状态(Start the Physical Standby Database)

     SQL> STARTUP MOUNT;

K.开启应用日志功能(Start Redo Apply)

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

L.验证主库和备库之间是否成功(Verify the Physical Standby Database Is Performing Properly)

Step 1 :在备库查询归档日志信息

        SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

Step 2 :在主库上强制切换日志

        SQL> ALTER SYSTEM SWITCH LOGFILE;

Step 3 :在备库上再次查看归档日志信息

        SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

Step 4 :在备库上查询,归档日志是否被应用,如果被应用,则表示搭建成功

        SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

(3).角色切换,正常切换:
Primary 数据库执行:[ 执行下面操作后,主库就变为备库,备库变为主库 ]

       SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
       SQL> alter database commit to switchover to physical standby;
       SQL> shutdown immediate
       SQL> startup mount

说明:
此时 Primary 数据库的 switchover_status 列 的 值 应 该 是 TO STANDBY ,
除了 TO STANDBY 还有 SESSIONS ACTIVE ,说明 当前有人连到数据库中,建议首先查询v$session 视图,中止这些会话连接。如果胆大也可以在切换的时候加上 with session shutdown 子句,自动断开连接在实例中的会话

STANDBY 数据库执行:

       SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
       SQL> alter database commit to switchover to primary;
       SQL> shutdown immediate
       SQL> startup

说明:
此时 Standby 数据库的列值应该是 TO PRIMARY,除了 TO STANDBY 还有 SESSIONS ACTIVE ,和前面的处理方式一样。另外还有 SWITCHOVER PENDING ,这说明当前Standby 数据库没有启用 redo 应用,只需执行:

       SQL> alter database recover managed standby database disconnect from session;

×