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 اور ایک ویب ایپ سنبھال لیتا ہے۔ اگر خود ڈیٹا بیس چند گیگا بائٹ سے بڑھ جائے تو 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 میں ہوتی ہے۔

عمومی سوالات

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 صرف لوکل ساکٹ سے لاگ اِن کر سکتا ہے۔ اگر آپ کو اس کا پاس ورڈ کی مضبوطی جانچنے والا حصہ چاہیے تو چلائیں، ورنہ چھوڑ سکتے ہیں۔

تبصرے

ابھی کوئی تبصرہ نہیں۔ پہلے بنیں۔

ایک تبصرہ چھوڑیں

تبصرے ظاہر ہونے سے پہلے moderate کیے جاتے ہیں۔