将 Oracle Data Guard 与数据库 CLI 一起使用

本文介绍如何使用数据库 CLI 在 Oracle Cloud Infrastructure 中使用快速启动故障转移 (FSFO) 设置 Data Guard。本文中的主题介绍了如何准备主数据库和备用数据库,然后将 Data Guard 配置为从主数据库传输重做数据并将其应用于备用数据库。

Oracle 建议您使用控制台而不是数据库 CLI 在 Oracle Cloud Infrastructure 中设置和使用 Data Guard。

注:本文假定您熟悉 Data Guard 和 FSFO。要了解有关它们的更多信息,请参阅在数据库系统上使用 Oracle Data Guard 。

先决条件

要执行本主题中的过程,需要为主数据库和备用数据库提供以下信息。

查找数据库信息

启动主数据库系统和备用数据库系统并按照本主题后面的说明创建数据库后,可以在这些系统上使用 CLI 查找所需的数据库信息。

  1. 通过 SSH 连接到数据库系统。

    ssh -i <private_key_path> opc@<db_system_ip_address>
  2. 以 opc 身份登录,然后以 sudo 身份登录到 root 用户。使用带有连字符的 sudo su - 调用 root 用户的配置文件,该配置文件将 PATH 设置为 dbcli 目录 (/opt/oracle/dcs/bin)。

    sudo su -
  3. 要查找 db_name(或 oracle_sid)和 db_uniqueName,请运行 dbcli list-databases -j 命令。

    dbcli list-databases -j

    输出:

    [ {
      "id" : "80ad855a-5145-4f8f-a08f-406c5e4684ff",
      "name" : "dbtst",
      "dbName" : "dbtst",
      "databaseUniqueName" : "dbtst_phx1cs",
      "dbVersion" : "12.1.0.2",
      "dbHomeId" : "2efe7af7-0b70-4e9b-ba8b-71f11c6fe287",
      "instanceOnly" : false,
       .
       .
       .
  4. 要查找 oracle 主目录(或数据库主目录),请运行 dbcli list-dbhomes 命令。如果数据库系统上有多个数据库主目录,请使用与上面显示的 dbcli list-databases -j 命令输出中的 "dbHomeId" 匹配的主目录。

    dbcli list-dbhomes

    输出:

    ID                                       Name                 DB Version                               Home Location                                 Status
    ---------------------------------------- -------------------- ---------------------------------------- --------------------------------------------- ----------
    2efe7af7-0b70-4e9b-ba8b-71f11c6fe287     OraDB12102_home1     12.1.0.2.160719 (23739960, 23144544)     /u01/app/oracle/product/12.1.0.2/dbhome_1     Configured
    
    33ae99fe-5413-4392-88da-997f3cd24c0f     OraDB11204_home1     11.2.0.4.160719 (23054319, 23054359)     /u01/app/oracle/product/11.2.0.4/dbhome_1     Configured

创建主数据库系统

如果您还没有主数据库系统,请按照关于创建数据库系统的概览中所述创建一个主数据库系统。数据库系统将包括一个初始数据库。您可以使用数据库系统上提供的数据库命令创建其他数据库。

创建备用数据库系统

注:备用数据库必须与主数据库具有相同的 db_name,但是它必须具有不同的 db_unique_name。如果对备用数据库和主数据库使用相同的数据库名称,则必须使用 dbcli delete-database 命令从备用数据库系统中删除数据库,然后才能运行下面介绍的 dbcli create-database 命令。完成数据库删除和创建需要几分钟时间。dbcli 命令必须以 root 用户身份运行。

  1. 按关于创建数据库系统的概览中所述创建备用数据库系统,然后等待数据库系统完成预配并变为可用。

    为了实现可用性和灾难恢复,您可以在与主数据库系统不同的可用性域中创建备用数据库系统(强烈建议这样做)。您可以在主数据库系统的云网络中创建备用数据库系统,以便两个系统都位于单个可路由的网络中。

  2. 通过 SSH 连接到数据库系统。

    ssh -i <private_key_path> opc@<db_system_ip_address>
  3. 以 opc 身份登录,然后以 sudo 身份登录到 root 用户。使用带有连字符的 sudo su - 调用 root 用户的配置文件,该配置文件将 PATH 设置为 dbcli 目录 (/opt/oracle/dcs/bin)。

    sudo su -
  4. 数据库系统将包括初始数据库,但您需要使用带有 --instanceonly 参数的 dbcli create-database 命令来创建备用数据库。此参数仅创建数据库存储结构,并以名义模式启动数据库(不创建其他数据库文件)。

    使用 --instanceonly 时,--dbname 和 --adminpassword 参数都是必需的,它们应与主数据库的 dbname 和管理员密码匹配,以避免混淆。

    以下命令样例会提示您输入管理员密码,然后为名为 dbname 的数据库创建存储结构。

    dbcli create-database --dbname <same as primary dbname>;--databaseUniqueName <different from primary uniquename>;--instanceonly --adminpassword

    如果要使用可插入数据库,请同时指定 --cdb 参数。

    有关完整的命令语法,请参见 Database Commands 。

  5. 等待几分钟,以便 dbcli create-database 命令创建备用数据库。

    您可以使用 dbcli list-jobs 命令验证创建作业是否成功运行,然后使用 dbcli list-databases 命令验证是否已配置数据库。

准备主数据库系统

要准备主数据库系统,您需要配置静态监听程序、更新 tnsnames.ora 并配置一些数据库设置和参数。

配置静态监听程序

创建要由 RMAN 和 Data Guard 中介使用的静态监听程序。

  1. 通过 SSH 到主数据库系统,以 opc 或 root 用户身份登录,以 sudo 身份登录到网格操作系统用户。

    sudo su - grid
  2. 编辑 /u01/app/<version>/grid/network/admin/listener.ora 并向其添加以下内容。此处显示的第一个静态监听程序是可选的。第二个 DGMGRL 静态监听程序对于版本 12.1 或更高版本的数据库是可选的,但对于版本 11.2 数据库是必需的。

    SID_LIST_LISTENER=
      (SID_LIST=
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <primary_db_unique_name>.<primary_db_domain>)
        (SID_NAME = <primary_oracle_sid>)
        (ORACLE_HOME=<oracle_home_directory>)
        (ENVS="TNS_ADMIN=<oracle_home_directory>/network/admin")
        )
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <primary_db_unique_name>_DGMGRL.<primary_db_domain>)
        (SID_NAME = <primary_oracle_sid>)
        (ORACLE_HOME=<oracle_home_directory>)
        (ENVS="TNS_ADMIN=<oracle_home_directory>/network/admin")
        )
      )
  3. 保存所做的更改,然后重新启动监听程序。

    srvctl stop listener
    srvctl start listener

将网络服务名添加至 tnsnames.ora

以 oracle 用户身份,编辑 $ORACLE_HOME/network/admin/tnsnames.ora 并向其添加备用数据库网络服务名。

<standby db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <standby_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <standby db_unique_name>.<standby db_domain>)
    )
  )

上面的示例假定名称解析有效,并且 <standby_server>.<domain> 可在主数据库解析。如果 IP 地址可以在单个云网络 (VCN) 内路由,则还可以使用备用服务器的专用 IP 地址。

配置主数据库参数

提示:如果主主机和备用主机具有不同的目录结构,则可能需要设置此处未讨论的其他参数,例如 log_file_name_convert 参数。有关如何为具有不同目录结构的主机创建备用数据库的更多信息,请参见 RMAN 文档。

  1. 以 oracle 用户身份启用自动备用文件管理。

    alter system set standby_file_management=AUTO;
  2. 标识中介配置文件的名称和位置。用于此目的的命令取决于数据库存储的类型。如果您不确定数据库存储类型,请使用数据库系统上的数据库命令。

    对于 ACFS 数据库存储,请使用以下命令设置中介配置文件。

    alter system set dg_broker_config_file1='/u02/app/oracle/oradata/<Primary db_unique_name>/dbs/dr1<Primary db_unique_name>.dat';
    alter system set dg_broker_config_file2='/u02/app/oracle/oradata/<Primary db_unique_name>/dbs/dr2<Primary db_unique_name>.dat';

    对于 ASM 数据库存储,请使用以下命令设置中介配置文件。

    alter system set dg_broker_config_file1='+DATA/<Primary db_unique_name>/dr1<db_unique_name>.dat';
    alter system set dg_broker_config_file2='+DATA/<Primary db_unique_name>/dr2<db_unique_name>.dat';
  3. 为数据库启用中介 DMON 进程。

    alter system set dg_broker_start=true;
  4. 对所有数据库事务处理强制执行数据库日志记录。

    alter database force logging ;
  5. 基于联机重做日志 (Online Redo Logs,ORL) 添加备用重做日志 (SRL)。在新启动的数据库系统上,将有三个大小为 1073741824 的 ORL,因此请创建四个大小相同的 SRL。

    可以使用下面的查询确定 ORL 的数量和大小(以字节为单位)。

    select group#, bytes from v$log;

    输出:

        GROUP# BYTES
    ---------- ----------
             1 1073741824
             2 1073741824
             3 1073741824

    所有 ORL 必须相同的大小。

    SRL 的大小必须与 ORL 相同,但必须至少比 ORL 多一个 SRL。在上面的示例中,有三个 ORL,因此需要四个 SRL。因此,请指定当前重做日志加 1,并使用与重做日志相同的大小。

    alter database add standby logfile thread 1 size <size>;

    SRL 组中只能有一个成员(默认情况下,在创建数据库系统时,每个 SRL 组只有一个成员)。要确保这一点,可以使用以下语法为文件命名。

    alter database add standby logfile thread 1 group 4 (<logfile name with full path>) size 1073741824, group 5(<logfile name with full path>) size 1073741824 ...

    对于 ASM/OMF 配置,以上命令使用磁盘组而不是 \<logfile name with full path> 。

    alter database add standby logfile thread 1 group 4 (+RECO) size 1073741824, group 5(+RECO) size 1073741824 ...

    提示: ORL 和 SRL 的大小应当调整,以便日志切换不会比每 10 分钟更频繁地发生一次。这需要了解应用程序,可能需要在部署后进行调整。有关更多信息,请参见 Use Standby Redo Logs and Configure Size Appately 。

  6. 验证是否创建了正确数量的 SRL。

    select group#, bytes from v$standby_log;
  7. 确保数据库处于 ARCHIVELOG 模式。

    archive log list
  8. 启用数据库 FLASHBACK。db_flashback_retention_target 的最小建议值为 120 分钟。

    alter database flashback on ;
    alter system set db_flashback_retention_target=120;
  9. 执行单个交换机重做日志以在新创建数据库时激活归档。(在运行 RMAN 重复项之前,必须至少归档一个日志。)

    alter system switch logfile;

准备备用数据库中

在准备备用数据库之前,请确保备用数据库上的数据库主目录与主数据库上的数据库主目录版本相同。(如果主数据库和备用数据库都是新创建的,并且具有相同的数据库版本,则数据库主目录将相同。)如果不是,则创建相同版本的数据库主目录。您可以使用 Dbhome 命令验证版本并根据需要创建新数据库主目录。

要准备备用数据库系统,您需要配置静态监听程序、更新 tnsnames.ora、配置 TDE Wallet、创建临时密码文件、验证连接、运行 RMAN DUPLICATE、启用 FLASHBACK,然后创建数据库服务。

配置静态监听程序

创建要由 RMAN 和 Data Guard 中介使用的静态监听程序。

  1. 通过 SSH 到备用数据库系统,以 opc 或 root 用户身份登录,以 sudo 用户身份登录到网格操作系统用户。

    sudo su - grid
  2. 将以下内容附加到 /u01/app/<db_version>/grid/network/admin/listener.ora.

    RMAN DUPLICATE 需要以下显示的第一个静态监听程序。第二个 DGMGRL 静态监听程序对于数据库版本 12.2.0.1 和 12.1.0.2 是可选的,但对于数据库版本 11.2.0.4 是必需的。

    SID_LIST_LISTENER=
      (SID_LIST=
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <standby db_unique_name>.<standby db_domain>)
        (SID_NAME = <standby oracle_sid>)
        (ORACLE_HOME=<oracle home directory>)
        (ENVS="TNS_ADMIN=<oracle home directory>/network/admin")
        )
        (SID_DESC=
        (SDU=65535)
        (GLOBAL_DBNAME = <standby db_unique_name>_DGMGRL.<standby db_domain>)
        (SID_NAME = <standby oracle_sid>)
        (ORACLE_HOME=<oracle home directory>)
        (ENVS="TNS_ADMIN=<oracle home directory>/network/admin")
        )
      )
  3. 重新启动监听程序。

    srvctl stop listener
    srvctl start listener
  4. 验证静态监听程序是否可用。以下示例输出适用于数据库版本 12.1.0.2。请注意,此时应有 ...status UNKNOWN 消息。

    lsnrctl status

    输出:

    LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 29-SEP-2016 21:09:25
    
    Copyright (c) 1991, 2014, Oracle.  All rights reserved.
    
    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
    Start Date                29-SEP-2016 21:09:19
    Uptime                    0 days 0 hr. 0 min. 5 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/12.1.0.2/grid/network/admin/listener.ora
    Listener Log File         /u01/app/grid/diag/tnslsnr/dg2/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.1.24)(PORT=1521)))
    Services Summary...
    Service "dg2_phx2hx.oratst.org" has 1 instance(s).
      Instance "dg2", status UNKNOWN, has 1 handler(s) for this service...
    Service "dg2_phx2hx_DGMGRL.oratst.org" has 1 instance(s).
      Instance "dg2", status UNKNOWN, has 1 handler(s) for this service...
    The command completed successfully

将网络服务名添加至 tnsnames.ora

以 oracle 用户身份,将备用数据库网络服务名添加到 $ORACLE_HOME/network/admin/tnsnames.ora。$ORACLE_HOME 是运行备用数据库的数据库主目录。

<Primary db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <primary_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <primary db_unique_name).<primary db_domain>)
    )
  )

<Standby db_unique_name> =
  (DESCRIPTION =
    (SDU=65535)
    (ADDRESS = (PROTOCOL = TCP)(HOST = <standby_server>.<domain>) (PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <standby db_unique_name>.<db_domain>)
    )
  )

将 TDE Wallet 复制到备用系统

使用 SCP 将 TDE wallet 文件从主数据库系统复制到备用数据库系统。以下样例命令假定 SCP 命令由 oracle OS 用户运行,并且 oracle 的私钥已创建并且存在于运行 SCP 的主机上。

scp -i <private key> primary_server:/opt/oracle/dcs/commonstore/wallets/tde/<primary db_unique_name>/* standby_server:/opt/oracle/dcs/commonstore/wallets/tde/<standby db_unique_name>

设置备用系统配置

以 oracle 用户身份为数据库版本 11.2.0.4 创建以下目录。对于版本 12.2.0.1 和版本 12.1.0.2,此步骤是可选的。

mkdir  -pv /u03/app/oracle/redo/<standby db_unique_name uppercase>/controlfile

创建审计文件目标

以 oracle 用户身份,创建以下目录以用作审计文件目标。

mkdir -p /u01/app/oracle/admin/<db_name>/adump

否则,以后使用的 RMAN 复制命令将失败。

创建临时密码文件

以 oracle 用户身份创建临时密码文件。

orapwd file=$ORACLE_HOME/dbs/orapw<standby oracle_sid>    password=<admin password for primary> entries=5

密码必须与主数据库的管理员密码相同。否则,下面的 RMAN 重复步骤将失败并显示:RMAN-05614: Passwords for target and auxiliary connections must be the same when using active duplicate.

验证备用数据库是否可用

  1. 以 oracle 用户身份设置环境变量。

    . oraenv
  2. 将 $ORACLE_HOME/dbs/init<standby sid_name>.ora 替换为以下内容:

    db_name=<Primary db_name>
    db_unique_name=<standby db_unique_name>
    db_domain=<standby db_domain>
  3. 从备用数据库中删除 spfile。

    /u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile$ORACLE_SID.ora

    需要在未指定 spfile 的情况下以调用模式启动数据库,但原始 init 文件包含一个 spfile 参数,这将阻止 RMAN 重复步骤工作。

  4. 将 ORACLE_UNQNAME 环境变量设置为指向您的 DB_UNIQUE_NAME。

    export ORACLE_UNQNAME =db_unique_name

    注:如果不执行此步骤,将不打开 wallet,并且在后续步骤中运行 RMAN DUPLICATE 命令将失败。

  5. 以前使用的 dbcli create-database --instanceonly 命令在读/写模式下将备用数据库作为主数据库打开,因此需要先关闭数据库,然后再继续执行下面的指定步骤。

    sqlplus / as sysdba
    
    shutdown immediate
  6. 以空闲模式启动数据库。

    startup nomount

验证数据库连接

验证主数据库与备用数据库之间的连接。

  1. 确保监听程序端口 1521 在用于主数据库系统和备用数据库系统的安全列表中处于打开状态。有关详细信息,请参阅更新数据库系统的安全列表。
  2. 从主数据库连接到备用数据库。

    sqlplus sys/<password>@<standby net service name> as sysdba
  3. 从备用数据库连接到主数据库。

    sqlplus sys/<password>@<primary net service name> as sysdba

运行 RMAN DUPLICATE 命令

以 oracle 用户身份在备用数据库系统上运行 RMAN DUPLICATE 命令。

如果主数据库较大,则可以分配其他通道以提高性能。对于新安装的数据库,一个通道通常在几分钟内运行数据库复制。

确保没有由 RMAN DUPLICATE 命令生成的错误。如果出现错误,请使用 init.ora 文件(而非 spfile)重新启动数据库,以防在 RMAN DUPLICATE 的 $ORACLE_HOME/dbs 下生成该文件。

在以下示例中,除非另有指定,否则 <Standby db_unique_name> 使用小写。

对于 ACFS 存储布局,请运行以下命令。

rman target sys/<password>@<primary alias>  auxiliary sys/<password>@<standby alias> log=rman.out

run { allocate channel prim1 type disk;
    allocate auxiliary channel sby type disk;
    duplicate target database for standby from active database
    dorecover
    spfile
    parameter_value_convert '/<Primary db_unique_name>/','/<Standby db_unique_name>/','/<Primary db_unique_name uppercase>/','/<Standby db_unique_name uppercase >/'
    set db_unique_name='<Standby db_unique_name>'
    set db_create_file_dest='/u02/app/oracle/oradata/<Standby db_unique_name>'
    set dg_broker_config_file1='/u02/app/oracle/oradata/<Standby db_unique_name>/dbs/dr1<Standby db_unique_name>.dat'
    set dg_broker_config_file2='/u02/app/oracle/oradata/<Standby db_unique_name>/dbs/dr2<Standby db_unique_name>.dat'
    set dispatchers ='(PROTOCOL=TCP) (SERVICE=<Standby db_unique_name>XDB)'
    set instance_name='<Standby db_unique_name>'
    ;
}

对于 ASM 存储布局,请运行以下命令。

rman target sys/<password>@<primary alias>  auxiliary sys/<password>@<standby alias> log=rman.out

run {
    allocate channel prim1 type disk;
    allocate auxiliary channel sby type disk;
    duplicate target database for standby from active database
    dorecover
    spfile
    parameter_value_convert '/<Primary db_unique_name>/','/<Standby db_unique_name>/','/<Primary db_unique_name uppercase>/','/<Standby db_unique_name uppercase>/'
    set db_unique_name='<Standby db_unique_name>'
    set dg_broker_config_file1='+DATA/<Standby db_unique_name>/dr1<Standby db_unique_name>.dat'
    set dg_broker_config_file2='+DATA/<Standby db_unique_name>/dr2<Standby db_unique_name>.dat'
    set dispatchers ='(PROTOCOL=TCP) (SERVICE=<Standby db_unique_name>XDB)'
    set instance_name='<Standby db_unique_name>'
    ;
}

启用数据库 FLASHBACK

  1. 作为 Data Guard 优秀实践,在主数据库和备用数据库上启用闪回并将 db_flashback_retention_target 设置为至少 120 分钟。

    alter database flashback on;
    alter system set db_flashback_retention_target=120;
  2. 验证备用数据库是否已正确创建。

    select FORCE_LOGGING, FLASHBACK_ON, OPEN_MODE, DATABASE_ROLE,SWITCHOVER_STATUS, DATAGUARD_BROKER, PROTECTION_MODE from v$database ;

创建数据库服务

Oracle 建议使用 srvctl 为备用数据库创建数据库服务。

对于 ACFS 存储布局。

  1. 创建共享目录并将 spfile 文件复制到该目录。

    mkdir -pv /u02/app/oracle/oradata/<Standby db_unique_name>/dbs
    cp $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora /u02/app/oracle/oradata/<Standby db_unique_name>/dbs
  2. 停止并删除现有数据库服务。

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl remove database
        -d <standby db_unique_name>
  3. 创建数据库服务。

    srvctl add database
        -d <standby db_unique_name>
        -n <standby db_name>
        -o $ORACLE_HOME
        -c SINGLE
        -p '/u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile<standby db_name>.ora'
        -x <standby hostname>
        -s "READ ONLY"
        -r PHYSICAL_STANDBY
        -i <db_name>
    
    srvctl setenv database
        -d <standby db_unique_name>
        -t "ORACLE_UNQNAME=<standby db_unique_name>"
    
    srvctl config database
        -d <standby db_unique_name>
  4. 启动数据库服务。

    srvctl start database
        -d <standby db_unique_name>
  5. 从 $ORACLE_HOME/dbs 清除文件。

    rm $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora
    rm $ORACLE_HOME/dbs/init<standby oracle_sid>.ora
  6. 创建 $ORACLE_HOME/dbs/init<standby oracle_sid>.ora 文件以引用 spfile 文件的新位置。

    SPFILE='/u02/app/oracle/oradata/<standby db_unique_name>/dbs/spfile<standby db_name>.ora'
  7. 停止备用数据库,然后使用 srvctl 启动它。

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl start database
        -d <standby db_unique_name>

用于 ASM 存储布局。

  1. 考虑在 +DATA 下生成 spfile 文件。

    create pfile='init<standby oracle_sid>.ora' from spfile ;
    create spfile='+DATA' from pfile='init<standby oracle_sid>.ora' ;
  2. 停止并删除现有数据库服务。

    srvctl stop database
        -d <standby db_unique_name>
    
    srvctl remove database
        -d <standby db_unique_name>
  3. 创建数据库服务。

    srvctl add database
        -d <standby db_unique_name>
        -n <standby db_name>
        -o $ORACLE_HOME
        -c SINGLE
        -p '+DATA/<standby db_unique_name>/PARAMETERFILE/spfile.xxx.xxxxxx'
        -x <standby hostname>
        -s "READ ONLY"
        -r PHYSICAL_STANDBY
        -i <db_name>
    
    srvctl setenv database
        -d <standby db_unique_name>
        -t "ORACLE_UNQNAME=<standby db_unique_name>"
    
    srvctl config database
        -d <standby db_unique_name>
  4. 启动数据库服务。

    srvctl start database
        -d <standby db_unique_name>
  5. 从 $ORACLE_HOME/dbs 清除文件。

    rm $ORACLE_HOME/dbs/init<standby oracle_sid>.ora
    rm $ORACLE_HOME/dbs/spfile<standby oracle_sid>.ora
  6. 创建 $ORACLE_HOME/dbs/init<standby oracle_sid>.ora 文件以引用 spfile 文件的新位置。

    SPFILE='+DATA/<standby db_unique_name>/PARAMETERFILE/spfile.xxx.xxxxxx'
  7. 使用 srvctl 停止数据库并启动备用数据库。

    srvctl start database -d <standby db_unique_name>

配置 Data Guard

执行以下步骤以完成 Data Guard 配置,并在备用数据库中启用从主数据库进行的重做传输和重做应用。

  1. 从主数据库系统或备用数据库系统运行 dgmgrl 命令行实用程序,并使用系统身份证明连接到主数据库。

    connect sys/<sys password>@<primary tns alias>
  2. 在 dgmgrl 命令行实用程序中创建 Data Guard 配置并标识主数据库和备用数据库。

    create configuration mystby as primary database is <primary db_unique_name> connect identifier is <primary tns alias>;
    add database  <standby db_unique_name> as connect identifier is <standby tns alias>  maintained as physical;
  3. 启用 Data Guard 配置 dgmgrl 命令行实用程序。

    enable configuration;
  4. 验证 Data Guard 设置是否已正确完成。在 SQL 提示符下同时运行主数据库和备用数据库中的以下 SQL。

    select FORCE_LOGGING, FLASHBACK_ON, OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, DATAGUARD_BROKER, PROTECTION_MODE from v$database;
  5. 验证 Data Guard 进程是否已在备用数据库中启动。

    select PROCESS,PID,DELAY_MINS from V$MANAGED_STANDBY;
  6. 验证主数据库和备用数据库上的参数配置。

    show parameter log_archive_dest_
    show parameter log_archive_config
    show parameter fal_server
    show parameter log_archive_format
  7. 验证 Data Guard 配置是否在 dgmgrl 命令行实用程序中工作。具体而言,请确保重做发运和重做申请有效,并且备用数据库不会不合理地落后于主数据库。

    show configuration verbose
    show database verbose <standby db_unique_name>
    show database verbose <primary db_unique_name>

    应解决任何差异、错误或警告。您还可以在主数据库上运行事务处理,并验证其是否在备用数据库中显示。

  8. 通过在两个方向执行切换和故障转移,验证 Data Guard 配置是否按预期运行。在执行每个操作后运行 show configuration,并确保 dgmgrl 命令行实用程序中没有错误或警告。

    注意:根据您的判断,此步骤是可选的。如果出于任何原因配置无效,则切换和/或故障转移将失败,启动主数据库可能困难或不可能。可能需要恢复主数据库,这将影响可用性。

    switchover to <standby db_unique_name>
    switchover to <primary db_unique_name>
    #connect to standby before failover:
    
    connect sys/<sys password>@<standby db_unique_name>
    failover to <standby db_unique_name>
    reinstate database <primary db_unique_name>
    #connect to primary before failover:
    
    connect sys/<sys password>@<primary db_unique_name>
    failover to <primary db_unique_name>
    reinstate database <standby db_unique_name>

配置观察程序(可选)

高可用性和持久性的优秀实践是在单独的可用性域中运行主、备用和观察程序。观察程序确定是否故障转移到特定目标备用数据库。用于观察程序的服务器需要 Oracle Client Administrator 软件,其中包括 Oracle SQL NET 和 Broker。在 dgmgrl 命令行实用程序中执行以下命令。

  1. 按前面所述为主数据库和备用数据库配置 TNS 别名,并验证与两个数据库的连接。
  2. 将保护模式更改为 "maxavailability" 或 "maxperformance"(FSFO 不支持最大保护)。

    要启用最大可用性,请执行以下操作:

    edit database <standby db_unique_name> set property 'logXptMode'='SYNC';
    edit database <primary db_unique_name> set property 'logXptMode'='SYNC';
    edit configuration set protection mode as maxavailability;

    要启用最大性能:

    edit configuration set protection mode as maxperformance;
    edit database <standby db_unique_name> set property 'logXptMode'='ASYNC';
    edit database <primary db_unique_name> set property 'logXptMode'='ASYNC';

    为了实现最高性能,缺省情况下,FastStartFailoverLaglimit 属性将允许的最大数据丢失量限制为 30 秒。

  3. 还应考虑以下属性。运行 show configuration verbose 以查看其当前值。

    • 快速启动故障转移 PmyShutdown
    • FastStartFailover 阈值
    • FastStartFailoverTarget
    • FastStartFailover 自动恢复

    (运行 show configuration 将导致以下错误,直到启动观察程序:Warning : ORA-16819: fast-start failover observer not started。)

  4. 从中介启用快速启动故障转移:

    Enable fast_start failover
  5. 验证快速启动故障转移和关联的设置。

    show fast_start failover
  6. 从中介启动观察程序(它将在前台运行,但也可以在后台运行)。

    start observer
  7. 验证是否已启用快速启动故障转移,并且没有错误或警告。

    show configuration verbose
  8. 始终在两个方向上测试故障转移,以确保一切都按预期工作。通过对主数据库执行关闭中止来验证 FSFO 是否正在正常运行。

    观察程序应启动到备用数据库的故障转移。如果将保护模式设置为 maxprotection,则可能会根据 FastStartFailoverLaglimit 值发生数据丢失。