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 077gør dumpet læsbart kun for root (-rw-------), fordi det indeholder alle dine data.pipefailfår hele scriptet til at fejle, hvismysqldumpfejler. Uden det villegzipskrive et bitte tomt arkiv og melde succes. Vi ødelagde kommandoen med vilje, og scriptet sluttede med kode 2, som det skal.find … -mtime +14 -deletegemmer to ugers kopier.- Scriptet kører som root, så
mysqldumplogger 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.
Kommentarer
Ingen kommentarer endnu. Vær den første.