从 MySQL 迁移到 PostgreSQL 实战指南:基于 pgloader 的完整操作手册)
OpenProject 打包安装DEB/RPM从 MySQL 迁移到 PostgreSQL 实战指南基于 pgloader 的完整操作手册【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject本文面向使用 OpenProject 官方 DEB/RPM 软件包部署、当前数据库为 MySQL、希望无损迁移到 PostgreSQL 的运维人员。文章完整覆盖「备份 → 安装 pgloader-ccl → 创建 PostgreSQL 实例 → 改写数据库配置 → 执行迁移脚本 → 卸载 MySQL → reconfigure 收尾」的完整链路并结合作品仓库中迁移工具的实际构建源码docker/prod/mysql-to-postgres/Dockerfile说明底层迁移原理与注意事项。读完本文你将掌握一套可复现、可回滚的 MySQL→PostgreSQL 迁移方案。适用范围仅限 DEB/RPM 打包安装注意本指南仅适用于使用 DEB/RPM 软件包安装的 OpenProject。本文描述的是将打包安装packaged installation自带的 MySQL 数据库迁移到 PostgreSQL 的完整流程迁移工具基于 pgloader 这一经典的开源数据迁移工具实现如果你的 OpenProject 是通过 Docker 容器或源码方式部署的则不适用本文的命令打包安装专属的openproject命令行封装在此场景下不可用。迁移原理为什么用定制的 pgloader-ccl官方软件包没有直接使用社区版 pgloader而是内置了一个定制版本命名为pgloader-ccl。从仓库中的构建文件可以确认其技术细节docker/prod/mysql-to-postgres/Dockerfile 显示迁移工具容器基于ruby:2.6-stretch构建并安装mysql-client、postgresql-client以及libsqlite3-dev make curl gawk freetds-dev libzip-dev等 pgloader 编译依赖docker/prod/mysql-to-postgres/bin/build 揭示了关键差异标准 pgloader 默认使用SBCLSteel Bank Common Lisp运行时而 OpenProject 定制版改用了Clozure CLCCL运行时即脚本中# install Clozure CL to avoid memory issues with the standard SBCL注释所说明的——这是为了规避 SBCL 在迁移超大 MySQL 数据库时的内存问题该构建脚本还会从源码编译固定版本 pgloaderv3.6.1最终产出/usr/local/bin/pgloader-ccl可执行文件。从源码结构看这套定制版本的主要价值在于为大型 MySQL 库迁移提供更稳定的内存表现同时让所有安装类型不同发行版、不同包管理方式都能使用同一套迁移体验。该软件包对所有当前受支持的发行版开放下载。第一步迁移前务必完成备份任何数据库迁移都存在失败风险。开始之前请务必为当前安装创建备份。官方提供了专门的备份与恢复流程参见备份与恢复指南。按照打包安装的备份工具openproject run backup产物默认位于/var/db/openproject/backup的说明见备份文档本次迁移前后你应当确保手头保留如下一组归档以便在迁移进入不稳定状态时随时回滚归档文件内容说明mysql-dump-timestamp.sql.gz当前 MySQL 数据库的逻辑导出若已用 PostgreSQL 部署则对应为postgresql-dump-timestamp.pgdumpattachments-timestamp.tar.gz上传的附件文件conf-timestamp.tar.gz自定义环境配置DATABASE_URL等均在其中svn-timestamp.tar.gz/git-timestamp.tar.gz仓库如启用了 SVN/Git 仓库管理建议将备份文件复制到安全位置例如对象存储或专门的备份服务器迁移期间不要删除。第二步安装 pgloader-cclOpenProject 官方为各发行版维护了独立的pgloader-ccl软件源请根据你的操作系统执行对应安装命令。Ubuntu 18.04wget -qO- https://dl.packager.io/srv/opf/pgloader-ccl/key | sudo apt-key add - sudo wget -O /etc/apt/sources.list.d/pgloader-ccl.list \ https://dl.packager.io/srv/opf/pgloader-ccl/master/installer/ubuntu/18.04.repo sudo apt-get update sudo apt-get install pgloader-cclUbuntu 16.04wget -qO- https://dl.packager.io/srv/opf/pgloader-ccl/key | sudo apt-key add - sudo wget -O /etc/apt/sources.list.d/pgloader-ccl.list \ https://dl.packager.io/srv/opf/pgloader-ccl/master/installer/ubuntu/16.04.repo sudo apt-get update sudo apt-get install pgloader-cclDebian 9wget -qO- https://dl.packager.io/srv/opf/pgloader-ccl/key | sudo apt-key add - sudo wget -O /etc/apt/sources.list.d/pgloader-ccl.list \ https://dl.packager.io/srv/opf/pgloader-ccl/master/installer/debian/9.repo sudo apt-get update sudo apt-get install pgloader-cclCentOS / RHEL 7sudo wget -O /etc/yum.repos.d/pgloader-ccl.repo \ https://dl.packager.io/srv/opf/pgloader-ccl/master/installer/el/7.repo sudo yum install pgloader-cclSuSE Enterprise Linux 12sudo wget -O /etc/zypp/repos.d/pgloader-ccl.repo \ https://dl.packager.io/srv/opf/pgloader-ccl/master/installer/sles/12.repo sudo zypper install pgloader-ccl各命令的作用先导入软件源签名密钥apt 系再写入仓库配置文件apt/yum/zypp 分别对应/etc/apt/sources.list.d/、/etc/yum.repos.d/、/etc/zypp/repos.d/最后更新索引并安装pgloader-ccl。第三步可选安装并创建 PostgreSQL 数据库如果服务器上还没有可用的 PostgreSQL 实例请先完成安装。OpenProject 要求至少 PostgreSQL 9.5若发行版自带版本过旧请从官方渠道获取更新的安装包。[roothost] apt-get install postgresql postgresql-contrib libpq-dev安装完成后切换到 PostgreSQL 系统用户[roothost] su - postgres以 PostgreSQL 用户身份创建 OpenProject 的数据库系统用户-P表示设置密码-d表示允许该用户创建数据库。命令会提示你输入密码下文示例统一假设密码为openproject——生产环境请务必使用强密码并将后续所有命令中的PASSWORD替换为你自己的密码[postgreshost] createuser -P -d openproject接着创建归属于该用户的数据库[postgreshost] createdb -O openproject openproject最后退出系统用户[postgreshost] exit # 你现在应该又回到了 root第四步把当前 MySQL 连接串保存为 MYSQL_DATABASE_URL迁移脚本后续会读取MYSQL_DATABASE_URL来定位旧库。执行以下命令把 OpenProject 配置中现有的 MySQLDATABASE_URL原样保存为MYSQL_DATABASE_URLopenproject config:set MYSQL_DATABASE_URL$(openproject config:get DATABASE_URL) openproject config:get MYSQL_DATABASE_URL # 输出内容类似 # mysql2://user:passwordlocalhost:3306/dbname输出的 URL 形如mysql2://user:passwordlocalhost:3306/dbname它将在稍后的迁移脚本中被读取使用。第五步把 OpenProject 指向 PostgreSQL 数据库根据你在第三步设置的密码拼装 PostgreSQL 的DATABASE_URL写入 OpenProject 配置openproject config:set DATABASE_URLpostgresql://openproject:PASSWORDlocalhost/openproject请务必注意将PASSWORD替换为第三步中你设置的密码如果密码中包含特殊字符如、:、/、#等需要先判断这些字符是否需要对数据库 URL 做百分号编码percent-encoding否则 URL 解析会出错可以使用下面这条命令对密码进行转义得到可直接嵌入 URL 的安全形式openproject run ruby -r cgi -e puts CGI.escape(your-password-here);这一步只是修改配置中的连接目标尚未真正迁移数据。此时 OpenProject 若被启动会尝试连接 PostgreSQL因此请接着完成下一步的迁移再执行reconfigure完成正式切换。第六步执行数据库迁移配置就绪后即可启动迁移。OpenProject 软件包内置了迁移脚本按如下方式运行sudo openproject run ./docker/mysql-to-postgres/bin/migrate-mysql-to-postgres该命令会拉起迁移脚本脚本内部驱动pgloader-ccl完成 MySQL → PostgreSQL 的数据、schema 与序列sequence等对象的搬运。根据当前安装的数据量大小这一步可能耗时较长属于正常现象请耐心等待其完成期间不要中断进程。补充说明迁移脚本在软件包安装中位于./docker/mysql-to-postgres/bin/路径下仓库中的同源构建脚本可见于 docker/prod/mysql-to-postgres/bin/build源码级编译 pgloader-ccl 的部分其运行时依赖在 Dockerfile 中声明包括mysql-client与postgresql-client——这印证了迁移脚本需要同时与新旧两套数据库交互。第七步可选卸载 MySQL如果 MySQL 是打包安装时自动装上的、且服务器上除 OpenProject 外不再有其它应用使用 MySQL迁移完成后可以卸载 MySQL 相关软件包。先用下面的命令检查需要移除的包dpkg -l | grep mysql保留libmysqlclient-devRuby 的 mysql 适配器编译依赖它其余按需移除。以下是移除 MySQL 5.7 的示例[roothost] apt-get remove mysql-server [roothost] openproject config:unset MYSQL_DATABASE_URL卸载前请务必注意以下风险OpenProject 仍然依赖mysql-common及其它 MySQL 开发库来编译mysql2gem用于与 MySQL 数据库通信由于 apt 的依赖管理当你尝试卸载mysql-common时openproject会被列为将被连带卸载的依赖包确认卸载列表时务必小心误确认可能导致 OpenProject 本身被一并删除。如果你仍希望保留与 MySQL 相关的库文件建议不要卸载mysql-common及编译链相关的开发包。第八步运行 openproject reconfigure 完成切换数据迁移完成后还需要让打包安装重新走一遍配置流程以移除 MySQL 相关配置openproject reconfigure在数据库安装界面中务必选择skip跳过其余配置项保持原值、直接按enter确认即可。配置流程跑完后你的 OpenProject 安装就正式运行在 PostgreSQL 之上了。迁移后的验证与收尾建议以下收尾步骤可以帮你确认迁移结果并规避后续风险验证服务状态reconfigure完成后用systemctl status openproject或访问 Web 界面确认服务正常启动工作包、项目、附件均能正常访问核对数据库连接执行openproject config:get DATABASE_URL确认输出为postgresql://...前缀的地址且MYSQL_DATABASE_URL已被清除若已执行config:unset保留备份一段时间建议在迁移后的一至两个发布周期内保留第一步生成的备份归档mysql-dump-timestamp.sql.gz、attachments-timestamp.tar.gz等确认系统稳定后再清理确认无残留 MySQL 依赖如果仍在使用 MySQL 的mysql2gem 依赖例如未来可能回连 MySQL 数据源按第七步的说明保留必要的开发库不要盲目apt autoremove。总结从 MySQL 到 PostgreSQL 的迁移本质上是一个「备份 → 用 pgloader-ccl 搬运数据 → 切换连接串 → 清理旧组件」的四步过程。OpenProject 打包安装为此提供了完整的工具链定制的pgloader-ccl解决了大库迁移的内存稳定性问题MYSQL_DATABASE_URL与DATABASE_URL的双配置设计让迁移脚本可以同时访问新旧数据库而openproject reconfigure则在最后一步把整套配置收敛到 PostgreSQL 上。只要严格按顺序执行、保留好回滚备份整个迁移过程是安全且可重复的。【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考