代码修改

修改halo代码,添加postgres的数据库驱动

在build.gradle文件中添加

runtimeOnly "org.postgresql:postgresql"

修改代码

将halo代码内所有的@Lob注解删除,因为这个注解和postgres匹配的是mysql的longtext类型,postgres没有这个类型,用的是text,所以有点不兼容,需要删除。

编译源码

docker run --rm  -v "$PWD":/home/gradle/project -w /home/gradle/project gradle:7.6-jdk11-alpine gradle build -x test

这里使用docker中的gradle编译,因为halo至少需要jdk11才能编译,用docker比较省事

打包docker镜像

进入项目目录,执行

docker build -t local_halo .

修改docker-compose配置

将halo_server的image改成local_halo
修改halo_server的数据库连接配置部分

- SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.postgresql.Driver
- SPRING_DATASOURCE_URL=jdbc:postgresql://halo_postgres:5432/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=password

增加postgres数据库配置

halo_postgres:
    image: postgres
    container_name: halo_postgres
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./postgres:/var/lib/postgresql/data
    ports:
      - "0.0.0.0:5432:5432"	#为了方便连接进行数据迁移,为了安全,后续应该删除
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=halodb
      - PGDATA=/var/lib/postgresql/data/pgdata

数据迁移

使用pgloader一行命令搞定mysql到pg的数据迁移

docker run --rm -it dimitri/pgloader:latest pgloader mysql://myuser:password@myhost/dbname pgsql://pguser:password@pghost/dbname

默认会迁移到halodb schema,可以选择手动改一下改成public,因为如果未指定schema默认是使用public的

修改postgre表id自增

使用函数将所有id改成自增,并且初始值使用该表的最大值+1

CREATE OR REPLACE FUNCTION convert_id_to_auto_increment() RETURNS VOID AS $$
DECLARE
    table_record RECORD;
    column_exists BOOLEAN;
    max_id INT;
BEGIN
    -- 获取数据库中的所有表名
    FOR table_record IN (SELECT table_name FROM information_schema.tables WHERE table_schema='public') LOOP
        -- 检查表是否存在名为 'id' 的列
        column_exists := EXISTS (
            SELECT 1 FROM information_schema.columns WHERE table_name = table_record.table_name AND column_name = 'id'
        );

        IF column_exists THEN
            -- 移除现有的默认值
            EXECUTE 'ALTER TABLE ' || table_record.table_name || ' ALTER COLUMN id DROP DEFAULT;';
            
            -- 获取表的最大 id 值
            EXECUTE 'SELECT COALESCE(MAX(id), 0) FROM ' || table_record.table_name INTO max_id;
            
            -- 修改 id 列为自增 id 字段,并设置初始值为最大 id 值 + 1
            EXECUTE 'ALTER TABLE ' || table_record.table_name || ' ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (START WITH ' || (max_id + 1) || ');';
            
            RAISE NOTICE 'Modified table %: ''id'' column changed to auto-increment with initial value %.', table_record.table_name, (max_id + 1);
        ELSE
            RAISE NOTICE 'Skipped table %: ''id'' column not found.', table_record.table_name;
        END IF;
    END LOOP;
END;
$$ LANGUAGE plpgsql;



SELECT convert_id_to_auto_increment();

资源占用

可以看到postgres内存占用非常少,测试了一下,速度还会比之前快一丢丢
image