Featured image of post 狼的提问箱数据库已迁移至PostgreSQL

狼的提问箱数据库已迁移至PostgreSQL

阅读次数:

其实原作者很早之前就写好了打通PostgreSQL的代码,只是我一直没啥时间弄,最近趁着年末最忙的时候想找点乐子释放下压力,就干脆把数据库迁移过来了。 迁移到PostgreSQL算是大势所趋吧,目前还在运行的几个项目中基本上都在使用这个数据库(之前还有部分部署在vercel上因为无法访问的原因也一并迁移到本地部署,而MySQL上就还存着提问箱的数据没别的东西了,对于服务器资源紧张的现状来说为了提问箱单独跑个MySQL也有点多余。

我有尝试过使用pgloader一类的工具来迁移,但过程并不顺利,最后是使用navicat进行迁移的,写下这篇记录的时候数据库已迁移两个小时,在本地测试一切功能正常直接就放上线了。操作也很简单,大部分步骤参照原作者博客中的内容:再看 NekoBox:迁移、重构、展望 - Light Cube,再根据我迁移过程中碰到的问题整理而成。
1.下载安装navicat,并配置好MySQL和PostgreSQL的数据库连接信息。
2. 在PostgreSQL右键新建数据库命令新建一个名称为nekobox的数据库,然后新建一个查询来新建关系:

CREATE SCHEMA nekobox;

3.使用工具-数据传输功能,源选定为MySQL下的原数据库,目标为PostgreSQL下的nekobox数据库,模式选为nekobox,然后选定所有的表执行迁移,根据数据量大小可能花点时间。 4.检查下把迁移是否把MySQL tinyint(2) 类型迁移成了 Postgres smallint 类型,而非 bool 类型,如有就手动修改它的类型:

ALTER TABLE "nekobox"."questions"
ALTER COLUMN is_private TYPE BOOLEAN 
USING CASE 
    WHEN is_private = 0 THEN FALSE 
    ELSE TRUE 
END;

ALTER TABLE "nekobox"."censor_logs"
ALTER COLUMN pass TYPE BOOLEAN 
USING CASE 
    WHEN pass = 0 THEN FALSE 
    ELSE TRUE 
END;

5.解决迁移过程中没有把自增序列迁移过来的问题:

-- 1. 查看当前最大 ID(先确认数据)
SELECT MAX(id) FROM "nekobox".users;
-- 2. 创建序列并设置起始值(假设最大 id 是 1000)
CREATE SEQUENCE "nekobox".users_id_seq START WITH 1001;
-- 3. 将序列绑定到 id 列
ALTER TABLE "nekobox".users 
ALTER COLUMN id SET DEFAULT nextval('nekobox.users_id_seq');
-- 4. 将序列的所有权给表(表删除时序列也删除)
ALTER SEQUENCE "nekobox".users_id_seq OWNED BY "nekobox".users.id;

6.因为更新之后的源码已经不需要content_censor_passanswer_censor_pass的数据,还需要手动删除:

ALTER TABLE questions DROP COLUMN IF EXISTS content_censor_pass;
ALTER TABLE questions DROP COLUMN IF EXISTS answer_censor_pass;

修改完以上内容之后,clone源码到本地重新编译就正常运行了。

本博客已稳定运行
使用 Hugo 构建