文章

Ubuntu 20.04 安装 PostgreSQL

写于 2021-10-19 请注意实效性。

毕竟我也不是专业运维,一直以来服务器上都用宝塔面板偷懒,直到决定换成更现代化的数据库——PostgreSQL。与 MySQL 形成鲜明对比,宝塔对 PgSQL 的支持简直就是一坨💩。先罗列一下基本罪状:

  1. 安装后无法重启服务
  2. 创建数据库后实际上并没有创建
  3. 删除数据库不会删除关联的用户。
  4. ……

其中部分已经有人反馈,也被官方收录,但就是不修。无奈,还是老老实实自己安装。

本文没什么技术含量,随意记录一下而已。


安装

Ubuntu 官方仓库已经收录了 PostgreSQL,但是每个系统版本都绑定了一个特定的 PG 版本,无法手动选择。Ubuntu 20.04 绑定的是 PG 12.8 正好符合需求。如果不符合,去看看 PG 的文档添加一个源就好了。

安装非常简单,甚至比宝塔还简单。

sudo apt update
sudo apt install postgresql postgresql-contrib

其中 postgresql-contrib 是第三方贡献的额外代码,一些实用工具之类的,一并装上吧。

完成后执行下面命令检查安装情况与版本号:

sudo -u postgres psql -c "SELECT version();"

连接 PG

默认情况下 PG 会创建一个名为 postgres 的角色(也就是用户),并且与系统同名账户关联。使用此账户可以直接登录数据库。那么理论上,执行 sudo -i -u postgres 就可以切换。

然而...

sudo: unable to change directory to /home/postgres: No such file or directory
sudo: unable to execute /bin/sh: No such file or directory

原因已经写的很清楚了,那我们就来手动修复一下。执行

sudo mkdir /home/postgres
sudo chown postgres:postgres /home/postgres

这样就可以成功切换过去了。也可以 sudo -u postgres psql 切换或直接执行命令。

创建新角色与数据库

sudo -u postgres createuser --interactive

执行上面的命令来交互式地创建新角色,很傻瓜化。

然后再来创建一个数据库:

sudo -u postgres createdb your-db-name

开启远程访问

⚠️ 这么做很危险

和 MySql 不同,PG 不仅需要监听所有地址,还得改一下授权。

首先修改监听地址,默认应该是 /etc/postgresql/12/main/postgresql.conf。在 CONNECTIONS AND AUTHENTICATION 添加一行:

listen_addresses = '*'

然后修改授权,默认是 /etc/postgresql/12/main/pg_hba.conf。具体格式说明这里有完整的文档。如果要允许所有用户从任意 IP 使用密码登录任意数据库,添加这这一行:

host    all             all             all                 md5

需要注意的是这里的「授权」仅仅指的是登录,而不是真正对资源进行鉴权。即使登录了,并不代表其中的资源就可以任意访问。

最后需要重启一下服务来生效:

sudo systemctl restart postgresql

记得放开防火墙~