PostgreSQL 15新手入门指南

发表时间: 2024-01-02 15:49

#来点儿干货#


一、PG简介

PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。

PostgreSQL 开发者把它念作 post-gress-Q-L

PostgreSQL 的 Slogan 是 "世界上最先进的开源关系型数据库"。“开源界的Oracle”,去O首选

  • PostgreSQL官网

https://www.postgresql.org/

  • PostgreSQL中文社区

http://www.postgres.cn/v2/home

  • 全球数据库排行

https://db-engines.com/en/

  • 国产数据库排行

https://www.modb.pro/dbRank

1. PG的历史

PostgreSQL最初设想于1986年,当时被叫做Berkley Postgres Project。


该项目一直到1994年都处于演进和修改中,直到开发人员Andrew Yu和Jolly Chen在Postgres中添加了一个SQL(Structured Query Language,结构化查询语言)翻译程序,该版本叫做Postgres95,在开放源代码社区发放。开始以社区的形式运作。


1996年,再次对Postgres95做了较大的改动,并将其作为PostgresSQL6.0版发布。该版本的Postgres提高了后端的速度,包括增强型SQL92标准以及重要的后端特性(包括子选择、默认值、约束和触发器)。

2005年,发布8.0版本,开始支持windows系统环境

PostgreSQL 9.0 :支持64位windows系统,异步流数据复制、Hot Standby;

PostgreSQL 9.1 :支持数据同步复制,unlogged tabels、serializable snapshot isolation、FDW 外部表。

此版本后,PostgreSQL 开始得到中国多个行业用户的关注,开始有应用于电信、保险、制造业等边缘系统。

目前生产环境主流的版本是PostgreSQL 12

2021-09-30,PostgreSQL全球开发组宣布,功能最为强大的开源数据库,PostgreSQL 14版本正式发布!

2. PG的社区

PG为什么没有被商业公司控制?

2.1. 纯社区


他们为什么要贡献核心代码?


最终用户

  • 希望社区长久,期望可以享受免费的、可持续发展的、开源的、不被任何商业公司、不被任何国家控制的企业级数据库。去O,去DB2 ,去Sybase;
  • 不靠数据库赚钱;
  • PG用到的人越多,越多人背书,使用越靠谱(事实也是如此);
  • 抛砖引玉,企业投入2个研发持续贡献(一年可能一两百万),实际上整个PG社区有数千人在贡献,对最终用户来说,简直赚到了。使用商业数据库,除了LICENSE等成本,依旧需要投管理、研发、外包资源,一年数千万甚至上亿,公司越大,越有动力去贡献社区。从趋势来看,给PG贡献代码的大客户只会越来越多;


云厂商

  • 开源数据库与云厂商发生利益冲突,纷纷改协议;
  • 数据库市场巨大;
  • 自研是最佳选择,但是自研有一些问题:譬如需要培养生态,需要市场背书,需要大量研发资源,可能需要重复造轮子;
  • BASE PG的好处:
    1. 免去自己培养生态
    2. 避免重复造轮子
    3. PG的代码基础非常不错(开源界的Oracle)
    4. 防止其他厂商控制PG失去市场主导能力(AWS,google,IBM,微软都已成为PG社区的赞助商)


数据库厂商

  • 推一款新的商业数据库,通常都需要背书,小厂产品,谁为你背书?
    1. 有技术的厂商,很难挑战已有的数据库市场格局
    2. 有渠道的厂商,需要抓住窗口期,快速占领市场,避免重复造轮子。

需要一款可以无法律风险,二次分发的开源数据库,唯有PG,可以贡献核心代码,社区所有的用户都可以为之背书。


数据库服务|DaaS服务提供商

  • 开源产品的服务提供商,能力如何体现?

当然是你的架构能力,优化能力,管理能力,FIX BUG的能力

最好能贡献核心代码,有PG为你背书

2.2. 完善的组织结构

2.3. 开源许可独特性

Postgres遵守BSD许可证发行,可以使开发者们得以获取源代码并进一步开发系统。

BSD许可协议(英语:Berkeley Software Distribution license)是自由软件中使用最广泛的许可协议之一。BSD就是遵照这个许可证来发布,也因此而得名 BSD许可协议。

  • BSD包最初所有者是加州大学的董事会,这是由于 BSD 源自加州大学伯克利分校。BSD开始后,BSD许可协议得以修正,使得以后许多BSD变种,都采用类似风格的条款。
  • 跟其他条款相比,从GNU通用公共许可证(GPL)到限制重重的著作权(Copyright),BSD许可证比较宽松,甚至跟公有领域更为接近。"Take it down to the copy center and make as many copies as you want"[1]。可以说,GPL强迫后续版本必须一样是自由软件,BSD的后续版本可以选择要继续是BSD或其他自由软件条款或封闭软件等等


众所周知,MySQL被Oracle所控制,MySQL同时使用了GPL和一种商业许可(称为双重许可)。

GPL(General Public license)是公共许可,遵循了GPL的软件是公共的。如果某软件使用了GPL软件,那么该软件也需要开源,如果不开源,就不能使用GPL软件,这和是否把该软件商用与否是没关系的。

如果无法满足GPL,就需要获得商业许可,通过与Oracle公司联系,制定解决方案,受Oracle公司约束。


同为开源软件,PostgreSQL源码使用自由友好、商业应用不受任何公司实体所控制,而MySQL则在一定程度上有所限制。

3. PostgreSQL与MySQL的比较

PostgreSQL相对于MySQL的优势

  1. 在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨。


  1. 对表连接支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强。


  1. PG主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。


  1. PG的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。


  1. PostgreSQL支持JSON和其他NoSQL功能,如本机XML支持和使用HSTORE的键值对。它还支持索引JSON数据以加快访问速度,特别是10版本JSONB更是强大。


  1. PostgreSQL完全免费,而且是BSD协议,如果你把PostgreSQL改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了PostgreSQL数据库不会被其它公司控制。相反,MySQL现在主要是被Oracle公司控制,即使社区版也使用的GPL协议。

MySQL相对于PG的优势

  1. innodb的基于回滚段实现的MVCC机制,相对PG新老数据一起存放的基于XID的MVCC机制,是占优的。新老数据一起存放,需要定时触发VACUUM,会带来多余的IO和数据库对象加锁开销,引起数据库整体的并发能力下降。而且VACUUM清理不及时,还可能会引发数据膨胀。


  1. MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、删改操作,但是对表结构设计存在约束。


  1. MySQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作。


  1. MySQL相对于PG在国内的流行度更高,PG在国内显得就有些落寞了。


  1. MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,myisam适合静态数据的查询场景。

总结

从应用场景来说,PG更加适合严格的企业应用场景(比如金融、电信、ERP、CRM),但不仅仅限制于此,PostgreSQL的json,jsonb,hstore等数据格式,特别适用于一些大数据格式的分析;而MySQL更加适合业务逻辑相对简单、数据可靠性要求较低的互联网场景(比如google、facebook、alibaba),当然现在MySQL的在innodb引擎的大力发展,功能表现良好


扩展阅读

  1. PostgreSQL 是中国第一的开源数据库?

https://cloud.tencent.com/developer/article/1847734

  1. 解密:为什么国产数据库使用PostgreSQL而不是MySQL

https://www.iidba.com/thread-290491-1-1.html

  1. 神仙打架:PG 和 MySQL 到底哪个更好用?

https://dbaplus.cn/news-11-3235-1.html

二、PostgreSQL的下载安装

1. Windows 上安装 PostgreSQL

1.1. 下载安装

  1. 访问官网下载地址,下载最新发布的PostgreSQL 14

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads


  1. 双击下载安装包,开始安装


  1. 安装界面


  1. 单击Next,修改安装路径


  1. 选择安装组件,不懂的选就是全部勾上:


  1. 设置数据库数据存放路径


  1. 设置超级用户的密码


  1. 设置端口号,可以直接用默认就行


  1. 直接点“Next”,使用默认配置


  1. 直接点“Next”


  1. 点 Next


  1. 去掉勾选,直接点 Finish


  1. 打开 pgAdmin 4


  1. 控制面板如下


  1. 打开 SQL Shell(psql)


  1. 输入相关设置进入

1.2. 远程访问

1. 打开postgresql安装目录的data子目录


2. 修改pg_hba.conf文件:在IPV4部分添加新的一行

host    all             all             0.0.0.0/0               scram-sha-256


3. 控制面板-->系统与安全-->Windows防火墙,关闭防火墙。

4.重启服务:右键,重启服务


2. Linux上安装PostgreSQL

2.1. 下载安装

  1. 访问官网下载地址

https://www.postgresql.org/download/


  1. 选择相应的版本和平台
  1. 命令行下载
# Install the repository RPM:sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# Install PostgreSQL:sudo yum install -y postgresql15-server# Optionally initialize the database and enable automatic start:sudo /usr/pgsql-15/bin/postgresql-15-setup initdbsudo systemctl enable postgresql-15sudo systemctl start postgresql-15


  1. 导入yum源
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm


  1. 安装PostgreSQL服务
sudo yum install -y postgresql15-server


  1. 初始化数据库
sudo /usr/pgsql-14/bin/postgresql-15-setup initdb


  1. 启动PostgreSQL服务
#设置PostgreSQL服务为开机启动sudo systemctl enable postgresql-15#启动PostgreSQL服务sudo systemctl start postgresql-15

2.2. 修改postgres账号密码

PostgreSQL安装成功之后,会默认创建一个名为postgres的Linux用户,初始化数据库后,会有名为postgres的数据库,来存储数据库的基础信息,例如用户信息等等,相当于MySQL中默认的名为mysql数据库。

postgres数据库中会初始化一名超级用户postgres

为了方便我们使用postgres账号进行管理,我们可以修改该账号的密码


  1. 进入PostgreSQL命令行
  2. 通过su命令切换linux用户为postgres会自动进入命令行
su postgres


  1. 启动SQL Shell
psql


  1. 修改密码
ALTER USER postgres WITH PASSWORD 'NewPassword';


2.3. 配置远程访问

  1. 开放端口
sudo firewall-cmd --add-port=5432/tcp --permanentsudo firewall-cmd --reload


  1. 修改IP绑定
#修改配置文件vi /var/lib/pgsql/15/data/postgresql.conf#将监听地址修改为*#默认listen_addresses配置是注释掉的,所以可以直接在配置文件开头加入该行listen_addresses='*'


  1. 允许所有IP访问
#修改配置文件vi /var/lib/pgsql/15/data/pg_hba.conf#在问价尾部加入host  all  all 0.0.0.0/0 md5


  1. 重启PostgreSQL服务
#重启PostgreSQL服务sudo systemctl restart postgresql-15

三、SQL shell基本使用(15)

1. 一般性

\copyright 显示PostgreSQL的使用和发行许可条款

\crosstabview [COLUMNS] execute query and display result in crosstab

\errverbose 以最冗长的形式显示最近的错误消息

\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);

\g with no arguments is equivalent to a semicolon

\gdesc 描述查询结果,而不执行它

\gexec 执行策略,然后执行其结果中的每个值

\gset [PREFIX] execute query and store result in psql variables

\gx [(OPTIONS)] [FILE] 就像\g,但强制扩展输出模式

\q 退出 psql

\watch [SEC] 每隔SEC秒执行一次查询

2. 帮助

\? [commands] 显示反斜线命令的帮助

\? options 显示 psql 命令行选项的帮助

\? variables 显示特殊变量的帮助

\h [NAME] SQL命令语法上的说明,用*显示全部命令的语法说明

3. 查询缓存区

\e [FILE] [LINE] 使用外部编辑器编辑查询缓存区(或文件)

\ef [FUNCNAME [LINE]] 使用外部编辑器编辑函数定义

\ev [VIEWNAME [LINE]] 用外部编辑器编辑视图定义

\p 显示查询缓存区的内容

\r 重置(清除)查询缓存区

\w 文件 将查询缓存区的内容写入文件

4. 输入/输出

\copy ... 执行 SQL COPY,将数据流发送到客户端主机

\echo [-n] [STRING] 将字符串写到标准输出(-n表示没有换行符)

\i 文件 从文件中执行命令

\ir FILE 与 \i类似, 但是相对于当前脚本的位置

\o [文件] 将全部查询结果写入文件或 |管道

\qecho [-n] [STRING] 将字符串写入\o输出流(-n表示无换行)

\warn [-n] [STRING] 将字符串写入标准错误(-n 表示无换行)

5. 条件

\if EXPR 开始条件块

\elif EXPR 当前条件块内的备选方案

\else 当前条件块内的最终备选方案

\endif 条件块的结尾

6. 资讯性

(选项: S = 显示系统对象, + = 其余的详细信息)

\d[S+] 列出表,视图和序列

\d[S+] 名称 描述表,视图,序列,或索引

\da[S] [模式] 列出聚合函数

\dA[+] [模式] 列出访问方法

\dAc[+] [AMPTRN [TYPEPTRN]] 列出运算符

\dAf[+] [AMPTRN [TYPEPTRN]] 列出运算符集合

\dAo[+] [AMPTRN [OPFPTRN]] 列出运算符集合

\dAp[+] [AMPTRN [OPFPTRN]] 列出运算符集合所支持的功能

\db[+] [模式] 列出表空间

\dc[S+] [模式] 列表转换

\dconfig[+] [PATTERN] 列出配置参数list configuration parameters

\dC[+] [模式] 列出类型强制转换

\dd[S] [模式] 显示没有在别处显示的对象描述

\dD[S+] [模式] 列出共同值域

\ddp [模式] 列出默认权限

\dE[S+] [模式] 列出引用表

\des[+] [模式] 列出外部服务器

\det[+] [模式] 列出引用表

\deu[+] [模式] 列出用户映射

\dew[+] [模式] 列出外部数据封装器

\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]

列出 [only
agg/normal/procedure/trigger/window] 函数

\dF[+] [模式] 列出文本搜索配置

\dFd[+] [模式] 列出文本搜索字典

\dFp[+] [模式] 列出文本搜索解析器

\dFt[+] [模式] 列出文本搜索模版

\dg[S+] [模式] 列出角色

\di[S+] [模式] 列出索引

\dl[+] list large objects, same as \lo_list

\dL[S+] [模式] 列出所有过程语言

\dm[S+] [模式] 列出所有物化视图

\dn[S+] [模式] 列出所有模式

\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]

列出运算符

\dO[S+] [模式] 列出所有校对规则

\dp [模式] 列出表,视图和序列的访问权限

\dP[itn+] [PATTERN] 列出[仅表/索引]分区关系[n=nested]

\drds [ROLEPTRN [DBPTRN]] list per-database role settings

\dRp[+] [模式] 列出复制发布

\dRs[+] [模式] 列出复制订阅

\ds[S+] [模式] 列出序列

\dt[S+] [模式] 列出表

\dT[S+] [模式] 列出数据类型

\du[S+] [模式] 列出角色

\dv[S+] [模式] 列出视图

\dx[+] [模式] 列出扩展

\dX [PATTERN] 列出扩展统计信息

\dy[+] [PATTERN] 列出所有事件触发器

\l[+] [模式] 列出所有数据库

\sf[+] FUNCNAME 显示一个函数的定义

\sv[+] VIEWNAME 显示一个视图的定义

\z [模式] 和\dp的功能相同

7. 大对象

\lo_export LOBOID FILE write large object to file

\lo_import FILE [COMMENT] read large object from file

\lo_list[+] list large objects

\lo_unlink LOBOID delete a large object

8. 格式化

\a 在非对齐模式和对齐模式之间切换

\C [字符串] 设置表的标题,或如果没有的标题就取消

\f [字符串] 显示或设定非对齐模式查询输出的字段分隔符

\H 切换HTML输出模式 (目前是 关闭)

\pset [NAME [VALUE]] 设置表输出选项

(border|columns|csv_fieldsep|expanded|fieldsep|

fieldsep_zero|footer|format|linestyle|null|

numericlocale|pager|pager_min_lines|recordsep|

recordsep_zero|tableattr|title|tuples_only|

unicode_border_linestyle|unicode_column_linestyle|

unicode_header_linestyle

\t [开|关] 只显示记录 (目前是关闭)

\T [字符串] 设置HTML <表格>标签属性, 或者如果没有的话取消设置

\x [on|off|auto] 切换扩展输出模式(目前是 关闭)

9. 连接

\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}

连接到新数据库(当前是"postgres")

\conninfo 显示当前连接的相关信息

\encoding [编码名称] 显示或设定客户端编码

\password [USERNAME] 安全地为用户更改口令

10. 操作系统

\cd [目录] 更改目前的工作目录

\getenv PSQLVAR ENVVAR fetch environment variable

\setenv NAME [VALUE] 设置或清空环境变量

\timing [开|关] 切换命令计时开关 (目前是关闭)

\! [命令] 在 shell中执行命令或启动一个交互式shell

11. 变量

\prompt [文本] 名称 提示用户设定内部变量

\set [名称 [值数]] 设定内部变量,若无参数则列出全部变量

\unset 名称 清空(删除)内部变量

四、PostgreSQL的基本使用

1. 登录

#psql -h 服务器 -U 用户名  -d 数据库 -p 端口地址  // -U 是大写psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432$ psql (连接数据库,默认用户和数据库都是postgres)#	相当于系统用户postgres以同名数据库用户的身份,登录数据库,这是不用输入密码的。# 如果一切正常,系统提示符会变为"postgres=#",# 表示这时已经进入了数据库控制台。

2. 数据库操作

#创建数据库CREATE DATABASE mydb;#查看所有数据库\l#切换当前数据库\c mydb#删除数据库DROP DATABASE <dbname>

3. 数据库表操作

3.1. 数据类型

创建表格时每列都必须使用数据类型。PotgreSQL中主要有三类数据类型:

  • 数值数据类型
  • 字符串数据类型
  • 日期/时间数据类型

3.1.1. 数值

常见数值类型包括:

名字

存储长度

描述

范围

smallint

2 字节

小范围整数

-32768 到 +32767

integer

4 字节

常用的整数

-2147483648 到 +2147483647

bigint

8 字节

大范围整数

-9223372036854775808 到 +9223372036854775807

decimal

可变长

用户指定的精度,精确

小数点前 131072 位;小数点后 16383 位

numeric

可变长

用户指定的精度,精确

小数点前 131072 位;小数点后 16383 位

real

4 字节

可变精度,不精确

6 位十进制数字精度

double

8 字节

可变精度,不精确

15 位十进制数字精度


3.1.2. 字符串字符串类型包括

  • char(size),character(size):固定长度字符串,size 规定了需存储的字符数,由右边的空格补齐;
  • varchar(size),character varying(size):可变长度字符串,size 规定了需存储的字符数;
  • text:可变长度字符串。


3.1.3. 日期/时间

表示日期或时间的数据类型有:

  • timestamp:日期和时间;
  • date:日期,无时间;
  • time:时间;

3.1.4. 其他数据类型类型还有布尔值 boolean (true 或 false),货币数额 money 和 几何数据等。


#创建表CREATE TABLE test(id int,body varchar(100));#在表中插入数据insert into test(id,body) values(1,'hello,postgresql');#查看当前数据库下所有表\d#查看表结构,相当于desc\d test

3.1.5. 序列

PostgreSQL 使用序列来标识字段的自增长,数据类型有 smallserial、serial 和 bigserial 。这些属性类似于 MySQL 数据库支持的 AUTO_INCREMENT 属性。

SMALLSERIAL、SERIAL 和 BIGSERIAL 范围:

伪类型

存储大小

范围

SMALLSERIAL

2字节

1 到 32,767

SERIAL

4字节

1 到 2,147,483,647

BIGSERIAL

8字节

1 到 922,337,2036,854,775,807


示例

#创建表CREATE TABLE COMPANY(   ID  SERIAL PRIMARY KEY,   NAME           TEXT      NOT NULL,   AGE            INT       NOT NULL,   ADDRESS        CHAR(50),   SALARY         REAL);#插入数据INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)VALUES ( 'Paul', 32, 'California', 20000.00 );INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)VALUES ('Allen', 25, 'Texas', 15000.00 );


4. Schema

PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。

一个模式可以包含视图、索引、数据类型、函数和操作符等。

相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。

使用模式的优势:

  • 允许多个用户使用一个数据库并且不会互相干扰。
  • 将数据库对象组织成逻辑组以便更容易管理。
  • 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。

模式类似于操作系统层的目录,但是模式不能嵌套。

#创建schema: create schema myschema;create table myschema.company(   ID   INT              NOT NULL,   NAME VARCHAR (20)     NOT NULL,   AGE  INT              NOT NULL,   ADDRESS  CHAR (25),   SALARY   DECIMAL (18, 2),   PRIMARY KEY (ID));#删除schema: drop schema myschema;#删除一个模式以及其中包含的所有对象:DROP SCHEMA myschema CASCADE;

5. 如何备份PostgreSQL数据库

如果您在生产环境中使用PostgreSQL,请务必采取预防措施以确保用户的数据不会丢失。

5.1. 单数据库

PostgreSQL提供了pg_dump实用程序来简化备份单个数据库的过程。 必须以对要备份的数据库具有读取权限的用户身份运行此命令。

postgres用户身份登录:

sudo su - postgres

通过运行以下命令将数据库的内容转储到文件中。替换dbname为要备份的数据库的名称。

pg_dump dbname > dbname.bak

生成的备份文件dbname.bak可以使用scp传输到另一台主机,也可以存储在本地以供以后使用。

要演示恢复丢失的数据,请删除示例数据库并在其位置创建一个空数据库:

使用psql恢复数据库

 psql test < dbname.bak

备份格式有几种选择:

  • *.bak:压缩二进制格式
  • *.sql:明文转储
  • *.tar:tarball

注意:默认情况下,PostgreSQL将忽略备份过程中发生的任何错误。这可能导致备份不完整。要防止这种情况,您可以使用-1选项运行pg_dump命令。 这会将整个备份过程视为单个事务,这将在发生错误时阻止部分备份。


5.2. 所有数据库

由于pg_dump一次只创建一个数据库的备份,因此它不会存储有关数据库角色或其他群集范围配置的信息。 要存储此信息并同时备份所有数据库,可以使用pg_dumpall。

创建备份文件:

pg_dumpall > pg_backup.bak

从备份还原所有数据库:

psql -f pg_backup.bak postgres

示例:

#备份数据库$ pg_dump -U postgres -f /tmp/postgres.sql postgres (导出postgres数据库保存为postgres.sql)$ pg_dump -U postgres -f /tmp/postgres.sql -t test postgres (导出postgres数据库中表test的数据)$ pg_dump -U postgres -F t -f /tmp/postgres.tar postgres (导出postgres数据库以tar形式压缩保存为postgres.tar)#恢复数据库$ psql -U postgres -f /tmp/postgres.sql bk01 (恢复postgres.sql数据到bk01数据库)#pg_restore --  从pg_dump创建的备份文件中恢复PostgreSQL数据库,用于恢复由pg_dump 转储的任何非纯文本格式中的PostgreSQL数据库。$ pg_restore -U postgres -d bk01 /tmp/postgres.tar  (恢复postgres.tar数据到bk01数据库)

6. 用户操作

#创建用户并设置密码CREATE USER 'username' WITH PASSWORD 'password';CREATE USER test WITH PASSWORD 'test';#修改用户密码$ ALTER USER 'username' WITH PASSWORD 'password';#数据库授权,赋予指定账户指定数据库所有权限$ GRANT ALL PRIVILEGES ON DATABASE 'dbname' TO 'username';#将数据库 mydb 权限授权于 testGRANT ALL PRIVILEGES ON DATABASE mydb TO test;#但此时用户还是没有读写权限,需要继续授权表GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO xxx;#注意,该sql语句必须在所要操作的数据库里执行#移除指定账户指定数据库所有权限REVOKE ALL PRIVILEGES ON DATABASE mydb from test#删除用户drop user test# 查看用户\du

注意:

pg_hba.conf配置中的第一项设置的意思是:本地用户通过unix socket登陆时,使用peer方式认证。

# "local" is for Unix domain socket connections onlylocal   all             all                                     peer

peer是用PostgreSQL所在的操作系统上的用户登陆。

peer方式中,client必须和PostgreSQL在同一台机器上。只要当前系统用户和要登陆到PostgreSQL的用户名相同,就可以登陆。

在刚部署PostgreSQL之后,切换到系统的postgres用户后,直接执行psql就能进入PostgreSQL就是这个原因(当前系统用户为名postgre,PostgreSQL中的用户名也是postgre)。

在PostgreSQL中创建一个没有密码的用户:

create user local_user1;

在PostgreSQL所在的机上,创建一个同名的用户:

useradd local_user1;

切换到local_user1用户后,就可以直接通过unix_socket登陆PostgreSQL:

# su - local_user1[local_user1@10 ~]$ psql postgres     psql (9.2.24)Type "help" for help.postgres=>

注意:要指定数据库名,如果不指定默认使用与用户同名的数据库。

peer不是常用的方式!最常用的方式是通过密码远程登陆。

7. PostgreSQL 角色管理

在PostgreSQL 里没有区分用户和角色的概念,"CREATE USER" 为 "CREATE ROLE" 的别名,这两个命令几乎是完全相同的,唯一的区别是"CREATE USER" 命令创建的用户默认带有LOGIN属性,而"CREATE ROLE" 命令创建的用户默认不带LOGIN属性


7.1. 创建david 角色和sandy 用户

postgres=# CREATE ROLE david;  //默认不带LOGIN属性CREATE ROLEpostgres=# CREATE USER sandy;  //默认具有LOGIN属性CREATE ROLEpostgres=# \du                             List of roles Role name |                   Attributes                   | Member of -----------+------------------------------------------------+----------- david     | Cannot login                                   | {} postgres  | Superuser, Create role, Create DB, Replication | {} sandy     |                                                | {}postgres=# postgres=# SELECT rolname from pg_roles ; rolname  ---------- postgres david sandy(3 rows)postgres=# SELECT usename from pg_user;         //角色david 创建时没有分配login权限,所以没有创建用户 usename  ---------- postgres sandy(2 rows)postgres=#


角色属性

属性

说明

login

只有具有 LOGIN 属性的角色可以用做数据库连接的初始角色名。

superuser

数据库超级用户

createdb

创建数据库权限

createrole

允许其创建或删除其他普通的用户角色(超级用户除外)

replication

做流复制的时候用到的一个用户属性,一般单独设定。

password

在登录时要求指定密码时才会起作用,比如md5或者password模式,跟客户端的连接认证方式有关

inherit

用户组对组员的一个继承标志,成员可以继承用户组的权限特性

7.2. 创建用户时赋予角色属性

如果要在创建角色时就赋予角色一些属性,可以使用下面的方法。

首先切换到postgres 用户。

创建角色bella 并赋予其CREATEDB 的权限。

postgres=# CREATE ROLE bella CREATEDB ;CREATE ROLEpostgres=# \du                             List of roles Role name |                   Attributes                   | Member of -----------+------------------------------------------------+----------- bella     | Create DB, Cannot login                        | {} david     |                                                | {} postgres  | Superuser, Create role, Create DB, Replication | {} sandy     |                                                | {}postgres=#

创建角色renee 并赋予其创建数据库及带有密码登录的属性。

postgres=# CREATE ROLE renee CREATEDB PASSWORD 'abc123' LOGIN;CREATE ROLEpostgres=# \du                             List of roles Role name |                   Attributes                   | Member of -----------+------------------------------------------------+----------- bella     | Create DB, Cannot login                        | {} david     |                                                | {} postgres  | Superuser, Create role, Create DB, Replication | {} renee     | Create DB                                      | {} sandy     |                                                | {}postgres=#


测试renee 角色

postgres@CS-DEV:~> psql -U renee -d postgrespsql (9.1.0)Type "help" for help.postgres=> 


7.3. 给已存在用户赋予各种权限

赋予登录权限

postgres=# ALTER ROLE bella WITH LOGIN;ALTER ROLEpostgres=# \du                             List of roles Role name |                   Attributes                   | Member of -----------+------------------------------------------------+----------- bella     | Create DB                                      | {} david     |                                                | {} postgres  | Superuser, Create role, Create DB, Replication | {} renee     | Create DB                                      | {} sandy     |                                                | {}postgres=#

赋予renee 创建角色的权限

postgres=# ALTER ROLE renee WITH CREATEROLE;ALTER ROLEpostgres=# \du                             List of roles Role name |                   Attributes                   | Member of -----------+------------------------------------------------+----------- bella     | Create DB                                      | {} david     |                                                | {} postgres  | Superuser, Create role, Create DB, Replication | {} renee     | Create role, Create DB                         | {} sandy     |                                                | {}postgres=#