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 证书
(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
PostgreSQL 安装 & 用户配置的更多相关文章
- PostgreSQL安装和配置---Ubuntu
PostgreSQL安装和配置---Ubuntu
- Ubuntu PostgreSQL安装和配置
一.安装 1.安装 使用如下命令,会自动安装最新版,这里为9.5 sudo apt-get install postgresql 安装完成后,默认会: (1)创建名为"postgres&qu ...
- ArcGIS Desktop直连PostgreSQL安装及配置图解(windows)
目录 1 PostgreSQL 11.0安装及配置 2 psqlODBC安装及配置 3 PostGIS安装及配置 4 pgAdmin4使用入门 5 空间数据导入 5.1 将PostgreSQL的bin ...
- postgresql安装及配置
目录 1. 安装 2. PostgrepSQL的简单配置 2.1 修改监听的ip和端口 2.2 修改数据库log相关的参数 2.3 内存参数 3. 数据库的基础操作 3.1 连接数据库控制台 3.2 ...
- windows下PostgreSQL 安装与配置
下载地址 https://www.postgresql.org/download/ Download the installer certified by EnterpriseDB for all s ...
- 安装Postgresql之后,创建用户 配置rails
登录 sudo su - postgres psql 1 创建Postgresql新用户,devpg是用户名,密码也是devpg, 不是超级管理员,拥有创建数据库权限,登录权限,继承拥有角色权限 cr ...
- ubuntu下postgreSQL安装配置
一.安装并配置,并设置远程登陆的用户名和密码 1.安装postgreSQL sudo apt-get update sudo apt-get install postgresql-9.4 在Ubunt ...
- centos下postgresql的安装与配置[转]
本文摘自:http://blog.chinaunix.net/uid-24846094-id-78490.html 一.安装(以root身份进行) 1.检出最新的postgresql的yum配置从ht ...
- CentOS 7 安装、配置、使用 PostgreSQL 9.5及PostGIS2.2
学习CentOS下安装使用PostgreSQL [安装过程] 1.添加RPM yum install https://download.postgresql.org/pub/repos/yum/ ...
随机推荐
- Js 与浮点数
同步发表在我的博客:jmingzi 当你学习一个知识点没有方向时,可以尝试以解决问题的角度来理解它. 例如这个知识点我们可以从以下问题开始: 你看的到 1 真的是整数 1 吗? 为什么0.1 + 0. ...
- Python中最简单快捷的输出方式
格式化输出最简单的方式之哑巴填充公式 name=ludundun age=25 print(f'hello {name},your age is {age}') 输出内容: hello ludundu ...
- java8-Stream流API
一回顾与说明 经过前面发布的三章java8的博客,你就懂得了我们为什么要用Lamda表达式,Lamda表达式的原理与函数式接口的关系,从Lamda表达式到方法引用和构造引用. 想要学Stream流你必 ...
- 《Java基础知识》Java成员变量,成员方法,构造方法和析构方法
一 成员变量 成员变量是指类的一些属性定义,标志类的静态特征,它的基本格式如下: [访问修饰符][修饰符][类型][属性名称]= [初始值] 访问修饰符:public(公共的):protected(受 ...
- LINUX网络传输的序列化和反序列化C++
来到公司实习,开始面向实习生有一个小项目,当然了,服务器就由我一个人来写了,1.0主要完成的使用纯C 写Linux下UDP的服务器框架,大部分还都是以前在学校做过的项目套用的,难度不大,经过跟大bos ...
- 一起学Vue之入门篇
概述 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...
- bossplayersCTF 1: Vulnhub Walkthrough
主机扫描: http://10.10.202.130/ <!--WkRJNWVXRXliSFZhTW14MVkwaEtkbG96U214ak0wMTFZMGRvZDBOblBUMEsK--> ...
- Gradle-任务
任务结果标签 当 Gradle 执行一个任务时,它会在控制台和 Tooling API 根据任务结果给任务打标签. 这些标签是根据任务是否有操作,是否应该执行操作,是否执行了操作以及这些操作做了哪些改 ...
- ASP.NET Aries 高级开发教程:表单检测字段是否已存(番外篇)
前言: 昨天刚好有人问了这个问题,因此就针对这个问题,补上一篇吧. 正文: 如图:在用户编辑列表中,用户名是会自动检测是否已存在的. 具体对应的Html内容如下: <label><e ...
- 在ubuntu18.04上使用OpenSSL生成自签名认证基本流程
为了使系统支持https模式,首先我们要使能ssl模式. 命令如下: sudo a2enmod ssl sudo systemctl restart apache2 接下来我们要生成一个SSL/TLS ...