被这个破问题困扰了好几天,明明我没有在搜索语法中使用前缀搜索,但搜索结果就硬是会出现只有前缀匹配的结果,自己的测试结果和groonga文档里的结果都不一样,搞得自己怀疑是不是我的pgsql服务坏了。
挣扎了三天才发现pgroonga扩展打开了强制前缀搜索,要修改这个参数:
SET pgroonga.match_escalation_threshold = -1;
这个参数默认值为0,表示“如果主关键字的命中数为 0,则升级为松散前缀搜索”,设置为-1之后即可关闭这个功能。
被这个破问题困扰了好几天,明明我没有在搜索语法中使用前缀搜索,但搜索结果就硬是会出现只有前缀匹配的结果,自己的测试结果和groonga文档里的结果都不一样,搞得自己怀疑是不是我的pgsql服务坏了。
挣扎了三天才发现pgroonga扩展打开了强制前缀搜索,要修改这个参数:
SET pgroonga.match_escalation_threshold = -1;
这个参数默认值为0,表示“如果主关键字的命中数为 0,则升级为松散前缀搜索”,设置为-1之后即可关闭这个功能。
PostgreSQL Docker从17升级到18版本,有一些大的变动,因此升级过程需要进行一些额外的操作。
首先,17版本默认是不开启数据检验和的,因此需要先把17版本的数据库启用校验和,才能正确迁移升级到18版本。
docker run --rm -it \ --mount "type=bind,src=17版本数据库目录路径,dst=/var/lib/postgresql/data" \ postgres:17 \ pg_checksums --enable --verbose --progress -D /var/lib/postgresql/data
如果出现类似这样的错误:`pg_checksums: error: invalid segment number 0 in file name “/var/lib/postgresql/data/base/24699/pgrn.conf”`,可能是插件生成的文件此工具无法识别,暂时把它们移走,等执行完以上命令之后再移动回来。
Checksum operation completed Files scanned: 1991 Blocks scanned: 7209262 Files written: 1674 Blocks written: 7209185 pg_checksums: syncing data directory pg_checksums: updating control file Data checksum version: 1 Checksums enabled in cluster
现在数据库的校验和就开启完成了,然后就是改变数据库的目录结构,17版本以及之前的数据目录在`/var/lib/postgresql/data`中,但18版本开始,数据目录需要在以大版本号命名的子目录中,使用以下流程进行迁移:
docker run --name temp-pg-18 \ --mount "type=bind,src=pgsql数据目录/tmp,dst=/var/lib/postgresql/" \ -e POSTGRES_USER=超级用户名 \ -e POSTGRES_PASSWORD=超级用户密码 \ -e POSTGRES_DB=postgres \ -d postgres:18
容器成功运行后等十几秒钟,检查”pgsql数据目录/tmp”目录中是否已经生成了数据库文件,有了的话执行命令清除临时容器:
docker stop temp-pg-18 && docker rm temp-pg-18
mv tmp/18 ./18 rm -r tmp
docker run --rm \
--mount "type=bind,src=pgsql数据目录,dst=/var/lib/postgresql" \
--env "PGDATAOLD=/var/lib/postgresql/17/docker" \
--env "PGDATANEW=/var/lib/postgresql/18/docker" \
--env "PGUSER=超级用户名" \
tianon/postgres-upgrade:17-to-18 \
/bin/bash -c "apt update && \ #在这里执行你的依赖安装命令,如果不需要安装依赖的话可以把这个apt命令也去掉,仅占位示例用
/usr/local/bin/docker-upgrade --link"
不算安装依赖的时间,迁移过程应该很快会完成,并且给出如下提示:
Upgrade Complete
----------------
Some statistics are not transferred by pg_upgrade.
Once you start the new server, consider running these two commands:
/usr/lib/postgresql/18/bin/vacuumdb --all --analyze-in-stages --missing-stats-only
/usr/lib/postgresql/18/bin/vacuumdb --all --analyze-only
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
docker run --rm -it \ --mount "type=bind,src=pgsql数据目录,dst=/var/lib/postgresql/data" \ postgres:18 \ pg_checksums --check -D /var/lib/postgresql/data/18/docker
vacuumdb -U 超级用户名 --all --analyze-in-stages
这样基本上就完成了迁移工作。