نصب PostgreSQL روی اوبونتو و ساخت کاربر

برای نصب 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 alreadymax_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 انجام می‌شود و پیش از آن بکاپ لازم است.

منابع