TDSQL-PGOracle平滑迁移实践 李晋钢 腾讯云数据库高级工程师 1概述 目2内核兼容 Contents 录3驱动兼容 4迁移方案 01 1978-2000 诞生于恢复高考之后 2000-2009 第一批国产厂商出炉 2009-2018 开启去“IOE”战略 2018–至今 国内外数据库百家争鸣 商业格局形成,海外数据库主导 国内多为理论研究 国外数据库产业愈发成熟 国产数据库产业初具雏形 国外数据库与云融合 国产数据库逐渐繁荣 全球数据库因云变革 国产数据库百家争鸣 萨师煊黑板报 国防、军工核心领域 互联网兴起,技术社区兴起 Oracle是否份额逐年降低 被AWS、Azure取代 Oracle占比最高 “IOE”模式占领全球市场 MySQL在互联网兴起 云厂商加入国产DB建设 分布式数据库能力领先 国产数据库趋于成熟 助力核心业务换“心” 老牌四大 金仓 达梦 南大 神通 Oracle兼容 语法 数据类型 SQL语法 系统函数/视图 PLSQL 功能 数据分区 DBLINK MERGE ConnectBy 资源管理 性能 优化器 存储 性能诊断 生态 访问接口 兼容性评估 数据迁移同步 内核:Oracle语法兼容、Oracle功能兼容 驱动:JDBC、ODBC、OCI、Pro*C 工具:DBbridge/ TDSQLMigrationToolkits(评估、迁移、验证) 以内核兼容为基础,打造从驱动、工具、内核三个层面的Oracle兼容能力 资源:底层硬件和操作系统适配 驱动层面兼容 JDBC配合内核能力做用法兼容 OCI对oracle接口用法做应用层兼容 Pro*C在嵌入式SQL做代码层兼容 内核层面兼容 对内置数据类型、内置系统函数、PLSQL等语法层面兼容 对分区表、递归查询、DBlink、伪列等功能层面兼容 工具层面兼容 异构数据库静态对象、应用SQL差异性评估 异构迁移自动改造 Oracle数据迁移和数据同步 02 类型定义 类型元数据 索引支持元数据 数据存储 相关函数元数据 数据存储结构 精度定义 类型转换 存储长度 类型转换函数 专有函数 类型转换优先级 在TDSQL-PG内核里,完美兼容绝大多数Oracle类型,相关行为保持一致: 数值类型:NUMBER、FLOAT、BINARY_FLOAT、BINARY_DOUBLE 字符类型:CHAR、NCHAR、VARCHAR2、NVARCHAR2、LONG 大对象类型:BLOB、CLOB、NCLOB 时间类型:DATE、TIMESTAMP、INTERVAL等 其他如:RAW、LONGRAW、BFILE、ROWID、UROWID 操作符函数 HASH函数 向量化函数 内置处理函数 高级语法 数据分区 MERGEINTO CONNECTBY INSERTALL/FIRST PIVOT/UNPIVOT OFFSET...FETCH 分区类型:RANGE、LIST、HASH、组合 分区管理:MERGE/SPLIT分区 分区裁剪、分区索引 partitionwisejoin 系统函数/包 其它 函数类型(90%+):字符、数值、日期、编码、聚合 系统包:DBMS_OUTPUT、DBMS_SQL、DBMS_LOB、DBMS_UTILITY、UTL_RAW等 DBLINK:元数据管理、分布式 HINT:访问路径、关联策略、关联顺序、并行执行 伪列:ROWNUM、ROWID、CONNECTBY相关伪列 •startwithconnectby语法支持 树的遍历 增加ConnectBy算子,实现递归执行 优化器From表生成两个Path 将WHERE条件下推到不同的Path上 支持level、connect_by_isleaf、connect_by_root、sys_connect_by_path等 CONNECTBY outer ROOT ReScan FetchROOT FetchChild inner C- l01 C- l01 C- l01 C- l01 Qual&Cache Project REMOTEMERGEINTO •MERGEINTO语法支持 支持表、视图、子查询作为目标 扩展ModifyTable算子功能,增加CMD_MERGE 增强分布式场景下性能 DML DML MERGEINTO MERGEINTO 执行器增加ExecMerge,当tuple与merge条件match时,更新tuple或删除tuple;当tuple与merge条件不match的时候,插入新的tuple FetchFetch REMOTE REMOTE MergeQual SUBP LEFTJOIN Proj SUBP LEFTJOIN MergeQual Proj DISKDISK DNDN 分区表兼容 分区类型支持RANGE、LIST、HASH分区,以及这些类型的组合分区 支持对分区的单独访问,例如SELECT*FROM表PARTITION(子分区) 支持分区键更新 新增分区后,自动维护DEFAULT分区 支持分区表的合并&拆分 tbl tbl_202202 tbl_202201 CreateTableDataMove tbl_202201_202202 tbl_202203 PLSQL兼容: 存储过程、函数的创建,如:以IS作为PLSQL块定义开始、可以用/作为定义结束 存储过程、函数支持COMMIT、ROLLBACK事务控制、自治事务 兼容游标属性支持:isopen、found、notfound、rowcount 函数、存储过程支持OUT出参 支持集合类型、包 其他PL语句支持,如:BULKCOLLECT、语句LABEL 支持预定义的系统包:dbms_output、dbms_assert、dbms_lob、存储过程调试包dbms_debug等 •WITHFUNCTION语法支持 函数编译后不存入系统表,存入Query结构体中,随着query的清理而被清理 WITHFUNCTION中定义的函数,在后面的调用优先级高于其他同名函数,优先查找本Query,没有找到再查系统定义 PL_compileIn-memoryfunctionObject add_fncp_idnumber…code… …… …… Table:(tbl) TargetList:(add_func)WithFunctions: nodeToString()/stringToNode() Systemcatalog Datanode CREATE[ORREPLACE]PACKAGEpkg_name 支持公有自定义类型 支持公有游标 支持公有变量&常量 支持公有存储函数&存储过程 CREATE[ORREPLACE]PACKAGEBODYpkg_name 支持私有自定义类型 支持私有游标 支持私有变量&常量 +Function/Procedure #1 AS -Function/Procedure#2 …BEGIN … +Function/Procedure #3 END 包初始化块 BEGIN …END •自治事务 自治事务由主事务启动;自治事务运行时,主事务挂起 自治事务与启动它的主事务相互独立 自治事务可以用在存储过程、函数、匿名块以及触发器中 如果自治事务与主事务产生锁冲突,系统启动死锁检测,自治事务报告异常 主事务–suspend LockShared(tbl) 冲突 自治事务-running Deadlockexception LockExcl(tbl) 03 •JDBC规范适配 实现了JDBC4.0、JDBC4.1、JDBC4.2规范 适用于PostgreSQL8.2及以上版本 适用于TDSQL数据库所有版本 基于JAVA6和JAVA8平台编译构建,适配JAVA6、JAVA7、JAVA8及以上平台使用 •JDBC实现兼容 适配Oracle数据库的Date、CLOB、BLOB、VARCHAR2、NVARCHAR2、ROWID类型 适配Oracle数据库方式创建函数、存储过程等操作 •TDSQLOCI功能兼容 支持了初始化环境、用户连接/断开、多会话、OCI句柄和属性、错误消息处理、SQL执行、事务、 DirPath、DateTime、LOB、Number等12大类接口。大约100个函数 •TDSQLPro*C功能兼容 支持了变量声明、建立连接、基础SQL语句、预编译语句、游标、简单动态SQL、ANSI动态SQL、错误处理语句等8类场景,约24个语法用法的兼容。 04 成本高工作量大 迁移技术复杂 兼容程度不明确 迁移过程无标准化流程 平台化 数据库迁移平台 专业化 研发和运维实践 自动化 覆盖评估迁移改造 标准化 异构迁移流程 提供简单易用的数据库迁移平台腾讯联合生态多年数据库运维和 研发经验工程师的技术积累 平台化的数据库对象和应用评估功能,全面完整的迁移评估报告 从评估、改造、迁移、校验等标准化和经检验的迁移流程 平台展示 管理平台 对象兼容评估报告 应用兼容评估报告 对象迁移规则 对象迁移报告 迁移状态 数据对比校验报告 任务管理 任务管理模块 迁移评估模块 对象迁移模块 数据迁移模块 迁移校验模块 数据 源库抽取 插件 迁移通道 数据抽取模块实时数据导出 迁移状态监控模块 语法转换模块 数据装载模块 加载 数据数据装载模块实时数据写入 插件 目标库 迁移评估模块 对象兼容评估报告 Oracle数据库 数据采集数据加工评估结果 应用兼容评估报告 •对象兼容评估报告 数据库静态对象,例如:表、索引、视图、函数、存储过程、物化视图、触发器、包、数据类型等信息 •应用兼容评估报告 应用端发送给源端执行的SQL评估 评估效果和运行时间、抓取得SQL有关 搭建开发环境 迁移测试表结构和数据 数据库迁移、增量同步业务系统部署 开发、迁移培训应用功能测试及适配 生产环境准备 基于数据的功能验证 调研原系统信息生产系统规划 申请物理资源搭建生产环境 基于数据的性能测试系统双轨运行测试 1《数据库迁移项目计划表》 顶层设计与规范输出 2《开发环境部署记录》 3《测试数据库迁移、改造记录》 4《应用适配计划及结果》 5《原系统信息收集记录》 6《生产部署规划及架构》 7《生产环境部署记录及压测报告》 1《测试数据库迁移方案》 2《数据库迁移评估报告》 3《业务系统部署规划及记录》 4《系统测试报告》 5《系统试运行方案及计划》 测试数据清理 数据库迁移、增量同步 数据校验业务系统部署 系统双轨运行 系统重保 1《生产数据库迁移方案及记录》 2《业务系统部署规划及记录》 3《系统双轨运行方案及记录》 4《系统投产方案及计划》 应用开发适配 系统测试 双轨制上线 正式运行 新生产正式投产数据同步到老系统系统重保 图例业务方相关工作腾讯负责的工作 1《系统投产方案及计划》 2《数据库增量同步方案及记录》 3《系统正式割接及上线报告》 4《项目总结》 架构1–oracle2tdsql 架构2–tdsql2oracle 双轨制运行的收益 增加回退选择 增加业务可靠性 增加数据保护 业务 业务网关 业务 业务网关 双轨制运行成本 原有业务应用改造后业务应用 流量镜像复杂性 数据映射复杂性 DBBridge映射 增加迁移复杂性 OracleTDSQL OracleTDSQL DBBridge映射