PostgreSQL 新创建的用户居然没有 database 权限
在宝塔面板创建了新数据库和对应的新用户,但这个用户居然没有权限。看来是创建语句没有给 owner,得手动加。
/www/server/pgsql/bin/psql -U postgresALTER DATABASE umami OWNER TO umami;为宝塔面板的 PostgreSQL 添加 pgcrypto 扩展
昨天 umami 更新 v2.20 后数据丢失 更新了 Umami,看到新出了 3.0 版本想试试。但它抛弃了 MySQL 支持得换成 PostgresSQL,今天迁移过程中发现宝塔面板安装的 PostgreSQL 版本没有包含它依赖的 pgcrypto 扩展,那就得自己来。
- 【已记录】postgresql数据库如何安装pgcrypto插件? - Linux面板 - 宝塔面板论坛 相同需求官方未解决
- 为宝塔面板预装 PostgreSQL 安装 pgcrypto 扩展 | 拾星絮语 互联网有人解决
这里就记录下最终的命令。
wget https://ftp.postgresql.org/pub/source/v18.0/postgresql-18.0.tar.gz
tar -zxvf postgresql-18.0.tar.gz
cd postgresql-18.0
./configure --with-openssl
cd contrib/pgcrypto
make
cp pgcrypto.so /www/server/pgsql/lib/
cp pgcrypto.control /www/server/pgsql/share/extension/
cp pgcrypto--*.sql /www/server/pgsql/share/extension/
/www/server/pgsql/bin/psql -U postgres
CREATE EXTENSION pgcrypto;在 PostgreSQL 18 中没有 --with-pgconfig 选项。
在 commit 中贴的 GitHub 链接引用不要产生反向链接
这是 2025 年 03 月左右探索 unfurl 和 dependabot 时的知识,现在补缺记录
如果在 commit message 中贴 GitHub Issue 的链接并 push 到 GitHub 上了,就能在那个 Issue 中产生一条 mentioned this 连结。非常好用,但有时也不希望自己垃圾项目记录个 bug 原因去污染对方仓库的 Issue 历史,毕竟这个连结还是不可删除的。
- Linking to an issue without creating a reference · community · Discussion #23123 社区讨论,提到用
www.github.com能避免创建反链 - 自动链接引用和 URL - GitHub 文档 GitHub 官方给出的解决方法是不要写
github.com,改用redirect.github.com
升级 umami v3-postgresql
主要是把 MySQL 换成 PostgresSQL。升级一方面是看到之前的 React CVE,另一方面是看到发了新版本,以及在新版本修复了 Umami IP 定位到南非 Pretoria 的问题。
按照官方指南 Migrate MySQL to PostgreSQL 做,很明显只改引号是不够的
# mysqldump --no-create-info --default-character-set=utf8mb4 --quick --skip-add-locks \-u username -p mydb > mydbdump.sql
# sed -i 's/`/"/g' mydbdump.sql
# psql -U username -d mydb < mydbdump.sql
# /www/server/pgsql/bin/psql -U umami < mydbdump.sql
ERROR: duplicate key value violates unique constraint "_prisma_migrations_pkey"
DETAIL: Key (id)=(188d7f08-626d-49df-bb42-0e5cba6f49fb) already exists.
invalid command \'s-Encrypt-CRL-地址被墙','',NULL,NULL,NULL,'从
ERROR: syntax error at or near "an"
LINE 1: ...','desktop','2048x1152','zh-CN','CN','CN-SN','Xi\'an','2025-...走 CSV 方案还得每个表单独导入,太烦了没弄
据说有 pgloader 工具专门做 MySQL to Postgres — pgloader 3.6.9 documentation,然而我是 MySQL 9,pgloader 有 QMYND:MYSQL-UNSUPPORTED-AUTHENTICATION attempting to load data from mysql 8.0.4-rc. · Issue #782 · dimitri/pgloader 问题没法直接用
调研一圈还有用 ProxySQL 起代理的,我决定起个低版本容器再尝试用 pgloader 来完成 MySQL to PostgreSQL 的过程。
# PostgreSQL umami 中的表已由 umami-v2 创建好
# 启动旧版本的 MySQL
docker run -d -p 33306:3306 --name mysql_old -e MYSQL_ROOT_PASSWORD=my-secret-pw --ulimit nofile=1048576:1048576 -d mysql:5.7
# 导出 MySQL 中的数据
mysqldump --default-character-set=utf8mb4 --skip-add-locks -u root -p umami > umami.sql
# 导入到旧版本 MySQL 中
docker exec mysql_old mysql -pmy-secret-pw -e 'create database umami'
docker exec -i mysql_old mysql -pmy-secret-pw umami < umami.sql
# 清空表中的记录,后面会从 mysql 导入
/www/server/pgsql/bin/psql -U umami -c 'truncate table "_prisma_migrations"; truncate table "user";'
# MySQL to PostgreSQL
cat > umami.load << EOF
LOAD DATABASE
FROM mysql://root:my-secret-pw@localhost:33306/umami
INTO pgsql://umami:password@localhost/umami
WITH create no tables
ALTER SCHEMA 'umami' RENAME TO 'public';
EOF
docker run --rm -v ./umami.load:/tmp/umami.load --network=host ghcr.io/dimitri/pgloader:latest pgloader /tmp/umami.load我这么做是先导出再导入,有停机时间。注意操作顺序很重要,先启动 umami-v2 初始化 PostgreSQL 数据库
过程中的参考信息
create no tables避免表结构变更,否则运行起来会因为主键列格式不是uuid而是varchar(36)导致ERROR: operator does not exist: character varying = uuid- How to import into public schema · Issue #645 · dimitri/pgloader pdloader 导入到 public schema 中。
- MySQL 5.7 image failed while attempting to check config · Issue #873 · docker-library/mysql mysql-5.7 容器无法启动,
[ERROR] [Entrypoint]: mysqld failed while attempting to check config
下一步把镜像换成 docker.umami.is/umami-software/umami:postgresql-latest 就成啦