Greenplum DBA 应该掌握的 100 条命令(建议收藏)

1 阅读1分钟

👋 我是三笠丶,一名专注数据库与数据库架构的 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 资源导航

更多 Oracle、MySQL、PostgreSQL、MongoDB 实战内容,可以访问 DBA 学习平台:ora100.com

感谢阅读。 我会持续分享 Oracle、GoldenGate、RAC、Data Guard、MySQL、PostgreSQL、OceanBase、电科金仓等数据库技术文章。
个人网站:ora100.com