代码修改
修改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内存占用非常少,测试了一下,速度还会比之前快一丢丢