EQVPS

Πώς να εγκαταστήσετε MySQL σε VPS: χρήστες, ασφαλής απομακρυσμένη πρόσβαση, λιγότερη RAM και αντίγραφα ασφαλείας

Εγκαταστήστε MySQL 8.0 σε VPS με Ubuntu 24.04, δημιουργήστε βάση και χρήστη για την εφαρμογή, συνδεθείτε από τον υπολογιστή σας χωρίς να ανοίξετε τη θύρα 3306, μειώστε τη μνήμη σε αδράνεια από 383 MB σε 165 MB και κρατάτε αντίγραφο κάθε νύχτα με script που αποτυγχάνει φανερά.

Η εγκατάσταση της MySQL είναι μία εντολή. Η περισσότερη δουλειά έρχεται μετά: χρήστης για την εφαρμογή, τρόπος να φτάνετε στη βάση από τον υπολογιστή σας χωρίς να βγάλετε τη θύρα 3306 στο internet, ρυθμίσεις μνήμης για μικρό server και αντίγραφα ασφαλείας που τρέχουν χωρίς εσάς. Αυτός ο οδηγός καλύπτει και τα τέσσερα στο Ubuntu 24.04. Κάθε βήμα εκτελέστηκε στο image μας με Ubuntu 24.04, και οι αριθμοί παρακάτω προέρχονται από αυτόν τον server.

Εκτελέστε τις εντολές ως χρήστης με sudo. Ο οδηγός ρύθμισης του Ubuntu δημιουργεί έναν.

1. Εγκατάσταση

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

Η εγκατάσταση κράτησε 51 δευτερόλεπτα στον server μας και έδωσε MySQL 8.0.46. Ξεκινά αμέσως, ξαναξεκινά σε κάθε εκκίνηση και ακούει μόνο στον ίδιο τον server: 127.0.0.1:3306 για τις κανονικές συνδέσεις και 127.0.0.1:33060 για το νεότερο πρωτόκολλο X της MySQL. Από έξω δεν φτάνει κανείς πουθενά ακόμη.

2. Δημιουργήστε βάση και χρήστη

Ο λογαριασμός root της MySQL χρησιμοποιεί στο Ubuntu πιστοποίηση μέσω socket, οπότε το 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 tunnel

Για να χρησιμοποιήσετε desktop client όπως DBeaver, MySQL Workbench ή τη γραμμή εντολών mysql στο μηχάνημά σας, μην ανοίξετε θύρα. Προωθήστε μία μέσω SSH:

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

Σε πακέτο NAT προσθέστε -p και την προσωπική θύρα SSH από τον πίνακα ελέγχου. Όσο αυτό το παράθυρο είναι ανοιχτό, στρέψτε τον client στον host 127.0.0.1, θύρα 3307, χρήστης app. Στην τοπική πλευρά βάλαμε 3307 ώστε να μη συγκρούεται με MySQL που ίσως τρέχετε στον υπολογιστή σας. Στη δοκιμή μας ο server απάντησε αμέσως μέσω του tunnel, ενώ μια απευθείας σύνδεση στη διεύθυνσή του στην 3306 απορρίφθηκε.

4. Απευθείας πρόσβαση για έναν άλλο server

Μερικές φορές η εφαρμογή τρέχει σε δεύτερο server και πρέπει να συνδέεται απευθείας. Γι' αυτό η βάση χρειάζεται πακέτο με δική του IPv4, επειδή ένα πακέτο NAT προωθεί μόνο τη θύρα SSH σας. Τρεις αλλαγές, όλες περιορισμένες στη διεύθυνση του server της εφαρμογής (εδώ 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, ο server αρνήθηκε με error 1130: Host '…' is not allowed to connect to this MySQL server. Με τον χρήστη προστεθειμένο, η σύνδεση πέρασε. Χωρίς τον κανόνα στο τείχος, η σύνδεση απλώς έληξε λόγω χρόνου. Οποιαδήποτε άλλη διεύθυνση στο internet παίρνει την ίδια λήξη χρόνου.

5. Λιγότερη RAM

Σε αδράνεια, χωρίς δικά της δεδομένα, η MySQL 8.0 χρησιμοποιούσε 383 MB στον server μας. Το μεγαλύτερο μέρος είναι το Performance Schema, μια λειτουργία διάγνωσης που δεσμεύει μνήμη από πριν. Σε μικρό VPS απενεργοποιήστε το και ορίστε μόνοι σας το μέγεθος της κύριας cache:

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 κρατά στην cache τα δεδομένα και τα ευρετήριά σας, και τα 256 MB ταιριάζουν σε server 2 GB που τρέχει και την εφαρμογή. Αυξήστε το αν η βάση είναι το κύριο πράγμα στον server και έχει μεγαλώσει πέρα από την cache. Το max_connections = 50 αρκεί άνετα για μία εφαρμογή με connection pool. Χάνετε τα στατιστικά του performance_schema. Ενεργοποιήστε το ξανά αν ποτέ χρειαστεί να ψάξετε λεπτομερώς αργά ερωτήματα.

6. Νυχτερινά αντίγραφα

Το mysqldump --single-transaction παίρνει συνεπές αντίγραφο των πινάκων InnoDB χωρίς να κλειδώνει έξω την εφαρμογή. Βάλτε το σε ένα μικρό script:

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 κάνει το dump αναγνώσιμο μόνο από τον root (-rw-------), αφού περιέχει όλα σας τα δεδομένα.
  • Το pipefail κάνει όλο το script να αποτύχει αν αποτύχει το mysqldump. Χωρίς αυτό, το gzip θα έγραφε ένα μικροσκοπικό άδειο αρχείο και θα ανέφερε επιτυχία. Χαλάσαμε την εντολή επίτηδες και το script τερμάτισε με κωδικό 2, όπως πρέπει.
  • Το find … -mtime +14 -delete κρατά αντίγραφα δύο εβδομάδων.
  • Το script τρέχει ως root, οπότε το mysqldump συνδέεται μέσω socket και κανένας κωδικός δεν βρίσκεται σε αρχείο.

Ένα αντίγραφο που δεν έχετε επαναφέρει ποτέ δεν μετράει ακόμη. Επαναφέρετέ το σε μια προσωρινή βάση και δείτε τα δεδομένα:

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"

Στη δοκιμή μας ο πίνακας που επαναφέρθηκε είχε τις ίδιες γραμμές με τον αρχικό. Τα αντίγραφα στον ίδιο δίσκο δεν σας προστατεύουν αν χάσετε τον server, οπότε μεταφέρετέ τα κατά καιρούς σε άλλο μηχάνημα με scp ή restic. Το Managed Backups προσθέτει από πάνω καθημερινά σημεία επαναφοράς ολόκληρου του server.

Ποιο πακέτο

Το Micro (2 vCPU, 2 GB, 25 GB, $5/μήνα) σηκώνει τη MySQL ρυθμισμένη όπως παραπάνω συν μια web εφαρμογή. Αν η ίδια η βάση ξεπεράσει μερικά gigabytes, το Small με 4 GB και 35 GB για $8/μήνα σας επιτρέπει να δώσετε στο buffer pool 1 GB ή περισσότερο. Και τα δύο είναι πακέτα NAT, και το SSH tunnel του βήματος 3 λειτουργεί σε αυτά. Το βήμα 4 χρειάζεται δική σας IPv4: το Micro-IP κοστίζει $10/μήνα.

Προτιμάτε PostgreSQL; Ο οδηγός για PostgreSQL ακολουθεί το ίδιο σχέδιο. Όλα τα πακέτα βρίσκονται στην ενότητα VPS, και η πληρωμή γίνεται σε USDT, USDC ή ETH στα δίκτυα Base, Ethereum ή Polygon.

Συχνές ερωτήσεις

MySQL ή MariaDB;

Και τα δύο υπάρχουν στα αποθετήρια του ίδιου του Ubuntu 24.04: το mysql-server εγκαθιστά MySQL 8.0 και το mariadb-server εγκαθιστά MariaDB 10.11. Οι περισσότερες εφαρμογές που ζητούν «MySQL» δουλεύουν με οποιοδήποτε. Χρησιμοποιήστε ό,τι αναφέρει η τεκμηρίωση της εφαρμογής σας, και MySQL 8.0 αν δεν έχει σημασία. Αυτός ο οδηγός χρησιμοποιεί MySQL.

Ποιος είναι ο κωδικός του root στη MySQL;

Δεν υπάρχει. Στο Ubuntu ο λογαριασμός root της MySQL χρησιμοποιεί πιστοποίηση μέσω socket: το sudo mysql σας συνδέει ως root, και κανείς δεν μπορεί να συνδεθεί ως root μέσω δικτύου. Αφήστε το έτσι και φτιάξτε ξεχωριστούς χρήστες για τις εφαρμογές σας.

Να ανοίξω τη θύρα 3306 στο internet;

Όχι. Οι ανοιχτές θύρες βάσεων δεδομένων σαρώνονται και δέχονται δοκιμές κωδικών συνεχώς. Από τον υπολογιστή σας συνδεθείτε μέσω SSH tunnel. Αν άλλος server πρέπει να συνδέεται απευθείας, επιτρέψτε μόνο τη δική του IP, και στη MySQL και στο τείχος προστασίας.

Πόση RAM χρειάζεται η MySQL;

Αμέσως μετά την εγκατάσταση, η MySQL 8.0 χρησιμοποιούσε 383 MB στον δοκιμαστικό μας server χωρίς δικές της βάσεις. Με το Performance Schema απενεργοποιημένο και μέτριο buffer pool έπεσε στα 165 MB. Το πακέτο Micro με 2 GB τρέχει άνετα MySQL και μια εφαρμογή· μετά από αυτή τη ρύθμιση, 1 GB αρκεί για ένα μικρό site.

Χρειάζεται να τρέξω το mysql_secure_installation;

Στο Ubuntu 24.04 το μεγαλύτερο μέρος της δουλειάς του έχει ήδη γίνει. Η νέα μας εγκατάσταση δεν είχε ανώνυμους χρήστες ούτε δοκιμαστική βάση, και ο root μπορεί να συνδεθεί μόνο μέσω του τοπικού socket. Τρέξτε το αν θέλετε το εξάρτημα ελέγχου ισχύος κωδικών που προσφέρει· αλλιώς μπορείτε να το παραλείψετε.

Σχόλια

Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.

Αφήστε ένα σχόλιο

Τα σχόλια ελέγχονται πριν εμφανιστούν.