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 077gör dumpen läsbar bara för root (-rw-------), eftersom den innehåller all din data.pipefailfår hela skriptet att misslyckas ommysqldumpmisslyckas. Utan det skullegzipskriva 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 -deletesparar två veckors kopior.- Skriptet körs som root, så
mysqldumploggar 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.
Kommentarer
Inga kommentarer än. Bli först.