将 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

Prerequisites

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

  • db_name(或 oracle_sid)
  • db_unique_name
  • oracle 主目录(或数据库主目录)

查找数据库信息

启动主数据库系统和备用数据库系统并按照本主题后面所述创建数据库后,可以使用这些系统上的 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 连接到主数据库系统,以 opcroot 用户身份登录,并通过 sudo 连接到 Grid OS 用户。
    sudo su - grid
  2. 编辑 /u01/app/<version>/grid/network/admin/listener.ora 并向其添加以下内容。此处显示的第一个静态监听程序是可选的。对于版本 12.1 或更高版本的数据库,第二个 DGMGRL 静态监听程序是可选的,但对于版本 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 Log,ORL) 添加备用重做日志 (Standby Redo Log,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 Appropriately

  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 Commands 验证版本并根据需要创建新的数据库主目录。

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

配置静态监听程序

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

  1. 通过 SSH 连接到备用数据库系统,以 opcroot 用户身份登录,然后以 sudo 用户身份登录网格 OS 用户。
    sudo su - grid
  2. 将以下内容附加到 /u01/app/<db_version>/grid/network/admin/listener.ora.

    RMAN DUPLICATE 需要以下所示的第一个静态监听程序。对于数据库版本 12.2.0.1 和 12.1.0.2,第二个 DGMGRL 静态监听程序是可选的,但对于数据库版本 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 操作系统用户运行,并且 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)重新启动数据库,以防在 $ORACLE_HOME/dbs 下作为 RMAN DUPLICATE 的一部分生成。

除非另有说明,否则在以下示例中,对 <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>'  
    ;
}

启用数据库闪回

  1. 作为数据卫士的优秀实践,在主数据库和备用数据库上启用闪回并将 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. 将保护模式更改为最大可用性或最大性能(FSFO 不支持 maxprotection)。

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

    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 以查看其当前值。
    • FastStartFailoverPmyShutdown
    • FastStartFailoverThreshold
    • FastStartFailoverTarget
    • FastStartFailoverAutoReinstate

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

  4. 从中介启用快速启动故障转移:
    Enable fast_start failover
  5. 验证快速启动故障转移和关联的设置。
    show fast_start failover
  6. 从 Broker 启动观察程序(它将在前台运行,但也可以在后台运行)。
    start observer
  7. 验证是否已启用快速启动故障转移且没有错误或警告。
    show configuration verbose
  8. 始终在两个方向上测试故障转移,以确保一切都按预期运行。通过对主数据库执行关闭中止来验证 FSFO 是否正常运行。

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