MySQL'i kurmak tek bir komut. Asıl iş sonrasında başlar: bir uygulama kullanıcısı, 3306 portunu internete açmadan bilgisayarınızdan veritabanına ulaşmanın bir yolu, küçük bir sunucu için bellek ayarları ve sizsiz çalışan yedekler. Bu rehber Ubuntu 24.04'te dördünü de ele alıyor. Her adım Ubuntu 24.04 imajımızda çalıştırıldı ve aşağıdaki rakamlar o sunucudan.
Komutları sudo yetkili bir kullanıcıyla çalıştırın. Ubuntu kurulum rehberi bir tane oluşturur.
1. Kurun
sudo apt update
sudo apt install -y mysql-server
mysql --version
Kurulum sunucumuzda 51 saniye sürdü ve MySQL 8.0.46'yı getirdi. Hemen başlar, her açılışta yeniden başlar ve yalnızca sunucunun kendisinde dinler: normal bağlantılar için 127.0.0.1:3306, MySQL'in daha yeni X protokolü için 127.0.0.1:33060. Dışarıdan henüz hiçbir şeye erişilemez.
2. Bir veritabanı ve kullanıcı oluşturun
Ubuntu'da MySQL'in root hesabı soket kimlik doğrulaması kullanır, bu yüzden sudo mysql sizi parolasız sokar. Uygulamanız için bir veritabanı ve kullanıcı oluşturun:
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;
Uygulamanın bağlanacağı şekilde test edin:
mysql -u app -p app -e "SELECT CURRENT_USER();"
app@localhost yazmalı. Yanlış bir parola ERROR 1045 (28000): Access denied for user 'app'@'localhost' alır. Kullanıcı app içinde her şeyi yapabilir, dışında hiçbir şeyi.
3. Bilgisayarınızdan bağlanın: SSH tüneli
Kendi makinenizde DBeaver, MySQL Workbench ya da mysql komut satırı gibi bir masaüstü istemcisi kullanmak için port açmayın. SSH üzerinden bir tane yönlendirin:
ssh -L 3307:127.0.0.1:3306 deploy@YOUR.SERVER.IP
NAT paketinde -p ve paneldeki kişisel SSH portunu ekleyin. O pencere açıkken istemcinizi 127.0.0.1 sunucusuna, 3307 portuna, app kullanıcısına yönlendirin. Yerel tarafta 3307 kullandık ki bilgisayarınızda çalışıyor olabilecek bir MySQL ile çakışmasın. Testimizde sunucu tünel üzerinden hemen yanıt verdi, adresine 3306'dan doğrudan bağlantı ise reddedildi.
4. Başka bir sunucu için doğrudan erişim
Bazen uygulama ikinci bir sunucuda çalışır ve doğrudan bağlanması gerekir. Bunun için veritabanının kendi IPv4'ü olan bir pakete ihtiyacı vardır, çünkü NAT paketi yalnızca SSH portunuzu yönlendirir. Hepsi uygulama sunucusunun adresiyle (burada 203.0.113.20) sınırlı üç değişiklik:
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 henüz etkin değilse önce SSH'ye izin verin (sudo ufw allow OpenSSH), sonra sudo ufw enable çalıştırın. Ayrıntılar ufw rehberinde.
İki kilidi ayrı ayrı kontrol ettik. Güvenlik duvarı kuralı varken ama eşleşen bir MySQL kullanıcısı yokken sunucu error 1130: Host '…' is not allowed to connect to this MySQL server ile reddetti. Kullanıcı eklenince bağlantı geçti. Güvenlik duvarı kuralı kaldırılınca bağlantı yalnızca zaman aşımına uğradı. İnternetteki diğer her adres de aynı zaman aşımını alır.
5. Daha az RAM kullanın
Boştayken, kendi verisi olmadan, MySQL 8.0 sunucumuzda 383 MB kullandı. Bunun çoğu Performance Schema'dan gelir; belleği baştan ayıran bir tanılama özelliği. Küçük bir VPS'te onu kapatın ve ana önbelleğin boyutunu kendiniz belirleyin:
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
Yeniden başlatmanın ardından 165 MB kullandı. Buffer pool verilerinizi ve indekslerinizi önbelleğe alır; 256 MB, uygulamayı da çalıştıran 2 GB'lık bir sunucuya uyar. Veritabanı sunucudaki asıl iş ise ve önbellekten büyümüşse artırın. max_connections = 50, bağlantı havuzu olan tek bir uygulama için fazlasıyla yeterli. performance_schema istatistiklerini kaybedersiniz. Yavaş sorguları ayrıntılı incelemeniz gerekirse yeniden açın.
6. Gece yedekleri
mysqldump --single-transaction, uygulamayı kilitlemeden InnoDB tablolarının tutarlı bir kopyasını alır. Bunu küçük bir betiğe koyun:
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
Her satırın bir nedeni var:
umask 077dökümü yalnızca root'un okuyabileceği hâle getirir (-rw-------), çünkü tüm verilerinizi içerir.pipefail,mysqldumpbaşarısız olursa betiğin tamamını başarısız sayar. Bu olmadangzipminicik boş bir arşiv yazar ve başarı bildirirdi. Komutu bilerek bozduk ve betik olması gerektiği gibi 2 koduyla çıktı.find … -mtime +14 -deleteiki haftalık kopya tutar.- Betik root olarak çalışır, bu yüzden
mysqldumpsoket üzerinden girer ve hiçbir dosyada parola durmaz.
Hiç geri yüklemediğiniz bir yedek henüz sayılmaz. Geçici bir veritabanına geri yükleyin ve verilere bakın:
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"
Testimizde geri yüklenen tablo, orijinaldeki satırların aynısını içeriyordu. Aynı diskteki kopyalar sunucuyu kaybederseniz sizi korumaz; bu yüzden onları arada bir scp ya da restic ile başka bir makineye alın. Managed Backups bunun üstüne tüm sunucunun günlük geri yükleme noktalarını ekler.
Hangi paket
Micro (2 vCPU, 2 GB, 25 GB, ayda $5), yukarıdaki gibi ayarlanmış MySQL'i ve bir web uygulamasını taşır. Veritabanının kendisi birkaç gigabaytı geçerse ayda $8'a 4 GB ve 35 GB sunan Small ile buffer pool'a 1 GB veya daha fazla verebilirsiniz. İkisi de NAT paketi ve 3. adımdaki SSH tüneli onlarda çalışır. 4. adım için kendi IPv4'ünüz gerekir: Micro-IP ayda $10'dır.
PostgreSQL mi tercih ediyorsunuz? PostgreSQL rehberi aynı planı izler. Tüm paketler VPS bölümünde; ödeme Base, Ethereum veya Polygon ağlarında USDT, USDC veya ETH ile yapılır.
Yorumlar
Henüz yorum yok. İlk olun.