经过一年来的从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的几个小版本时不支持的。