آنچه در این مقاله میخوانید
- پیشنیازها
- مرحلهی اول: نصب pgAgent
- مرحلهی دوم: پیکربندی پایگاهداده برای استفاده از pgAgent
- مرحله سوم: راهاندازی pgAgent بهعنوان سرویس پسزمینه (Daemon)
- مرحله چهارم: زمانبندی یک وظیفه با pgAgent
- مرحله پنجم: بررسی اجرای وظیفه pgAgent
- مرحله ششم: ویرایش، غیرفعالسازی، حذف و اجرای دستی وظایف pgAgent
- جمع بندی
نحوه زمانبندی پشتیبان گیری خودکار برای PostgreSQL با pgAgent در pgAdmin
۲۵ دی ۱۴۰۴
pgAgent ابزاری برای زمانبندی اجرای وظایف (Job) در پایگاههای داده PostgreSQL است. این ابزار، در مقایسه با روش متداول و پرکاربردی مانند cron، قابلیتهای پیشرفتهتری برای زمانبندی ارائه میدهد؛ چرا که بهطور اختصاصی برای مدیریت و اجرای وظایف مرتبط با PostgreSQL طراحی شده است.
برای مثال، pgAgent این امکان را فراهم میکند که چندین مرحله (Step) مختلف را بدون نیاز به استفاده از اسکریپتهای دستهای (Batch Script) یا تکرار دستورات مشابه، در قالب یک وظیفه زمانبندیشده اجرا کنید.
نکته مهم این است که حتی اگر pgAdmin روی سیستم شما نصب شده باشد، pgAgent بهصورت پیشفرض نصب نمیشود و باید بهطور جداگانه، بهعنوان یک افزونه مرتبط با pgAdmin، دریافت و نصب گردد.
در این آموزش از بلاگ تخصصی لیارا، ابتدا pgAgent را نصب میکنید، سپس پایگاه داده خود را برای استفاده از pgAgent در رابط گرافیکی pgAdmin پیکربندی میکنید، pgAgent را بهصورت یک سرویس پسزمینه (Daemon) راهاندازی کرده و در نهایت با استفاده از pgAgent، یک وظیفه زمانبندیشده برای پشتیبانگیری از پایگاه داده ایجاد خواهید کرد.

آنچه در ادامه خواهید خواند:
- پیشنیازها
- مرحلهی اول: نصب pgAgent
- مرحلهی دوم: پیکربندی پایگاهداده برای استفاده از pgAgent
- مرحله سوم: راهاندازی pgAgent بهعنوان سرویس پسزمینه (Daemon)
- مرحله چهارم: زمانبندی یک وظیفه با pgAgent
- مرحله پنجم: بررسی اجرای وظیفه pgAgent
- مرحله ششم: ویرایش، غیرفعالسازی، حذف و اجرای دستی وظایف pgAgent
- جمع بندی
پیشنیازها
برای دنبال کردن این آموزش، به موارد زیر نیاز دارید:
- یک سرور Ubuntu 22.04 که با یک کاربر غیر روت(non-root) دارای دسترسی sudo و دیواره آتش (Firewall) پیکربندی شده باشد. برای انجام این کار میتوانید از راهنمای Initial Server Setup استفاده کنید.
- نصب PostgreSQL روی سرور. این کار را میتوانید با استفاده از راهنمای How To Install and Use PostgreSQL on Ubuntu 22.04 انجام دهید. در حین دنبال کردن این راهنما، حتماً یک نقش (Role) و یک پایگاه داده جدید ایجاد کنید، زیرا برای اتصال pgAdmin به نمونه PostgreSQL به هر دوی آنها نیاز خواهید داشت.
- نصب pgAdmin و ایجاد یک حساب کاربری. برای این منظور میتوانید از آموزش How To Install and Configure pgAdmin4 in Server Mode on Ubuntu 22.04 استفاده کنید.
مرحلهی اول: نصب pgAgent
همانطور که پیشتر گفته شد، ابزار pgAgent بهصورت خودکار همراه با pgAdmin نصب نمیشود و باید آن را جداگانه روی سیستم خود نصب کنید.
برای این کار کافی است در ترمینال دستور زیر را اجرا کنید:
sudo apt install pgagent
با اجرای این دستور، بستهی pgAgent از مخازن رسمی اوبونتو دانلود و نصب میشود.
پس از پایان نصب، ابزار آمادهی پیکربندی است و در مراحل بعد، آن را به PostgreSQL متصل میکنیم تا بتوانید از طریق pgAdmin وظایف خود را زمانبندی کنید.
مرحلهی دوم: پیکربندی پایگاهداده برای استفاده از pgAgent
در این مرحله، فرض بر این است که شما مراحل مقدماتی نصب PostgreSQL و pgAdmin را انجام دادهاید و حالا همهچیز برای استفاده از pgAgent آماده است.
ابتدا مرورگر خود را باز کرده و به رابط وب pgAdmin بروید (برای مثال: http://your_domain).
بعد از ورود به حساب کاربریتان، از بخش پنل سمت چپ (Tree Control)، پایگاهدادهای را که قبلاً ایجاد کردهاید (در این مثال نام آن sammy است) پیدا کنید و روی آن کلیک کنید تا گزینههای زیرمجموعهاش نمایش داده شوند.
در میان گزینهها، بخشی با نام Extensions وجود دارد. روی آن راستکلیک کنید و گزینهی Query Tool را انتخاب کنید تا بتوانید دستورات SQL مربوط به فعالسازی pgAgent را در آن وارد کنید.

برای آنکه pgAgent بتواند در محیط pgAdmin مورد استفاده قرار گیرد، لازم است افزونه مربوطه ابتدا در پایگاه داده بارگذاری شود. برای انجام این کار، دستور زیر را در ابزار Query Tool وارد کرده و سپس با کلیک روی آیکن فلش ▶ (که نشاندهنده اجرای دستور است)، فرمان را اجرا کنید:
CREATE EXTENSION pgagent;
این مرحله که با استفاده از قابلیت Query Tool انجام میشود، در مثال زیر نمایش داده شده است:

در تب Messages، خروجیای نمایش داده میشود که پیامی مشابه زیر را بازمیگرداند:
Query returned successfully in 300 msec
این پیام نشان میدهد که افزونه pgAgent با موفقیت در پایگاه داده ایجاد شده است.
نکته:
در صورتی که زبان رویهای plpgsql در پایگاه داده شما بارگذاری نشده باشد، با خطای زیر مواجه خواهید شد:
ERROR: language "plpgsql" does not exist
HINT: Use CREATE EXTENSION to load the language into the database.
SQL state: 42704
در صورت بروز این خطا، لازم است زبان رویهای pl/pgsql که برای اجرای pgAgent مورد نیاز است، در پایگاه داده نصب شود. برای این منظور، دستور زیر را اجرا کنید:
CREATE LANGUAGE plpgsql;
پس از نصب زبان pl/pgsql، پیامی در بخش پایینی صفحه نمایش داده میشود که مشابه نمونه زیر است:
Query returned successfully in 231 msec
پس از مشاهده این پیام، دستور قبلی CREATE EXTENSION pgagent را مجدداً اجرا کنید.
پس از اجرای موفق این دستورات، در بخش Extensions، دو مورد مربوط به pgagent و plpgsql نمایش داده خواهند شد:

پس از انجام مراحل قبلی، یک گزینه جدید با عنوان pgAgent Jobs در پنل درختی (Tree Control) سمت چپ رابط کاربری ظاهر خواهد شد. این مورد نشاندهنده آن است که pgAgent با موفقیت روی حساب کاربری pgAdmin شما نصب شده است.
در ادامه، لازم است pgAgent را بهصورت یک سرویس پسزمینه (Daemon) پیکربندی کنید تا بتواند وظایف زمانبندیشده را بهدرستی اجرا کند.
نکته:
اگر این گزینهها بلافاصله برای شما نمایش داده نشدند، صفحه مرورگر را بازنشانی (Refresh) کنید. در صورتی که کوئریها با موفقیت اجرا شده باشند، این موارد پس از بازنشانی صفحه قابل مشاهده خواهند بود.
مرحله سوم: راهاندازی pgAgent بهعنوان سرویس پسزمینه (Daemon)
اکنون که pgAgent از طریق pgAdmin نصب و برای پایگاه داده پیکربندی شده است، در مرحله بعد باید آن را بهعنوان یک سرویس پسزمینه روی سرور خود راهاندازی کنید.
سرویس پسزمینه برنامهای است که بهصورت مداوم در پسزمینه اجرا میشود و وظایف سیستمی یا خدماتی را انجام میدهد. pgAgent در سیستمعاملهای مبتنی بر یونیکس بهصورت یک سرویس پسزمینه اجرا میشود و معمولاً روی خود سرور پایگاه داده فعال است.
برای راهاندازی pgAgent بهعنوان سرویس پسزمینه، به یک رشته اتصال PostgreSQL نیاز دارید تا هنگام زمانبندی وظایف، فرایند بهدرستی اجرا شود. در این مرحله، از یک رشته اتصال مبتنی بر libpq در PostgreSQL استفاده میشود؛ به این معنا که این رشته بهصورت اختصاصی برای یک کاربر تعریف شده و به پارامترهای مشخصی که تعیین میکنید متصل میشود.
اطلاعات بیشتر درباره توابع اتصال libpq را میتوانید در مستندات رسمی PostgreSQL مطالعه کنید.
رشته اتصال شامل اطلاعات احراز هویت مانند نام میزبان (Hostname)، نام پایگاه داده و نام کاربر است. در مثال حاضر، اتصال از طریق Unix Domain Socket انجام میشود، نام پایگاه داده sammy و نام کاربر نیز sammy است. این رشته به دستور اجرای pgAgent اضافه میشود تا سرویس پسزمینه راهاندازی گردد. در ترمینال، دستور زیر را اجرا کنید:
pgagent host=/var/run/postgresql dbname=sammy user=sammy
در صورتی که پس از اجرای این دستور هیچ خروجیای نمایش داده نشود و پیام خطای اتصال دریافت نکنید، به این معناست که پیکربندی رشته اتصال با موفقیت انجام شده است.
پس از ایجاد موفق رشته اتصال، میتوانید وارد مرحله زمانبندی وظایف با استفاده از pgAgent شوید.
مرحله چهارم: زمانبندی یک وظیفه با pgAgent
pgAgent بهعنوان یک عامل زمانبندی عمل میکند که قادر است وظایف مختلف را اجرا و مدیریت کند. این ابزار امکان ایجاد وظایفی شامل یک یا چند مرحله (Step) یا برنامه زمانبندی (Schedule) را فراهم میکند.
برای مثال، یک مرحله میتواند شامل چندین دستور SQL یا یک اسکریپت شِل باشد که بهصورت متوالی و پشتسرهم اجرا میشوند. بهطور کلی، با استفاده از pgAgent میتوانید وظایف خود را زمانبندی، مدیریت، ویرایش، یا غیرفعال کنید.
در این آموزش، از pgAgent برای ایجاد یک وظیفه استفاده میشود که پایگاه داده sammy را در هر دقیقه و در تمام روزهای هفته پشتیبانگیری میکند.
برای شروع، روی گزینه pgAgent Jobs کلیک راست کرده و سپس مسیر Create و بعد pgAgent Job… را انتخاب کنید، همانطور که در مثال زیر نمایش داده شده است:

پس از انجام این کار، پنجرهای با عنوان Create – pgAgent Job نمایش داده میشود و میتوانید تکمیل اطلاعات موردنیاز را از تب General آغاز کنید.
در این مثال، نام وظیفه را sammy_backup قرار میدهیم و گزینه Host agent را مشخص نمیکنیم، زیرا قصد داریم این وظیفه قابلیت اجرا روی هر میزبان را داشته باشد. همچنین مقدار Job class را روی Routine Maintenance باقی میگذاریم.
در صورت تمایل، میتوانید توضیحات یا یادداشتهای تکمیلی خود را در بخش Comment وارد کنید.

در مرحله بعد، به تب Steps بروید. برای ایجاد یک مرحله جدید، روی نماد + در گوشه بالا و سمت راست کلیک کنید. در این مثال، نام این مرحله را step1 قرار میدهیم. سپس برای مشاهده و ویرایش گزینههای بیشتر، روی آیکن مداد در سمت چپ نماد سطل زباله کلیک کنید.
گزینه Enabled? بهصورت پیشفرض فعال است و نشان میدهد که این مرحله هنگام اجرای این وظیفه در نظر گرفته خواهد شد.
در بخش Kind میتوانید یکی از دو گزینه SQL یا Batch را انتخاب کنید. در این مثال، گزینه Batch انتخاب شده است؛ زیرا این نوع مرحله امکان اجرای دستورات مناسب PostgreSQL را فراهم میکند که برای زمانبندی پشتیبانگیری از پایگاه داده مورد نیاز هستند. گزینه SQL برای زمانبندی وظایفی به کار میرود که نیاز به اجرای مستقیم دستورات خام SQL دارند.
در این مرحله، مقدار Connection type روی Local تنظیم شده است تا مرحله روی سرور محلی اجرا شود. با این حال، در صورت نیاز میتوانید گزینه Remote را برای اجرای مرحله روی یک میزبان راهدور انتخاب کنید. در صورت انتخاب میزبان راهدور، لازم است اطلاعات مربوطه را در فیلد Connection string مشخص کنید. اگر مرحله اول این آموزش را دنبال کرده باشید، رشته اتصال شما از قبل تنظیم و متصل شده است.
در بخش Database، اطمینان حاصل کنید که پایگاه داده صحیح انتخاب شده باشد؛ در این مثال، پایگاه داده sammy مشخص شده است.
با استفاده از گزینه On error میتوانید نحوه واکنش pgAgent در صورت بروز خطا هنگام اجرای مرحله را تعیین کنید. در این سناریو، گزینه Fail انتخاب شده است تا در صورت بروز خطا هنگام پردازش این مرحله، عملیات با شکست مواجه شده و خطا به شما اطلاع داده شود.

در همان تب Steps، یک تب دیگر با عنوان Code نیز وجود دارد. اگر همانند این مثال گزینه Batch را انتخاب کرده باشید، به تب Code بروید. پس از ورود به این تب، یک خط خالی برای وارد کردن دستور PostgreSQL در اختیار شما قرار دارد. در این بخش میتوانید دستور پشتیبانگیری موردنظر خود را با مجموعه گزینههای سفارشی جایگزین کنید. هر دستور معتبر قابل استفاده است.
در این آموزش، از دستور pg_dump برای پشتیبانگیری از پایگاه داده PostgreSQL با نام sammy استفاده میشود. در این دستور، نام کاربری مربوطه، نام پایگاه داده و گزینه –clean مشخص شدهاند. گزینه –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

نکته مهم و حائز اهمیت:
در صورتی که تصمیم دارید فایلهای پشتیبان را در مسیر دیگری ذخیره کنید، حتماً از مسیر (Absolute Path) برای دایرکتوری موردنظر استفاده کنید. برای مثال، =مسیر ~/ معمولاً به دایرکتوری خانگی /home/sammy/ اشاره میکند، اما در این مقاله، دستور pg_dump نیازمند استفاده از مسیر مطلق /home/sammy/ است.
پس از افزودن دستور پشتیبانگیری، به تب Schedules بروید. مشابه فرآیند تعریف Steps، برای اضافه کردن یک زمانبندی جدید روی نماد + کلیک کنید، سپس نام دلخواه خود را وارد کرده و برای مشاهده و ویرایش گزینههای بیشتر، روی آیکن مداد در کنار نماد سطل زباله کلیک کنید.در تب General، نامی که وارد کردهاید نمایش داده میشود؛ در این مثال، این نام schedule1 است. گزینه Enabled بهصورت پیشفرض فعال است تا اطمینان حاصل شود که زمانبندی بهدرستی اجرا خواهد شد.
در بخشهای Start و End، تاریخ و ساعت شروع و پایان اجرای وظیفه زمانبندیشده را مشخص کنید. از آنجایی که در این مرحله در حال آزمایش وظیفه زمانبندیشده هستید، اطمینان حاصل کنید که زمان فعلی در بازه تعیینشده بین Start و End قرار دارد.

میتوانید به تب Repeat بروید. در این بخش مشخص کنید که وظیفه زمانبندیشده با چه فواصلی اجرا شود. در این قسمت این قابلیت را خواهید داشت تا تنظیمات را بهصورت دقیق برای هفته، ماه، تاریخ، ساعت یا دقیقه مشخص کنید.
توجه داشته باشید، اگر هیچ گزینهای انتخاب نکنید، این وضعیت معادل انتخاب Select All است. بنابراین، اگر بخش Week Days خالی باقی بماند، زمانبندی شامل تمام روزهای هفته خواهد شد. به همین ترتیب، در بخش Times، اگر ساعتها یا دقیقهها را خالی بگذارید، این وضعیت نیز معادل Select All خواهد بود.
به یاد داشته باشید که زمانها در قالب cron-style تعیین میشوند. بنابراین، برای این مثال که قصد داریم هر دقیقه یک پشتیبانگیری انجام شود، لازم است هر دقیقه از ساعت (۰ تا ۵۹) انتخاب شود. برای نشان دادن این موضوع، ما گزینه Select All را برای دقیقهها انتخاب کردهایم. تمامی دقیقهها فهرست میشوند، اما خالی گذاشتن این بخش نیز همان نتیجه را بهدست میدهد.

اگر روزها یا زمانهایی وجود دارند که نمیخواهید وظیفه اجرا شود، میتوانید یک برنامه زمانبندی دقیقتر ایجاد کنید یا این تنظیم را از طریق تب Exceptions انجام دهید.
نکته:
یک وظیفه بر اساس زمانبندی تعریفشده اجرا میشود، بنابراین هر زمان که زمانبندی تغییر کند، زمان اجرای برنامه مجدد محاسبه خواهد شد. در این حالت، pgAgent مقدار زمانبندی گذشته را از پایگاه داده دریافت کرده و معمولاً اجرا را ظرف یک دقیقه از زمان شروع مشخصشده آغاز میکند. اگر مشکلی رخ دهد، هنگام راهاندازی مجدد pgAgent، اجرای وظیفه به برنامه زمانبندی اصلی بازمیگردد.
پس از اتمام مراحل تنظیم و سفارشیسازی زمانبندی موردنظر، روی دکمه Save کلیک کنید. یک وظیفه جدید pgAgent در پنل درختی سمت چپ با نام وظیفه شما ظاهر خواهد شد. در این مثال، وظیفه sammy_backup نمایش داده میشود و زمانبندیها (Schedules) و مراحل (Steps) آن زیر این نام فهرست شدهاند.

اکنون که موفق به ایجاد یک وظیفه pgAgent شدهاید، در مرحله بعد، با نحوه بررسی اجرای موفق وظیفه pgAgent آشنا خواهید شد.
مرحله پنجم: بررسی اجرای وظیفه pgAgent
میتوانید بررسی کنید که آیا وظیفه زمانبندیشده شما برای ایجاد فایل پشتیبان از پایگاه داده هر دقیقه بهدرستی اجرا میشود یا خیر، و این کار را به چند روش انجام دهید.
در pgAdmin، به پنل درختی (Tree Control) سمت چپ بروید و روی وظیفه sammy_backup کلیک کنید. سپس به تب Statistics مراجعه کنید.
صفحه Statistics هر نمونه از اجرای وظیفه زمانبندیشده شما را به شکل زیر فهرست خواهد کرد:

توجه داشته باشید که آمار (Statistics) ممکن است بلافاصله ظاهر نشود یا بهروزرسانی نشود، بنابراین ممکن است لازم باشد صفحه مرورگر را بازنشانی (Refresh) کنید یا به تب دیگری بروید و دوباره بازگردید. به یاد داشته باشید که وظیفه شما بر اساس یک بازه زمانی مشخص اجرا میشود، بنابراین هنگام تعیین تاریخ یا زمانهای دورهای یا طولانی، این نکته را مدنظر داشته باشید.
اگر ترجیح میدهید از طریق خط فرمان (Command Line) بررسی کنید که وظیفه شما بهدرستی اجرا میشود، میتوانید دستور زیر را اجرا کنید تا فایلهای موجود در دایرکتوری خانگی خود را مشاهده کنید:
ls ~
در این آموزش، مسیر دقیق دایرکتوری خانگی هنگام نوشتن دستور pg_dump در مرحله ۴ مشخص شده است. اجرای دستور فوق، هر نمونه از فایلهای پشتیبان ذخیرهشده را فهرست میکند.

مرحله ششم: ویرایش، غیرفعالسازی، حذف و اجرای دستی وظایف pgAgent
pgAgent امکانات انعطافپذیری را برای ویرایش یا غیرفعالسازی یک وظیفه فراهم میکند.
با استفاده از pgAdmin، به وظیفه pgAgent موردنظر خود بروید؛ در این مثال، وظیفه sammy_backup را انتخاب کنید. سپس روی آن کلیک راست کرده و گزینه Properties را انتخاب کنید.
در این بخش، با کلیک روی آیکن مداد در بالا، میتوانید تغییرات لازم را روی وظیفه خود اعمال کنید.
اگر در بخش، properties قرار دارید و ر وی آیکن مداد کلیک کنید، میتوانید به تب Schedules بروید تا وظیفه خود را غیرفعال کنید، همان طور که در تصویر یا مثال زیر نشان داده شده است میتوانید این روند را طی کنید.

از طریق (Tree Control) در سمت چپ، اگر بر روی وظیفه pgAgent کلکیک راست کنید، میتوانید گزینه DELETE/DROP را انتخاب کنید تا وظیفه به صورت کامل حذف شود.

آنچه که در این مقاله بررسی شد تعدادی از قابلیتهای pgAgent برای زمان بندی وظایف بود، اما امکانات بسیار بیشتری نیز در این میان وجود دارد. برای مثال، ممکن است که بخواهید وظیفه ای را زمان بندی کنید که برای تمام کاربران و نقش ها پایگاه داد برای شما ایجاد کند، که میتوان از دستور pg_dumpall –globals-only برای این منظور استفاده کرد.
حتی میتوانید از اسکریپت های پیچیده تر در قالب Batch Jobs استفاده کنید، که جزئیات بیشتر درباره آنها در PostgreSQL قابل دسترس است.
جمع بندی
pgAgent ابزاری بسیار مهم و کاربردی اسا که برای زمان بندی وظایف مختلف از آن استفاده میشود و میتواند برخی از فعالیت های روزمره و ضروری اما تکراری شما را، مانند پشتیبان گیری منظم از پایگاه داده را ساده تر کند. بعد از آنکه با این ابزار راحت تر استفاده کردید، میتوانید وظایف چند مرحله ای یا وظایف SQL را ایجاد کنید که نیازمند زمان بندی دقیق تر هستند.