EQVPS
DashboardKom i gang

Sådan installerer du MySQL på en VPS: brugere, sikker fjernadgang, mindre RAM og backup

Installér MySQL 8.0 på en Ubuntu 24.04-VPS, opret en database og en app-bruger, nå den fra din computer uden at åbne port 3306, sænk hukommelsen i tomgang fra 383 MB til 165 MB, og tag backup hver nat med et script, der siger højt fra, når det fejler.

At installere MySQL er én kommando. Det meste arbejde kommer bagefter: en app-bruger, en måde at nå databasen fra din computer på uden at lægge port 3306 ud på internettet, hukommelsesindstillinger til en lille server og backups, der kører uden dig. Denne guide dækker alle fire på Ubuntu 24.04. Hvert trin er kørt på vores Ubuntu 24.04-image, og tallene nedenfor kommer fra den server.

Kør kommandoerne som en bruger med sudo. Guiden til opsætning af Ubuntu opretter en.

1. Installér

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

Installationen tog 51 sekunder på vores server og gav os MySQL 8.0.46. Den starter med det samme, starter igen ved hver opstart og lytter kun på selve serveren: 127.0.0.1:3306 til almindelige forbindelser og 127.0.0.1:33060 til MySQL's nyere X-protokol. Intet kan nås udefra endnu.

2. Opret en database og en bruger

MySQL's root-konto bruger socket-godkendelse på Ubuntu, så sudo mysql logger dig ind uden adgangskode. Opret en database og en bruger til din app:

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;

Test det på samme måde, som appen vil forbinde:

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

Det skal udskrive app@localhost. En forkert adgangskode giver ERROR 1045 (28000): Access denied for user 'app'@'localhost'. Brugeren må alt inde i app og intet uden for den.

3. Forbind fra din computer: SSH-tunnel

Vil du bruge en desktopklient som DBeaver, MySQL Workbench eller kommandolinjen mysql på din egen maskine, så åbn ingen port. Videresend en over SSH:

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

På en NAT-plan tilføjer du -p og den personlige SSH-port fra kontrolpanelet. Mens vinduet er åbent, peger du klienten på værten 127.0.0.1, port 3307, bruger app. Lokalt brugte vi 3307, så det ikke støder sammen med en MySQL, du måske kører på din computer. I vores test svarede serveren straks gennem tunnellen, mens en direkte forbindelse til dens adresse på 3306 blev afvist.

4. Direkte adgang for én anden server

Nogle gange kører appen på en anden server og skal forbinde direkte. Så skal databasen have en plan med egen IPv4, fordi en NAT-plan kun videresender din SSH-port. Tre ændringer, alle begrænset til app-serverens adresse (her 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';

Er ufw ikke slået til endnu, så tillad først SSH (sudo ufw allow OpenSSH) og kør derefter sudo ufw enable. ufw-guiden har detaljerne.

Vi tjekkede begge låse hver for sig. Med firewallreglen på plads, men uden en matchende MySQL-bruger, afviste serveren med error 1130: Host '…' is not allowed to connect to this MySQL server. Med brugeren tilføjet gik forbindelsen igennem. Uden firewallreglen fik forbindelsen bare timeout. Enhver anden adresse på internettet får den samme timeout.

5. Brug mindre RAM

I tomgang, uden egne data, brugte MySQL 8.0 383 MB på vores server. Det meste er Performance Schema, en diagnosefunktion, der reserverer hukommelse på forhånd. På en lille VPS slår du den fra og fastsætter selv størrelsen på hovedcachen:

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

Efter genstarten brugte den 165 MB. Buffer poolen cacher dine data og indeks, og 256 MB passer til en server med 2 GB, der også kører appen. Skru op for den, hvis databasen er det vigtigste på serveren og er vokset sig større end cachen. max_connections = 50 er rigeligt til én app med en forbindelsespulje. Du mister statistikken i performance_schema. Slå den til igen, hvis du en dag skal grave i langsomme forespørgsler i detaljer.

6. Natlige backups

mysqldump --single-transaction tager en konsistent kopi af InnoDB-tabeller uden at låse appen ude. Læg den i et lille 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

Hver linje er der af en grund:

  • umask 077 gør dumpet læsbart kun for root (-rw-------), fordi det indeholder alle dine data.
  • pipefail får hele scriptet til at fejle, hvis mysqldump fejler. Uden det ville gzip skrive et bitte tomt arkiv og melde succes. Vi ødelagde kommandoen med vilje, og scriptet sluttede med kode 2, som det skal.
  • find … -mtime +14 -delete gemmer to ugers kopier.
  • Scriptet kører som root, så mysqldump logger ind via socketen, og der ligger ingen adgangskode i en fil.

En backup, du aldrig har gendannet, tæller ikke endnu. Gendan den til en midlertidig database, og se på dataene:

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"

I vores test havde den gendannede tabel de samme rækker som originalen. Kopier på samme disk beskytter dig ikke, hvis du mister serveren, så hent dem af og til over på en anden maskine med scp eller restic. Managed Backups lægger daglige gendannelsespunkter af hele serveren oveni.

Hvilken plan

Micro (2 vCPU, 2 GB, 25 GB, $5/md.) rummer MySQL indstillet som ovenfor plus en webapp. Vokser selve databasen ud over et par gigabyte, lader Small med 4 GB og 35 GB til $8/md. dig give buffer poolen 1 GB eller mere. Begge er NAT-planer, og SSH-tunnellen fra trin 3 virker på dem. Trin 4 kræver egen IPv4: Micro-IP koster $10/md.

Foretrækker du PostgreSQL? PostgreSQL-guiden følger samme plan. Alle planer findes under VPS, og betaling sker i USDT, USDC eller ETH på Base, Ethereum eller Polygon.

FAQ

MySQL eller MariaDB?

Begge ligger i Ubuntu 24.04's egne pakkearkiver: mysql-server installerer MySQL 8.0, og mariadb-server installerer MariaDB 10.11. De fleste apps, der beder om "MySQL", virker med begge. Brug det, din apps dokumentation nævner, og MySQL 8.0, hvis det er ligegyldigt. Denne guide bruger MySQL.

Hvad er MySQL's root-adgangskode?

Der er ingen. På Ubuntu bruger MySQL's root-konto socket-godkendelse: sudo mysql logger dig ind som root, og ingen kan logge ind som root over netværket. Lad det være sådan, og opret separate brugere til dine apps.

Skal jeg åbne port 3306 mod internettet?

Nej. Åbne databaseporte bliver hele tiden scannet og ramt af gæt på adgangskoder. Forbind fra din computer gennem en SSH-tunnel. Hvis en anden server skal forbinde direkte, så tillad kun den servers IP, både i MySQL og i firewallen.

Hvor meget RAM skal MySQL bruge?

Lige efter installationen brugte MySQL 8.0 383 MB på vores testserver uden egne databaser. Med Performance Schema slået fra og en beskeden buffer pool kom det ned på 165 MB. Micro-planen med 2 GB kører MySQL og en app uden besvær; efter den justering er 1 GB nok til et lille website.

Skal jeg køre mysql_secure_installation?

På Ubuntu 24.04 er det meste af dets arbejde allerede gjort. Vores nye installation havde ingen anonyme brugere og ingen testdatabase, og root kan kun logge ind via den lokale socket. Kør det, hvis du vil have den komponent til adgangskodestyrke, det tilbyder; ellers kan du springe det over.

Kommentarer

Ingen kommentarer endnu. Vær den første.

Skriv en kommentar

Kommentarer modereres, før de vises.