监控Greenplum系统
可以用系统中包括的各种工具以及附加组件来监控一个Greenplum数据库系统。SNMP支持允许Greenplum与流行的系统管理框架整合起来。
观察Greenplum数据库系统日常的性能有助于管理员理解系统的行为、计划工作流以及故障排查问题。这一章讨论用于监控数据库性能和活动的工具。
还有,记得回顾推荐的监控和维护任务中编写脚本监控活动来快速检测系统中问题的内容。
上级主题: 管理一个Greenplum系统
监控系统状态
作为一个Greenplum数据库管理员,必须监控系统的问题时间,例如一个Segment宕机或者在一台Segment主机上磁盘空间耗尽。下面的额主题描述如何监控一个Greenplum数据库系统的健康状况以及检查一个Greenplum数据库系统的特定状态信息。
启用告警和通知
可以配置一个Greenplum数据库系统如果发生特定的数据库事件时触发SNMP(简单网络管理协议)告警或者给系统管理员发送email通知。这些事件包括:
- 所有的PANIC级错误情况
- 所有的FATAL级错误情况
- 属于“内部错误”(例如,SIGSEGV错误)的ERROR级错误情况
- 数据库系统关闭和重启
- Segment失效和恢复
- 后备Master不同步情况
- Master主机人为关闭或者其他软件问题(在特定失效场景中,Greenplum数据库无法发送告警或者通知)
这个主题包括下列子话题:
注意SNMP告警和email通知报告的是相同的事件信息。两种工具报告的事件信息之间没有差别。有关SNMP事件信息请见Greenplum数据库SNMP OID和错误代码。
将SNMP用于Greenplum数据库系统
Greenplum数据库支持SNMP使用MIB(管理信息库)来监控一个Greenplum数据库系统的状态。MIB是描述SNMP可管理实体的对象集合,在这种情况下SNMP可管理实体就是一个Greenplum数据库系统。
Greenplum数据库的SNMP支持允许一个网络管理系统从同一个端口(161)和IP地址获得有关硬件、操作系统和Greenplum数据库的信息。它还启用Greenplum数据库实例的自动恢复。
先决条件
在设置Greenplum数据库上的SNMP支持之前,确保SNMP被安装在Master主机上。如果snmpd文件在/usr/sbin目录中不存在,那么系统上没有安装SNMP。根据运行Greenplum数据库的平台,安装下面的包:
操作系统 | 包1 |
---|---|
Red Hat Enterprise | net-snmp net-snmp-libs net-snmp-utils |
CentOS | net-snmp |
SUSE | N/A |
- 在SUSE平台上默认会安装SNMP。
snmp.conf配置文件位于/etc/snmp/中。
安装前任务
在Master主机上安装了SNMP之后,以root登录,打开一个文本编辑器并且编辑path_to/snmp/snmpd.conf文件。要在Greenplum数据库中使用SNMP,对snmpd.conf文件所要求的最小配置更改是指定一个团体名称。例如:
rocommunity public
注意: 把public替换为用户的SNMP团体的名称。还应该配置syslocation和syscontact。按环境所需配置其他SNMP设置并且保存该文件。
更多有关snmpd.conf文件的信息,可以输入:
man snmpd.conf
注意: 在SUSE Linux平台上,确信检查和配置snmp.conf文件中的安全性设置,这样snmpd接受来自于sub-agent的连接并且返回所有可用的对象ID(OID)。
在完成配置snmpd.conf文件后,启动系统的snmpd守护进程:
# /sbin/chkconfig snmpd on
然后,验证系统的snmpd守护进程正在运行。输入:
# snmpwalk -v 1 -c community_name localhost .1.3.6.1.2.1.1.1.0
例如:
# snmpwalk -v 1 -c public localhost .1.3.6.1.2.1.1.1.0
如果这个命令返回”Timeout: No Response from localhost”,那么系统的snmpd守护进程没有运行。如果该守护进程正在运行,输出会类似于下面的形式:
SNMPv2-MIB::sysDescr.0 = STRING: Linux hostname
2.6.18-92.el5 #1 SMP Tue Jun 10 18:51:06 EDT 2016 x86_64
设置SNMP通知
要配置Greenplum数据库系统在告警发生时发送SNMP通知,在Greenplum数据库的Master主机上用gpconfig工具配置下列参数:
- gp_snmp_community: 设置这个参数为为环境指定的团体名称。
- gp_snmp_monitor_address: 输入网络监控器应用的hostname:port。通常,端口号是162。如果有多个监控器地址,将它们用逗号分隔。
gp_snmp_use_inform_or_trap: 输入trap或者inform。trap通知是从一个应用发往另一个应用的SNMP消息(例如,在Greenplum数据库和网络监控应用之间)。监控应用不答复这些消息,但是这会产生较少的网络负荷。
inform通知和trap消息完全相同,不过应用会向生成该告警的应用发送一个确认。在这种情况下,监控应用会向Greenplum数据库发送确认消息。虽然inform消息带来了较多负荷,它们能告知Greenplum数据库监控应用已经收到了通知。
下面的示例命令使用Greenplum数据库的gpconfig工具设置服务器配置参数:
$ gpconfig -c gp_snmp_community -v public --masteronly
$ gpconfig -c gp_snmp_monitor_address -v mdw:162 --masteronly
$ gpconfig -c gp_snmp_use_inform_or_trap -v trap --masteronly
要测试SNMP通知,可以使用snmptrapd陷阱接收器。作为root输入:
# /usr/sbin/snmptrapd -m ALL -Lf ~/filename.log
-Lf表示trap被记录到一个文件中。-Le表示trap被记录到stderr。-m ALL载入所有可用的MIB(如果需要还可以指定个别的MIB)。
启用Email通知
完成下面的步骤可以让Greenplum数据库在特定数据库事件发生时向系统管理员发送email通知。
- 在文本编辑器中打开$MASTER_DATA_DIRECTORY/postgresql.conf。
在EMAIL ALERTS小节中,去除下面这些参数的注释并且输入合适的emial服务器和域的值。例如:
gp_email_smtp_server='smtp.company.com:25'
gp_email_smtp_userid='gpadmin@example.com'
gp_email_smtp_password='mypassword'
gp_email_from='Greenplum数据库<gpadmin@example.com>'
gp_email_to='dba@example.com;John Smith <jsmith@example.com>'
可以在email系统中创建专用的email账号或者组从Greenplum数据库系统发送或者接收email告警。例如:
gp_email_from='GPDB Production Instance <gpdb@example.com>'
gp_email_to='gpdb_dba_group@example.com'
还可以为两个gp_email参数指定多个email地址。使用分号来分隔这些email地址。例如:
gp_email_to='gpdb_dba_group@example.com;admin@example.com'
保存并且关闭postgresql.conf文件。
重新装载Greenplum数据库的postgresql.conf文件:
$ gpstop -u
测试Email通知
Greenplum数据库的Master主机必须能够连接到为gp_email_smtp_server参数指定的SMTP邮件服务器。要测试连通性,使用ping命令:
$ ping my_email_server
如果Master主机能联系上SMTP服务器,登入到psql并且用下列命令测试email通知:
$ psql postgres
=# SELECT gp_elog('Test GPDB Email',true); gp_elog
为gp_email_to参数指定的地址应该会收到一封主题为Test GPDB Email的电子邮件。
还可以使用一个公共SMTP服务器(例如谷歌的Gmail SMTP服务器)和一个外部email地址测试email通知。例如:
gp_email_smtp_server='smtp.gmail.com:25'
#gp_email_smtp_userid=''
#gp_email_smtp_password=''
gp_email_from='gpadmin@example.com'
gp_email_to='test_account@example.com'
注意: 如果在发送和接收email通知上碰到困难,验证所在机构的email服务器和防火墙的设置。
检查系统状态
一个Greenplum数据库系统由横跨多台机器的多个PostgreSQL实例(Master和Segment)构成。要监控一个Greenplum数据库系统,需要了解整个系统的信息以及个体实例的状态信息。gpstate工具提供有关一个Greenplum数据库系统的状态信息。
查看Master和Segment的状态及配置
默认的gpstate行为是检查Segment实例并且显示可用和失效Segment的一个简短状态。例如,要快速查看Greenplum数据库系统的状态:
$ gpstate
要查看Greenplum数据库阵列配置更详细的信息,使用带有-s选项的gpstate:
$ gpstate -s
查看镜像配置和状态
如果在使用镜像作为数据冗余,用户可能想要看看系统中的镜像Segment实例列表、它们当前的同步状态以及镜像和主Segment之间的映射。例如,要查看一个系统中的镜像Segment和它们的状态:
$ gpstate -m
要查看主Segment到镜像Segment的映射:
$ gpstate -c
要查看后备Master镜像的状态:
$ gpstate -f
检查磁盘空间使用
一个数据库管理员最重要的监控任务是确保Master和Segment数据目录所在的文件系统不会增长到超过70%的充满程度。一个充满的数据磁盘不会导致数据损坏,但是可能会阻止正常的数据库活动继续。如果磁盘增长得太满,可能会导致数据库服务器关闭。
可以使用gp_toolkit管理方案中的gp_disk_free外部表来检查Segment主机文件系统中的剩余空闲空间(以千字节计)。例如:
=# SELECT * FROM gp_toolkit.gp_disk_free
ORDER BY dfsegment;
检查分布式数据库和表的尺寸
gp_toolkit管理方案包含几个可以用来判断Greenplum数据库的分布式数据库、方案、表或索引磁盘空间使用的视图。
用于检查数据库对象尺寸和磁盘空间的视图列表,请见Greenplum数据库参考指南。
查看一个数据库的磁盘空间使用
要查看一个数据库的总尺寸(以字节计),使用gp_toolkit管理方案中的gp_size_of_database视图。例如:
=> SELECT * FROM gp_toolkit.gp_size_of_database
ORDER BY sodddatname;
查看一个表的磁盘空间使用
gp_toolkit管理方案汇总包含几个检查表尺寸的视图。表尺寸视图根据对象ID(而不是名称)列出表。要根据一个表的名称检查其尺寸,必须在pg_class表中查找关系名称(relname)。例如:
=> SELECT relname AS name, sotdsize AS size, sotdtoastsize
AS toast, sotdadditionalsize AS other
FROM gp_toolkit.gp_size_of_table_disk as sotd, pg_class
WHERE sotd.sotdoid=pg_class.oid ORDER BY relname;
可用的表尺寸视图的列表可见Greenplum数据库参考指南。
查看索引的磁盘空间使用
gp_toolkit管理方案包含几个用于检查索引尺寸的视图。要查看一个表上所有索引的总尺寸,使用gp_size_of_all_table_indexes视图。要查看一个特定索引的尺寸,使用gp_size_of_index视图。该索引尺寸视图根据对象ID(而不是名称)列出表和索引。要根据一个索引的名称查看其尺寸,必须在pg_class表中查找关系名称(relname)。例如:
=> SELECT soisize, relname as indexname
FROM pg_class, gp_toolkit.gp_size_of_index
WHERE pg_class.oid=gp_size_of_index.soioid
AND pg_class.relkind='i';
检查数据分布倾斜
Greenplum数据库中所有的表都是分布式的,意味着它们的数据被均匀划分到系统中的所有Segment上。不均匀分布的数据可能会削弱查询处理性能。一个表的分布策略在表创建时被确定。有关选择表分布策略的信息,请见下列主题:
gp_toolkit管理方案还包含一些用于检查表上数据分布倾斜的视图。有关如何检查非均匀数据分布的信息,请见Greenplum数据库参考指南。
查看一个表的分布键
要查看一个表中被用作数据分布键的列,可以使用psql中的\d+元命令来检查表的定义。例如:
=# \d+ sales
Table "retail.sales"
Column | Type | Modifiers | Description
-------------+--------------+-----------+-------------
sale_id | integer | |
amt | float | |
date | date | |
Has OIDs: no
Distributed by: (sale_id)
查看数据分布
要查看一个表中行的数据分布(每个Segment上的行数),可以运行一个这样的查询:
=# SELECT gp_segment_id, count(*)
FROM table_name GROUP BY gp_segment_id;
如果所有的Segment都有大致相同的行数,一个表就可以被认为具有平衡的分布。
检查查询处理倾斜
当一个查询被处理时,所有的Segment应该具有等量的负载来保证最好的性能。如果发现了一个执行不好的查询,可能需要使用EXPLAIN命令进行深入研究。有关使用EXPLAIN命令和查询画像的信息,请见查询画像。
如果表的数据分布策略与查询谓词没有很好地匹配,查询处理负载可能会倾斜。要检查处理倾斜,可以运行一个这样的查询:
=# SELECT gp_segment_id, count(*) FROM table_name
WHERE column='value' GROUP BY gp_segment_id;
这将显示对于给定的WHERE谓词,Segment会返回的行数。
避免极度倾斜警告
当执行一个使用哈希连接操作的查询时,可能会收到下面的警告消息:
Extreme skew in the innerside of Hashjoin
当一个哈希连接操作符的输入倾斜时,就会发生这种情况。它不会阻碍查询成功完成。可以按照这些步骤来避免计划中的倾斜:
- 确保所有的事实表都被分析过。
- 验证该查询用到的任何已填充临时表都被分析过。
- 查看该查询的EXPLAIN ANALYZE计划,并且在其中查找以下信息:
- 如果有带多列过滤的扫描产生超过估计的行数,则将gp_selectivity_damping_factor服务器配置参数的值翻倍并且重新测试该查询。
- 如果在连接一个相对较小(小于5000行)的单一事实表时发生倾斜,将gp_segments_for_planner服务器配置参数设置为1并且重新测试该查询。
- 检查应用于该查询的过滤属性是否匹配基表的分布键。如果过滤属性和分布键相同,考虑用不同的分布键重新分布一些基表。
- 检查连接键的基数。如果基数较低,尝试用不同的连接列或者表上额外的过滤属性来重写该查询以降低行数。这些更改可能会改变查询的语义。
查看数据库对象的元数据信息
Greenplum数据库在其系统目录中跟踪各种有关存储在数据库中对象(例如表、视图、索引等等)和全局对象(例如角色和表空间)的元数据信息。
查看最后一个执行的操作
可以使用系统视图pg_stat_operations和pg_stat_partition_operations查看在一个对象(例如一个表)上执行的动作。例如,要查看在一个表上执行的动作,比如它何时被创建以及它上一次是什么时候被清理和分析:
=> SELECT schemaname as schema, objname as table,
usename as role, actionname as action,
subtype as type, statime as time
FROM pg_stat_operations
WHERE objname='cust';
schema | table | role | action | type | time
--------+-------+------+---------+-------+--------------------------
sales | cust | main | CREATE | TABLE | 2016-02-09 18:10:07.867977-08
sales | cust | main | VACUUM | | 2016-02-10 13:32:39.068219-08
sales | cust | main | ANALYZE | | 2016-02-25 16:07:01.157168-08
(3 rows)
查看一个对象的定义
要查看一个对象(例如表或者视图)的定义,在psql中可以使用\d+元命令。例如,要查看一个表的定义:
=> \d+ mytable
查看会话内存使用信息
可以创建并且使用session_level_memory_consumption视图来查看正在Greenplum数据库上运行查询的会话的当前内存利用信息。该视图包含会话信息以及该会话连接到的数据库、该会话当前运行的查询和会话处理所消耗的内存等信息。
创建session_level_memory_consumption视图
要在Greenplum数据库中创建session_level_memory_consumption视图,为每一个数据库运行一次脚本$GPHOME/share/postgresql/contrib/gp_session_state.sql。例如,要在数据库testdb中安装该视图,可使用这个命令:
$ psql -d testdb -f $GPHOME/share/postgresql/contrib/gp_session_state.sql
session_level_memory_consumption视图
session_level_memory_consumption视图提供有关正在运行SQL查询的会话的内存消耗以及闲置时间的信息。
在该视图中,列is_runaway表示是否Greenplum数据库认为该会话是一个失控会话,这种判断基于该会话的查询的vmem内存消耗来做出。当查询消耗过多内存时,Greenplum数据库认为该会话处于失控状态。Greenplum数据库的服务器配置参数runaway_detector_activation_percent控制Greenplum数据库什么时候会认为一个会话是失控会话。
有关该参数的信息请见Greenplum数据库参考指南中的“服务器配置参数”。
列 | 类型 | 引用 | 描述 |
---|---|---|---|
datname | name | 该会话连接到的数据库名。 | |
sess_id | integer | 会话ID。 | |
usename | name | 会话用户的用户名。 | |
current_query | text | 该会话正在运行的当前SQL查询。 | |
segid | integer | Segment ID。 | |
vmem_mb | integer | 该会话的总vmem内存使用,以MB计。 | |
is_runaway | boolean | 会话被标记为在Segment上失控。 | |
qe_count | integer | 该会话的查询处理数量。 | |
active_qe_count | integer | 该会话的活动查询处理数量。 | |
dirty_qe_count | integer | 还没有释放其内存的查询处理的数量。 对于没有运行的会话该值为-1。 | |
runaway_vmem_mb | integer | 当会话被标记为失控会话时消耗的vmem内存量。 | |
runaway_command_cnt | integer | 当会话被标记为失控会话时的命令计数。 | |
idle_start | timestamptz | 这个会话中上一次一个查询处理变成空闲的时间。 |
查看查询工作文件使用信息
Greenplum数据库管理方案gp_toolkit包含显示Greenplum数据库工作文件信息的视图。如果没有足够的内存让查询完全在内存中执行,Greenplum数据库会在磁盘上创建工作文件。这些信息可以用来排查故障和调优查询。这些视图中的信息也可以被用来为Greenplum数据库配置参数gp_workfile_limit_per_query和gp_workfile_limit_per_segment指定值。
在方案gp_toolkit中有下面这些视图:
- gp_workfile_entries视图为当前在Segment上创建了工作文件的每个操作符都包含一行。
- gp_workfile_usage_per_query视图为当前在Segment上创建了工作文件的每个查询都包含一行。
- gp_workfile_usage_per_segment视图为每个Segment都包含一行。每一行显示了当前在该Segment上用于工作文件的总磁盘空间。
有关使用gp_toolkit的信息请见Using gp_toolkit。
查看数据库服务器日志文件
Greenplum数据库中的每一个数据库实例(Master和Segment)都运行着一个有着自己的服务器日志文件的PostgreSQL数据库服务器。日常的日志文件被创建在Master和每个Segment的数据目录中的pg_log目录下。
日志文件格式
服务器日志文件被写成一种逗号分隔值(CSV)格式。一些日志项并不会所有的域都有值。例如,只有与一个查询工作者进程相关的日志项才会有slice_id值。可以用查询的会话标识符(gp_session_id)和命令标识符(gp_command_count)来确定一个特定查询的相关日志项。
下列域会被写入到日志中:
# | 域名称 | 数据类型 | 描述 |
---|---|---|---|
1 | event_time | 带时区的timestamp | 该日志项被写入到日志中的时间 |
2 | user_name | varchar(100) | 数据库用户名 |
3 | database_name | varchar(100) | 数据库名 |
4 | process_id | varchar(10) | 系统进程ID(以”p”为前缀) |
5 | thread_id | varchar(50) | 线程号(以”th”为前缀) |
6 | remote_host | varchar(100) | 在Master上,是客户端机器的主机名/地址。在Segment上,是Master的主机名/地址。 |
7 | remote_port | varchar(10) | Segment或者Master的端口号 |
8 | session_start_time | 带时区的timestamp | 会话连接被打开的时间 |
9 | transaction_id | int | Master上的顶层事务ID。这个ID是任何子事务的父亲。 |
10 | gp_session_id | text | 会话标识符号(以”con”为前缀) |
11 | gp_command_count | text | 会话中的命令号(以”cmd”为前缀) |
12 | gp_segment | text | Segment内容标识符(主Segment以”seg”为前缀,镜像Segment以”mir”为前缀)。Master的内容ID总是为-1。 |
13 | slice_id | text | 切片ID(被执行的查询计划的一部分) |
14 | distr_tranx_id | text | 分布式事务ID |
15 | local_tranx_id | text | 本地事务ID |
16 | sub_tranx_id | text | 子事务ID |
17 | event_severity | varchar(10) | 值包括:LOG、ERROR、FATAL、PANIC、DEBUG1、DEBUG2 |
18 | sql_state_code | varchar(10) | 与日志消息相关的SQL状态代码 |
19 | event_message | text | 日志或者错误消息文本 |
20 | event_detail | text | 与一个错误或者警告消息相关的详细消息文本 |
21 | event_hint | text | 与一个错误或者警告消息相关的提示消息文本 |
22 | internal_query | text | 内部生成的查询文本 |
23 | internal_query_pos | int | 内部生成的查询文本的指针式索引 |
24 | event_context | text | 这个消息产生的上下文 |
25 | debug_query_string | text | 完整的用户提供的查询字符串,用于调试。内部使用可能会修改这个字符串。 |
26 | error_cursor_pos | int | 该查询字符串中的指针式索引 |
27 | func_name | text | 这个消息产生的函数 |
28 | file_name | text | 产生该消息的内部代码文件 |
29 | file_line | int | 产生该消息的内部代码文件的行号 |
30 | stack_trace | text | 与这个消息相关的堆栈跟踪 |
搜索Greenplum服务器日志文件
Greenplum数据库提供一个名为gplogfilter的工具,它可以在一个Greenplum数据库日志文件中搜索匹配指定条件的项。默认情况下,这个工具在默认日志位置搜索Greenplum数据库的Master日志。例如,要显示Master日志文件的最后三行:
$ gplogfilter -n 3
要同时搜索所有Segment的日志文件,可以通过gpssh工具来运行gplogfilter。例如,要显示每个Segment日志文件的最后三行:
$ gpssh -f seg_host_file
=> source /usr/local/greenplum-db/greenplum_path.sh
=> gplogfilter -n 3 /gpdata/gp*/pg_log/gpdb*.log
使用gp_toolkit
使用Greenplum数据库的管理方案gp_toolkit来查询系统目录、日志文件和操作系统环境以得到系统状态信息。gp_toolkit方案包含一些可以用SQL命令访问的视图。gp_toolkit方案对所有数据库用户都可以访问。一些对象要求超级用户权限。用与下面类似的命令把gp_toolkit方案增加到用户的方案搜索路径中:
=> ALTER ROLE myrole SET search_path TO myschema,gp_toolkit;
有关可用的管理方案视图及其用法的描述,请见Greenplum数据库参考指南。
Greenplum数据库SNMP OID和错误代码
当Greenplum数据库系统被配置为发生特定数据库事件时触发SNMP告警或者给系统管理员发送email通知,那些告警和通知会包含对象ID(OID)和SQL错误代码。
有关让Greenplum数据库使用SNMP的信息,请见启用告警和通知
Greenplum数据库SNMP OID
这是Greenplum数据库的OID层次结构:
iso(1)
identified-organization(3)
dod(6)
internet(1)
private(4)
enterprises(1)
gpdbMIB(31327)
gpdbObjects(1)
gpdbAlertMsg(1)
gpdbAlertMsg
1.3.6.1.4.1.31327.1.1: STRING: 告警消息文本
gpdbAlertSeverity
1.3.6.1.4.1.31327.1.2: INTEGER: 严重级别
gpdbAlertSeverity可以取下列值之一:
gpdbSevUnknown(0)
gpdbSevOk(1)
gpdbSevWarning(2)
gpdbSevError(3)
gpdbSevFatal(4)
gpdbSevPanic(5)
gpdbSevSystemDegraded(6)
gpdbSevSystemDown(7)
gpdbAlertSqlstate
1.3.6.1.4.1.31327.1.3: STRING: SQL标准错误代码
代码列表请见SQL标准错误代码。
gpdbAlertDetail
1.3.6.1.4.1.31327.1.4: STRING: 详细告警消息文本
gpdbAlertSqlStmt
1.3.6.1.4.1.31327.1.5: STRING: 产生这个告警的SQL语句(如果适用)
gpdbAlertSystemName
1.3.6.1.4.1.31327.1.6: STRING: 主机名
SQL标准错误代码
下面的表格列出了所有定义好的错误代码。有些没有被用到,但是在SQL标准中有定义。其中也显示了错误分类。对于每一种错误分类都有一个标准错误代码,它的最后三个字符为000。这种代码只用于落入该分类却没有更详细代码的错误情况。
每种错误代码的PL/pgSQL情况名称与该表中显示的短语相同,但是把空格替换成下划线。例如,代码22012(DIVISION BY ZERO)的情况名称是DIVISION_BY_ZERO。情况名称不区分大小写。
注意: 与错误截然不同,PL/pgSQL不识别警告情况名称,它们是分类00、01和02。
错误代码 | 含义 | 常量 |
---|---|---|
Class 00 — Successful Completion | ||
00000 | SUCCESSFUL COMPLETION | successful_completion |
Class 01 — Warning | ||
01000 | WARNING | warning |
0100C | DYNAMIC RESULT SETS RETURNED | dynamic_result_sets_returned |
01008 | IMPLICIT ZERO BIT PADDING | implicit_zero_bit_padding |
01003 | NULL VALUE ELIMINATED IN SET FUNCTION | null_value_eliminated_in_set_function |
01007 | PRIVILEGE NOT GRANTED | privilege_not_granted |
01006 | PRIVILEGE NOT REVOKED | privilege_not_revoked |
01004 | STRING DATA RIGHT TRUNCATION | string_data_right_truncation |
01P01 | DEPRECATED FEATURE | deprecated_feature |
Class 02 — No Data (this is also a warning class per the SQL standard) | ||
02000 | NO DATA | no_data |
02001 | NO ADDITIONAL DYNAMIC RESULT SETS RETURNED | no_additional_dynamic_result_sets_returned |
Class 03 — SQL Statement Not Yet Complete | ||
03000 | SQL STATEMENT NOT YET COMPLETE | sql_statement_not_yet_complete |
Class 08 — Connection Exception | ||
08000 | CONNECTION EXCEPTION | connection_exception |
08003 | CONNECTION DOES NOT EXIST | connection_does_not_exist |
08006 | CONNECTION FAILURE | connection_failure |
08001 | SQLCLIENT UNABLE TO ESTABLISH SQLCONNECTION | sqlclient_unable_to_establish_sqlconnection |
08004 | SQLSERVER REJECTED ESTABLISHMENT OF SQLCONNECTION | sqlserver_rejected_establishment_of_sqlconnection |
08007 | TRANSACTION RESOLUTION UNKNOWN | transaction_resolution_unknown |
08P01 | PROTOCOL VIOLATION | protocol_violation |
Class 09 — Triggered Action Exception | ||
09000 | TRIGGERED ACTION EXCEPTION | triggered_action_exception |
Class 0A — Feature Not Supported | ||
0A000 | FEATURE NOT SUPPORTED | feature_not_supported |
Class 0B — Invalid Transaction Initiation | ||
0B000 | INVALID TRANSACTION INITIATION | invalid_transaction_initiation |
Class 0F — Locator Exception | ||
0F000 | LOCATOR EXCEPTION | locator_exception |
0F001 | INVALID LOCATOR SPECIFICATION | invalid_locator_specification |
Class 0L — Invalid Grantor | ||
0L000 | INVALID GRANTOR | invalid_grantor |
0LP01 | INVALID GRANT OPERATION | invalid_grant_operation |
Class 0P — Invalid Role Specification | ||
0P000 | INVALID ROLE SPECIFICATION | invalid_role_specification |
Class 21 — Cardinality Violation | ||
21000 | CARDINALITY VIOLATION | cardinality_violation |
Class 22 — Data Exception | ||
22000 | DATA EXCEPTION | data_exception |
2202E | ARRAY SUBSCRIPT ERROR | array_subscript_error |
22021 | CHARACTER NOT IN REPERTOIRE | character_not_in_repertoire |
22008 | DATETIME FIELD OVERFLOW | datetime_field_overflow |
22012 | DIVISION BY ZERO | division_by_zero |
22005 | ERROR IN ASSIGNMENT | error_in_assignment |
2200B | ESCAPE CHARACTER CONFLICT | escape_character_conflict |
22022 | INDICATOR OVERFLOW | indicator_overflow |
22015 | INTERVAL FIELD OVERFLOW | interval_field_overflow |
2201E | INVALID ARGUMENT FOR LOGARITHM | invalid_argument_for_logarithm |
2201F | INVALID ARGUMENT FOR POWER FUNCTION | invalid_argument_for_power_function |
2201G | INVALID ARGUMENT FOR WIDTH BUCKET FUNCTION | invalid_argument_for_width_bucket_function |
22018 | INVALID CHARACTER VALUE FOR CAST | invalid_character_value_for_cast |
22007 | INVALID DATETIME FORMAT | invalid_datetime_format |
22019 | INVALID ESCAPE CHARACTER | invalid_escape_character |
2200D | INVALID ESCAPE OCTET | invalid_escape_octet |
22025 | INVALID ESCAPE SEQUENCE | invalid_escape_sequence |
22P06 | NONSTANDARD USE OF ESCAPE CHARACTER | nonstandard_use_of_escape_character |
22010 | INVALID INDICATOR PARAMETER VALUE | invalid_indicator_parameter_value |
22020 | INVALID LIMIT VALUE | invalid_limit_value |
22023 | INVALID PARAMETER VALUE | invalid_parameter_value |
2201B | INVALID REGULAR EXPRESSION | invalid_regular_expression |
22009 | INVALID TIME ZONE DISPLACEMENT VALUE | invalid_time_zone_displacement_value |
2200C | INVALID USE OF ESCAPE CHARACTER | invalid_use_of_escape_character |
2200G | MOST SPECIFIC TYPE MISMATCH | most_specific_type_mismatch |
22004 | NULL VALUE NOT ALLOWED | null_value_not_allowed |
22002 | NULL VALUE NO INDICATOR PARAMETER | null_value_no_indicator_parameter |
22003 | NUMERIC VALUE OUT OF RANGE | numeric_value_out_of_range |
22026 | STRING DATA LENGTH MISMATCH | string_data_length_mismatch |
22001 | STRING DATA RIGHT TRUNCATION | string_data_right_truncation |
22011 | SUBSTRING ERROR | substring_error |
22027 | TRIM ERROR | trim_error |
22024 | UNTERMINATED C STRING | unterminated_c_string |
2200F | ZERO LENGTH CHARACTER STRING | zero_length_character_string |
22P01 | FLOATING POINT EXCEPTION | floating_point_exception |
22P02 | INVALID TEXT REPRESENTATION | invalid_text_representation |
22P03 | INVALID BINARY REPRESENTATION | invalid_binary_representation |
22P04 | BAD COPY FILE FORMAT | bad_copy_file_format |
22P05 | UNTRANSLATABLE CHARACTER | untranslatable_character |
Class 23 — Integrity Constraint Violation | ||
23000 | INTEGRITY CONSTRAINT VIOLATION | integrity_constraint_violation |
23001 | RESTRICT VIOLATION | restrict_violation |
23502 | NOT NULL VIOLATION | not_null_violation |
23503 | FOREIGN KEY VIOLATION | foreign_key_violation |
23505 | UNIQUE VIOLATION | unique_violation |
23514 | CHECK VIOLATION | check_violation |
Class 24 — Invalid Cursor State | ||
24000 | INVALID CURSOR STATE | invalid_cursor_state |
Class 25 — Invalid Transaction State | ||
25000 | INVALID TRANSACTION STATE | invalid_transaction_state |
25001 | ACTIVE SQL TRANSACTION | active_sql_transaction |
25002 | BRANCH TRANSACTION ALREADY ACTIVE | branch_transaction_already_active |
25008 | HELD CURSOR REQUIRES SAME ISOLATION LEVEL | held_cursor_requires_same_isolation_level |
25003 | INAPPROPRIATE ACCESS MODE FOR BRANCH TRANSACTION | inappropriate_access_mode_for_branch_transaction |
25004 | INAPPROPRIATE ISOLATION LEVEL FOR BRANCH TRANSACTION | inappropriate_isolation_level_for_branch_transaction |
25005 | NO ACTIVE SQL TRANSACTION FOR BRANCH TRANSACTION | no_active_sql_transaction_for_branch_transaction |
25006 | READ ONLY SQL TRANSACTION | read_only_sql_transaction |
25007 | SCHEMA AND DATA STATEMENT MIXING NOT SUPPORTED | schema_and_data_statement_mixing_not_supported |
25P01 | NO ACTIVE SQL TRANSACTION | no_active_sql_transaction |
25P02 | IN FAILED SQL TRANSACTION | in_failed_sql_transaction |
Class 26 — Invalid SQL Statement Name | ||
26000 | INVALID SQL STATEMENT NAME | invalid_sql_statement_name |
Class 27 — Triggered Data Change Violation | ||
27000 | TRIGGERED DATA CHANGE VIOLATION | triggered_data_change_violation |
Class 28 — Invalid Authorization Specification | ||
28000 | INVALID AUTHORIZATION SPECIFICATION | invalid_authorization_specification |
Class 2B — Dependent Privilege Descriptors Still Exist | ||
2B000 | DEPENDENT PRIVILEGE DESCRIPTORS STILL EXIST | dependent_privilege_descriptors_still_exist |
2BP01 | DEPENDENT OBJECTS STILL EXIST | dependent_objects_still_exist |
Class 2D — Invalid Transaction Termination | ||
2D000 | INVALID TRANSACTION TERMINATION | invalid_transaction_termination |
Class 2F — SQL Routine Exception | ||
2F000 | SQL ROUTINE EXCEPTION | sql_routine_exception |
2F005 | FUNCTION EXECUTED NO RETURN STATEMENT | function_executed_no_return_statement |
2F002 | MODIFYING SQL DATA NOT PERMITTED | modifying_sql_data_not_permitted |
2F003 | PROHIBITED SQL STATEMENT ATTEMPTED | prohibited_sql_statement_attempted |
2F004 | READING SQL DATA NOT PERMITTED | reading_sql_data_not_permitted |
Class 34 — Invalid Cursor Name | ||
34000 | INVALID CURSOR NAME | invalid_cursor_name |
Class 38 — External Routine Exception | ||
38000 | EXTERNAL ROUTINE EXCEPTION | external_routine_exception |
38001 | CONTAINING SQL NOT PERMITTED | containing_sql_not_permitted |
38002 | MODIFYING SQL DATA NOT PERMITTED | modifying_sql_data_not_permitted |
38003 | PROHIBITED SQL STATEMENT ATTEMPTED | prohibited_sql_statement_attempted |
38004 | READING SQL DATA NOT PERMITTED | reading_sql_data_not_permitted |
Class 39 — External Routine Invocation Exception | ||
39000 | EXTERNAL ROUTINE INVOCATION EXCEPTION | external_routine_invocation_exception |
39001 | INVALID SQLSTATE RETURNED | invalid_sqlstate_returned |
39004 | NULL VALUE NOT ALLOWED | null_value_not_allowed |
39P01 | TRIGGER PROTOCOL VIOLATED | trigger_protocol_violated |
39P02 | SRF PROTOCOL VIOLATED | srf_protocol_violated |
Class 3B — Savepoint Exception | ||
3B000 | SAVEPOINT EXCEPTION | savepoint_exception |
3B001 | INVALID SAVEPOINT SPECIFICATION | invalid_savepoint_specification |
Class 3D — Invalid Catalog Name | ||
3D000 | INVALID CATALOG NAME | invalid_catalog_name |
Class 3F — Invalid Schema Name | ||
3F000 | INVALID SCHEMA NAME | invalid_schema_name |
Class 40 — Transaction Rollback | ||
40000 | TRANSACTION ROLLBACK | transaction_rollback |
40002 | TRANSACTION INTEGRITY CONSTRAINT VIOLATION | transaction_integrity_constraint_violation |
40001 | SERIALIZATION FAILURE | serialization_failure |
40003 | STATEMENT COMPLETION UNKNOWN | statement_completion_unknown |
40P01 | DEADLOCK DETECTED | deadlock_detected |
Class 42 — Syntax Error or Access Rule Violation | ||
42000 | SYNTAX ERROR OR ACCESS RULE VIOLATION | syntax_error_or_access_rule_violation |
42601 | SYNTAX ERROR | syntax_error |
42501 | INSUFFICIENT PRIVILEGE | insufficient_privilege |
42846 | CANNOT COERCE | cannot_coerce |
42803 | GROUPING ERROR | grouping_error |
42830 | INVALID FOREIGN KEY | invalid_foreign_key |
42602 | INVALID NAME | invalid_name |
42622 | NAME TOO LONG | name_too_long |
42939 | RESERVED NAME | reserved_name |
42804 | DATATYPE MISMATCH | datatype_mismatch |
42P18 | INDETERMINATE DATATYPE | indeterminate_datatype |
42809 | WRONG OBJECT TYPE | wrong_object_type |
42703 | UNDEFINED COLUMN | undefined_column |
42883 | UNDEFINED FUNCTION | undefined_function |
42P01 | UNDEFINED TABLE | undefined_table |
42P02 | UNDEFINED PARAMETER | undefined_parameter |
42704 | UNDEFINED OBJECT | undefined_object |
42701 | DUPLICATE COLUMN | duplicate_column |
42P03 | DUPLICATE CURSOR | duplicate_cursor |
42P04 | DUPLICATE DATABASE | duplicate_database |
42723 | DUPLICATE FUNCTION | duplicate_function |
42P05 | DUPLICATE PREPARED STATEMENT | duplicate_prepared_statement |
42P06 | DUPLICATE SCHEMA | duplicate_schema |
42P07 | DUPLICATE TABLE | duplicate_table |
42712 | DUPLICATE ALIAS | duplicate_alias |
42710 | DUPLICATE OBJECT | duplicate_object |
42702 | AMBIGUOUS COLUMN | ambiguous_column |
42725 | AMBIGUOUS FUNCTION | ambiguous_function |
42P08 | AMBIGUOUS PARAMETER | ambiguous_parameter |
42P09 | AMBIGUOUS ALIAS | ambiguous_alias |
42P10 | INVALID COLUMN REFERENCE | invalid_column_reference |
42611 | INVALID COLUMN DEFINITION | invalid_column_definition |
42P11 | INVALID CURSOR DEFINITION | invalid_cursor_definition |
42P12 | INVALID DATABASE DEFINITION | invalid_database_definition |
42P13 | INVALID FUNCTION DEFINITION | invalid_function_definition |
42P14 | INVALID PREPARED STATEMENT DEFINITION | invalid_prepared_statement_definition |
42P15 | INVALID SCHEMA DEFINITION | invalid_schema_definition |
42P16 | INVALID TABLE DEFINITION | invalid_table_definition |
42P17 | INVALID OBJECT DEFINITION | invalid_object_definition |
Class 44 — WITH CHECK OPTION Violation | ||
44000 | WITH CHECK OPTION VIOLATION | with_check_option_violation |
Class 53 — Insufficient Resources | ||
53000 | INSUFFICIENT RESOURCES | insufficient_resources |
53100 | DISK FULL | disk_full |
53200 | OUT OF MEMORY | out_of_memory |
53300 | TOO MANY CONNECTIONS | too_many_connections |
Class 54 — Program Limit Exceeded | ||
54000 | PROGRAM LIMIT EXCEEDED | program_limit_exceeded |
54001 | STATEMENT TOO COMPLEX | statement_too_complex |
54011 | TOO MANY COLUMNS | too_many_columns |
54023 | TOO MANY ARGUMENTS | too_many_arguments |
Class 55 — Object Not In Prerequisite State | ||
55000 | OBJECT NOT IN PREREQUISITE STATE | object_not_in_prerequisite_state |
55006 | OBJECT IN USE | object_in_use |
55P02 | CANT CHANGE RUNTIME PARAM | cant_change_runtime_param |
55P03 | LOCK NOT AVAILABLE | lock_not_available |
Class 57 — Operator Intervention | ||
57000 | OPERATOR INTERVENTION | operator_intervention |
57014 | QUERY CANCELED | query_canceled |
57P01 | ADMIN SHUTDOWN | admin_shutdown |
57P02 | CRASH SHUTDOWN | crash_shutdown |
57P03 | CANNOT CONNECT NOW | cannot_connect_now |
Class 58 — System Error (errors external to Greenplum数据库) | ||
58030 | IO ERROR | io_error |
58P01 | UNDEFINED FILE | undefined_file |
58P02 | DUPLICATE FILE | duplicate_file |
Class F0 — Configuration File Error | ||
F0000 | CONFIG FILE ERROR | config_file_error |
F0001 | LOCK FILE EXISTS | lock_file_exists |
Class P0 — PL/pgSQL Error | ||
P0000 | PLPGSQL ERROR | plpgsql_error |
P0001 | RAISE EXCEPTION | raise_exception |
P0002 | NO DATA FOUND | no_data_found |
P0003 | TOO MANY ROWS | too_many_rows |
Class XX — Internal Error | ||
XX000 | INTERNAL ERROR | internal_error |
XX001 | DATA CORRUPTED | data_corrupted |
XX002 | INDEX CORRUPTED | index_corrupted |