
导读:经过数月的持续开发,MySQL2PG v3.3.0 正式发布!本版本新增 MySQL 5.7+/8.0 完整支持,涵盖日期时间函数、JSON 函数、存储过程语法、REGEXP_LIKE 函数等 50+ 新特性转换,修复了 CONCAT_WS 等关键函数的转换问题,并带来 CI/CD 改进、HTML 报告增强等多项优化。
v3.3.0 版本实现了对 MySQL 5.7+ 和 8.0+ 版本的完整转换支持,新增 50+ 函数转换能力:
MySQL 函数 | PostgreSQL 等效函数 |
|---|---|
YEARWEEK(dt) | (extract(year from dt)::int * 100 + extract(week from dt)::int) |
DAYNAME(dt) | to_char(dt, 'Day') |
MONTHNAME(dt) | to_char(dt, 'Month') |
QUARTER(dt) | extract(quarter from dt)::int |
WEEK(dt) | extract(week from dt)::int |
UNIX_TIMESTAMP() | extract(epoch from now()) |
FROM_UNIXTIME(ts) | to_timestamp(ts) |
DATE_FORMAT(dt, fmt) | to_char(dt, fmt) |
STR_TO_DATE(str, fmt) | to_date(str, fmt) |
DATEDIFF(d1, d2) | date_part('day', d1 - d2) |
DATE_ADD(dt, INTERVAL) | dt + INTERVAL |
DATE_SUB(dt, INTERVAL) | dt - INTERVAL |
MySQL 8.0 的 JSON 功能得到了全面支持:
MySQL 函数 | PostgreSQL 等效函数 |
|---|---|
JSON_OBJECT('key', val) | json_build_object('key', val) |
JSON_ARRAY(a, b) | json_build_array(a, b) |
JSON_INSERT(doc, path, val) | jsonb_set(doc, path, to_jsonb(val), true) |
JSON_REPLACE(doc, path, val) | jsonb_set(doc, path, to_jsonb(val), false) |
JSON_SET(doc, path1, val1, path2, val2) | jsonb_set(jsonb_set(doc, path1, to_jsonb(val1)), path2, to_jsonb(val2)) |
JSON_REMOVE(doc, path) | doc - path |
JSON_MERGE_PATCH(doc1, doc2) | (doc1::jsonb || doc2::jsonb) |
JSON_EXTRACT(doc, path) | doc -> path |
JSON_VALUE(doc, path) | doc ->> path |
JSON_KEYS(doc) | json_object_keys(doc) |
JSON_LENGTH(doc) | json_array_length(doc) |
JSON_TYPE(doc) | jsonb_typeof(doc::jsonb) |
JSON_VALID(doc) | (doc IS NOT NULL AND jsonb_typeof(doc::jsonb) IS NOT NULL) |
关键修复:
jsonb_set 值参数类型转换问题,改用 to_jsonb(val) 避免语法错误JSON_SET 多参数语法,转换为嵌套 jsonb_set 调用json→jsonb 类型转换JSONB_SET 路径格式为 PostgreSQL 数组格式新增对 MySQL 存储过程流程控制语法的支持:
-- MySQL
IF condition THEN
statement_list;
ELSEIF condition THEN
statement_list;
ELSE
statement_list;
END IF;
-- PostgreSQL
IF condition THEN
statement_list;
ELSIF condition THEN
statement_list;
ELSE
statement_list;
END IF;MySQL 函数 | PostgreSQL 等效函数 |
|---|---|
REGEXP_LIKE(str, pattern) | str ~ pattern |
LOCATE(substr, str) | POSITION(substr IN str) |
GROUP_CONCAT(DISTINCT expr ORDER BY expr) | string_agg(DISTINCT expr::text, ',' ORDER BY expr) |
CONCAT_WS(sep, a, b, c) | ARRAY_TO_STRING(ARRAY[a, b, c], sep) |
INSTR(str, substr) | POSITION(substr IN str) |
CAST(expr USING charset) | expr (移除 charset 语法) |
问题描述:CONCAT_WS 函数在转换时会丢失分隔符参数,导致转换后的 SQL 语法错误。
修复方案:将 CONCAT_WS(sep, a, b, c) 转换为 ARRAY_TO_STRING(ARRAY[a, b, c], sep),完整保留分隔符和参数顺序。
-- MySQL
SELECT CONCAT_WS(',', first_name, last_name, email) FROM users;
-- PostgreSQL
SELECT ARRAY_TO_STRING(ARRAY[first_name, last_name, email], ',') FROM users;go test ./... 在多包环境下的执行问题类别 | 测试用例数 | 通过率 |
|---|---|---|
基础类型转换 (case_01~case_40) | 40 | 100% ✅ |
索引与约束 (case_41~case_60) | 20 | 100% ✅ |
MySQL 5.7+/8.0 (case_61~case_100) | 40 | 100% ✅ |
业务场景 (case_101~case_120) | 20 | 100% ✅ |
日常开发 (case_121~case_155) | 35 | 100% ✅ |
增强场景 (case_156~case_167) | 12 | 100% ✅ |
总计 | 167 表 | 100% ✅ |
# 基本用法
./mysql2pg report -l conversion.log
# 包含错误日志
./mysql2pg report -l conversion.log -e errors.log
# 自定义输出路径
./mysql2pg report -l conversion.log -o my-report.html$ 前缀未移除问题数据库类型 | 支持版本 |
|---|---|
MySQL | 5.7+, 8.0+, 8.1+, 8.2+ |
PostgreSQL | 12+, 13+, 14+, 15+, 16+, 17+, 18+ |
Greenplum | 6.x, 7.x (MPP 模式) |
YugabyteDB | 2.x (MPP 模式) |
转换对象 | 支持数量 | 转换成功率 |
|---|---|---|
MySQL 数据类型 | 40+ | 99.9% |
视图 | 42 个测试用例 | 100% |
函数 | 113 个 | 100% |
索引类型 | 5 种 | 98% |
用户权限 | 完整支持 | 98% |
表权限 | 完整支持 | 98% |
指标 | 数值 |
|---|---|
并发转换速度提升 | 5-10 倍 |
批量插入行数 | 50,000 行/批 |
数据完整性保持率 | 100% |
平均转换速度 | 10,000+ 行/秒 |
连接测试响应时间 | <1 秒 |
# 克隆仓库
git clone https://github.com/xfg0218/MySQL2PG.git
cd MySQL2PG
# 构建
make build# config.yml
mysql:
host: localhost
port: 3306
username: root
password: your_password
database: source_db
test_only: false
postgresql:
host: localhost
port: 5432
username: postgres
password: your_password
database: target_db
test_only: false
conversion:
options:
tableddl: true
data: true
view: true
indexes: true
functions: true
users: true
table_privileges: true
validate_data: true
truncate_before_sync: false
limits:
concurrency: 10
max_rows_per_batch: 50000
batch_insert_size: 50000# 执行迁移
./mysql2pg config.yml
# 生成 HTML 报告
./mysql2pg report -l conversion.logv3.3.0 版本包含 70+ 次提交,主要贡献者:
完整变更日志:https://github.com/xfg0218/MySQL2PG/compare/v3.2.0...v3.3.0
你在使用 MySQL 到 PostgreSQL 迁移时遇到过哪些痛点?欢迎在评论区留言分享!
觉得有用的话,欢迎点赞 👍 在看 👀 分享 🔄 三连支持!
本文首发于 MySQL2PG 官方博客,转载请注明出处。
[1] README\_CN.md: https://github.com/xfg0218/MySQL2PG/blob/main/README_CN.md
[2] GitHub Issues: https://github.com/xfg0218/MySQL2PG/issues