
# 本地Oracle SQL流量回放到GaussDB分布式版/GaussDB集中式版
数据复制服务（Data Replication Service，简称DRS）支持将Oracle数据库的SQL流量回放GaussDB分布式版/GaussDB集中式版。通过DRS提供的录制回放任务，实现批量录制Oracle服务器上SQL流量，并在GaussDB上执行，旨在帮助应用在数据割接前及时发现问题（包括语法兼容性、语义正确性、性能差异等），协助应用顺利完成从Oracle到GaussDB的国产化数据库的替换。
#### 录制回放原理
流量录制回放主要分为流量录制和流量回放两个阶段：
1. 流量录制过程是从源数据库上将所需时间段内的全部业务SQL语句（包括增、删、改、查、DDL等），基本原理是通过网络抓包工具tcpdump在Oracle数据库服务器进行端口网络包（业务程序发送给Oracle的SQL请求数据包）的抓取并生成流量数据文件（pcap文件格式），然后基于Oracle协议解析（JDBC、OCI）成对应的业务SQL语句。
2. 流量回放是将录制到的全部业务相关SQL语句在目标数据库上进行执行（目标数据库需有源数据库的初始数据，一般通过迁移工具或备份还原来实现）。
图1录制回放原理   
![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002627022850.png)
#### 操作流程
图2操作流程   
![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002627192722.png)
#### 前期准备
- 在源库安装tcpdump命令，gzip命令，供后续抓包和流量文件压缩时使用。
- 在源库预留足够的磁盘空间用于存放流量文件。
- 准备录制回放的GaussDB数据库。 使用迁移工具（如DSG、英方、DRS等）将类生产的镜像库迁移到目标库。建议做一次备份，便于多次回放场景回放前可以回退。
  
- 准备录制回放的GaussDB数据库账号。
  表1GaussDB数据库权限列表 
  | 权限类别      | 权限说明                                                                                                                                                     |
  |:---|:---|
  | 库级权限      | 需要使用root或其他具有Sysadmin角色的数据库用户登录Postgres基库，赋予用户DATABASE的CONNECT权限。授权语句：GRANT CONNECT ON DATABASE TO ;                                                     |
  | SCHEMA级权限 | 需要使用 root、或其他具有Sysadmin角色的数据库用户登录数据库后，赋予用户SCHEMA的USAGE权限。授权语句：GRANT USAGE ON SCHEMA TO ;                                                                 |
  | 表级权限：     | 需要使用 root、或其他具有Sysadmin角色的数据库用户登录数据库后，赋予用户对象选择内表的SELECT，UPDATE，INSERT、DELETE、INDEX和ALTER权限，函数、存过和包的EXECUTE权限（根据回放SQL类型确定对应的DML和DDL权限）。授权语句：GRANT ON TO ; |
     
  
 
#### 流量抓取
1. Oracle库断开所有客户端连接。 由于Oracle库会在连接建立时约定执行SQL时的默认schema，为了避免后续解析出的SQL缺少schema信息，抓取流量之前，需要先Oracle服务器主动切断所有的客户端连接，建议使用Oracle的SHUTDOWN IMMEDIATE命令关停Oracle数据库。
   
2. tcpdump抓取Oracle库网卡流量。 在磁盘空间充足的磁盘目录下，执行以下命令，抓取流量文件，其中脚本前三行参数可以根据需要自行修改，参数含义说明如下：
   表2 
   | 参数名             | 修改说明                                   |
   |:---|:---|
   | orcl_port       | 用于执行Oracle的监听端口，非目标端口的流量会被自动过滤。        |
   | max_file_size   | 单个流量文件的大小（压缩前），超出之后脚本会自动切到下一个文件写入流量文件。 |
   | max_rotate_time | 单个流量文件的最大轮转时间，超出之后脚本会自动切到下一个文件写入流量文件。  |
      
   ```
   orcl_port='1521'
   max_file_size='512'    # MB
   max_rotate_time='3600'    # second
   cur_dir=`pwd`
   cat <<EOF > "${cur_dir}"/rotate_and_compress.sh
   #!/bin/bash
   FILE="\$1"
   DIR=\$(dirname "\$FILE")
   BASENAME=\$(basename "\$FILE")
   MAX_FILES=10000
   COUNT_FILE="\$DIR/.capture_count"
   # 1. 提取文件名中的 Unix 时间戳
   if [[ "\$BASENAME" =~ capture_([0-9]+)\.pcap([0-9]*) ]]; then
       TIMESTAMP="\${BASH_REMATCH[1]}"
       
       # 2. 使用 flock 仅保护序列号递增（花括号分组，不创建子 shell，变量可见）
       PADDED_SEQ=""
       {
           flock -x 200
           if [ -f "\$COUNT_FILE" ]; then
               CURRENT_SEQ=\$((10#\$(cat "\$COUNT_FILE")))
           else
               CURRENT_SEQ=0
           fi
           NEXT_SEQ=\$((CURRENT_SEQ + 1))
           PADDED_SEQ=\$(printf "%05d" "\$NEXT_SEQ")
           echo "\$NEXT_SEQ" > "\$COUNT_FILE"
       } 200>"\${COUNT_FILE}.lock"
       
       # 3. 以下操作在锁外执行
       READABLE_DATE=\$(date -d "@\$TIMESTAMP" +%Y%m%d_%H%M%S)
       NEW_NAME="\$DIR/capture_\${PADDED_SEQ}_\${READABLE_DATE}.pcap.gz"
       
       # 4. 压缩并删除原文件（降低 IO/CPU 优先级，减少对抓包的干扰）
       ionice -c 3 nice -n 19 gzip -1 -c "\$FILE" > "\${NEW_NAME}.tmp"
       if [ \$? -eq 0 ] && [ -f "\${NEW_NAME}.tmp" ]; then
           mv "\${NEW_NAME}.tmp" "\$NEW_NAME" && rm -f "\$FILE"
       else
           rm -f "\${NEW_NAME}.tmp"
       fi
       
       # 5. 检查文件数量，超过 10000 个时自动删除最老的文件
       FILE_COUNT=\$(find "\$DIR" -maxdepth 1 -name "capture_*.pcap.gz" | wc -l)
       if [ "\$FILE_COUNT" -gt "\$MAX_FILES" ]; then
           OLDEST_FILE=\$(ls -1 "\$DIR"/capture_*.pcap.gz 2>/dev/null | sort | head -n 1)
           if [ -n "\$OLDEST_FILE" ]; then
               rm -f "\$OLDEST_FILE"
           fi
       fi
   else
       # 兜底：如果没匹配到预期格式，直接正常压缩
       ionice -c 3 nice -n 19 gzip -1 "\$FILE"
   fi
   EOF
   # 赋予执行权限
   chmod +x "${cur_dir}"/rotate_and_compress.sh
   # 初始化计数器：读取已有最大编号，避免重启后序号归零误删新文件
   EXISTING_MAX=$(ls -1 "${cur_dir}"/capture_*.pcap.gz 2>/dev/null | \
       sed 's/.*capture_\([0-9]*\)_.*/\1/' | sort -n | tail -1)
   echo "$((10#${EXISTING_MAX:-0}))" > "${cur_dir}"/.capture_count
   sudo tcpdump -i any -nn -s 0 tcp port ${orcl_port} -C ${max_file_size} -G ${max_rotate_time} -Z root -z "${cur_dir}"/rotate_and_compress.sh -w "${cur_dir}"/capture_%s.pcap
   ```
   
3. Oracle库恢复客户端连接。 流量抓取开始之后，就可以让Oracle服务器恢复数据访问，如果之前是用SHUTDOWN IMMEDIATE关停了Oracle数据库，使用STARTUP命令重新启动Oracle服务器即可。
   
4. 抓取完成，将抓取到的流量文件上传到[华为云对象存储服务OBS](https://support.huaweicloud.com/qs-obs/obs_qs_0002.html)。
   抓取命令会在执行目录下生成capture开头，以gz结尾的文件，将这些文件上传到[华为云对象存储服务OBS](https://support.huaweicloud.com/qs-obs/obs_qs_0002.html)。
   
 
#### 创建录制回放任务
1. 在"录制回放管理"页面，单击"创建任务"。
2. 在"实例来源"页面，填选源数据库信息、目标数据库信息、网络类型、任务基本信息，单击"开始创建"。此处支持单击"使用上次创建信息"，使用上次创建任务实例缓存的信息。 
   - 源数据库信息
     图3源数据库信息   
     ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002627234860.png)
     表3源数据库信息 
     | **参数**                | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
     |:---|:---|
     | 实例来源                  | 选择"他云/本地"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
     | 实例引擎类型                | 选择"Oracle"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
     | 流量文件来源                | 华为云OBS下载                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     | Access Key Id（AK）     | 访问密钥ID。与私有访问密钥关联的唯一标识符；访问密钥ID和私有访问密钥一起使用，对请求进行加密签名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
     | Secret Access Key（SK） | 与访问密钥ID结合使用的私有访问密钥，对请求进行加密签名，可标识发送方，并防止请求被修改。 - 基于安全最小权限原则，AK/SK设置权限应该最小化。当临时AK/SK和永久AK/SK都可以使用时，建议用户使用[临时AK/SK](https://support.huaweicloud.com/iam_faq/iam_01_0620.html)。永久AK/SK仅用于临时AK/SK无法满足的场景，例如日志过多下载时间过长时，使用临时AK/SK可能出现超时失效问题。  - 用户的AK/SK信息会被系统加密暂存，直至该任务删除后自动清除。   |
     | Security Token        | 使用临时AK/SK时，必须使用SecurityToken，且建议有效期设置为24小时，否则回放过程中可能无法获取到OBS桶信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | 桶名                    | 流量文件存储的OBS桶名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     | 流量文件前缀                | OBS桶中文件名的前缀，可以筛选查询到含有该前缀的文件信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
     | IP地址或域名               | 填写Oracle数据库的IP地址或域名，填写业务访问oracle服务器所使用的IP和端口，否则可能导致SQL流量被过滤。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
     | 数据库服务名                | 数据库服务名（Service Name/SID），填写业务访问oracle服务器所使用的服务名，否则可能导致SQL流量被过滤。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
     | 选择流量文件                | 选择所需的流量文件                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
        
     
   
   - 目标数据库信息
     图4目标数据库信息   
     ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002657434237.png)
     表4目标数据库信息 
     | **参数**  | **描述**                                    |
     |:---|:---|
     | 实例来源    | 选择"华为云"。                                  |
     | 区域      | 当前所在的区域。                                  |
     | 项目      | 当前区域对应的项目。                                |
     | 实例引擎类型  | 选GaussDB分布式版。                             |
     | 目标数据库实例 | 用户所创建的目标云数据库GaussDB分布式实例，请确认目标数据库已构建基线数据。 |
     | 数据库名称   | 填写数据库名称。                                  |
     | 数据库用户名  | 填写数据库用户名。                                 |
     | 数据库密码   | 填写数据库用户名所对应的密码。                           |
        
     
   
   - 网络类型
     图5网络类型   
     ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002634886796.png)
     表5网络类型 
     | **参数**     | **描述**                                                                                                                                                      |
     |:---|:---|
     | 网络类型       | 选择录制回放实例的网络类型，目前支持选择"VPC"或"VPN"。                                                                                                                            |
     | 录制回放实例所在子网 | 请选择录制回放实例所在的子网。也可以单击"查看子网"，跳转至"网络控制台"查看实例所在子网帮助选择。 默认值为当前所选数据库实例所在子网，请选择有可用IP地址的子网。为确保回放实例创建成功，仅显示已经开启DHCP的子网。 |
     | IP类型       | 选择录制回放实例的IP类型，目前支持选择"IPv4"。                                                                                                                                 |
        
     
   
   - 任务基本信息
     图6任务基本信息   
     ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002627074946.png)
     表6任务基本信息 
     | **参数** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     |:---|:---|
     | 可用区    | DRS任务创建的可用区，选择跟源或目标库相同的可用区性能更优。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
     | 企业项目   | 企业项目是一种云资源管理方式，企业项目管理服务提供统一的云资源按项目管理，以及项目内的资源管理、成员管理。请在下拉框中选择所在的企业项目，其中，default为默认项目。 更多关于企业项目的信息，请参见[《企业管理用户指南》](https://support.huaweicloud.com/usermanual-em/zh-cn_topic_0108763975.html)。 如果需要自定义企业项目，请在控制台右上角单击"企业"，进入"企业项目管理"页面创建，具体请参见《企业管理用户指南》中"[创建企业项目](https://support.huaweicloud.com/usermanual-em/zh-cn_topic_0108763964.html)"的内容。                                                                                                                                                                      |
     | 任务名称   | 任务名称在4到50位之间，必须以字母开头，可以包含字母、数字、中划线或下划线，不能包含其他的特殊字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
     | 描述     | 描述不能超过256位，且不能包含! = \< \> \& ' " \\ 特殊字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | I标签    | - 可选配置，对回放任务的标识。使用标签可方便管理您的任务。每个任务最多支持20个标签配额。  - 如果您的组织已经设定DRS的相关标签策略，则需按照标签策略规则为任务添加标签。标签如果不符合标签策略的规则，则可能会导致任务创建失败，请联系组织管理员了解标签策略详情。  - 任务创建成功后，您可以单击任务名称，在"标签"页签下查看对应标签。关于标签的详细操作，请参见[标签管理](https://support.huaweicloud.com/trafficrep-drs/drs_replay_tag.html)。   |
        
     
   
   
   
   
3. 录制回放实例创建成功后，在"测试连接"页面，填选源数据库信息、目标数据库信息，单击"目标库信息"处的"测试连接"，测试并确定与目标库连通后，单击"下一步"。 
   - 源数据库信息：
     图7源数据库信息   
     ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002627234862.png)
     表7源库信息 
     | **参数**                | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
     |:---|:---|
     | 流量类型                  | 目前仅支持选择"PCAP流量包"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | Access Key Id（AK）     | 访问密钥ID。与私有访问密钥关联的唯一标识符；访问密钥ID和私有访问密钥一起使用，对请求进行加密签名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
     | Secret Access Key（SK） | 与访问密钥ID结合使用的私有访问密钥，对请求进行加密签名，可标识发送方，并防止请求被修改。 - 基于安全最小权限原则，AK/SK设置权限应该最小化。当临时AK/SK和永久AK/SK都可以使用时，建议用户使用[临时AK/SK](https://support.huaweicloud.com/iam_faq/iam_01_0620.html)。永久AK/SK仅用于临时AK/SK无法满足的场景，例如日志过多下载时间过长时，使用临时AK/SK可能出现超时失效问题。  - 用户的AK/SK信息会被系统加密暂存，直至该任务删除后自动清除。   |
     | Security Token        | 使用临时AK/SK时，必须使用SecurityToken，且建议有效期设置为24小时，否则回放过程中可能无法获取到OBS桶信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | 桶名                    | 流量文件存储的OBS桶名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     | 终端节点                  | OBS为每个区域提供一个终端节点，终端节点可以理解为OBS在不同区域的区域域名，用于处理各自区域的访问请求。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
     | 流量文件前缀                | OBS桶中文件名的前缀，可以筛选查询到含有该前缀的文件信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
     | IP地址或域名               | 填写Oracle数据库的IP地址或域名，填写业务访问oracle服务器所使用的IP和端口，否则可能导致SQL流量被过滤。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
     | 数据库服务名                | 数据库服务名（Service Name/SID），填写业务访问oracle服务器所使用的服务名，否则可能导致SQL流量被过滤。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
     | 选择流量文件                | 选择所需的流量文件。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
        
     - 目标数据库信息：
       图8目标数据库信息   
       ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002657434239.png)
       表8目标数据库信息 
       | **参数**  | **描述**                                    |
       |:---|:---|
       | 目标数据库实例 | 用户所创建的目标云数据库GaussDB集中式实例，请确认目标数据库已构建基线数据。 |
       | 数据库名称   | 填写数据库名称。                                  |
       | 数据库用户名  | 填写数据库用户名。                                 |
       | 数据库密码   | 填写数据库用户名所对应的密码。                           |
          
       
      
   
   
   
   
4. 在"录制回放配置"页面，填选任务配置，然后单击"下一步"。 
   图9任务配置   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002657594201.png)
   表9任务配置 
   | **参数**   | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|
   | SQL类型配置  | 选择回放到目标数据库SQL类型，默认选择SELECT，可选SELECT、INSERT、UPDATE、DELETE、DDL。                                                                                                                                                                                                                                                                                                                                                                                      |
   | 回放模式     | 可以选择"性能模式"或"事务模式"。 - 性能模式：可以设置并发连接数，回放过程中将按照设置的连接数在目标库回放。不保证源库的SQL在目标库回放时是同一个线程连接回放，回放性能较好。  - 事务模式：不可以设置并发连接数，将按照源库日志中连接信息动态调整连接数，可以保证源库同一个连接中的事务SQL顺序执行。   |
   | 并发连接数    | 设置DRS录制回放任务的回放线程数，默认为8，输入值必须在1到100之间。                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 加速配置（倍速） | 设置录制回放任务在相同时间内回放SQL的总量与源库执行SQL总量的比值，但无法超过录制回放任务的性能上限。可选"不限制" 、"100%"、"200%"。                                                                                                                                                                                                                                                                                                                                                                       |
      
   
   
5. 在"预检查"页面，进行回放任务预校验，校验是否可进行。 
   - 查看检查结果，如有不通过的检查项，需要修复不通过项后，单击"重新校验"按钮重新进行任务预校验。
   
   - 预检查完成后，且所有检查项结果均通过时，单击"下一步"。
   
   
   
   
6. 在"任务确认"页面，设置回放任务的启动时间、任务异常通知设置、SMN主题、任务异常自动结束时间，并确认任务信息无误后，单击"启动任务"，提交回放任务。 
   图10任务启动设置   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002627074948.png)
   表10任务启动设置 
   | **参数**        | **描述**                                                                                                                                                                                                        |
   |:---|:---|
   | 启动时间          | 回放任务的启动时间可以根据业务需求，设置为"立即启动"或"稍后启动"。 说明： 预计回放任务启动后，会对源数据库和目标数据库的性能产生影响，建议选择业务低峰期，合理设置任务启动时间。                       |
   | 任务异常通知设置      | 该项为可选参数，开启之后，选择对应的SMN主题。当回放任务状态异常时，系统将发送通知。                                                                                                                                                                   |
   | SMN主题         | "任务异常通知设置"项开启后可见，需提前在SMN上申请主题并添加订阅。 SMN主题申请和订阅可参考[《消息通知服务用户指南》](https://support.huaweicloud.com/usermanual-smn/zh-cn_topic_0043394914.html)。                  |
   | 任务异常自动结束时间（天） | 设置任务异常自动结束天数，输入值必须在14到100之间，默认值14。 说明： 异常状态下的任务仍然会计费，而长时间异常的任务无法续传和恢复。设置任务异常自动结束天数后，异常且超时的任务将会自动结束，以免产生不必要的费用。 |
      
   
   
7. 在"录制回放管理"页面，找到创建的任务，单击任务名。
8. 在"录制回放进度"页面，查看解析回放进度。 
   图11录制回放进度   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002627064920.png)
   
   
#### 报告分析
1. 在"录制回放管理"页面，找到创建的任务，单击任务名。
2. 在"回放报告"页面，找到异常SQL统计列表，异常SQL详情列表，用户可以根据需求单击表格右上角的导出/下载按钮将报表导出并下载。 
   图12异常SQL统计列表   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002657588195.png)
   图13异常SQL详情列表   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002634737002.png)
   
   
3. 在"回放报告"页面，找到慢SQL统计列表，慢SQL详情列表，用户可以根据需求单击表格右上角的导出/下载按钮将报表导出并下载。 
   图14慢SQL统计列表   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002657433021.png)
   图15慢SQL详情列表   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002659962387.png)
   
   
 
