pgAgent与pgAdmin:自动化PostgreSQL数据库备份教程

介绍

pgAgent 是一种用于为 PostgreSQL 数据库安排任务的工具。与常用的 cron 相比,它具有更强大的调度功能,因为它专门用于处理 Postgres 任务。例如,pgAgent 可以在没有批处理脚本或重复命令的情况下安排多个步骤。需要注意的是,即使已安装了 pgAdmin,pgAgent 也必须作为 pgAdmin 的扩展独立下载。

在本教程中,你将安装 pgAgent,配置你的数据库在 pgAdmin 图形用户界面 (GUI) 上使用 pgAgent,设置 pgAgent 作为守护进程,然后使用 pgAgent 安排一个作业来备份你的数据库。

先决条件

要按照本教程操作,你需要以下材料:

步骤 1 – 安装 pgAgent

如前所述,安装 pgAdmin 时并不会自动配置 pgAgent。你可以通过在终端中运行 apt install 和包名 pgagent 来安装 pgAgent,命令如下:

  1. sudo apt install pgagent

 

在安装完 pgAgent 之后,继续进行下一步,即在 pgAdmin 中配置你的数据库以使用 pgAgent。

步骤 2 – 配置 pgAgent 数据库

在完成先决条件后,pgAdmin 已经安装好并可以使用。你可以通过 pgAdmin 配置数据库以供 pgAgent 使用。打开你的网络浏览器,导航至 pgAdmin 应用程序的网址,例如 http://your_domain。一旦登录到你的账户,导航至左侧面板上的树形控件。找到你创建的名为 sammy 的数据库并展开列表。在该列表中,会有一个名为“Extensions”(扩展)的选项。一旦找到它,请右键点击并选择“Query Tool”(查询工具)选项。

从扩展中选择查询工具选项

在使用 pgAdmin 之前,pgAgent 需要加载一个扩展程序到你的数据库中。为此,请编写以下查询,并单击表示执行的侧箭头 ▶ 以运行该命令。

  1. CREATE EXTENSION pgagent;

 

在以下示例中,使用查询工具功能完成了这一步骤。

查询工具中的 CREATE EXTENSION 命令

在“Messages”(消息)选项卡下,会返回一个输出,显示查询在 300 毫秒内成功返回。这证实了 pgAgent 扩展已成功创建。

注意:如果你的数据库中未加载合适的 plpgsql 语言,你将收到以下错误信息:

输出错误:语言”plpgsql”不存在

提示:使用 CREATE EXTENSION 命令将语言加载到数据库中。

SQL 状态:42704

如果发生这种情况,你需要运行 CREATE LANGUAGE 命令来安装所需的 pl/pgsql 过程语言。你可以通过运行以下命令来安装它:

CREATE LANGUAGE plpgsql;

安装完 pl/pgsql 语言后,底部将显示类似“查询成功返回 231 毫秒”的消息。之后,再次运行先前的 CREATE EXTENSION pgagent 查询。运行这些查询后,在扩展项下,将列出两个关于 pgagent 和 plpgsql 的项目。

列出的 pgAgent 扩展

左侧树控件中出现了一个名为“pgAgent Jobs”(pgAgent 作业)的新项目,表示已成功在你的 pgAdmin 账户上安装了 pgAgent。接下来,你将设置 pgAgent 作为守护进程,以便可以成功运行你的作业。

注意:如果这些项目不能立即出现在你面前,请刷新浏览器页面,如果你的查询成功,它们应该会出现。

步骤 3 – 将 pgAgent 设置为守护程序

现在你已经通过 pgAdmin 为你的数据库安装和配置了 pgAgent,接下来你需要在服务器上将 pgAgent 设置为守护程序。守护程序是在后台作为连续进程运行并执行服务任务的程序。在 Unix 系统上,pgAgent 作为守护程序运行,并且通常在数据库服务器本身上运行。

为了将 pgAgent 设置为守护进程,你需要一个 PostgreSQL 连接字符串,以便在调度作业时,进程能够适当地执行。在本例中,你正在设置一个 PostgreSQL libpq 连接字符串,即一个用户特定的字符串,连接到你设置的特定参数。你可以在 PostgreSQL 文档中了解更多关于 PostgreSQL libpq 连接函数的信息。

你的连接字符串将提供主机名、数据库名称和用户名的凭据。在我们的示例中,主机将使用 Unix 域套接字,数据库名称为 sammy,用户为 sammy。此字符串将附加到 pgagent 命令中,以启动守护程序。在你的终端中,你将运行以下代码:

  1. pgagent host=/var/run/postgresql dbname=sammy user=sammy

 

如果你的输出没有返回任何东西,也没有收到连接错误消息,那么连接字符串设置成功。

在创建了连接字符串之后,你可以准备使用 pgAgent 调度作业。

步骤 4 – 使用 pgAgent 安排作业

pgAgent 作为一个调度代理,可以运行和管理任务,并且可以创建一个或多个步骤或计划。例如,一个步骤可以由多个 SQL 语句或 Shell 脚本组成,并在其他步骤之后连续执行。总的来说,你可以使用 pgAgent 来安排、管理、修改或禁用你的任务。

为了本教程的目的,你将使用 pgAgent 来创建一个作业,每天每分钟备份你的 sammy 数据库。你可以通过右键单击“pgAgent Jobs”并选择“Create”,然后再选择“pgAgent Job…”来开始操作。

pgAgent 作业选择

一旦你这样做,将会出现一个名为“Create – pgAgent Job”(创建 – pgAgent 作业)的提示窗口,然后你可以开始填写“General”(常规)标签中所需的信息。在此示例中,我们将使用名称为 sammy_backup,并且不指定主机代理,因为我们希望能够在任何主机上运行此作业。此外,我们将保持作业类别为常规维护。如果你想添加其他评论,请在评论部分随意添加。

创建 pgAgent 作业提示

接下来,导航到“步骤”选项卡。点击右上角的“+”符号以创建一个步骤。在此示例中,我们将此步骤命名为“步骤1”。然后,点击垃圾桶图标左侧的铅笔符号,以展开您的选项。默认情况下,“启用?”按钮为开启状态,表示此步骤将在执行此作业时包含在内。

在“种类”选项中,您可以选择SQL或批处理,在这里我们选择了批处理。选择批处理是因为它可以运行您为数据库备份计划设置的适当的PostgreSQL命令。SQL选项可用于调度执行原始SQL的作业。在本例中,我们选择了本地连接类型,以便在本地服务器上执行该步骤,但如果您愿意,也可以选择远程连接,并选择您想要的远程主机。如果您选择在远程主机上执行,您需要在连接字符串字段中指定此条件。如果您按照步骤1进行操作,那么您的连接字符串已经设置并连接成功。

对于数据库字段,请确保选择了正确的数据库,这里我们指定为“sammy”。通过错误选项,您可以自定义pgAgent在执行步骤时出现错误时的响应。在这种情况下,我们选择“故障通知”,以便在步骤处理时出现错误时通知我们。同样,如果您想添加其他注释,可以在评论框中添加。

pgAgent job Steps option在相同的“步骤”标签中,还有一个“代码”标签。如果您像我们在这个例子中选择了“批处理”,那么就跳转到那个“代码”标签。一旦进入这个标签,您会看到一个空行供您输入您的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
pgAgent Steps code

注意:如果您选择将备份文件保存到不同的位置,请确保使用绝对路径指定您选择的目录。例如,尽管~/通常指向/home/sammy/的主目录,但在这种情况下,pg_dump需要使用绝对路径/home/sammy/。一旦添加了备份命令,您可以导航到标记为“计划”的选项卡。类似于设置步骤时,点击“+”符号以添加计划,然后提供您喜欢的名称,并点击垃圾桶图标旁边的铅笔图标来展开选项。在“常规”选项卡下,将显示您所写的名称,例如“schedule1”。再次说明,对于“启用”选项,默认设置为打开开关以确保计划得以正确执行。对于“开始”和“结束”选项,请指定您计划工作的开始和结束日期和时间。由于您将测试计划工作,请确保当前时间在开始和结束范围内。如果您愿意,可以在备注中添加说明。

pgAgent Schedule tab现在转到“重复”选项卡。在这里,您可以自定义计划作业的执行频率。您可以尽可能具体地选择周、月、日期、小时或分钟。请注意,如果您不进行选择,那么这与选择“全部选择”是相同的。因此,如果您不填写“工作日”,您的计划将考虑所有工作日。同样地,对于时间,您可以不填写小时或分钟,这与选择“全部选择”是相同的。请记住,时间是按照cron格式显示的,因此对于此示例,要每分钟生成一次备份,您必须选择一个小时内的每一分钟(00到59)。为了演示这一点,我们选择了分钟的“全部选择”。所有分钟都会列出,但不填写也会得到相同的结果。

pgAgent Schedule Repeat tab如果有某些日期或时间您不想执行某项工作,您可以创建一个更详细的时间表,或者您可以通过导航到“异常”选项卡来设置。

注意:工作也是根据时间表执行的,因此只要时间表发生变化,就会重新计算预定运行时间。当发生这种情况时,pgAgent将轮询数据库,以获取过去的预定运行时间值,并从那里开始,通常会在指定的开始时间前一分钟内启动。如果存在问题,则当pgAgent再次启动时,它将返回您设置的常规时间表。当您完成设置和自定义要执行的计划后,点击保存按钮。在左侧的树形控件中将出现一个新的pgAgent工作,其名称为您的工作。在这个例子中,“sammy_backup”将显示在其下方列出的计划和步骤中。

pgAgent backup job listed现在您已经成功创建了一个pgAgent任务,下一步,您将学习如何验证您的pgAgent任务是否成功运行。

第五步 – 验证您的pgAgent作业

您可以通过几种方式来检查每分钟创建数据库备份的定时任务是否正常运行。在pgAdmin中,您可以导航到左侧的树形控件,然后点击“sammy_backup”。从那里,继续到标记为“统计信息”的选项卡。统计信息页面将列出每个定时任务的运行情况,如下所示:

pgAgent job Statistics tab请注意,统计数据可能不会立即显示或刷新,因此您可能需要切换页面或刷新浏览器。请记住,您的任务安排在一个固定的时间间隔内运行,所以如果您设置了定期或较长时间的日期或时间,请谨记这一点。

如果您更喜欢通过命令行验证您的工作是否正常运行,您可以运行ls ~命令来列出您的主目录文件。在本教程中,在第4步设置pg_dump命令时,您需要确切指定这个主目录的位置。

  1. ls ~

 

输出将会列出每个备份文件保存的实例。

第六步 – 修改、禁用、删除和手动执行pgAgent作业(可选)

使用pgAdmin,您可以浏览到特定的pgAgent作业(在此示例中为“sammy_backup”)。然后,右键单击并从列表中选择“属性”选项。从这里,您可以点击顶部的铅笔图标来修改您的作业。

pgAgent Properties option如果您在“属性”页面上点击铅笔图标,您可以切换到“计划”选项卡来禁用您的工作,如下所示:

pgAgent disabling a job此外,从左侧的树形控件中,如果在pgAgent作业上右键单击,您可以选择“删除/丢弃”选项来完全删除该作业。如果您想手动执行作业,可以重复相同的步骤,但这次从列表中选择“立即运行”选项。

Other pgAgent options尽管这里只提到了一些使用pgAgent进行作业调度的功能,但还有很多其他可能性。例如,您可能想要安排一个创建数据库中所有用户和角色备份的作业,具体使用的命令是pg_dumpall --globals-only。您甚至可以使用更复杂的脚本与批处理作业,您可以从PostgreSQL维基页面上了解更多相关信息。

结论

pgAgent对于安排各种工作非常有用,可以帮助减少一些乏味但必要的日常任务,比如持续备份数据库。一旦您更熟悉使用这个工具,甚至可以尝试创建多步骤任务或需要复杂安排的SQL任务。如果您想要了解更多信息,可以在pgAdmin网站上阅读官方的pgAgent文档。

bannerAds