GaussDB应用迁移工具:UGO
数据库迁移整体解决方案
数据库迁移的整体视角
数据库迁移从上层的应用到底层的基础设施可以分为三个维度:
- 应用SQL迁移:涉及应用代码中的业务逻辑SQL。又可以继续划分为:
- 应用源代码中的SQL、脚本中的SQL;
- 配置文件中的SQL,例如Mybatis配置文件;
- 动态JDBC SQL、运行时SQL。
- 数据库对象迁移:涉及用户、角色、包、存储过程、函数、表、索引等数据库对象,以及这些数据库对象之间的依赖关系。
- 数据迁移:涉及数据库底层存储中的数据文件、以及日志文件的迁移。
数据库迁移需要考虑的问题和要求:
- 语法兼容性要求:
- 对象兼容性:表、索引、视图、触发器、函数、存储过程、包、Type等。
- 数据类型:数值类型(NUMBER)、字符类型(CHAR/NCHAR/VARCHAR2)、大字段类型(CLOB/BLOB)。
- 系统函数:sysdate、to_date、to_char、wm_concat、trim、length等常用函数。
- 系统视图:all_tables、all_indexes、all_tab_columns等系统视图。
- 系统高级包:DBMS_JOB、DBMS_OUTPUT、DBMS_METADATA等系统包。
- 操作符:不同数值类型之间的运算、字符串之间的运算、日期类型之间的运算。
- 权限:系统权限、对象权限、角色权限的差异。
- DCL语句:GRANT和REVOKE授权语句。
- DML语句:INSERT、UPDATE、DELETE、MERGE语句。
- PL/SQL代码:控制语句、事务处理、异常处理、嵌套、标签等语法差异。
- 其他:例如字符集、排序规则等。
- 业务要求:
- 迁移方式:全量一次性迁移 OR 全量+增量持续迁移
- 业务割接方式:一次性割接 OR 业务分流+逐步割接
- 迁移性能要求:可接受的停机时间、以及RTO和RPO要求
- 数据转换要求:数据过滤、数据类型映射
GaussDB迁移解决方案
可以通过华为官方提供的应用迁移工具UGO和数据复制服务DRS,将多种主流数据库迁移到GaussDB。
- 应用迁移工具UGO:支持数据库对象的评估、转换和迁移,支持应用SQL的扫描、评估和转换。
- 数据复制服务DRS:支持基于日志的实时变化数据捕捉和同步,支持基于日志的增量数据实施校验。
数据库应用迁移工具UGO
UGO是华为云提供的一种异构数据库结构迁移的专业服务,可将源数据库中的DDL、DML和DCL一键自动转换为华为云GaussDB/RDS的SQL语法。
核心功能
- 源库画像
采集数据库关键元数据,多维度分析抽象出数据库的信息全貌,为进一步精准定位数据库应用场景和用户操作习惯提供数据基础。
采集的数据库元数据包括:
- 源库类型
- 源库版本
- 数据库容量大小
- 数据库对象统计
- 数据库对象分布
- 字符集等其他信息
- 语法兼容性评估
以源库画像作为输入,根据选定的目标库类型,对源库的核心对象类型进行语法兼容性分析,分析结果包括原生兼容、转换兼容、部分兼容、以及不兼容,并对结果进行分类统计,最终给出不兼容的语法点、改造建议、以及改造工作量评估。
- SQL语法转换
实现源库SQL到目标库SQL的自动转换,最大化实现转换前后语义等价,减少人工分析和手动转换的工作量,降本提效。
- 对象迁移
根据客户实际使用场景,提供对象自动迁移、人工校正一体化操作平台,确保迁移高效、准确。
- 对象迁移依赖于对象采集和评估;
- 迁移失败对象支持人工校正,修改后可一键迁移;
- 支持按对象类型、对象名称细粒度控制要迁移的范围;
- 支持生成完整的迁移报告。
- 对象比对
支持数据库对象比对,覆盖全部迁移对象类型,保障迁移后对象准确性。
- 支持对象数量、对象名称、关键特性等细粒度对比;
- 忽略语法转换引入的差异点;
- 输出完整对比报告。
- 应用迁移
提供应用源码SQL扫描、SQL评估、SQL转换、源码改造的端到端流程,帮助用户提升应用代码改造效率。
- SQL扫描支持动态采集(Tomcat/JBoss/SpringBoot)和静态采集(Mybatis XML/Java/JSON);
- 对比模式复制代码改造,回填源文件;
- 输出SQL评估报告和SQL转换报告。
- SQL审核
多渠道获取SQL,内置丰富的审核规则,提前发现问题SQL,防止烂SQL流入生产环境。
- 支持数据库对象SQL、应用SQL、流量抓取SQL的获取;
- 目前支持GaussDB审核规则105条,MySQL规则78条;
- 支持负责对象(存储过程、函数)的审核;
- 对外提供接口,支持流水线对接集成和代码审核插件开发。
UGO原理
- 对象采集
获取对象创建SQL:
- 通过
DBMS_METADATA
包获取SQL; - 通过
show create table
命令获取表定义; - 通过查询系统视图进行拼接:
pg_get_functiondef
、pg_get_triggerdef
等。
支持对象依赖关系分析,将复杂的对象依赖关系转化为对象优先级排序。支持多线程并发连接源库采集对象SQL。
- 语法解析
- 首先将数据库官方文档中的SQL语法结构翻译成UGO可以识别的语法描述文件;
- 解析具体SQL时,根据上一步的语法描述文件进行匹配解析,将输入SQL中的每一个分词都解析到对应的语法树上;
- UGO将语法树封装成对应的SQL语法描述类,之后的业务都基于描述类进行开发。
- 数据库评估
在SQL语法描述类的基础上,结合语法差异知识库,进行语法兼容性评估,并生成评估报告。
- 语法转换
语法转换是将源库对象创建SQL转换为目标库SQL。将源库的SQL解析、封装为结构化的SQL描述类之后,根据对象结构自动装配不同的转换器进行转换。
语法转换器使用替换、注释、重写等方式处理对应的字句或关键字。目前UGO支持超过1000种语法转换器,可以最大程度保证转换前后的语义一致性。
- 对象比较
在迁移完成后,分别抽取源库和目标库的对象相关属性进行比对,以确认使用UGO进行数据库对象迁移后是否存在对象丢失的情况,并生成对比报告。
- 应用迁移
UGO应用迁移专注于应用层迁移时的SQL改造评估,通过应用运行时采集SQL(动态采集)和应用源代码文件采集SQL(静态采集)方式,采集应用中的SQL语句,并结合UGO的SQL评估、SQL转换和源码改造能力,提升应用代码改造效率。
UGO应用迁移流程:SQL采集 ==> SQL评估 ==> SQL转换 ==> 源码改造
- SQL审核
SQL审核流程:
- 获取待审核的SQL语句,进行SQL语法解析,把语句中依赖的对象名称(表、视图)提取出来;
- 连接数据库获取依赖对象的数据字典信息(字段、索引、DEFAULT值等);
- 如果无法连接数据库,SQL审核也会继续进行,只是依赖的数据字典信息的规则不做校验;
- 如果是查询语句,还会获取SQL的预执行计划,并对执行计划做进一步分析;
- 循环调用每个规则的校验逻辑,执行审核规则,并生成SQL审核报告。
SQL审核语句获取方式:
- 直连数据库获取对象SQL
- 打包上传静态源码文件
- 对接Kafka流量抓取
- 直接文本框输入单条SQL
UGO特性
- 转换配置
根据不同的业务需求设置转换配置得到最优的转换结果,且用户可配置转换配置模板进行快速迁移。
- 表空间映射
可在表空间映射中创建源库到目标库的表空间映射关系,当前仅支持目标库为GaussDB/PostgreSQL。
- 分布映射
目标库为分布式GaussDB时,可以指定表如何在节点之间分布或者复制。
- 批量修改
对于迁移失败的语句,可以进行批量修改。
UGO使用
目前华为云上可以免费使用UGO,独立部署版本按独立License计费。
使用UGO进行数据库应用迁移的全流程如下:
-
项目评估
- 准备迁移环境。包括GaussDB/UGO/DRS的安装机器、UGO/DRS软件安装包。确保UGO和DRS能够访问源库和目标库。UGO的安装机器为16C32G的Linux服务器,安装JDK8。
- 克隆生产库。使用UGO迁移会占用数据库的内存和IO资源,因此一般不直连生产库,而是将生产库克隆/同步到其他服务器用于迁移。
- 使用UGO生成评估报告。评估报告重点关注不支持/部分兼容的语法点,提前对不支持的语法寻找替代方案。
- 梳理要迁移的对象清单。UGO会默认采集已选择SCHEMA的所有对象。提前梳理迁移清单,过滤出不需要迁移的对象,可以减少迁移成本。
-
数据库迁移
- SQL转换:使用UGO将源库SQL转换为目标库SQL;
- 第一次对象迁移:将UGO转换后的USER/TYPE/TABLE/SEQUENCE等对象(除Index/Trigger等对象以外)迁移至目标库。部分未识别或转换失败的对象需要手工修改后迁移;
- 数据全量迁移:使用DRS数据复制服务对源库做全量迁移;
- 第二次对象迁移:将剩余对象迁移至目标库,部分未识别或转换失败的对象需要手工修改后迁移。索引、触发器等对象会影响数据迁移的准确性和效率,因此需要在数据全量迁移后进行。
- 对象比对:使用UGO将源库和目标库的对象进行比对,确认数量是否一致、属性是否相同等;
- 数据比对:使用DRS对比迁移前后的数据一致性。
-
应用迁移
- 应用端SQL改造:应用端SQL语法、业务接口SQL改造。可以使用UGO抓取应用SQL后进行评估转换。
- 初步调试跑通:应用、接口不报错,APP正常访问。
-
迁移完成:整理最终迁移报告
-
业务验证
- 功能测试:执行全量用例,实际启动业务服务测试,观察业务功能是否正常。不满足要求的部分需要进行业务改造,并再次验证。
- 性能测试:端到端测试新数据库集群是否满足业务性能要求。不满足要求的部分需要进行SQL调优、或进行微服务改造、数据库横向扩展。
References
【1】https://support.huaweicloud.com/productdesc-ugo/ugo_01_0002.html
【2】https://support.huaweicloud.com/productdesc-drs/drs_01_0002.html