如何在Rocky Linux 9上安装和使用PostgreSQL
引言
关系型数据库管理系统是许多网站和应用程序的重要组成部分,它们提供了一种有序的存储、组织和访问信息的方式。
PostgreSQL,又被称为Postgres,是一个关系数据库管理系统,提供了一种结构化查询语言(Structured Query Language)的实现。它被许多流行的项目,无论大小,广泛使用,符合标准,并具有可靠的事务和无读取锁的并发等许多高级功能。
通过遵循这个指南,您将在Rocky Linux 9服务器上安装最新版本的PostgreSQL。
前提条件
为了完成这个教程,你需要一个运行Rocky Linux 9的服务器。该服务器应该有一个具有管理权限的非root用户,并且配置了firewalld防火墙。要进行设置,请参考我们的Rocky Linux 9初步服务器设置指南。
步骤一 — 安装 PostgreSQL
PostgreSQL可以从Rocky Linux的默认软件库中获取,并可以使用Rocky的软件包管理器dnf进行安装。同时,您还应该安装另一个名为glibc-all-langpacks的软件包,以提高Postgres的多语言支持。可以通过dnf install命令同时安装它们。
- sudo dnf install postgresql-server glibc-all-langpacks
当收到提示时,请按y然后按回车键确认安装。
默认情况下,Rocky Linux 9安装的是PostgreSQL 13版本。现在软件已安装完成,您需要进行一些初始化步骤,以准备一个新的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的工作原理以及它与您过去可能使用过的类似数据库管理系统的区别。
第三步 – 使用PostgreSQL角色和数据库
PostgreSQL使用一种称为角色的概念来处理客户端身份验证和授权。在某些方面,这与常规的类Unix账户类似,但是Postgres不区分用户和组,而更倾向于更加灵活的术语角色。
安装后,Postgres被设置为使用标识认证,这意味着它将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提示符
你也可以直接使用sudo运行postgres账户的命令。
例如,在前面的示例中,您被指示首先切换到postgres用户,然后运行psql打开Postgres提示符。作为替代,您可以通过使用sudo作为postgres用户运行单个命令psql来一次性完成,就像这样:
- sudo -u postgres psql
这将直接将您登录到Postgres,无需通过中间的bash shell。
同样地,你可以通过键入命令来退出互动式Postgres会话:
- \q
在这个步骤中,您使用postgres账户来进入psql提示符。但是许多使用情况需要多个Postgres角色。请继续阅读以了解如何配置新角色。
第四步 — 创建一个新的角色
目前,数据库中只配置了postgres角色。您可以使用createrole命令在命令行上创建新角色。–interactive标志将提示您输入新角色的名称,并询问是否应授予超级用户权限。
如果您以postgres账户登录,可以通过输入以下命令来创建新用户:
- createuser --interactive
如果您希望在不切换到您的常规帐户的情况下为每个命令使用sudo,请输入:
- sudo -u postgres createuser --interactive
脚本会提示您选择,并根据您的回答执行必要的Postgres命令以创建符合您要求的用户。在本教程中,通过在提示时输入y,创建一个名为Sammy的角色,并赋予它超级用户权限。
OutputEnter name of role to add: sammy
Shall the new role be a superuser? (y/n) y
通过传递一些额外的标志,你可以获得更多的控制。查看createuser的man页以了解选项。
- man createuser
您的Postgres安装现在有一个新的角色,但是您还没有添加任何数据库。接下来的部分将描述此过程。
第五步 – 创建一个新的数据库
PostgreSQL的身份验证系统默认假设是,任何用于登录的角色都具有对同名数据库的访问权限。
这意味着,如果你在上一节创建的用户叫做Sammy,那权限角色会默认尝试连接到一个也叫Sammy的数据库。你可以使用createdb命令来创建这样的数据库。
如果你以postgres账户登录,你可以输入类似以下内容:
- createdb sammy
如果你更喜欢在不切换到普通账户的情况下,对每个命令使用sudo,则可以输入:
- sudo -u postgres createdb sammy
这种灵活性提供了根据需要创建数据库的多种方法的选择。
现在您已经创建了一个新的数据库,您将使用您的新角色登录。
第六步-使用新的角色打开Postgres提示符。
为了使用ident身份验证登录,您需要一个与您的Postgres角色和数据库名称相同的Linux用户。
如果您没有匹配的Linux用户可用,您可以使用adduser命令创建一个。您需要在具有sudo特权的非root帐户上执行此操作(也就是说,不要以postgres用户登录)。
- sudo adduser sammy
一旦这个新帐户可用,您可以选择切换并首先输入以下命令连接到数据库:
- sudo -i -u sammy
- psql
或者,你可以内嵌地进行这个操作。
- sudo -u sammy psql
这个命令将会自动登录你。
如果您希望用户连接到不同的数据库,您可以通过包括“-d”标志并指定数据库来实现,如下所示:
- psql -d sammy
一旦登录成功,你可以通过输入以下内容来查看你当前的连接信息:
- \conninfo
这将显示以下的输出结果。
OutputYou are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".
如果您正在连接非默认数据库或与非默认用户进行连接,这将非常有用。
连接到您的数据库后,您现在可以尝试创建和删除表格。
第七步 – 创建和删除表
现在你知道如何连接到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为起点,设备ID的类型是序列类型。这个数据类型是自增的整数。你还赋予了这列主键的约束,意味着值必须是唯一且非空的。
对于两个列(equip_id和install_date),该命令没有指定字段长度。这是因为某些列类型不需要设置长度,因为长度是由类型隐含的。
下面的两行分别创建设备类型和颜色的列,每个列都不能为空。在这些行之后,创建了一个位置列和一个约束条件,要求值必须是八个可能的值之一。最后一行创建了一个日期列,记录安装设备的日期。
通过输入,您可以看到您的新桌子。
- \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的东西,它是序列类型。这是你给equip_id列的一个序列类型的表示。它会跟踪下一个序列中的数字,并且会自动为此类型的列创建。
如果你只想看到表格而不包含序列,你可以输入:
- \dt
此将产生以下结果:
Output List of relations
Schema | Name | Type | Owner
--------+------------+-------+-------
public | playground | table | sammy
(1 row)
在这一步中,你创建了一个样本表。在下一步中,你将尝试在该表中添加、查询和删除条目。
第八步 – 在表中添加、查询和删除数据
现在你有了一个表,你可以向其中插入一些数据。
举个例子,通过调用要添加的表格,给每一列命名,并为每一列提供数据,来添加一个幻灯片和一个秋千,就像这样:
- 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)
在这里,你可以看到你的设备编号已经成功填写,并且你的其他数据都已正确组织。
如果操场上的滑梯坏了,你需要移除它,你也可以通过输入来删除你桌子上的行。
- 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)
请注意,你的幻灯片不再是表格的一部分。
既然你已经在表格中添加和删除了条目,现在可以尝试添加和删除列。
第九步 – 向表中添加和删除列
创建表后,您可以修改它来添加或删除列。通过输入,为每个设备添加一列以显示最后一次维护访问的日期:
- 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列及其内部的任何数值,但保留所有其他数据不变。
在现在已经添加和删除了列之后,您可以尝试在最后一步更新现有数据。
第十步——更新表中的数据
到目前为止,你已经学会了如何向表中添加记录和删除记录,但是这个教程还没有涉及如何修改已有的条目。
您可以通过查询要更新的记录,并将列设置为您想使用的值来更新现有条目的值。您可以查询摇摆记录(这将匹配表中的每个摇摆)并将其颜色更改为红色。
- 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)
正如你所见,你的幻灯片现在被识别为红色。
结论
您现在已在您的Rocky Linux 9服务器上设置好了PostgreSQL。然而,还有很多关于Postgres的知识需要学习。以下是一些更多指南,涵盖了如何使用Postgres的内容。
- A comparison of relational database management systems
- Learn about running queries in PostgreSQL