本文档用于描述 DBMS 分布式迁移服务平台 ORACLE 迁移功能
收集现有 ORACLE 数据库中的表、索引、分区表、字段长度等信息,输出类似AWR报告文件的文件,用于评估迁移成本
数据扫描任务配置示例
ORACLE MIGRATE MYSQL 兼容性数据库,数据扫描 NUMBER 数据类型,识别 NUMBER 数据类型适配建议,提供以下功能实现:
- SCHEMA 名称区分大小写
- TABLE 名称区分大小写
- 自定义表级别采样率
- 自定义配置 SQL Hint
- 断点续传
- 上游数据库一致性/非一致性读
NOTE:
约束类别 | 注意事项 | 备注 |
---|---|---|
断点续传 | 开启断点续传,配置文件参数 chunk-size 不能动态变更,但可通过配置 enable-checkpoint = false 自动清理断点以及已迁移的表数据,重新导出导入 | |
程序错误 | 程序非 panic 错误,进程不会终止,直至任务运行完成,具体错误表以及对应的错误详情参见元数据表[data_scan_task]数据 || |
结构迁移任务配置示例
ORACLE MIGRATE MYSQL 兼容性数据库内置列数据类型映射规则,提供以下功能实现:
- SCHEMA 名称区分大小写
- TABLE 名称区分大小写
- COLUMN 名称区分大小写
- 表结构定义迁移
- 表索引定义迁移
- 表约束定义迁移
- 自定义配置路由规则映射
- schema 名称路由
- 数据库表名路由
- 数据库表列名称路由
- 自定义配置迁移规则映射,迁移规则优先级:列->表->SCHEMA->任务->内置
- 列数据类型自定义
- 列默认值自定义
- 表属性自定义(仅限 TiDB 数据库)
- 列默认值内置 SYSDATE -> NOW() 和 SYS_GUID -> UUID 规则,并提供 [buildin_datatype_rule] 和 [buildin_defaultval_rule] 元数据表,能够编写更多规则
- 断点续传
- 数据库序列 SEQUENCE 迁移(需要下游数据库支持序列)
- 经转换的表结构可直接下游数据库进行创建(需要下游数据库支持序列)
NOTE:
约束类别 | 注意事项 | 备注 |
---|---|---|
数据表类型 | 1. 分区表、临时表、聚簇表、外部表以及自定义类型 UDT 表统一转换成普通表,且自定义 UDT 表结构迁移受限自定义类型,下游数据库若不支持直接创建则以报错形式记录 2. 物化视图、普通视图统一忽略转换,以不兼容形式记录 |
如有必要,请获取完整的不兼容对象信息清单,然后进行手动转换 |
数据表约束 | MYSQL 兼容性数据库唯一约束基于唯一索引字段,下游只会创建唯一索引 | |
NUMBER 数据类型 | 1. 如果下游数据库是 TiDB,如无自定义规则统一以 Decimal 数据类型转换(规避 Decimal Join Bigint 数据类型字段性能低) 2. 如果下游数据库是 MYSQL,如无自定义规则按 TINYINT/SMALLINT/INT/BIGINT/DECIMAL 数据类型转换 |
|
表索引类型 | FUNCTION-BASED NORMAL、BITMAP 索引类型以不兼容形式记录 | |
字符集和排序规则 | 1.如果下游数据库是 TiDB,则忽略 ORACLE 数据库字符集,统一以 UTF8MB4 和 UTF8MB4_BIN 转换 2. 如果下游数据库是 MYSQL,则会根据 ORACLE 数据库字符集和排序规则映射规则进行转换(例如:ZHS16GBK -> GBK) |
|
数据表默认值 | 数据库表列函数默认值不转换,保留上游默认值,下游建表时是否报错取决于下游数据库是否支持当前函数默认值 | |
错误处理 | 如果程序遇到报错,进程不会终止,具体错误表以及对应的错误详情参见元数据表 [struct_migrate_task] 数据 |
结构对比任务配置示例
ORACLE MIGRATE MYSQL 兼容性数据库,以上游数据库 ORACLE 表结构为基准,提供以下功能实现:
- SCHEMA 名称区分大小写
- TABLE 名称区分大小写
- COLUMN 名称区分大小写
- 自定义配置路由规则映射
- SCHEMA 名称路由
- TABLE 名称路由
- COLUMN 名称路由
- 自定义配置迁移规则映射,迁移规则优先级:列->表->SCHEMA->任务->内置
- 列数据类型自定义
- 列默认自定义
- 表索引对比,依据索引类型既对比索引是否一致,也对比索引字段是否一致
- 表约束对比,依据约束类型既对比约束名是否一致,也对比约束字段是否一致
NOTE:
约束类别 | 注意事项 | | |
---|---|---|
基准参照 | 数据库表数据类型自定义部分参照自定义基准进行对比,非自定义部分参照内置转换规则基准进行对比 | |
字符数据类型 | ORACLE 字符数据类型 CHAR/BYTES,默认 BYTES,而 MYSQL/TiDB 是字符长度,当前只对比数值大小,忽略字节/字符区别 | |
字符集和排序规则 | 1. 如果下游数据库是 TiDB,则忽略 ORACLE 数据库字符集,统一以 UTF8MB4 和 UTF8MB4_BIN 转换对比 2. 如果下游数据库是 MYSQL,则会根据 ORACLE 数据库字符集和排序规则映射规则进行转换对比(例如:ZHS16GBK -> GBK) |
|
外键和检查约束 | 1. 如果下游数据库是 TiDB,则排除外键、检查约束对比 2. 如果下游数据库是 MYSQL,对于低版本只检查外键约束,高版本外键、检查约束都对比 |
|
时间数据类型 | ORACLE TIMESTAMP 精度 MAX 9,而 MYSQL 兼容性数据库 TIMESTAMP 类型精度 MAX 6,,会检查出来但是修复语句保持原样 | |
错误处理 | 如果程序遇到报错,进程不会终止,具体错误表以及对应的错误详情参见元数据表 [struct_compare_task] 数据 |
STMT 数据迁移任务配置示例
CSV 数据迁移任务配置示例
ORACLE MIGRATE MYSQL 兼容性数据库,提供以下功能实现:
- SCHEMA 名称区分大小写
- TABLE 名称区分大小写
- COLUMN 名称区分大小写
- 自定义配置路由规则映射
- SCHEMA 名称路由
- TABLE 名称路由
- COLUMN 名称路由
- 自定义数据库表迁移范围
- 自定义配置 SQL Hint
- 断点续传
- 上游数据库一致性/非一致性读
- 表数据字符集参照上下游数据源参数配置 charset 进行自动转换传输,支持乱码 garbled-char-replace 字符替换功能
- 支持统计信息以及 CHUNK 形式划分数据迁移范围,并自动识别 ORACLE 数据库版本并采用最优的方式迁移
- 数据存放空间检查是否满足数据表大小,不满足自动跳过,直至找到满足条件的数据表导出或者任务结束 (ONLY CSV MIGRATE TASK)
- 下游 TiDB 数据库 CSV 数据迁移支持自动导入(Require: TiDB Version >= v7.5)
SQL 数据迁移任务配置示例
ORACLE MIGRATE MYSQL 兼容性数据库,提供以下功能实现:
- SCHEMA 名称区分大小写
- TABLE 名称区分大小写
- COLUMN 名称区分大小写
- 自定义配置下游写入对象(SCHEMA、TABLE)
- 自定义配置路由规则映射
- 列名称路由
- 上游数据库一致性/非一致性读
- 表数据字符集参照上下游数据源参数配置 charset 进行自动转换传输,支持乱码 garbled-char-replace 字符替换功能
NOTE:
约束类别 | 注意事项 | 备注 |
---|---|---|
数据表结构 | 数据表存在主键或者唯一键,否则因异常错误退出或者手工中断退出,断点续传【replace into】无法替换,数据可能会导致重复,除非手工清理下游重新导入 | |
断点续传 | 断点续传期间,参数配置文件 chunk-size 不能动态变更,但可通过配置 enable-checkpoint = false 自动清理断点以及已迁移的表数据,重新导出导入 | |
错误处理 | 如果程序遇到报错,进程不会终止,CSV / STMT 模式数据迁移具体错误表以及对应的错误详情参见元数据表 [data_migrate_task] 数据,SQL 模式数据迁移具体错误表以及对应的错误详情参见元数据表 [sql_migrate_task] 数据 |
数据校验任务配置示例
ORACLE MIGRATE MYSQL 兼容性数据库,以上游 ORACLE 数据库为基准,提供以下功能实现:
- SCHEMA 名称区分大小写
- TABLE 名称区分大小写
- COLUMN 名称区分大小写
- 自定义配置路由规则映射
- SCHEMA 名称路由
- TABLE 名称路由
- COLUMN 名称路由
- 自定义数据库表数据校验范围、校验字段以及可忽略的校验字段
- 上游一致性/非一致性读,下游当前读
- 支持程序 CRC32、数据库 MD5 方式数据校验以及只校验数据表行数
- 断点续传
- 非强制要求表结构必须存在有效唯一字段索引,采用数据对比过程结合数据记录行数规避
NOTE:
约束类别 | 注意事项 | 备注 |
---|---|---|
数据库版本 | ORACLE Require Version >= 10G,MYSQL 兼容性数据库 Null And "" 不额外处理,以原始值对比 | |
数据校验 | 1. 除 LONG/LONG RAW/BFILE 数据类型字段表,自动采用程序 CRC32 方式校验外,其他的采用数据库 MD5 方式校验,但可通过忽略 LONG/LONG RAW/BFILE 数据类型字段规避方式来使用数据库 MD5 方式校验 2. ONLY 校验数据行数产生的差异不会输出详情修复文件,元数据表只记录数据表不相等,但对应的上下游表行数程序日志会显示记录 |
|
NUMBER 数据类型 | 对于无精度 Number 数据类型统一以 TO_CHAR(38 位整数,24 位小数) VS DECIMAL(65,24) 数据对比,优先保整数部分(TO_CHAR 格式化 MAX 62 位) | |
字符长度 | 为尽可能避免 ORA-22835 字段拼接超过 4000,LOB 类型数据提前 MD5 加密运算,其他维持原样运算 | |
校验规则 | 1. compare-field/compare-range 参数,compare-range 优先级高于 compare-field,仅当两个都配置时,以 compare-range 为准 2. compare-field 参数字段是否是索引字段,需自行确认保证,非索引字段影响校验效率以及数据库资源消耗 |
|
断点续传 | 断点续传期间,参数配置文件 chunk-size 不能动态变更,但可通过配置 enable-checkpoint = false 自动清理断点以及已迁移的表数据,重新导出导入 | |
错误处理 | 如果程序遇到报错,进程不会终止,具体错误表以及对应的错误详情参见元数据表 [data_compare_task] 数据 |
ORACLE MIGRATE MYSQL 兼容性数据库,计划基于 logminer 提供增量数据实时同步功能
NOTE:
- 基于 logminer 日志进行增量数据同步,存在 logminer 同等限制,且只同步 INSERT/DELETE/UPDATE DML 以及 DROP TABLE/TRUNCATE TABLE DDL,执行过 TRUNCATE TABLE/ DROP TABLE 可能需要重新增加表附加日志
- 基于 logminer 日志数据同步,挖掘速率取决于重做日志磁盘 + 归档日志磁盘【若在归档日志中】以及 PGA 内存
- 全量数据迁移参见 数据迁移