一、环境及需求
由于核心系统日益增长的数据量以及相关业务系统庞大的关联架构,数据库及业务系统在长期未进行结构调整优化情况下,业务运行会逐渐暴露出数据库的性能问题及业务架构设计缺陷等等。
考虑数据库性能及未来几年内业务承载的能力,经过综合评估提出尝试变更数据平台调整业务数据库类型,将原SQLServer数据库更换为更高性能的ORACLE,同时业务系统将同步进行优化调整。
二、方案技术概要
本方案将介绍数据库类型转换工作原理及会议提出的相关问题解决方案。通过OGG工具实现跨数据类型迁移的目的。该工具可实现基础迁移数据的初始化同步及开启源端数据库数据变更捕获(CDC)功能实现增量数据同步。同时可定义表结构差异化数据同步兼容性的问题。
数据跨类型迁移部署逻辑架构:

迁移到oracle架构:

通过集群添加集群服务以及客户端tns文件、连接service name,达到业务连接scan ip,既可以故障转移群集,又能所有业务连到单一节点。
数据跨平台迁移涉及软件:
| 软件类型 | 版本 | 部署架构 |
|---|---|---|
| SQL Server | SQL Server 2014 EE | AlwaysON |
| ORACLE | 11gR2 | RAC |
| ORACLE Golden Gate |
- 数据转换过程中可能存在的风险及规避方法
在数据转换过程中最常见的错误有字符集及字段类型不一致导致的中文乱码及数据被截断等问题,要规避这类问题需参文档中的字段类型映射章节建议。
字符集尽量选择简体中文类型兼容的字符集。
数据迁移过程中可同步检查目标端已写入的数据和源端数据是否一致。发现异常及时修改表同步定义 - 数据类型同步问题
参考文档第四章节部分映射建议。 - 表结构差异问题
目标表结构存在优化调整导致表结构不一致,确保相同字段名称排序保持一致,保证迁移效率。
目标表新增字段需要合理设置缺省值。
目标表字段减少可通过迁移软件定义表的同步结构。 - EMR电子病历大字段数据
建议利用业务系统中加载该字段的模块,提取相关读取和写入的功能对该类型的数据进行同步,以确保数据的有效性。此操作需要评估数据大小,数据量大将非常耗时。 - EMR电子病历大字段数据
可通过数据同步结果校验及业务系统功能测试两方面来验证同步数据的有效性。
三、迁移工具
本文中推荐的跨数据库类型迁移的工具Oracle Golden Gate。通过定义转换字符集确保跨数据库类型的环境下源和目标数据读取和写入的结果及大小写保持一致。同时可定义需要同步的表数量及表字段的结构,可针对源和目标字段不一致的问题进行调整。
四、数据库对象类型映射及语法定义(附)
本节旨在提供数据库类型迁移转换参考,阅读本方案将有助于清楚了解数据库类型转换相关工作内容,以供工作量预评估提供基础数据依据。
数据库类型转换及数据迁移的工作内容至少包含转换数据库结构、视图、存储过程、函数、触发器、业务查询SQL及相关SQL脚本转换,业务系统研发改造、测试等等。因此需要综合考虑项目测试及实施的工作量。
- 数据库结构转换
- 常见数据库数据类型:
SQL Server和Oracle之间的数据类型映射。
字符和二进制字符串类型:
| SQLServer | 说明 | ORACLE |
|---|---|---|
| CHAR(n) | Fixed-length non-Unicode string, 1 <= n <= 8000 | CHAR(n) |
| NCHAR(n) | Fixed-length Unicode UCS-2 string, 1 <= n <= 4000 | NCHAR(n) |
| NVARCHAR(n) | Variable-length Unicode UCS-2 string, 1 <= n <= 4000 | NVARCHAR2(n) |
| NVARCHAR(max) | 2G | NCLOB |
| VARCHAR | Variable-length non-Unicode string, 1 <= n <= 8000 | VARCHAR2(n) |
| VARCHAR(max) | 2GB | CLOB |
数字类型:
| SQLServer | 说明 | ORACLE |
|---|---|---|
| BIGINT | 64位整数 | NUMBER(19) |
| DECIMAL(p,s) / DEC(p,s) | Fixed-point number | NUMBER(p,s) |
| FLOAT(n) | Single (n <= 24) and double (n <= 53) precision floating-point number | NUMBER |
| INTERGER / INT | 32-bit integer | NUMBER(10) |
| NUMBERIC(p,s) | Fixed-point number | NUMBER(p,s) |
| REAL | Single precision floating-point number | NUMBER |
| SMALLINT | 16-bit integer | NUMBER(5) |
| TINYINT | 0 to 255 | NUMBER(3) |
日期和时间:
| SQLServer | 说明 | ORACLE |
|---|---|---|
| DATA | Date (year, month and day) | DATE(includes time) |
| DATATIME | Date and time with milliseconds (accuracy .000, .003, .007 seconds) | TIMESTAMP(3) |
| TIME§ | Time, 0 <= p <= 7 (100 nanoseconds accuracy) | TIMESTAMP§ |
其他数据类型:
| SQLServer | 说明 | ORACLE |
|---|---|---|
| BIT | 0,1 and NULL | NUMBER(1) |
| MONEY | Monetary data | NUMBER(19,4) |
| SMALLMONEY | Monetary data | NUMBER(10,4) |
| UNIQUEIDENTIFIER | GUID with dashes(-) | CHAR(36) |
| XML | XML data | XMLTYPE |
- 常用内置SQL函数:
转换内置SQL函数
| SQLServer | 说明 | ORACLE |
|---|---|---|
| CONVERT(CHAR/VARCHAR,exp) | onvert to string | TO_CHAR(exp) |
| GETDATE() | Get the current date and time | SYSTIMESTAMP |
| MONTH(datetime) | xtract month from datetime | EXTRACT(MONTH FROM datetime) |
| SYSTEM_USER | OS user name | SYS_CONTEXT(‘USERENV‘,’OS_USER’) |
| YEAR(datatime) | Extract year from datetime | EXTRCT(YEAR FROM datetime) |

最后修改时间:2024-09-19 22:58:25
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




