वेबसाइट को दूसरे सर्वर पर ले जाना, बैकअप रीस्टोर करना या टेस्ट एनवायरनमेंट की कॉपी बनाना, सब कुछ दो कामों पर टिका है: डेटाबेस को फ़ाइल में डंप करना और उसे वापस लोड करना। VPS Linux Infrawire पर ये दोनों काम बिना किसी वेब इंटरफ़ेस के कुछ ही कमांड में हो जाते हैं। इस गाइड में सुसंगत डंप, कंप्रेशन, बड़ी फ़ाइलें, कैरेक्टर एन्कोडिंग और सर्वरों के बीच सीधा ट्रांसफ़र शामिल है।
📋 पूर्वापेक्षाएँ
- Ubuntu 24.04 या Debian 12 वाला Linux VPS, जिसमें root SSH एक्सेस हो (IP और 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
🎉 अब आपके डेटाबेस का बैकअप, रीस्टोर और सर्वरों के बीच माइग्रेशन आसान हो गया है!