暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

​MySQL迁移到Halo-MySQL模式

Halo Tech 2024-10-11
169

    经过一年来的从MySQL数据库迁移到Halo数据库的MySQL模式下,从最早的只支持数据类型到支持MySQL的特色语法、存储过程、自定义函数,适配了可视化客户端dbeaver、navicat一路走来。做一个流水帐的记录。

一、迁移工具

从最早的使用ora2halo客户端软件到现在的数据库迁移平台。

1、ora2pg:由perl语言编写的,

    1)优点:

        a.开源免费

        b.迁移速度快

        c.迁移数据准确

    2)缺点:

        a.部署前要perl环境,需要自己编译软件

        b.迁移界面都是命令行模式

        c.迁移时使用的时pg的命令格式

        d.迁移后数据库对象及数据比对需要全程自己手工比对

    后期改进,使用了自动化部署脚本,和自动化迁移

2、数据迁移平台:

    1)优点:

        a.简洁、直观、清爽风格的web操作界面

        b.支持多种数据库迁移

        c.全程实现mysql的语法模式迁移,减少迁移工作中的单独适配   

        d.迁移速度快

        e.迁移数据准确,能够比对迁移后数据及数据库对象

        f.自动化部署

    2)缺点:

        a.比较数据内容相对粒度比较粗

        b.部分功能按钮布局需要改进 

二、迁移过程

    整个迁移过程从数据库对象开始到导入数据,并创建索引及约束,比对迁移对象和数据。

    第一步:数据库对象迁移,首先要先迁移表结构,迁移表结构时候,只迁移所有的表对象,不涉及创建主键、索引及约束。在完成表结构迁移之后,会一次迁移触发器、自定义函数、存储过程和视图。

    第二步:对象迁移完成之后,针对表数据进行迁移导入到halo-mysql里面。

    第三步:数据迁移完后,要进行主键、索引及约束创建。

    第四步:halo-mysql与源库进行数据库对象及数据的比对,数据库对象比对只比对名称个数,数据比对需要比对表的数据量,随机抽样查询部分表的数据字段内容的比对。

    第五步:测试halo-mysql中数据库对象中存储过程及自定义函数的功能验证。

    第六步:修改应用的mysql连接串,只需要修改应用用户密码和IP。         

三、应用测试适配

在应用测试阶段就需要开启数据库日志参数

    log_destination = 'csvlog'
    logging_collector = on
    log_min_messages = info
    log_min_error_statement = info

    同时在测试应用的时候,观察数据库日志的报错      

    以下几类主要问题。

    1、类型不匹配

        1)导致报错系统函数不存在,例如:错误,42883,"函数 date_format(character varying, unknown) 不存在"

        处理办法,进行函数重载,创建函数参数类型匹配的函数

        2)字段类型不能强转

        例如:在查询中,字段a(varchar) = 1234(int),就会报错,字段类型不一致

        处理办法:创建一个cast

    2、语法不支持

        遇到一个查询语句:

      select a.id as USERID from user a order by a.USERID;

          会报错
      ERROR 1054():column a.USERID does not exist。

          这时候需要先去原生mysql库执行,如果成功就需要找到问题点,就表示halo-mysql还不支持这种写法,需要和研发沟通怎么适配。

      3、操作符类型不匹配

          遇到报错,42883,"操作符不存在: integer & `text`",,"没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.",,,,"select count(roomId) from nst_t_room where 1=1 and roomCategory=1 and (roomType & '2') > 0"

          处理办法:需要适配操作符      

      4、原生驱动不适配的问题

          遇到报错,FATAL,XX000,"The packet sequence number from client is error, except 0 get 3."   

          处理办法,更换驱动,目前遇到mysql8的几个小版本时不支持的。

      文章转载自Halo Tech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论