如何使用 pgAdmin 中的 pgAgent 安排 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

Select the Query Tool from the Extensions drop-down list

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

  1. CREATE EXTENSION pgagent;

使用Query Tool功能的此步骤如下示例所示:

Run the CREATE EXTENSION command

消息选项卡下,将返回一个输出,显示查询在300毫秒内成功返回。这确认了pgAgent扩展已成功创建。

注意:如果您的数据库未加载适当的plpgsql语言,您将收到以下错误消息:

Output
ERROR: language "plpgsql" does not exist HINT: Use CREATE EXTENSION to load the language into the database. SQL state: 42704

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

  1. CREATE LANGUAGE plpgsql;

一旦安裝了 pl/pgsql 語言,底部將會顯示一條訊息,類似於 查詢在 231 毫秒內成功返回。之後,再次運行上一個 CREATE EXTENSION pgagent 查詢。

當您運行完這些查詢後,在 擴展 下將列出兩個項目:pgagentplpgsql:

pgAgent and plpgsql language listed

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指令上以啟動守護程序。在您的終端機上,您將運行以下代碼:

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

如果您的輸出中沒有返回任何內容且您沒有收到連線錯誤訊息,則連線字串設置成功。

在您建立了連線字串之後,您就準備好了使用 pgAgent 安排作業。

步驟 4 — 使用 pgAgent 安排作業

pgAgent 充當排程代理,能夠運行和管理作業,並可以創建一個或多個步驟或排程的作業。例如,一個步驟可能包含幾個 SQL 語句或一個 shell 腳本,並且在彼此之後連續執行。總的來說,您可以使用 pgAgent 來排程、管理、修改或禁用您的作業。

為了本教程的目的,您將使用 pgAgent 創建一個作業,該作業將在每周的每一天每分鐘備份您的sammy資料庫。您可以開始於右鍵點擊pgAgent 作業並選擇創建然後pgAgent 作業…如下:

Create your pgAgent Job

一旦完成此操作,將會出現一個名為 創建 – pgAgent 作業 的提示,您可以開始填寫 常規 標籤中所需的信息。在此示例中,我們將使用名稱 sammy_backup,並且不會指定 主機代理,因為我們希望能夠在任何主機上運行此作業。此外,我們將把 作業類別 保留為 例行維護。如果您想要包含其他任何評論,請隨意在 評論 部分添加:

Prompt for creating your pgAgent job

接下來,轉到 步驟 標籤。點擊右上角的 + 符號來創建一個步驟。在此示例中,我們將此步驟命名為 step1。然後,為了擴展您的選項,點擊垃圾桶圖標左側的鉛筆。 已啟用? 按鈕默認為打開狀態,表示當執行此作業時將包括此步驟。

對於類型選項,您可以選擇SQL批次,在這裡我們選擇了批次。您在這個例子中想要選擇批次的原因是因為這將運行您設定的適當的PostgreSQL命令,以安排您想要為數據庫安排的備份。 SQL選項用於安排執行原始SQL的作業。在這種情況下,我們已經選擇了本地作為連接類型,以便在本地伺服器上執行步驟,但如果您希望,您也可以選擇遠程以選擇您選擇的遠程主機。如果您希望在遠程主機上進行操作,您需要在連接字符串字段中指定該標準。如果您遵循了步驟1,則您的連接字符串已經設置並連接。

對於數據庫字段,請確保您已選擇正確的數據庫,在這裡我們指定了sammy。使用錯誤時選項,您可以自定義pgAgent的響應,如果執行步驟時出現錯誤。在這種情況下,我們已經選擇了失敗以通知我們如果有步驟嘗試被處理時出現錯誤。同樣,如果您想添加額外的註釋,您可以在註釋框中添加它們:

Create a step for your pgAgent job

在同一個步驟標籤中,還有一個程式碼標籤。如果您像我們在這個示例中所做的那樣選擇了批次,那麼請導航到該程式碼標籤。一旦進入此標籤,您將看到一個空行,供您插入您的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
Add command in Code tab for pgAgent step

注意:如果您選擇將備份文件保存到不同的位置,請確保使用絕對路徑到您選擇的目錄。例如,雖然~/通常指向/home/sammy/的主目錄,但在這種情況下,pg_dump需要/home/sammy/的絕對路徑。

一旦添加了備份指令,您可以轉到標籤為 計畫 的選項卡。類似於設置 步驟 時,點擊 + 符號以添加計畫,然後提供您首選的名稱,並點擊垃圾桶圖標旁邊的鉛筆圖標以展開您的選項。在 一般 選項卡下,將會有您編寫的 名稱,在這個例子中,它是 schedule1。同樣,對於 啟用,這預設為打開開關,以確保計畫得以正確執行。對於 開始結束 選項,請指定預定工作的開始和結束日期和時間。由於您將測試預定工作,請確保當前時間在 開始結束 的範圍內。如果您希望,可以在 註釋 中添加備註:

pgAgent Schedule options

現在繼續前往重複選項卡。在這裡,您可以自定義此計劃工作的執行頻率。您可以盡可能具體地選擇週、月、日期、小時或分鐘。請注意,如果您不進行選擇,這與選擇全部選擇相同。因此,如果您將工作日留空,則您的計劃將考慮所有工作日。同樣,對於時間,您可以將小時或分鐘留空,這與全部選擇相同。請記住,時間是以 cron 格式表示的,因此對於此示例,要每分鐘生成一次備份,您必須在一小時內選擇每分鐘(00到59)。為了演示這一點,我們已經選擇了全部選擇的分鐘。所有分鐘都被列出,但將其留空也會產生相同的結果:

Customize dates and times for job schedule on Repeat tab

如果有您不希望執行工作的日子或時間,您可以創建更細粒度的時間表,或者您可以通過轉到異常選項卡進行設置。

注意:根據計劃執行工作,因此任何時候都會更改,計劃的運行時間將重新計算。當發生這種情況時,pgAgent 將輪詢數據庫以獲取過去的計劃運行時間值,然後通常將在指定的開始時間後一分鐘內開始。如果有問題,那麼當 pgAgent 再次啟動時,它將返回您設置的常規計劃。

當您完成設置和定制要執行的計劃後,按下儲存按鈕。一個新的pgAgent任務將出現在左側的樹狀控制項上,帶有您的任務名稱。例如,sammy_backup顯示為帶有計劃步驟列在其下:

Your pgAgent backup job step and schedule will now be listed

現在您已成功創建了一個pgAgent任務,在下一步中,您將了解如何驗證您的pgAgent任務是否成功運行。

步驟5 — 驗證您的pgAgent任務

您可以以幾種方式檢查您定期每分鐘創建數據庫備份文件的計劃任務是否正常運行。在pgAdmin中,您可以導航到左側的樹狀控制項,然後點擊sammy_backup。從那裡,轉到標籤上標有統計的選項卡。統計頁面將列出計劃任務的每個實例,如下所示:

Verify if your job is working with pgAgent’s Statistics tab

請注意,統計數據可能不會立即顯示或刷新,因此您可能需要切換到其他地方或刷新瀏覽器。請記住,您的任務被安排在一個固定的間隔運行,因此如果您設置的日期或時間是定期的或較長的,請謹記此事。

如果您喜歡從命令行驗證您的工作是否正常,您可以運行ls ~命令列出您的主目錄文件。在本教程中,當您編寫pg_dump命令時,您將確定將精確位置設置為此主目錄:第4步

  1. ls ~

輸出將列出保存備份文件的每個實例。

第6步 — 修改、禁用、刪除和手動執行 pgAgent 作業(可選)

pgAgent 在修改或禁用作業時提供了靈活性。使用 pgAdmin,您可以導航到特定的 pgAgent 作業,在這種情況下為sammy_backup。然後右鍵單擊並從列表中選擇屬性選項。從這裡,您可以按頂部的鉛筆圖標進行對作業的修改:

pgAgent Properties options such as modifying your job

如果您在屬性中並按鉛筆圖標,您可以導航到計劃選項卡來禁用您的作業,如下所示:

You can disable your pgAgent job in the Properties tab

此外,從左側的樹狀控制中,如果右鍵單擊pgAgent作業,您可以選擇刪除/丟棄選項來完全刪除該作業。如果您想手動執行作業,您可以重複相同步驟,但這次從列表中選擇立即執行選項:

You can also choose to delete or manually run your job from the drop-down list

儘管這些僅是使用pgAgent安排作業的一些功能,但還有許多其他可能性。例如,您可能想安排一個創建數據庫中所有用戶和角色備份的作業,特別是使用pg_dumpall --globals only命令。您甚至可以使用更複雜的腳本進行批次作業,您可以從PostgreSQL wiki頁面了解更多信息。

結論

pgAgent可用於安排各種作業,這些作業可能有助於減少一些您更單調但必要的日常任務,例如持續備份數據庫。一旦您更加熟悉使用這個工具,您甚至可以嘗試創建多步作業或需要複雜調度的SQL任務。如果您想了解更多,您可以閱讀pgAdmin網站上的官方pgAgent文檔

Source:
https://www.digitalocean.com/community/tutorials/how-to-schedule-automatic-backups-for-postgresql-with-pgagent-in-pgadmin