文档首页/ 数据复制服务 DRS/ 最佳实践/ 录制回放/ 本地Oracle SQL流量回放到GaussDB分布式版/GaussDB集中式版
更新时间:2026-08-03 GMT+08:00
分享

本地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 录制回放原理

操作流程

图2 操作流程

前期准备

  • 在源库安装tcpdump命令,gzip命令,供后续抓包和流量文件压缩时使用。
  • 在源库预留足够的磁盘空间用于存放流量文件。
  • 准备录制回放的GaussDB数据库。

    使用迁移工具(如DSG、英方、DRS等)将类生产的镜像库迁移到目标库。建议做一次备份,便于多次回放场景回放前可以回退。

  • 准备录制回放的GaussDB数据库账号。
    表1 GaussDB数据库权限列表

    权限类别

    权限说明

    库级权限

    需要使用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

    抓取命令会在执行目录下生成capture开头,以gz结尾的文件,将这些文件上传到华为云对象存储服务OBS

创建录制回放任务

  1. 在“录制回放管理”页面,单击“创建任务”。
  2. 在“实例来源”页面,填选源数据库信息、目标数据库信息、网络类型、任务基本信息,单击“开始创建”。此处支持单击“使用上次创建信息”,使用上次创建任务实例缓存的信息。

    • 源数据库信息
      图3 源数据库信息
      表3 源数据库信息

      参数

      描述

      实例来源

      选择“他云/本地”

      实例引擎类型

      选择“Oracle”

      流量文件来源

      华为云OBS下载

      Access Key Id(AK)

      访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。

      Secret Access Key(SK)

      与访问密钥ID结合使用的私有访问密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。

      • 基于安全最小权限原则,AK/SK设置权限应该最小化。当临时AK/SK和永久AK/SK都可以使用时,建议用户使用临时AK/SK。永久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 目标数据库信息
      表4 目标数据库信息

      参数

      描述

      实例来源

      选择“华为云”。

      区域

      当前所在的区域。

      项目

      当前区域对应的项目。

      实例引擎类型

      选GaussDB分布式版。

      目标数据库实例

      用户所创建的目标云数据库GaussDB分布式实例,请确认目标数据库已构建基线数据。

      数据库名称

      填写数据库名称。

      数据库用户名

      填写数据库用户名。

      数据库密码

      填写数据库用户名所对应的密码。

    • 网络类型
      图5 网络类型
      表5 网络类型

      参数

      描述

      网络类型

      选择录制回放实例的网络类型,目前支持选择“VPC”或“VPN”。

      录制回放实例所在子网

      请选择录制回放实例所在的子网。也可以单击“查看子网”,跳转至“网络控制台”查看实例所在子网帮助选择。

      默认值为当前所选数据库实例所在子网,请选择有可用IP地址的子网。为确保回放实例创建成功,仅显示已经开启DHCP的子网。

      IP类型

      选择录制回放实例的IP类型,目前支持选择“IPv4”

    • 任务基本信息
      图6 任务基本信息
      表6 任务基本信息

      参数

      描述

      可用区

      DRS任务创建的可用区,选择跟源或目标库相同的可用区性能更优。

      企业项目

      企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。请在下拉框中选择所在的企业项目,其中,default为默认项目。

      更多关于企业项目的信息,请参见《企业管理用户指南》

      如果需要自定义企业项目,请在控制台右上角单击“企业”,进入“企业项目管理”页面创建,具体请参见《企业管理用户指南》中“创建企业项目”的内容。

      任务名称

      任务名称在4到50位之间,必须以字母开头,可以包含字母、数字、中划线或下划线,不能包含其他的特殊字符。

      描述

      描述不能超过256位,且不能包含! = < > & ' " \ 特殊字符。

      I标签

      • 可选配置,对回放任务的标识。使用标签可方便管理您的任务。每个任务最多支持20个标签配额。
      • 如果您的组织已经设定DRS的相关标签策略,则需按照标签策略规则为任务添加标签。标签如果不符合标签策略的规则,则可能会导致任务创建失败,请联系组织管理员了解标签策略详情。
      • 任务创建成功后,您可以单击任务名称,在“标签”页签下查看对应标签。关于标签的详细操作,请参见标签管理

  3. 录制回放实例创建成功后,在“测试连接”页面,填选源数据库信息、目标数据库信息,单击“目标库信息”处的“测试连接”,测试并确定与目标库连通后,单击“下一步”

    • 源数据库信息:
      图7 源数据库信息
      表7 源库信息

      参数

      描述

      流量类型

      目前仅支持选择“PCAP流量包”

      Access Key Id(AK)

      访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。

      Secret Access Key(SK)

      与访问密钥ID结合使用的私有访问密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。

      • 基于安全最小权限原则,AK/SK设置权限应该最小化。当临时AK/SK和永久AK/SK都可以使用时,建议用户使用临时AK/SK。永久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 目标数据库信息
        表8 目标数据库信息

        参数

        描述

        目标数据库实例

        用户所创建的目标云数据库GaussDB集中式实例,请确认目标数据库已构建基线数据。

        数据库名称

        填写数据库名称。

        数据库用户名

        填写数据库用户名。

        数据库密码

        填写数据库用户名所对应的密码。

  4. “录制回放配置”页面,填选任务配置,然后单击“下一步”

    图9 任务配置
    表9 任务配置

    参数

    描述

    SQL类型配置

    选择回放到目标数据库SQL类型,默认选择SELECT,可选SELECT、INSERT、UPDATE、DELETE、DDL。

    回放模式

    可以选择“性能模式”“事务模式”

    • 性能模式:可以设置并发连接数,回放过程中将按照设置的连接数在目标库回放。不保证源库的SQL在目标库回放时是同一个线程连接回放,回放性能较好。
    • 事务模式:不可以设置并发连接数,将按照源库日志中连接信息动态调整连接数,可以保证源库同一个连接中的事务SQL顺序执行。

    并发连接数

    设置DRS录制回放任务的回放线程数,默认为8,输入值必须在1到100之间。

    加速配置(倍速)

    设置录制回放任务在相同时间内回放SQL的总量与源库执行SQL总量的比值,但无法超过录制回放任务的性能上限。可选“不限制” 、“100%”、“200%”。

  5. “预检查”页面,进行回放任务预校验,校验是否可进行。

    • 查看检查结果,如有不通过的检查项,需要修复不通过项后,单击“重新校验”按钮重新进行任务预校验。
    • 预检查完成后,且所有检查项结果均通过时,单击“下一步”

  6. “任务确认”页面,设置回放任务的启动时间、任务异常通知设置、SMN主题、任务异常自动结束时间,并确认任务信息无误后,单击“启动任务”,提交回放任务。

    图10 任务启动设置
    表10 任务启动设置

    参数

    描述

    启动时间

    回放任务的启动时间可以根据业务需求,设置为“立即启动”或“稍后启动”。

    说明:

    预计回放任务启动后,会对源数据库和目标数据库的性能产生影响,建议选择业务低峰期,合理设置任务启动时间。

    任务异常通知设置

    该项为可选参数,开启之后,选择对应的SMN主题。当回放任务状态异常时,系统将发送通知。

    SMN主题

    “任务异常通知设置”项开启后可见,需提前在SMN上申请主题并添加订阅。

    SMN主题申请和订阅可参考《消息通知服务用户指南》

    任务异常自动结束时间(天)

    设置任务异常自动结束天数,输入值必须在14到100之间,默认值14。

    说明:

    异常状态下的任务仍然会计费,而长时间异常的任务无法续传和恢复。设置任务异常自动结束天数后,异常且超时的任务将会自动结束,以免产生不必要的费用。

  7. 在“录制回放管理”页面,找到创建的任务,单击任务名。
  8. 在“录制回放进度”页面,查看解析回放进度。

    图11 录制回放进度

报告分析

  1. 在“录制回放管理”页面,找到创建的任务,单击任务名。
  2. 在“回放报告”页面,找到异常SQL统计列表,异常SQL详情列表,用户可以根据需求单击表格右上角的导出/下载按钮将报表导出并下载。

    图12 异常SQL统计列表
    图13 异常SQL详情列表

  3. 在“回放报告”页面,找到慢SQL统计列表,慢SQL详情列表,用户可以根据需求单击表格右上角的导出/下载按钮将报表导出并下载。

    图14 慢SQL统计列表
    图15 慢SQL详情列表

相关文档