check_postgres: PostgreSQL 监控脚本

一月 7, 2024

摘要check_postgres.pl是一个 PostgreSQL 监控脚本,可以集成到 Nagios、MRTG、Cacti 等监控系统。

本文包含以下部分:

  1. 概要
  2. 描述
  3. 数据库连接选项
  4. 其他选项
  5. 操作
  6. 基本过滤
  7. 用户名过滤
  8. 测试模式
  9. 文件
  10. 环境变量
  11. 提示和技巧
  12. 依赖

概要

## Create all symlinks
check_postgres.pl --symlinks

## Check connection to Postgres database 'pluto':
check_postgres.pl --action=connection --db=pluto

## Same things, but using the symlink
check_postgres_connection --db=pluto

## Warn if > 100 locks, critical if > 200, or > 20 exclusive
check_postgres_locks --warning=100 --critical="total=200:exclusive=20"

## Show the current number of idle connections on port 6543:
check_postgres_txn_idle --port=6543 --output=simple

## There are many other actions and options, please keep reading.

描述

check_postgres.pl 是一个 Perl 脚本,可对一个或多个 PostgreSQL 数据库运行许多不同的测试。它使用 psql 程序来收集信息,输出结果支持三种类型的格式:Nagios、MRTG 或 simple。

输出模式

可以使用--output选项更改输出模式。默认是 nagios 输出模式,但如果您愿意,可以在脚本顶部进行更改。当前可选的选项有 nagiosmrtgsimple。为了避免每次都必须输入 output 参数,如果没有给出 --output 参数,并且当前目录的名称中有一个输出选项,则会自动设置输出类型。例如,创建一个名为 mrtg 的目录并通过 --symlinks 参数使用符号链接填充该目录,将确保从该目录运行的任何操作始终默认采用 “mrtg” 的输出模式。作为 --output=simple 的一种快捷方式,您可以输入 --simple,这也会覆盖目录命名的方式。

Nagios 输出

输出默认采用 Nagios 格式,它是一种单行信息,以及四个特定的退出码:

  • 0(正常)
  • 1(警告)
  • 2(严重)
  • 3(未知)

输出行带有上面的一个单词,一个冒号,然后是一条关于检测内容的简短描述。还可以输出其他统计信息,以及命令所花费的总时间:可参阅有关参数 --showperf--perflimit--showtime 的文档。

MRTG 输出

MRTG 输出为四行,第一行始终给出一个重要数字。如果可能,此数字表示一个实际值(例如字节数),但对于仅返回 “true” 或 “false” 的操作,它也可能是 1 或 0(例如 check_postgres_version)。第二行是附加信息,仅用于某些操作。第三行表示正常运行时间 “uptime”,未使用到。第四行是一条描述,通常表示第一行中的统计信息的来源数据库的名称,但可能会因操作而异。

某些操作接受一个可选的 --mrtg 参数来进一步控制输出。

对于每个操作确切的 MRTG 输出的详细信息,请参阅有关每个操作的文档。

简单输出

简单输出只是 MRTG 输出的截断版本,并且只返回第一个数字,不返回其他任何内容。当您只想检查某些东西的状态,不管任何的阈值时,这是非常有用的。您可以通过将 KB、MB、GB、TB 或 EB 附加到输出参数,来转换数字输出,例如:

--output=simple,MB

Cacti 输出

Cacti 输出由同一行上的一个或多个项目组成,带有简单的名称、冒号和数字。目前,唯一显式的采用 Cacti 输出的操作是 ‘dbstats’,在这种情况下不需要使用 --output 选项,因为 Cacti 输出是此操作唯一支持的输出模式。对于许多其他操作,使用 --simple 足以让输出成为 Cacti 友好的。

数据库连接选项

所有操作都接受一组通用的数据库选项。

  • -H NAME--host=NAME

    连接到 NAME 指示的主机。它可以是一个以逗号分隔的名称列表。允许使用多个主机参数。如果没有给出主机,则默认为PGHOST环境变量或根本没有主机(这表示使用本地 Unix 套接字)。您也可以使用 “--dbhost”。

  • -p PORT--port=PORT

    使用指定的端口 PORT 进行连接。它可以是一个以逗号分隔的端口号列表,并且允许使用多个端口参数。如果未指定端口号,则默认为PGPORT环境变量。如果未设置,则默认为 5432。您也可以使用 “--dbport”。

  • -db NAME--dbname=NAME

    指定要连接到的数据库。可以是一个以逗号分隔的名称列表,并且允许指定多个 dbname 参数。如果未提供 dbname 选项,则默认为PGDATABASE环境变量。如果未设置,当 psql 版本为 8 或更高时,默认为 “postgres”,否则默认为 “template1”。

  • -u USERNAME--dbuser=USERNAME

    连接使用的数据库用户名称。可以是一个以逗号分隔的用户名列表,并且允许指定多个 dbuser 参数。如果未提供,则默认为PGUSER环境变量,否则默认为 “postgres”。

  • --dbpass=PASSWORD

    提供用于连接到数据库的密码。强烈建议不要使用此选项。相反,应该使用 .pgpass 或 pg_service.conf 文件。

  • --dbservice=NAME

    在 pg_service.conf 文件中的一个服务名称。在 PostgreSQL 9.0 版本以前,这是一个全局文件,通常位于 /etc/pg_service.conf 中。如果您使用的是 PostgreSQL 9.0 或更高版本,则可以使用运行脚本的用户的主目录中的 “.pg_service.conf” 文件,例如 nagios 用户。此文件包含了一个简单的连接选项列表。使用此选项时,还可以传递其他信息,例如 --dbservice=“maindatabase sslmode=require”。此文件相关的文档,可在连接服务文件中找到。

  • --role=ROLE

    提供在连接到数据库之后但在运行指定的检查之前,要切换到的角色。这提供了将超级用户权限分配给没有 LOGIN 访问权限的角色的能力,以便通过审计和其他安全考虑。这需要本地psql的版本是 9.6 或更高版本。

数据库连接选项可以分组:--host=a,b --host=c --port=1234 --port=3344 将连接到 a-1234、b-1234 和 c-3344。请注意,一旦设置了,选项就会一直沿用,直到再次更改。

示例:

--host=a,b --port=5433 --db=c
Connects twice to port 5433, using database c, to hosts a and b: a-5433-c b-5433-c

--host=a,b --port=5433 --db=c,d
Connects four times: a-5433-c a-5433-d b-5433-c b-5433-d

--host=a,b --host=foo --port=1234 --port=5433 --db=e,f
Connects six times: a-1234-e a-1234-f b-1234-e b-1234-f foo-5433-e foo-5433-f

--host=a,b --host=x --port=5432,5433 --dbuser=alice --dbuser=bob -db=baz
Connects three times: a-5432-alice-baz b-5433-alice-baz x-5433-bob-baz

--dbservice="foo" --port=5433
Connects using the named service 'foo' in the pg_service.conf file, but overrides the port

其他选项

其他选项包括:

  • --action=NAME

    指定我们要执行的操作。除非使用符号链接文件,否则这是必需的,使用符号链接文件时,文件的名称可用于确定操作。

  • --warning=VAL-w VAL

    设置触发警告的阈值。此选项的有效值取决于所使用的操作。

  • --critical=VAL-c VAL

    设置触发严重错误的阈值。此选项的有效值取决于所使用的操作。

  • -t VAL--timeout=VAL

    设置超时(以秒为单位),在达到该时间段以后,脚本将中止它正在执行的任何操作并返回 UNKNOWN 状态。超时是针对每个 PostgreSQL 实例的,而不是针对整个脚本的。默认值为 10;始终以秒为单位。

  • --assume-standby-mode

    如果指定,则首先检查服务器是否处于备用模式(需要 --datadir 参数),如果是,将忽略所有需要 SQL 查询的检查,返回 OK 的状态,并输出 “Server in standby mode”。

    例子:

    postgres@db$./check_postgres.pl --action=version --warning=8.1 --datadir /var/lib/postgresql/8.3/main/ --assume-standby-mode 
    POSTGRES_VERSION OK:  Server in standby mode | time=0.00
    
  • --assume-prod

    如果指定,会检查是否是在生产模式的服务器执行(必须指定 --datadir)。该选项仅与(链接:check_postgres_checkpoint)相关。

    例子:

    postgres@db$./check_postgres.pl --action=checkpoint --datadir /var/lib/postgresql/8.3/main/ --assume-prod 
    POSTGRES_CHECKPOINT OK: Last checkpoint was 72 seconds ago | age=72;;300 mode=MASTER
    
  • --assume-async

    如果指定,则指示服务器之间的任何复制都是异步的。该选项仅与(链接:check_postgres_same_schema)相关。

    例子:

    postgres@db$./check_postgres.pl --action=same_schema --assume-async --dbhost=star,line
    
  • -h--help

    显示一份帮助信息,其中包含了所有操作和选项的摘要。

  • --man

    显示整个手册。

  • -V--version

    显示当前版本。

  • -v--verbose

    设置详细级别。可以多次调用以提高等级。将其设置为 3 或更高(换句话说,指定-v -v -v),会打开此程序的调试信息,将其发送到标准错误输出 stderr。

  • --showperf=VAL

    确定是否以标准的 Nagios 格式输出其他性能数据(在字符串末尾,在一个管道符号之后,使用 name=value 格式)。VAL 应为 0 或 1。默认值为 1。它仅在使用 Nagios 输出模式时生效。

  • --perflimit=i

    设置使用 showperf 选项时,报告的指标项数的限制。这仅对返回大量指标项(如 table_size)的操作有效。默认值为 0,或无限制。将其与 --include--exclude 选项一起使用时要小心,因为这些限制是在运行查询后完成的,因此您的限制可能没有包括所需的指标项。它仅在使用 Nagios 输出模式时生效。

  • --showtime=VAL

    确定是否要将运行每个查询所花费的时间显示在输出中。VAL 应为 0 或 1。默认值为 1。除非 showperf 处于打开状态,否则会无效。它仅在使用 Nagios 输出模式时生效。

  • --test

    启用测试模式。请参阅下面的“测试模式”部分。

  • --PGBINDIR=PATH

    告知脚本在何处查找 psql 二进制文件。如果您的系统上有多个版本的 PostgreSQL 可执行文件,或者您的路径中没有 PostgreSQL 可执行文件,则会很有用。请注意,此选项为全部大写。默认情况下,不允许使用此选项。若要启用它,必须将脚本顶部附近的$NO_PSQL_OPTION值更改为 0。如果可以,请避免使用此选项,而是使用环境变量 c,或硬编码的$PGBINDIR变量(也在脚本顶部附近),来设置要使用的 PostgreSQL 的路径。

  • --PSQL=PATH

    *(已弃用,此选项可能会在将来的版本中删除!)*告诉脚本在何处查找 psql 程序。如果您的系统上有多个版本的 psql 可执行文件,或者您的路径中没有 psql 程序,则会很有用。请注意,此选项为全部大写。默认情况下,不允许使用此选项。若要启用它,必须将脚本顶部附近的$NO_PSQL_OPTION值更改为 0。如果可以,请避免使用此选项,而是将 psql 位置硬编码到$PSQL变量中,它也在靠近脚本顶部的位置。

  • --symlinks

    为每个操作创建指向主程序的符号链接。

  • --output=VAL

    确定输出的格式,以便在各种程序中使用。默认值为 ’nagios’。可用的选项包括 ’nagios’、‘mrtg’、‘simple’ 和 ‘cacti’。

  • --mrtg=VAL

    仅用于 MRTG 或简单输出,用于一些特定操作。

  • --debugoutput=VAL

    输出 psql 返回的确切字符串,用于调试。该值是一个或多个字母,用于确定是否显示输出,其中 ‘a’=全部,‘c’=严重,‘w’=警告,‘o’=正常,‘u’=未知。字母可以组合。

  • --get_method=VAL

    允许指定用于new_version_cpnew_version_pgnew_version_bcnew_version_boxnew_version_tnm检查获取信息的方法。为了从网络上获取信息,会尝试用这些程序:GET、wget、fetch、curl、lynx、links。要强制只使用一个(从而消除在其中一个有效之前尝试所有其他程序的开销),请输入其中一个名称作为要get_method参数的值。例如,BSD 类系统的用户可能会在其.check_postgresrc文件中输入以下行:get_method=fetch

  • --language=VAL

    设置用于所有输出消息的语言。通常,这是通过检测环境变量 LC_ALL、LC_MESSAGES 和 LANG 来设置的,但可以设置此选项来覆盖任何此类的检测值。

操作

要运行的操作是使用 --action 选项选择的,或者使用指向主文件的符号链接来选择,该文件包含了其中的操作名称。例如,要运行操作“timesync”,您可以发出以下任一命令:

check_postgres.pl --action=timesync

或使用这样一个程序:

check_postgres_timesync

如果使用选项 --symlinks,则会在当前目录中为您创建所有符号链接:

perl check_postgres.pl --symlinks

如果文件名已存在,则不会被覆盖。如果文件已存在而且是符号链接,则可以使用 “--action=build_symlinks_force” 强制覆盖它。

大多数操作都带有一个 --warning--critical 选项,指示我们从“正常”更改为“警告”的点,以及转到“严重”的点。请注意,由于始终会先检查严重错误,因此,将警告设置为等同于严重错误,是关闭警告并始终给出严重错误的一个有效方法。

当前支持的操作包括:

archive_ready

(链接:check_postgres_archive_ready) 检查 pg_wal/archive_status 目录(PostgreSQL 9.6 及更早版本:pg_xlog/archive_status)中存在多少扩展名为 .ready 的 WAL 文件,该目录是从 data_directory 中找到的。如果未使用 --lsfunc 选项,则必须以超级用户身份来运行此操作,才能访问 pg_wal/archive_status 目录的内容。使用此操作的最低版本是 PostgreSQL 8.1。--warning--critical 选项的值,就是 pg_wal/archive_status 目录中的 .ready 文件数。通常,启用 WAL 归档机制时,这些值应该较低,我们通常希望它尽可能快地归档 WAL 文件。

如果归档命令失败,pg_wal 目录中的 WAL 数量将会增长,直到耗尽所有磁盘空间,并强制 PostgreSQL 立即停止。

为了避免以数据库超级用户身份运行,应该使用超级用户定义一个pg_ls_dir()的包装函数,它具有 SECURITY DEFINER 的属性,并使用 --lsfunc 选项运行操作。下面的示例函数,如果由超级用户定义,则将允许脚本以普通用户 nagios 的身份使用 --lsfunc=ls_archive_status_dir 进行连接

BEGIN;
CREATE FUNCTION ls_archive_status_dir()
    RETURNS SETOF TEXT
    AS $$ SELECT pg_ls_dir('pg_wal/archive_status') $$
    LANGUAGE SQL
    SECURITY DEFINER;
REVOKE ALL ON FUNCTION ls_archive_status_dir() FROM PUBLIC;
GRANT EXECUTE ON FUNCTION ls_archive_status_dir() to nagios;
COMMIT;

示例 1:在主机 “pluto” 上检查就绪的 WAL 文件数是否为 10 个或更少,这里使用了一个包装器函数ls_archive_status_dir以避免需要超级用户权限

check_postgres_archive_ready --host=pluto --critical=10 --lsfunc=ls_archive_status_dir

对于 MRTG 输出,就绪的 WAL 文件数显示在第 1 行上。

autovac_freeze

(链接:check_postgres_autovac_freeze) 检查每个数据库上与 PostgreSQL 实例autovacuum_freeze_max_age配置的接近程度。此操作仅适用于版本 8.2 或更高版本的数据库。--warning--critical 选项应以百分比表示。将每个数据库中事务的“年龄”与autovacuum_freeze_max_age设置(默认为 2 亿)进行比较,以生成四舍五入的百分比。warning 选项的默认值为 **90%,**critical 选项的默认值为 **95%。**可以使用 --include--exclude 选项筛选数据库。有关详细信息,请参阅“基本过滤”部分。

示例 1:当端口 5432 上的任何数据库高于 97% 时,发出一条警告

check_postgres_autovac_freeze --port=5432 --warning="97%"

对于 MRTG 输出,第一行输出最高总体百分比,第二行输出最高事务年龄。所有具有第一行百分比的数据库都显示在第四行上,并用管道符号分隔。

backends

(链接:check_postgres_backends) 检查一个或多个数据库的当前连接数,并选择性地将其与允许的最大值进行比较,该值由 PostgreSQL 配置参数max_connections确定。--warning--critical 选项可以采用三种形式之一。第一种,可以给出一个简单的数字,它表示将发出警报的连接数。此选项不会使用max_connections设置。第二种,可以给出可用连接的百分比。第三种,可以给出一个负数,表示在达到max_connections之前剩余的连接数。--warning--critical 的默认值为 ‘90%’ 和 ‘95%’。还可以使用 --include--exclude 选项筛选数据库。有关详细信息,请参阅“基本过滤”部分。

若要仅查看非空闲进程,可以使用 --noidle 参数。请注意,您运行的用户(直接连接或通过 --role 切换)必须是超级用户才能正常工作。

示例 1:在主机 quirm 上,当连接数达到 120 时发出警告,如果达到 150,则发出严重错误。

check_postgres_backends --host=quirm --warning=120 --critical=150

示例 2:在主机 lancre 或 lancre2 上,当连接数达到max_connections设置的 75% 时,发出严重错误。

check_postgres_backends --warning='75%' --critical='75%' --host=lancre,lancre2

示例 3:在主机 plasmid 上,当只剩下 10 个连接槽位可用时发出警告,当我们只剩下 5 个连接槽位时发出严重错误。

check_postgres_backends --warning=-10 --critical=-5 --host=plasmid

示例 4:检查除名称中带有 “test” 的数据库之外的所有数据库,但允许名称为 “pg_greatest” 的数据库。在前两台主机上以端口 5432 进行连接,在第三台主机上以端口 5433 进行连接。我们希望在达到 30 个或更多连接时始终发出严重错误。

check_postgres_backends --dbhost=hong,kong --dbhost=fooey --dbport=5432 --dbport=5433 --warning=30 --critical=30 --exclude="~test" --include="pg_greatest,~prod"

对于 MRTG 输出,在第一行报告连接数,第四行给出数据库名称以及当前的max_connections设置。如果查询了多个数据库,则输出连接数最多的数据库。

bloat

(链接:check_postgres_bloat) 检查表和索引中的膨胀空间。(膨胀通常是表或索引中死元组占用的未使用空间。这些空间通常可以使用 VACUUM 命令来回收。)此操作要求在目标数据库上启用统计信息收集,并要求周期性地运行 ANALYZE。--include--exclude 选项可用于筛选出要查看的表。有关详细信息,请参阅“基本过滤”部分。

--warning--critical 选项可以指定为大小和/或百分比。有效的大小单位为 bytes、kilobytes、megabytes、gigabytes、terabytes、exabytes、petabytes 和 zettabytes。您可以用第一个字母缩写所有这些。不带单位的项假定为 “bytes”。默认值为 “1 GB” 和 “5 GB”。该值表示“浪费的字节数”,或者是,表和索引实际使用的字节数,与我们计算的字节数之间的差值。

请注意,此操作有两个硬编码值,以避免对较小的关系进行误报。表必须至少有 10 页,索引必须至少为 15 页,然后才会考虑进行此项测试。如果确实要调整这些值,可以在check_bloat子例程的顶部,查找变量 $MINPAGES$MINIPAGES。如果使用了 --exclude--include,则忽略这些值。

仅显示前 10 个膨胀最显著的关系。您可以通过使用 --perflimit 选项,设置自己的限制来更改此数字。

名为 “information_schema” 的模式会被排除在此项测试之外,因为它包含的表都很小,并且不会更改。

请注意,此项测试计算出来的值并不精确,只能用作指导。我们付出了巨大的努力来估计表的正确大小,但最终它只是一个估计值。相比表大小的正确性,索引大小的正确性更像是猜测,但两者都应该粗略地给出它们的膨胀程度。

示例 1:如果端口 5432 上的任何表膨胀超过 100 MB,则发出警告,如果超过 200 MB,则发出严重错误:

check_postgres_bloat --port=5432 --warning='100 M' --critical='200 M'

示例 2:如果主机 “sami” 上的表 “orders” 的膨胀超过 10 MB,则发出一个严重错误:

check_postgres_bloat --host=sami --include=orders --critical='10 MB'

示例 3:如果数据库 “sales” 上的表 “q4” 膨胀率超过 50%,则发出一个严重错误:

check_postgres_bloat --db=sales --include=q4 --critical='50%'

示例 4:任何表的膨胀率超过 20%,并且膨胀空间超过 150 MB,则发出一个严重错误:

check_postgres_bloat --port=5432 --critical='20% and 150 M'

示例 5:任何表的膨胀率超过 40%,或者膨胀空间超过 500 MB,则发出一个严重错误:

check_postgres_bloat --port=5432 --warning='500 M or 40%'

对于 MRTG 输出,第一行提供了表中浪费字节数的最高值,第二行提供了索引中浪费字节数的最高值。第四行提供数据库名称、表名称和索引名称信息。如果要输出膨胀率(关系实际大小比应有大小大多少倍),只需传入--mrtg=ratio

checkpoint

(链接:check_postgres_checkpoint) 确定自上次检查点运行以来的时间。这必须与正在检查的数据库相同的一台服务器上运行(也就是说,-h 选项将不起作用)。此检查主要用在处理传送的 WAL 文件的“温备”服务器上运行,并检查温备数据库是否真正处于“温热”状态。必须通过环境变量PGDATA或传递--datadir参数设置数据目录。它会返回自上次检查点运行以来的秒数,该秒数是通过解析调用pg_controldata的输出结果来确定的。因此,pg_controldata可执行文件在当前路径下必须可用。或者,您可以指定PGBINDIR为它所在的目录。还可以使用特殊选项 --assume-prod--assume-standby-mode,如果找到的模式不是预期的模式,则会发出 CRITICAL 错误。

必须至少设置一个 warning 或 critical 参数。

此操作需要 Date::Parse 模块。

对于 MRTG 或简单输出,会返回秒数。

cluster_id

(链接:check_postgres_cluster-id) 检查pg_controldata提供的数据库系统标识符,是否与上次检查时相同。这必须在与检查的数据库相同的服务器上运行(也就是说,-h 选项将不起作用)。应该指定 --warning--critical 选项,但不能同时给出两者。每个值都是实例标识符,一个整数值。您可以使用特殊的--critical=0选项运行,以查找现有实例标识符。

示例 1:查找初始的标识符

check_postgres_cluster_id --critical=0 --datadir=/var//lib/postgresql/9.0/main

示例 2:确保实例相同,如果不是,则使用上述结果发出警告。

check_postgres_cluster_id  --critical=5633695740047915135

对于 MRTG 输出,返回 1 或 0,表示要匹配的标识符成功或失败。必须使用--mrtg参数提供一个标识符。第四行始终返回当前标识符。

commitratio

(链接:check_postgres_commitratio) 检查所有数据库的事务提交率,并在事务提交率过低时进行通知。无需对每个数据库实例多次运行此命令。可以使用 --include--exclude 选项筛选数据库。有关详细信息,请参阅“基本过滤”部分。数据库的所有者还可以使用 --includeuser--excludeuser 选项对它们进行用户筛选。有关详细信息,请参阅“用户名过滤”部分。

warning 和 critical 选项应指定为百分比。此操作没有默认值:必须指定 warning 和 critical 选项。warning 值不能大于 critical 值。输出返回按事务提交率排序的所有数据库,提交率最小的数据库在前。

示例:如果主机 flagg 上的任何数据库的提交率低于 90%,则发出警告,如果提交率低于 80%,则发出严重错误。

check_postgres_database_commitratio --host=flagg --warning='90%' --critical='80%'

对于 MRTG 输出,第一行返回提交率最小的数据库的百分比,第四行返回数据库的名称。

connection

(链接:check_postgres_connection) 简单地连接数据库,执行 “SELECT version()”,然后断开。不需要指定 --warning--critical 选项。

对于 MRTG 输出,简单地在第一行输出 1(连接状态良好)或 0(连接状态异常)。

custom_query

(链接:check_postgres_custom_query) 运行一个您选择的自定义查询,并分析结果。查询本身是通过query参数传入的,应该尽可能地保持简单。如果可能的话,请把它包装在一个视图或函数中,以使事情更易于管理。查询应返回一列或两列。其中一列需要命名为 “result”,并且是将根据 warning 值和 critical 值进行检查的指标项。第二列用于性能数据,可以使用任何名称:这将是性能数据部分中的 “value”。

必须至少指定一个 warning 或 critical 参数。这些设置取决于您正在运行的查询类型。有四种类型的自定义查询可以运行,由valtype参数指定。如果未指定任何值,则此操作的类型默认为 “integer”。这四种类型是:

integer:进行简单的整数比较。第一列应该是一个简单整数,warning 值和 critical 值应该相同。

string:warning 值和 critical 值是字符串,仅当第一列中的值与它完全匹配时,才会触发警告或严重错误。这是区分大小写的。

time:warning 值和 critical 值是时间,可以以 seconds、minutes、hours 或 days 为单位。每个单位都可以写成单数,或者缩写为第一个字母。如果未给出单位,则假定为秒。第一列应该是一个整数,表示要检查的秒数。

size:warning 值和 critical 值是大小,可以用的单位有 bytes、kilobytes、megabytes、gigabytes、terabytes 或 exabytes。每个单位都可以缩写为第一个字母。如果未给出单位,则假定为字节。第一列应该是一个整数,表示要检查的字节数。

通常,如果返回的值大于或等于 critical 值或 warning 值,则会触发警报。但是,如果返回的值小于或等于 critical 值或 warning 值,在指定 --reverse 选项时将触发警报。

示例 1:如果有任何名为 “rad” 的关系,页面数超过了 100,则发出警告,并将页面数放在性能数据部分中。

check_postgres_custom_query --valtype=string -w "rad" --query=
  "SELECT relname AS result, relpages AS pages FROM pg_class WHERE relpages > 100"

示例 2:如果 “foobar” 函数返回的数字超过 5MB,则发出严重错误:

check_postgres_custom_query --critical='5MB' --valtype=size --query="SELECT foobar() AS result"

示例 2:如果函数 “snazzo” 返回值小于 42,则发出警告:

check_postgres_custom_query --critical=42 --query="SELECT snazzo() AS result" --reverse

如果您想出了一个有用的自定义查询,请考虑向该程序发送补丁,以使其成为其他人可以使用的标准操作。

此操作尚不支持 MRTG 或简单输出模式。

database_size

(链接:check_postgres_database_size) 检查所有数据库的大小,并在它们太大时进行通知。无需对每个数据库实例多次运行此命令。可以使用 --include--exclude 选项筛选数据库。有关详细信息,请参阅“基本过滤”部分。数据库的所有者还可以使用 --includeuser--excludeuser 选项对它们进行用户筛选。有关详细信息,请参阅“用户名过滤”部分。

warning 和 critical 选项可以指定为 bytes、kilobytes、megabytes、gigabytes、terabytes 或 exabytes。每个单位也可以缩写为第一个字母。如果未给出单位,则假定单位为字节。此操作没有默认值:必须指定 warning 和 critical 选项值。warning 值不能大于 critical 值。输出会返回按大小排序的所有数据库,最大的在前面,同时显示原始字节数和一个基于大小的“美化”版本。

示例 1:在主机 flagg 上,如果任何数据库大小超过 1 TB,则发出警告,如果超过 1.1 TB,则发出严重错误。

check_postgres_database_size --host=flagg --warning='1 TB' --critical='1.1 t'

示例 2:如果在端口 5432 上的数据库 template1 超过 10 MB,则发出严重错误。

check_postgres_database_size --port=5432 --include=template1 --warning='10MB' --critical='10MB'

示例 3:在主机 “tardis” 上,如果用户 “tom” 拥有的的任何数据库超过 5 GB,则发出警告

check_postgres_database_size --host=tardis --includeuser=tom --warning='5 GB' --critical='10 GB'

对于 MRTG 输出,在第一行返回最大数据库的大小(以字节为单位),在第四行返回数据库的名称。

dbstats

(链接:check_postgres_dbstats) 报告来自 pg_stat_database 视图的信息,并以一种 Cacti 友好的方式输出信息。不支持其他输出模式,因为输出是信息性的,不适合警报,例如与 Nagios 一起使用。如果未带任何选项,则返回所有数据库,每行一个。您可以使用--include选项来限定特定数据库,也可以使用--dbname选项。

每行返回 11 个指标项,格式为 name:value,用一个空格分隔。这些指标项是:

  • backends

    此数据库当前正在运行的后端数。

  • commits

    此数据库自创建或重置以来总共的事务提交数。

  • rollbacks

    此数据库自创建或重置以来总共的事务回滚数。

  • read

    总共的磁盘块读取次数。

  • hit

    总共的缓冲区命中次数。

  • ret

    总共的返回行数。

  • fetch

    总共的提取行数。

  • ins

    总共的插入行数。

  • upd

    总共的更新行数。

  • del

    总共的删除行数。

  • dbname

    数据库的名称。

请注意,如果 PostgreSQL 版本为 8.2 或更低版本,则 ret、fetch、ins、upd 和 del 项将始终为 0,因为在这些版本中没有这些统计信息。

如果指定了 dbname 参数,还会返回 7 个附加的指标项:

  • idxscan

    总共的用户索引扫描次数。

  • idxtupread

    总共的用户索引返回条目数。

  • idxtupfetch

    简单的用户索引扫描时总共的读取行数。

  • idxblksread

    总共的用户索引磁盘块读取次数。

  • idxblkshit

    总共的用户索引缓冲区命中次数。

  • seqscan

    总共的针对用户表的顺序扫描次数。

  • seqtupread

    从所有用户表返回的元组总数。

示例 1:在主机 “willow” 上,获取名为 “products” 的数据库的统计信息:

check_postgres_dbstats --dbhost willow --dbname products

返回的输出将如下所示(全部都在一行上,不会换行):

backends:82 commits:58374408 rollbacks:1651 read:268435543 hit:2920381758 idxscan:310931294 idxtupread:2777040927
idxtupfetch:1840241349 idxblksread:62860110 idxblkshit:1107812216 seqscan:5085305 seqtupread:5370500520
ret:0 fetch:0 ins:0 upd:0 del:0 dbname:willow

disabled_triggers

(链接:check_postgres_disabled_triggers) 检查数据库中禁用的触发器的数量。--warning--critical 选项是找到的此类触发器的数量,并且默认值都是 “1”,因为在正常使用中禁用触发器是一个有风险的事件。如果正在检查的数据库是 8.3 或更高版本,则检查的是处于“disabled”状态(而不是 “always” 或 “replica”)的触发器数量。输出将会显示表的名称,以及每个禁用的触发器的名称。

示例 1:确保没有禁用的触发器

check_postgres_disabled_triggers

对于 MRTG 输出,在第一行返回禁用的触发器数量。

disk_space

(链接:check_postgres_disk_space) 检查 PostgreSQL 可以使用的物理磁盘空间。此操作要求您的服务器上有可执行文件 “/bin/df”,以用于报告磁盘大小,并且还需要以超级用户身份运行(直接连接或通过 --role 切换),以便它可以查看 PostgreSQL 内部的data_directory设置。--warning--critical 选项以大小和/或百分比给出。如果使用大小,则允许使用标准单位类型:bytes、kilobytes、gigabytes、megabytes、gigabytes、terabytes 或 exabytes。每个单位可缩写为第一个字母;没有带单位时会采用“字节”。两个选项的默认值分别为 “90%” 和 “95%”。

此命令会检查以下内容,以确定 PostgreSQL 正在使用的所有物理磁盘。

data_directory - 主数据目录所在的磁盘。

日志目录 - 日志文件所在的磁盘。

WAL 文件目录 - 预写日志所在的磁盘(例如符号链接的 pg_xlog 或 pg_wal)

表空间 - 位于独立磁盘上的每个表空间。

输出显示每个磁盘上已使用和可使用的总大小,以及按使用百分比从高到低排序的百分比。上面的每个项目都会映射到一个文件系统:它们可以被包含或排除。有关详细信息,请参阅“基本过滤”部分。

示例 1:在端口 5432 上的数据库实例上,确保没有文件系统使用空间超过 90%。

check_postgres_disk_space --port=5432 --warning='90%' --critical='90%'

示例 2:检查所有以 /dev/sda 开头的文件系统,使用空间是否小于 10 GB 和 11 GB(分别发出警告和严重错误)

check_postgres_disk_space --port=5432 --warning='10 GB' --critical='11 GB' --include="~^/dev/sda"

示例 4:确保没有文件系统使用率超过 50% 且使用空间超过 15 GB

check_postgres_disk_space --critical='50% and 15 GB'

示例 5:如果任何文件系统使用率已达 70% 或者使用空间超过 1T,则发出警告

check_postgres_disk_space --warning='1T or 75'

对于 MRTG 输出,第一行返回文件系统的大小(以字节为单位),第四行返回文件系统的名称。

fsm_pages

(链接:check_postgres_fsm_pages) 检查一个 PostgreSQL 实例与max_fsm_pages设置的接近程度。此操作仅适用于 8.2 或更高版本的数据库,并且需要安装 contrib 模块pg_freespacemap--warning--critical 选项应以百分比表示。空闲空间映射表中使用的页数,是通过查看pg_freespacemap_relations视图,然后根据用于在 vacuum verbose 命令中输出空闲空间映射表中页面槽位数的公式,计算公式来确定的。warning 选项的默认值为 85%,critical 选项的默认值为 95%

示例 1:当我们的实例已用完 76% 的空闲空间页面槽位时发出警告,在数据库 robert 中已安装pg_freespacemap

check_postgres_fsm_pages --dbname=robert --warning="76%"

虽然您需要传入安装了pg_freespacemap的数据库的名称,但您只需对每个实例运行一次该项检查。此外,检查此信息确实需要在空闲空间映射表上获取特殊锁,因此建议您不要以较短的间隔运行该检查。

对于 MRTG 输出,在第一行上返回空闲空间映射表的百分比,并在第二行上返回当前使用的页面数。

fsm_relations

(链接:check_postgres_fsm_relations) 检查一个 PostgreSQL 实例与max_fsm_relations设置的接近程度。此操作仅适用于 8.2 或更高版本的数据库,并且需要安装 contrib 模块pg_freespacemap--warning--critical 选项应以百分比表示。空闲空间映射表中使用的关系数量,是通过查看pg_freespacemap_relations视图来确定的。warning 选项的默认值为 85%,critical 选项的默认值为 95%

示例 1:当我们的实例已用完了 80% 的空闲空间关系时发出警告,在数据库 dylan 中已安装pg_freespacemap

check_postgres_fsm_relations --dbname=dylan --warning="75%"

虽然您需要传入安装了pg_freespacemap的数据库的名称,但您只需对每个实例运行一次该项检查。此外,检查此信息确实需要在空闲空间映射表上获取特殊锁,因此建议您不要以较短的间隔运行该检查。

对于 MRTG 输出,在第一行上返回空闲空间映射表的百分比,并在第二行上返回当前使用的关系数。

hitratio

(链接:check_postgres_hitratio) 检查所有数据库的命中率,并在它们过低时进行通知。无需对每个数据库实例多次运行此命令。可以使用 --include--exclude 选项筛选数据库。有关详细信息,请参阅“基本过滤”部分。数据库的所有者还可以使用 --includeuser--excludeuser 选项对它们进行用户筛选。有关详细信息,请参阅“用户名过滤”部分。

warning 和 critical 选项应指定为百分比。此操作没有默认值:必须指定 warning 和 critical 选项的值。warning 值不能大于 critical 值。输出会返回按命中率排序的所有数据库,命中率最小的数据库在前。

示例:在主机 flagg 上,如果任何数据库的命中率低于 90%,则发出警告,如果命中率低于 80%,则发出严重错误。

check_postgres_hitratio --host=flagg --warning='90%' --critical='80%'

对于 MRTG 输出,在第一行返回命中率最小的数据库的百分比,在第四行返回数据库的名称。

hot_standby_delay

(链接:check_hot_standby_delay) 通过计算主服务器的当前 WAL 位置,与连接到它的从服务器的重放位置之间的增量,来检查流复制的滞后情况。从服务器必须处于 hot_standby(即只读)模式,因此使用此操作的最低版本是 PostgreSQL 9.0。--warning--critical 选项的值,是 WAL 位置之间的增量。由于这些值是 WAL 中的字节偏移量,因此它们应该与应用程序的预期事务量匹配,以防止出现过大或偏小的误报。

第一个出现的 “--dbname”、“--host” 和 “--port” 等选项会被作为主服务器的选项;第二个出现的属于从服务器的选项。

字节值应该基于由于延迟过多而使得从主服务器进行的流复制连接断开所需的事务量,该事务量由 PostgreSQL 配置变量wal_keep_segments确定。对于时间单位,有效单位为 “seconds”、“minutes”、“hours” 或 “days”。每个单位都可以写成单数形式,或者缩写为第一个字母。当以 “字节值和时间” 的形式指定两者时,必须满足这两个条件才能满足阈值。

您必须通过向 --dbhost 和 --dbport 参数提供逗号分隔的列表(例如 “--dbport=5432,5543”)来提供有关如何访问数据库的信息。如果未给出,则操作将失败。

示例 1:在端口 5433 上运行一个本地副本的数据库,在任何 WAL 回放中都落后时,发出一条警告:

check_hot_standby_delay --dbport=5432,5433 --warning='1'

示例 2:如果 replica1 收到的最后一个事务是 10 分钟以前的,则发出严重错误:

check_hot_standby_delay --dbhost=master,replica1 --critical='10 min'

示例 3:如果主节点上瞬间出现了多于流式复制连接可以处理的活动,则允许 replica1 落后 1 个 WAL 段;或者,如果主节点上出现的活动非常少且没有处理任何事务,则允许 replica1 落后 10 分钟;但不能同时满足这两个条件,两者同时出现表示复制连接存在持久问题。

check_hot_standby_delay --dbhost=master,replica1 --warning='1048576 and 2 min' --critical='16777216 and 10 min'

relation_size

index_size

table_size

indexes_size

total_relation_size

(链接:check_postgres_relation_sizecheck_postgres_index_sizecheck_postgres_table_sizecheck_postgres_indexes_sizecheck_postgres_total_relation_size)

操作relation_size使用pg_relation_size()函数检查一个关系(表、索引、物化视图)是否过大,而操作index_size用于索引。

操作table_size使用pg_table_size()检查表和物化视图,即包括了关系的分支文件和 TOAST 表。

操作indexes_size使用pg_indexes_size()检查表和物化视图上的附加索引的大小。

操作total_relation_size使用pg_total_relation_size()检查关系,即包括了关系的分支文件、索引和 TOAST 表。

可以使用 --include--exclude 选项过滤关系。有关详细信息,请参阅“基本过滤”部分。还可以通过使用 --includeuser--excludeuser 选项,对关系按其所有者进行筛选。有关详细信息,请参阅“用户名过滤”部分。

--warning--critical 选项的值是文件大小,可以采用的单位有 bytes、kilobytes、megabytes、gigabytes、terabytes 或 exabytes。每个都可以缩写为第一个字母。如果没有带单位,则假定为字节。两个选项都没有默认值:必须同时给出 warning 和 critical 选项。输出结果会显示出找到的最大关系的大小。

如果启用了 --showperf 选项,则将输出所有关系及其大小。为防止出现这种情况,建议您设置 --perflimit 选项,这将会执行查询ORDER BY size DESC LIMIT (perflimit),以限制返回的结果行数。

示例 1:在主机 burrick 上,如果有任何表大于 600MB,则发出严重错误。

check_postgres_table_size --critical='600 MB' --warning='600 MB' --host=burrick

示例 2:如果表 products 的大小超过 4 GB,则发出警告,并在达到 4.5 GB 后,发出严重错误。

check_postgres_table_size --host=burrick --warning='4 GB' --critical='4.5 GB' --include=products

示例 3:如果有任何非 postgres 用户拥有的索引超过 500 MB,则发出警告。

check_postgres_index_size --port=5432 --excludeuser=postgres -w 500MB -c 600MB

对于 MRTG 输出,返回最大关系的大小(以字节为单位),并在第四行返回数据库和关系的名称。

last_analyze

last_vacuum

last_autoanalyze

last_autovacuum

(链接:check_postgres_last_analyzecheck_postgres_last_vacuumcheck_postgres_last_autoanalyzecheck_postgres_last_autovacuum) 检查自上次对一个或多个数据库中的每个表运行 vacuum(或 analyze)以来,已经过去了多长时间。使用这些操作要求目标数据库版本为 8.3 或更高版本,或者版本为 8.2 但是已启用配置变量stats_row_level。可以使用 --include--exclude 选项筛选表。有关详细信息,请参阅“基本过滤”部分。还可以使用 --includeuser--excludeuser 选项按其所有者筛选表。有关详细信息,请参阅“用户名过滤”部分。

--warning--critical 选项的单位指定为时间。有效单位为 seconds、minutes、hours 和 days;它们都可以缩写为第一个字母。如果没有给出单位,则假定为 “seconds”。选项的默认值分别为 “1 day” 和 “2 days”。请注意,在某些情况下,此字段不会自动填充。如果某些表给您带来了问题,请确保它们有死行需要 vacuum,或者只是将它们排除在测试之外。

名为 “information_schema” 的模式被排除在此测试之外,因为它包含的表都很小,并且不会被更改。

请注意,非“自动”的版本也会检查自动的版本。换言之,使用 last_vacuum 将报告最后一个 vacuum,无论它是一次普通的 vacuum,还是由 autovacuum 后台进程运行的 vacuum。

示例 1:在主机 wormwood 上,如果有任何表在 3 天内未进行 vacuum,则发出警告,如果一周内未进行,则发出严重错误

check_postgres_last_vacuum --host=wormwood --warning='3d' --critical='7d'

示例 2:与上述相同,但是忽略属于用户 “eve” 或 “mallory” 的表

check_postgres_last_vacuum --host=wormwood --warning='3d' --critical='7d' --excludeuser=eve,mallory

对于 MRTG 输出,在第一行返回自上次对一个表进行 vacuum 或 analyze 以来的最短时间(以秒为单位)。第四行返回数据库的名称和表的名称。

listener

(链接:check_postgres_listener) 通过查看 pg_listener 表,确认有用户正在侦听一个或多个特定字符串(使用 LISTEN/NOTIFY 系统)。只需要指定 warning 或 critical 选项中的一个。格式是表示侦听目标的一个简单字符串,或者是波浪号字符,后跟用于正则表达式检查的字符串。请注意,此检查不适用于 PostgreSQL 9.0 或更高版本。

示例 1:如果没有用户在端口 5555 和 5556 上侦听字符串 bucardo_mcp_ping,则发出警告

check_postgres_listener --port=5555,5556 --warning=bucardo_mcp_ping

示例 2:如果在数据库 oskar 上没有与 “grimm” 匹配的活跃的侦听请求,则发出严重错误

check_postgres_listener --db oskar --critical=~grimm

对于 MRTG 输出,在第一行返回 1 或 0,指示成功或失败。通知的名称必须通过 --mrtg 选项提供。

locks

(链接:check_postgres_locks) 检查一个或多个数据库上的锁总数。无需对每个数据库实例运行多次。可以使用 --include--exclude 选项过滤数据库。有关详细信息,请参阅“基本过滤”部分。

--warning--critical 选项可以指定为简单的数字,表示锁的总数,也可以按锁类型进行细分。有效的锁名称为'total''waiting'或 PostgreSQL 使用的锁类型的名称。这些名称不区分大小写,不需要末尾的 “lock” 部分,因此 exclusive 可以匹配 “ExclusiveLock”。格式为 name=number,不同的指标项用冒号或分号(或任何其他符号)分隔。

示例 1:在主机 garrett 上,如果锁的总数为 100 或更多,则发出警告,如果锁数为 200 或更多,则发出严重错误

check_postgres_locks --host=garrett --warning=100 --critical=200

示例 2:在主机 artemus 上,如果存在 200 个或更多的锁,则发出警告,如果存在超过 250 个锁,或者存在超过 20 个独占锁,或者有超过 5 个连接正在等待锁定,则发出严重错误。

check_postgres_locks --host=artemus --warning=200 --critical="total=250:waiting=5:exclusive=20"

对于 MRTG 输出,在第一行返回锁的数目,在第四行返回数据库的名称。

lockwait

(链接:check_postgres_lockwait) 检查是否有阻塞块以及阻塞多长时间。无需对每个数据库实例运行多次。可以使用 --include--exclude 选项过滤数据库。有关详细信息,请参阅“基本过滤”部分。

--warning--critical 选项是时间值,表示锁阻塞的时间。

示例 1:如果锁阻塞时间超过一分钟,则发出警告,如果阻塞时间超过 2 分钟,则发出严重错误

check_postgres_lockwait --host=garrett --warning='1 min' --critical='2 min'

对于 MRTG 输出,返回阻塞的会话数。

logfile

(链接:check_postgres_logfile) 确保日志文件记录在预期的位置,并且在正常工作。此操作会发出一个命令,该命令会在它正在检查的每个数据库上引发一个错误,并确保该消息显示在日志中。它会扫描 PostgreSQL 内部的各种 log_* 设置,以确定日志应该出现在哪里。如果您使用的是 syslog,它会对 /etc/syslog.conf 进行粗略(但不是万无一失)的扫描。或者,您也可以使用 --logfile 选项提供日志文件的名称。如果日志具有一种由外部程序驱动的自定义轮换方案,那么此功能会特别有用。--logfile 选项支持以下转义字符:%Y %m %d %H,分别表示当前的年、月、日和小时。除非已指定 warning 选项传入一个非零值,否则一个错误始终会报告为严重错误。除了那种特定的用法以外,不应使用--warning--critical选项。

示例 1:在端口 5432 上的数据库系统,确保其日志写入到文件 /home/greg/pg8.2.log

check_postgres_logfile --port=5432 --logfile=/home/greg/pg8.2.log

示例 2:与上面相同,但发出警告,而不是严重错误

check_postgres_logfile --port=5432 --logfile=/home/greg/pg8.2.log -w 1

对于 MRTG 输出,在第一行返回 1 或 0,指示成功或失败。如果发生失败,第四行将会提供有关所遇到错误的更多详细信息。

prepared_txns

(链接:check_postgres_prepared_txns) 检查任何现有的预备事务的年龄。请注意,大多数人不会使用到预备事务,因为它们是两阶段提交的一部分,维护起来很复杂。也不应该将它们与预备语句相混淆,这是大多数人在听到预备时会想到的。warning 的默认值为 1 秒,用于检测对预备事务的任何使用,这在大多数系统上可能是一个错误。“warning” 和 “critical” 选项的值,是指在发出警报之前一个预备事务已打开的秒数。

示例 1:在检测到任何预备事务时发出警告:

check_postgres_prepared_txns -w 0

示例 2:如果任何预备事务打开时间超过 10 秒,则发出严重错误,但是对于数据库 “shrike” 最长可达 360 秒:

check_postgres_prepared_txns --critical=10 --exclude=shrike
check_postgres_prepared_txns --critical=360 --include=shrike

对于 MRTG 输出,在第一行返回最老的事务打开的秒数,在最后一行显示该事务来自哪个数据库。

query_runtime

(链接:check_postgres_query_runtime) 通过对特定查询执行 “EXPLAIN ANALYZE”,来检查运行该查询所需的时间。--warning--critical 选项是查询应花费的最长时间。有效单位为 seconds、minutes 和 hours;它们都可以缩写为第一个字母。如果没有给出单位,则假定为 “seconds”。必须同时指定 warning 和 critical 选项。要运行的视图或函数的名称,必须传递给 --queryname 选项。它必须由单个单词(或 schema.word)组成,末尾带有可选的括号。

示例 1:如果名为 “speedtest” 的函数,在 10 秒或更短的时间内无法执行完成,则发出严重错误。

check_postgres_query_runtime --queryname='speedtest()' --critical=10 --warning=10

对于 MRTG 输出,在第一行报告查询完成的时间(以秒为单位)。在第四行列出数据库。

query_time

(链接:check_postgres_query_time) 在一个或多个数据库上检查正在运行的查询的时长。无需在同一数据库实例上多次运行此操作。请注意,这已经排除了状态为 “idle in transaction” 的查询。可以使用 --include--exclude 选项筛选数据库。有关详细信息,请参阅“基本过滤”部分。您还可以使用 --includeuser--excludeuser 选项筛选运行查询的用户。有关详细信息,请参阅“用户名过滤”部分。

--warning--critical 选项的值是时间值,并且必须至少提供一个(没有默认值)。有效单位为 “seconds”、“minutes”、“hours” 或 “days”。每个都可以写成单数,或者缩写为第一个字母。如果未给出单位,则假定单位为秒。

此操作需要 PostgreSQL 8.1 或更高版本。

示例 1:如果任何查询的运行时间超过 3 分钟,则发出警告,如果超过 5 分钟,则发出严重错误。

check_postgres_query_time --port=5432 --warning='3 minutes' --critical='5 minutes'

示例 2:使用默认值(2 分钟和 5 分钟),检查除 “template” 开头的名称以外的所有数据库。

check_postgres_query_time --port=5432 --exclude=~^template

示例 3:如果用户 “don” 在运行的查询时间超过了 20 秒,则发出警告

check_postgres_query_time --port=5432 --includeuser=don --warning=20s

对于 MRTG 输出,在第一行上返回运行时间最长的查询的时长(以秒为单位)。在第四行给出数据库的名称。

replicate_row

(链接:check_postgres_replicate_row) 在一个或多个从属实例上面,检查主从复制是否正在工作。

第一个 “--dbname”、“--host” 和 “--port” 等选项被视为主实例信息;后面的选项对应从属实例。--warning--critical 选项值的单位是时间,必须至少提供一个(没有默认值)。有效的单位有 “seconds”、“minutes”、“hours” 或 “days”。每个单位都可以写成单数,或者缩写为第一个字母。如果未给出单位,则假定单位为秒。

此检查会在实例上更新单个行,然后测量该更改应用到从实例所需的时间。为此,您需要选取一个正在复制的表,然后找到可以更改且不会被任何其他进程更改的行。此行的特定列将从一个值更改为另一个值。所有这些都被输入到repinfo选项中,并且应包含以下选项,以逗号分隔:表名、主键、键值、列、第一个值、第二个值。

示例 1:Slony 正在将数据库 “sales” 中名为 “orders” 的表,从主机 “alpha” 复制到主机 “beta”。该表的主键名为 id,我们将测试 id 为 3 的行(这是历史值,从未更改过)。有一个名为 “salesrep” 的列,我们将从 “slon” 的值更改到 “nols” 以检查复制。如果复制在 10 秒内未发生,我们希望引发警告。

check_postgres_replicate_row --host=alpha --dbname=sales --host=beta
--dbname=sales --warning=10 --repinfo=orders,id,3,salesrep,slon,nols

示例 2:Bucardo 正在将名为 “receipt” 的表,从主机 “green” 复制到主机 “red”、“blue” 和 “yellow”。两边的数据库都是 “public”。从数据库在端口 5455 上运行。主键名为 “receipt_id”,我们要使用的行的值为 9,我们要为测试更改的列名为 “zone”。我们将在 “north” 和 “south” 之间更换此列的值,如果更改未在 5 秒内复制到所有三个从实例,则发出严重错误。

check_postgres_replicate_row --host=green --port=5455 --host=red,blue,yellow
 --critical=5 --repinfo=receipt,receipt_id,9,zone,north,south

对于 MRTG 输出,在第一行返回复制完成所需的时间,以秒为单位。最长时间设置为 4 分 30 秒:如果在这么长的时间内没有完成复制,则会引发错误。

replication_slots

(链接:check_postgres_replication_slots) 检查目标数据库实例中任何复制槽保留的 WAL 数量。这对于监控所有 WAL 归档和复制都通过复制槽进行的环境非常方便。

“warning”和“critical”是复制槽中保留的总字节数。例如:

check_postgres_replication_slots --port=5432 --host=yellow -warning=32M -critical=64M

可以使用 --include/--exclude 选项,监控特定名称的复制槽。

same_schema

(链接:check_postgres_same_schema) 验证两个或多个数据库的架构是否相同(但不比较其中的数据)。与大多数其他操作不同,这没有 warning 或 critical 条件 - 数据库要么一致,要么不一致。如果它们不同,则会显示差异的详细列表。

您可能希望排除或过滤掉某些差异。执行此操作的方法是向--filter选项添加字符串。要排除某种类型的对象,请使用 “noname”,其中 “name” 是对象的类型,例如 “noschema”。要通过正则表达式针对其名称排除特定类型的对象,请使用 “noname=regex”。请参阅以下示例以更好地理解。

可以筛选的对象类型包括:

  • user
  • schema
  • table
  • view
  • index
  • sequence
  • constraint
  • trigger
  • function

过滤器选项 “noposition” 可防止验证表中列的位置。

过滤器选项 “nofuncbody” 可防止比较所有函数的主体。

过滤器选项 “noperm” 可防止比较对象权限。

若要提供第二个数据库,只需通过调用相应的连接参数,将其追加到第一个数据库后面即可。例如,要比较主机 alpha 和 bravo 上的数据库,请使用 “--dbhost=alpha,bravo”。另请参阅以下示例。

如果只给出一个主机,则假定我们正在执行一个 “基于时间” 的报告。首次运行此操作时,会将数据库中所有对象的快照保存到本地文件中。当您再次运行它时,该快照将被读入并成为 “database #2”,并与当前数据库进行比较。

要用新版本快照替换旧的保存文件,请使用 --replace 参数。

如果需要将保存的文件写入特定目录,请使用 --audit-file-dir 参数。

若要避免由于异步副本上的复制延迟,导致基于值的检查误报,请使用 --assume-async 选项。

若要在不同时间点启用快照,可以使用 “–suffix” 参数使每次运行的文件名都是唯一的。请参阅以下示例。

示例 1:验证主机 star 和 line 上的两个数据库是否相同:

check_postgres_same_schema --dbhost=star,line

示例 2:与前面相同,但排除名称中带有 “slony” 的任何触发器

check_postgres_same_schema --dbhost=star,line --filter="notrigger=slony"

示例 3:与前面相同,但也排除了所有索引

check_postgres_same_schema --dbhost=star,line --filter="notrigger=slony noindexes"

示例 4:检查不同端口上数据库 “battlestar” 的差异

check_postgres_same_schema --dbname=battlestar --dbport=5432,5544

示例 5:创建一个每日和每周的快照文件

check_postgres_same_schema --dbname=cylon --suffix=daily
check_postgres_same_schema --dbname=cylon --suffix=weekly

示例 6:运行一次历史的比较,然后替换文件

check_postgres_same_schema --dbname=cylon --suffix=daily --replace

示例 7:验证主机 star 和 line 上的两个数据库是否相同,不包括数据值(如序列的 last_val):

check_postgres_same_schema --dbhost=star,line --assume-async 

sequence

(链接:check_postgres_sequence) 检查数据库中所有序列的剩余空间。这可以用每个序列的已使用数,和可能的取值数的百分比来衡量。--warning--critical 选项应以百分比表示。warning 的默认值为 85%,critical 的默认值为 95%。您可以使用 --include 和 --exclude 来控制要检查的序列。请注意,该检查确实考虑了异常的最小值增量值。默认情况下,它不关心序列是否设置为循环,并且通过传递 --skipcycled,以让循环的序列报告的使用率为 0%。

Nagios 的输出会显示序列的名称、使用的百分比和剩余的“调用”次数,指示在达到最大值之前,可以在该序列上调用多少次 nextval。

MRTG 的输出会在第一行返回,所有序列里面最高的使用率百分比,并在第四行返回对应该百分比的每个序列的名称,如果该百分比有多个序列,用 “|”(管道符号)分隔。

示例 1:如果任何序列的使用率接近 95%,则发出警告。

check_postgres_sequence --dbport=5432 --warning=95%

示例 2:检查名为 “orders_id_seq” 的序列的使用率是否超过 50%。

check_postgres_sequence --dbport=5432 --critical=50% --include=orders_id_seq

settings_checksum

(链接:check_postgres_settings_checksum) 检查 PostgreSQL 中所有设置是否与上次检查时相同。这是通过生成设置名称及其值的排序列表的校验和来完成的。请注意,由于 ALTER USER 的用法,并且超级用户比普通用户能看到更多的设置,同一数据库中的不同用户可能具有不同的校验和。应该指定 --warning--critical 选项,但不能同时指定两者。每个选项的值都是校验和,一个由 32 个字符组成的十六进制值。您可以使用特殊的--critical=0选项运行,以获得现有的校验和。

此操作需要 Digest::MD5 模块。

示例 1:使用默认用户(通常为 postgres)在端口 5555 上获得数据库的初始校验和

check_postgres_settings_checksum --port=5555 --critical=0

示例 2:确保没有更改任何设置,如果有更改,则使用上面的校验和发出警告。

check_postgres_settings_checksum --port=5555 --warning=cd2f3b5e129dc2b4f5c0f6d8d2e64231

对于 MRTG 输出,返回 1 或 0,表示校验和匹配成功或失败。必须使用--mrtg参数提供校验和。第四行始终会给出当前校验和。

timesync

(链接:check_postgres_timesync) 将本地系统时间与一个或多个数据库报告的时间进行比较。--warning--critical 选项表示两个系统之间的时间差异,单位为秒,超出该差异值则发出警报。如果两者都未指定,则使用默认值,即 “2” 和 “5”。warning 值不能大于 critical 值。由于该测试本身不太精确,不建议使用 “0” 或 “1” 的值。

返回的字符串会显示时差,并输出每一侧的时间。

示例 1:检查主机 ankh、morpork 和 klatch 上的数据库,是否与本地时间相差不超过 3 秒:

check_postgres_timesync --host=ankh,morpork,klatch --critical=3

对于 MRTG 输出,在第一行返回本地时间与数据库时间之间的时差,单位为秒。第四行返回数据库的名称。

txn_idle

(链接:check_postgres_txn_idle) 在一个或多个数据库上,检查处于 “idle in transaction” 状态的查询的数目和持续时间。无需在同一数据库实例上多次运行此操作。可以使用 --include--exclude 选项筛选数据库。有关详细信息,请参阅下面的“基本过滤”部分。

--warning--critical 选项以时间值、有符号整数或时间类整数的形式给出,并且必须至少指定一个(没有默认值)。有效单位为 ‘seconds’、‘minutes’、‘hours’ 或 ‘days’。每个单位都可以写成单数,或缩写为第一个字母。如果未给出单位且数字无符号,则假定单位为秒。

此操作需要 PostgreSQL 8.3 或更高版本。

从 PostgreSQL 10 开始,您只需向非特权帐户授予 pg_read_all_stats。在所有早期版本中,需要超级用户权限才能查看系统中所有用户的查询;如果无法检查查询,则返回 UNKNOWN。若只要包含连接用户的查询,请使用 --includeuser

示例 1:如果任何连接在事务中空闲超过 15 秒,则发出警告:

check_postgres_txn_idle --port=5432 --warning='15 seconds'

示例 2:如果有 50 个或更多的事务,则发出警告:

check_postgres_txn_idle --port=5432 --warning='+50'

示例 3:如果有 5 个或更多的连接,在事务中空闲超过 10 秒,则发出严重错误:

check_postgres_txn_idle --port=5432 --critical='5 for 10 seconds'

对于 MRTG 输出,返回运行时间最长的空闲事务的持续时长(以秒为单位)。第四行返回数据库的名称,以及有关最长事务的其他信息。

txn_time

(链接:check_postgres_txn_time) 在一个或多个数据库上,检查打开的事务的时长。无需在同一数据库实例上多次运行此命令。可以使用 --include--exclude 选项筛选数据库。有关详细信息,请参阅“基本过滤”部分。还可以通过使用 --includeuser--excludeuser 选项来过滤事务的所有者。有关详细信息,请参阅“用户名过滤”部分。

--warning--critical 选项是时间值,必须至少指定一个(没有默认值)。有效单位为 ‘seconds’、‘minutes’、‘hours’ 或 ‘days’。每个单位都可以写成单数,或缩写为第一个字母。如果未给出单位,则假定单位为秒。

此操作需要 PostgreSQL 8.3 或更高版本。

示例 1:如果任何事务已打开超过 10 分钟,则发出严重错误:

check_postgres_txn_time --port=5432 --critical='10 minutes'

示例 1:如果用户 “warehouse” 打开的一个事务超过 30 秒,则发出警告:

check_postgres_txn_time --port-5432 --warning=30s --includeuser=warehouse

对于 MRTG 输出,在第一行上返回一个事务打开的最长时间(以秒为单位)。第四行给出数据库的名称。

txn_wraparound

(链接:check_postgres_txn_wraparound) 检查一个或多个数据库系统中接近事务 ID 回卷的程度。--warning--critical 选项表示已用完的事务数,并且必须是正整数。如果未给出任一选项,则使用默认值 13 亿和 14 亿。无需对每个数据库实例多次运行此命令。有关此数字代表的含义,以及如何处理它的更详细讨论,请访问页面:防止事务 ID 回卷失败

为了便于阅读,warning 值和 critical 值可以在数字中加入下划线,就像 Perl 一样。

示例 1:检查本机数据库的默认值

check_postgres_txn_wraparound --host=localhost

示例 2:检查端口 6000,并在用完 17 亿个事务时发出严重错误:

check_postgres_txn_wraparound --port=6000 --critical=1_700_000_000

对于 MRTG 输出,在第 1 行返回所有数据库中最高的事务 ID,而第 4 行指示它对应的数据库名称。

version

(链接:check_postgres_version) 检查所需版本的 PostgreSQL 是否正在运行。--warning--critical 选项(只需要一个)的格式必须为 X.YX.Y.Z,其中 X 是主版本号,Y 是次要版本号, Z 是修订版。

示例 1:如果端口 5678 上的数据库不是版本 9.4.10,则发出警告:

check_postgres_version --port=5678 -w=9.4.10

示例 2:如果主机 valley、grain 或 sunshine 上的任何数据库不是版本 9.3,则发出警告:

check_postgres_version -H valley,grain,sunshine --critical=9.3

对于 MRTG 输出,在第一行报告 1 或 0,指示成功或失败。第四行显示当前版本。必须通过--mrtg选项提供版本号。

wal_files

(链接:check_postgres_wal_files) 检查 pg_wal 目录(PostgreSQL 9.6 及更早版本:pg_xlog)中存在多少 WAL 文件,这些文件是从 data_directory 中找到的,有时出于性能原因,该目录会作为指向另一个物理磁盘的符号链接。如果未使用 --lsfunc 选项,则必须以超级用户身份运行此操作,才能访问 pg_wal 目录的内容。使用此操作的最低版本是 PostgreSQL 8.1。--warning--critical 选项值就是 pg_wal 目录中的文件数。将其设置为什么数字得看实际情况,但一般准则是将选项设为略高于通常的数字,以便及早发现问题。

通常,PostgreSQL 会关闭 WAL 文件然后重复使用,但长时间运行的打开事务,或者错误的 archive_command 脚本可能会导致 PostgreSQL 创建过多文件。最终,这将导致它们所在的磁盘空间不足,此时 PostgreSQL 将会停止运行。

为了避免以数据库超级用户身份进行连接,应当使用超级用户基于pg_ls_dir(),定义一个具有 SECURITY DEFINER 的包装函数,并使用 --lsfunc 选项运行操作。下面的示例函数,如果由超级用户来定义,则将允许脚本以普通用户 nagios 的身份,使用 --lsfunc=ls_xlog_dir 选项运行操作。

BEGIN;
CREATE FUNCTION ls_xlog_dir()
    RETURNS SETOF TEXT
    AS $$ SELECT pg_ls_dir('pg_wal') $$
    LANGUAGE SQL
    SECURITY DEFINER;
REVOKE ALL ON FUNCTION ls_xlog_dir() FROM PUBLIC;
GRANT EXECUTE ON FUNCTION ls_xlog_dir() to nagios;
COMMIT;

示例 1:检查主机 “pluto” 上就绪的 WAL 文件数是否为 10 个或更少,使用一个包装器函数ls_xlog_dir,以避免需要超级用户权限:

check_postgres_archive_ready --host=pluto --critical=10 --lsfunc=ls_xlog_dir

对于 MRTG 输出,在第 1 行报告 WAL 文件数。

此操作不需要其他参数,也不连接到任何数据库,而只是在当前目录中为每个操作创建符号链接,文件命名格式为 check_postgres_<action_name>。如果该文件已存在,则不会被覆盖。如果运行的操作是 rebuild_symlinks_force,则符号链接将被覆盖。选项 --symlinks 是 --action=rebuild_symlinks 的一种快捷方式。

基本过滤

The options –include and –exclude can be combined to limit which things are checked, depending on the action. The name of the database can be filtered when using the following actions: backends, database_size, locks, query_time, txn_idle, and txn_time. The name of a relation can be filtered when using the following actions: bloat, index_size, table_size, relation_size, last_vacuum, last_autovacuum, last_analyze, and last_autoanalyze. The name of a setting can be filtered when using the settings_checksum action. The name of a file system can be filtered when using the disk_space action.

If only an include option is given, then ONLY those entries that match will be checked. However, if given both exclude and include, the exclusion is done first, and the inclusion after, to reinstate things that may have been excluded. Both –include and –exclude can be given multiple times, and/or as comma-separated lists. A leading tilde will match the following word as a regular expression.

To match a schema, end the search term with a single period. Leading tildes can be used for schemas as well.

Be careful when using filtering: an inclusion rule on the backends, for example, may report no problems not only because the matching database had no backends, but because you misspelled the name of the database!

Examples:

Only checks items named pg_class:

--include=pg_class

Only checks items containing the letters ‘pg_’:

--include=~pg_

Only check items beginning with ‘pg_’:

--include=~^pg_

Exclude the item named ’test’:

--exclude=test

Exclude all items containing the letters ’test:

--exclude=~test

Exclude all items in the schema ‘pg_catalog’:

--exclude='pg_catalog.'

Exclude all items in the ‘pg_temp_nnn’ per-session temporary schemas:

--exclude=~^pg_temp_.

Exclude all items containing the letters ‘ace’, but allow the item ‘faceoff’:

--exclude=~ace --include=faceoff

Exclude all items which start with the letters ‘pg_’, which contain the letters ‘slon’, or which are named ‘sql_settings’ or ‘green’. Specifically check items with the letters ‘prod’ in their names, and always check the item named ‘pg_relname’:

--exclude=~^pg_,~slon,sql_settings --exclude=green --include=~prod,pg_relname

用户名过滤

The options –includeuser and –excludeuser can be used on some actions to only examine database objects owned by (or not owned by) one or more users. An –includeuser option always trumps an –excludeuser option. You can give each option more than once for multiple users, or you can give a comma-separated list. The actions that currently use these options are:

  • database_size
  • last_analyze
  • last_autoanalyze
  • last_vacuum
  • last_autovacuum
  • query_time
  • relation_size
  • txn_time

Examples:

Only check items owned by the user named greg:

--includeuser=greg

Only check items owned by either watson or crick:

--includeuser=watson,crick

Only check items owned by crick,franklin, watson, or wilkins:

--includeuser=watson --includeuser=franklin --includeuser=crick,wilkins

Check all items except for those belonging to the user scott:

--excludeuser=scott

测试模式

To help in setting things up, this program can be run in a “test mode” by specifying the –test option. This will perform some basic tests to make sure that the databases can be contacted, and that certain per-action prerequisites are met, such as whether the user is a superuser, if the version of Postgres is new enough, and if stats_row_level is enabled.

文件

In addition to command-line configurations, you can put any options inside of a file. The file .check_postgresrc in the current directory will be used if found. If not found, then the file ~/.check_postgresrc will be used. Finally, the file /etc/check_postgresrc will be used if available. The format of the file is option = value, one per line. Any line starting with a ‘#’ will be skipped. Any values loaded from a check_postgresrc file will be overwritten by command-line options. All check_postgresrc files can be ignored by supplying a --no-checkpostgresrc argument.

环境变量

The environment variable $ENV{HOME} is used to look for a .check_postgresrc file. The environment variable $ENV{PGBINDIR} is used to look for PostgreSQL binaries.

提示和技巧

Since this program uses the psql program, make sure it is accessible to the user running the script. If run as a cronjob, this often means modifying the PATH environment variable.

If you are using Nagios in embedded Perl mode, use the --action argument instead of symlinks, so that the plugin only gets compiled one time.

依赖

Access to a working version of psql, and the following very standard Perl modules:

  • Cwd
  • Getopt::Long
  • File::Basename
  • File::Temp
  • Time::HiRes (if $opt{showtime} is set to true, which is the default)

The “settings_checksum” action requires the Digest::MD5 module.

The “checkpoint” action requires the Date::Parse module.

Some actions require access to external programs. If psql is not explicitly specified, the command which is used to find it. The program /bin/df is needed by the “disk_space” action.