本地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语句在目标数据库上进行执行(目标数据库需有源数据库的初始数据,一般通过迁移工具或备份还原来实现)。
操作流程
前期准备
- 在源库安装tcpdump命令,gzip命令,供后续抓包和流量文件压缩时使用。
- 在源库预留足够的磁盘空间用于存放流量文件。
- 准备录制回放的GaussDB数据库。
- 准备录制回放的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 ;
流量抓取
- Oracle库断开所有客户端连接。
由于Oracle库会在连接建立时约定执行SQL时的默认schema,为了避免后续解析出的SQL缺少schema信息,抓取流量之前,需要先Oracle服务器主动切断所有的客户端连接,建议使用Oracle的SHUTDOWN IMMEDIATE命令关停Oracle数据库。
- 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 - Oracle库恢复客户端连接。
流量抓取开始之后,就可以让Oracle服务器恢复数据访问,如果之前是用SHUTDOWN IMMEDIATE关停了Oracle数据库,使用STARTUP命令重新启动Oracle服务器即可。
- 抓取完成,将抓取到的流量文件上传到华为云对象存储服务OBS。
抓取命令会在执行目录下生成capture开头,以gz结尾的文件,将这些文件上传到华为云对象存储服务OBS。
创建录制回放任务
- 在“录制回放管理”页面,单击“创建任务”。
- 在“实例来源”页面,填选源数据库信息、目标数据库信息、网络类型、任务基本信息,单击“开始创建”。此处支持单击“使用上次创建信息”,使用上次创建任务实例缓存的信息。
- 源数据库信息 图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的相关标签策略,则需按照标签策略规则为任务添加标签。标签如果不符合标签策略的规则,则可能会导致任务创建失败,请联系组织管理员了解标签策略详情。
- 任务创建成功后,您可以单击任务名称,在“标签”页签下查看对应标签。关于标签的详细操作,请参见标签管理。
- 源数据库信息
- 录制回放实例创建成功后,在“测试连接”页面,填选源数据库信息、目标数据库信息,单击“目标库信息”处的“测试连接”,测试并确定与目标库连通后,单击“下一步”。
- 源数据库信息: 图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集中式实例,请确认目标数据库已构建基线数据。
数据库名称
填写数据库名称。
数据库用户名
填写数据库用户名。
数据库密码
填写数据库用户名所对应的密码。
- 源数据库信息:
- 在“录制回放配置”页面,填选任务配置,然后单击“下一步”。 图9 任务配置
表9 任务配置 参数
描述
SQL类型配置
选择回放到目标数据库SQL类型,默认选择SELECT,可选SELECT、INSERT、UPDATE、DELETE、DDL。
回放模式
可以选择“性能模式”或“事务模式”。
- 性能模式:可以设置并发连接数,回放过程中将按照设置的连接数在目标库回放。不保证源库的SQL在目标库回放时是同一个线程连接回放,回放性能较好。
- 事务模式:不可以设置并发连接数,将按照源库日志中连接信息动态调整连接数,可以保证源库同一个连接中的事务SQL顺序执行。
并发连接数
设置DRS录制回放任务的回放线程数,默认为8,输入值必须在1到100之间。
加速配置(倍速)
设置录制回放任务在相同时间内回放SQL的总量与源库执行SQL总量的比值,但无法超过录制回放任务的性能上限。可选“不限制” 、“100%”、“200%”。
- 在“预检查”页面,进行回放任务预校验,校验是否可进行。
- 查看检查结果,如有不通过的检查项,需要修复不通过项后,单击“重新校验”按钮重新进行任务预校验。
- 预检查完成后,且所有检查项结果均通过时,单击“下一步”。
- 在“任务确认”页面,设置回放任务的启动时间、任务异常通知设置、SMN主题、任务异常自动结束时间,并确认任务信息无误后,单击“启动任务”,提交回放任务。 图10 任务启动设置
表10 任务启动设置 参数
描述
启动时间
回放任务的启动时间可以根据业务需求,设置为“立即启动”或“稍后启动”。
说明:预计回放任务启动后,会对源数据库和目标数据库的性能产生影响,建议选择业务低峰期,合理设置任务启动时间。
任务异常通知设置
该项为可选参数,开启之后,选择对应的SMN主题。当回放任务状态异常时,系统将发送通知。
SMN主题
“任务异常通知设置”项开启后可见,需提前在SMN上申请主题并添加订阅。
SMN主题申请和订阅可参考《消息通知服务用户指南》。
任务异常自动结束时间(天)
设置任务异常自动结束天数,输入值必须在14到100之间,默认值14。
说明:异常状态下的任务仍然会计费,而长时间异常的任务无法续传和恢复。设置任务异常自动结束天数后,异常且超时的任务将会自动结束,以免产生不必要的费用。
- 在“录制回放管理”页面,找到创建的任务,单击任务名。
- 在“录制回放进度”页面,查看解析回放进度。 图11 录制回放进度
报告分析
- 在“录制回放管理”页面,找到创建的任务,单击任务名。
- 在“回放报告”页面,找到异常SQL统计列表,异常SQL详情列表,用户可以根据需求单击表格右上角的导出/下载按钮将报表导出并下载。 图12 异常SQL统计列表
图13 异常SQL详情列表
- 在“回放报告”页面,找到慢SQL统计列表,慢SQL详情列表,用户可以根据需求单击表格右上角的导出/下载按钮将报表导出并下载。 图14 慢SQL统计列表
图15 慢SQL详情列表