摘要:更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
南大通用GBase 8c多模多态数据库支持标准的SQL语法,能够兼容主流商业数据库语法,为企业现代化数字化转型提供技术支撑。本文以MySQL源库的迁移实践为例,展现GBase 8c数据库语法覆盖。
1. 迁移准备工作
在正式开始迁移之前,本节介绍迁移所相关的准备工作。
1.1 评估数据库
对当前源库进行评估,主要包括:
数据库兼容: GBase 8c确保创建的是B库(mysql兼容)。
select datname,datcompatibility from pg_database ;使用的特性: GBase 8c已兼容 MySQL 中使用的存储引擎、存储过程、触发器等特性语法,业务改造较少。
数据库大小: 评估数据库大小及数据表的数量,确认迁移的复杂度和所需时间。
字符集与排序规则: 确保字符集、排序规则等的一致性(如 MySQL 默认是 UTF8MB4,而 GBase 8c 默认是SQL_ASCII,GBase 8c的utf8兼容mysql的utf8MB4)。
1.2 确定迁移工具和方法
使用 数据迁移工具(如 DMT(官方工具推荐使用)或第三方工具如navicat、dbeaver )来进行数据迁移。
1.3 迁移计划
提前进行测试迁移验证,尽量减少迁移割接对业务的影响。
在迁移之前,测试 GBase 8c 数据库的性能,确保其能够满足需求。
2. 数据库结构迁移
2.1 表结构转换
GBase 8c已经对mysql语法和数据类型做了兼容,基本mysql的ddl可以直接在GBase 8c中执行。GBase 8c B库基本支持mysql所有的数据类型。
Mysql导出的表,基本可以直接在GBase 8c中直接创建,如下兼容了tinyint、datatine、blob、enum等数据类型:
2.2 存储过程和函数迁移
MySQL 和 GBase 8c 支持存储过程和函数,但其语法差异较大。需要根据 MySQL 中的存储过程代码,手动或使用工具将其转换为 GBase 8c 支持的 PL/pgSQL 语法。例如:
MySQL 存储过程:
sqlDELIMITER //CREATE PROCEDURE get_usersBEGIN SELECT * FROM users;END //DELIMITER ;GBase 8c中执行:
2.3 触发器和事件迁移
MySQL 中的触发器(Triggers)在 GBase 8c 中已基本支持。
例如:
MySQL 触发器:
# sqlCREATE TRIGGER before_insert_userBEFORE INSERT ON usersFOR EACH ROWSET NEW.created_at = NOW;GBase 8c 中执行:
2.4 数据迁移
在表结构迁移完成后,进行数据的迁移。常用的迁移方式包括:
使用 mysqldump 导出 MySQL 数据:
mysql dump -u root -p root --all-databases > all.sql如果使用dbeaver或者navicat之类的工具时,导出步骤,以DBeaver为例。
在DBeaver中连接到您的MySQL数据库。
在左侧导航栏中找到您要导出的数据库,右键单击该数据库中的表(可以单个scheme批量选)并选择“导出数据”。
在“导出数据”对话框中,选择要导出格式(CSV、SQL等)。
在“目标文件”字段中指定导出文件的保存路径和名称。
点击“完成”按钮开始导出数据库。
通过这些步骤,可以在DBeaver中轻松地将MySQL数据库导出到所需的数据格式中。
对于一些含有双引号的JSON、16进制等文本转换存储问题的,可以使用数据传输功能:
使用 GBase 8c 的 gsql 或其他工具执行sql文件进行数据导入。
gsql -d mysql-p 15400 -f all.sql确保导入的数据和约束都被正确迁移,特别是大数据量的表和涉及复杂外键的表。
3. 业务功能验证与改造
以几个业务迁移情况举例:
3.1 问题一
报错:ERROR: column "su.user_type" must appear in the GROUP BY clause or be used in an aggregate function LINE 2: ...ecord_id`,`ec`.`record_name` AS `record_name`,if((`su`.`user...
解决方法:
执行这个命令关掉 sql_mode_full_group。
alter database database_test3 set dolphin.sql_mode = 'sql_mode_strict,pipes_as_concat,ansi_quotes,no_zero_date,pad_char_to_full_length,auto_recompile_function,error_for_division_by_zero';3.2 问题二
报错: ERROR: could not determine which collation to use for view column “check_name” HINT: Use the COLLATE clause to set the collation explicitly.
解决方法:
添加 COLLATE utf8mb4_general_ci 关键字。
3.3 问题三
GBase 8c 的interval 不支持函数中带有表达式,如 select (curdate - interval (weekday(curdate) + 7) day)。
解决方法:
将 interval 中的函数提取出来, 以上语句转换成(解决思路,先将表达式式中的结果计算出来,然后通过与 interval '1 day'相乘转换单位)
SELECT (CURRENT_DATE - (weekday(curdate) + 7) * INTERVAL '1 day');3.4 问题四
GBase 8c 的 在字段类型不兼容的情况下,默认进行隐式转换后会报 WARNING: invalid input syntax for type select '2020-05-22' - interval '22 day'; 报错信息如下:
解决方法:
alter database database_test1_new set dolphin.b_compatibility_mode =on;3.5 问题五
GBase 8c 的str_to_date 返回值是text 与 interval 字段 进行运算时 不会隐式转换 报错信息如下:
解决方法: 在计算前 加上强制类型转换 ::datetime。
3.6 问题六
GBase 8c 的right 函数参数值 参与计算后会自动转换成bigint ERROR: function right(character varying, bigint) does not exist
解决方法:添加显示类型转换。
3.7 问题七
问题描述:设置字段别名与GBase 8c关键字重复。
解决方法:在关键字上添加双引号
4. 数据验证与性能优化
4.1 数据验证
在数据迁移完成后,需要进行验证,确保数据的完整性和准确性。可以通过以下方式进行验证:
比对表行数: 比较 MySQL 和 GBase 8c 中每个表的行数是否一致。
随机抽样: 随机抽取一部分数据,手动验证数据是否一致。
检查外键约束和索引: 确保所有外键约束和索引都已正确迁移。
4.2 性能调优
GBase 8c 和 MySQL 在性能优化上有所不同,可能需要根据 GBase 8c 的特性对查询进行调整:
分析查询: 使用 EXPLAIN 命令分析 SQL 查询计划,确保查询能够高效执行。
索引优化: 根据需要添加或调整索引,确保查询性能。
5. 迁移后维护阶段
迁移完成后,需要持续监控 GBase 8c 数据库的运行状态和性能,确保系统平稳运行。
定期备份: 设置数据库的定期备份策略。
性能监控: 监控数据库的负载、查询响应时间等,及时调整数据库配置。
故障恢复: 确保故障恢复机制到位,能够在出现故障时迅速恢复。
6. 总结
MySQL 到 GBase 8c 的迁移涉及到数据库结构转换、数据迁移、存储过程和触发器的修改较少,有些问题需要进行人工调整优化。迁移前的准备工作、迁移中的逐步实施以及迁移后的性能调优是确保迁移顺利完成的关键。
来源:小胡看科技