zoukankan      html  css  js  c++  java
  • PostgreSQL 安装 & 用户配置

    一、为什么选择 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

  • 相关阅读:
    iOS UITextField限制输入长度
    SpringBoot 统一异常处理
    idea+springboot+freemarker热部署
    JAVA 实现链表
    mysql 添加新用户 赋予权限
    Spring MVC 集成 Redis集群
    js获取当前日期时间及其它操作
    MySQL Error Codes MYSQL的错误代码
    js数组 删除元素
    JS table form 序列化提交
  • 原文地址:https://www.cnblogs.com/xjnotxj/p/11198255.html
Copyright © 2011-2022 走看看