介绍
在本实验中,你将学习 PostgreSQL 数据库的关键维护任务。目标是理解如何监控数据库对象的尺寸、执行常规维护以优化性能,并通过检查连接和日志来排查潜在问题。
你将首先连接到 PostgreSQL 数据库,并查询表和索引的大小。然后,你将学习如何运行 ANALYZE 来更新数据库统计信息,以及如何运行 VACUUM 来回收存储空间。最后,你将学习如何列出活动的客户端连接,并检查服务器日志中的错误,以诊断和解决数据库问题。
在本实验中,你将学习 PostgreSQL 数据库的关键维护任务。目标是理解如何监控数据库对象的尺寸、执行常规维护以优化性能,并通过检查连接和日志来排查潜在问题。
你将首先连接到 PostgreSQL 数据库,并查询表和索引的大小。然后,你将学习如何运行 ANALYZE 来更新数据库统计信息,以及如何运行 VACUUM 来回收存储空间。最后,你将学习如何列出活动的客户端连接,并检查服务器日志中的错误,以诊断和解决数据库问题。
在此步骤中,你将连接到 PostgreSQL 数据库并查询一个表及其索引的大小。了解数据库对象的大小对于性能调优和容量规划至关重要。
首先,打开一个终端。要以 postgres 用户连接到 PostgreSQL 服务器并访问 mydatabase 数据库,请执行以下命令:
sudo -u postgres psql mydatabase
你应该会看到 psql 提示符(mydatabase=#),这表明你已连接到 mydatabase 数据库。本实验中所有后续的 SQL 命令都应在此 psql shell 中运行,除非另有说明。
现在,让我们确定 mytable 的大小。我们将使用 pg_size_pretty 和 pg_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 命令收集数据库表中内容的统计信息。PostgreSQL 查询规划器使用这些统计信息来选择最高效的查询执行计划。如果没有准确的统计信息,规划器可能会做出错误的决策,导致查询性能低下。定期运行 ANALYZE 是一个好习惯,尤其是在表数据发生重大更改之后。
在 psql shell 中,对 mytable 表运行 ANALYZE:
ANALYZE mytable;
此命令会分析 mytable 并更新其统计信息。你将看到以下输出,确认命令已成功执行:
ANALYZE
尽管该命令仅返回 ANALYZE,但它已在后台更新了 mytable 的内部统计信息。
在此步骤中,你将使用 VACUUM 命令执行另一项关键的维护任务:回收存储空间。
理解 VACUUM
在 PostgreSQL 中,当一行被更新或删除时,该行的旧版本(一个“死元组”)不会立即从磁盘中移除。VACUUM 会回收这些死元组占用的存储空间,使该空间可供重用。它还会更新数据可见性信息,这有助于提高查询性能。
让我们在 mytable 表上运行 VACUUM。在 psql shell 中,执行:
VACUUM mytable;
此命令将处理表并返回确认信息:
VACUUM
你也可以将 VACUUM 和 ANALYZE 合并为一个高效的命令。这是一种常见的维护实践。
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 数据库的健康、性能和可靠性至关重要。