Bootstrap

django 实战(2): ubuntu安装postgresql数据库

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.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 客户端验证方式。

在文件的底部,能够看到一系列针对不同用户、不同地址的配置。

每一行都可以看作是一条验证规则:

  1. 以 local 起始的行代表本地的 socket 连接,
  2. 以 host 起始的行代表基于 TCP/IP 的 socket 连接。
  3. 前者每行四个值,分别为 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:具体的认证方法

  1. trust代表该客户端被信任,无需密码即可登录;
  2. reject代表拒绝连接,相当于黑名单;
  3. 如果要实现密码认证的话有scram-sha-256、md5和password三种方法:
  4. password和md5认证在安全性上都较低,所以推荐使用scram-sha-256。
  5. 另外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 

>>>

;