بکاپ گرفتن از MySQL با mysqldump (کامل و مرحله‌به‌مرحله)

mysqldump رایج‌ترین ابزار بکاپ‌گیری از MySQL و MariaDB است و یک فایل SQL می‌سازد که با دستور mysql دوباره اجرا می‌شود. در این راهنما از ساخت فایل اتصال امن تا بکاپ فشردهٔ تاریخ‌دار و بررسی سالم بودن آن را قدم‌به‌قدم می‌بینید.

دیتابیس و بکاپمقدماتی8 دقیقه

۱ساخت فایل اتصال امن (پرهیز از نوشتن رمز در خط فرمان)

اگر رمز را جلوی p- بنویسید، در تاریخچهٔ شل و فهرست پردازش‌ها دیده می‌شود. به‌جای آن اطلاعات اتصال را در فایل ~/.my.cnf بگذارید و دسترسی آن را فقط برای خودتان باز کنید.

bash
cat > ~/.my.cnf <<'EOF'
[client]
user=backup
password=YOUR_STRONG_PASSWORD
EOF
chmod 600 ~/.my.cnf

کاربر backup را در راهنمای «ساخت کاربر و دسترسی در MySQL» با حداقل دسترسی می‌سازید. برای شروع می‌توانید root را هم بگذارید.

۲بکاپ ساده از یک دیتابیس

ساده‌ترین شکل: خروجی دستور را با > داخل یک فایل بریزید.

bash
mysqldump appdb > appdb.sql

۳بکاپ کامل و سازگار (روش پیشنهادی)

برای جدول‌های InnoDB از --single-transaction استفاده کنید تا بکاپ بدون قفل کردن جدول‌ها و از یک لحظهٔ ثابت گرفته شود. --routines و --events را هم اضافه کنید تا procedure و event ها فراموش نشوند.

bash
mysqldump \
  --single-transaction \
  --quick \
  --routines --triggers --events \
  --no-tablespaces \
  appdb > appdb.sql

گزینهٔ --no-tablespaces در MySQL 8 لازم است اگر به کاربر بکاپ دسترسی PROCESS نداده‌اید.

۴بکاپ فشردهٔ تاریخ‌دار

خروجی را مستقیم به gzip بدهید تا فایل بسیار کوچک‌تر شود و تاریخ را در نام فایل بگذارید تا بکاپ قبلی بازنویسی نشود.

bash
mysqldump --single-transaction --routines --triggers --events appdb \
  | gzip > appdb_$(date +%F_%H-%M).sql.gz

۵بکاپ از همهٔ دیتابیس‌ها، چند دیتابیس یا یک جدول

بسته به نیاز یکی از این حالت‌ها را انتخاب کنید.

bash
# همهٔ دیتابیس‌ها
mysqldump --all-databases --single-transaction --routines --events > all.sql

# دو دیتابیس مشخص (همراه با دستور CREATE DATABASE)
mysqldump --databases appdb blog --single-transaction > two_dbs.sql

# فقط چند جدول
mysqldump appdb users orders > two_tables.sql

# فقط ساختار، بدون داده
mysqldump --no-data appdb > schema.sql

۶بررسی سالم بودن بکاپ

بکاپی که بررسی نشده اعتماد ندارد. اندازه، انتهای فایل و چند خط اول را ببینید. در انتهای یک بکاپ کامل عبارت «Dump completed» وجود دارد.

bash
ls -lh appdb_*.sql.gz
zcat appdb_2026-09-29_03-00.sql.gz | head -20
zcat appdb_2026-09-29_03-00.sql.gz | tail -3
gzip -t appdb_2026-09-29_03-00.sql.gz && echo "فایل فشرده سالم است"

۷ریستور بکاپ

اگر دیتابیس مقصد وجود ندارد آن را بسازید و سپس فایل را وارد کنید. ریستور را همیشه اول روی سرور یا دیتابیس آزمایشی امتحان کنید.

bash
mysql -e "CREATE DATABASE IF NOT EXISTS appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"

# فایل معمولی
mysql appdb < appdb.sql

# فایل فشرده
zcat appdb_2026-09-29_03-00.sql.gz | mysql appdb

ریستور روی دیتابیسی که داده دارد، جدول‌های همنام را جایگزین می‌کند. پیش از آن یک بکاپ از وضعیت فعلی بگیرید.

پرسش‌های پرتکرار دربارهٔ بکاپ گرفتن از MySQL با mysqldump (کامل و مرحله‌به‌مرحله)

چرا باید از --single-transaction استفاده کنم؟

این گزینه بکاپ را داخل یک تراکنش ثابت می‌گیرد؛ در نتیجه جدول‌های InnoDB قفل نمی‌شوند و سایت هنگام بکاپ کار می‌کند و داده‌ها هم سازگار می‌مانند. برای جدول‌های MyISAM مؤثر نیست و آن‌ها قفل می‌شوند.

بکاپ MySQL چقدر طول می‌کشد؟

به حجم داده و سرعت دیسک بستگی دارد؛ حدوداً چند ده تا چند صد مگابایت در ثانیه. برای دیتابیس‌های بسیار بزرگ (صدها گیگابایت) ابزار بکاپ فیزیکی مثل Percona XtraBackup سریع‌تر است.

آیا mysqldump روی MariaDB هم کار می‌کند؟

بله؛ MariaDB نیز mysqldump (و نام جدید mariadb-dump) دارد و گزینه‌های مشترک مثل --single-transaction به همان شکل کار می‌کنند.