PostgreSQL 10中Citext扩展控制文件无法打开问题求助
解决Fedora 28上PostgreSQL 10执行
mix ecto.migrate时citext.control找不到的问题 你遇到的核心矛盾是:PostgreSQL服务器在查找citext扩展时,错误地指向了/usr/pgsql-10/share/extension路径,但实际扩展文件存放在pg_config --sharedir返回的/usr/share/pgsql/extension目录下。下面是一步步的排查和解决思路:
1. 先确认运行中的PostgreSQL服务器来源
Fedora默认仓库的PostgreSQL包和PostgreSQL官方提供的RPM包,路径结构完全不同,这大概率是问题根源:
- 执行以下命令查看postgres进程的实际路径:
ps aux | grep postgres- 如果输出里的路径是
/usr/bin/postgres:这是Fedora默认仓库的包,它的扩展目录应该和pg_config一致,是/usr/share/pgsql/extension。 - 如果路径是
/usr/pgsql-10/bin/postgres:这是PostgreSQL官方的RPM包,默认扩展目录是/usr/pgsql-10/share/extension,但你安装的postgresql10-contrib是Fedora默认包,导致路径不匹配。
- 如果输出里的路径是
对应解决方法:
若是官方RPM包的PostgreSQL:
卸载Fedora默认的contrib包,转而安装官方仓库的对应版本:sudo dnf remove postgresql10-contrib sudo dnf install https://download.postgresql.org/pub/repos/yum/10/fedora/fedora-28-x86_64/pgdg-fedora10-10-2.noarch.rpm sudo dnf install postgresql10-contrib安装完成后,citext相关文件会自动出现在
/usr/pgsql-10/share/extension目录下。若是Fedora默认包的PostgreSQL:
说明PostgreSQL服务器的sharedir配置被错误修改了,需要调整配置文件:- 打开PostgreSQL的主配置文件(通常路径是
/var/lib/pgsql/10/data/postgresql.conf)。 - 找到
sharedir参数,将其值从/usr/pgsql-10/share改为/usr/share/pgsql。 - 重启PostgreSQL服务生效:
sudo systemctl restart postgresql-10
- 打开PostgreSQL的主配置文件(通常路径是
2. 手动验证扩展可用性
调整完成后,先通过psql手动创建citext扩展,确认问题是否解决:
psql -U 你的数据库用户名 -d 你的数据库名
在psql交互界面执行:
CREATE EXTENSION IF NOT EXISTS citext;
如果没有报错,说明扩展路径已正确,此时再运行mix ecto.migrate应该就能正常执行了。
3. 临时应急方案(不推荐长期使用)
如果你暂时不想调整包或配置,可以通过软链接让PostgreSQL找到扩展文件:
sudo mkdir -p /usr/pgsql-10/share/extension sudo ln -s /usr/share/pgsql/extension/citext.control /usr/pgsql-10/share/extension/ sudo ln -s /usr/share/pgsql/extension/citext--*.sql /usr/pgsql-10/share/extension/
但这种方法可能在后续包更新时出现冲突,优先推荐前面的正规解决方法。
内容的提问来源于stack exchange,提问作者Tae
相关产品推荐
相关产品推荐

