انتقال یک وبسایت، بازیابی پشتیبان یا کپی کردن محیط آزمایشی، همه به دو کار برمیگردند: ریختن پایگاه داده در یک فایل و بارگذاری دوباره آن. روی 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 بدون قفل کردن جدولها یک تصویر لحظهای سازگار میسازد، پس سایت شما هنگام دامپ به کار خود ادامه میدهد.
Bashmysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql
در نسخههای جدید MariaDB این ابزار با نام mariadb-dump هم در دسترس است و گزینههایش یکسان است.
2. افزودن روالها، تریگرها و رویدادها
تریگرها بهطور پیشفرض دامپ میشوند، اما رویههای ذخیرهشده، توابع و رویدادهای زمانبندیشده باید صریحاً درخواست شوند. تعیین مجموعه نویسه از بروز مشکل در حروف فارسی و ایموجیها جلوگیری میکند.
Bashmysqldump -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 بدهید تا فایل فشردهنشده هرگز روی دیسک نوشته نشود.
Bashmysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz
برای اینکه هر بار گذرواژه را تایپ نکنید (و در خروجی ps دیده نشود)، آن را در ~/.my.cnf بگذارید:
INI[client] user=USER password=YOUR_PASSWORD
Bashchmod 600 ~/.my.cnf
4. درونریزی دامپ
ابتدا پایگاه داده مقصد را با یک مجموعه نویسه مدرن بسازید، سپس فایل را بارگذاری کنید.
Bashmysql -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 ببینید.
Bashapt 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 از سوکت محلی) خوانده میشود.
Bashmysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'
پایگاه داده DBNAME باید از قبل روی سرور مقصد وجود داشته باشد.
✅ بررسی نتیجه
Bashgzip -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 : دامپ به کاربری اشاره میکند که در مقصد وجود ندارد. هنگام درونریزی این عبارت را حذف کنید:
Bashsed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME
🎉 اکنون پشتیبانگیری، بازیابی و انتقال پایگاههای داده بین سرورها برایتان آسان شده است!