将 MySQL 迁移到 PostgreSQL

作为 Umami v3 的一部分,我们将移除对 MySQL 作为支持数据库的选项,统一采用 PostgreSQL。 此变更确保所有环境中数据层更一致且可扩展。

数据迁移

本文档概述了从 MySQL 到 PostgreSQL 的迁移流程,包括:

  • 准备 MySQL 导出文件或 CSV 文件。
  • 验证数据完整性及应用兼容性。

目标是使迁移过程无缝,同时保留所有数据,并确保最小停机时间。您可以探索诸如 pgloaderpg_chameleon 等开源工具。以下流程是将数据纯粹迁移到新的 v2 PostgreSQL 数据库, 使其尽可能简单且无偏向。

要求

  • MySQL 数据库架构必须与最新 v2 版本(v2.19.0)保持同步。
  • 拥有两个数据库的凭据:
MySQL: mysql://user:password@host:port/dbname

PostgreSQL: postgresql://user:password@host:port/dbname

使用 PostgreSQL 数据库安装 Umami

  1. 在 PostgreSQL 服务器上安装 Umami (v2.19.0)。安装流程文档见 这里
  2. 清空以下表。这些表的数据将由 MySQL 导入填充。
truncate table "_prisma_migrations";
truncate table "user";

执行迁移

MySQL 导出文件

对于较小数据库(少于 100 万条记录),可使用 MySQL 导出文件。官方文档见 这里

  1. 生成 MySQL 导出文件。
mysqldump --no-create-info --default-character-set=utf8mb4 --quick --skip-add-locks \
-u username -p mydb > mydbdump.sql
  1. 将反引号替换为双引号以兼容 PostgreSQL。
sed -i 's/`/"/g' mydbdump.sql
  1. 使用 psql 运行导出文件。
psql -U username -d mydb < mydbdump.sql

Docker 版本

docker exec -i my-container psql -U username -d mydb < mydbdump.sql

现在您可以升级到 Umami (v3.0)

生成 CSV 文件

对于较大的数据库,导出文件可能过大,插入语句可能效率低。

  1. 为所有必要的表生成带数据的 MySQL CSV 文件。

在 MySQL 命令行中执行:

SELECT *
INTO OUTFILE '/tmp/website_event.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM website_event;

注意

  • 文件路径(/tmp/users.csv)是在 MySQL 服务器的文件系统上,不一定是在您的主机上。
  • 确保 MySQL 有权限写入该路径(secure_file_priv 可能会限制)。
  1. 使用 scpcp 将文件从 MySQL 服务器移动到可被 psql 访问的位置。

  2. 使用 psql 的 \COPY 命令将 CSV 导入 PostgreSQL 数据库。对每个表重复该命令。

psql -U postgres -d mydb -c "\COPY website_event FROM 'website_event.csv' CSV NULL '\N'"

注意

  • 如果未使用默认模式,请包含模式名。