openSUSE 安装 PostgreSQL

发布于 2017-07-03  约 9 分钟

环境:openSUSE Leap 42.2

自从 Ubuntu 弃 Unity 转 Gnome,我也就弃 Ubuntu 而转 openSUSE 了。
Leap 的软件版本是旧了一点(比如 Vim 还停留在 7.4),好处是稳定、优雅、省心。滚动发行版 Tumbleweed 目前还差那么一口气,试用之后觉得不够稳定,并不适合日常使用。
openSUSE 的 KDE 桌面堪称一绝,上班用 Windows、娱乐用 Mac、写代码用 Linux 的我,自认为 openSUSE 的 KDE 是最好的桌面。

还在用 Ubuntu 的同学,可以参考 阮一峰 写的 PostgreSQL 新手入门

安装

安装客户端:

$ sudo zypper in postgresql

安装服务器:

$ sudo zypper in postgresql-server

交互式客户端程序是 psql,服务器程序是 postgres

安装完后,Linux 多了一个用户 postgres,但是这个用户没有设置密码,现在为它设置密码:

$ sudo passwd postgres
<提示输入新的密码>

下面切换到用户 postgres,然后创建数据库簇(Cluster)。

(adam@linux) $ su postgres
<输入刚刚设置的密码>

(postgres@linux) $ initdb -D /var/lib/pgsql/data

数据库簇是放置数据库的位置,/var/lib/pgsql/data 是推荐的位置之一。

启动服务

必须先切换至 postgres 用户:

(adam@linux) $ su postgres

通过 pg_ctl 工具启动服务:

(postgres@linux) $ pg_ctl start -D /var/lib/pgsql/data
正在启动服务器进程
2017-06-25 10:11:14 CST   日志:  日志输出重定向到日志收集进程
2017-06-25 10:11:14 CST   提示:  后续的日志输出将出现在目录 "pg_log" 中

pg_ctl 是一个用于初始化、启动、停止或控制 PostgreSQL 服务器的工具。

看一下进程状态:

$ ps aux | grep postgres
postgres  5765  0.0  0.2 213160 20404 pts/0    S    10:11   0:00 /usr/lib/postgresql94/bin/postgres -D /var/lib/pgsql/data
postgres  5768  0.0  0.0  68308  3112 ?        Ss   10:11   0:00 postgres: logger process
postgres  5770  0.0  0.0 213160  3628 ?        Ss   10:11   0:00 postgres: checkpointer process
postgres  5771  0.0  0.0 213160  5684 ?        Ss   10:11   0:00 postgres: writer process
postgres  5772  0.0  0.0 213160  3628 ?        Ss   10:11   0:00 postgres: wal writer process
postgres  5773  0.0  0.0 213560  6800 ?        Ss   10:11   0:00 postgres: autovacuum launcher process
postgres  5774  0.0  0.0  68304  4216 ?        Ss   10:11   0:00 postgres: stats collector process

通过 pg_ctl 查看状态:

(postgres@linux) $ pg_ctl status -D /var/lib/pgsql/data
pg_ctl: 正在运行服务器进程(PID: 5765)
/usr/lib/postgresql94/bin/postgres "-D" "/var/lib/pgsql/data"

注意非 postgres 用户下仍是没有权限查看状态的:

(adam@linux) $ pg_ctl status -D /var/lib/pgsql/data
pg_ctl: 无法访问目录 "/var/lib/pgsql/data": 权限不够

为了避免每次都用 -D 选项指定数据库簇的目录,现添加环境变量 PGDATA
打开 .bashrc,添加如下两行:

# PostgreSQL database cluster directory.
export PGDATA=/var/lib/pgsql/data

下次再用 pg_ctl 时就不需指定 -D 了。

(postgres@linux) $ pg_ctl status
pg_ctl: 正在运行服务器进程(PID: 5765)
/usr/lib/postgresql94/bin/postgres "-D" "/var/lib/pgsql/data"

角色(Role)

回到 Linux 普通用户(比如 adam),用客户端程序 psql 尝试交互:

(adam@linux) $ psql template1
psql: 致命错误:  角色 "adam" 不存在

提示说角色不存在。
角色是 PostgreSQL 管理数据库访问权限的一个概念。

切回 postgres 用户,列出所有角色。

(postgres@linux) $ psql template1
psql (9.4.9)
输入 "help" 来获取帮助信息.

template1=# SELECT rolname FROM pg_roles;
rolname
----------
postgres
(1 行记录)

可见目前只有一个角色 postgres。
新建一个角色 adam

template1=# CREATE ROLE adam;
CREATE ROLE
template1=# SELECT  rolname FROM pg_roles;
rolname
----------
postgres
adam
(2 行记录)

再次尝试以用户 adam 连接:

(adam@linux) $ psql template1

psql: 致命错误:  不允许角色"adam" 进行登录

看来刚刚创建的角色 adam 没有 LOGIN 到数据库的权限。
重新创建角色:

template1=# DROP ROLE adam;
DROP ROLE
template1=# CREATE ROLE adam WITH LOGIN CREATEDB PASSWORD '654321';

随后,即可以角色 adam 登录了。

(adam@linux) $ psql -l
                                    资料库列表
  名称    |  拥有者  | 字元编码 |  校对规则   |    Ctype    |       存取权限
-----------+----------+----------+-------------+-------------+-----------------------
postgres  | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |
template0 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres          +
          |          |          |             |             | postgres=CTc/postgres
template1 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres          +
          |          |          |             |             | postgres=CTc/postgres
(3 行记录)

psql 通过 -U 指定角色,前面都没有指定,缺省角色即 Linux 的用户名,所以其实可以指定角色:

(adam@linux) $ psql -l -Uadam

注意,数据库角色名不必和 Linux 用户名相同。

通过 -U 选项,可以以任意角色登录数据库:

(adam@linux) $ psql -l -Upostgres

创建数据库

(adam@linux) $ createdb mydb

(adam@linux) $ psql -l

  名称    |  拥有者  | 字元编码 |  校对规则   |    Ctype    |       存取权限
-----------+----------+----------+-------------+-------------+-----------------------
mydb      | adam     | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |
...

删除数据库:

(adam@linux) $ dropdb mydb

使用数据库:

(adam@linux) $ psql mydb

当然,psql 只是使用数据的方式之一。

阅读 4.4k发布于 2017-07-03

推荐阅读
止于至善
用户专栏

好记性不如烂笔头。

77 人关注
38 篇文章
专栏主页
目录