简介
关系数据库管理系统是许多网站和应用程序的关键组成部分。它们提供了一种结构化的方式来存储、组织和访问信息。
PostgreSQL,或者简称为 Postgres,是一个关系数据库管理系统,提供了 SQL 查询语言的实现。它是许多小型和大型项目的热门选择,并且具有符合标准和可靠的事务以及无读锁并发等许多高级功能的优势。
在本指南中,您将在 CentOS 7 服务器上安装 Postgres,并学习一些基本的使用方法。
先决条件
要按照本教程进行操作,您需要:
- 通过遵循我们的《在 CentOS 7 上进行初始服务器设置》和《新 CentOS 7 服务器的其他推荐步骤》教程对 CentOS 7 服务器进行配置,包括具有 sudo 权限的非根用户和使用
firewalld
设置防火墙。 - 要设置
firewalld
,请按照《新 CentOS 7 服务器的其他推荐步骤》教程中的 配置基本防火墙 部分进行操作。 - 如果数据库非常活跃并且在内部记录中有时间戳,那么数据库可能对系统时间更改特别敏感。为了防止由于时钟不同步而导致的一些不一致行为,确保按照《新 CentOS 7 服务器的其他推荐步骤》教程中的 配置时区和网络时间协议同步 部分设置网络时间协议(NTP)同步。
步骤 1 — 安装 PostgreSQL
Postgres 可以使用默认的 CentOS 软件仓库进行安装。但是在撰写本教程时,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 文本编辑器》教程。
现在,使用官方的 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 数据库集群
在使用 PostgreSQL 数据库之前,您需要创建一个新的 PostgreSQL 数据库集群。数据库集群是由单个服务器实例管理的一组数据库。创建数据库集群包括创建数据库数据将被放置的目录,生成共享目录表,以及创建 template1
和 postgres
数据库。
template1
数据库是创建新数据库所需的。存储在其中的所有内容将在创建新数据库时被放置在其中。postgres
数据库是一个默认数据库,用于用户、实用程序和第三方应用程序。
使用 initdb
创建一个新的 PostgreSQL 数据库集群:
sudo /usr/pgsql-11/bin/postgresql-11-setup initdb
您将看到以下输出:
Initializing database ... OK
现在使用 systemctl
启动和启用 PostgreSQL:
sudo systemctl start postgresql-11 sudo systemctl enable postgresql-11
这将产生以下输出:
Created 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 用户使用 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 的用户,并赋予它超级用户权限:
Enter 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
如果你更喜欢在不切换到 postgres 用户的情况下为每个命令使用 sudo
,你可以输入:
sudo -u postgres createdb sammy
这种灵活性提供了多种创建数据库的方式。
现在你已经创建了一个新数据库,接下来你将使用新角色登录到该数据库。
步骤 6 — 使用新角色打开 Postgres 提示符
要使用基于 ident
的认证登录,你需要一个与你的 Postgres 角色和数据库同名的 Linux 用户。
如果你没有匹配的 Linux 用户可用,你可以使用 adduser
命令创建一个。你需要在具有 sudo
权限的非 root 账户下执行此操作(也就是说,不是以 postgres 用户登录):
sudo adduser sammy
一旦创建了这个新账户,你可以切换并连接到数据库,输入:
sudo -i -u sammy psql
或者,你也可以内联执行:
sudo -u sammy psql
这个命令将自动登录你。
如果你想让你的用户连接到不同的数据库,你可以这样指定数据库:
psql -d postgres
登录后,你可以通过输入以下命令来检查当前的连接信息:
\conninfo
这将显示以下输出:
You 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
这将显示以下输出:
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
这将产生以下结果:
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;
你将看到以下输出:
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;
你将看到以下内容:
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;
你将看到以下内容:
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
列以及其中的任何值,但会保留所有其他数据。
现在已经添加和删除了列,可以尝试在最后一步中更新现有数据。
第十步 —— 更新表中的数据
到目前为止,你已经学会了如何向表中添加记录以及如何删除它们,但本教程还没有涵盖如何修改现有条目。
你可以通过查询要更新的记录并将列设置为所需的值来更新现有条目的值。你可以查询 swing
记录(这将匹配表中的每个秋千)并将其颜色更改为 red
:
UPDATE playground SET color = 'red' WHERE type = 'swing';
你可以通过再次查询数据来验证操作是否成功:
SELECT * FROM playground;
你将看到以下内容:
equip_id | type | color | location | install_date ----------+-------+-------+-----------+-------------- 2 | swing | red | northwest | 2010-08-16 (1 row)
如你所见,你的秋千现在被注册为红色。
结论
你现在已经在你的 CentOS 7 服务器上设置了 PostgreSQL。然而,还有很多关于 Postgres 的知识需要学习。以下是一些涵盖如何使用 Postgres 的更多指南:
- 关系数据库管理系统的比较
- 学习如何创建和管理 Postgres 表
- 更好地管理角色和权限
- 使用 Select 在 Postgres 中编写查询