介绍
关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种结构化的方式来存储、组织和访问信息。
PostgreSQL,也称为 Postgres,是一种关系数据库管理系统,它提供了结构化查询语言(也称为 SQL)的实现。它被许多流行的项目所使用,无论大小,都符合标准,并且具有许多高级功能,例如可靠的事务和无读锁的并发性。
按照本指南,您将在 CentOS 8 服务器上安装最新版本的 PostgreSQL。
先决条件
要完成本教程,您需要一台运行 CentOS 8 的服务器。该服务器应具有具有管理权限的非 root 用户和配置为firewalld
. 要进行设置,请参阅我们的 CentOS 8 初始服务器设置指南。
第 1 步 – 安装 PostgreSQL
PostgreSQL 可从 CentOS 8 的默认AppStream软件存储库中获得,并且您可以安装多个版本。您可以通过启用与您要安装的版本一致的适当的包和依赖项集合来在这些版本之间进行选择,每个集合称为一个模块流。
在 CentOS 8 的默认包管理器 DNF 中,模块是 RPM 包的特殊集合,它们共同构成了一个更大的应用程序。这旨在使安装包及其依赖项对用户更加直观。
postgresql
使用以下dnf
命令列出模块的可用流:
- dnf module list postgresql
Outputpostgresql 9.6 client, server [d] PostgreSQL server and client module
postgresql 10 [d] client, server [d] PostgreSQL server and client module
postgresql 12 client, server PostgreSQL server and client module
您可以在这个输出看到,有三个版本的PostgreSQL可从AppStream库:9.6
,10
,和12
。提供 Postgres 版本 10 的流是默认的,如下所示[d]
。如果你想安装那个版本,你可以运行sudo dnf install postgresql-server
并继续下一步。然而,尽管版本 10 仍在维护,但本教程将安装 Postgres 版本 12,即撰写本文时的最新版本。
要安装 PostgreSQL 版本 12,您必须启用该版本的模块流。当您启用模块流时,您会覆盖默认流并使与启用的流相关的所有包在系统上可用。请注意,一个系统上只能同时启用任何给定模块的一个流。
要为 Postgres 版本 12 启用模块流,请运行以下命令:
- sudo dnf module enable postgresql:12
出现提示时,按y
和 然后ENTER
确认您要启用流:
Output====================================================================
Package Architecture Version Repository Size
====================================================================
Enabling module streams:
postgresql 12
Transaction Summary
====================================================================
Is this ok [y/N]: y
启用版本 12 模块流后,您可以安装postgresql-server
软件包以安装 PostgreSQL 12 及其所有依赖项:
- sudo dnf install postgresql-server
出现提示时,按y
then确认安装ENTER
:
Output. . .
Install 4 Packages
Total download size: 16 M
Installed size: 62 M
Is this ok [y/N]: y
现在安装了软件,您将执行一些初始化步骤来为 PostgreSQL 准备一个新的数据库集群。
第 2 步 – 创建一个新的 PostgreSQL 数据库集群
您必须先创建一个新的 PostgreSQL数据库集群,然后才能开始创建表并为它们加载数据。数据库集群是由单个服务器实例管理的数据库集合。创建数据库集群包括创建放置数据库数据的目录、生成共享目录表以及创建template1
和postgres
数据库。
该template1
数据库是用来创建新的数据库各种各样的模板; 存储在 中的所有内容template1
,甚至是您自己添加的对象,在创建时都将放置在新数据库中。该postgres
数据库是为用户、实用程序和第三方应用程序设计的默认数据库。
我们在上一步中安装的 Postgres 包带有一个方便的脚本,称为postgresql-setup
帮助进行低级数据库集群管理。要创建数据库集群,请使用sudo
和--initdb
选项运行脚本:
- sudo postgresql-setup --initdb
您将看到以下输出:
Output * Initializing database in '/var/lib/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
现在使用systemctl
以下命令启动 PostgreSQL 服务:
- sudo systemctl start postgresql
然后,systemctl
再次使用以在服务器启动时启动服务:
- sudo systemctl enable postgresql
这将给出以下输出
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /usr/lib/systemd/system/postgresql.service.
现在 PostgreSQL 已启动并运行,我们将继续使用角色来了解 Postgres 的工作原理以及它与您过去可能使用过的类似数据库管理系统有何不同。
第 3 步 – 使用 PostgreSQL 角色和数据库
PostgreSQL 使用称为角色的概念来处理客户端身份验证和授权。这些在某些方面类似于常规 Unix 风格的帐户,但 Postgres 不区分用户和组,而是更喜欢更灵活的术语角色。
安装后,Postgres 设置为使用ident authentication,这意味着它将 Postgres 角色与匹配的 Unix/Linux 系统帐户相关联。如果 Postgres 中存在角色,则具有相同名称的 Unix/Linux 用户名可以作为该角色登录。
安装过程创建了一个名为postgres的用户帐户,该帐户与默认postgres
角色相关联。为了使用 PostgreSQL,您可以登录该帐户。
有几种方法可以使用此帐户访问 PostgreSQL 提示。
切换到 postgres 帐户
通过键入以下内容切换到服务器上的postgres帐户:
- sudo -i -u postgres
您现在可以通过键入以下内容立即访问 Postgres 提示:
- psql
这将使您登录到 PostgreSQL 提示符,从这里您可以立即自由地与数据库管理系统进行交互。
键入以下命令退出 PostgreSQL 提示符:
- \q
这会将您带回postgres帐户的 Linux 命令提示符。现在使用以下内容返回到您的原始帐户:
- exit
在不切换帐户的情况下访问 Postgres 提示
您还可以直接使用postgres帐户运行命令sudo
。
例如,在前面的示例中,您被指示通过首先切换到postgres用户然后运行psql
以打开 Postgres 提示来访问 Postgres 提示。作为另一种选择,您可以通过psql
以postgres用户身份运行单个命令来一步完成此操作sudo
,如下所示:
- sudo -u postgres psql
这将使您直接登录到 Postgres,而无需中间bash
外壳。
同样,您可以通过键入以下内容退出交互式 Postgres 会话:
- \q
在此步骤中,您使用postgres帐户到达psql
提示。但是许多用例需要不止一个 Postgres 角色。继续阅读以了解如何配置新角色。
第 4 步 – 创建新角色
目前,您只在数据库中配置了postgres角色。您可以使用命令从命令行创建新角色createrole
。该--interactive
标志将提示您输入新角色的名称,并询问它是否应具有超级用户权限。
如果您以postgres帐户登录,则可以通过键入以下内容来创建新用户:
- createuser --interactive
相反,如果您更喜欢在sudo
不从普通帐户切换的情况下为每个命令使用,请键入:
- sudo -u postgres createuser --interactive
该脚本将提示您进行一些选择,并根据您的回答执行必要的 Postgres 命令以根据您的规范创建用户。在本教程中,创建一个名为sammy的角色,并y
在出现提示时输入:
OutputEnter name of role to add: sammy
Shall the new role be a superuser? (y/n) y
您可以通过传递一些额外的标志来获得更多控制权。通过查看以下man
页面来查看选项createuser
:
- man createuser
您的 Postgres 安装现在有了一个新角色,但您还没有添加任何数据库。下一节描述了这个过程。
步骤 5 — 创建新数据库
Postgres 身份验证系统默认做出的另一个假设是,对于用于登录的任何角色,该角色将拥有一个可以访问的同名数据库。
这意味着如果您在上一节中创建的用户名为sammy,则该角色将尝试连接到sammy
默认调用的数据库。您可以使用createdb
命令创建这样的数据库。
如果您以postgres帐户登录,您将输入如下内容:
- createdb sammy
相反,如果您更喜欢在sudo
不从普通帐户切换的情况下为每个命令使用,您可以键入:
- sudo -u postgres createdb sammy
这种灵活性为根据需要创建数据库提供了多种途径。
现在您已经创建了一个新数据库,您将使用新角色登录该数据库。
第 6 步 — 打开具有新角色的 Postgres 提示
要使用基于身份的身份验证登录,您需要一个与 Postgres 角色和数据库同名的 Linux 用户。
如果您没有可用的匹配 Linux 用户,则可以使用该adduser
命令创建一个。您必须使用具有特权的非root帐户执行此操作sudo
(即,不是以postgres用户身份登录):
- sudo adduser sammy
一旦这个新帐户可用,您可以切换,然后通过首先键入以下内容连接到数据库:
- sudo -i -u sammy
- psql
或者,您可以内联执行此操作:
- sudo -u sammy psql
此命令将自动登录。
如果您希望您的用户连接到不同的数据库,您可以通过包含-d
标志并指定数据库来实现,如下所示:
- psql -d postgres
登录后,您可以通过键入以下内容来检查当前的连接信息:
- \conninfo
这将显示以下输出:
OutputYou are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".
如果您要连接到非默认数据库或非默认用户,这将非常有用。
连接到数据库后,您现在可以尝试创建和删除表。
步骤 7 — 创建和删除表
现在您知道如何连接到 PostgreSQL 数据库系统,您可以学习一些基本的 Postgres 管理任务。
首先,创建一个表来存储一些数据。例如,您将制作一个表格来描述一些游乐场设备。
该命令的基本语法如下:
CREATE TABLE table_name (
column_name1 col_type (field_length) column_constraints,
column_name2 col_type (field_length),
column_name3 col_type (field_length)
);
这些命令为表命名,然后定义列以及列类型和字段数据的最大长度。您还可以选择为每列添加表约束。
出于演示目的,创建一个简单的表,如下所示:
- CREATE TABLE playground (
- equip_id serial PRIMARY KEY,
- type varchar (50) NOT NULL,
- color varchar (25) NOT NULL,
- location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
- install_date date
- );
此命令将创建一个用于清点游乐场设备的表。它以设备 ID 开头,属于serial
类型。此数据类型是自动递增的整数。您还为该列指定了 约束PRIMARY KEY
,这意味着这些值必须是唯一的且不为空。
对于两列 (equip_id
和install_date
),该命令未指定字段长度。这是因为某些列类型不需要设置长度,因为类型隐含了长度。
接下来的两行分别为设备type
和创建列color
,每一列不能为空。这些之后的行创建一个location
列和一个约束,要求该值是八个可能的值之一。最后一行创建一个日期列,记录您安装设备的日期。
您可以通过键入以下内容来查看新表:
- \d
这将显示以下输出:
Output List of relations
Schema | Name | Type | Owner
--------+-------------------------+----------+-------
public | playground | table | sammy
public | playground_equip_id_seq | sequence | sammy
(2 rows)
您操场表是在这里,但也有一些所谓的playground_equip_id_seq
即是该类型sequence
。这是serial
您为equip_id
列提供的类型的表示。这会跟踪序列中的下一个数字,并为此类列自动创建。
如果只想查看没有序列的表,可以键入:
- \dt
这将产生以下结果:
Output List of relations
Schema | Name | Type | Owner
--------+------------+-------+-------
public | playground | table | sammy
(1 row)
在此步骤中,您创建了一个示例表。在下一步中,您将尝试添加、查询和删除该表中的条目。
步骤 8 — 在表中添加、查询和删除数据
现在您有了一个表,您可以向其中插入一些数据。
例如,通过调用要添加到的表、命名列,然后为每列提供数据来添加幻灯片和秋千,如下所示:
- INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28');
- INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');
输入数据时应注意避免一些常见的挂断。一方面,不要将列名括在引号中,但您输入的列值确实需要引号。
要记住的另一件事是不要为该equip_id
列输入值。这是因为每当在表中创建新行时它都会自动生成。
通过键入以下内容检索您添加的信息:
- SELECT * FROM playground;
您将看到以下输出:
Output equip_id | type | color | location | install_date
----------+-------+--------+-----------+--------------
1 | slide | blue | south | 2017-04-28
2 | swing | yellow | northwest | 2018-08-16
(2 rows)
在这里,您可以看到您equip_id
已成功填写,并且您的所有其他数据都已正确组织。
如果操场上的滑梯坏了并且您必须将其移除,您还可以通过键入以下内容从表中移除该行:
- DELETE FROM playground WHERE type = 'slide';
再次查询表:
- SELECT * FROM playground;
您将看到以下内容:
Output equip_id | type | color | location | install_date
----------+-------+--------+-----------+--------------
2 | swing | yellow | northwest | 2018-08-16
(1 row)
请注意,您的幻灯片不再是表格的一部分。
现在您已经在表中添加和删除了条目,您可以尝试添加和删除列。
步骤 9 — 在表中添加和删除列
创建表后,您可以对其进行修改以添加或删除列。通过键入以下内容添加一列以显示每台设备的上次维护访问:
- ALTER TABLE playground ADD last_maint date;
如果再次查看你的表信息,你会看到新的列已经被添加了(但没有输入数据):
- SELECT * FROM playground;
您将看到以下内容:
Output equip_id | type | color | location | install_date | last_maint
----------+-------+--------+-----------+--------------+------------
2 | swing | yellow | northwest | 2018-08-16 |
(1 row)
删除列也同样简单。如果您发现您的工作人员使用单独的工具来跟踪维护历史记录,您可以通过键入以下内容删除该列:
- ALTER TABLE playground DROP last_maint;
这将删除last_maint
列和其中找到的任何值,但保留所有其他数据不变。
添加和删除列后,您可以尝试在最后一步更新现有数据。
步骤 10 — 更新表中的数据
到目前为止,您已经学习了如何向表中添加记录以及如何删除它们,但本教程尚未介绍如何修改现有条目。
您可以通过查询您想要的记录并将列设置为您想要使用的值来更新现有条目的值。您可以查询swing
记录(这将匹配表中的每个摆动)并将其颜色更改为red
:
- UPDATE playground SET color = 'red' WHERE type = 'swing';
您可以通过再次查询数据来验证操作是否成功:
- SELECT * FROM playground;
您将看到以下内容:
Output equip_id | type | color | location | install_date
----------+-------+-------+-----------+--------------
2 | swing | red | northwest | 2010-08-16
(1 row)
如您所见,您的幻灯片现在已注册为red
。
结论
您现在已在 CentOS 8 服务器上设置了 PostgreSQL。但是,使用 Postgres 还有很多东西要学习。以下是一些涵盖如何使用 Postgres 的更多指南: