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

其他差异

数据类型差异

特性MySQLMicrobee-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语法差异

语法场景MySQLMicrobee-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中

功能特性差异

特性MySQLMicrobee-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 对语法更严格(如不允许字段名与关键字重名,需用双引号包裹)。

本文档来自—microbee-http 丨 软件开发框架平台