हिन्दी (Hindi)

Linux VPS पर MySQL/MariaDB डेटाबेस एक्सपोर्ट और इम्पोर्ट करें

3 min
VPS/VDS होस्टिंग

वेबसाइट को दूसरे सर्वर पर ले जाना, बैकअप रीस्टोर करना या टेस्ट एनवायरनमेंट की कॉपी बनाना, सब कुछ दो कामों पर टिका है: डेटाबेस को फ़ाइल में डंप करना और उसे वापस लोड करना। 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 टेबल लॉक किए बिना सुसंगत स्नैपशॉट बनाता है, इसलिए डंप के दौरान आपकी साइट चलती रहती है।

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

🎉 अब आपके डेटाबेस का बैकअप, रीस्टोर और सर्वरों के बीच माइग्रेशन आसान हो गया है!

नवीनतम ऑफ़र, छूट और विशेष प्रोमोशन से अपडेट रहें।

प्रोमोशन देखें

हम cookies का उपयोग करते हैं

हम अपनी साइट पर आपके अनुभव को बेहतर बनाने के लिए एनालिटिक्स cookies का उपयोग करते हैं। कोई भी डेटा तीसरे पक्ष को नहीं बेचा जाता है। हमारे बारे में और जानें गोपनीयता नीति.