如何使用pgAdmin中的pgAgent调度自动备份PostgreSQL
介绍
pgAgent是一种用于为PostgreSQL数据库安排任务的工具。与经常使用的cron相比,它具有更强大的调度功能,因为它专门用于处理Postgres任务。例如,pgAgent可以在没有批处理脚本或重复命令的情况下安排多个步骤。需要注意的是,即使已安装了pgAdmin,pgAgent也必须作为pgAdmin的扩展独立下载。
在这个教程中,你将安装pgAgent,配置你的数据库在pgAdmin图形用户界面(GUI)上使用pgAgent,设置pgAgent作为守护进程,然后使用pgAgent安排一个工作来备份你的数据库。
先决条件
要按照这个教程操作,你需要以下材料:
- An Ubuntu 22.04 server set up with a non-root sudo enabled user and firewall. You can do this by reading our Initial Server Setup guide
- PostgreSQL installed on your server. You can set this up by following our guide on How To Install and Use PostgreSQL on Ubuntu 22.04. As you follow this guide, be sure to create a new role and database, as you will need both to connect pgAdmin to your PostgreSQL instance
- pgAdmin installed with an account set up. You can do this by following our tutorial on How To Install and Configure pgAdmin4 in Server Mode on Ubuntu 22.04
步骤1 – 安装pgAgent
如前所述,安装pgAdmin时并不会自动配置pgAgent。您可以通过在终端中运行apt install和包名pgagent来安装pgAgent,命令如下:
- sudo apt install pgagent
在安装完pgAgent之后,继续进行下一步,即在pgAdmin中配置您的数据库以使用pgAgent。
第二步 — 配置 pgAgent 数据库
在完成先决条件后,pgAdmin已经安装好并可以使用。您可以通过pgAdmin配置数据库以供pgAgent使用。打开您的网络浏览器,导航至pgAdmin应用程序的网址为http://your_domain。一旦登录到您的帐户,导航至左侧面板上的树形控件。找到您创建的名为sammy的数据库并展开列表。在该列表中,会有一个名为“Extensions”的选项。一旦找到它,请右键点击并选择“查询工具”选项。
在使用pgAdmin之前,pgAgent需要加载一个扩展程序到您的数据库中。为此,请编写以下查询,并单击表示执行的侧箭头▶以运行该命令。
- CREATE EXTENSION pgagent;
在以下示例中,使用查询工具功能完成了这一步骤。
在“消息”选项卡下,会返回一个输出,显示查询在300毫秒内成功返回。这证实了pgAgent扩展已成功创建。
Note
输出错误:语言”plpgsql”不存在
提示:使用CREATE EXTENSION命令将语言加载到数据库中。
SQL状态:42704
如果发生这种情况,您需要运行CREATE LANGUAGE命令来安装所需的pl/pgsql过程语言。您可以通过运行以下命令来安装它:
CREATE LANGUAGE plpgsql;
安装完pl/pgsql语言后,底部将显示类似“查询成功返回231毫秒”的消息。之后,再次运行先前的CREATE EXTENSION pgagent查询。
运行这些查询后,在扩展项下,将列出两个关于pgagent和plpgsql的项目。
左侧树控件中出现了一个名为pgAgent Jobs的新项目,表示已成功在您的pgAdmin帐户上安装了pgAgent。接下来,您将设置pgAgent作为守护进程,以便可以成功运行您的作业。
Note
步骤三 – 将pgAgent设置为守护程序
现在您已经通过pgAdmin为您的数据库安装和配置了pgAgent,接下来您需要在服务器上将pgAgent设置为守护程序。守护程序是在后台作为连续进程运行并执行服务任务的程序。在Unix系统上,pgAgent作为守护程序运行,并且通常在数据库服务器本身上运行。
为了将pgAgent设置为守护进程,您需要一个PostgreSQL连接字符串,以便在调度作业时,进程能够适当地执行。在本例中,您正在设置一个PostgreSQL libpq连接字符串,即一个用户特定的字符串,连接到您设置的特定参数。您可以在PostgreSQL文档中了解更多关于PostgreSQL libpq连接函数的信息。
您的连接字符串将提供主机名、数据库名称和用户名的凭据。在我们的示例中,主机将使用Unix域套接字,数据库名称为sammy,用户为sammy。此字符串将附加到pgagent命令中,以启动守护程序。在您的终端中,您将运行以下代码:
- pgagent host=/var/run/postgresql dbname=sammy user=sammy
如果你的输出没有返回任何东西,也没有收到连接错误消息,那么连接字符串设置成功。
在创建了连接字符串之后,您可以准备使用pgAgent调度作业。
第四步 – 使用pgAgent安排工作
pgAgent作为一个调度代理,可以运行和管理任务,并且可以创建一个或多个步骤或计划。例如,一个步骤可以由多个SQL语句或Shell脚本组成,并在其他步骤之后连续执行。总的来说,您可以使用pgAgent来安排、管理、修改或禁用您的任务。
为了这个教程的目的,你将使用pgAgent来创建一个作业,每天每分钟备份你的sammy数据库。你可以通过右键单击pgAgent Jobs并选择Create,然后再选择pgAgent Job…来开始操作。
一旦你这样做,将会出现一个名为“创建-pgAgent作业”的提示窗口,然后你可以开始填写“常规”标签中所需的信息。在此示例中,我们将使用名称为sammy_backup,并且不指定主机代理,因为我们希望能够在任何主机上运行此作业。此外,我们将保持作业类别为常规维护。如果你想添加其他评论,请在评论部分随意添加。
接下来,导航到“步骤”选项卡。点击右上角的+符号以创建一个步骤。在这个例子中,我们将把这个步骤命名为“步骤1”。然后,点击垃圾桶图标左侧的铅笔符号,以扩展您的选项。默认情况下,“启用?”按钮为开启状态,表示此步骤将在执行此作业时包括在内。
在“种类”选项中,您可以选择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
Note
一旦添加了备份命令,您可以导航到标记为“计划”的选项卡。类似于设置步骤时,点击“+”符号以添加计划,然后提供您喜欢的名称,并点击垃圾桶图标旁边的铅笔图标来扩展选项。在“常规”选项卡下,将显示您所写的名称,例如schedule1。再次说明,对于“启用”选项,默认设置为打开开关以确保计划得以正确执行。对于“开始”和“结束”选项,请指定您计划工作的开始和结束日期和时间。由于您将测试计划工作,请确保当前时间在开始和结束范围内。如果您愿意,可以在备注中添加说明。
现在转到“重复”选项卡。在这里,您可以自定义计划作业的执行频率。您可以尽可能具体地选择周、月、日期、小时或分钟。请注意,如果您不进行选择,那么这与选择“全部选择”是相同的。因此,如果您不填写“工作日”,您的计划将考虑所有工作日。同样地,对于时间,您可以不填写小时或分钟,这与选择“全部选择”是相同的。请记住,时间是按照cron格式显示的,因此对于此示例,要每分钟生成一次备份,您必须选择一个小时内的每一分钟(00到59)。为了演示这一点,我们选择了分钟的“全部选择”。所有分钟都会列出,但不填写也会得到相同的结果。
如果有某些日期或时间你不想执行某项工作,你可以创建一个更详细的时间表,或者你可以通过导航到“异常”选项卡来设置。
Note
当你完成设置和自定义要执行的计划后,点击保存按钮。在左侧的树形控件中将出现一个新的pgAgent工作,其名称为您的工作。在这个例子中,sammy_backup将显示在其下方列出的计划和步骤中。
现在您已经成功创建了一个pgAgent任务,下一步,您将学习如何验证您的pgAgent任务是否成功运行。
第五步-验证您的pgAgent作业
您可以通过几种方式来检查每分钟创建数据库备份的定时任务是否正常运行。在pgAdmin中,您可以导航到左侧的树形控件,然后点击sammy_backup。从那里,继续到标记为“统计信息”的选项卡。统计信息页面将列出每个定时任务的运行情况,如下所示:
请注意,统计数据可能不会立即显示或刷新,因此您可能需要切换页面或刷新浏览器。请记住,您的任务安排在一个固定的时间间隔内运行,所以如果您设置了定期或较长时间的日期或时间,请谨记这一点。
如果你更喜欢通过命令行验证你的工作是否正常运行,你可以运行ls ~命令来列出你的主目录文件。在本教程中,在第4步设置pg_dump命令时,你需要确切指定这个主目录的位置。
- ls ~
输出将会列出每个备份文件保存的实例。
第六步 – 修改、禁用、删除和手动执行pgAgent作业(可选)
使用pgAdmin,您可以浏览到特定的pgAgent作业(在此示例中为sammy_backup)。然后,右键单击并从列表中选择“属性”选项。从这里,您可以点击顶部的铅笔图标来修改您的作业。
如果你在“属性”页面上点击铅笔图标,你可以切换到“计划”选项卡来禁用你的工作,如下所示:
此外,从左侧的树形控件中,如果在pgAgent作业上右键单击,您可以选择DELETE/DROP选项来完全删除该作业。如果您想手动执行作业,可以重复相同的步骤,但这次从列表中选择RUN NOW选项。
尽管这里只提到了一些使用pgAgent进行作业调度的功能,但还有很多其他可能性。例如,您可能想要安排一个创建数据库中所有用户和角色备份的作业,具体使用的命令是pg_dumpall –globals only。您甚至可以使用更复杂的脚本与批处理作业,您可以从PostgreSQL维基页面上了解更多相关信息。
结论
pgAgent对于安排各种工作非常有用,可以帮助减少一些乏味但必要的日常任务,比如持续备份数据库。一旦您更熟悉使用这个工具,甚至可以尝试创建多步骤任务或需要复杂安排的SQL任务。如果您想要了解更多信息,可以在pgAdmin网站上阅读官方的pgAgent文档。