Microbee-data配置迁移及常见问题
注:当使用microbee-http框架+microbee-data数据库时,model层及控制层编写sql时请严格规范sql格式,使用标准化的sql语句进行编写。
安装配置
1)安装部署可参考头部导航栏MICROBEE-DATA中5.1章节
2)按照文档安装完成后,默认登录账号microbee-data 密码为空,可登录数据库另行设置密码。
连接与数据迁移
数据库连接
1)连接数据库可使用常见的可视化工具(Navicat、pgAdmin、Dbeaver等)。数据库类型可选择postgreSQL(Microbee-data与postgreSQL通用)
2)如需在框架配置连接请查看章节《3.3项目配置》。
数据迁移
数据迁移方式可选:可视化工具及Linux命令方式(推荐)
1)可视化工具
1.1)DBeaver
迁移步骤:
①下载安装:从 DBeaver 官网 下载对应系统的版本并安装;
②连接数据库:左侧导航栏点击「数据库」→「新建连接」,分别连接 MySQL 和 PostgreSQL(输入主机、端口、用户名、密码、数据库名);
③启动迁移向导:右键点击已连接的 MySQL 数据库 →「工具」→「数据传输」;
④配置迁移选项:
「源」选择 MySQL 数据库 / 表;
「目标」选择 PostgreSQL 数据库(需提前创建空库);
点击「下一步」,可配置字段映射(如 MySQL 的 varchar 映射到 PostgreSQL 的 varchar 或 text)、索引迁移等;
⑤执行迁移:点击「开始」,工具会自动执行表结构创建、数据导入,并显示进度和日志。
1.2)Navicat Premium
迁移步骤:
①连接数据库:分别创建 MySQL 和 PostgreSQL 的连接(确保测试连接成功);
②打开数据传输工具:
顶部菜单「工具」→「数据传输」;
「源」选择 MySQL 连接及数据库,「目标」选择 PostgreSQL 连接及数据库。
③选择迁移对象:勾选需要迁移的表、视图、索引等(可批量选择);
④配置迁移选项:
切换到「选项」标签,设置字段类型映射(如 datetime → timestamp)、是否覆盖目标表等;
⑤执行迁移:点击「开始」,工具会显示迁移进度,完成后可查看报告(成功 / 失败的记录数)。
1.3)pgAdmin
迁移步骤(间接迁移):
①从 MySQL 导出数据为 CSV;
用 MySQL 客户端(如 Navicat、MySQL Workbench)将表数据导出为 CSV 文件(注意编码为 UTF-8);
②在 pgAdmin 中创建表结构:
手动在 PostgreSQL 中创建与 MySQL 对应的表结构(字段类型需适配,如 int→integer,varchar→varchar)。
③导入 CSV 到 PostgreSQL:
在 pgAdmin 中右键点击目标表 →「导入 / 导出数据」→ 选择 CSV 文件,配置分隔符、编码等,执行导入。
2)Linux命令
使用linux命令进行导入时,需docker+ pgloader配合使用。
迁移步骤:
①使用docker下载pgloader:docker run --rm -it ghcr.io/dimitri/pgloader:3.6.9(如需其他版本自行查找);
②使用命令迁移:
docker run --rm -it ghcr.io/dimitri/pgloader:3.6.9 pgloader --with "quote identifiers" 'mysql://user:pwd@ip:3306/dbname 'pgsql://user:pwd@ip:5432/dbname'
此命令将会将mysql中的dbname数据库迁移到microbeedata中的dbname模式中,此命令不会迁移到public模式中,而是会创建一个同dbname相同的模式,如需迁移到public中请查看以下方法:
创建一个 .load 格式的配置文件(例如 mysql2pg.load),定义迁移规则;
先建个临时目录用于Docker挂载:
mkdir /root/tmpdir
cd /root/tmpdir
创建并编辑.load文件:
vi mysql2pg.load
配置内容
LOAD DATABASE
FROM mysql://user:pwd@ip:3306/dbname
INTO pgsql://user:pwd@ip:5432/dbname
with prefetch rows = 10000
WITH include drop, create tables, create indexes, workers = 8, concurrency = 1, quote identifiers
ALTER SCHEMA 'udso' RENAME TO 'public'
;
配置说明:
LOAD DATABASE 指定从数据库加载;
FROM 源数据库连接信息;
INTO 目标数据库连接信息;
WITH 指定PGLoader行为;
include drop:迁移过程中,PGLoader会删除目标PostgreSQL数据库中在源数据库中同名的任何表。注意备份;
create tables:配置PGLoader根据源数据库数据在目标数据库中创建新表,如果使用create no tables,则需要手动在目标数据库中创建好对应的表;
quote identifiers:创建表和列增加双引号,强制保留原始大小写。
ALTER SCHEMA:在WITH语句之后,配置特定SQL来告诉PGLoader执行其他操作。
执行迁移:
docker run -v /root/tmpdir:/tmp --rm -it ghcr.io/dimitri/pgloader:3.6.9 pgloader /tmp/mysql2pg.load
迁移成功后可删除/root/tmpdir文件夹
注:推荐使用docker+pgloader进行数据迁移,此方法可完整迁移数据库表字段类型、主键自增等信息,使用此方法迁移前请确保microbee-datas存在名为dbname的数据库。
编辑sql文件(用于将int类型转为integer,mysql中原int会被转换成int4、int8;java中会被识别成long,若非必须可以不执行此步骤):
vi fix_types.sql
配置内容:
-- 声明变量
DO $$
DECLARE
rec RECORD;
table_name TEXT;
column_name TEXT;
sql TEXT;
BEGIN
-- 遍历所有在 public schema 下,类型为 bigint 且不是主键的字段
-- 注意:我们排除了主键字段(primary key),以保护自增主键
FOR rec IN
SELECT
c.table_name,
c.column_name
FROM
information_schema.columns c
LEFT JOIN (
SELECT
kcu.table_name,
kcu.column_name
FROM
information_schema.table_constraints tc
JOIN
information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name
WHERE
tc.constraint_type = 'PRIMARY KEY'
AND tc.table_schema = 'public'
) AS pks ON c.table_name = pks.table_name AND c.column_name = pks.column_name
WHERE
c.data_type = 'bigint'
AND c.table_schema = 'public'
AND pks.column_name IS NULL -- 确保不是主键
LOOP
table_name := rec.table_name;
column_name := rec.column_name;-- 构建 ALTER TABLE 语句,将 bigint 类型改为 integer
-- USING ...::integer 是一个安全措施,确保数据转换兼容
sql := format('ALTER TABLE %I ALTER COLUMN %I TYPE integer USING %I::integer;',
table_name, column_name, column_name);-- 打印将要执行的 SQL 语句(可选,用于调试)
RAISE NOTICE 'Executing: %', sql;-- 执行 SQL 语句
EXECUTE sql;
END LOOP;RAISE NOTICE 'Type conversion completed successfully.';
END $$;
执行sql:/usr/local/microbee-data/bin/psql -U microbee-data -d udso -f fix_types.sql
项目配置
service.conf 内容:
md dbtype 全部小写 (mysql,dm,microbee-data简称md) org.postgresql.Driver microbee-data其他差异
数据类型差异
| 特性 | MySQL | Microbee-data |
| 字符串类型 | 支持 VARCHAR、CHAR、TEXT(TINYTEXT/MEDIUMTEXT/LONGTEXT) | 支持 VARCHAR、CHAR、TEXT(无细分,统一为 TEXT),VARCHAR 可存至 1GB |
| 整型类型 | 有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 细分 | 基础类型为 SMALLINT、INT、BIGINT,无 MEDIUMINT/TINYINT(可用 SMALLINT 替代) |
| 自增主键 | 使用 AUTO_INCREMENT 关键字(如 INT AUTO_INCREMENT) | 无 AUTO_INCREMENT,需用 SERIAL(对应 INT 自增)或 BIGSERIAL(对应 BIGINT 自增),本质是 SEQUENCE 的封装 |
| 布尔类型 | 支持 BOOL/BOOLEAN,但实际存储为 TINYINT(1)(0/1) | 原生 BOOLEAN 类型,存储为 true/false 或 t/f,兼容数值 1/0 |
| 时间类型 | 有 DATETIME(无时区)、TIMESTAMP(带时区,范围小) | TIMESTAMP WITH TIME ZONE(带时区)、TIMESTAMP WITHOUT TIME ZONE(无时区),范围更大(1-10000 年) |
| json类型 | JSON/JSONB(JSONB 支持索引) | JSON/JSONB(JSONB 性能更优,支持复杂索引和操作) |
SQL语法差异
| 语法场景 | MySQL | Microbee-data |
| 注释语法 | 字段 / 表注释可直接写在定义后:CREATE TABLE t (id INT COMMENT '主键') | 必须通过 COMMENT ON 单独添加:CREATE TABLE t (id INT);COMMENT ON COLUMN t.id IS '主键'; |
| 分页limit | 支持 LIMIT m OFFSET n 或 LIMIT n, m | 仅支持 LIMIT m OFFSET n(不支持 LIMIT n, m) |
| 批量插入返回 | 不支持插入后返回自增 ID 列表 | 不支持插入后返回自增 ID 列表,支持 RETURNING 关键字返回插入的记录:INSERT INTO t(name) VALUES ('a') RETURNING id; |
| UPDATE 关联表 | 支持 UPDATE t1 JOIN t2 ON ... SET ... | 需用 UPDATE ... FROM ... 语法:UPDATE t1 SET col = t2.val FROM t2 WHERE t1.id = t2.id; |
| 空值判断 | =/!= 可判断 NULL(结果为 NULL),需用 IS NULL/IS NOT NULL | 严格区分 NULL,必须用 IS NULL/IS NOT NULL(= NULL 永远返回 NULL) |
| 事务隔离级别 | 默认 REPEATABLE READ | 默认 READ COMMITTED(更适合高并发) |
| key-value语法 | 支持数字类型字段,值为字符(id= "1"/'1')查询 | 严格要求key-value类型,value类型需与key类型保持一致 |
| group by语法 | 查询时支持group by任意字段 | 查询时group by字段需在select from中 |
功能特性差异
| 特性 | MySQL | Microbee-data |
| 事务与 ACID | 支持 ACID,但 MyISAM 引擎不支持事务 | 全引擎支持 ACID 事务(默认 InnoDB 等价引擎) |
| 索引类型 | 支持 B + 树、哈希索引、全文索引 | 支持 B + 树、GIN(适合 JSON / 数组)、GiST(适合地理数据)、BRIN(适合大表范围查询)等,全文索引功能更强 |
| 存储引擎 | 多引擎(InnoDB、MyISAM、Memory 等),需手动选择 | 单引擎架构(类似 InnoDB),功能统一且强大 |
| 高级数据结构 | 有限支持数组、JSON | 原生支持数组(INT[]、TEXT[])、枚举(ENUM)、地理信息(GEOMETRY)等 |
| 函数与存储过程 | 支持存储过程、函数,但功能较弱 | 支持复杂存储过程、函数、触发器 |
| 分区表 | 支持范围、列表分区,功能较简单 | 支持范围、列表、哈希、间隔分区,且分区表与普通表操作一致 |
| 外键约束 | InnoDB 支持,但默认可关闭约束检查 | 严格支持外键约束,且强制检查(无法临时关闭) |
| 大小写敏感 | 表名 / 列名大小写敏感性依赖操作系统(Linux 敏感,Windows 不敏感) | 表名 / 列名默认小写(若用双引号包裹则区分大小写,如 "User" 与 user 是两个表) |
迁移注意事项
如需手动迁移需注意以下信息:
1)自增主键迁移:
将 AUTO_INCREMENT 改为 SERIAL 或 BIGSERIAL,或手动创建 SEQUENCE。
2)注释迁移:
需将 MySQL 字段后的 COMMENT 拆分为 COMMENT ON COLUMN 语句。
3)函数替换:
MySQL 的 GROUP_CONCAT → Microbee-data 的 string_agg(column, separator);
MySQL 的 IFNULL(a, b) → Microbee-data 的 COALESCE(a, b);
MySQL 的 DATE_FORMAT → Microbee-data 的 TO_CHAR。
4)索引迁移:
Microbee-data 不支持 FULLTEXT INDEX 语法,需用 tsvector 全文搜索替代。
5)SQL 模式:
Microbee-data 对语法更严格(如不允许字段名与关键字重名,需用双引号包裹)。
扫一扫