数据迁移及数据同步

学习内容关键字:

MySQL迁移DM、DM迁移DM、数据迁移、数据同步

1.MySQL迁移到DM遇到的问题

1.1迁移前准备

迁移工具使用DTS,需要开启兼容MySQL参数为3,由于MySQL和DM结构不同,需要确认源端需要迁移哪个或哪几个库,在目的端创建好对应的用户及模式。需要注意创建用户时会默认创建一个同名模式属于该用户,源端数据应按需求迁移至对应用户模式下而非SYSDBA管理员默认的模式下。对MySQL中模式及表信息进行统计预估:

(1)统计指定库中表的数目。

SELECT COUNT(*) TABLES, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名称' GROUP BY TABLE_SCHEMA;

(2)统计指定库中视图的数目。

SELECT TABLE_SCHEMA,COUNT(*) VIEWS FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '数据库名称' GROUP BY TABLE_SCHEMA;

(3)统计指定库中所有的存储过程。

SELECT SPECIFIC_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE='PROCEDURE' AND ROUTINE_SCHEMA='数据库名称';

(4)统计指定库中所有的函数。

SELECT SPECIFIC_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE='FUNCTION' AND ROUTINE_SCHEMA='数据库名称';

(5)统计指定库中所有的触发器。

SELECT TRIGGER_SCHEMA,TRIGGER_NAME FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA= '数据库名称';

(6)将指定库中所有表数据量记录到辅助表。

CREATE TABLE MYSQL_TABLES(TAB_OWNER VARCHAR(100),TAB_NAME VARCHAR(100),TAB_COUNT INT); INSERT INTO MYSQL_TABLES SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名称' ORDER BY TABLE_ROWS DESC;

表数目

视图数目

存储过程

函数

触发器

数据量

迁移过程中应该查询出数据量较大的表单独迁移,避免整体迁移时间过长,通过manager或disql执行sql排查大数据量表:

 select owner,

         segment_name,

         bytes/1024.0/1024.0 as "数据量(MB)"

    from dba_segments

   where SEGMENT_TYPE='TABLE'

order by "数据量(MB)" desc limit 20;

              

1.2 开始迁移

迁移过程中观察迁移状况做好记录

1.3 修改迁移错误的表

可能存在的问题:

Group by:MySQL在未开启严格模式下,允许group by模式下可以允许查询中group by 子句中不包含所有查询列,而达梦数据库默认是不可以的,如果之前的SQL语句写的不是很规范会带来很多修改工作量,开启MySQL兼容模式后可以达到同样效果。

大小写敏感与否

如果旧数据库的库表与字段名不规范会导致很多情况下无法正常的查询和获取结果列;

数据库大小写敏感后,使用小写且未用双引号括起的查询语句,会被数据库自动转为大写,如果库中表名字段名为小写时,无法完成查询,会提示找不到对象;

当数据库表与字段名为大写时,可以完成查询,但是返回的数据字段名均为大写,如果使用map接收返回数据并在后续代码中使用get(字段名)获取时,则会无法获取到,产生错误;

在使用MyBait-plus的情况下,某些关键字被加上双引号进行查询,会导致达梦报错。

函数相关:

CAST()

达梦中需要改成显式转换to_char()

FIND_IN_SET

达梦内置函数没有mysql的find_in_set()函数,可以通过自定义函数实现,参考达梦官方文档

GROUP_CONCAT

如果在GROUP_CONCAT()函数中存在distinct操作的话,需要重新改写SQL语句提前去重 或者使用wm_concat()

CONCAT_WS(双引号分隔符-)

达梦不能用双引号括起分隔符,会被认为是库表

DATE_ADD

dateadd(day,a2.leave_days + 30,a2.sjcfTime) 单位,n,date

拼音排序

可以使用 NLSSORT 函数实现此功能,NLSSORT 支持以拼音、笔画、部首排序

NOW()

MySQL中now()查询当前时间,达梦中为CURRENT_DATE()返回当前日期

DATEDIFF()

返回时间间隔DATEDIFF(),datediff日期计算顺序与mysql相反,为date2-date1

DATE_FORMAT()

达梦数据库中,使用'%Y年%m月'去格式化日期的时候,会报错

数据类型和字符集相关

迁移时最好将char类型直接映射为varchar

MySQL中出现utf8mb3字符,去掉后修改对应乱码

1.4 迁移后的数据验证

粗略验证可以采用随机抽样对比源端与目标端表内容是否一致

也可以通过对比工具对表空间数据进行直观对比

最保险的做法是对源端对象和目标端对象分别统计进行对比检查一致性

需要注意迁移后部分强制转换的数据类型是否合适,避免插入数据时出现问题

  1. Oracle迁移到达梦遇到的问题

1.1迁移前准备

统计源端数据和表结构信息,统计页大小并查询编码格式、如有需要创建移植辅助表。

建议先迁移序列、再迁移表最后迁移视图,数据量最大的表单独迁移;对于表对象若较多可以先迁移小表再迁移大表,驱动使用oracle自带的驱动

遇到问题:

通讯异常:通常是源端或目的端连接失败,包括但不限于数据库信息有误、与数据库服务器间有防火墙限制访问或存在安全访问策略、网络环境问题等

1.2迁移过程

根据报错日志分析原因,如果存在字段类型问题可以直接修改ddl后创建,或在DTS中设置类型映射方式进行调整

常见问题:

违反唯一性约束:表中设置了唯一性约束或主键约束,但数据中有重复记录造成的;可能是原始库的约束被禁用了或者数据重复迁移造成的。解决:确认源数据没问题后选择删除后再拷贝;

记录超长:初始化选择的页大小影响后面表每行数据的长度,表每行长度之和不能超过页大小一半,解决办法:找到varchar类型较长的如varchar2(8000)这种修改成text类型;初始化页大小选择32K;启用超长记录using long row;

违反引用约束:由于外键约束造成的,父表数据未迁移,先迁移了子表数据。解决:先不迁移外键等约束,选择好要迁移的表时点击转换,按下面步骤迁移:

 * 第一次只选择表定义、不选择约束、索引、触发器等

 * 第一次迁移完成成功后,第二次只选数据

 * 第三部选择约束、索引等

视图迁移过程出现顺序问题:无效的用户对象。通常是没有将视图依赖的表迁移过去。解决:严格按照迁移顺序,先迁移表,再迁移视图、存储过程、函数等的顺序迁移;

无法解析的成员访问表达式:主要因为访问对象失效或访问其它用户下的对象。解决:确定相关对象没有失效,使用其它用户下的对象需要使用模式名.对象名来调用;

试图在blob或者clob列上排序或比较解决:修改ENABLE_BLOB_CMP_FLAG=1;

语法分析出错:由于语法不一致或用到了达梦保留字,或存在中文标点,对保留字加上双引号或者dmsvc中配置TRACE=(xxx)来让驱动自动屏蔽关键字,使用select * from V$RESERVED_WORDS where RESERVED='Y'查询关键字。另外dm manager不支持中文标点和异常空白符,可开启设置显示空白字符来分别异常空白符,正常的空格会显示为:虚点;

dbms_job无法使用:解决:达梦支持dbms_job包,但需要启用SP_INIT_JOB_SYS(1);

获取列信息失败:通常是驱动问题导致,更换为oracle自带驱动;

1.3迁移完成后数据验证

对源端对象和目标端对象分别统计进行对比检查一致性

select object_type,count(*) from all_objects where owner='模式名' group by object_type;

  1. 达梦迁移到达梦的方法

可以通过DMDTS也可通过数据同步工具DMETL、Kettle等进行数据迁移

若是相同初始化参数的实例可通过备份还原操作进行数据迁移

也可以物理传输整体实例文件并修改配置文件相关参数

4. 数据同步案例之OGG for MySQL的多端间数据同步

基于OGG实现MySQL实时同步全过程,同时学习DMHR、DMDRS、DMDIS等数据复制同步工具的使用

DMETL主要用数据清洗转换、定时同步等通过,目前改名为DMDIS(达梦数据集成软件)

DMDRS(达梦数据复制软件)可与

  1. 本周遇到的问题及解决方式
  1. MySQL的数据类型和DM的区别

——DM没有 siged类型,需要改为int

        迁移过程中源端与目的端库需要注意的点

——.DBF建议名字不要相同,避免后期移动文件造成的重名问题

        2. scp使用方法

从本地到远程 scp localfile.txt user@remote:/path/to/destination/

从远程到本地 scp user@remote:/path/to/file.txt /local/destination/

从远程到远程 scp user1@remote1:/path/to/sourcefile.txt

user2@remote2:/path/to/destination/

使用端口私钥 scp -P 2222 -i /path/to/private_key.pem localfile.txt

user@remote:/path/to/destination/

递归复制目录 scp -r sourcedir user@remote:/path/to/destination/

注意事项:

        如果目标路径是目录,文件将会被复制到该目录中。

        如果目标路径包含文件名,文件将被复制并重命名为指定的文件名。

        使用递归选项 -r 可以复制整个目录及其内容。

        如果目标路径中包含空格,应该使用引号将其括起来。

        要连接到非标准SSH端口,可以使用 -P 选项。

        使用 -i 选项可以指定用于身份验证的私钥文件。

        3. 句柄报错

错误解释:

handle:93 可能表示程序试图访问某个资源或文件的编号为93的句柄。

offset:2145064448 指出程序在处理文件或数据时试图访问的偏移量为2145064448字节。

这似乎是一个文件处理或者内存偏移错误。

这个错误表明尝试读取文件时出现问题,但是指定的文件或路径不存在。

    可能的解决方法:

1) 检查文件是否存在损坏或不完整的情况,如果是,尝试修复或替换文件。

2) 确认程序是否有足够的权限去访问指定的文件或资源。

3) 检查程序的内存使用情况,确保没有尝试访问非法的内存地址。

4) 如果是编程错误,检查代码中是否有错误的计算导致偏移量过大或者错误的处理逻辑。

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值