为 GPT-Load、New-API 更换数据库:我是如何顺利将 MySQL 迁移到 PostgreSQL 的
自部署了 T 佬的 GPT-Load 和 New API,一开始使用的是 MySQL,想迁移到 PostgreSQL,因此轻微折腾了一下,过程极其顺利,稍微写一篇记录一下。
相关版本:
- MySQL:8.3.0
- PostgreSQL 16.9.0
- pgloader:3.6.7~devel
该方案理论适合多数项目服务的迁移,细节方面需要根据实际情况做调整,只在 T 佬的 GPT-Load 和 New API 测试操作成功,运行了一段时间也没有问题。
1.1 前置条件
- 执行迁移操作的机器,需要能访问 MySQL 和 PostgreSQL
- 提前准备好迁移时使用的用户,这里 MySQL 用的是 migration,仅授予读权限,PostgreSQL 则临时用了超管 postgres
- 执行迁移前,记得先将相关服务停掉,例如迁移 New API,就将 New API 服务停一下,迁移后,修改相关配置信息,连接到新的数据库即可。
1.2 迁移执行命令脚本
pgloader 工具可用二进制文件,也可以使用 docker,我这里采用的是 docker,过程可能需要多次执行,所以命令写成了脚本 migrate.sh:
1 | !/bin/bash |
1.3 迁移使用的 load 配置文件
再准备需要映射到容器内部的 load 文件:migrate.load
通过 AI 生成 + 自己修改了一下
1 | -- ==================================================================== |
注意该部分:
1 | -- 将包含 JSON 字符串的 text/varchar 列直接转换为 jsonb 类型,可预先通过以下 SQL 语句查询哪些字段需要 |
针对不同的 MySQL 执行一次命令,获取 MySQL 数据库中,哪张表的哪个字段的类型使用了 json、enum 等类型,这样可以在使用 pgloader 迁移时,通过 CAST 字段配置转换,上面的 load,是针对 New API 的。
1.4 配置环境变量
这么搞主要是方便发文,不用担心敏感信息暴露。
在执行的操作系统上,配置好需要的环境变量:
- MYSQL_USER
- MYSQL_PASSWORD
- MYSQL_HOST
- MYSQL_PORT
- MYSQL_DATABASE
- PGSQL_USER
- PGSQL_PASSWORD
- PGSQL_HOST
- PGSQL_PORT
- PGSQL_DATABASE
1.5 大概率会遇到的问题:无法正常连接到 MySQL
报错日志大致如下:
1 | 2025-07-25T15:00:15.112999Z ERROR mysql: Failed to connect to mysql at "192.168.1.185" (port 3306) as user "migration": Condition QMYND:MYSQL-UNSUPPORTED-AUTHENTICATION was signalled. |
报错信息很明显了,主要是因为 MySQL 8.3 默认认证方式为 caching_sha2_password
,pgloader 不支持该认证方式。
尝试将 migration 用户的认证方式改为 mysql_native_password
插件,依旧报错误
最后将 MySQL 的默认身份认证插件修改为:mysql_native_password,重启 MySQL,正常连接。