一、为什么选择 PostgreSQL


自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选。

MySQL被oracle收购,innodb随之被oracle控制。

二、安装


1、MacOS

最方便的方法是安装 PostgreSQL.app

2、Linux (CentOS 7)

(1)安装

官网:https://www.postgresql.org/download/linux/redhat/

以安装最新版 v12 为例

备注:

1、bin路径:/usr/pgsql-12/bin

2、配置/数据 路径:/var/lib/pgsql/12/data

若不知道配置文件路径,可在 PostgreSQL CLI 里输入:SHOW config_file ;

(2)启动
systemctl start postgresql-12
(3)本地访问

先登录 shell (以 postgres 用户为例):

sudo -i -u postgres

or

sudo su - postgres

然后,输入:

# 以当前登录的 linux 用户名为数据库名 (这点跟 mysql 不一样,必须得先指定登录的数据库)
psql # 手动指定数据库名
psql -d postgres

想退出:

\q

解释:

1、安装成功后,PostgreSQL 会自动创建一个默认用户(属于最高权限 Superuser),名称为 postgres,密码为空。但是不支持远程登录(报错:psql: fe_sendauth: no password supplied),必须设置密码后才行(普通用户也适应这个规则)。

PostgreSQL 早期名称叫 postgres,后来在某个版本更新后就改名成了现在的 PostgreSQL。

2、PostgreSQL 每创建一个新用户,都会生成一个新的对应的 linux 同名用户。默认,登录此用户的 shell ,去执行psql 无需密码 ( 本质上是因为 pg_hba.conf 的配置,下面会详细介绍这个文件 )

PostgreSQL 这种通过将 Linux 用户与PostgreSQL 帐户相关联来处理身份验证的方式,被称为 “对等”身份验证

(4)开启远程访问

拓展 —— pg_hba.conf 配置文件

HBA 的意思是 host-based authentication (基于主机的认证)。

该文件用于控制访问安全性,管理客户端对于PostgreSQL服务器的访问权限。

sudo vi /var/lib/pgsql/data/pg_hba.conf

示例文件:

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication postgres peer
host replication postgres 127.0.0.1/32 ident
host replication postgres ::1/128 ident

参数解释:

① 连接方式 (type)

  • local:Unix 域套接字
  • host:TCP/IP (包含 ssl + 非 ssl)
  • hostssl:TCP/IP (仅 ssl)
  • hostnossl:TCP/IP (非 ssl)

② 数据库 (database)

  • all:表明该记录匹配所有数据库;
  • sameuser:表示如果被请求的数据库和请求的用户同名,则匹配;
  • samegroup:表示请求的用户必须是一个与数据库同名的组中的成员;
  • replication:表示匹配一条replication连接,它不指定一个特定的数据库,一般在流复制中使用;
  • 在其他情况里,这就是一个特定的 PostgreSQL 数据库的名字。 我们可以通过用逗号分隔的方法声明多个数据库。

③ 用户名 (user)

  • all:表明它匹配于所有用户
  • 否则,它就是特定 PostgreSQL 用户的名字,多个用户名可以通过用逗号分隔的方法声明,在名字前面加上+代表匹配该用户组的所有用户。

④ 主机地址 (address)

  • all:表明它匹配于所有IP地址;
  • samehost:匹配服务器自己所有的IP地址;
  • samenet:匹配服务器直接接入的子网;
  • 在其他情况里,指定匹配的客户端的地址,它可以是一个主机名,一个IP地址范围。

注:本选项只能在连接方式是 host,hostssl 或者 hostnossl 的时候指定。

⑤ 认证方法(authentication method)

  • trust:无条件地允许联接。
  • reject:无条件拒绝。
  • md5:要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。
  • password:和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。
  • peer:获取客户端的操作系统的用户名并判断他是否匹配请求的数据库名,这只适用于unix socket 连接。
  • ident:和"peer"一样,但只适用于 TCP/IP 连接。

注:默认情况下,PostgreSQL 通过将 Linux 用户帐户与PostgreSQL帐户相关联来处理身份验证。这称为“对等”身份验证。(即 peer / ident)

方法一:直连(不推荐)

1、修改配置

① 修改pg_hba.conf

最后一行加上:

host  all  all  0.0.0.0/0   md5

② 修改postgresql.conf

放开注释:

listen_addresses = '*'

2、连接

psql -U postgres -d postgres -h xxx.xxx.xxx.xxx -W

方法二:通过 ssh

1、修改配置

① 修改pg_hba.conf

修改此处,把 认证方法从 indent 变成 md5 :

# IPv4 local connections:
host all all 127.0.0.1/32 md5

2、连接

先连接 ssh,再通过 localhost 连接 PG。

方法三:通过 SSL 证书

略 (使用PostgreSQL设置SSL)

(5)当前登录用户

查看:

select current_user;

切换:

\c next_user;

(6)当前数据库

查看:

select current_database();

切换:

\c - next_db;

三、角色管理


从版本8.1开始,PostgreSQL使用角色概念来合并用户概念

1、默认用户

PostgreSQL 默认会有一个 Linux user 和 PostgreSQL user 都叫 postgres。这点上面有详细提到,这里不再赘述。

除了访问数据库软件之外,不要将 Linux 的 ”postgres“ 用户用于其他任何用户。这是一个重要的安全考虑因素。

2、管理用户

(1)查看所有用户

\du

                                                            List of roles
Role name | Attributes | Member of ----------------------+------------------------------------------------+---------------------------------------
-----------------------
pg_monitor | Cannot login | {pg_read_all_settings,pg_read_all_stat
s,pg_stat_scan_tables}
pg_read_all_settings | Cannot login | {}
pg_read_all_stats | Cannot login | {}
pg_signal_backend | Cannot login | {}
pg_stat_scan_tables | Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication | {}
(2)创建新用户

建议:为每个应用程序创建单独的角色(Linux user + PostgreSQL user)。

CREATE ROLE role_name;

CREATE USER role_name; 可以默认给用户加上 LOGIN 权限。

角色创建时定义权限:

CREATE ROLE role_name WITH LOGIN;

角色权限的详细介绍看下面。

(3)删除用户

DROP ROLE role_name;

DROP ROLE IF EXISTS role_name; (不报错写法)

(4)用户权限

查看所有的权限种类:

\h CREATE ROLE

Command:     CREATE ROLE
Description: define a new database role
Syntax:
CREATE ROLE name [ [ WITH ] option [ ... ] ] where option can be: SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| CREATEUSER | NOCREATEUSER
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| CONNECTION LIMIT connlimit
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| VALID UNTIL 'timestamp'
| IN ROLE role_name [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid

更改用户权限:

ALTER ROLE role_name WITH attribute_options;

PASSWORD 也算权限的一种:ALTER ROLE role_name WITH PASSWORD 'xxxx';

3、数据操作 & owner - 所有者权限

(1) 数据库层级

PostgreSQL 的层级还是蛮深的,database -> schema -> object(table)

而 mysql 忽略了schema这个层级,就很方便。

(2) 数据库

创建:

CREATE DATABASE test_db;

CREATE DATABASE test_db OWNER role_name; (创建时指定数据库 owner)

删除:

DROP DATABASE test_db;

更改 owner:

ALTER DATABASE test_db owner to role_name;

查看 & owner 权限:

\l

                                    List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------------+----------+-----------+-------------+-------+-----------------------
postgres | postgres | SQL_ASCII | en_US.UTF-8 | C |
space_production | space | SQL_ASCII | en_US.UTF-8 | C | =Tc/space +
| | | | | space=CTc/space
template0 | postgres | SQL_ASCII | en_US.UTF-8 | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | en_US.UTF-8 | C | =c/postgres +
| | | | | postgres=CTc/postgres
(3) Schema

创建:

删除:

更改 owner:

ALTER SCHEMA "public" OWNER TO role_name;

查看 & owner 权限:

\dnS

        List of schemas
Name | Owner
--------------------+----------
information_schema | postgres
pg_catalog | postgres
pg_temp_1 | postgres
pg_temp_3 | postgres
pg_temp_4 | postgres
pg_toast | postgres
pg_toast_temp_1 | postgres
pg_toast_temp_3 | postgres
pg_toast_temp_4 | postgres
public | test
(4) 数据表

创建:

删除:

更改 owner:

ALTER TABLE test_table OWNER to role_name;

查看:

\d

                      List of relations
Schema | Name | Type | Owner
--------+--------------------------------+----------+---------
public | Admins | table | test
public | Admins_id_seq | sequence | test

4、 访问权限 - Access privileges

初始状态只有 owner(或超级用户) 有所有权限。但要允许其他角色拥有权限(或部分权限),必须授予。

(1)添加

GRANT permission_type on test_table to role_name;

permission_type : ALL、CRUD(如UPDATE) 、CONNECT……

role_name:可以替换成 PUBLIC 代表所有用户,或者 group 用户。

(2)查看

\z

                                         Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+--------------------------------+----------+-------------------+--------------------------
public | Admins | table | |
public | Admins_id_seq | sequence | |

(3)删除

REVOKE 替换上面的 GRANT

5、组 & 子角色

(1) 先创建组角色
CREATE ROLE temporary_users;
(2) 再创建组角色的成员
GRANT temporary_users TO test_user_1;
GRANT temporary_users TO test_user_2;

于是,test_user_1 和 test_user_2 这两个用户可以通过操纵“temporary_users”组角色来管理其权限,而不是单独管理每个成员。很方便。

查看组角色情况:

\du

                                    List of roles
Role name | Attributes | Member of
-----------------+------------------------------------------------+-------------------
test_user_1 | | {temporary_users}
postgres | Superuser, Create role, Create DB, Replication | {}
temporary_users | Cannot login | {}
test_user_2 | | {temporary_users}
(3) 组角色成员 获取 组角色 的权限

方法一:set role

SET ROLE temporary_users;
RESET ROLE;

如果是“postgres”用户(即超级用户),即便我们不是该组的成员,我们也可以使用“set role”。

方法二: 用 alter role ,避免以后每次都要 set role

ALTER ROLE test_user_2 INHERIT;
(4) 删除组角色

就跟删除普通的用户一样:

DROP ROLE temporary_users;

如果此用户拥有一些数据,请先转移 owner,再删除用户,不然会失败报错。

删除组成员不会把属于组成员的成员删除。


参考资料

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-centos-7

最新文章

  1. Linux 基础
  2. I Count Two Three---hdu5878(打表+二分)
  3. 经过各种坑之后centos+ uwsgi + nginx +django 终于配好了
  4. clearfix
  5. 学习练习 java输入输出流 练习题1
  6. django1.6之template基础用法
  7. zabbix邮件报警脚本(Python)
  8. Django request 常用属性
  9. overflow: hidden用法,不仅仅是隐藏溢出
  10. Android 原生listview item伸展收缩效果
  11. 解决vagrant up启动失败,停留在Booting VM...过程的方法
  12. webapp填坑记录[更新中]
  13. Spring.Net 简单实例-02(属性注入)
  14. 在IOS应用中打开另外一个应用的解决方案
  15. 如何让其他电脑访问到自己的Django项目
  16. webpack优化记录
  17. DQL完整语法及示例
  18. Lombok快速上手(安装、使用与注解参数)
  19. 来自Google的TCP BBR拥塞控制算法解析
  20. pom.xml一个简单配置

热门文章

  1. python爬虫--模拟12306登录
  2. drf源码分析系列---权限
  3. Ubuntu上面安装sqlite3可视化数据库软件
  4. LeetCode刷题总结-二分查找和贪心法篇
  5. SpringBoot内容聚合
  6. Teigha.net实体属性注释
  7. SAP B1:水晶报表中用Code128制作条型码的方法
  8. Nginx 安装、配置及相关介绍
  9. 主说明:自动Undo管理的故障排除指南(Doc ID 1579081.1)
  10. IT兄弟连 HTML5教程 CSS3属性特效 2D变换2