移植 Oracle RAC

要将 Oracle RAC 数据库从 Oracle Cloud Infrastructure Classic 服务器移植到 Oracle Cloud Infrastructure Database 系统,可以使用 Oracle Data Guard。必须将 Oracle Cloud Infrastructure Classic 上的数据库配置为主数据库(源数据库),以便将其移植到虚拟机系统上 Oracle Cloud Infrastructure 上的备用数据库(目标数据库)。

配置主(源)数据库

要配置主数据库(源数据库),可以配置 Oracle Data Guard 并修改备用数据库(目标数据库)的 listener.oratnsnames.ora 文件。

配置备用数据库的主数据库

在此配置中 , 您可以将主(源)数据库配置为使用 Oracle Data Guard。

  1. 使用 SSH 登录到主数据库(源数据库)服务器。
  2. 在备用数据库(目标数据库)上,作为数据库软件所有者 Oracle 连接。
    sudo su - oracle
  3. 执行 oraenv 脚本 , 该脚本设置$ ORACLE_HOME 环境变量。
    . oraenv
  4. 以具有管理员权限的用户身份登录数据库实例。例如:
    sqlplus / as sysoper
  5. 请确保数据库处于 ARCHIVELOG 模式。
    ARCHIVE LOG LIST
  6. 如果 Database log mode 的输出为 No Archive Mode,并且 Automatic archival 的输出为 Disabled,则执行以下操作:
    1. 退出 SQL*Plus
      SQL> exit
    2. 关闭数据库。
      srvctl stop database -db db_unique_name
    3. 在装载模式下重新启动数据库
      srvctl start database -db db_unique_name -o mount
    4. 以具有管理员权限的用户身份登录数据库实例。例如:
      sqlplus / as sysoper
    5. 启用归档日志模式。
      ALTER DATABASE ARCHIVELOG;
    6. 请确保数据库现在处于归档日志模式下。
      ARCHIVE LOG LIST
      数据库日志模式输出应为 Archive Mode,并且 Automatic archival 的输出已启用
    7. 打开数据库。
      ALTER DATABASE OPEN;
  7. 使用 SYSDBA 管理员权限进行连接。
    CONNECT / AS SYSDBA
  8. 对于多租户环境,执行以下操作:
    1. 检查 PDBS 的状态。
      SHOW PDBS
    2. 如果 PDBS 未打开,则将其打开。
      ALTER PLUGGABLE DATABASE ALL OPEN;
  9. 请确保数据库处于强制事件记录模式。例如:
    SELECT NAME, OPEN_MODE, FORCE_LOGGING FROM V$DATABASE;
  10. 如有必要,请启用 force logging
    ALTER DATABASE FORCE LOGGING;
  11. 请检查配置。
    SELECT NAME, CDB, OPEN_MODE, FORCE_LOGGING FROM V$DATABASE;
    FORCE_LOGGING 列应为 YES
  12. 使用 SHOW PARAMETER 命令检查以下数据库参数:
    1. DB_NAMEDB_UNIQUE_NAME:确保这些名称不同于目标数据库中使用的名称。
    2. REMOTE_LOGIN_PASSWORDFILE:此参数必须设置为 EXCLUSIVE

将静态服务添加到主数据库 listener.ora 文件

在此部分中,必须将新的静态监听程序添加到 listener.或重新启动监听程序。

  1. 使用 SSH 登录到主(源)数据库的第一个节点。
  2. 在命令行上,以 grid user 格式连接。
    sudo su - grid
  3. 修改/u01/app/12。2 .0. 1/grid/network/admin/listener.ora 文件 , 以包括静态监听程序。以下示例显示了用于一个静态监听程序的格式:
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SDU=65535)
          (GLOBAL_DBNAME = source_db_unique_name.source_db_domain)
          (ORACLE_HOME = source_oracle_home)
          (ENVS="TNS_ADMIN= source_oracle_home/network/admin")
          (SID_NAME = source_db_name)
        )
      )
  4. 停止监听程序。

    注:

    停止和启动静态监听程序将在几秒内影响到数据库的新连接。
    srvctl stop listener -l LISTENER
  5. 重新启动监听程序。
    srvctl start listener -l LISTENER
  6. 请检查监听程序状态。
    lsnrctl status
  7. 验证输出中是否存在状态为 UNKNOWN 的条目。
  8. 对主数据库(源数据库)的第二个节点重复上述步骤。

配置主数据库参数

配置主数据库(源)数据库并向主数据库 listener.ora 文件中添加静态服务后,可以在主数据库上配置 Oracle Data Guard 参数。

  1. 使用 SSH 可登录到主数据库(源数据库)的第一个 RAC 节点。
  2. 以具有 SYSDBA 管理员权限的用户身份登录数据库实例。
    sqlplus / as sysdba
    Enter password: password
  3. 启用自动备用文件管理。
    ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SID='*' SCOPE=BOTH;
  4. 设置归档滞后目标。
    ALTER SYSTEM SET ARCHIVE_LAG_TARGET=1800 SID='*' SCOPE=BOTH;
  5. 标识 Oracle 中介配置文件名和位置。以下语句取决于数据库存储的类型。
    ALTER SYSTEM SET DG_BROKER_CONFIG_FILE1='/u02/app/oracle/oradata/<db_unique_name>/dr1<db_unique_name>.dat' SID='*' SCOPE=BOTH; SCOPE=BOTH;
    ALTER SYSTEM SET DG_BROKER_CONFIG_FILE2='/u03/app/oracle/fast_recovery_area/<db_unique_name>/dr2<db_unique_name>.dat' SID='*' SCOPE=BOTH;
  6. 为数据库启用 Oracle 中介 DMON 进程。
    ALTER SYSTEM SET DG_BROKER_START=TRUE SCOPE=BOTH;
  7. (可选)设置 DB_BLOCK_CHECKINGDB_BLOCK_CHECKSUM 参数。
    ALTER SYSTEM SET DB_BLOCK_CHECKING=FULL SID='*' SCOPE=BOTH;
    ALTER SYSTEM SET DB_BLOCK_CHECKSUM=FULL SID='*' SCOPE=BOTH;
  8. (可选)将日志缓冲区设置为 256 mb。
    ALTER SYSTEM SET LOG_BUFFER=268435456 SID='*' SCOPE=BOTH;
  9. DB_LOST_WRITE_PROTECT 参数设置为 TYPICAL
    ALTER SYSTEM SET DB_LOST_WRITE_PROTECT=TYPICAL SID='*' SCOPE=BOTH;
  10. 启用数据库闪回功能。DB_FLASHBACK_RETENTION_TARGET 的最小建议值为 120 分钟。
    ALTER DATABASE FLASHBACK ON;
    ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=120; 
    ALTER SYSTEM ARCHIVE LOG CURRENT;
  11. 基于联机重做日志添加备用重做日志。可以使用下面的查询确定 Orl 的数量和大小(字节)。备用重做日志的大小必须与联机重做日志的大小相同 , 但必须添加一个或多个其他备用重做日志 , 而不能存在联机重做日志。在以下示例中,存在四个联机重做日志,因此您必须添加至少五个备用重做日志。换句话说,对于每个线程,都必须指定当前重做日志和至少一个重做日志,然后对它使用与原始重做日志相同的大小。
    1. 执行以下查询以确定 Oracle 重做日志的编号和大小(字节)。
      SELECT GROUP#, BYTES FROM V$LOG;
      输出应类似于以下内容。
      GROUP# BYTES
      ------ ----------
      1      1073741824
      2      1073741824
      3      1073741824
      4      1073741824
    2. 对于第一个线程,请指定当前重做日志以及另一个重做日志,并使用与当前重做日志相同的大小。例如:
      ALTER DATABASE ADD STANDBY LOGFILE THREAD 1
      GROUP 5 SIZE 1073741824,
      GROUP 6 SIZE 1073741824, 
      GROUP 7 SIZE 1073741824,
      GROUP 8 SIZE 1073741824,
      GROUP 9 SIZE 1073741824;
    3. 对于第二个线程,请指定当前重做日志以及另一个重做日志,并使用与当前重做日志相同的大小。例如:
      ALTER DATABASE ADD STANDBY LOGFILE THREAD 2
      GROUP 10 SIZE 1073741824,
      GROUP 11 SIZE 1073741824, 
      GROUP 12 SIZE 1073741824,
      GROUP 13 SIZE 1073741824,
      GROUP 14 SIZE 1073741824;
    4. 请确保创建的备用重做日志数正确。
      SELECT GROUP#, BYTES FROM V$STANDBY_LOG;
      应显示类似于以下内容的输出:
          GROUP#      BYTES
      ---------- ----------
               5 1073741824
               6 1073741824
               7 1073741824
               8 1073741824
               9 1073741824
              10 1073741824
              11 1073741824
              12 1073741824
              13 1073741824
              14 1073741824
      10 rows selected.

配置备用数据库(目标)

要配置备用数据库(目标),必须先放置备用数据库,然后修改 oratablistener.oratnsnames.ora 文件。

为数据库实例添加条目

在 Oracle RAC 节点上更新/etc/oratab文件并添加数据库实例的条目,如下所示:

  1. 使用 SSH 可登录到要移植的源数据库(主数据库)的第一个节点。
  2. 更新 /etc/oratab,通过执行以下操作将数据库实例 ID 添加到数据库条目:
    1. 编辑 /etc/oratab:
      sudo vi /etc/oratab
    2. 按以下格式添加数据库条目:
      $ORACLE_SID:$ORACLE_HOME:N
      节点 1 示例:
      orcl1:/u01/app/oracle/product/12.1.0.2/dbhome_1:N
      节点 2 示例:
      orcl2:/u01/app/oracle/product/12.1.0.2/dbhome_1:N
  3. 运行 oraenv 脚本以设置数据库的环境变量,例如 $ ORACLE_HOME
    . oraenv
  4. 对第二个 Oracle RAC 节点重复上述步骤。

删除备用数据库(目标)

  1. 使用 SSH 登录到备用(目标)服务器。
  2. 切换到作为数据库所有者的 oracle 用户。
  3. 以具有 SYSDBA 管理员权限的用户身份登录数据库实例。
    sqlplus / as sysdba
    Enter password: password
  4. 按如下所示对数据库取消集群 :
    alter system set cluster_database=false sid='*' scope=spfile;
    System altered.
  5. 退出 SQL*Plus:
     exit
  6. 使用 srvctl 停止数据库 :
    srvctl stop database -db database_unqiue_name
  7. 以具有 SYSDBA 管理员权限的用户身份登录数据库实例。
    sqlplus / as sysdba
    Enter password: password
  8. 以受限模式启动和装载数据库 :
     startup mount restrict
    ORACLE instance started.
    Total System Global Area 7516192768 bytes
    Fixed Size                  2941872 bytes
    Variable Size            1409289296 bytes
    Database Buffers         6073352192 bytes
    Redo Buffers               30609408 bytes
    Database mounted.
  9. 删除备用数据库 :
     drop database;
    Database dropped.

将静态服务添加到备用数据库 listener.ora 文件

将静态服务添加到备用数据库(源数据库)listener.ora 文件后,必须重新启动监听程序。

  1. 使用 SSH 登录到备用数据库(源数据库)服务器的第一个 Oracle RAC 节点。
  2. 在命令行上,以 grid 用户身份连接。
    sudo su - grid
  3. 修改要包括 static listener $ ORACLE_HOME/network/admin/listener.ora 文件。以下示例显示了用于一个 static listener 的格式:
    SID_LIST_LISTENER=
     (SID_LIST=
      (SID_DESC=
      (SDU=65535)
      (GLOBAL_DBNAME = standby_db_unique_name.standby_db_domain)
      (SID_NAME = standby_db_sid)
      (ORACLE_HOME= standby_oracle_home)
      (ENVS="TNS_ADMIN= standby_oracle_home/network/admin")
      )
    )
  4. 使用 srvctl 实用程序停止监听程序。
    srvctl stop listener -l LISTENER
  5. 重新启动 listener
    srvctl start listener -l LISTENER
  6. 检查 listener 状态。
    lsnrctl status

    注:

    输出是状态为 UNKNOWN 的新监听程序
  7. 对第二个 Oracle RAC 节点重复这些步骤。

将 TDE Wallet 从主数据库复制到备用数据库

使用安全复制协议(SCP),可以将 TDE Wallet 文件从主数据库(源数据库)系统手动复制到备用数据库(目标数据库)系统。

压缩 TDE Wallet

必须在主数据库(源数据库)中执行此操作。

  1. 使用 SSH 登录到主数据库(源数据库)服务器。
  2. 在命令行上,作为数据库软件所有者 oracle 进行连接。
    sudo su - oracle
  3. 执行 oraenv 脚本 , 该脚本设置$ ORACLE_HOME 环境变量。
    . oraenv
  4. 要查找 Wallet 位置 , 请使用 SYSDBA 管理员权限登录到主数据库(源数据库)实例。
    sqlplus / as sysdba
  5. 查询 V$ENCRYPTION_WALLET 动态视图的 WRL_PARAMETER 列以查找 wallet 所在的目录。
    SELECT * FROM V$ENCRYPTION_WALLET;
  6. 退出 SQL*Plus。
    exit
  7. 转到 Wallet 文件所在的目录。例如:
    cd /u02/app/oracle/admin/source_db_unique_name
  8. 使用 tar 命令可压缩 TDE Wallet。例如:
    tar cvf tde_wallet.tar ./tde_wallet
    此时将显示类似于以下内容的输出:
    ./tde_wallet/
    ./tde_wallet/ewallet.p12
    ./tde_wallet/cwallet.sso
    ./tde_wallet/ewallet_2018021607225910.p12
复制 TDE Wallet 并在 Wallet 目录上设置权限

备份 TDE Wallet 文件后,必须为 Wallet 创建一个目录并对此目录设置权限。

  1. tar Wallet 文件复制到 tmp 目录。例如:
    cp tde_wallet.tar /tmp/
  2. 退出可成为 OPC 用户。
    $ exit
  3. 将私有密钥从本地主机复制到主数据库。
    默认情况下,私有密钥不存储在数据库上
    scp -i /home/opc/.ssh/privateKey opc@<Primary DB IP>:/home/opc/.ssh/
  4. 使用 SCP 将 Wallet 文件从主数据库(源数据库)复制到 /opt/oracle/dcs/commonstore/wallets/tde/ $ ORACLE_UNQNAME 目录中的备用数据库(目标数据库)。例如:
    scp -i /home/opc/.ssh/privateKey /tmp/tde_wallet.tar opc@<Standby DB IP>:/tmp/
    此时将显示类似于以下内容的输出:
    tde_wallet.tar
    100% 20KB 20.0KB/s 00:00
  5. 使用 SSH 登录到目标数据库服务器。
  6. 以数据库软件所有者 oracle 身份登录。
    sudo su - oracle
  7. 执行 oraenv 脚本 , 该脚本设置$ ORACLE_HOME 环境变量。
    . oraenv
  8. 要查找 wallet 位置,请显示 sqlnet.ora 的内容:
    cat $ORACLE_HOME/network/admin/sqlnet.ora
  9. ENCRYPTION_WALLET_LOCATION 参数显示 Wallet 的位置。例如:
    ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME)))
  10. 转到目标 wallet 目录。例如:
    cd /opt/oracle/dcs/commonstore/wallets/tde
  11. 请确保此目录中存在正确的 wallet。
    ls target_db_unique_name
  12. 备份 wallet 文件。例如:
    mv target_db_unique_name target_db_unique_name.old
  13. 创建要在其中存储 wallet 的目录。例如:
    mkdir target_db_unique_name
  14. 检查 Wallet 目录的权限。
    ls -ld target_db_unique_name
  15. 如有必要,授予数据库软件所有者 Oracle 读取、写入和执行权限。
    chmod 700 target_db_unique_name
  16. 再次检查权限。
    ls -ld target_db_unique_name
  17. 将 tar Wallet 文件复制到当前目录。
    cp /tmp/tde_wallet.tar .
  18. 检查权限。
    ls -rlt
    此时将显示类似于以下内容的输出:
    total 124
    drwx------ 2 oracle oinstall 20480 Feb 16 09:25 target_db_unique_name.old
    drwx------ 2 oracle oinstall 20480 Feb 16 10:16 target_db_unique_name
    -rw-r--r-- 1 oracle oinstall 20480 Feb 16 10:17 tde_wallet.tar
完成 TDE Wallet 进程

必须提取 TDE Wallet 文件 tar,然后将其内容移动到备用数据库(目标数据库)上的 wallet 目录中。

  1. 在备用数据库(目标数据库)上,确保您位于正确的 wallet 目录中。例如:
    pwd
     
    # Output similar to the following should appear:
    /opt/oracle/dcs/commonstore/wallets/tde
  2. 提取 tar 文件。
    tar xvf tde_wallet.tar
    应显示类似于以下内容的输出:
    ./tde_wallet/ewallet.p12
    ./tde_wallet/ewallet_2018050819024979.p12
    ./tde_wallet/cwallet.sso
  3. tde_wallet 内容移动到备用数据库(目标数据库)上的 wallet 目录。
    mv ./tde_wallet/* ./target_db_unique_name
  4. 从备用数据库(目标数据库)中删除 tde_wallet 内容。
    rm -rf ./tde_wallet

配置备用初始化参数文件并在 NOMOUNT 模式下启动实例

配置备用初始化文件之后,可以在 NOMOUNT 模式下重新启动数据库。

  1. 使用 SSH 登录备用数据库(目标数据库)服务器。
  2. 以数据库软件所有者 oracle 身份登录。
    sudo su - oracle
  3. 执行设置 $ORACLE_HOME 环境变量的 oraenv 脚本。
    . oraenv
  4. 转到 dbs 目录。
    cd $ORACLE_HOME/dbs
  5. 创建名为 init_ < SID > .ora 的临时初始化参数文件,其中 < SID > 是目标数据库 SID,如下所示:
    echo "*.db_name='db_name'" > $ORACLE_HOME/dbs/init<sid>.ora
    echo "*.db_unique_name='target_db_unique_name'" >> $ORACLE_HOME/dbs/init<sid>.ora
  6. 备份现有口令文件(如果存在)。例如:
    mv $ORACLE_HOME/dbs/orapw<sid> $ORACLE_HOME/dbs/orapw<sid>.old
  7. 创建新的口令文件。例如:
    orapwd file=$ORACLE_HOME/dbs/orapwtarget password=admin_password_for_primary entries=5
  8. 将集群中的口令文件更改为 non-ASM 口令文件 :
    $ srvctl modify database -d <oci_db_unique_name> -pwfile $ORACLE_HOME/dbs/orapw<oci_oracle_sid>
    $ srvctl config database -d <oci_db_unique_name>
  9. 以具有 sysdba 管理员权限的用户身份连接到备用数据库(目标数据库)实例。例如:
    sqlplus / as sysdba 
  10. 关闭数据库。例如:
    shutdown immediate
  11. 使用 init<sid>.ora 初始化参数文件在 NOMOUNT 模式下重新启动数据库。
    startup force nomount PFILE=?/dbs/init<sid>.ora

从活动数据库复制备用数据库的目标数据库

可以执行脚本来复制备用数据库(目标数据库)。如果主数据库(源数据库)较大,则可以分配其他通道以提高其性能。对于新安装的数据库,一个通道通常在几分钟内运行数据库重复。请确保在运行 Oracle Recovery Manager (Oracle RMAN)复制操作后未发生错误。如果出现错误,则可以使用初始化参数文件(而非 spfile)重新启动数据库,以便在 $ORACLE_HOME/dbs 目录下作为 Oracle RMAN 复制进程的一部分生成。

  1. 以数据库软件所有者 oracle 身份连接到备用数据库(目标数据库)。
    su - oracle
  2. 执行 oraenv 脚本 , 该脚本设置$ ORACLE_HOME 环境变量。
    . oraenv
  3. 创建 dup.rcv
    vi dup.rcv
    更新所需变量时粘贴脚本的内容。
  4. NOMOUNT 模式下,使用备用数据库(目标数据库)连接到 Oracle RMAN
    rman
    RMAN> connect target sys@<primary_db_tnsnames_name>
    target database Password: password
    RMAN> connect auxiliary sys@<standby_db_tnsnames_name>
    auxiliary database Password: password
  5. 执行以下脚本可从活动数据库中复制备用数据库的目标数据库。以下示例显示了 dup.rcv 脚本,该脚本必须是用户创建的,并且基于 My Oracle Support 注释 2369137RMAN 有效的重复运行到 RMAN-06217 -- PUSH & PULL 方法说明(文档 ID 2369137.1)中。在此示例中,已定制 dup.rcv 脚本以将重复(图像副本)从文件系统推送到 Oracle Automatic Storage Management (Oracle ASM)。其他选项(如从文件系统到 Oracle Automatic Storage Management Cluster File System 或 Oracle ASMOracle ASM)需要更改文件目标参数和文件名转换参数。
    @dup.rcv
    Output similar to the following appears:
    
    RMAN> run {
    2> allocate channel prmy1 type disk;
    3> allocate channel prmy2 type disk;
    4> allocate channel prmy3 type disk;
    5> allocate channel prmy4 type disk;
    6> allocate auxiliary channel stby1 type disk;
    7> allocate auxiliary channel stby2 type disk;
    8> allocate auxiliary channel stby type disk;
    9> duplicate target database for standby from active database dorecover
    10> spfile
    11> parameter_value_convert '/u02/app/oracle/oradata/source_db_name','+DATA'
    12> Set CLUSTER_DATABASE='FALSE'
    13> set db_unique_name='<target_db_unique_name>'
    14> set db_create_file_dest='+DATA'
    15> set db_create_online_log_dest_1='+RECO'
    16> set db_recovery_file_dest='+RECO'
    17> set audit_file_dest='/u01/app/oracle/admin/db_name/adump'
    18> set control_files='+DATA','+RECO'
    19> set dg_broker_config_file1='+DATA/<target_db_unique_name>/dr1<target_db_unique_name>.dat'
    20> set dg_broker_config_file2='+RECO/<target_db_unique_name>/dr2<target_db_unique_name>.dat'
    21> set dispatchers='(PROTOCOL=TCP) (SERVICE=<target_db_name>XDB)'
    22> set instance_name='<target_db_name>'
    23> set db_domain='<target_db_domain>'
    24> set db_recovery_file_dest='+RECO'
    25> ;
    26> }

Oracle Recovery Manager 复制后步骤

完成 Oracle Recovery Manager (Oracle RMAN)复制操作后,应在备用数据库(目标数据库)上执行这些清除任务。

更新口令文件

按如下所示更新口令文件:

  1. 将口令文件移回ASM:
    [oracle@oci_node1 ~]$ cp $ORACLE_HOME/dbs/orapw<oci_node1_oracle_sid> /tmp/orapw<oci_node1_oracle_sid>
  2. 退出到 opc 用户 :
    [oracle@oci_node1 ~]$ exit
  3. 切换到 grid 用户 :
    [opc@oci_node1 ~]$ sudo su - grid
  4. 切换到 ASMCMD 提示 :
    [grid@oci_node1 ~]$ asmcmd
  5. ASMCMD 中复制口令 :
    ASMCMD> pwcopy --dbuniquename <oci_db_unique_name> '/tmp/orapw<oci_node1_oracle_sid>' '+DATA'

    注:

    由于 ASM 与数据库的版本不同 , 命令可能会显示错误。可以忽略这些错误,因为在此过程的后面修复了注册问题。

  6. 导航到+ DATA/< OCI_DB_UNIQUE_NAME >/PASSWORD/目录以找到要在步骤9中使用的system_generated_id。
    ASMCMD> cd +DATA/<OCI_DB_UNIQUE_NAME>/PASSWORD/ 
    ASMCMD> ls -lt
  7. 退出 ASMCMDgrid 用户 :
    ASMCMD> exit
    [grid@oci_node1 ~]$ exit
  8. 切换到 Oracle 用户 :
    [opc@oci_node1 ~]$ sudo su - oracle
  9. 执行 oraenv 脚本 , 该脚本设置$ ORACLE_HOME 环境变量。
    . oraenv
  10. 将集群中的口令文件修改为 ASM:
    [oracle@oci_node1 ~]$ srvctl modify database -d <oci_db_unique_name> -pwfile +DATA/<OCI_DB_UNIQUE_NAME>/PASSWORD/pwd<oci_db_unique_name><system_generated_id>
    [oracle@oci_node1 ~]$ rm $ORACLE_HOME/dbs/orapw<oci_node1_oracle_sid>
启用 Oracle Flashback

应启用 Oracle Flashback。

  1. 使用 SSH 登录备用数据库(目标数据库)服务器。
  2. 以数据库软件所有者 oracle 身份登录。
    sudo su - oracle
  3. 以具有 SYSOPER 管理员权限的用户身份登录数据库实例。例如:
    sqlplus / as sysoper
    Enter password: password
  4. 启用 Oracle Flashback。
    ALTER DATABASE FLASHBACK ON;
  5. 以具有 SYSDBA 管理员权限的用户身份进行连接。
    CONNECT / AS SYSDBA
  6. 设置闪回保留目标。
    ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=120;
将 spfile 文件移动到 Oracle Automatic Storage Management

应将 spfile 文件移动到 Oracle Automatic Storage Management。

  1. 使用 SSH 可以连接到备用数据库(目标数据库)服务器。
  2. 以具有 SYSOPER 管理员权限的用户身份登录数据库实例。
  3. 创建 spfile 文件并将其移动到 Oracle Automatic Storage Management。
    1. 创建 pfile。
      create pfile='/tmp/init<sid>.ora' from spfile;
    2. 退出 SQL*Plus:
      SQL> exit
    3. 编辑 pfile:
      vi /tmp/init<sid>.ora
    4. 从文件中删除以下行:
      *.instance_name=<sid_for_node1>
    5. 为每个节点添加以下行:
      <sid_for_node1>.instance_name='<sid_for_node1>'
      <sid_for_node2>.instance_name='<sid_for_node2>'
    6. 以管理员用户身份登录到 SQL*Plus。例如:
      sqlplus sys / as sysdba
      Password: password
    7. 关闭数据库
      shutdown immediate
    8. 使用刚创建的 initdb_name.ora 文件在 MOUNT 模式下重新启动数据库。
      startup mount pfile='/tmp/init<sid>.ora';
    9. 创建 spfile 文件。
      create spfile='+DATA' from pfile='/tmp/init<sid>.ora';
  4. 退出 SQL*Plus。
  5. 作为 grid 用户,请使用 asmcmd 命令在 Oracle Automatic Storage Management 上查找 spfile 文件。
    asmcmd
    ASMCMD> cd +DATA/target_db_unique_name/PARAMETERFILE/
    ASMCMD> ls -lt
    此时将显示类似于以下内容的输出:
    Type           Redund  Striped  Time             Sys  Name
    PARAMETERFILE  UNPROT  COARSE   APR 09 16:00:00  Y    spfile.262.973010033
    记下您将需要在下一个任务中使用的 ASM 名称(spfile. 262.973010033)。
将 inittarget_db_name .ora 文件更改为引用 spfile 文件

可以修改 init<sid>.ora 文件以引用 spfile 文件。

  1. 使用 SSH 可以连接到备用数据库(目标数据库)服务器。
  2. 以数据库软件所有者 oracle 身份登录。
    su - oracle
  3. 执行 oraenv 脚本以设置 $ORACLE_HOME 环境变量。
    . oraenv
  4. 转到 $ORACLE_HOME/dbs 目录。
    cd $ORACLE_HOME/dbs
  5. 请确保 init<sid>.ora 文件位于此目录中。
    ls *.ora
  6. 更改 inittarget_db_name.ora 文件以引用 spfile 文件。例如:
    mv spfiletarget_db_name.ora spfiletarget_db_name.ora.stby
    mv init<sid>.ora init<sid>.ora.stby
    echo ''SPFILE='+DATA/target_db_unique_name/PARAMETERFILE/spfile.262.973010033'' > init<sid>.ora
    cat init<sid>inittarget_db_name.ora--To check the file
    在此输出中,spfile.262.973010033 是您在将 spfile 文件移到 Oracle Automatic Storage Management 中以前的任务时生成的文件的名称。
    此时将显示类似于以下内容的输出:
    SPFILE='+DATA/target_db_unique_name/PARAMETERFILE/spfile.262.973010033'
在装载模式下修改和启动备用数据库

可以使用 srvctl 修改和启动备用数据库(目标数据库)。

  1. 使用 SSH 登录备用数据库(目标数据库)服务器。
  2. 以数据库软件所有者 oracle 身份登录。
    su - oracle
  3. 执行 oraenv 脚本 , 该脚本设置$ ORACLE_HOME 环境变量。
    . oraenv
  4. 使用 srvctlMOUNT 模式下修改和启动备用数据库(目标数据库)。例如:
    srvctl modify database -db target_db_unique_name -role /
    PHYSICAL_STANDBY -s "READ ONLY"  -spfile /
    +DATA/target_db_unique_name/PARAMETERFILE/spfile.262.973010033
    
    srvctl config database -db target_db_unique_name
  5. 以具有 SYSOPER 管理员权限的用户身份登录数据库实例。
    sqlplus / as sysoper
  6. 关闭数据库 ,
    SQL*Plus
    SHUTDOWN IMMEDIATE
  7. 在装载时启动数据库
    STARTUP MOUNT
  8. 变更 cluster_database 参数
    
    alter  system set cluster_database=True  sid='*' scope=spfile;
  9. 关闭数据库
    SHUTDOWN IMMEDIATE
  10. 退出 SQL*Plus。
    EXIT
  11. 使用 srvctlMOUNT 模式下启动数据库。
    srvctl start database -db target_db_unique_name -o mount
  12. 以具有 SYSDBA 管理员权限的用户身份登录数据库实例。
    sqlplus / as sysdba
  13. 查询 V$DATABASE 动态视图以确保数据库处于 MOUNT 模式。
    SELECT NAME, OPEN_MODE FROM V$DATABASE;
    此时将显示类似于以下内容的 #Output:
    NAME              OPEN_MODE
    --------------    ---------
    source_db_name    MOUNTED
在主数据库上设置数据库和日志文件名转换参数

必须设置数据库的转换参数和主数据库上的日志文件名(源数据库)。

  1. 使用 SSH 登录到主数据库(源数据库)服务器。
  2. 切换到 Oracle 用户 :
    sudo su - oracle
  3. 以具有 SYSDBA 管理员权限的用户身份登录数据库实例。例如:
    sqlplus / as sysdba
    Enter password: password
  4. 请检查 CONVERT 参数。
    SHOW PARAMETER CONVERT
    此时将显示类似于以下内容的输出:
    NAME                         TYPE        VALUE
    ------------------------------------ ----------- ------
    db_file_name_convert                 string
    log_file_name_convert                string
    pdb_file_name_convert                string
    VALUE 列应为空(空值)。如果有值,则在迁移完成后记下此值。移植完成后,这些值设置为空值。
  5. 使用此输出中的信息来设置 DB_FILE_NAME_CONVERT 参数。

    注:

    请注意,在此步骤中,SOURCE_DB_NAME 应采用大写形式。
    ALTER SYSTEM SET DB_FILE_NAME_CONVERT='+DATA','/u02/app/oracle/oradata/SOURCE_DB_NAME/'' SID='*' SCOPE=SPFILE;
  6. 设置 LOG_FILE_NAME_CONVERT 参数。例如:
    ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='+RECO','/u04/app/oracle/redo/' SID='*' SCOPE=SPFILE;
  7. 重新启动数据库。
    srvctl stop database -db source_db_name
    srvctl start database -db source_db_name
在备用数据库上设置数据库和日志文件名转换参数

必须设置备用数据库(目标数据库)上的数据库和日志文件名的转换参数。

  1. 使用 SSH 登录备用数据库(目标数据库)服务器。
  2. 切换到 Oracle 用户 :
    sudo su - oracle
  3. 以具有 SYSDBA 管理员权限的用户身份登录数据库实例。例如:
    sqlplus / as sysdba
    Enter password: password
  4. 请查看 CONVERT 参数。
    SHOW PARAMETER CONVERT
    此时将显示类似于以下内容的输出:
     NAME                        TYPE        VALUE
    ------------------------------------ ----------- ------
    db_file_name_convert                 string
    log_file_name_convert                string
    pdb_file_name_convert                string
    VALUE 列应为空(空值)。如果有值,则在迁移完成后记下此值。移植完成后,这些值设置为空值。
  5. 使用此输出中的信息来设置DB_FILE_NAME_CONVERT参数。例如:

    注:

    请注意,在此步骤中,SOURCE_DB_NAME 应采用大写形式。
    ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/u02/app/oracle/oradata/SOURCE_DB_NAME/','+DATA' SID='*' SCOPE=SPFILE;
  6. 设置 LOG_FILE_NAME_CONVERT 参数。例如:
    ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/u04/app/oracle/redo/','+RECO'
    SID='*' SCOPE=SPFILE;
  7. 重新启动数据库。
    srvctl stop database -db target_db_unique_name
    srvctl start database -db target_db_unique_name -o mount

使用 Oracle Data Guard 中介配置数据库

您可以使用 dbmgrl 实用程序配置 Oracle Data Guard 中介的主数据库(源数据库)或备用数据库(目标数据库)。

  1. 使用 SSH 登录到主数据库(源数据库)或备用数据库(目标数据库)服务器。
  2. 启动 dgmgrl 命令行实用程序 :
    dgmgrl
  3. 作为主数据库或备用数据库系统中的用户 SYS 进行连接。例如,要登录到 TNS 名称为 OCIC-ORCL 的主数据库:
    connect sys@ocic-orcl
    Enter password: password
  4. 使用 dbmgrl 实用程序,为主数据库和备用数据库创建 Oracle Data Guard 配置和标识。例如:
    create configuration configuration_name as primary database is source_db_unique_name connect identifier is OCIC-ORCL; -- Uses the source TNS name
     
    add database target_db_unique_name as connect identifier is OCI-ORCL; --Uses the target TNS name
  5. 启用配置。
    enable configuration
  6. 显示备用数据库上的 Oracle Data Guard 配置。
    show configuration
    此时将显示类似于以下内容的输出:
    Configuration - configuration_name
      Protection Mode: MaxPerformance
      Members:
      source_db_unique_name           - Primary database
        target_db_unique_name         - Physical standby database
    
    Fast-Start Failover: DISABLED
    
    Configuration Status:
    SUCCESS   (status updated 12 seconds ago)

在主数据库和备用数据库上验证 Oracle Data Guard 中介

您可以使用 SQL*Plus 在主数据库(源数据库)和备用数据库(目标数据库)上验证 Oracle Data Guard 中介。

验证主数据库中的 Oracle Data Guard 中介

您可以使用 SQL*Plus 在主数据库(源数据库)上验证 Oracle Data Guard 中介。

  1. 使用 SSH 登录到主数据库(源数据库)服务器。
  2. 以具有 SYSDBA 管理员权限的用户身份进行连接。例如,对于其 TNS 名称为 OCIC-ORCL 的主数据库:
    connect sys@ocic-orcl as sysdba
    Enter password: password
  3. 查询 V$DATABASE 动态视图。
    SELECT FORCE_LOGGING, FLASHBACK_ON, OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, DATAGUARD_BROKER, PROTECTION_MODE FROM V$DATABASE;
    
  4. 此时将显示类似于以下内容的输出:
    
    FORCE_LOGGING                           FLASHBACK_ON       OPEN_MODE
    --------------------------------------- ------------------ -----------
    DATABASE_ROLE    SWITCHOVER_STATUS    DATAGUAR PROTECTION_MODE
    ---------------- -------------------- -------- --------------------
    YES                                     YES                READ WRITE
    PRIMARY          TO STANDBY           ENABLED  MAXIMUM PERFORMANCE
    在输出中,DATABASE_ROLE 应为 PRIMARYOPEN_MODE 应为 READ WRITE

验证备用数据库上的 Oracle Data Guard 中介

您可以使用 SQL*Plus 在备用数据库(目标数据库)上验证 Oracle Data Guard 中介。

  1. 使用 SSH 登录备用数据库(目标数据库)服务器。
  2. 以具有 SYSDBA 管理员权限的用户身份进行连接。
  3. 查询 V$DATABASE 动态视图。
    SELECT FORCE_LOGGING, FLASHBACK_ON,
    OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS,
    DATAGUARD_BROKER, PROTECTION_MODE
    FROM V$DATABASE;
    此时将显示类似于以下内容的输出:
    FORCE_LOGGING                           FLASHBACK_ON       OPEN_MODE
    --------------------------------------- ------------------ -----------
    DATABASE_ROLE    SWITCHOVER_STATUS    DATAGUAR PROTECTION_MODE
    ---------------- -------------------- -------- --------------------
    YES                                     YES                MOUNTED
    PHYSICAL STANDBY NOT ALLOWED          ENABLED  MAXIMUM PERFORMANCE
    输出应将DATABASE_ROLE显示为 PHYSICAL STANDBYOPEN_MODE 显示为 MOUNTED
  4. 确保在备用数据库中启动了 Oracle Data Guard 进程。
    SELECT PROCESS,PID,DELAY_MINS FROM V$MANAGED_STANDBY;
    此时将显示类似于以下内容的输出:
    PROCESS   PID                      DELAY_MINS
    --------- ------------------------ ----------
    ARCH      9207                              0
    ARCH      9212                              0
    ARCH      9216                              0
    ARCH      9220                              0
    RFS       1065                              0
    RFS       1148                              0
    RFS       1092                              0
    MRP0      972                               0
    RFS       1208                              0
    输出应指示进程运行时间很少或没有延迟。如果 DELAY_MINS 用于 MRP0,则将同步数据库。
  5. 请检查 LOG_ARCHIVE_DEST 参数。
    SHOW PARAMETER LOG_ARCHIVE_DEST_
    此时将显示类似于以下内容的输出:
    NAME                         TYPE      VALUE
    ---------------------------- --------- -----------------------------
    log_archive_dest_1           string       
                                           location=USE_DB_RECOVERY_FILE_
                                           DEST, valid_for=(ALL_LOGFILES,
                                           ALL_ROLES)
    log_archive_dest_10          string
    log_archive_dest_11          string
    log_archive_dest_12          string
    log_archive_dest_13          string
    log_archive_dest_14          string
    log_archive_dest_15          string
    ...
    log_archive_dest_2           string    service="oci-orcl", ASYNC
                                           NOAF FIRM delay=0 optional
                                           compression=disable
                                           max_failure=0 max_connections
                                           =1 reopen=300 db_unique_name=
                                           "source_db_unique_name"
                                           net_timeout=30, valid_for=
                                           (online_logfile,all_roles)
    ...
    
    输出应该类似于 log_archive_dest_2 的输出,并且服务指向备用数据库(目标数据库),后者在此示例中为 oci-orcl
  6. 请检查 LOG_ARCHIVE_CONFIG 参数。
    SHOW PARAMETER LOG_ARCHIVE_CONFIG#
    此时将显示类似于以下内容的输出:
    
    NAME                         TYPE      VALUE
    ---------------------------- --------- -----------------------------------------------------------
    log_archive_config           string    dg_config=(source_db_unique_name,target_db_unique_name)
    
  7. 请检查 FAL_SERVER 参数。
    SHOW PARAMETER FAL_SERVER
    此时将显示类似于以下内容的输出:
    
    NAME                        TYPE      VALUE
    --------------------------- --------- ----------
    fal_server                  string    <tns_entry_of_primary>  
  8. 请检查 LOG_ARCHIVE_FORMAT 参数。
    SHOW PARAMETER LOG_ARCHIVE_FORMAT
    此时将显示类似于以下内容的输出:
    
    NAME                        TYPE      VALUE
    --------------------------- --------- --------------
    log_archive_format          string    %t_%s_%r.dbf

完成主数据库上的验证

您可以使用 dgmrgl 在主数据库(源数据库)上完成 Oracle Data Guard 中介验证。

  1. 使用 SSH 登录到主数据库(源数据库)服务器。
  2. 在主数据库(源数据库)上的备用数据库上重复主题中的 5 到 8 步骤验证 Oracle Data Guard 中介
  3. 启动 dgmgrl 命令行实用程序 :
    dgmgrl
  4. 作为主数据库或备用数据库系统中的用户 SYS 进行连接。例如,要登录到 TNS 名称为 OCIC-ORCL 的主数据库:
    connect sys@primary_db_tnsnames_name
    Enter password: password
  5. 请检查 Oracle Data Guard 配置。
    show configuration verbose
    此时将显示类似于以下内容的输出:
    Configuration - configuration_name
     
      Protection Mode: MaxPerformance
      Members:
      source_db_unique_name           - Primary database
        target_db_unique_name         - Physical standby database
     
      Properties:
        FastStartFailoverThreshold      = '30'
        OperationTimeout                = '30'
        TraceLevel                      = 'USER'
        FastStartFailoverLagLimit       = '30'
        CommunicationTimeout            = '180'
        ObserverReconnect               = '0'
        FastStartFailoverAutoReinstate  = 'TRUE'
        FastStartFailoverPmyShutdown    = 'TRUE'
        BystandersFollowRoleChange      = 'ALL'
        ObserverOverride                = 'FALSE'
        ExternalDestination1            = ''
        ExternalDestination2            = ''
        PrimaryLostWriteAction          = 'CONTINUE'
     
    Fast-Start Failover: DISABLED
  6. 检查备用数据库(目标数据库)上的状态。例如:
    show database verbose target_db_unique_name
    完成这些步骤后,必须通过在两个方向执行切换操作来测试 Oracle Data Guard 配置是否按预期工作。

执行迁移

要完成移植 , 必须从主数据库(源数据库)到备用数据库(目标数据库)执行切换操作。

  1. 使用 SSH 登录到主数据库(源数据库)服务器。
  2. 启动 dgmgrl 命令行实用程序。
    dgmgrl 
  3. 作为主数据库系统或备用数据库系统中的用户 SYS 进行连接。例如,要登录到 TNS 名称为 OCIC-ORCL 的主数据库,请执行以下操作:。
    connect sys@ocic-orcl
    Enter password: password
  4. 请检查配置。
    show configuration verbose
  5. 在配置详细输出中,检查数据库状态设置是否显示 SUCCESS
  6. 检查主数据库(源数据库)的配置。
    show database verbose source_db_unique_name
    数据库详细输出应显示角色是主要的,且 StaticConnectIdentifier 的设置与 DGConnectIdentifier. 的设置相同
  7. 对备用数据库(目标数据库)执行切换操作。
    switchover to target_db_unique_name
    输出应指示两个数据库之间执行切换操作。
  8. 运行显示配置以验证是否没有错误或警告 :
    show configuration;

迁移后步骤

在将 Oracle 数据库从 Oracle Cloud Infrastructure Compute Classic 服务器迁移到使用虚拟机数据库系统的 Oracle Cloud Infrastructure 服务器之后,应验证迁移,然后将配置从主数据库(源数据库)中删除。

测试备用数据库上的 Oracle Data Guard 配置

在此阶段 , 目标数据库现在是主数据库。源数据库现在是备用数据库。

通过对源数据库执行切换操作,可以测试目标数据库上的 Oracle Data Guard 连接。此切换操作将使目标数据库再次采用备用角色。此测试的用途是证明您可以返回到原始配置,以防目标数据库不起作用。

  1. 使用 SSH 登录备用数据库(目标数据库)服务器。
  2. 启动 dgmgrl 实用程序。例如:
    dgmgrl sys@target_db
    Enter password: password
  3. 对源数据库执行切换操作 , 这使目标数据库具有备用角色。
    switchover to source_db_unique_name;
    输出应指示两个数据库之间执行切换操作。
  4. (可选)要防止对新的备用数据库进行更改,直到确定新的主数据库完全起作用,请临时禁用 Redo Apply 功能。
    edit database source_db_unique_name set state = 'APPLY-OFF';
    如果执行其他切换操作以使目标数据库现在是备用数据库 , 则可以执行 APPLY-OFF 操作以防止更新源数据库。这样可以将目标数据库放入服务中,并使源数据库在新配置中保持逻辑故障时作为时间点备份。
  5. (可选)要重新启动应用功能:
    edit database source_db_unique_name set state = 'APPLY-ON';
  6. 退出 dgmgrl
    exit
  7. 对目标数据库执行切换操作 , 这会使源数据库成为备用数据库角色。
    switchover to target_db_unique_name;
    输出应指示两个数据库之间执行切换操作。
  8. 测试与新主数据库的连接。例如,导出目标唯一名称之后,请以用户 SYS 的身份进行连接,并从加密的表空间中进行选择。在本例中,对 HR.EMPLOYEES 表进行加密。
    exit
  9. 测试与新主数据库的连接。例如,在导出目标唯一名称之后,连接用户 SYS 并从加密的表空间中进行选择。在本例中,对 HR.EMPLOYEES 表进行加密。
    export ORACLE_UNQNAME=target_db_unique_name
     
    sqlplus sys@target_TNS_name
    Password: password
     
    SQL> ALTER SESSION SET CONTAINER = PDB1;
    SQL> SELECT * FROM HR.EMPLOYEES;
     
    SQL> EXIT

清除备用数据库

完成并测试移植后,可以从备用数据库(目标数据库)中删除 Oracle Data Guard 配置。不需要删除原始源数据库。在此阶段 , 备用数据库是新的源数据库。

  1. 使用 SSH 登录到备用数据库(目标数据库)服务器并登录 Oracle Data Guard dgmgrl utility
  2. 请检查配置。
    show configuration
  3. 如果配置未显示 Protection Mode: MaxPerformance,则设置 Oracle Data Guard 以使用 MaxPerformance 保护模式。
    edit configuration set protection mode as maxperformance
  4. 禁用,然后删除配置。
    edit database source_db_unique_name set state = 'APPLY-OFF';
     
    disable configuration;
     
    remove configuration;
     
    exit
  5. 以具有 SYSDBA 管理员权限的用户身份连接到数据库实例。例如:
    sqlplus / as sysdba
  6. 请检查 DG_BROKER_CONFIG_FILE 参数。
    SHOW PARAMETER DB_BROKER_CONFIG_FILE
    输出应该列出此配置的关联数据和恢复文件,通常名为 dg_broker_config_file1dg_broker_config_file2
  7. 启动另一个终端窗口 , 并以网格用户身份登录到 asmcmd
  8. 删除选中 DG_BROKER_CONFIG_FILE 参数时列出的 Oracle Data Guard 配置文件。
  9. 返回运行 SQL*Plus 的窗口。
  10. 执行以下 ALTER SYSTEM 语句:
    ALTER SYSTEM SET DG_BROKER_START=FALSE SID='*' SCOPE=BOTH;
    ALTER SYSTEM SET DG_BROKER_CONFIG_FILE1='' SID='*' SCOPE=SPFILE;
    ALTER SYSTEM SET DG_BROKER_CONFIG_FILE2='' SID='*' SCOPE=SPFILE;
    ALTER SYSTEM RESET LOG_ARCHIVE_CONFIG SID='*' SCOPE=SPFILE;
  11. 请检查以下参数 :
    SHOW PARAMETER DB_FILE_NAME_CONVERT
    SHOW PARAMETER LOG_FILE_NAME_CONVERT
    SHOW PARAMETER LOG_ARCHIVE_DEST
    SHOW PARAMETER LOG_ARCHIVE_DEST_STATE
    SHOW PARAMETER STANDBY_ARCHIVE_DEST
    SHOW PARAMETER FAL
  12. 如果设置了前面的任何参数,则将重置参数以使用空白值。例如,对于 STANDBY_ARCHIVE_DEST
    ALTER SYSTEM SET STANDBY_ARCHIVE_DEST='' SID='*' SCOPE=SPFILE;
  13. 重新启动数据库。
    SHUTDOWN IMMEDIATE
    STARTUP
  14. 从主数据库(源数据库)中删除备用日志。
    1. 在新主数据库(以前称为目标数据库)上查找备用数据库重做日志的组编号。
      SELECT GROUP# FROM V$STANDBY_LOG;Output similar to the following appears:    GROUP#
      ----------
               5
               6
               7
               8
               9
    2. 删除备用日志。例如:
      ALTER DATABASE DROP STANDBY LOGFILE GROUP 5;
      ALTER DATABASE DROP STANDBY LOGFILE GROUP 6;
      ALTER DATABASE DROP STANDBY LOGFILE GROUP 7;
      ALTER DATABASE DROP STANDBY LOGFILE GROUP 8;
      ALTER DATABASE DROP STANDBY LOGFILE GROUP 9;
  15. (可选)更改 DB_BLOCK_CHECKSUMDB_BLOCK_CHECKING 参数。
    默认值为 DB_BLOCK_CHECKSUM=TYPICALDB_BLOCK_CHECKING=FALSE
  16. 退出 SQL*Plus。
    EXIT