更新时间:2024-04-26 GMT+08:00
分享

快速部署

本章节主要帮助用户快速部署该解决方案。用户可按照本章节部署步骤进行部署;或者下载部署脚本,根据代码仓中README.md的说明执行脚本完成部署。

表1 部署参数说明

参数名称

类型

参数解释

SOURCE_ORACLE_SID

String

源端oracle数据库实例名

TARGET_ORACLE_SID

String

目标端oracle数据库实例名

SOURCE_DB_UNIQUE_NAME

String

源端oracle数据库全局唯一名称

TARGET_DB_UNIQUE_NAME

String

目标端oracle数据库全局唯一名称

SOURCE_ORACLE_BASE

String

源端oracle根目录

TARGET_ORACLE_BASE

String

目标端oracle根目录

SOURCE_ORACLE_HOME

String

源端oracle产品目录

TARGET_ORACLE_HOME

String

目标端oracle产品目录

SOURCE_TNS_ID

String

源端数据库tns连接标识

TARGET_TNS_ID

String

目标端数据库tns连接标识,需与SOURCE_TNS_ID不同

SOURCE_SERVICE_NAME

String

源端oracle用于数据库连接的全局名称

TARGET_SERVICE_NAME

String

目标端oracle用于数据库连接的全局名称

SOURCE_GLOBAL_DBNAME

String

源端oracle数据库全局名称

TARGET_GLOBAL_DBNAME

String

目标端oracle数据库全局名称

SOURCE_EIP

String

源端弹性公网IP

TARGET_EIP

String

目标端弹性公网IP

SOURCE_ORACLE_PWD

String

源端oracle数据库sys用户密码

以下部署步骤中出现上表参数,均用"$+参数名"代替。按照部署步骤在命令行执行命令时,需要将对应参数名替换为参数实际值。主库对应源端,备库对应目标端。

【部署参数查询说明】:

以下简要说明各部署参数如何查询(切换至oracle用户执行指令)。

  • ORACLE_SID(数据库实例名),ORACLE_BASE(oracle根目录),ORACLE_HOME(oracle产品目录):命令行输入以下指令查询
echo $ORACLE_SID
echo $ORACLE_BASE
echo $ORACLE_HOME
  • DB_UNIQUE_NAME(oracle数据库全局唯一名称),SERVICE_NAME(用于数据库连接的全局名称):命令行输入以下指令查询
sqlplus / as sysdba << end
    startup;
    show parameter name;

图1 查询DB_UNIQUE_NAME和SERVICE_NAME

  • TNS_ID(数据库tns连接标识):在tnsnames.ora中自定义,文件路径为"$SOURCE_ORACLE_HOME/network/admin/tnsnames.ora"
  • GLOBAL_DBNAME:命令行输入以下指令查询
sqlplus / as sysdba << end
    startup;
    select * from global_name;

图2 查询GLOBAL_DBNAME

  • EIP:源端和目标端动态分配

源端dataguard部署

切换至oracle用户执行以下部署步骤:

  1. 创建本地日志归档目录,需要输入root用户密码。

    1
    2
    su - root -c "mkdir -p /oraarch/$SOURCE_ORACLE_SID"
    su - root -c "chown -R oracle.oinstall /oraarch"
    

    图3 创建源端归档目录

  2. 登录数据库,启动归档模式,打开数据强制日志,创建数据库初始化文件spfile。

    # shutdown为危险操作,会关闭数据库业务
    sqlplus / as sysdba << end
        shutdown immediate;
        startup mount;
        alter database archivelog;
        alter database force logging;
        create spfile from pfile;
        shutdown immediate;
    end

  3. 登录数据库,设置归档日志本地和远程目录,设置数据库连接参数,设置主库日志文件。

    查看主库已有redo日志组(默认3个),查看方法:
    sqlplus / as sysdba << end
        startup mount;
        select * from v$logfile;

    图4 查询redo日志组数

    alter database add standby logfile指令添加的日志文件组数比已有redo日志组多一组,可根据上一步查询结果更改:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    # shutdown为危险操作,会关闭数据库业务
    sqlplus / as sysdba << end
        alter system set log_archive_dest_1='location=/oraarch/$SOURCE_ORACLE_SID valid_for=(all_logfiles,all_roles) db_unique_name=$SOURCE_DB_UNIQUE_NAME' scope=both;
        alter system set log_archive_dest_2='service=$TARGET_TNS_ID lgwr sync valid_for=(online_logfiles,primary_role) db_unique_name=$TARGET_DB_UNIQUE_NAME' scope=both;
        alter system set log_archive_dest_state_1=enable;
        alter system set log_archive_dest_state_2=enable;
        alter system set standby_file_management=manual scope=both;
        alter system set fal_client='$SOURCE_TNS_ID' scope=spfile;
        alter system set fal_server='$TARGET_TNS_ID' scope=spfile;
        alter database add standby logfile group 4 ('$SOURCE_ORACLE_BASE/oradata/$SOURCE_ORACLE_SID/standbyredo04.log') size 200M;
        alter database add standby logfile group 5 ('$SOURCE_ORACLE_BASE/oradata/$SOURCE_ORACLE_SID/standbyredo05.log') size 200M;
        alter database add standby logfile group 6 ('$SOURCE_ORACLE_BASE/oradata/$SOURCE_ORACLE_SID/standbyredo06.log') size 200M;
        alter database add standby logfile group 7 ('$SOURCE_ORACLE_BASE/oradata/$SOURCE_ORACLE_SID/standbyredo07.log') size 200M;
        shutdown immediate;
    end
    

  4. 设置数据库tns连接文件tnsnames.ora,该文件用于定义dataguard数据库通信配置和连接标识符。

    echo "
    $SOURCE_TNS_ID =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = $SOURCE_SERVICE_NAME)
        )
      )
    
    $TARGET_TNS_ID =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = $TARGET_EIP)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = $TARGET_SERVICE_NAME)
        )
      )
    " >> $SOURCE_ORACLE_HOME/network/admin/tnsnames.ora

  5. 设置数据库监听文件listener.ora,用于监听客户端请求。

    source_hostname=$(hostname)
    echo "
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC=
            (GLOBAL_DBNAME=$SOURCE_GLOBAL_DBNAME)
            (ORACLE_HOME=$SOURCE_ORACLE_HOME)
            (SID_NAME=$SOURCE_ORACLE_SID)
        )
       )
    
    LISTENER =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = $source_hostname)(PORT = 1521))
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      )
    " >> $SOURCE_ORACLE_HOME/network/admin/listener.ora

  6. 传输密码文件至目标端(提供scp方式参考),需输入目标端oracle用户密码。密码文件用于目标端rman连接源端和复制主库时的权限验证,完成传输后源端和目标端oracle数据库sys用户的密码相同。

    scp -o StrictHostKeyChecking=no $SOURCE_ORACLE_HOME/dbs/orapw$SOURCE_ORACLE_SID oracle@$TARGET_EIP:$TARGET_ORACLE_HOME/dbs/orapw$TARGET_ORACLE_SID

  7. 创建oracle初始化文件,传输至目标端。

    sqlplus / as sysdba << end
        create pfile='/home/oracle/temp.ora' from spfile;
    end
    scp -o StrictHostKeyChecking=no /home/oracle/temp.ora oracle@$TARGET_EIP:$TARGET_ORACLE_HOME/dbs/init$TARGET_ORACLE_SID.ora

  8. 启动监听并打开数据库至open状态。

    lsnrctl start
    sqlplus / as sysdba << end
        startup;
    end

    图5 启动监听,并打开数据库至open状态

目标端dataguard部署

切换至oracle用户执行以下部署步骤:

  1. 创建本地日志归档目录,需要输入root用户密码。

    1
    2
    su - root -c "mkdir -p /oraarch/$TARGET_ORACLE_SID"
    su - root -c "chown -R oracle.oinstall /oraarch"
    

    图6 创建目标端归档目录

  2. 登录数据库,创建数据库初始化文件spfile,启动归档模式,打开数据强制日志。

    # shutdown为危险操作,会关闭数据库业务
    sqlplus / as sysdba << end
        shutdown immediate;
        create spfile from pfile;
        startup mount;
        alter database archivelog;
        alter database force logging;
        shutdown immediate;
    end

  3. 设置数据库tns连接文件tnsnames.ora,该文件用于定义dataguard数据库通信配置和连接标识符。

    echo "
    $TARGET_TNS_ID =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = $TARGET_SERVICE_NAME)
        )
      )
    
    $SOURCE_TNS_ID =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = $SOURCE_EIP)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = $SOURCE_SERVICE_NAME)
        )
      )
    " >> $TARGET_ORACLE_HOME/network/admin/tnsnames.ora

  4. 设置数据库监听文件listener.ora,用于监听客户端请求。

    echo "
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC=
            (GLOBAL_DBNAME=$TARGET_GLOBAL_DBNAME)
            (ORACLE_HOME=$TARGET_ORACLE_HOME)
            (SID_NAME=$TARGET_ORACLE_SID)
        )
       )
    
    LISTENER =
      (DESCRIPTION =  
        (ADDRESS = (PROTOCOL = TCP)(HOST = $target_hostname)(PORT = 1521))
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      )
    " >> $TARGET_ORACLE_HOME/network/admin/listener.ora

  5. 修改源端传输的数据库初始化文件pfile。

    echo "
    *.db_unique_name='$TARGET_DB_UNIQUE_NAME'
    *.log_file_name_convert='$SOURCE_ORACLE_BASE/oradata/$SOURCE_ORACLE_SID','$TARGET_ORACLE_BASE/oradata/$TARGET_ORACLE_SID'
    *.db_file_name_convert='$SOURCE_ORACLE_BASE/oradata/$SOURCE_ORACLE_SID','$TARGET_ORACLE_BASE/oradata/$TARGET_ORACLE_SID'
    *.standby_file_management='manual'          
    " >> $TARGET_ORACLE_HOME/dbs/init$TARGET_ORACLE_SID.ora
    
    pfile_path="$TARGET_ORACLE_HOME/dbs/init$TARGET_ORACLE_SID.ora"
    sed -i "s!\*.log_archive_dest_1='.*db_unique_name=$SOURCE_DB_UNIQUE_NAME'!*.log_archive_dest_1='location=/oraarch/$TARGET_ORACLE_SID valid_for=(all_logfiles,all_roles) db_unique_name=$TARGET_DB_UNIQUE_NAME'!g" "$pfile_path"
    sed -i "s/\*.log_archive_dest_2='.*db_unique_name=$TARGET_DB_UNIQUE_NAME'/*.log_archive_dest_2='service=$SOURCE_TNS_ID lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=$SOURCE_DB_UNIQUE_NAME'/g" "$pfile_path"
    sed -i "s/\*.fal_client='$SOURCE_TNS_ID'/*.fal_client='$TARGET_TNS_ID'/g" "$pfile_path"
    sed -i "s/\*.fal_server='$TARGET_TNS_ID'/*.fal_server='$SOURCE_TNS_ID'/g" "$pfile_path"

  6. 依照新的pfile更新数据库初始化文件spfile并启动监听。

    lsnrctl start
    sqlplus / as sysdba << end
      create spfile from pfile='$TARGET_ORACLE_HOME/dbs/init$TARGET_ORACLE_SID.ora';
      startup nomount
    end

  7. rman复制主库,迁移和同步源端oracle存量数据。(源端密码文件已传输到目标端,二者的oracle数据库sys用户密码保持一致)

    rman target sys/$SOURCE_ORACLE_PWD@$SOURCE_TNS_ID auxiliary sys/$SOURCE_ORACLE_PWD@$TARGET_TNS_ID << end
      duplicate target database for standby from active database nofilenamecheck dorecover;
    end

    图7 rman开始复制主库

    图8 rman成功复制主库

  8. 查看主库和备库的数据库角色和切换状态,验证dataguard是否部署成功(该步骤执行前可能需要等待1-2分钟,等待dataguard配置和同步完成)

    select database_role, switchover_status from v$database;

    图9 查看主库状态

    图10 查看备库状态

  9. 启动数据库至open状态,开启主备库实时同步,同步源端oracle数据库增量数据。

    sqlplus / as sysdba << end
      alter database open;
      alter database recover managed standby database using current logfile disconnect from session;
    end

    图11 开启主备库实时同步

相关文档