PostgreSQL的架构如图1所示,主要进程说明如表1所示。
图 1 PostgreSql架构

表 1 PostgreSql中的主要进程说明
说明:以下环境配置仅为参考示例,具体配置视实际需求做配置
说明:测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。
在root权限下停止防火墙。
# systemctl stop firewalld
例如示例命令如下:
[root@superman-21 ~]# systemctl stop firewalld
[root@superman-21 ~]#
在root权限下关闭防火墙。
# systemctl disable firewalld
说明: 执行disable命令关闭防火墙的同时,也取消了开机自启动。
例如示例命令如下:
[root@superman-21 ~]# systemctl disable firewalld
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
[root@superman-21 ~]#
永久关闭,在root权限下修改配置文件。
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
说明:
重启后生效。
例如示例命令如下:
[root@superman-21 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
[root@superman-21 ~]#
[root@superman-21 ~]# cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@superman-21 ~]#
临时关闭
# setenforce 0
说明:
即时生效,但重启后会自动开启。
例如示例命令如下:
[root@superman-21 ~]# setenforce 0
setenforce: SELinux is permissive
[root@superman-21 ~]#
说明:服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。
在root权限下创建MySQL用户(组)。
# groupadd postgres
# useradd -g postgres postgres
例如示例命令如下:
[root@superman-21 ~]# groupadd postgres
[root@superman-21 ~]#
[root@superman-21 ~]# useradd -g postgres postgres
[root@superman-21 ~]#
在root权限下设置MySQL用户密码。
# passwd postgres
需要重复输入密码(根据实际需求设置密码)。
例如示例命令如下:
[root@superman-21 ~]# passwd postgres
更改用户 postgres 的密码 。
新的密码:
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@superman-21 ~]#
说明:
进行性能测试时,数据目录使用单独硬盘,需要对硬盘进行格式化并挂载,参考方法一或者方法二
非性能测试时,在root权限下执行以下命令,创建数据目录即可。然后跳过本小节:# mkdir /data
创建分区(以/dev/sdb为例,根据实际情况创建)
# fdisk /dev/sdb
输入n,按回车确认。
输入p,按回车确认。
输入1,按回车确认。
采用默认配置,按回车确认。
采用默认配置,按回车确认。
输入w,按回车保存。
例如示例命令如下:
[root@superman-21 ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.37.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
设备不包含可识别的分区表。
创建了一个磁盘标识符为 0x9ac1f07b 的新 DOS 磁盘标签。
命令(输入 m 获取帮助):n
分区类型
p 主分区 (0 primary, 0 extended, 4 free)
e 扩展分区 (逻辑分区容器)
选择 (默认 p):p
分区号 (1-4, 默认 1): 1
第一个扇区 (2048-41943039, 默认 2048):
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039):
创建了一个新分区 1,类型为“Linux”,大小为 20 GiB。
命令(输入 m 获取帮助):w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
[root@superman-21 ~]#
创建文件系统(以xfs为例,根据实际需求创建文件系统)
# mkfs.xfs /dev/sdb1
例如示例命令如下:
[root@superman-21 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@superman-21 ~]#
创建“/data”文件夹以供操作系统挂载分区使用。
# mkdir /data
例如示例命令如下:
[root@superman-21 ~]# mkdir /data
[root@superman-21 ~]#
执行命令编辑“/etc/fstab”使重启后自动挂载数据盘。
# echo "/dev/sdb1 /data xfs defaults 1 1" >> /etc/fstab
例如示例命令如下:
[root@superman-21 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Nov 28 13:29:03 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/vg00-lv_root / ext4 defaults 1 1
UUID=70c4f6e0-20be-46f8-93ba-97c8083bc37a /boot ext4 defaults 1 2
/dev/mapper/vg00-lv_swap none swap defaults 0 0
[root@superman-21 ~]#
[root@superman-21 ~]# echo "/dev/sdb1 /data xfs defaults 1 1" >> /etc/fstab
[root@superman-21 ~]#
[root@superman-21 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Nov 28 13:29:03 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/vg00-lv_root / ext4 defaults 1 1
UUID=70c4f6e0-20be-46f8-93ba-97c8083bc37a /boot ext4 defaults 1 2
/dev/mapper/vg00-lv_swap none swap defaults 0 0
/dev/sdb1 /data xfs defaults 1 1
[root@superman-21 ~]#
挂载数据盘。
# mount -a
例如示例命令如下:
[root@superman-21 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.7G 12K 1.7G 1% /dev/shm
tmpfs 677M 9.1M 668M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/vg00-lv_root 41G 2.9G 36G 8% /
tmpfs 1.7G 0 1.7G 0% /tmp
/dev/sda1 974M 249M 659M 28% /boot
[root@superman-21 ~]#
[root@superman-21 ~]# mount -a
[root@superman-21 ~]#
[root@superman-21 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.7G 12K 1.7G 1% /dev/shm
tmpfs 677M 9.1M 668M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/vg00-lv_root 41G 2.9G 36G 8% /
tmpfs 1.7G 0 1.7G 0% /tmp
/dev/sda1 974M 249M 659M 28% /boot
/dev/sdb1 20G 175M 20G 1% /data
[root@superman-21 ~]#
说明:此步骤需要安装镜像中的lvm2相关包,步骤如下:
配置本地yum源,详细信息请参考《openEuler 22.03-LTS 搭建repo服务器》。如果已经执行,则可跳过此步。
在root权限下执行命令安装lvm2。# yum install lvm2
创建物理卷(sdb为硬盘名称,具体名字以实际为准)。
# pvcreate /dev/sdb
例如示例命令如下:
[root@superman-21 ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
[root@superman-21 ~]#
创建物理卷组(其中vg_data为创建的卷组名称,具体名字以实际规划为准)。
# vgcreate vg_data /dev/sdb
例如示例命令如下:
[root@superman-21 ~]# vgcreate vg_data /dev/sdb
Volume group "vg_data" successfully created
[root@superman-21 ~]#
创建逻辑卷(其中20G为规划的逻辑卷大小,具体大小以实际情况为准;lv_data为创建的逻辑卷的名字,具体名称以实际规划为准。)。
# lvcreate -L 20476M -n lv_data vg_data
例如示例命令如下:
[root@superman-21 ~]# lvcreate -L 20476M -n lv_data vg_data
Logical volume "lv_data" created.
[root@superman-21 ~]#
创建文件系统。
# mkfs.xfs /dev/vg_data/lv_data
例如示例命令如下:
[root@superman-21 ~]# mkfs.xfs /dev/vg_data/lv_data
meta-data=/dev/vg_data/lv_data isize=512 agcount=4, agsize=1310464 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=5241856, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@superman-21 ~]#
创建“/data”文件夹以供操作系统挂载分区使用。
# mkdir /data
例如示例命令如下:
[root@superman-21 ~]# mkdir /data
[root@superman-21 ~]#
执行命令编辑“/etc/fstab”使重启后自动挂载数据盘。
# echo "/dev/vg_data/lv_data /data xfs defaults 1 1" >> /etc/fstab
例如示例命令如下:
[root@superman-21 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Nov 28 13:29:03 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/vg00-lv_root / ext4 defaults 1 1
UUID=70c4f6e0-20be-46f8-93ba-97c8083bc37a /boot ext4 defaults 1 2
/dev/mapper/vg00-lv_swap none swap defaults 0 0
[root@superman-21 ~]#
[root@superman-21 ~]# echo "/dev/vg_data/lv_data /data xfs defaults 1 1" >> /etc/fstab
[root@superman-21 ~]#
[root@superman-21 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Nov 28 13:29:03 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/vg00-lv_root / ext4 defaults 1 1
UUID=70c4f6e0-20be-46f8-93ba-97c8083bc37a /boot ext4 defaults 1 2
/dev/mapper/vg00-lv_swap none swap defaults 0 0
/dev/vg_data/lv_data /data xfs defaults 1 1
[root@superman-21 ~]#
挂载数据盘。
# mount -a
例如示例命令如下:
[root@superman-21 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.7G 12K 1.7G 1% /dev/shm
tmpfs 677M 9.1M 668M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/vg00-lv_root 41G 2.9G 36G 8% /
tmpfs 1.7G 0 1.7G 0% /tmp
/dev/sda1 974M 249M 659M 28% /boot
[root@superman-21 ~]#
[root@superman-21 ~]# mount -a
[root@superman-21 ~]#
[root@superman-21 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.7G 12K 1.7G 1% /dev/shm
tmpfs 677M 9.1M 668M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/vg00-lv_root 41G 2.9G 36G 8% /
tmpfs 1.7G 0 1.7G 0% /tmp
/dev/sda1 974M 249M 659M 28% /boot
/dev/mapper/vg_data-lv_data 20G 175M 20G 1% /data
[root@superman-21 ~]#
在root权限下修改目录权限。
# chown -R postgres:postgres /data
例如示例命令如下:
[root@superman-21 ~]# chown -R postgres:postgres /data
[root@superman-21 ~]#
配置本地yum源,详细信息请参考《openEuler 22.03-LTS 搭建repo服务器》
清除缓存。
# dnf clean all
例如示例命令如下:
[root@superman-21 ~]# dnf clean all
36 files removed
[root@superman-21 ~]#
创建缓存。
# dnf makecache
例如示例命令如下:
[root@superman-21 ~]# dnf makecache
OS 1.6 MB/s | 3.4 MB 00:02
everything 6.5 MB/s | 16 MB 00:02
EPOL 4.3 MB/s | 2.6 MB 00:00
debuginfo 5.4 MB/s | 3.9 MB 00:00
source 3.2 MB/s | 1.7 MB 00:00
update 9.2 MB/s | 29 MB 00:03
Metadata cache created.
[root@superman-21 ~]#
在root权限下安装PostgreSQL服务器。
# dnf install postgresql-server
例如示例命令如下:
[root@superman-21 ~]# dnf install postgresql-server
Last metadata expiration check: 0:00:57 ago on 2022年12月22日 星期四 20时17分30秒.
Dependencies resolved.
===============================================================================================================================
Package Architecture Version Repository Size
===============================================================================================================================
Installing:
postgresql-server x86_64 13.3-7.oe2203 update 5.4 M
Installing dependencies:
postgresql x86_64 13.3-7.oe2203 update 1.6 M
Transaction Summary
===============================================================================================================================
Install 2 Packages
Total download size: 7.0 M
Installed size: 29 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): postgresql-13.3-7.oe2203.x86_64.rpm 3.2 MB/s | 1.6 MB 00:00
(2/2): postgresql-server-13.3-7.oe2203.x86_64.rpm 3.4 MB/s | 5.4 MB 00:01
-------------------------------------------------------------------------------------------------------------------------------
Total 4.4 MB/s | 7.0 MB 00:01
retrieving repo key for update unencrypted from http://repo.openeuler.org/openEuler-22.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler
update 23 kB/s | 2.1 kB 00:00
Importing GPG key 0xB25E7F66:
Userid : "private OBS (key without passphrase) <defaultkey@localobs>"
Fingerprint: 12EA 74AC 9DF4 8D46 C69C A0BE D557 065E B25E 7F66
From : http://repo.openeuler.org/openEuler-22.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler
Is this ok [y/N]: y
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : postgresql-13.3-7.oe2203.x86_64 1/2
Running scriptlet: postgresql-server-13.3-7.oe2203.x86_64 2/2
Installing : postgresql-server-13.3-7.oe2203.x86_64 2/2
Running scriptlet: postgresql-server-13.3-7.oe2203.x86_64 2/2
/usr/lib/tmpfiles.d/postgresql.conf:1: Line references path below legacy directory /var/run/, updating /var/run/postgresql → /run/postgresql; please update the tmpfiles.d/ drop-in file accordingly.
Verifying : postgresql-13.3-7.oe2203.x86_64 1/2
Verifying : postgresql-server-13.3-7.oe2203.x86_64 2/2
Installed:
postgresql-13.3-7.oe2203.x86_64 postgresql-server-13.3-7.oe2203.x86_64
Complete!
[root@superman-21 ~]#
查看安装后的rpm包。
# rpm -qa | grep postgresql
例如示例命令如下:
[root@superman-21 ~]# rpm -qa | grep postgresql
postgresql-13.3-7.oe2203.x86_64
postgresql-server-13.3-7.oe2203.x86_64
[root@superman-21 ~]#
注意:此步骤在postgres用户下操作。
切换到已创建的PostgreSQL用户。
# su - postgres
例如示例命令如下:
[root@superman-21 ~]# su - postgres
Welcome to 5.10.0-60.18.0.50.oe2203.x86_64
System information as of time: 2022年 12月 22日 星期四 20:21:50 CST
System load: 0.99
Processes: 151
Memory used: 6.4%
Swap used: 0%
Usage On: 7%
IP address: 192.168.0.21
IP address: 192.168.122.1
Users online: 1
To run a command as administrator(user "root"),use "sudo <command>".
[postgres@superman-21 ~]$
初始化数据库,其中命令中的/usr/bin是命令initdb所在的目录。
$ initdb -D /data/
例如示例命令如下:
[postgres@superman-21 ~]$ initdb -D /data/
属于此数据库系统的文件宿主为用户 "postgres".
此用户也必须为服务器进程的宿主.
数据库簇将使用本地化语言 "zh_CN.UTF-8"进行初始化.
默认的数据库编码已经相应的设置为 "UTF8".
initdb: could not find suitable text search configuration for locale "zh_CN.UTF-8"
缺省的文本搜索配置将会被设置到"simple"
禁止为数据页生成校验和.
修复已存在目录 /data 的权限 ... 成功
正在创建子目录 ... 成功
选择动态共享内存实现 ......posix
选择默认最大联接数 (max_connections) ... 100
选择默认共享缓冲区大小 (shared_buffers) ... 128MB
selecting default time zone ... Asia/Shanghai
创建配置文件 ... 成功
正在运行自举脚本 ...成功
正在执行自举后初始化 ...成功
同步数据到磁盘...成功
initdb: 警告: 为本地连接启用"trust"身份验证
你可以通过编辑 pg_hba.conf 更改或你下次
执行 initdb 时使用 -A或者--auth-local和--auth-host选项.
成功。您现在可以用下面的命令开启数据库服务器:
/usr/bin/pg_ctl -D /data/ -l 日志文件 start
[postgres@superman-21 ~]$
启动PostgreSQL数据库。
$ pg_ctl -D /data/ -l /data/logfile start
例如示例命令如下:
[postgres@superman-21 ~]$ pg_ctl -D /data/ -l /data/postgres.log start
等待服务器进程启动 .... 完成
服务器进程已经启动
[postgres@superman-21 ~]$
确认PostgreSQL数据库进程是否正常启动。
$ ps -ef | grep postgres
命令执行后,打印信息如下图所示,PostgreSQL相关进程已经正常启动了。

登录数据库。
$ psql -U postgres
说明:初次登录数据库,无需密码。
例如示例命令如下:
[postgres@superman-21 ~]$ psql -U postgres
psql (13.3)
输入 "help" 来获取帮助信息.
postgres=#
登录后,设置postgres密码。
postgres=# alter user postgres with password '123456';
例如示例命令如下:
postgres=# alter user postgres with password '123456';
ALTER ROLE
postgres=#
执行\q退出数据库。
postgres=# \q
例如示例命令如下:
postgres=# \q
[postgres@superman-21 ~]$
停止PostgreSQL数据库。
$ pg_ctl -D /data/ -l /data/logfile stop
例如示例命令如下:
[postgres@superman-21 ~]$ pg_ctl -D /data/ -l /data/postgres.log stop
等待服务器进程关闭 .... 完成
服务器进程已经关闭
[postgres@superman-21 ~]$
在postgres用户下停止数据库。
$ pg_ctl -D /data/ -l /data/logfile stop
例如示例命令如下:
[postgres@superman-21 ~]$ pg_ctl -D /data/ -l /data/postgres.log stop
等待服务器进程关闭 .... 完成
服务器进程已经关闭
[postgres@superman-21 ~]$
在root用户下执行dnf remove postgresql-server卸载PostgreSQL数据库。
# dnf remove postgresql-server
例如示例命令如下:
[root@superman-21 ~]# dnf remove postgresql-server
Dependencies resolved.
===============================================================================================================================
Package Architecture Version Repository Size
===============================================================================================================================
Removing:
postgresql-server x86_64 13.3-7.oe2203 @update 22 M
Removing unused dependencies:
postgresql x86_64 13.3-7.oe2203 @update 6.2 M
Transaction Summary
===============================================================================================================================
Remove 2 Packages
Freed space: 29 M
Is this ok [y/N]: y
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: postgresql-server-13.3-7.oe2203.x86_64 1/1
Running scriptlet: postgresql-server-13.3-7.oe2203.x86_64 1/2
Erasing : postgresql-server-13.3-7.oe2203.x86_64 1/2
Running scriptlet: postgresql-server-13.3-7.oe2203.x86_64 1/2
Erasing : postgresql-13.3-7.oe2203.x86_64 2/2
Running scriptlet: postgresql-13.3-7.oe2203.x86_64 2/2
Verifying : postgresql-13.3-7.oe2203.x86_64 1/2
Verifying : postgresql-server-13.3-7.oe2203.x86_64 2/2
Removed:
postgresql-13.3-7.oe2203.x86_64 postgresql-server-13.3-7.oe2203.x86_64
Complete!
[root@superman-21 ~]#
可以使用CREATE ROLE语句或createuser来创建角色。createuser是对CREATE ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。
CREATE ROLE rolename [ [ WITH ] option [ ... ] ];
createuser rolename
其中:
rolename:角色名。
option为参数选项,常用的有:
SUPERUSER | NOSUPERUSER:决定一个新角色是否为"超级用户",若未指定,则默认为NOSUPERUSER,即不是超级用户。
CREATEDB | NOCREATEDB:定义一个角色是否能创建数据库,若未指定,则默认为NOCREATEDB,即不能创建数据库。
CREATEROLE | NOCREATEROLE:决定一个角色是否可以创建新角色,若未指定,则默认为NOCREATEROLE,即不能创建新角色。
INHERIT | NOINHERIT:决定一个角色是否"继承"它所在组的角色的权限。一个带有 INHERIT 属性的角色可以自动使用已经赋与它直接或间接所在组的任何权限。若未指定,则默认为INHERIT。
LOGIN | NOLOGIN:决定一个角色是否可以登录,一个拥有LOGIN属性的角色可以认为是一个用户,若无此属性的角色可以用于管理数据库权限,但是并不是用户,若未指定,则默认为NOLOGIN。但若创建角色是使用的是CREATE USER而不是CREATE ROLE,则默认是LOGIN属性。
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password':设置角色的密码,密码只对那些拥有 LOGIN 属性的角色有意义。ENCRYPTED | UNENCRYPTED表示是否对密码进行加密,若未指定,则默认为ENCRYPTED,即加密。
VALID UNTIL 'timestamp':角色的密码失效的时间戳,若为指定,则表示密码永久有效。
IN ROLE rolename1:列出一个或多个现有的角色,新角色rolename将立即加入这些角色,成为rolename1的成员。
ROLE rolename2:列出一个或多个现有的角色,它们将自动添加为新角色rolename的成员,即新角色为"组"。
要使用这条命令,必须拥有 CREATEROLE 权限或者是数据库超级用户。
创建一个可以登录的角色roletest1。
postgres=# CREATE ROLE roletest1 LOGIN;
CREATE ROLE
postgres=#
创建一个密码为123456的角色roletest2。
postgres=# CREATE ROLE roletest2 WITH LOGIN PASSWORD '123456';
CREATE ROLE
postgres=#
创建角色名为roletest3的角色。。
[postgres@superman-21 ~]$ createuser roletest3
[postgres@superman-21 ~]$
可以使用SELECT语句或psql的元命令\du查看角色。
SELECT rolename FROM pg_roles;
\du
其中:rolename:角色名。
查看所有角色名。
postgres=# SELECT rolname from pg_roles;
rolname
---------------------------
pg_monitor
pg_read_all_settings
pg_read_all_stats
pg_stat_scan_tables
pg_read_server_files
pg_write_server_files
pg_execute_server_program
pg_signal_backend
postgres
roletest1
roletest2
roletest3
(12 行记录)
postgres=#
查看现有角色。
postgres=# \du
角色列表
角色名称 | 属性 | 成员属于
-----------+--------------------------------------------+----------
postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
roletest1 | | {}
roletest2 | | {}
roletest3 | | {}
postgres=#
可以使用ALTER ROLE语句修改一个已经存在的角色名。
ALTER ROLE oldrolername RENAME TO newrolename;
其中:
oldrolername:旧的角色名。
newrolename:新的角色名。
将角色名roletest1修改为roletest4。
postgres=# ALTER ROLE roletest1 RENAME TO roletest4;
ALTER ROLE
postgres=#
可以使用ALTER ROLE语句修改一个角色的登录密码。
ALTER ROLE rolename PASSWORD 'password'
其中:
rolename:角色名。
password:密码。
将roletest2的密码修改为456789。
postgres=# ALTER ROLE roletest2 WITH PASSWORD '456789';
ALTER ROLE
postgres=#
可以使用DROP ROLE语句或dropuser来删除角色。dropuser是对DROP ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。
DROP ROLE rolename;
dropuser rolename
其中:rolename:角色名。
删除roletest2角色。
postgres=# DROP ROLE roletest2;
DROP ROLE
postgres=#
删除roletest3角色。。
[postgres@superman-21 ~]$ dropuser roletest3
[postgres@superman-21 ~]$
可以使用GRANT语句来对角色授权。
对角色授予表的操作权限:
GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予序列的操作权限:
GRANT { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予数据库的操作权限:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予函数的操作权限:
GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予过程语言的操作权限:
GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予模式的操作权限:
GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
对角色授予表空间的操作权限:
GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
将角色rolename1的成员关系赋予角色rolename2:
GRANT rolename1 [, ...] TO rolename2 [, ...] [ WITH ADMIN OPTION ]
其中:
SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL [ PRIVILEGES ]:用户的操作权限,ALL [ PRIVILEGES ]表示所有的权限,PRIVILEGES 关键字在 PostgreSQL 里是可选的,但是严格的 SQL 要求有这个关键字。
ON字句:用于指定权限授予的对象。
tablename:表名。
TO字句:用来指定被赋予权限的角色。
rolename、rolename1、rolename2:角色名。
groupname:角色组名。
PUBLIC:表示该权限要赋予所有角色,包括那些以后可能创建的用户。
WITH GRANT OPTION:表示权限的接收者也可以将此权限赋予他人,否则就不能授权他人。该选项不能赋予给PUBLIC。
sequencename:序列名。
databasename:数据库名。
funcname ( [ [ argmode ] [ argname ] argtype [, …] ] ):函数名及其参数。
langname:过程语言名。
schemaname:模式名。
tablespacename:表空间名。
WITH ADMIN OPTION:表示成员随后就可以将角色的成员关系赋予其它角色,以及撤销其它角色的成员关系。
对roletest4授予数据库database1的CREATE权限。
postgres=# GRANT CREATE ON DATABASE postgres TO roletest4;
GRANT
postgres=#
对所有用户授予表t1的所有权限。
postgres=# GRANT ALL PRIVILEGES ON TABLE t1 TO PUBLIC;
GRANT
postgres=#
可以使用REVOKE语句来撤销以前赋予一个或多个角色的权限。
撤销角色对表的操作权限:
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...]
撤销角色对序列的操作权限:
REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对数据库的操作权限:
REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对函数的操作权限:
REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对过程语言的操作权限:
REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对模式的操作权限:
REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
撤销角色对表空间的操作权限:
REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
删除rolename2的rolename1的成员关系:
REVOKE [ ADMIN OPTION FOR ] rolename1 [, ...] FROM rolename2 [, ...] [ CASCADE | RESTRICT ]
其中:
GRANT OPTION FOR:表示只是撤销对该权限的授权的权力,而不是撤销该权限本身。
SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL [ PRIVILEGES ]:用户的操作权限,ALL [ PRIVILEGES ]表示所有的权限,PRIVILEGES关键字在 PostgreSQL里是可选的,但是严格的SQL 要求有这个关键字。
ON字句:用于指定撤销权限的对象。
tablename:表名。
FROM字句:用来指定被撤销权限的角色。
rolename、rolename1、rolename2:角色名。
groupname:角色组名。
PUBLIC:表示撤销隐含定义的、拥有所有角色的组,但并不意味着所有角色都失去了权限,那些直接得到的权限以及通过一个组得到的权限仍然有效。
sequencename:序列名。
CASCADE:撤销所有依赖性权限。
RESTRICT:不撤销所有依赖性权限。
databasename:数据库名。
funcname ( [ [ argmode ] [ argname ] argtype [, …] ] ):函数名及其参数。
langname:过程语言名。
schemaname:模式名。
tablespacename:表空间名。
ADMIN OPTION FOR:表示传递的授权不会自动收回。
对roletest4授予数据库postgres的CREATE权限。
postgres=# GRANT CREATE ON DATABASE postgres TO roletest4;
GRANT
postgres=#
对所有用户授予表pg_proc的所有权限。
postgres=# GRANT ALL PRIVILEGES ON TABLE pg_proc TO PUBLIC;
GRANT
postgres=#
可以使用CREATE DATABASE语句或createdb来创建角色。createrdb是对CREATE DATABASE命令的封装,需要在shell界面执行,而不是在数据库界面。
CREATE DATABASE databasename;
createdb databasename
其中:databasename为数据库名。
要使用这条命令,必须拥有CREATEDB权限。
创建一个数据库testdb1。
postgres=# CREATE DATABASE testdb1;
CREATE DATABASE
postgres=#
可以使用\c语句来选择数据库。
\c databasename;
其中:databasename为数据库名称。
选择testdb1数据库。
postgres=# \c testdb1;
您现在已经连接到数据库 "testdb1",用户 "postgres".
testdb1=#
可以使用\l语句来查看数据库。
\l;
查看所有数据库。
postgres=# \l
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | 存取权限
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | roletest4=C/postgres
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
testdb1 | postgres | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 |
(4 行记录)
postgres=#
可以使用DROP DATABASE语句或dropdb来删除数据库。dropdb是对DROP DATABASE命令的封装,需要在shell界面执行,而不是在数据库界面。
注意:删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。
DROP DATABASE databasename;
dropdb databasename
其中:databasename为数据库名称。
DROP DATABASE会删除数据库的系统目录项并且删除包含数据的文件目录。
DROP DATABASE只能由超级管理员或数据库拥有者执行。
删除testdb1数据库。
postgres=# DROP DATABASE testdb1;
DROP DATABASE
postgres=#
可以使用pg_dump命令备份数据库,将数据库转储到一个脚本文件或其他归档文件中。
pg_dump [option]... [databasename] > outfile
其中:
databasename:数据库名称。如果没有声明这个参数,那么使用环境变量 PGDATABASE 。如果那个环境变量也没声明,那么使用发起连接的用户名。
outfile:数据库备份的文件。
option:pg_dump命令参数选项,多个参数之间可以使用空格分隔。常用的pg_dump命令参数选项如下:
-f,--file= filename :指输出到指定的文件。如果忽略,则使用标准输出。
-d,--dbname= databasename :指定转储的数据库。
-h,--host= hostname :指定主机名。
-p,--port= portnumber :指定端口。
-U,--username= username :指定连接的用户名。
-W,--password:强制口令提示(自动)。
备份主机为127.0.0.1,端口为5432,postgres用户下的testdb2数据库到testdb2.sql中。
[postgres@superman-21 ~]$ pg_dump -h 127.0.0.1 -p 5432 -U postgres -W testdb2 > testdb2.sql
口令:
[postgres@superman-21 ~]$
可以使用psql命令恢复数据库。
psql [option]... [databasename [username]] < infile
其中:
databasename:数据库名称。如果没有声明这个参数,那么使用环境变量 PGDATABASE 。如果那个环境变量也没声明,那么使用发起连接的用户名。
username:用户名。
infile:pg_dump命令中的outfile参数。
option:psql命令参数选项,多个参数之间可以使用空格分隔。常用的psql命令参数选项如下:
-f,--file=filename:指输出到指定的文件。如果忽略,则使用标准输出。
-d,--dbname=databasename:指定转储的数据库。
-h,--host=hostname:指定主机名。
-p,--port=portnumber:指定端口。
-U,--username=username:指定连接的用户名。
-W,--password:强制口令提示(自动)。
psql命令不会自动创建databasename数据库,所以在执行psql恢复数据库之前需要先创建databasename数据库。
将testdb2.sql脚本文件导入到主机为127.0.0.1,端口为5432,postgres用户下newdb数据库中。
[postgres@superman-21 ~]$ createdb newdb
[postgres@superman-21 ~]$
[postgres@superman-21 ~]$ psql -h 127.0.0.1 -p 5432 -U postgres -W -d newdb < testdb2.sql
口令:
SET
SET
SET
SET
SET
set_config
------------
(1 行记录)
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
COPY 0
COPY 0
[postgres@superman-21 ~]$
有什么吐槽或反馈意见,直接告诉我!
温馨提示:如出现二维码失效也可直接添加微信号:ysc13803862469。
原文作者:超哥的IT私房菜;如有侵权,请联系管理员删除。