将 MySQL 迁移到 PostgreSQL
作为 Umami v3 的一部分,我们将移除对 MySQL 作为支持数据库的选项,统一采用 PostgreSQL。 此变更确保所有环境中数据层更一致且可扩展。
数据迁移
本文档概述了从 MySQL 到 PostgreSQL 的迁移流程,包括:
- 准备 MySQL 导出文件或 CSV 文件。
- 验证数据完整性及应用兼容性。
目标是使迁移过程无缝,同时保留所有数据,并确保最小停机时间。您可以探索诸如 pgloader 和 pg_chameleon 等开源工具。以下流程是将数据纯粹迁移到新的 v2 PostgreSQL 数据库,
使其尽可能简单且无偏向。
要求
- MySQL 数据库架构必须与最新 v2 版本(v2.19.0)保持同步。
- 拥有两个数据库的凭据:
MySQL: mysql://user:password@host:port/dbname
PostgreSQL: postgresql://user:password@host:port/dbname使用 PostgreSQL 数据库安装 Umami
- 在 PostgreSQL 服务器上安装 Umami (v2.19.0)。安装流程文档见 这里。
- 清空以下表。这些表的数据将由 MySQL 导入填充。
truncate table "_prisma_migrations";
truncate table "user";执行迁移
MySQL 导出文件
对于较小数据库(少于 100 万条记录),可使用 MySQL 导出文件。官方文档见 这里。
- 生成 MySQL 导出文件。
mysqldump --no-create-info --default-character-set=utf8mb4 --quick --skip-add-locks \
-u username -p mydb > mydbdump.sql- 将反引号替换为双引号以兼容 PostgreSQL。
sed -i 's/`/"/g' mydbdump.sql- 使用 psql 运行导出文件。
psql -U username -d mydb < mydbdump.sqlDocker 版本
docker exec -i my-container psql -U username -d mydb < mydbdump.sql现在您可以升级到 Umami (v3.0)
生成 CSV 文件
对于较大的数据库,导出文件可能过大,插入语句可能效率低。
- 为所有必要的表生成带数据的 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 可能会限制)。
-
使用
scp或cp将文件从 MySQL 服务器移动到可被 psql 访问的位置。 -
使用 psql 的
\COPY命令将 CSV 导入 PostgreSQL 数据库。对每个表重复该命令。
psql -U postgres -d mydb -c "\COPY website_event FROM 'website_event.csv' CSV NULL '\N'"注意
- 如果未使用默认模式,请包含模式名。