
# 快速部署
本章节主要帮助用户快速部署该解决方案。用户可按照本章节部署步骤进行部署；或者下载[部署脚本](https://gitee.com/HuaweiCloudDeveloper/huaweicloud-solution-migrating-oracle-databases-to-the-cloud-with-dataguard/tree/master-dev/)，根据代码仓中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
![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001755012702.png)
- 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
![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001801818485.png)
- EIP：源端和目标端动态分配
#### 源端dataguard部署
切换至oracle用户执行以下部署步骤：
1. 创建本地日志归档目录，需要输入root用户密码。 
   ```
   su - root -c "mkdir -p /oraarch/$SOURCE_ORACLE_SID"
   su - root -c "chown -R oracle.oinstall /oraarch"
   ```
   **图3** 创建源端归档目录
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001762964600.png)
   
   
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日志组数
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001800774057.png)
   alter database add standby logfile指令添加的日志文件组数比已有redo日志组多一组，可根据上一步查询结果更改：
   ```
   # 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状态
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001800623117.png)
   
   
#### 目标端dataguard部署
切换至oracle用户执行以下部署步骤：
1. 创建本地日志归档目录，需要输入root用户密码。 
   ```
   su - root -c "mkdir -p /oraarch/$TARGET_ORACLE_SID"
   su - root -c "chown -R oracle.oinstall /oraarch"
   ```
   **图6** 创建目标端归档目录
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001810002993.png)
   
   
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开始复制主库
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001800630249.png)
   **图8** rman成功复制主库
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001800630585.png)
   
   
8. 查看主库和备库的数据库角色和切换状态，验证dataguard是否部署成功(该步骤执行前可能需要等待1-2分钟，等待dataguard配置和同步完成) 
   ```
   select database_role, switchover_status from v$database;
   ```
   **图9** 查看主库状态
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001800631177.png)
   **图10** 查看备库状态
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001753830508.png)
   
   
9. 启动数据库至open状态，开启主备库实时同步，同步源端oracle数据库增量数据。 
   ```
   sqlplus / as sysdba << end
     alter database open;
     alter database recover managed standby database using current logfile disconnect from session;
   end
   ```
   **图11** 开启主备库实时同步
   ![](https://support.huaweicloud.com/modbdg-ctf/zh-cn_image_0000001800630761.png)
   
   
 
