如何在 CentOS 7 上安装和使用 PostgreSQL
介绍
关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种结构化的方式来存储、组织和访问信息。
没有读锁的并发。
在本指南中,您将在 CentOS 7 服务器上安装 Postgres 并了解一些基本的使用方法。
先决条件
要学习本教程,您需要:
- 已按照我们针对新 CentOS 7 服务器的其他推荐步骤教程配置的 CentOS 7 服务器,包括具有 sudo 权限的非根用户和使用
firewalld
设置的防火墙。。李> - 要设置
firewalld
,请按照新 CentOS 7 服务器的其他推荐步骤教程的配置基本防火墙部分进行操作。 - 如果数据库非常活跃并且在内部记录上有时间戳,则它们特别容易受到系统时间变化的影响。为防止因时钟不同步而导致的某些不一致行为,请确保按照新 CentOS 7 服务器教程的其他推荐步骤教程的配置时区和网络时间协议同步部分设置网络时间协议 (NTP) 同步.
第 1 步 — 安装 PostgreSQL
可以使用默认的 CentOS 存储库安装 Postgres。但在撰写本教程时,CentOS 7 Base 存储库中可用的版本已过时。因此,本教程将使用官方 Postgres 存储库。
在您继续设置新的存储库之前,请从 CentOS-Base 存储库中排除对 postgresql
软件包的搜索。否则,依赖项可能会解析为基础存储库提供的 postgresql
。
使用您喜欢的文本编辑器打开存储库配置文件。本教程将使用 vim
:
- sudo vi /etc/yum.repos.d/CentOS-Base.repo
找到 [base]
和 [updates]
部分,按 i
进入插入模式,然后插入 exclude=postgresql*
两节中的行。因此,您的文件将如下所示,并突出显示新行:
...
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
exclude=postgresql*
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
exclude=postgresql*
...
完成后,按 ESC
退出插入模式,然后按 :wq
和 ENTER
保存并退出文件。要了解有关文本编辑器 vi 及其后续 vim 的更多信息,请查看我们的在云服务器上安装和使用 Vim 文本编辑器教程。
现在,使用 CentOS 的官方 PostgreSQL 存储库安装存储库配置包:
- sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
出现提示时,使用 y
确认安装。
PostgreSQL 存储库包含所有可用 PostgreSQL 版本的信息。您可以使用以下命令查看所有可用的包和版本:
- yum list postgresql*
选择并安装所需版本的 PostgreSQL。在本指南中,您将使用 PostgreSQL 11 版本。
要安装 PostgreSQL 服务器,请使用以下命令:
- sudo yum install postgresql11-server
在安装过程中,系统会询问您是否导入 GPG 密钥,提示如下:
...
Importing GPG key 0x442DF0F8:
Userid : "PostgreSQL RPM Building Project <pgsqlrpms-hackers@pgfoundry.org>"
Fingerprint: 68c9 e2b9 1a37 d136 fe74 d176 1f16 d2e1 442d f0f8
Package : pgdg-redhat-repo-42.0-5.noarch (installed)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
Is this ok [y/N]:
使用 y
确认,以便安装完成。
现在软件已安装,您将执行一些初始化步骤来为 PostgreSQL 准备一个新的数据库集群。
第 2 步 — 创建一个新的 PostgreSQL 数据库集群
在使用 Postgres 数据库之前,您必须创建一个新的 PostgreSQL 数据库集群。数据库集群是由单个服务器实例管理的数据库的集合。创建数据库集群包括创建放置数据库数据的目录、生成共享目录表以及创建 template1
和 postgres
数据库。
创建新数据库需要 template1
数据库。存储在其中的所有内容都将在创建时放置在新数据库中。 postgres
数据库是为用户、实用程序和第三方应用程序使用而设计的默认数据库。
使用 initdb
创建一个新的 PostgreSQL 数据库集群:
- sudo /usr/pgsql-11/bin/postgresql-11-setup initdb
您将看到以下输出:
OutputInitializing database ... OK
现在使用 systemctl
启动并启用 PostgreSQL:
- sudo systemctl start postgresql-11
- sudo systemctl enable postgresql-11
这将给出以下输出
OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/postgresql-11.service to /usr/lib/systemd/system/postgresql-11.service.
现在 PostgreSQL 已启动并运行,您将通过使用角色来了解 Postgres 的工作原理以及它与您过去可能使用过的类似数据库管理系统的不同之处。
第 3 步 — 使用 PostgreSQL 角色和数据库
默认情况下,Postgres 使用称为角色 的概念来处理身份验证和授权。这些在某些方面类似于常规的 Unix 风格的帐户,但 Postgres 不区分用户和组,而是更喜欢更灵活的术语角色。
安装后,Postgres 设置为使用 ident 身份验证,这意味着它将 Postgres 角色与匹配的 Unix/Linux 系统帐户相关联。如果 Postgres 中存在角色,则具有相同名称的 Unix/Linux 用户名可以作为该角色登录。
安装过程创建了一个名为 postgres 的用户帐户,该帐户与默认的 Postgres 角色相关联。为了使用 Postgres,您可以登录该帐户。
有几种方法可以使用此帐户访问 Postgres。
切换到 postgres 帐户
通过键入以下内容切换到服务器上的 postgres 帐户:
- sudo -i -u postgres
您现在可以通过键入以下内容立即访问 Postgres 提示符:
- psql
这将使您登录到 PostgreSQL 提示符,从这里您可以立即自由地与数据库管理系统进行交互。
通过键入以下内容退出 PostgreSQL 提示符:
- \q
这将使您返回到 postgres Linux 命令提示符。现在使用以下命令返回到您原来的 sudo 帐户:
- exit
在不切换帐户的情况下访问 Postgres 提示符
您也可以直接使用 sudo
使用 postgres 帐户运行您想要的命令。
例如,在最后一个示例中,您被指示通过首先切换到 postgres 用户然后运行 psql
打开 Postgres 提示符来进入 Postgres 提示符。您可以通过以 postgres 用户身份使用 sudo
运行单个命令 psql
来一步完成此操作,如下所示:
- sudo -u postgres psql
这将使您直接登录到 Postgres,而无需中间 bash
shell。
同样,您可以通过键入以下命令退出交互式 Postgres 会话:
- \q
在此步骤中,您使用了 postgres 帐户到达 psql
提示符。但是许多用例需要不止一个 Postgres 角色。继续阅读以了解如何配置新角色。
第 4 步 — 创建新角色
目前,您只在数据库中配置了 postgres 角色。您可以使用 createrole
命令从命令行创建新角色。 --interactive
标志将提示您输入新角色的名称,并询问它是否应该具有超级用户权限。
如果您以 postgres 帐户登录,则可以通过键入以下内容来创建新用户:
- createuser --interactive
相反,如果您更喜欢对每个命令使用 sudo
而无需从您的普通帐户切换,请键入:
- sudo -u postgres createuser --interactive
该脚本将提示您做出一些选择,并根据您的回答执行正确的 Postgres 命令以创建符合您规范的用户。对于本教程,创建一个 sammy 用户并赋予它超级用户权限:
OutputEnter name of role to add: sammy
Shall the new role be a superuser? (y/n) y
您可以通过传递一些额外的标志来获得更多控制。通过查看 man
页面来检查选项:
- man createuser
您安装的 Postgres 现在有了一个新用户,但您还没有添加任何数据库。下一节将描述这个过程。
第 5 步 — 创建新数据库
Postgres 身份验证系统默认做出的另一个假设是,对于用于登录的任何角色,该角色将拥有一个它可以访问的同名数据库。
这意味着,如果您在上一节中创建的用户名为 sammy,则该角色将尝试连接到默认情况下也称为 sammy
的数据库。您可以使用 createdb
命令创建适当的数据库。
如果您以 postgres 帐户登录,您将键入如下内容:
- createdb sammy
相反,如果您更喜欢对每个命令使用 sudo
而无需从您的普通帐户切换,您可以键入:
- sudo -u postgres createdb sammy
这种灵活性为根据需要创建数据库提供了多种途径。
现在您已经创建了一个新数据库,您将使用您的新角色登录它。
第 6 步 — 使用新角色打开 Postgres 提示符
要使用基于 ident
的身份验证登录,您需要一个与您的 Postgres 角色和数据库同名的 Linux 用户。
如果您没有可用的匹配 Linux 用户,您可以使用 adduser
命令创建一个。您必须从具有 sudo
权限的非根帐户执行此操作(意思是,不是以 postgres 用户身份登录):
- sudo adduser sammy
一旦这个新帐户可用,您可以通过键入以下内容切换并连接到数据库:
- sudo -i -u sammy
- psql
或者,您可以内联执行此操作:
- sudo -u sammy psql
此命令将自动让您登录。
如果您希望您的用户连接到不同的数据库,您可以通过如下指定数据库来实现:
- 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)
);
这些命令为表命名,然后定义列以及列类型和字段数据的最大长度。您还可以选择为每一列添加表约束。
您可以在我们的如何在云服务器上的 PostgreSQL 中创建、删除和管理表教程中了解更多信息。
出于演示目的,创建一个像这样的简单表:
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 表在这里,但还有一个名为 playground_equip_id_seq
的东西,它属于 sequence
类型。这是您为 equip_id
列提供的 serial
类型的表示。这会跟踪序列中的下一个数字,并为此类列自动创建。
如果您只想查看没有序列的表格,您可以键入:
- \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
已成功填写,并且所有其他数据已正确组织。
如果 playground 上的幻灯片坏了而你必须将其删除,你也可以通过键入以下内容从表格中删除该行:
- 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
记录(这将匹配您表中的每个 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)
如您所见,您的幻灯片现在已注册为红色。
结论
您现在已在 CentOS 7 服务器上设置了 PostgreSQL。然而,使用 Postgres 还有很多东西需要学习。以下是一些涵盖如何使用 Postgres 的指南:
- 关系数据库管理系统的比较
- 了解如何使用 Postgres 创建和管理表
- 更好地管理角色和权限
- 使用 Select 在 Postgres 中创建查询