فارسی (Farsi)
€EUR

برون‌بری و درون‌ریزی پایگاه داده MySQL/MariaDB روی VPS لینوکس

3 min
سرور مجازی (VPS/VDS)

انتقال یک وب‌سایت، بازیابی پشتیبان یا کپی کردن محیط آزمایشی، همه به دو کار برمی‌گردند: ریختن پایگاه داده در یک فایل و بارگذاری دوباره آن. روی VPS Linux Infrawire هر دو کار با چند دستور و بدون هیچ رابط وبی انجام می‌شود. این راهنما دامپ‌های سازگار، فشرده‌سازی، فایل‌های حجیم، کدگذاری نویسه‌ها و انتقال مستقیم بین سرورها را پوشش می‌دهد.

📋 پیش‌نیازها

  • یک VPS لینوکس با Ubuntu 24.04 یا Debian 12 و دسترسی SSH با کاربر root (آی‌پی و گذرواژه root در بخش مشتریان شما موجود است)
  • MySQL یا MariaDB نصب‌شده، یا دست‌کم کلاینت آن (apt install mariadb-client)
  • یک کاربر پایگاه داده با دسترسی‌های SELECT، SHOW VIEW، TRIGGER، LOCK TABLES و EVENT روی پایگاه داده‌ای که قرار است دامپ شود
  • فضای خالی کافی روی دیسک: با df -h بررسی کنید

1. برون‌بری پایگاه داده با mysqldump

برای جدول‌های InnoDB (موتور پیش‌فرض)، گزینه --single-transaction بدون قفل کردن جدول‌ها یک تصویر لحظه‌ای سازگار می‌سازد، پس سایت شما هنگام دامپ به کار خود ادامه می‌دهد.

Bash
mysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql

در نسخه‌های جدید MariaDB این ابزار با نام mariadb-dump هم در دسترس است و گزینه‌هایش یکسان است.

2. افزودن روال‌ها، تریگرها و رویدادها

تریگرها به‌طور پیش‌فرض دامپ می‌شوند، اما رویه‌های ذخیره‌شده، توابع و رویدادهای زمان‌بندی‌شده باید صریحاً درخواست شوند. تعیین مجموعه نویسه از بروز مشکل در حروف فارسی و ایموجی‌ها جلوگیری می‌کند.

Bash
mysqldump -u USER -p --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 DBNAME > DBNAME.sql

حالت‌های کاربردی:

Bash
# فقط ساختار، بدون سطرها mysqldump -u USER -p --no-data DBNAME > schema.sql # چند پایگاه داده همراه با دستورهای CREATE DATABASE mysqldump -u USER -p --single-transaction --databases DB1 DB2 > two-dbs.sql # همه پایگاه‌های داده سرور mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql

3. فشرده‌سازی دامپ با gzip

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

Bash
mysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz

برای اینکه هر بار گذرواژه را تایپ نکنید (و در خروجی ps دیده نشود)، آن را در ~/.my.cnf بگذارید:

INI
[client] user=USER password=YOUR_PASSWORD
Bash
chmod 600 ~/.my.cnf

4. درون‌ریزی دامپ

ابتدا پایگاه داده مقصد را با یک مجموعه نویسه مدرن بسازید، سپس فایل را بارگذاری کنید.

Bash
mysql -u USER -p -e 'CREATE DATABASE IF NOT EXISTS DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' mysql -u USER -p --default-character-set=utf8mb4 DBNAME < DBNAME.sql # از فایل فشرده gunzip -c DBNAME.sql.gz | mysql -u USER -p --default-character-set=utf8mb4 DBNAME

هشدار: دامپ به‌طور پیش‌فرض شامل DROP TABLE IF EXISTS است؛ بنابراین درون‌ریزی به یک پایگاه داده موجود، جدول‌های هم‌نام را جایگزین می‌کند. ابتدا از مقصد پشتیبان بگیرید.

5. کار با فایل‌های حجیم

برای دامپ‌های چندگیگابایتی، درون‌ریزی را داخل tmux اجرا کنید تا قطع شدن SSH آن را متوقف نکند، و پیشرفت کار را با pv ببینید.

Bash
apt install -y tmux pv tmux new -s import pv DBNAME.sql.gz | gunzip | mysql -u USER -p --max-allowed-packet=512M DBNAME

با Ctrl+B و سپس D از نشست جدا شوید و بعداً با tmux attach -t import برگردید.

6. انتقال مستقیم به سرور دیگر از طریق SSH

به فایل میانی نیازی نیست: دامپ از یک لوله رمزگذاری‌شده SSH عبور می‌کند و در مقصد بارگذاری می‌شود. اطلاعات ورود در هر دو سمت از ~/.my.cnf (یا برای root از سوکت محلی) خوانده می‌شود.

Bash
mysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'

پایگاه داده DBNAME باید از قبل روی سرور مقصد وجود داشته باشد.

✅ بررسی نتیجه

Bash
gzip -t DBNAME.sql.gz && echo 'archive OK' mysql -e 'SHOW TABLES;' DBNAME mysql -e 'SELECT COUNT(*) FROM TABLENAME;' DBNAME mysql -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name='DBNAME';"

تعداد سطرهای چند جدول مهم را بین مبدأ و مقصد مقایسه کنید.

🔧 عیب‌یابی

ERROR 1045 Access denied : نام کاربری یا گذرواژه اشتباه است، یا کاربر اجازه اتصال از این میزبان را ندارد. ابتدا با mysql -u USER -p آزمایش کنید.

ERROR 2006 MySQL server has gone away : یک سطر یا پرس‌وجو از max_allowed_packet بزرگ‌تر است. مقدار آن را در بخش [mysqld] پیکربندی سرور افزایش دهید و سرویس را ری‌استارت کنید، یا --max-allowed-packet=512M را به کلاینت بدهید.

حروف خراب پس از درون‌ریزی : فایل با مجموعه نویسه نادرست خوانده شده است. با --default-character-set=utf8mb4 برون‌بری کنید و با همان گزینه درون‌ریزی کنید.

ERROR 1227 یا خطاهای DEFINER : دامپ به کاربری اشاره می‌کند که در مقصد وجود ندارد. هنگام درون‌ریزی این عبارت را حذف کنید:

Bash
sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME

🎉 اکنون پشتیبان‌گیری، بازیابی و انتقال پایگاه‌های داده بین سرورها برایتان آسان شده است!

با آخرین پیشنهادها، تخفیف‌ها و تبلیغات ویژه به‌روز بمانید.

مشاهده تخفیف‌ها

ما از کوکی استفاده می‌کنیم

ما از کوکی‌های تحلیلی برای بهبود تجربه شما در سایت خود استفاده می‌کنیم. هیچ داده‌ای به اشخاص ثالث فروخته نمی‌شود. اطلاعات بیشتر در سیاست حفظ حریم خصوصی ما.