برای نصب PostgreSQL روی اوبونتو بسته postgresql را با apt نصب کنید، با کاربر postgres وارد psql شوید، یک نقش (کاربر) و یک دیتابیس بسازید و دسترسی از بیرون را فقط در صورت لزوم و با فایل pg_hba.conf باز کنید. بهطور پیشفرض PostgreSQL فقط روی localhost گوش میدهد، و این تنظیم را بدون دلیل عوض نکنید.
PostgreSQL دیتابیس رابطهای متنباز است که برای برنامههایی با کوئری پیچیده، دادههای جغرافیایی (با PostGIS) و تراکنشهای سختگیرانه محبوب است. دستورها برای Ubuntu 22.04 و 24.04 هستند. اگر هنوز بین دو دیتابیس مردد هستید، MySQL و MariaDB انتخاب رایجتری برای وردپرساند؛ بکاپ آنها در بکاپ گرفتن از دیتابیس MySQL آمده است.
مرحله اول: نصب PostgreSQL روی اوبونتو
sudo apt update
sudo apt install postgresql postgresql-contribبعد از نصب، سرویس خودکار بالا میآید. نسخه و وضعیت را ببینید:
psql --version
systemctl status postgresql
sudo -u postgres pg_lsclustersدر Debian و Ubuntu، PostgreSQL بهصورت «کلاستر» نصب میشود و دستور pg_lsclusters نسخه، پورت و پوشه داده را نشان میدهد. پورت پیشفرض 5432 است.
مرحله دوم: ورود با کاربر postgres
نصب یک کاربر سیستمعامل و یک نقش دیتابیس به نام postgres میسازد. با آن وارد psql شوید:
sudo -u postgres psqlداخل psql چند دستور آشنایی مفید است: \l فهرست دیتابیسها، \du فهرست نقشها، \c dbname اتصال به دیتابیس، \dt جدولها و \q خروج.
مرحله سوم: ساخت نقش و دیتابیس
برای هر برنامه یک نقش و یک دیتابیس بسازید. نامها و رمز را عوض کنید:
CREATE ROLE appuser WITH LOGIN PASSWORD 'STRONG_PASSWORD';
CREATE DATABASE appdb OWNER appuser ENCODING 'UTF8';نقش appuser مالک appdb میشود و فقط به آن دسترسی کامل دارد. برای برنامه از نقش postgres استفاده نکنید، چون این نقش سرپرست کل سرور دیتابیس است. اتصال را آزمایش کنید:
psql -h localhost -U appuser -d appdbدر اتصال از طریق TCP، رمز پرسیده میشود. اگر بدون -h وصل شوید، PostgreSQL از سوکت محلی استفاده میکند و بسته به pg_hba.conf ممکن است نام کاربری سیستم را بخواهد؛ خطای Peer authentication failed از همینجا میآید.
مرحله چهارم: بعد از نصب PostgreSQL روی اوبونتو، آدرس گوش دادن و دسترسی از بیرون
دو فایل کنترل میکنند چه کسی وصل شود. فایل postgresql.conf تعیین میکند روی کدام آدرس گوش بدهد، و pg_hba.conf تعیین میکند چه کسی با چه روشی وارد شود. در Ubuntu هر دو در /etc/postgresql/16/main/ هستند (شماره نسخه را با pg_lsclusters تطبیق دهید).
مقدار پیشفرض listen_addresses = 'localhost' فقط اجازه اتصال محلی را میدهد و برای برنامهای که روی همان سرور است درست است. اگر ماشین دیگری باید وصل شود، آدرس خصوصی همان سرور را اضافه کنید:
listen_addresses = 'localhost,192.168.1.10'سپس در pg_hba.conf فقط همان ماشین و همان کاربر را مجاز کنید:
host appdb appuser 192.168.1.20/32 scram-sha-256روش scram-sha-256 رمز را امنتر از md5 بررسی میکند. بعد از تغییر، PostgreSQL را reload کنید: sudo systemctl reload postgresql، و برای تغییر listen_addresses ریاستارت لازم است. پورت 5432 را در فایروال فقط برای آدرس مجاز باز کنید و با ابزار تست پورت باز مطمئن شوید از اینترنت در دسترس نیست.
تنظیمات حافظه
تنظیمهای پیشفرض PostgreSQL محافظهکارانهاند. سه پارامتر بیشترین اثر را دارند: shared_buffers اندازه حافظه مشترک کش داده است و معمولاً حدود یکچهارم حافظه سرور اختصاصی دیتابیس میگیرند. work_mem حافظه هر عملیات مرتبسازی یا join است و چون به ازای هر عملیات مصرف میشود، با اتصالهای زیاد میتواند حافظه را پر کند. effective_cache_size تخمینی برای برنامهریز کوئری از حافظه قابل استفاده برای کش است و معمولاً حدود نیمی تا سهچهارم حافظه سرور میگذارند. مقدار نمونه برای سروری با ۸ گیگابایت حافظه:
shared_buffers = 2GB
work_mem = 16MB
effective_cache_size = 6GBاین اعداد نقطه شروعاند و باید با بار واقعی و تعداد اتصالها اندازهگیری شوند. برای وبسایتهای پرترافیک، تعداد اتصال همزمان را با یک مدیر اتصال مثل PgBouncer کنترل میکنند تا هر اتصال یک پروسه سنگین نسازد.
بکاپ گرفتن
ابزار pg_dump از یک دیتابیس خروجی منطقی میگیرد:
sudo -u postgres pg_dump -Fc appdb > appdb-$(date +%F).dumpقالب -Fc فشرده است و با pg_restore بازگردانده میشود:
sudo -u postgres createdb appdb_restore
sudo -u postgres pg_restore -d appdb_restore appdb-2026-10-05.dumpبرای بکاپ همه دیتابیسها از pg_dumpall و برای دیتابیسهای بزرگ از روشهای بکاپ فیزیکی مثل pg_basebackup یا WAL archiving استفاده میکنند. بکاپی که بازیابیاش را امتحان نکردهاید قابل اعتماد نیست؛ طرح کامل را در بکاپ گیری سرور و بازیابی بحران ببینید.
نگهداری: VACUUM و آمار
PostgreSQL ردیفهای حذفشده را فوراً از دیسک پاک نمیکند و پروسه autovacuum این کار را در پسزمینه انجام میدهد. روی بیشتر سرورها همین کافی است و باید روشن بماند. اگر جدولی بسیار پرنوشتن است و حجمش بیدلیل بزرگ میشود، تنظیمات autovacuum آن جدول را بازبینی کنید. دستور زیر اندازه دیتابیسها را نشان میدهد:
SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database;برای پیدا کردن کوئریهای کند، log_min_duration_statement = 1000 را در postgresql.conf بگذارید تا کوئریهای بیش از یک ثانیه ثبت شوند.
خطاهای رایج
| نشانه | علت و راه حل |
|---|---|
Peer authentication failed for user | اتصال از سوکت محلی است؛ با -h localhost یا تغییر روش در pg_hba.conf وصل شوید |
FATAL: no pg_hba.conf entry for host | برای آدرس و کاربر قانونی در pg_hba.conf نیست |
connection refused | سرویس خاموش است یا listen_addresses اجازه نمیدهد |
FATAL: sorry, too many clients already | max_connections پر شده؛ اتصالها را کم یا از PgBouncer استفاده کنید |
| بعد از تغییر کانفیگ اثر نمیبینم | بعضی پارامترها فقط با restart اعمال میشوند و reload برایشان کافی نیست |
سوالات متداول
PostgreSQL بهتر است یا MySQL؟
هر دو دیتابیسهای قویاند. وردپرس و بسیاری از نرمافزارهای هاستینگ MySQL یا MariaDB میخواهند؛ PostgreSQL وقتی انتخاب خوبی است که برنامه شما از آن پشتیبانی میکند یا به امکاناتی مثل PostGIS و انواع داده پیشرفته نیاز دارد.
رمز نقش postgres را چطور عوض کنم؟
داخل psql با نقش postgres دستور ALTER ROLE postgres WITH PASSWORD 'NEW_PASSWORD'; را بزنید. برای اتصال برنامهها از این نقش استفاده نکنید.
پورت 5432 را باز کنم؟
فقط اگر ماشین دیگری باید وصل شود، و فقط برای آدرس همان ماشین. پورت دیتابیس را برای همه باز نگذارید.
آیا نسخههای مختلف PostgreSQL را میشود کنار هم نصب کرد؟
بله، در Debian و Ubuntu هر نسخه کلاستر جدا با پورت جدا دارد. ارتقای نسخه با pg_upgrade یا pg_upgradecluster انجام میشود و پیش از آن بکاپ لازم است.





