EQVPS

VPS पर MySQL कैसे इंस्टॉल करें: यूज़र, सुरक्षित रिमोट एक्सेस, कम RAM और बैकअप

Ubuntu 24.04 VPS पर MySQL 8.0 इंस्टॉल करें, ऐप के लिए डेटाबेस और यूज़र बनाएँ, पोर्ट 3306 खोले बिना अपने कंप्यूटर से उस तक पहुँचें, खाली हालत की मेमोरी 383 MB से 165 MB तक लाएँ, और हर रात ऐसी स्क्रिप्ट से बैकअप लें जो गड़बड़ होने पर साफ़ फ़ेल हो।

MySQL इंस्टॉल करना एक कमांड है। असली काम उसके बाद शुरू होता है: ऐप के लिए यूज़र, अपने कंप्यूटर से डेटाबेस तक पहुँचने का ऐसा तरीका जिसमें पोर्ट 3306 इंटरनेट पर न हो, छोटे सर्वर के लिए मेमोरी की सेटिंग, और ऐसे बैकअप जो आपके बिना चलते रहें। यह गाइड Ubuntu 24.04 पर चारों बातें कवर करती है। हर कदम हमारी Ubuntu 24.04 इमेज पर चलाया गया, और नीचे के आँकड़े उसी सर्वर से हैं।

कमांड sudo वाले यूज़र से चलाएँ। Ubuntu सेटअप गाइड एक बनाती है।

1. इंस्टॉल करें

sudo apt update
sudo apt install -y mysql-server
mysql --version

हमारे सर्वर पर इंस्टॉल में 51 सेकंड लगे और MySQL 8.0.46 आया। यह तुरंत चल पड़ता है, हर बूट पर फिर चलता है, और सिर्फ़ सर्वर पर ही सुनता है: सामान्य कनेक्शन के लिए 127.0.0.1:3306 और MySQL के नए X प्रोटोकॉल के लिए 127.0.0.1:33060। अभी बाहर से किसी चीज़ तक पहुँच नहीं है।

2. डेटाबेस और यूज़र बनाएँ

Ubuntu पर MySQL का root अकाउंट सॉकेट ऑथेंटिकेशन इस्तेमाल करता है, इसलिए sudo mysql आपको बिना पासवर्ड अंदर ले जाता है। अपने ऐप के लिए डेटाबेस और यूज़र बनाएँ:

sudo mysql
CREATE DATABASE app CHARACTER SET utf8mb4;
CREATE USER 'app'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'localhost';
EXIT;

उसी तरह जाँचें जैसे आपका ऐप जुड़ेगा:

mysql -u app -p app -e "SELECT CURRENT_USER();"

इसे app@localhost दिखाना चाहिए। गलत पासवर्ड पर यह आता है: ERROR 1045 (28000): Access denied for user 'app'@'localhost'। यूज़र app के अंदर सब कुछ कर सकता है और उसके बाहर कुछ नहीं।

3. अपने कंप्यूटर से जुड़ें: SSH टनल

अपनी मशीन पर DBeaver, MySQL Workbench या mysql कमांड लाइन जैसा डेस्कटॉप क्लाइंट इस्तेमाल करने के लिए कोई पोर्ट न खोलें। SSH के ज़रिए एक फ़ॉरवर्ड करें:

ssh -L 3307:127.0.0.1:3306 deploy@YOUR.SERVER.IP

NAT प्लान पर -p और डैशबोर्ड वाला निजी SSH पोर्ट जोड़ें। जब तक वह विंडो खुली है, क्लाइंट को होस्ट 127.0.0.1, पोर्ट 3307, यूज़र app पर लगाएँ। लोकल तरफ़ हमने 3307 लिया ताकि आपके कंप्यूटर पर शायद चल रहे MySQL से न टकराए। हमारे टेस्ट में सर्वर ने टनल से तुरंत जवाब दिया, जबकि उसके पते पर 3306 से सीधा कनेक्शन मना हो गया।

4. किसी एक दूसरे सर्वर के लिए सीधी पहुँच

कभी ऐप दूसरे सर्वर पर चलता है और उसे सीधे जुड़ना होता है। इसके लिए डेटाबेस को अपने IPv4 वाला प्लान चाहिए, क्योंकि NAT प्लान सिर्फ़ आपका SSH पोर्ट फ़ॉरवर्ड करता है। तीन बदलाव, सब ऐप सर्वर के पते (यहाँ 203.0.113.20) तक सीमित:

sudo sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp
CREATE USER 'app'@'203.0.113.20' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'203.0.113.20';

अगर ufw अभी चालू नहीं है, तो पहले SSH की अनुमति दें (sudo ufw allow OpenSSH) और फिर sudo ufw enable चलाएँ। ब्योरा ufw गाइड में है।

हमने दोनों ताले अलग-अलग जाँचे। फ़ायरवॉल का नियम था लेकिन मेल खाता MySQL यूज़र नहीं था, तब सर्वर ने error 1130: Host '…' is not allowed to connect to this MySQL server के साथ मना किया। यूज़र जोड़ने पर कनेक्शन हो गया। फ़ायरवॉल का नियम हटाने पर कनेक्शन बस टाइमआउट हो गया। इंटरनेट पर हर दूसरा पता यही टाइमआउट पाता है।

5. कम RAM इस्तेमाल करें

खाली हालत में, अपने किसी डेटा के बिना, MySQL 8.0 हमारे सर्वर पर 383 MB ले रहा था। इसका ज़्यादातर हिस्सा Performance Schema का है, जो एक डायग्नोस्टिक सुविधा है और मेमोरी पहले से रोक लेती है। छोटे VPS पर इसे बंद करें और मुख्य कैश का आकार ख़ुद तय करें:

sudo tee /etc/mysql/mysql.conf.d/zz-small-vps.cnf >/dev/null <<'EOF'
[mysqld]
performance_schema = OFF
innodb_buffer_pool_size = 256M
max_connections = 50
EOF
sudo systemctl restart mysql
ps -o rss= -C mysqld

रीस्टार्ट के बाद यह 165 MB ले रहा था। buffer pool आपके डेटा और इंडेक्स को कैश करता है, और 256 MB उस 2 GB सर्वर के लिए ठीक है जो ऐप भी चलाता हो। अगर डेटाबेस सर्वर का मुख्य काम है और कैश से बड़ा हो गया है, तो इसे बढ़ाएँ। max_connections = 50 कनेक्शन पूल वाले एक ऐप के लिए काफ़ी से ज़्यादा है। आप performance_schema के आँकड़े खो देते हैं। अगर कभी धीमी क्वेरी की बारीकी से जाँच करनी हो, तो इसे फिर चालू करें।

6. रात के बैकअप

mysqldump --single-transaction ऐप को रोके बिना InnoDB टेबल की एक सुसंगत कॉपी लेता है। इसे एक छोटी स्क्रिप्ट में रखें:

sudo tee /usr/local/bin/mysql-backup >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
umask 077
mkdir -p /var/backups/mysql
mysqldump --single-transaction --routines --triggers app | gzip > /var/backups/mysql/app-$(date +%F).sql.gz
find /var/backups/mysql -name 'app-*.sql.gz' -mtime +14 -delete
EOF
sudo chmod 755 /usr/local/bin/mysql-backup
echo '0 3 * * * root /usr/local/bin/mysql-backup' | sudo tee /etc/cron.d/mysql-backup
sudo /usr/local/bin/mysql-backup && sudo ls -l /var/backups/mysql

हर लाइन की एक वजह है:

  • umask 077 डंप को सिर्फ़ root के पढ़ने लायक बनाता है (-rw-------), क्योंकि उसमें आपका सारा डेटा है।
  • pipefail से अगर mysqldump फ़ेल हो तो पूरी स्क्रिप्ट फ़ेल होती है। इसके बिना gzip एक नन्हा ख़ाली आर्काइव लिखकर सफलता बता देता। हमने जानबूझकर कमांड तोड़ी, और स्क्रिप्ट ठीक वैसे ही कोड 2 के साथ ख़त्म हुई जैसा होना चाहिए।
  • find … -mtime +14 -delete दो हफ़्ते की कॉपी रखता है।
  • स्क्रिप्ट root के रूप में चलती है, इसलिए mysqldump सॉकेट से लॉग इन करता है और किसी फ़ाइल में पासवर्ड नहीं रखना पड़ता।

जिस बैकअप को आपने कभी रीस्टोर नहीं किया, वह अभी गिनती में नहीं आता। उसे एक अस्थायी डेटाबेस में रीस्टोर करें और डेटा देखें:

sudo mysql -e "CREATE DATABASE app_restore"
gunzip -c /var/backups/mysql/app-2026-10-25.sql.gz | sudo mysql app_restore
sudo mysql -e "SHOW TABLES FROM app_restore"
sudo mysql -e "DROP DATABASE app_restore"

हमारे टेस्ट में रीस्टोर हुई टेबल में वही पंक्तियाँ थीं जो मूल में थीं। उसी डिस्क पर रखी कॉपी सर्वर खोने पर आपको नहीं बचातीं, इसलिए समय-समय पर उन्हें scp या restic से किसी दूसरी मशीन पर ले जाएँ। Managed Backups इसके ऊपर पूरे सर्वर के रोज़ाना रीस्टोर पॉइंट जोड़ता है।

कौन-सा प्लान

Micro (2 vCPU, 2 GB, 25 GB, $5/महीना) ऊपर की तरह ट्यून किया MySQL और एक वेब ऐप सँभाल लेता है। अगर ख़ुद डेटाबेस कुछ गीगाबाइट से बड़ा हो जाए, तो 4 GB और 35 GB वाला Small $8/महीना में आपको buffer pool को 1 GB या ज़्यादा देने देता है। दोनों NAT प्लान हैं, और कदम 3 वाली SSH टनल उन पर चलती है। कदम 4 के लिए अपना IPv4 चाहिए: Micro-IP $10/महीना है।

PostgreSQL पसंद है? PostgreSQL गाइड इसी ढाँचे पर चलती है। सारे प्लान VPS में हैं, और भुगतान Base, Ethereum या Polygon नेटवर्क पर USDT, USDC या ETH में होता है।

सामान्य प्रश्न

MySQL या MariaDB?

दोनों Ubuntu 24.04 की अपनी रिपॉज़िटरी में हैं: mysql-server से MySQL 8.0 और mariadb-server से MariaDB 10.11 इंस्टॉल होता है। "MySQL" माँगने वाले ज़्यादातर ऐप दोनों के साथ चलते हैं। आपके ऐप के दस्तावेज़ में जो लिखा हो वह लें, और फ़र्क न पड़ता हो तो MySQL 8.0। यह गाइड MySQL इस्तेमाल करती है।

MySQL का root पासवर्ड क्या है?

कोई नहीं। Ubuntu पर MySQL का root अकाउंट सॉकेट ऑथेंटिकेशन इस्तेमाल करता है: sudo mysql आपको root के रूप में अंदर ले जाता है, और नेटवर्क से कोई root बनकर लॉग इन नहीं कर सकता। इसे ऐसे ही रहने दें और ऐप्स के लिए अलग यूज़र बनाएँ।

क्या पोर्ट 3306 इंटरनेट के लिए खोलूँ?

नहीं। खुले डेटाबेस पोर्ट लगातार स्कैन होते हैं और उन पर पासवर्ड आज़माए जाते हैं। अपने कंप्यूटर से SSH टनल के ज़रिए जुड़ें। अगर किसी दूसरे सर्वर को सीधे जुड़ना है, तो सिर्फ़ उसी का IP, MySQL और फ़ायरवॉल दोनों में, अनुमति दें।

MySQL को कितनी RAM चाहिए?

इंस्टॉल के तुरंत बाद MySQL 8.0 हमारे टेस्ट सर्वर पर बिना अपने किसी डेटाबेस के 383 MB ले रहा था। Performance Schema बंद करके और सामान्य buffer pool रखकर यह 165 MB पर आ गया। 2 GB वाला Micro प्लान MySQL और एक ऐप आराम से चलाता है; इस ट्यूनिंग के बाद छोटी साइट के लिए 1 GB भी काफ़ी है।

क्या mysql_secure_installation चलाना ज़रूरी है?

Ubuntu 24.04 पर इसका ज़्यादातर काम पहले से हो चुका होता है। हमारे नए इंस्टॉल में न कोई अनाम यूज़र था, न टेस्ट डेटाबेस, और root सिर्फ़ लोकल सॉकेट से लॉग इन कर सकता है। अगर आपको इसका पासवर्ड की मज़बूती जाँचने वाला हिस्सा चाहिए तो चलाएँ, वरना छोड़ सकते हैं।

टिप्पणियाँ

अभी तक कोई टिप्पणी नहीं। पहले बनें।

एक टिप्पणी छोड़ें

टिप्पणियाँ दिखने से पहले मॉडरेट की जाती हैं।