文章

pgsql常用命令

登录

1
2
3
4
5
psql -h hostname -d dbname -U username

成功连接后,你将看到类似以下的提示符,表示你已经连接到数据库:
dbname=>

查看连接总数

1
select count(*) from pg_stat_activity;

查看所有连接的用户

1
select * from pg_stat_activity;

查询当前进程

| 查询目的 | 主要命令(可选条件) | 关键字段说明(部分) | |———————–|—————————————————————————————————————–|—————————————————————————————| | 🔍 查看所有活动连接/进程 | SELECT * FROM pg_stat_activity;157 | pid(进程ID), usename(用户名), datname(数据库名), query(执行语句), state(状态), backend_start(连接开始时间) | | ⏳ 查看活跃查询(排除空闲) | SELECT * FROM pg_stat_activity WHERE state = ‘active’; | 同上,重点关注 state=’active’ 的记录 | | 🐢 查看长时间运行的查询 | SELECT * FROM pg_stat_activity WHERE state = ‘active’ AND now() - query_start > interval ‘5 minutes’; (可调整时间间隔) | 同上,额外关注 query_start(查询开始时间),计算运行时长 | | 🔒 查看锁等待情况(关联查询) | 结合 pg_locks 和 pg_stat_activity 视图进行关联查询 | 需要关联字段如 pid,关注 wait_event_type 和 wait_event3 | | ⚙️ 查看后台进程状态(如写进程) | SELECT * FROM pg_stat_bgwriter; | 提供后台写入进程的统计信息 | | 📊 查看复制进程状态(如果配置了流复制) | SELECT * FROM pg_stat_replication; | 显示复制连接的详细信息(如进程ID、状态) |

查看后再终止(推荐做法)

1
2
3
4
5
6
7
8
9
10
11
12
-- 先查看要终止的进程详情
SELECT pid, usename, datname, query, state, query_start 
FROM pg_stat_activity 
WHERE state = 'idle' 
AND (now() - state_change) > interval '5 minutes';

--------- 一定要确认后再执行
-- 确认无误后再执行终止
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE state = 'idle' 
AND (now() - state_change) > interval '5 minutes';

终止单个特定进程

1
2
3
4
5
-- 终止单个特定进程
SELECT pg_terminate_backend(pid);  -- 将 pid 替换为实际的进程ID

-- 示例:终止进程ID为 12345 的连接
SELECT pg_terminate_backend(12345);

列出所有库

1
\l

切换数据库

1
\c your_database_name

列出所有表

1
2
3
4
5
\dt

列出当前数据库中的所有表
\dt schema_name.*

列出表结构

1
2
3
\d

\d <表名>

查询所有数据库存储大小

1
2
3
4
5
select datname,pg_size_pretty(pg_database_size(oid)) from pg_database;

k可以快速查看
\l+

查看表空间的占用情况, 列出所有数据库的大小

1
2
3
4
5
6
7
SELECT
    pg_database.datname AS database_name,
    pg_size_pretty(pg_database_size(pg_database.datname)) AS size
FROM
    pg_database
ORDER BY
    pg_database_size(pg_database.datname) DESC;

列出当前所有表及占用空间

查询将列出当前数据库中所有用户表的模式、名称以及占用的空间大小,并按照表占用的空间大小降序排列

1
2
3
4
5
6
7
8
9
10
SELECT
    table_schema,
    table_name,
    pg_size_pretty(pg_total_relation_size(table_schema || '.' || table_name)) AS total_table_size
FROM
    information_schema.tables
WHERE
    table_type = 'BASE TABLE'
ORDER BY
    pg_total_relation_size(table_schema || '.' || table_name) DESC;

查找最大的表

1
2
3
4
5
6
7
8
SELECT
    table_schema || '.' || table_name AS table_full_name,
    pg_size_pretty(pg_total_relation_size(table_schema || '.' || table_name)) AS total_table_size
FROM
    information_schema.tables
ORDER BY
    pg_total_relation_size(table_schema || '.' || table_name) DESC
LIMIT 1;

删除表数据

1
2
3
4
5
6
# 删除表
DELETE FROM table_name;

# 删除数据库中的数据
TRUNCATE TABLE your_table_name;

查看 dead tuples

1
2
3
SELECT relname, n_dead_tup, n_live_tup
FROM pg_stat_user_tables
WHERE relname='nodestore_node';
     
relname n_dead_tup n_live_tup
nodestore_node 12397323 300268042
1
2
- n_dead_tup:需要回收的记录数
- n_live_tup:当前有效记录数

PgSQL事务日志比较大(WAL - Write-Ahead Log 文件)

PostgreSQL 的事务日志(通常指 WAL - Write-Ahead Log 文件)的清理是一个自动管理的过程,但理解其机制并正确配置对于维护数据库健康至关重要。

核心概念:WAL 和归档

WAL 文件(位于 pg_wal 目录中)是保证数据一致性和实现故障恢复的核心。它们的清理不是通过手动删除文件来完成的,而是由 PostgreSQL 的内部机制在满足特定条件后自动进行的。

清理的关键在于 WAL 文件的“归档” 和 检查点(Checkpoint)。

查看 WAL 使用情况

-- 查看当前WAL写入位置和归档状态
SELECT * FROM pg_stat_archiver;

-- 查看当前WAL文件信息
SELECT pg_current_wal_lsn(), pg_wal_lsn_diff(pg_current_wal_lsn(), '0/0') AS bytes_since_start;

-- 估算WAL生成速率(需要在不同时间点查询并计算差值)
SELECT pg_current_wal_lsn();
-- 等待一段时间后再次查询
SELECT pg_current_wal_lsn();
-- 然后使用 pg_wal_lsn_diff 计算差值
SELECT pg_wal_lsn_diff('LSN2', 'LSN1') / 1024 / 1024 AS mb_generated;

查看归档状态

SELECT * FROM pg_stat_archiver;
             
archived_count last_archived_wal last_archived_time failed_count last_failed_wal last_failed_time stats_reset
11930 0000000200000C2F000000F8 2025-09-05 09:57:04.646939+08 1 00000002.history 2025-09-03 21:27:49.400382+08 2025-09-03 21:20:27.847903+08

last_failed_wal:最近一次归档失败的WAL文件。如果此字段不为空,说明归档有问题。

last_failed_time:最近一次失败的时间。

failed_count:失败计数。

字段 解读
archived_count 11930 已成功归档的WAL文件总数非常多,说明归档进程长期在运行且大部分时间是正常的。
last_archived_wal 0000000200000C2F000000F8 最后一个成功归档的WAL文件名。其命名包含时间线、逻辑ID和物理ID信息。
last_archived_time 2025-09-05 09:57:04.646939+08 最后一次成功归档的时间(北京时间)。这表明归档最近是正常的。
failed_count 1 归档失败的总次数。仅有1次失败,相对于近1.2万次成功,失败率极低,表明问题只是偶发。
last_failed_wal 00000002.history 最后一次失败的文件是 .history 文件。这类文件包含时间线变化历史,通常在新时间线分支(如从备份恢复后)时创建。
last_failed_time 2025-09-03 21:27:49.400382+08 最后一次失败发生在9月3日晚上。失败后系统又成功归档了,说明问题已自动解决或已过去。
stats_reset 2025-09-03 21:20:27.847903+08 统计信息在9月3日晚刚被重置过。failed_count为1是重置后发生的失败。

查看PgSQL指定配置

1
SELECT name, setting, unit FROM pg_settings WHERE name IN ('max_wal_size', 'min_wal_size', 'checkpoint_timeout', 'checkpoint_completion_target');

| | | | | — | — | — | | name | setting | unit | checkpoint_completion_target | 0.9 | | checkpoint_timeout | 300 | s | max_wal_size | 1024 | MB | min_wal_size | 80 | MB

本文由作者按照 CC BY 4.0 进行授权