ITPub博客

首页 > 数据库 > 国内数据库 > Greenplum DBA 应该掌握的 100 条命令(建议收藏)

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

国内数据库 作者:丸喵喵 时间:2026-08-04 11:08:30 3 删除 编辑

👋 我是 Lucifer,一名专注 Oracle、国产数据库与数据库架构的 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、调整配置、重分布和恢复备份等操作,应先确认影响范围并准备回退方案。

一、连接与基础信息

 
01

使用 psql 连接 Greenplum

 
      bash

psql -h  192.168 . 1.10  -p  5432  -U gpadmin -d postgres

客户端应连接 Coordinator,不要直接连接 Segment 处理业务数据。

02

查看数据库版本

 
      sql

SELECT  version();

03

查看当前数据库

 
      sql

SELECT  current_database();

04

查看当前用户

 
      sql

SELECT  current_user, session_user;

05

查看当前时间

 
      sql

SELECT  now(), current_timestamp;

06

查看连接地址和端口

 
      sql

SELECT  inet_server_addr(), inet_server_port(),

    inet_client_addr(), inet_client_port();

07

查看搜索路径

 
      sql

SHOW search_path;

08

查看所有数据库

 
      sql

\l+

09

查看 Schema

 
      sql

\dn+

10

查看已安装扩展

 
      sql

\dx

二、集群状态与节点

 
11

查看集群概要状态

 
      bash

gpstate

12

查看集群详细状态

 
      bash

gpstate -s

13

查看异常 Segment

 
      bash

gpstate -e

14

查看 Primary 与 Mirror 映射

 
      bash

gpstate -m

15

查看 Standby 状态

 
      bash

gpstate -f

16

查看端口和数据目录

 
      bash

gpstate -p

17

从系统表查看 Segment

 
      sql

SELECT  dbid, content, role, preferred_role, mode, status,

    hostname, address, port, datadir

FROM  gp_segment_configuration

ORDER   BY  content, role;

18

查看异常 Segment 配置

 
      sql

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 数量

 
      sql

SELECT  hostname, role,  count (*)  AS  segment_count

FROM  gp_segment_configuration

WHERE  content >=  0

GROUP   BY  hostname, role

ORDER   BY  hostname, role;

20

查看集群配置历史

 
      sql

SELECT  *

FROM  gp_configuration_history

ORDER   BY  time DESC

LIMIT  50 ;

三、数据库、表与分布

 
21

创建数据库

 
      sql

CREATE  DATABASE appdb;

22

查看数据库大小

 
      sql

SELECT  datname,

    pg_size_pretty(pg_database_size(datname))  AS  size

FROM  pg_database

ORDER   BY  pg_database_size(datname) DESC;

23

查看数据库连接数

 
      sql

SELECT  datname,  count (*)  AS  connections

FROM  pg_stat_activity

GROUP   BY  datname

ORDER   BY  connections DESC;

24

查看表

 
      sql

\dt+ app.*

25

查看表定义

 
      bash

pg_dump -s -t app.orders appdb

26

创建 Hash 分布表

 
      sql

CREATE   TABLE  app.orders (

  order_id    BIGINT,

  customer_id BIGINT,

  order_time  TIMESTAMP,

  amount      NUMERIC( 18 , 2 )

)

DISTRIBUTED  BY  (order_id);

27

创建随机分布表

 
      sql

CREATE   TABLE  app.event_stage (

  event_id BIGINT,

  payload  TEXT

)

DISTRIBUTED RANDOMLY;

28

创建复制表

 
      sql

CREATE   TABLE  app.dim_status (

  status_code VARCHAR( 20 ),

  status_name VARCHAR( 100 )

)

DISTRIBUTED REPLICATED;

复制表适合体量较小、更新不频繁的维表。

29

创建 AO 行存表

 
      sql

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 列存压缩表

 
      sql

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

创建范围分区表

 
      sql

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

查看表的分布键

 
      sql

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

查看分区层级

 
      sql

SELECT  *

FROM  pg_partitions

WHERE  schemaname =  'app'

 AND  tablename =  'fact_log'

ORDER   BY  partitionrank;

34

查看表存储方式

 
      sql

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 表属性

 
      sql

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

查看表总大小

 
      sql

SELECT  pg_size_pretty(

      pg_total_relation_size( 'app.orders' )

    )  AS  total_size;

37

查看 Schema 容量

 
      sql

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

查看大表排行

 
      sql

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 的行数

 
      sql

SELECT  gp_segment_id,  count (*)  AS  rows

FROM  app.orders

GROUP   BY  gp_segment_id

ORDER   BY  gp_segment_id;

40

计算表的数据倾斜

 
      sql

SELECT  gp_segment_id,  count (*)  AS  rows

FROM  app.orders

GROUP   BY  gp_segment_id

ORDER   BY  rows DESC;

最大值与平均值差距过大时,应重新评估分布键。

41

查看倾斜系数

 
      sql

SELECT  *

FROM  gp_toolkit.gp_skew_coefficients

WHERE  skcnamespace =  'app'

ORDER   BY  skccoeff DESC;

42

查看空闲倾斜

 
      sql

SELECT  *

FROM  gp_toolkit.gp_skew_idle_fractions

WHERE  sifnamespace =  'app'

ORDER   BY  siffraction DESC;

43

查看 Heap 表膨胀估算

 
      sql

SELECT  *

FROM  gp_toolkit.gp_bloat_diag

WHERE  bdirelname =  'orders' ;

44

查看 AO 表隐藏行

 
      sql

SELECT  *

FROM  gp_toolkit.__gp_aovisimap_compaction_info(

  'app.orders' ::regclass

);

该内部工具函数的可用性和返回列与版本有关。

45

查看各主机文件系统

 
      bash

gpssh -f hostfile -e  'df -h'

五、会话、锁与 SQL

 
46

查看活动会话

 
      sql

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

 
      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

 
      sql

SELECT  pg_cancel_backend( 12345 );

49

终止会话

 
      sql

SELECT  pg_terminate_backend( 12345 );

50

查看锁

 
      sql

SELECT  locktype, database, relation::regclass,

    mode, granted, pid

FROM  pg_locks

ORDER   BY  granted, pid;

51

查看阻塞关系

 
      sql

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

查看关系锁

 
      sql

SELECT  *

FROM  gp_toolkit.gp_locks_on_relation

ORDER   BY  lorrelname;

53

查看执行计划

 
      sql

EXPLAIN

SELECT  *

FROM  app.orders

WHERE  order_id =  10001 ;

54

查看实际执行计划

 
      sql

EXPLAIN (ANALYZE, VERBOSE, BUFFERS)

SELECT  customer_id,  sum (amount)

FROM  app.orders

GROUP   BY  customer_id;

ANALYZE  会真正执行 SQL,修改类语句必须放在可回滚事务中测试。

55

查看资源队列

 
      sql

SELECT  *

FROM  gp_toolkit.gp_resqueue_status;

56

查看资源组

 
      sql

SELECT  *

FROM  gp_toolkit.gp_resgroup_status;

资源队列与资源组的使用取决于版本和集群配置。

57

查看资源组运行状态

 
      sql

SELECT  *

FROM  gp_toolkit.gp_resgroup_status_per_host;

58

查看当前数据库日志

 
      sql

SELECT  logtime, logseverity, loguser, logdatabase,

    logmessage

FROM  gp_toolkit.gp_log_database

WHERE  logtime > now() - interval  '1 hour'

ORDER   BY  logtime DESC;

59

查看失效索引

 
      sql

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

查看缺少统计信息的表

 
      sql

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

收集单表统计信息

 
      sql

ANALYZE app.orders;

62

收集指定列统计信息

 
      sql

ANALYZE app.orders (customer_id, order_time);

63

收集数据库统计信息

 
      sql

ANALYZE;

64

查看统计信息更新时间

 
      sql

SELECT  schemaname, relname,

    last_analyze, last_autoanalyze

FROM  pg_stat_all_tables

WHERE  schemaname =  'app'

ORDER   BY  relname;

65

清理表中的失效行

 
      sql

VACUUM app.orders;

66

执行 VACUUM ANALYZE

 
      sql

VACUUM ANALYZE app.orders;

67

重写 Heap 表回收空间

 
      sql

VACUUM FULL app.orders;

该命令会持有强锁并重写表,应在维护窗口执行。

68

压缩 AO 表

 
      sql

VACUUM app.order_history;

AO 表的 VACUUM 会根据隐藏行比例执行压缩,实际行为取决于版本和阈值。

69

重建索引

 
      sql

REINDEX  TABLE  app.orders;

70

修改表的分布键

 
      sql

ALTER   TABLE  app.orders

SET  DISTRIBUTED  BY  (customer_id);

该操作通常需要重分布全表数据,应评估空间、锁和执行时间。

七、配置与集群启停

 
71

查看数据库参数

 
      sql

SHOW  ALL ;

72

查看集群统一参数

 
      bash

gpconfig -s max_connections

73

修改动态参数

 
      bash

gpconfig -c log_min_duration_statement -v  3000

是否动态生效取决于参数上下文。

74

修改 Coordinator 与 Segment 参数

 
      bash

gpconfig -c max_connections -m  200  -v  1000

75

重新加载配置

 
      bash

gpstop -u

76

启动集群

 
      bash

gpstart -a

77

停止集群

 
      bash

gpstop -a

78

快速模式停止集群

 
      bash

gpstop -a -M fast

Fast 模式会回滚活动事务,执行前应通知业务。

79

重启集群

 
      bash

gpstop -a -r

80

查看所有主机的 Greenplum 进程

 
      bash

gpssh -f hostfile -e  'ps -ef | grep "[p]ostgres"'

八、备份、恢复与数据装载

 
81

执行全库备份

 
      bash

gpbackup --dbname appdb

82

备份指定 Schema

 
      bash

gpbackup --dbname appdb --include-schema app

83

备份指定表

 
      bash

gpbackup --dbname appdb --include-table app.orders

84

指定备份目录

 
      bash

gpbackup --dbname appdb --backup-dir /backup/greenplum

85

恢复备份

 
      bash

gprestore --timestamp  20260727103000

86

恢复并创建数据库

 
      bash

gprestore --timestamp  20260727103000  --create-db

87

仅恢复指定表

 
      bash

gprestore --timestamp  20260727103000  \

 --include-table app.orders

88

启动 gpfdist

 
      bash

gpfdist -d /data/load -p  8081  -l /tmp/gpfdist.log

89

创建可读外部表

 
      sql

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 装载数据

 
      bash

gpload -f load_orders.yml -l load_orders.log

九、高可用、恢复与扩容

 
91

恢复故障 Segment

 
      bash

gprecoverseg -a

先通过  gpstate -e  确认故障范围和主机状态。

92

执行全量 Segment 恢复

 
      bash

gprecoverseg -a -F

全量恢复开销较大,仅在增量恢复不可用或数据目录重建时使用。

93

将 Segment 恢复到首选角色

 
      bash

gprecoverseg -a -r

94

添加 Mirror

 
      bash

gpaddmirrors -i mirror_config

应先用工具生成并审核配置文件,再正式执行。

95

初始化 Standby Coordinator

 
      bash

gpinitstandby -s gpstandby

96

激活 Standby Coordinator

 
      bash

gpactivatestandby -a

仅在确认原 Coordinator 不再提供服务且 Standby 同步正常后执行。

97

生成扩容配置

 
      bash

gpexpand -f new_hosts

98

初始化新增 Segment

 
      bash

gpexpand -i gpexpand_inputfile

99

执行数据重分布

 
      bash

gpexpand -d  01 : 00 : 00

参数和工作流在不同版本存在差异,应以当前发行版扩容手册为准。

100

执行集群快速巡检

 
      bash

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 激活、扩容和全表重分布等高风险操作,应使用与当前发行版匹配的官方手册,并在执行前完成备份、空间评估和回退设计。

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

感谢阅读。

我会持续分享 Oracle、GoldenGate、RAC、Data Guard、MySQL、PostgreSQL、OceanBase、人大金仓等数据库技术文章。

个人网站: ora100.com


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29568843/viewspace-3178125/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-03-27

  • 博文量
    215
  • 访问量
    537365