介绍
pgAgent是用于为PostgreSQL数据库调度作业的工具。它还具有比通常使用的cron
更强大的调度功能,因为它专门构建用于处理Postgres任务。例如,pgAgent可以安排多个步骤而无需批处理脚本或重复命令。重要的是要注意,即使您已安装pgAdmin,也必须独立下载pgAgent,特别是作为pgAdmin的扩展。
在本教程中,您将安装pgAgent,在pgAdmin图形用户界面(GUI)上配置数据库以使用pgAgent,将pgAgent设置为守护进程,然后使用pgAgent调度一个将备份数据库的作业。
先决条件
要按照本教程操作,您需要:
- 已设置为非root用户和防火墙的Ubuntu 22.04服务器,用户具有
sudo
权限。您可以通过阅读我们的初始服务器设置指南来完成此操作。 - 您的服务器上已安装了PostgreSQL。您可以按照我们的指南进行设置:在Ubuntu 22.04上安装和使用PostgreSQL。在按照此指南操作时,请确保创建一个新角色和数据库,因为您将需要这两者来连接pgAdmin到您的PostgreSQL实例
- 已安装pgAdmin并设置了一个帐户。您可以按照我们在在Ubuntu 22.04上以服务器模式安装和配置pgAdmin4的教程执行此操作
步骤1 — 安装pgAgent
如前所述,安装pgAdmin时pgAgent不会自动配置。您可以通过在终端上运行apt install
和包名称pgagent
的命令来安装pgAgent,如下所示:
- sudo apt install pgagent
安装了pgAgent后,请继续下一步,配置您的数据库以在pgAdmin中使用pgAgent。
步骤2 — 配置您的数据库以使用pgAgent
完成了先决条件后,pgAdmin已设置并准备就绪。您可以通过pgAdmin配置数据库以供pgAgent使用。打开您的Web浏览器,导航到http://your_domain中的pgAdmin应用程序。一旦登录到您的帐户,导航到左侧面板上的树控件。找到您创建的名为sammy的数据库并展开列表。从此列表中,将有一个名为Extensions的选项。找到它后,右键单击它,然后选择选项Query Tool:

在使用pgAdmin之前,需要将扩展加载到您的数据库中。为此,请编写以下查询,然后单击侧向箭头▶表示执行以运行命令:
- CREATE EXTENSION pgagent;
此步骤使用Query Tool功能在以下示例中表示:

在消息选项卡下,将返回输出查询在300毫秒内成功返回。 这证实了pgAgent扩展已成功创建。
注意:如果您的数据库未加载适当的plpgsql
语言,则会收到以下错误消息:
OutputERROR: language "plpgsql" does not exist
HINT: Use CREATE EXTENSION to load the language into the database.
SQL state: 42704
如果发生这种情况,您需要运行CREATE LANGUAGE
来安装所需的pl/pgsql过程语言。您可以通过运行以下命令来安装它:
- CREATE LANGUAGE plpgsql;
安装了pl/pgsql语言后,底部将显示类似以下信息:查询在231毫秒内成功返回。完成此操作后,再次运行之前的CREATE EXTENSION pgagent
查询。
运行这些查询后,在扩展下,将列出两个项目:pgagent和plpgsql:

A new item in the tree control on the left-hand side will appear called pgAgent Jobs. This signifies that pgAgent was successfully installed on your pgAdmin account. Next, you will set up pgAgent as a daemon so that it can run your jobs successfully.
注意:如果这些项目没有立即显示,请刷新浏览器页面,如果您的查询成功,则它们应该会显示。
步骤3 —— 将pgAgent设置为守护程序
现在,您已经通过pgAdmin为您的数据库安装并配置了pgAgent,接下来需要在服务器上将pgAgent设置为守护程序。 守护程序是在后台作为连续进程运行并执行服务任务的程序。 pgAgent在Unix系统上作为守护程序运行,通常在数据库服务器上自身运行。
要将pgAgent设置为守护程序,您需要一个PostgreSQL连接字符串,以便在安排作业时,该进程将适当地执行。 在这种情况下,您正在设置一个PostgreSQL libpq连接字符串,这意味着一个特定于用户并连接到您设置的某些参数的字符串。 您可以在PostgreSQL文档中了解有关PostgreSQL libpq连接函数的更多信息。
你的连接字符串将提供主机名、数据库名称和用户名的凭据。在我们的示例中,主机将使用Unix域套接字,数据库名称为sammy
,用户为sammy
。此字符串将附加到pgagent
命令以启动守护进程。在终端中,您将运行以下代码:
- pgagent host=/var/run/postgresql dbname=sammy user=sammy
如果输出为空并且您没有收到连接错误消息,则连接字符串设置成功。
创建连接字符串后,您就可以使用pgAgent安排作业。
第4步 — 使用pgAgent安排作业
pgAgent充当调度代理,可以运行和管理作业,并可以创建包含一个或多个步骤或计划的作业。例如,一个步骤可能包含一些SQL语句或shell脚本,并在其他步骤之后依次执行。总体而言,您可以使用pgAgent安排、管理、修改或禁用您的作业。
在本教程中,您将使用pgAgent创建一个作业,该作业将在每周的每一天每分钟备份您的sammy数据库。您可以通过右键单击pgAgent Jobs,选择Create,然后选择pgAgent Job…开始:

一旦完成此操作,将出现一个名为创建 – pgAgent作业的提示,您可以开始填写常规选项卡中所需的信息。在本例中,我们将使用名称sammy_backup,并且不会指定主机代理,因为我们希望能够在任何主机上运行此作业。此外,我们将作业类别保留为例行维护。如果您想包含其他任何评论,请随时在注释部分添加:

接下来,导航到步骤选项卡。单击右上角的+符号创建一个步骤。在本例中,我们将此步骤命名为step1。然后,为了扩展您的选项,请单击垃圾桶图标左侧的铅笔。启用?按钮默认为打开状态,表示执行此作业时将包括此步骤。
对于种类选项,您可以选择SQL或批处理,这里我们选择了批处理。您在这个示例中选择批处理的原因是因为这将运行您为数据库备份计划设置的适当的PostgreSQL命令。SQL选项可用于安排执行原始SQL的作业。在本例中,我们选择了本地作为连接类型,以便该步骤在本地服务器上执行,但如果您愿意,您也可以选择远程来选择您喜欢的远程主机。如果您希望在远程主机上执行此操作,则需要在连接字符串字段中指定该标准。如果您遵循了第1步,则您的连接字符串已经设置并连接。
对于数据库字段,请确保选择了正确的数据库,这里我们指定了sammy。通过出错时选项,您可以自定义pgAgent在执行步骤时出错时的响应。在这种情况下,我们选择失败以在处理步骤时出现错误时通知我们。同样,如果您想添加附加注释,可以将它们添加到注释框中。
在相同的步骤选项卡中,还有一个代码选项卡。如果您像在此示例中所做的那样选择批处理,那么导航到代码选项卡。一旦进入此选项卡,就会有一行空行,供您插入您的 PostgreSQL 命令。您可以用您自己的备份命令替换这里的命令,并使用您自定义的选项集。任何有效的命令都是可以接受的。
本教程将使用pg_dump
命令备份您的 Postgres 数据库sammy。在此命令中,包括您的特定用户名、数据库名称和--clean
标志,该标志通过在输出任何正在创建的命令之前删除或“清理”数据库对象来帮助pg_dump
。对于--file
标志,您指定备份文件将保存的确切位置。此语句的最后部分date +%Y-%m-%d-%H-%M-%S
是动态生成日期和每个备份的多个文件。否则,备份文件将不断覆盖并保存在现有文件上。通过这种方式,您可以跟踪每个备份文件,了解您安排的任何指定时间或日期。您的完整命令将如下:
pg_dump --username=sammy --dbname=sammy --clean --file=/home/sammy/backup-`date +%Y-%m-%d-%H-%M-%S`.sql
注意:如果选择将备份文件保存到不同位置,请确保使用已选目录的绝对路径。例如,虽然~/
通常指的是/home/sammy/
的主目录,但在这种情况下,pg_dump
需要/home/sammy/
的绝对路径。
一旦您添加了备份命令,您可以导航到标签页计划。 类似于设置步骤时,单击+符号以添加计划,然后提供您偏好的名称,并单击垃圾桶图标旁边的铅笔图标以展开您的选项。 在常规选项卡下,将显示您输入的名称,在本示例中,它是schedule1。 同样,对于启用,默认为打开开关以确保计划正确执行。 对于开始和结束选项,请指定计划任务的开始和结束日期和时间。 由于您将测试计划任务,请确保当前时间在开始和结束范围内。 如果需要,可在注释中添加注释。
现在继续到重复选项卡。在这里,您可以自定义计划任务执行的频率。您可以尽可能具体地选择周、月、日期、小时或分钟。请注意,如果您没有进行选择,这与选择全选相同。因此,如果您将工作日留空,则您的计划将考虑所有工作日。同样,对于时间,您可以将小时或分钟留空,这与全选相同。请记住,时间采用cron样式格式,因此,对于此示例,要每分钟生成一次备份,您必须在一个小时内选择每一分钟(00至59)。为了演示这一点,我们选择了全选的分钟。所有分钟都列出来,但将其留空也会获得相同的结果:
如果有您不希望执行作业的日期或时间,您可以创建更详细的时间表,或者您可以通过导航到例外选项卡来设置。
注意:作业还根据计划执行,因此,每次更改它时,计划运行时间都将重新计算。当发生这种情况时,pgAgent将轮询数据库以获取过去的计划运行时间值,并从那里开始。如果出现问题,那么当pgAgent再次启动时,它将返回您设置的常规计划。
完成设置和定制您要执行的计划后,请按下保存按钮。将在左侧的树控件上出现一个新的pgAgent作业,其名称为您的作业名称。在本示例中,sammy_backup显示为其下列出的计划和步骤:

现在您已成功创建了一个pgAgent作业,在下一步中,您将了解如何验证您的pgAgent作业是否成功运行。
第5步 — 验证您的pgAgent作业
您可以通过几种方式检查是否按计划每分钟创建数据库备份文件的作业正在运行。在pgAdmin中,您可以导航到左侧的树控件,然后单击sammy_backup。然后,转到标签页统计信息。统计信息页面将列出您的定期作业的每个实例的工作情况:

请注意,统计信息可能不会立即显示或刷新,因此您可能需要导航离开或刷新浏览器。请记住,您的作业按照设置的间隔运行,因此在设置定期或较长时间的日期或时间时,请记住这一点。
如果您更喜欢从命令行验证您的工作是否正常,您可以运行ls ~
命令来列出您的主目录文件。在本教程中,当编写pg_dump
命令时,您需要设置到主目录的确切位置,即在第4步:
- ls ~
输出将列出保存备份文件的每个实例。
第6步 — 修改、禁用、删除和手动执行pgAgent作业(可选)
pgAgent在修改或禁用作业时提供了灵活性。使用pgAdmin,您可以导航到特定的pgAgent作业,本例中为sammy_backup。然后右键单击并从列表中选择属性选项。在这里,您可以点击顶部的铅笔图标对作业进行修改:

如果您在属性中并点击铅笔图标,则可以导航到计划选项卡以禁用作业,如下所示:
此外,从左侧的树形控件中,如果你右键单击pgAgent作业,你可以选择删除/丢弃选项来完全删除该作业。如果你想手动执行作业,你可以重复相同的步骤,但这次从列表中选择立即运行选项:

虽然这只是使用pgAgent调度作业的一些功能,但还有许多其他可能性。例如,你可能想要安排一个作业,为你的数据库中的所有用户和角色创建一个备份,具体使用pg_dumpall --globals only
命令。你甚至可以使用更复杂的脚本与批处理作业,你可以从PostgreSQL wiki页面了解更多相关信息。
结论
pgAgent对于安排各种可能有助于减少一些更乏味但必要的日常任务的作业非常有用,例如持续备份你的数据库。一旦你更熟悉使用这个工具,你甚至可以尝试创建一个多步骤作业或需要复杂调度的SQL任务。如果你想了解更多,你可以阅读pgAdmin网站上的官方pgAgent文档。