PostgreSQL 数据库维护

PostgreSQLBeginner
立即练习

介绍

在本实验中,你将学习 PostgreSQL 数据库的关键维护任务。目标是理解如何监控数据库对象的尺寸、执行常规维护以优化性能,并通过检查连接和日志来排查潜在问题。

你将首先连接到 PostgreSQL 数据库,并查询表和索引的大小。然后,你将学习如何运行 ANALYZE 来更新数据库统计信息,以及如何运行 VACUUM 来回收存储空间。最后,你将学习如何列出活动的客户端连接,并检查服务器日志中的错误,以诊断和解决数据库问题。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 88%。获得了学习者 100% 的好评率。

查询数据库对象大小

在此步骤中,你将连接到 PostgreSQL 数据库并查询一个表及其索引的大小。了解数据库对象的大小对于性能调优和容量规划至关重要。

首先,打开一个终端。要以 postgres 用户连接到 PostgreSQL 服务器并访问 mydatabase 数据库,请执行以下命令:

sudo -u postgres psql mydatabase

你应该会看到 psql 提示符(mydatabase=#),这表明你已连接到 mydatabase 数据库。本实验中所有后续的 SQL 命令都应在此 psql shell 中运行,除非另有说明。

现在,让我们确定 mytable 的大小。我们将使用 pg_size_prettypg_relation_size 函数。pg_relation_size 以字节为单位返回表的大小,而 pg_size_pretty 则将其格式化为人类可读的格式(例如 KB、MB)。

执行以下 SQL 查询以获取 mytable 的大小:

SELECT pg_size_pretty(pg_relation_size('mytable'));

你应该会看到类似以下的输出,显示表数据占用的磁盘空间:

 pg_size_pretty
----------------
 56 kB
(1 row)

接下来,检查在 name 列上创建的索引 idx_mytable_name 的大小:

SELECT pg_size_pretty(pg_relation_size('idx_mytable_name'));

输出将显示索引占用的空间:

 pg_size_pretty
----------------
 48 kB
(1 row)

最后,要获取表及其所有索引的总大小,请使用 pg_total_relation_size 函数:

SELECT pg_size_pretty(pg_total_relation_size('mytable'));

此输出显示了表及其索引的组合大小:

 pg_size_pretty
----------------
 176 kB
(1 row)

使用 ANALYZE 进行优化

在此步骤中,你将了解 ANALYZE 命令,该命令对于维护良好的查询性能至关重要。

理解 ANALYZE

ANALYZE 命令收集数据库表中内容的统计信息。PostgreSQL 查询规划器使用这些统计信息来选择最高效的查询执行计划。如果没有准确的统计信息,规划器可能会做出错误的决策,导致查询性能低下。定期运行 ANALYZE 是一个好习惯,尤其是在表数据发生重大更改之后。

psql shell 中,对 mytable 表运行 ANALYZE

ANALYZE mytable;

此命令会分析 mytable 并更新其统计信息。你将看到以下输出,确认命令已成功执行:

ANALYZE

尽管该命令仅返回 ANALYZE,但它已在后台更新了 mytable 的内部统计信息。

使用 VACUUM 回收存储空间

在此步骤中,你将使用 VACUUM 命令执行另一项关键的维护任务:回收存储空间。

理解 VACUUM

在 PostgreSQL 中,当一行被更新或删除时,该行的旧版本(一个“死元组”)不会立即从磁盘中移除。VACUUM 会回收这些死元组占用的存储空间,使该空间可供重用。它还会更新数据可见性信息,这有助于提高查询性能。

让我们在 mytable 表上运行 VACUUM。在 psql shell 中,执行:

VACUUM mytable;

此命令将处理表并返回确认信息:

VACUUM

你也可以将 VACUUMANALYZE 合并为一个高效的命令。这是一种常见的维护实践。

VACUUM ANALYZE mytable;

此命令首先回收存储空间,然后更新表的统计信息,完成后返回 VACUUM

注意: 还有一个 VACUUM FULL 命令,它更积极地回收空间并缩小磁盘文件。但是,它会锁定整个表,在操作期间阻止任何读写操作,因此应谨慎使用,仅在必要时使用。

监控连接和日志

在最后一步中,你将学习如何监控活动的数据库连接并检查服务器日志中的错误,这些都是故障排除的关键技能。

首先,在 psql shell 中,你可以查询 pg_stat_activity 视图来查看所有到服务器的活动连接。

执行以下 SQL 查询:

SELECT datname, usename, client_addr, state FROM pg_stat_activity;

此查询显示数据库名称 (datname)、用户名 (usename)、客户端 IP 地址 (client_addr) 和连接的当前状态 (state)。你将在输出中看到你自己的连接,类似如下:

  datname  | usename  | client_addr | state
-----------+----------+-------------+--------
 mydatabase| postgres |             | active
 postgres  | postgres |             |
           | labex    |             |
(3 rows)

接下来,你将检查服务器日志。要做到这一点,你必须先退出 psql shell。输入 \q 并按 Enter:

\q

你现在回到了标准的 Linux 终端提示符。PostgreSQL 日志位于 /var/log/postgresql/ 目录中。在此系统上,日志文件是 postgresql-14-main.log

使用 grep 命令在日志文件中搜索包含“ERROR”的行:

grep ERROR /var/log/postgresql/postgresql-14-main.log

如果没有错误,此命令将不产生任何输出。这是此实验的预期结果,因为我们没有执行任何会导致错误的动作。检查服务器日志是诊断数据库问题的基本步骤。

总结

在此实验中,你学习了如何执行 PostgreSQL 数据库的基本维护任务。你现在了解了如何监控表和索引的大小,运行 ANALYZE 来优化查询性能,以及使用 VACUUM 来回收存储空间。你还练习了列出活动的客户端连接和检查服务器日志中的错误。这些技能对于确保你的 PostgreSQL 数据库的健康、性能和可靠性至关重要。