👋 我是三笠丶,一名专注数据库与数据库架构的 DBA。更多原创文章和技术资料同步更新:ora100.com
Greenplum 是基于 PostgreSQL 构建的 MPP 分布式分析型数据库,由 Coordinator、Standby Coordinator、Primary Segment 和 Mirror Segment 等组件组成。DBA 日常工作不仅包括数据库对象和 SQL,还需要关注 Segment 状态、数据分布、资源组、膨胀、统计信息、备份恢复及故障恢复。
下面整理 Greenplum DBA 常用的 100 条命令,主要面向 Greenplum 6/7 系列。不同发行版在术语上可能使用 Master/Coordinator,部分系统视图、资源管理方式和工具参数也可能不同,执行前应确认版本。开源 Greenplum 原项目仓库目前已归档,商业发行版应以对应 Broadcom Tanzu Greenplum 文档为最终依据。
文中的主机、端口、目录、数据库和表名均为示例。停止集群、恢复 Segment、切换 Standby、调整配置、重分布和恢复备份等操作,应先确认影响范围并准备回退方案。
一、连接与基础信息
1. 使用 psql 连接 Greenplum
psql -h 192.168.1.10 -p 5432 -U gpadmin -d postgres
客户端应连接 Coordinator,不要直接连接 Segment 处理业务数据。
2. 查看数据库版本
SELECT version();
3. 查看当前数据库
SELECT current_database();
4. 查看当前用户
SELECT current_user, session_user;
5. 查看当前时间
SELECT now(), current_timestamp;
6. 查看连接地址和端口
SELECT inet_server_addr(), inet_server_port(),
inet_client_addr(), inet_client_port();
7. 查看搜索路径
SHOW search_path;
8. 查看所有数据库
\l+
9. 查看 Schema
\dn+
10. 查看已安装扩展
\dx
二、集群状态与节点
11. 查看集群概要状态
gpstate
12. 查看集群详细状态
gpstate -s
13. 查看异常 Segment
gpstate -e
14. 查看 Primary 与 Mirror 映射
gpstate -m
15. 查看 Standby 状态
gpstate -f
16. 查看端口和数据目录
gpstate -p
17. 从系统表查看 Segment
SELECT dbid, content, role, preferred_role, mode, status,
hostname, address, port, datadir
FROM gp_segment_configuration
ORDER BY content, role;
18. 查看异常 Segment 配置
SELECT dbid, content, role, preferred_role, mode, status,
hostname, port, datadir
FROM gp_segment_configuration
WHERE status <> 'u'
OR role <> preferred_role
OR mode <> 's'
ORDER BY content, role;
19. 查看各主机 Segment 数量
SELECT hostname, role, count(*) AS segment_count
FROM gp_segment_configuration
WHERE content >= 0
GROUP BY hostname, role
ORDER BY hostname, role;
20. 查看集群配置历史
SELECT *
FROM gp_configuration_history
ORDER BY time DESC
LIMIT 50;
三、数据库、表与分布
21. 创建数据库
CREATE DATABASE appdb;
22. 查看数据库大小
SELECT datname,
pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
23. 查看数据库连接数
SELECT datname, count(*) AS connections
FROM pg_stat_activity
GROUP BY datname
ORDER BY connections DESC;
24. 查看表
\dt+ app.*
25. 查看表定义
pg_dump -s -t app.orders appdb
26. 创建 Hash 分布表
CREATE TABLE app.orders (
order_id BIGINT,
customer_id BIGINT,
order_time TIMESTAMP,
amount NUMERIC(18,2)
)
DISTRIBUTED BY (order_id);
27. 创建随机分布表
CREATE TABLE app.event_stage (
event_id BIGINT,
payload TEXT
)
DISTRIBUTED RANDOMLY;
28. 创建复制表
CREATE TABLE app.dim_status (
status_code VARCHAR(20),
status_name VARCHAR(100)
)
DISTRIBUTED REPLICATED;
复制表适合体量较小、更新不频繁的维表。
29. 创建 AO 行存表
CREATE TABLE app.order_history (
order_id BIGINT,
order_time TIMESTAMP,
amount NUMERIC(18,2)
)
WITH (appendoptimized=true, orientation=row)
DISTRIBUTED BY (order_id);
30. 创建 AO 列存压缩表
CREATE TABLE app.fact_sales (
sale_id BIGINT,
sale_date DATE,
amount NUMERIC(18,2)
)
WITH (
appendoptimized=true,
orientation=column,
compresstype=zlib,
compresslevel=5
)
DISTRIBUTED BY (sale_id);
31. 创建范围分区表
CREATE TABLE app.fact_log (
log_id BIGINT,
log_date DATE,
message TEXT
)
DISTRIBUTED BY (log_id)
PARTITION BY RANGE (log_date)
(
START (DATE '2026-01-01')
INCLUSIVE END (DATE '2027-01-01')
EXCLUSIVE EVERY (INTERVAL '1 month')
);
分区语法在不同大版本存在差异,执行前应在测试环境验证。
32. 查看表的分布键
SELECT n.nspname AS schema_name,
c.relname AS table_name,
pg_get_table_distributedby(c.oid) AS distributed_by
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'app'
AND c.relname = 'orders';
33. 查看分区层级
SELECT *
FROM pg_partitions
WHERE schemaname = 'app'
AND tablename = 'fact_log'
ORDER BY partitionrank;
34. 查看表存储方式
SELECT n.nspname, c.relname, c.relstorage
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'app'
ORDER BY c.relname;
relstorage 的取值含义与版本有关,可结合 pg_appendonly 判断 AO 表属性。
35. 查看 AO 表属性
SELECT n.nspname, c.relname, a.*
FROM pg_appendonly a
JOIN pg_class c ON c.oid = a.relid
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'app';
四、容量、倾斜与膨胀
36. 查看表总大小
SELECT pg_size_pretty(
pg_total_relation_size('app.orders')
) AS total_size;
37. 查看 Schema 容量
SELECT sotdschemaname AS schemaname,
pg_size_pretty(
SUM(sotdsize + sotdtoastsize + sotdadditionalsize)::BIGINT
) AS total_size
FROM gp_toolkit.gp_size_of_table_and_indexes_disk
GROUP BY sotdschemaname
ORDER BY SUM(sotdsize + sotdtoastsize + sotdadditionalsize) DESC;
38. 查看大表排行
SELECT sotdschemaname AS schemaname,
sotdtablename AS tablename,
pg_size_pretty(
sotdsize + sotdtoastsize + sotdadditionalsize
) AS size
FROM gp_toolkit.gp_size_of_table_and_indexes_disk
ORDER BY sotdsize + sotdtoastsize + sotdadditionalsize DESC
LIMIT 20;
39. 查看表在各 Segment 的行数
SELECT gp_segment_id, count(*) AS rows
FROM app.orders
GROUP BY gp_segment_id
ORDER BY gp_segment_id;
40. 计算表的数据倾斜
SELECT gp_segment_id, count(*) AS rows
FROM app.orders
GROUP BY gp_segment_id
ORDER BY rows DESC;
最大值与平均值差距过大时,应重新评估分布键。
41. 查看倾斜系数
SELECT *
FROM gp_toolkit.gp_skew_coefficients
WHERE skcnamespace = 'app'
ORDER BY skccoeff DESC;
42. 查看空闲倾斜
SELECT *
FROM gp_toolkit.gp_skew_idle_fractions
WHERE sifnamespace = 'app'
ORDER BY siffraction DESC;
43. 查看 Heap 表膨胀估算
SELECT *
FROM gp_toolkit.gp_bloat_diag
WHERE bdirelname = 'orders';
44. 查看 AO 表隐藏行
SELECT *
FROM gp_toolkit.__gp_aovisimap_compaction_info(
'app.orders'::regclass
);
该内部工具函数的可用性和返回列与版本有关。
45. 查看各主机文件系统
gpssh -f hostfile -e 'df -h'
五、会话、锁与 SQL
46. 查看活动会话
SELECT pid, usename, datname, client_addr,
state, query_start, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY query_start;
Greenplum 6 的部分视图仍可能使用 procpid 等旧字段。
47. 查看长时间运行 SQL
SELECT pid, usename, datname,
now() - query_start AS elapsed,
state, query
FROM pg_stat_activity
WHERE state <> 'idle'
AND query_start < now() - interval '5 minutes'
ORDER BY query_start;
48. 取消正在运行的 SQL
SELECT pg_cancel_backend(12345);
49. 终止会话
SELECT pg_terminate_backend(12345);
50. 查看锁
SELECT locktype, database, relation::regclass,
mode, granted, pid
FROM pg_locks
ORDER BY granted, pid;
51. 查看阻塞关系
SELECT blocked.pid AS blocked_pid,
blocker.pid AS blocker_pid,
blocked.query AS blocked_sql,
blocker.query AS blocker_sql
FROM pg_stat_activity blocked
JOIN pg_locks bl ON bl.pid = blocked.pid AND NOT bl.granted
JOIN pg_locks kl
ON kl.locktype = bl.locktype
AND kl.database IS NOT DISTINCT FROM bl.database
AND kl.relation IS NOT DISTINCT FROM bl.relation
AND kl.granted
JOIN pg_stat_activity blocker ON blocker.pid = kl.pid
WHERE blocked.pid <> blocker.pid;
52. 查看关系锁
SELECT *
FROM gp_toolkit.gp_locks_on_relation
ORDER BY lorrelname;
53. 查看执行计划
EXPLAIN
SELECT *
FROM app.orders
WHERE order_id = 10001;
54. 查看实际执行计划
EXPLAIN (ANALYZE, VERBOSE, BUFFERS)
SELECT customer_id, sum(amount)
FROM app.orders
GROUP BY customer_id;
ANALYZE 会真正执行 SQL,修改类语句必须放在可回滚事务中测试。
55. 查看资源队列
SELECT *
FROM gp_toolkit.gp_resqueue_status;
56. 查看资源组
SELECT *
FROM gp_toolkit.gp_resgroup_status;
资源队列与资源组的使用取决于版本和集群配置。
57. 查看资源组运行状态
SELECT *
FROM gp_toolkit.gp_resgroup_status_per_host;
58. 查看当前数据库日志
SELECT logtime, logseverity, loguser, logdatabase,
logmessage
FROM gp_toolkit.gp_log_database
WHERE logtime > now() - interval '1 hour'
ORDER BY logtime DESC;
59. 查看失效索引
SELECT n.nspname, c.relname AS index_name,
i.indisvalid, i.indisready
FROM pg_index i
JOIN pg_class c ON c.oid = i.indexrelid
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE NOT i.indisvalid OR NOT i.indisready;
60. 查看缺少统计信息的表
SELECT schemaname, relname
FROM pg_stat_all_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
AND last_analyze IS NULL
AND last_autoanalyze IS NULL
ORDER BY schemaname, relname;
六、统计信息与表维护
61. 收集单表统计信息
ANALYZE app.orders;
62. 收集指定列统计信息
ANALYZE app.orders (customer_id, order_time);
63. 收集数据库统计信息
ANALYZE;
64. 查看统计信息更新时间
SELECT schemaname, relname,
last_analyze, last_autoanalyze
FROM pg_stat_all_tables
WHERE schemaname = 'app'
ORDER BY relname;
65. 清理表中的失效行
VACUUM app.orders;
66. 执行 VACUUM ANALYZE
VACUUM ANALYZE app.orders;
67. 重写 Heap 表回收空间
VACUUM FULL app.orders;
该命令会持有强锁并重写表,应在维护窗口执行。
68. 压缩 AO 表
VACUUM app.order_history;
AO 表的 VACUUM 会根据隐藏行比例执行压缩,实际行为取决于版本和阈值。
69. 重建索引
REINDEX TABLE app.orders;
70. 修改表的分布键
ALTER TABLE app.orders
SET DISTRIBUTED BY (customer_id);
该操作通常需要重分布全表数据,应评估空间、锁和执行时间。
七、配置与集群启停
71. 查看数据库参数
SHOW ALL;
72. 查看集群统一参数
gpconfig -s max_connections
73. 修改动态参数
gpconfig -c log_min_duration_statement -v 3000
是否动态生效取决于参数上下文。
74. 修改 Coordinator 与 Segment 参数
gpconfig -c max_connections -m 200 -v 1000
75. 重新加载配置
gpstop -u
76. 启动集群
gpstart -a
77. 停止集群
gpstop -a
78. 快速模式停止集群
gpstop -a -M fast
Fast 模式会回滚活动事务,执行前应通知业务。
79. 重启集群
gpstop -a -r
80. 查看所有主机的 Greenplum 进程
gpssh -f hostfile -e 'ps -ef | grep "[p]ostgres"'
八、备份、恢复与数据装载
81. 执行全库备份
gpbackup --dbname appdb
82. 备份指定 Schema
gpbackup --dbname appdb --include-schema app
83. 备份指定表
gpbackup --dbname appdb --include-table app.orders
84. 指定备份目录
gpbackup --dbname appdb --backup-dir /backup/greenplum
85. 恢复备份
gprestore --timestamp 20260727103000
86. 恢复并创建数据库
gprestore --timestamp 20260727103000 --create-db
87. 仅恢复指定表
gprestore --timestamp 20260727103000 \
--include-table app.orders
88. 启动 gpfdist
gpfdist -d /data/load -p 8081 -l /tmp/gpfdist.log
89. 创建可读外部表
CREATE EXTERNAL TABLE app.ext_orders (
order_id BIGINT,
customer_id BIGINT,
amount NUMERIC(18,2)
)
LOCATION ('gpfdist://etl01:8081/orders.csv')
FORMAT 'CSV' (HEADER);
90. 使用 gpload 装载数据
gpload -f load_orders.yml -l load_orders.log
九、高可用、恢复与扩容
91. 恢复故障 Segment
gprecoverseg -a
先通过 gpstate -e 确认故障范围和主机状态。
92. 执行全量 Segment 恢复
gprecoverseg -a -F
全量恢复开销较大,仅在增量恢复不可用或数据目录重建时使用。
93. 将 Segment 恢复到首选角色
gprecoverseg -a -r
94. 添加 Mirror
gpaddmirrors -i mirror_config
应先用工具生成并审核配置文件,再正式执行。
95. 初始化 Standby Coordinator
gpinitstandby -s gpstandby
96. 激活 Standby Coordinator
gpactivatestandby -a
仅在确认原 Coordinator 不再提供服务且 Standby 同步正常后执行。
97. 生成扩容配置
gpexpand -f new_hosts
98. 初始化新增 Segment
gpexpand -i gpexpand_inputfile
99. 执行数据重分布
gpexpand -d 01:00:00
参数和工作流在不同版本存在差异,应以当前发行版扩容手册为准。
100. 执行集群快速巡检
gpstate -s
gpstate -e
gpstate -f
gpconfig -s max_connections
gpssh -f hostfile -e 'df -h'
psql -d postgres -c \
"SELECT content, role, preferred_role, mode, status, hostname
FROM gp_segment_configuration ORDER BY content, role;"
巡检还应检查数据库容量、数据倾斜、长 SQL、锁、统计信息、膨胀、备份状态和主机资源。
结语
Greenplum 运维的核心是把 PostgreSQL 单库视角扩展到整个 MPP 集群。遇到问题时,应依次检查 Coordinator、Segment、Mirror、数据分布、资源管理和 SQL 执行计划,避免只在 Coordinator 上观察局部现象。
对于 Segment 恢复、Standby 激活、扩容和全表重分布等高风险操作,应使用与当前发行版匹配的官方手册,并在执行前完成备份、空间评估和回退设计。
DBA 资源导航
- ora100.com · 数据库学习平台
- Oracle DBA 应该掌握的 100 条命令(建议收藏)
- MySQL DBA 应该掌握的 100 条命令(建议收藏)
- PostgreSQL DBA 应该掌握的 100 条命令
- SQL Server DBA 实用的 100 条命令(建议收藏)
- 达梦 DBA 应该掌握的 100 条命令(建议收藏)
- OceanBase DBA 应该掌握的 100 条命令(建议收藏)
- MongoDB DBA 应该掌握的 100 条命令(建议收藏)
更多 Oracle、MySQL、PostgreSQL、MongoDB 实战内容,可以访问 DBA 学习平台:ora100.com
感谢阅读。 我会持续分享 Oracle、GoldenGate、RAC、Data Guard、MySQL、PostgreSQL、OceanBase、电科金仓等数据库技术文章。
个人网站:ora100.com