آموزش سرور

نصب MySQL/MariaDB و PostgreSQL روی سرور و بکاپ خودکار دیتابیس

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۷ دقیقه

root@server: ~$ /usr/local/bin/db-backup.sh$ ls -lh /var/backups/db | tail -3-rw-r--r-- 1 root root ...M Oct 31 03:30$ gunzip < /var/backups/db/appdb_2026-10$ mysql -e 'SELECT COUNT(*) FROM appdb_t...MySQL/MariaDBPostgreSQLآموزش سرورنصب MySQL/MariaDBو PostgreSQL روی سرورو بکاپ خودکار دیتابیسمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

روی اوبونتو، MariaDB با apt install mariadb-server و PostgreSQL با apt install postgresql نصب می‌شوند. پس از نصب، برای هر برنامه کاربر و دیتابیس جداگانه با کمترین دسترسی بسازید و دیتابیس را فقط روی 127.0.0.1 در دسترس بگذارید. برای بکاپ، یک اسکریپت با mysqldump یا pg_dump بنویسید که خروجی را فشرده، با تاریخ نام‌گذاری و نسخه‌های قدیمی را حذف کند؛ آن را با کرون روزانه اجرا کنید و نسخه‌ای را خارج از سرور نگه دارید.

کدام دیتابیس؟

MySQL و نسخهٔ متن‌باز و سازگار آن، MariaDB، رایج‌ترین دیتابیس‌ها برای وردپرس، لاراول، فروشگاه‌ها و بیشتر برنامه‌های PHP هستند. PostgreSQL دیتابیسی قدرتمند با پشتیبانی پیشرفته از انواع داده، تراکنش‌ها و کوئری‌های پیچیده است و در پروژه‌های جنگو، Node.js و سیستم‌های تحلیلی محبوب است.

انتخاب معمولاً با برنامهٔ شما تعیین می‌شود: وردپرس به MySQL یا MariaDB نیاز دارد؛ بسیاری از فریم‌ورک‌های مدرن هر دو را پشتیبانی می‌کنند. اگر آزادی انتخاب دارید و پروژه داده‌های پیچیده دارد، PostgreSQL گزینهٔ قوی‌ای است. این راهنما برای اوبونتو ۲۴.۰۴ نوشته شده است.

مسیر بکاپ امن دیتابیس
کرون روزانهgzip و نام تاریخ‌دارrsync روی SSHدیتابیسMariaDB یا PostgreSQLاسکریپت بکاپmysqldump یا pg_dumpپوشهٔ محلیفشرده و تاریخ‌دارسرور دیگرنسخهٔ خارج از سرورکرون روزانهgzip و نام تاریخ‌دارrsync روی SSHدیتابیسMariaDB یا PostgreSQLاسکریپت بکاپmysqldump یا pg_dumpپوشهٔ محلیفشرده و تاریخ‌دارسرور دیگرنسخهٔ خارج از سرور
شکل ۱ بکاپ فقط وقتی امن است که نسخه‌ای از آن خارج از همان سرور نگه‌داری شود.

نصب و راه‌اندازی MariaDB

sudo apt update
sudo apt install -y mariadb-server
sudo systemctl enable --now mariadb
sudo mysql_secure_installation

اسکریپت mysql_secure_installation چند پرسش می‌پرسد: کاربران ناشناس را حذف کنید، ورود root از راه دور را ببندید و دیتابیس test را پاک کنید. در اوبونتو، کاربر root دیتابیس به‌طور پیش‌فرض با احراز هویت سوکت کار می‌کند؛ یعنی sudo mysql بدون رمز وارد می‌شود و این امن است.

ساخت دیتابیس و کاربر

sudo mysql
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'Long-Random-Password';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;

همیشه برای هر برنامه یک کاربر جداگانه بسازید که فقط به دیتابیس خودش دسترسی دارد. اگر یک برنامه آسیب‌پذیر باشد، مهاجم به دیتابیس‌های دیگر دسترسی پیدا نمی‌کند.

نصب و راه‌اندازی PostgreSQL

sudo apt install -y postgresql
sudo systemctl enable --now postgresql
sudo -u postgres psql -c "CREATE USER appuser WITH PASSWORD 'Long-Random-Password';"
sudo -u postgres psql -c "CREATE DATABASE appdb OWNER appuser;"

PostgreSQL کاربری سیستمی به نام postgres می‌سازد که مدیر دیتابیس است. دستور sudo -u postgres psql شما را به‌عنوان این کاربر وارد کنسول دیتابیس می‌کند.

امن‌سازی دسترسی شبکه

مهم‌ترین قانون امنیت دیتابیس: پورت دیتابیس را روی اینترنت باز نگذارید. ربات‌ها مدام پورت‌های 3306 (MySQL) و 5432 (PostgreSQL) را اسکن می‌کنند.

  • در MariaDB، مقدار bind-address در فایل /etc/mysql/mariadb.conf.d/50-server.cnf باید 127.0.0.1 باشد.
  • در PostgreSQL، مقدار listen_addresses در postgresql.conf به‌طور پیش‌فرض localhost است؛ آن را تغییر ندهید مگر لازم باشد.

اگر برنامه روی سرور دیگری است، دیتابیس را فقط روی شبکهٔ خصوصی در دسترس بگذارید یا با فایروال فقط آی‌پی سرور برنامه را مجاز کنید. برای دسترسی موقت از کامپیوتر خودتان، به‌جای باز کردن پورت از تونل SSH استفاده کنید:

ssh -L 3306:127.0.0.1:3306 user@203.0.113.10

پس از این دستور، ابزار مدیریت دیتابیس روی کامپیوتر شما به 127.0.0.1:3306 وصل می‌شود و ترافیک به‌شکل رمزنگاری‌شده از SSH عبور می‌کند. توضیح بیشتر در پورت شبکه چیست؟ آمده است.

MariaDB یا PostgreSQL
MariaDB / MySQL
  • پیش‌فرض وردپرس و بیشتر برنامه‌های PHP
  • راه‌اندازی ساده
  • بکاپ با mysqldump
  • پورت 3306
در برابر
PostgreSQL
  • قابلیت‌های پیشرفتهٔ داده و کوئری
  • محبوب در جنگو و پروژه‌های تحلیلی
  • بکاپ با pg_dump و pg_restore
  • پورت 5432
شکل ۲ انتخاب را معمولاً برنامهٔ شما تعیین می‌کند؛ اصول امنیت و بکاپ برای هر دو یکی است.

بکاپ خودکار روزانه

نسخهٔ پشتیبان دیتابیس، مهم‌ترین بکاپ هر کسب‌وکار آنلاین است. فایل‌های سایت معمولاً قابل بازسازی‌اند؛ سفارش‌ها، کاربران و محتوای دیتابیس نه.

اسکریپت بکاپ MariaDB

فایل /usr/local/bin/db-backup.sh را بسازید:

#!/bin/bash
set -euo pipefail
DIR=/var/backups/db
KEEP_DAYS=14
mkdir -p "$DIR"
TS=$(date +%F_%H%M)
for DB in $(mysql -N -e "SHOW DATABASES" | grep -Ev "^(information_schema|performance_schema|mysql|sys)$"); do
  mysqldump --single-transaction --routines --triggers "$DB" | gzip > "$DIR/${DB}_${TS}.sql.gz"
done
find "$DIR" -name "*.sql.gz" -mtime +$KEEP_DAYS -delete

گزینهٔ --single-transaction برای جدول‌های InnoDB یک نسخهٔ سازگار بدون قفل کردن جدول‌ها می‌گیرد؛ یعنی سایت در حین بکاپ کار می‌کند. خط آخر بکاپ‌های قدیمی‌تر از ۱۴ روز را پاک می‌کند تا دیسک پر نشود.

اسکریپت بکاپ PostgreSQL

#!/bin/bash
set -euo pipefail
DIR=/var/backups/pg
mkdir -p "$DIR"
TS=$(date +%F_%H%M)
sudo -u postgres pg_dump -Fc appdb > "$DIR/appdb_${TS}.dump"
find "$DIR" -name "*.dump" -mtime +14 -delete

قالب -Fc (Custom) فشرده است و امکان بازگردانی انتخابی جدول‌ها را با pg_restore می‌دهد.

زمان‌بندی با کرون

sudo chmod 700 /usr/local/bin/db-backup.sh
sudo crontab -e
# add:
30 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1

این خط هر روز ساعت ۳:۳۰ بامداد بکاپ می‌گیرد. توضیح کامل قالب کرون در راهنمای کرون‌جاب لینوکس آمده است.

بکاپ خارج از سرور

بکاپی که فقط روی همان سرور است، در برابر خرابی دیسک، حذف تصادفی سرور یا هک بی‌فایده است. پس از ساخت بکاپ، آن را به سرور یا فضای ذخیره‌سازی دیگری منتقل کنید. ساده‌ترین روش، rsync روی SSH است که در آموزش بکاپ با rsync گام‌به‌گام توضیح داده شده است. قاعدهٔ کلاسیک ۳-۲-۱ هم راهنمای خوبی است: سه نسخه، روی دو نوع رسانهٔ مختلف، یکی در مکانی دیگر.

root@server: ~
$ /usr/local/bin/db-backup.sh$ ls -lh /var/backups/db | tail -3-rw-r--r-- 1 root root ...M Oct 31 03:30 appdb_2026-10-31_0330.sql.gz$ gunzip < /var/backups/db/appdb_2026-10-31_0330.sql.gz | mysql appdb_test$ mysql -e 'SELECT COUNT(*) FROM appdb_test.orders'...$ 
شکل ۳ بکاپ را اجرا، بررسی و روی دیتابیس آزمایشی بازگردانی کنید تا از سالم بودن آن مطمئن شوید.

بازگردانی: بکاپی که امتحان نشده، بکاپ نیست

# MariaDB
gunzip < /var/backups/db/appdb_2026-10-31_0330.sql.gz | mysql appdb
# PostgreSQL
sudo -u postgres pg_restore -d appdb --clean /var/backups/pg/appdb_2026-10-31_0330.dump

هر چند هفته یک بار، بکاپ را روی یک سرور آزمایشی بازگردانی کنید و مطمئن شوید برنامه با آن کار می‌کند. سرورهای ساعتی برای این کار مناسب‌اند: یک سرور ساعتی بسازید، بازگردانی کنید، آزمایش کنید و حذفش کنید.

نکات کارایی

  • رم: هر دو دیتابیس برای کش داده‌ها از رم استفاده می‌کنند. در MariaDB مقدار innodb_buffer_pool_size و در PostgreSQL مقدار shared_buffers مهم‌ترین تنظیم‌اند؛ آن‌ها را متناسب با رم سرور و با در نظر گرفتن برنامه‌های دیگر تنظیم کنید.
  • دیسک سریع: دیسک NVMe اثر مستقیم روی کوئری‌های سنگین دارد.
  • کش جلوی دیتابیس: Redis کوئری‌های تکراری را از دوش دیتابیس برمی‌دارد.
  • کوئری‌های کند: لاگ کوئری‌های کند را فعال کنید و ایندکس‌های لازم را اضافه کنید.

بکاپ در محیط داکر

اگر دیتابیس داخل کانتینر داکر اجرا می‌شود، اصول همان است اما دستورها از داخل کانتینر اجرا می‌شوند. برای MariaDB:

docker exec mariadb sh -c 'mariadb-dump --single-transaction -uroot -p"$MARIADB_ROOT_PASSWORD" appdb' | gzip > appdb.sql.gz

و برای PostgreSQL:

docker exec postgres pg_dump -U appuser -Fc appdb > appdb.dump

یک اشتباه رایج این است که تصور شود چون داده‌ها در یک Volume داکر ذخیره شده‌اند، امن‌اند. Volume فقط داده را از چرخهٔ عمر کانتینر جدا می‌کند؛ اگر دیسک سرور خراب شود یا سرور حذف شود، Volume هم از بین می‌رود. همچنین کپی مستقیم فایل‌های داخل Volume در حالی که دیتابیس در حال کار است، ممکن است نسخهٔ ناسازگار و خراب تولید کند. همیشه از ابزار dump خود دیتابیس استفاده کنید. اصول کار با کانتینرها را در راهنمای Docker Compose ببینید.

پایش موفقیت بکاپ

بکاپ خودکاری که بی‌صدا شکست بخورد، از نداشتن بکاپ خطرناک‌تر است؛ چون احساس امنیت کاذب می‌دهد. چند روش ساده برای اطمینان:

  • بررسی حجم فایل: اگر حجم بکاپ امروز ناگهان بسیار کمتر از دیروز است، احتمالاً خطایی رخ داده است.
  • بررسی لاگ: خروجی اسکریپت در /var/log/db-backup.log ذخیره می‌شود؛ هر از گاهی آن را مرور کنید.
  • مانیتور Push: در پایان موفق اسکریپت، با curl یک آدرس Push در ابزار پایشی مثل Uptime Kuma را صدا بزنید. اگر در زمان مقرر سیگنالی نرسد، هشدار می‌گیرید.

گزینهٔ set -euo pipefail در ابتدای اسکریپت باعث می‌شود با اولین خطا، اسکریپت متوقف شود و فراخوانی Push انجام نشود؛ بنابراین شکست بکاپ پنهان نمی‌ماند.

رمزنگاری بکاپ‌ها

بکاپ دیتابیس معمولاً حاوی اطلاعات حساس کاربران است: نام، شماره تماس، نشانی و گاهی هش رمزها. اگر بکاپ را به فضای ذخیره‌سازی بیرونی منتقل می‌کنید، آن را رمزنگاری کنید. ابزارهایی مثل gpg یا age این کار را با یک دستور انجام می‌دهند. کلید رمزگشایی را جدا از بکاپ‌ها و در جای امن نگه دارید؛ بکاپ رمزنگاری‌شده بدون کلید، بی‌ارزش است.

نگهداری دوره‌ای دیتابیس

دیتابیس هم مثل هر بخش دیگری از سرور به نگهداری نیاز دارد. در MariaDB، جدول‌هایی که حذف و درج زیادی دارند، به‌مرور فضای خالی داخلی پیدا می‌کنند؛ دستور OPTIMIZE TABLE در زمان خلوت این فضا را آزاد می‌کند. در PostgreSQL، فرایند خودکار autovacuum این کار را انجام می‌دهد و معمولاً نیازی به دخالت نیست، اما در جدول‌های بسیار پرتغییر ارزش دارد تنظیماتش را بررسی کنید.

حجم دیتابیس و رشد آن را هم زیر نظر داشته باشید. جدول‌های لاگ، نشست‌ها و داده‌های موقت گاهی بدون این‌که کسی متوجه شود، چندین گیگابایت رشد می‌کنند و هم بکاپ را کند می‌کنند و هم دیسک را پر. یک بار در ماه بزرگ‌ترین جدول‌ها را بررسی کنید و داده‌های غیرضروری را پاک یا بایگانی کنید.

سؤالات متداول

MariaDB با MySQL سازگار است؟

برای بیشتر برنامه‌ها مثل وردپرس و لاراول بله؛ دستورها و درایورها یکسان‌اند. در برخی قابلیت‌های جدیدتر تفاوت‌هایی وجود دارد که در پروژه‌های خاص باید بررسی شود.

بکاپ گرفتن با mysqldump سایت را کند می‌کند؟

با گزینهٔ --single-transaction جدول‌های InnoDB قفل نمی‌شوند و سایت کار می‌کند، اما بکاپ کمی بار دیسک و پردازنده ایجاد می‌کند؛ به همین دلیل در ساعت‌های خلوت زمان‌بندی می‌شود.

پورت دیتابیس را برای اتصال از کامپیوترم باز کنم؟

خیر. از تونل SSH استفاده کنید تا پورت دیتابیس روی اینترنت بسته بماند و ارتباط رمزنگاری شود.

هر چند وقت یک بار بکاپ بگیرم؟

برای بیشتر سایت‌ها روزانه کافی است. اگر سفارش یا داده‌های مهم زیادی در طول روز ثبت می‌شود، بکاپ‌های چندباره در روز یا روش‌های پیشرفته‌تر مثل Binary Log را در نظر بگیرید.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.