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 اور ایک ویب ایپ سنبھال لیتا ہے۔ اگر خود ڈیٹا بیس چند گیگا بائٹ سے بڑھ جائے تو Small، جس میں 4 GB اور 35 GB ہیں، $8 ماہانہ میں آپ کو buffer pool کو 1 GB یا زیادہ دینے دیتا ہے۔ دونوں NAT پلان ہیں، اور قدم 3 والی SSH ٹنل ان پر چلتی ہے۔ قدم 4 کے لیے اپنا IPv4 چاہیے: Micro-IP $10 ماہانہ ہے۔
PostgreSQL پسند ہے؟ PostgreSQL گائیڈ اسی خاکے پر چلتی ہے۔ سارے پلان VPS میں ہیں، اور ادائیگی Base، Ethereum یا Polygon نیٹ ورکس پر USDT، USDC یا ETH میں ہوتی ہے۔
تبصرے
ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔