環境:openSUSE Leap 42.2html
自從 Ubuntu 棄 Unity 轉 Gnome,我也就棄 Ubuntu 而轉 openSUSE 了。
Leap 的軟件版本是舊了一點(好比 Vim 還停留在 7.4),好處是穩定、優雅、省心。滾動發行版 Tumbleweed 目前還差那麼一口氣,試用以後以爲不夠穩定,並不適合平常使用。
openSUSE 的 KDE 桌面堪稱一絕,上班用 Windows、娛樂用 Mac、寫代碼用 Linux 的我,自認爲 openSUSE 的 KDE 是最好的桌面。linux
還在用 Ubuntu 的同窗,能夠參考 阮一峯 寫的 PostgreSQL 新手入門。sql
安裝客戶端:數據庫
$ sudo zypper in postgresql
安裝服務器:bash
$ sudo zypper in postgresql-server
交互式客戶端程序是 psql
,服務器程序是 postgres
。服務器
安裝完後,Linux 多了一個用戶 postgres
,可是這個用戶沒有設置密碼,如今爲它設置密碼:工具
$ sudo passwd postgres <提示輸入新的密碼>
下面切換到用戶 postgres
,而後建立數據庫簇(Cluster)。post
(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"
回到 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
只是使用數據的方式之一。