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 में होता है।
टिप्पणियाँ
अभी तक कोई टिप्पणी नहीं। पहले बनें।