ubuntu版本:22.04.2 LTS
PostgreSQL版本:14
1 准备工作
1.1 查看已经安装的postgresql
(base) xxx@xxx-virtual-machine:~/Desktop$ apt-cache policy postgresql*
postgresql-powa:
Installed: (none)
Candidate: (none)
Version table:
postgresql-14-pglogical-ticker:
Installed: (none)
Candidate: 1.4.1-4
Version table:
… …
1.2 删除以前的postgresql
(base) xxx@xxx-virtual-machine:~/Desktop$ sudo apt-get --purge remove postgresql*
[sudo] password for xxx:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Note, selecting 'postgresql-powa' for glob 'postgresql*'
Note, selecting 'postgresql-14-pglogical-ticker' for glob 'postgresql*'
… …
1.3 查看 ubuntu 系统版本
输入uname -v可以查看版本号
(base) xxx@xxx-virtual-machine:~/Desktop$ uname -v
#42~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 18 17:40:00 UTC 2
输入uname -a,可以看到操作系统的发行版号和操作系统版本
(base) xxx@xxx-virtual-machine:~/Desktop$ uname -a
Linux xxx-virtual-machine 5.19.0-41-generic #42~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 18 17:40:00 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
2 安装postgresql14
通过 Ubuntu 操作系统默认的 apt 包管理器安装 PostgreSQL 十分简单,为了能够获取到最新的版本,首先我们更新 apt 的软件源。
2.1 更新apt 的软件源
(base) xxx@xxx-virtual-machine:~/Desktop$ sudo apt-get update
Hit:1 http://security.ubuntu.com/ubuntu jammy-security InRelease
Hit:2 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
Hit:3 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:4 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease
Reading package lists... Done
2.2 安装postgresql 包,以及 postgresql-contrib 包
(base) xxx@xxx-virtual-machine:~/Desktop$ sudo apt-get install postgresql postgresql-contrib
2.3 验证是否安装成功
2.3.1 切换到postgres用户
安装完成后,PostgreSQL 会自动创建一个操作系统用户 postgres。,我们切换到该用户:
(base) xxx@xxx-virtual-machine:~/Desktop$ sudo su postgres
2.3.2 使用 postgres 用户身份执行命令 psql
使用 postgres 用户身份执行命令 psql,即可立刻使用 psql 工具连接到 PostgreSQL 服务器。
postgres@xxx-virtual-machine:/home/xxx/Desktop$ psql
could not change directory to "/home/xxx/Desktop": Permission denied
psql (14.7 (Ubuntu 14.7-0ubuntu0.22.04.1))
Type "help" for help.
postgres=#
至此,已经能够通过 psql 工具管理 PostgreSQL 数据库、执行SQL语句,Postgresql安装完成。
3 数据库配置
3.1 为默认用户postgres设置密码
用默认的 postgres 用户登录 psql,使用如下命令即可为 postgres 用户设置密码。
alter role postgres with password '新密码';
例如:
我们设置密码为 xxxxxx,如下:
postgres=# alter role postgres with password 'xxxxxx';
ALTER ROLE
postgres=#
3.2 Postgresql的配置文件
使用 apt 包管理器安装 PostgreSQL 后,相关的配置文件在 /etc/postgresql/14/main 目录下,我们定位到该目录,能够发现有一系列 .conf 的配置文件。
(base) xxx@xxx-virtual-machine:~$ ls -l /etc/postgresql/14/main/
total 60
drwxr-xr-x 2 postgres postgres 4096 5月 22 07:06 conf.d
-rw-r--r-- 1 postgres postgres 315 5月 22 07:06 environment
-rw-r--r-- 1 postgres postgres 143 5月 22 07:06 pg_ctl.conf
-rw-r----- 1 postgres postgres 5002 5月 22 07:06 pg_hba.conf
-rw-r----- 1 postgres postgres 1636 5月 22 07:06 pg_ident.conf
-rw-r--r-- 1 postgres postgres 29060 5月 22 07:06 postgresql.conf
-rw-r--r-- 1 postgres postgres 317 5月 22 07:06 start.conf
(base) xxx@xxx-virtual-machine:~$
pg_hba.conf文件实现用户认证。
postgresql.conf是PGSQL的主配置文件,PGSQL的服务端口、日志、内存等核心参数都通过该配置文件进行修改。
3.3 配置用户认证:使用密码登录
打开 pg_hba.conf 配置文件,该配置文件用于配置 PostgreSQL 客户端验证方式。
在文件的底部,能够看到一系列针对不同用户、不同地址的配置。
每一行都可以看作是一条验证规则:
- 以 local 起始的行代表本地的 socket 连接,
- 以 host 起始的行代表基于 TCP/IP 的 socket 连接。
- 前者每行四个值,分别为 TYPE、DATABASE、USER、METHOD,后者每行五个值,多一个 ADDRESS 字段。每个值之间使用任意数量的空格分开即可,无需对齐。
TYPE:客户端连接类型
使用较多的是local和host,local代表本地socket连接,登陆时不用指定IP地址;host是通过TCP/IP进行的连接
DATABASE:客户端认证数据库名,比如linuxe。
如果标识为all代表任何数据库,标识为replication是允许流复制连接
USER:客户端连接时的用户名,all代表所有用户
ADDRESS:客户端连接地址,0.0.0.0/0表示所有网络
METHOD:具体的认证方法
- trust代表该客户端被信任,无需密码即可登录;
- reject代表拒绝连接,相当于黑名单;
- 如果要实现密码认证的话有scram-sha-256、md5和password三种方法:
- password和md5认证在安全性上都较低,所以推荐使用scram-sha-256。
- 另外PGSQL还支持对操作系统上的用户进行映射实现认证登录的方式,使用到的方法是peer与ident,其区别是peer只能进行本地用户的认证,而ident支持网络连接。使用操作系统用户认证时还需要配合pg_ident.conf文件进行系统用户与数据库用户的映射
将上述文件第 90 行的第四个值,由 peer(从内核获取操作系统用户名进行验证)改为 md5(使用密码的 md5 散列值进行验证)。
local all postgres md5
如果希望针对 PostgreSQL 的所有用户都采取 md5 验证,可以顺带修改第 95 行。
local all all md5
如果希望为特定用户添加验证规则,也可以参考上述规则,自行添加一个条目。
修改并保存上述配置文件后,需要重启 PostgreSQL 服务。
(base)xxx@xxx-virtual-machine:~$ sudo service postgresql restart
[sudo] password for xxx:
(base) xxx@xxx-virtual-machine:~$
重启完成后,在任何操作系统用户下,都可以通过 psql 采用用户名密码的方式登录(无需切换到 postgres 用户),效果如下:
(base) xxx@xxx-virtual-machine:~$ psql -U postgres
Password for user postgres:
psql (14.7 (Ubuntu 14.7-0ubuntu0.22.04.1))
Type "help" for help.
postgres=#
3.4 配置 PostgreSQL 远程访问
默认情况下,PostgreSQL 服务器只接受来自本地(localhost)的连接请求。假如我们希望让 PostgreSQL 服务器监听来自任何网段的连接请求,可以通过修改配置文件的形式实现。
3.4.1 修改postgresql.conf
打开 postgresql.conf 配置文件,
(base) xxx@xxx-virtual-machine:~$ sudo gedit /etc/postgresql/14/main/postgresql.conf
通过文本编辑器的搜索功能找到下面这行:
将该行的井号(代表注释)移除,并将值由 localhost 修改为 * ,代表监听一切网段的主机的请求。
listen_addresses = '*' # what IP address(es) to listen on;
保存,退出。
3.4.2 修改pg_hba.conf
现在回到控制客户端验证的 pg_hba.conf 配置文件,
(base) xxx@xxx-virtual-machine:~$ sudo gedit /etc/postgresql/14/main/pg_hba.conf
找到97行
第 97 行为 PostgreSQL 的默认创建的 IPv4 验证规则,可以看到默认仅接受来自 127.0.0.1/32 的网络请求。为了允许其他网段的客户端访问,将其更改为0.0.0.0/0。
host all all 0.0.0.0/0 scram-sha-256
修改并保存上述配置文件后,需要重启 PostgreSQL 服务。
(base) xxx@xxx-virtual-machine:~$ sudo service postgresql restart
[sudo] password for xxx:
(base) xxx@xxx-virtual-machine:~$
4 使用postgres用户,来生成其他用户和新数据库
初次安装后,默认生成一个名为postgres的数据库和一个名为postgres的数据库用户。这里需要注意的是,同时还生成了一个名为postgres的Linux系统用户。
我们使用postgres用户,来生成其他用户和新数据库。好几种方法可以达到这个目的,这里介绍两种。
4.1 使用PostgreSQL控制台
第一步:首先,新建一个Linux新用户,可以取你想要的名字,这里为dbuser
(base) xxx@xxx-virtual-machine:~$ sudo adduser dbuser
Adding user `dbuser' ...
Adding new group `dbuser' (1001) ...
Adding new user `dbuser' (1001) with group `dbuser' ...
Creating home directory `/home/dbuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for dbuser
Enter the new value, or press ENTER for the default
Full Name []: Router11
Room Number []: 201
Work Phone []: 138999999999
Home Phone []: 138999999999
Other []:
Is the information correct? [Y/n] y
(base) xxx@xxx-virtual-machine:~$
第二步:切换到PostgreSQL控制台
(base) xxx@xxx-virtual-machine:~$ psql -U postgres
Password for user postgres:
psql (14.7 (Ubuntu 14.7-0ubuntu0.22.04.1))
Type "help" for help.
postgres=#
这时相当于系统用户postgres以同名数据库用户的身份,登录数据库.如果一切正常,系统提示符会变为”postgres=#”,表示这时已经进入了数据库控制台。以下的命令都在控制台内完成。
(1)创建数据库用户dbuser(刚才创建的是Linux系统用户),并设置密码
postgres=# CREATE USER dbuser WITH PASSWORD 'xxxxxx';
CREATE ROLE
postgres=#
(2)创建用户数据库,这里为xxxdb,并指定所有者为dbuser
postgres=# CREATE DATABASE xxxdb OWNER dbuser;
CREATE DATABASE
postgres=#
(3)将xxxdb数据库的所有权限都赋予dbuser
postgres=# GRANT ALL PRIVILEGES ON DATABASE xxxdb to dbuser;
GRANT
若步赋予所有权限,dbuser只能登录数据库控制台,没有任何数据库操作权限。
(4) 使用\q命令退出控制台(也可以直接按ctrl+D)。
4.2 使用shell命令行
添加新用户和新数据库,除了在PostgreSQL控制台内,还可以在shell命令行下完成。这是因为PostgreSQL提供了命令行程序createuser和createdb。还是以新建用户dbuser和数据库exampledb为例。
第一步:创建数据库用户dbuser,并指定其为超级用户。
(base) xxx@xxx-virtual-machine:~$ sudo -u postgres createuser --superuser dbuser
第二步:登录数据库控制台,设置dbuser用户的密码,完成后退出控制台
(base) xxx@xxx-virtual-machine:~$ sudo -u postgres psql
[sudo] password for xxx:
Password for user postgres:
psql (14.7 (Ubuntu 14.7-0ubuntu0.22.04.1))
Type "help" for help.
postgres=# password dbuser
第三步:在shell命令行下,创建数据库exampledb,并指定所有者为dbuser
(base) xxx@xxx-virtual-machine:~$ sudo -u postgres createdb -O dbuser exampledb
5 登录数据库
添加新用户和新数据库以后,就要以新用户的名义登录数据库,这时使用的是psql命令。
5.1 psql命令
psql -U dbuser -d xxxdb -h 127.0.0.1 -p 5432
上面命令的参数含义如下:
-U指定用户,
-d指定数据库,
-h指定服务器,
-p指定端口。
5.2 以新用户登录数据库
(base) xxx@xxx-virtual-machine:~$ psql -U dbuser -d xxxdb -h 127.0.0.1 -p 5432
Password for user dbuser:
psql (14.7 (Ubuntu 14.7-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
xxxdb=>
输入上面命令以后,系统会提示输入dbuser用户的密码。输入正确,就可以登录控制台了
6 安装PostgraSQL驱动程序pyscopg
Python使用 psycopg 连接 postgresql。
6.1 安装psycopg2-binary
采用pip安装
(base) xxx@xxx-virtual-machine:~$ pip install psycopg2-binary
Collecting psycopg2-binary
Using cached psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB)
Installing collected packages: psycopg2-binary
Successfully installed psycopg2-binary-2.9.6
6.2 验证安装是否正确
(base) xxx@xxx-virtual-machine:~$ python
Python 3.10.9 (main, Mar 1 2023, 18:23:06) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>>