EQVPS
KontrollpanelKom igång

Så installerar du MySQL på en VPS: användare, säker fjärråtkomst, mindre RAM och säkerhetskopior

Installera MySQL 8.0 på en Ubuntu 24.04-VPS, skapa en databas och en appanvändare, nå den från din dator utan att öppna port 3306, sänk minnet i vila från 383 MB till 165 MB och säkerhetskopiera varje natt med ett skript som säger ifrån högt när det går fel.

Att installera MySQL tar ett kommando. Det mesta arbetet kommer efteråt: en appanvändare, ett sätt att nå databasen från din dator utan att lägga port 3306 på internet, minnesinställningar för en liten server och säkerhetskopior som går utan dig. Den här guiden tar upp alla fyra på Ubuntu 24.04. Varje steg kördes på vår Ubuntu 24.04-avbild, och siffrorna nedan kommer från den servern.

Kör kommandona som en användare med sudo. Guiden för att sätta upp Ubuntu skapar en.

1. Installera

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

Installationen tog 51 sekunder på vår server och gav oss MySQL 8.0.46. Den startar direkt, startar igen vid varje uppstart och lyssnar bara på servern själv: 127.0.0.1:3306 för vanliga anslutningar och 127.0.0.1:33060 för MySQL:s nyare X-protokoll. Inget går att nå utifrån än.

2. Skapa en databas och en användare

MySQL:s root-konto använder socket-autentisering på Ubuntu, så sudo mysql loggar in dig utan lösenord. Skapa en databas och en användare för 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;

Testa på samma sätt som appen kommer att ansluta:

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

Det ska skriva ut app@localhost. Ett fel lösenord ger ERROR 1045 (28000): Access denied for user 'app'@'localhost'. Användaren får göra allt inom app och inget utanför.

3. Anslut från din dator: SSH-tunnel

För att använda en skrivbordsklient som DBeaver, MySQL Workbench eller kommandoraden mysql på din egen dator öppnar du ingen port. Vidarebefordra en över SSH:

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

På en NAT-plan lägger du till -p och den personliga SSH-porten från kontrollpanelen. Så länge fönstret är öppet pekar du klienten mot värden 127.0.0.1, port 3307, användare app. Lokalt valde vi 3307 så att det inte krockar med en MySQL du kanske kör på din dator. I vårt test svarade servern direkt genom tunneln, medan en direktanslutning till dess adress på 3306 nekades.

4. Direkt åtkomst för en annan server

Ibland körs appen på en andra server och måste ansluta direkt. Då behöver databasen en plan med egen IPv4, eftersom en NAT-plan bara vidarebefordrar din SSH-port. Tre ändringar, alla begränsade till appserverns adress (här 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';

Om ufw inte är aktiverat än tillåter du SSH först (sudo ufw allow OpenSSH) och kör sedan sudo ufw enable. ufw-guiden har detaljerna.

Vi kontrollerade båda låsen var för sig. Med brandväggsregeln på plats men utan matchande MySQL-användare nekade servern med error 1130: Host '…' is not allowed to connect to this MySQL server. Med användaren tillagd gick anslutningen igenom. Utan brandväggsregeln fick anslutningen bara en timeout. Alla andra adresser på internet får samma timeout.

5. Använd mindre RAM

I vila, utan egen data, använde MySQL 8.0 383 MB på vår server. Det mesta är Performance Schema, en diagnosfunktion som reserverar minne i förväg. På en liten VPS stänger du av den och bestämmer själv storleken på huvudcachen:

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 omstarten använde den 165 MB. Buffer pool cachar dina data och index, och 256 MB passar en server med 2 GB som också kör appen. Höj den om databasen är det viktigaste på servern och har vuxit sig större än cachen. max_connections = 50 räcker gott för en app med anslutningspool. Du förlorar statistiken i performance_schema. Slå på den igen om du någon gång behöver gräva i långsamma frågor i detalj.

6. Nattliga säkerhetskopior

mysqldump --single-transaction tar en konsekvent kopia av InnoDB-tabeller utan att låsa ute appen. Lägg den i ett litet skript:

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

Varje rad finns där av en anledning:

  • umask 077 gör dumpen läsbar bara för root (-rw-------), eftersom den innehåller all din data.
  • pipefail får hela skriptet att misslyckas om mysqldump misslyckas. Utan det skulle gzip skriva ett pyttelitet tomt arkiv och rapportera att allt gick bra. Vi förstörde kommandot med flit, och skriptet avslutades med kod 2, som det ska.
  • find … -mtime +14 -delete sparar två veckors kopior.
  • Skriptet körs som root, så mysqldump loggar in via socketen och inget lösenord ligger i någon fil.

En säkerhetskopia du aldrig har återställt räknas inte än. Återställ den till en tillfällig databas och titta på datan:

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 vårt test hade den återställda tabellen samma rader som originalet. Kopior på samma disk skyddar dig inte om du förlorar servern, så hämta dem till en annan maskin då och då med scp eller restic. Managed Backups lägger dessutom till dagliga återställningspunkter för hela servern.

Vilken plan

Micro (2 vCPU, 2 GB, 25 GB, $5/mån) rymmer MySQL inställt som ovan plus en webbapp. Om själva databasen växer förbi några gigabyte låter Small med 4 GB och 35 GB för $8/mån dig ge buffer pool 1 GB eller mer. Båda är NAT-planer, och SSH-tunneln från steg 3 fungerar på dem. Steg 4 kräver egen IPv4: Micro-IP kostar $10/mån.

Föredrar du PostgreSQL? PostgreSQL-guiden följer samma upplägg. Alla planer finns under VPS, och betalning sker i USDT, USDC eller ETH på Base, Ethereum eller Polygon.

FAQ

MySQL eller MariaDB?

Båda finns i Ubuntu 24.04:s egna paketförråd: mysql-server installerar MySQL 8.0 och mariadb-server installerar MariaDB 10.11. De flesta appar som kräver "MySQL" fungerar med båda. Välj det som appens dokumentation anger, och MySQL 8.0 om det inte spelar någon roll. Den här guiden använder MySQL.

Vad är root-lösenordet i MySQL?

Det finns inget. På Ubuntu använder MySQL:s root-konto socket-autentisering: sudo mysql loggar in dig som root, och ingen kan logga in som root över nätverket. Låt det vara så och skapa separata användare för dina appar.

Ska jag öppna port 3306 mot internet?

Nej. Öppna databasportar skannas och utsätts för lösenordsgissningar hela tiden. Anslut från din dator genom en SSH-tunnel. Om en annan server måste ansluta direkt, tillåt bara den serverns IP, både i MySQL och i brandväggen.

Hur mycket RAM behöver MySQL?

Direkt efter installationen använde MySQL 8.0 383 MB på vår testserver, utan egna databaser. Med Performance Schema avstängt och en blygsam buffer pool blev det 165 MB. Micro-planen med 2 GB kör MySQL och en app utan problem; efter den justeringen räcker 1 GB för en liten webbplats.

Behöver jag köra mysql_secure_installation?

På Ubuntu 24.04 är det mesta av dess arbete redan gjort. Vår nya installation hade inga anonyma användare och ingen testdatabas, och root kan bara logga in via den lokala socketen. Kör det om du vill ha komponenten för lösenordsstyrka som det erbjuder; annars kan du hoppa över det.

Kommentarer

Inga kommentarer än. Bli först.

Lämna en kommentar

Kommentarer modereras innan de visas.