MySQL Kurulum ve Temel Yapılandırma Rehberi

Veritabanı yönetimi denince akla ilk gelen isimlerden biri MySQL. Onlarca yıldır web uygulamalarının, e-ticaret sitelerinin ve kurumsal sistemlerin arkasında çalışan bu savaşçı, doğru yapılandırılmadığında hem performans hem güvenlik açısından ciddi sorunlara yol açabiliyor. Bu rehberde MySQL’i sıfırdan kurarak, güvenli ve performanslı bir şekilde yapılandırmayı adım adım ele alacağız. Hem Ubuntu/Debian hem de RHEL/CentOS tabanlı sistemleri kapsayacak şekilde ilerleyeceğiz.

Kurulum Öncesi Hazırlık

Kuruluma geçmeden önce sistemin hazır olduğundan emin olmamız gerekiyor. Önce mevcut paketleri güncelleyelim ve gereksiz eski MySQL kalıntıları varsa temizleyelim.

# Ubuntu/Debian için sistem güncellemesi
sudo apt update && sudo apt upgrade -y

# RHEL/CentOS/Rocky Linux için
sudo dnf update -y

# Eski MySQL kalıntılarını kontrol et
rpm -qa | grep -i mysql
dpkg -l | grep -i mysql

Sisteminizde eski bir MySQL sürümü varsa önce bunları temizlemek önemli. Karışık sürümler ciddi sorunlara neden olur.

# Ubuntu üzerinde eski MySQL'i temizleme
sudo apt purge mysql-server mysql-client mysql-common -y
sudo apt autoremove -y
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql

Disk alanını da kontrol edin. Prodüksiyon ortamında veri dizini için ayrı bir disk bölümü kullanmak hem yönetimi kolaylaştırır hem de sistem diskinin dolmasını engeller.

df -h
lsblk

MySQL Kurulumu

Ubuntu/Debian Üzerine Kurulum

Ubuntu depolarında MySQL bulunuyor ancak en güncel sürüm için resmi MySQL deposunu eklemenizi öneririm.

# MySQL APT deposunu ekle
wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb

# Depo listesini güncelle ve MySQL'i kur
sudo apt update
sudo apt install mysql-server -y

# Servis durumunu kontrol et
sudo systemctl status mysql

Eğer resmi depo yerine Ubuntu’nun kendi deposunu kullanmak isterseniz:

sudo apt install mysql-server -y

RHEL/CentOS/Rocky Linux Üzerine Kurulum

Red Hat tabanlı sistemlerde MySQL doğrudan varsayılan depoda bulunmuyor. MySQL’in resmi deposunu eklemeniz gerekiyor.

# MySQL Yum deposunu ekle
sudo rpm -Uvh https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm

# GPG anahtarını içe aktar
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

# MySQL'i kur
sudo dnf install mysql-community-server -y

# Servisi başlat ve otomatik başlatmayı etkinleştir
sudo systemctl start mysqld
sudo systemctl enable mysqld

RHEL tabanlı sistemlerde ilk kurulumda MySQL geçici bir root şifresi oluşturur. Bu şifreyi logdan almanız gerekiyor:

sudo grep 'temporary password' /var/log/mysqld.log

İlk Güvenlik Yapılandırması

MySQL kurulumu tamamlandıktan sonra yapmanız gereken ilk ve en önemli adım güvenlik yapılandırması. mysql_secure_installation betiği bu işi oldukça kolaylaştırıyor.

sudo mysql_secure_installation

Bu betik sizi adım adım şu işlemler için yönlendirir:

  • Root şifresi belirleme: Güçlü bir şifre seçin, üretim ortamında en az 12 karakter, büyük-küçük harf, rakam ve özel karakter içermeli
  • Validate Password eklentisi: Şifre politikasını zorlamak için aktifleştirin
  • Anonim kullanıcıları kaldırma: Kesinlikle kaldırın
  • Remote root girişini devre dışı bırakma: Root’un uzaktan bağlanmasına izin vermeyin
  • Test veritabanını silme: Üretimde gerekmiyor, silin
  • Yetki tablolarını yeniden yükle: Evet deyin

Ubuntu’nun yeni sürümlerinde MySQL’e root olarak bağlanmak için auth_socket kullanılıyor. Şifre ile bağlanmak istiyorsanız:

sudo mysql

# Root kullanıcısının auth metodunu değiştir
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'GucluSifreniz123!';
FLUSH PRIVILEGES;
EXIT;

MySQL Yapılandırma Dosyası

MySQL’in ana yapılandırma dosyası /etc/mysql/mysql.conf.d/mysqld.cnf (Ubuntu) veya /etc/my.cnf (RHEL) konumunda bulunuyor. Bu dosyayı düzenlemeden önce mutlaka yedeğini alın.

sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Aşağıda gerçek bir prodüksiyon ortamı için temel yapılandırma parametrelerini açıklıyorum:

[mysqld]
# Temel Ayarlar
user                    = mysql
pid-file                = /var/run/mysqld/mysqld.pid
socket                  = /var/run/mysqld/mysqld.sock
port                    = 3306
datadir                 = /var/lib/mysql

# Ağ Ayarları
bind-address            = 127.0.0.1
max_connections         = 150
connect_timeout         = 10
wait_timeout            = 600
interactive_timeout     = 600

# InnoDB Ayarları
innodb_buffer_pool_size = 1G
innodb_log_file_size    = 256M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table   = ON

# Karakter Seti
character-set-server    = utf8mb4
collation-server        = utf8mb4_unicode_ci

# Loglama
general_log             = 0
general_log_file        = /var/log/mysql/mysql.log
log_error               = /var/log/mysql/error.log
slow_query_log          = 1
slow_query_log_file     = /var/log/mysql/mysql-slow.log
long_query_time         = 2

# Güvenlik
local_infile            = 0
skip_symbolic_links     = 1

Yapılandırmayı önemli parametreler açısından inceleyelim:

  • bind-address: Sadece localhost bağlantısına izin verir, uzaktan erişim gerekiyorsa sunucunun IP’sini girin
  • max_connections: Aynı anda bağlanabilecek maksimum istemci sayısı, sunucu RAM’ine göre ayarlayın
  • innodb_buffer_pool_size: InnoDB için en kritik parametre, genel kural olarak toplam RAM’in %50-70’i önerilir
  • innodb_flush_log_at_trx_commit: 1 değeri tam ACID uyumluluğu sağlar, performans için 2 de kullanılabilir ama veri kaybı riski artar
  • slow_query_log: Yavaş sorguları loglar, performans sorunlarını tespit etmek için şart
  • long_query_time: 2 saniyeden uzun süren sorgular yavaş kabul edilir
  • local_infile: LOAD DATA LOCAL INFILE güvenlik açığını kapatır
  • character-set-server: Türkçe karakterler dahil tüm Unicode karakterler için utf8mb4 kullanın, eski utf8 değil

Yapılandırmayı değiştirdikten sonra servisi yeniden başlatın:

sudo systemctl restart mysql
# ya da
sudo systemctl restart mysqld

Kullanıcı ve Veritabanı Yönetimi

Gerçek dünyada her uygulama için ayrı bir kullanıcı oluşturmalısınız. Root’u uygulama bağlantılarında kullanmak büyük bir güvenlik açığıdır.

sudo mysql -u root -p
-- Yeni veritabanı oluştur
CREATE DATABASE uygulama_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Uygulama kullanıcısı oluştur (sadece localhost erişimi)
CREATE USER 'uygulama_user'@'localhost' IDENTIFIED BY 'GucluSifre456!';

-- Kullanıcıya sadece gerekli yetkileri ver
GRANT SELECT, INSERT, UPDATE, DELETE ON uygulama_db.* TO 'uygulama_user'@'localhost';

-- Uzaktan bağlanan uygulama sunucusu için (gerekirse)
CREATE USER 'uygulama_user'@'192.168.1.100' IDENTIFIED BY 'GucluSifre456!';
GRANT SELECT, INSERT, UPDATE, DELETE ON uygulama_db.* TO 'uygulama_user'@'192.168.1.100';

-- Yetkileri uygula
FLUSH PRIVILEGES;

-- Kullanıcıları kontrol et
SELECT user, host, authentication_string FROM mysql.user;

Yetki yönetiminde en az yetki prensibini uygulayın. Sadece okuma yapacak bir raporlama kullanıcısına SELECT yetmez, INSERT vermeyin. Bir kullanıcının yetkileri hakkında detay almak için:

SHOW GRANTS FOR 'uygulama_user'@'localhost';

Firewall ve Ağ Güvenliği

MySQL’i dışarıya açmak zorundaysanız güvenlik duvarını doğru yapılandırmak şart. Önce MySQL’in dinlediği portu doğrulayın:

sudo ss -tlnp | grep mysql
sudo netstat -tlnp | grep 3306

UFW ile belirli bir IP’ye MySQL erişimi vermek:

# Sadece belirli uygulama sunucusuna izin ver
sudo ufw allow from 192.168.1.100 to any port 3306

# Genel erişimi engelle (varsayılan olarak zaten engellidir)
sudo ufw deny 3306

sudo ufw status

firewalld kullanan RHEL sistemlerinde:

# Belirli bir IP için zone tanımla
sudo firewall-cmd --permanent --new-zone=mysql-zone
sudo firewall-cmd --permanent --zone=mysql-zone --add-source=192.168.1.100
sudo firewall-cmd --permanent --zone=mysql-zone --add-port=3306/tcp
sudo firewall-cmd --reload

Yedekleme Yapılandırması

Bir sysadmin’in en temel sorumluluklarından biri yedekleme. MySQL için mysqldump en yaygın araç olmakla birlikte büyük veritabanları için daha iyi alternatifler de var.

# Tek veritabanı yedeği
mysqldump -u root -p uygulama_db > /backup/uygulama_db_$(date +%Y%m%d_%H%M%S).sql

# Tüm veritabanlarını yedekle
mysqldump -u root -p --all-databases --events --routines --triggers > /backup/all_databases_$(date +%Y%m%d).sql

# Sıkıştırarak yedekle (büyük veritabanları için)
mysqldump -u root -p uygulama_db | gzip > /backup/uygulama_db_$(date +%Y%m%d).sql.gz

Otomatik yedekleme için bir cron job oluşturun. Şifrenizi komut satırına yazmamak için .my.cnf dosyasını kullanın:

# /root/.my.cnf dosyası oluştur (sadece root okuyabilmeli)
cat > /root/.my.cnf << EOF
[client]
user=root
password=GucluSifreniz123!
EOF

chmod 600 /root/.my.cnf

Şimdi crontab’a otomatik yedekleme ekleyin:

crontab -e
# Her gece 02:00'de tüm veritabanlarını yedekle, 30 günden eski yedekleri sil
0 2 * * * mysqldump --all-databases --events --routines | gzip > /backup/mysql_$(date +%Y%m%d).sql.gz && find /backup -name "mysql_*.sql.gz" -mtime +30 -delete

Performans İzleme

MySQL’in nasıl çalıştığını anlamak için birkaç temel komutu bilmek gerekiyor:

sudo mysql -u root -p
-- Genel durum bilgisi
SHOW STATUS;

-- Bağlantı durumu
SHOW STATUS LIKE 'Threads%';
SHOW STATUS LIKE 'Connections';
SHOW STATUS LIKE 'Max_used_connections';

-- InnoDB buffer pool kullanımı
SHOW STATUS LIKE 'Innodb_buffer_pool%';

-- Yavaş sorgu istatistikleri
SHOW STATUS LIKE 'Slow_queries';

-- Aktif süreçleri görüntüle
SHOW PROCESSLIST;

-- Motor durumu (InnoDB detayları)
SHOW ENGINE INNODB STATUSG

Gerçek bir sorun yaşadığınızda SHOW PROCESSLIST komutu çok işe yarıyor. Çakışan veya uzun süre çalışan sorguları bu komutla görebilir, gerekirse KILL komutuyla sonlandırabilirsiniz:

-- Problematik sorguyu sonlandır
KILL 1234;

Sistemdeki MySQL performansını komut satırından anlık izlemek için:

# mysqladmin ile anlık istatistik
mysqladmin -u root -p status
mysqladmin -u root -p extended-status
mysqladmin -u root -p processlist

# Her 2 saniyede bir güncelle
watch -n 2 "mysqladmin -u root -p'GucluSifreniz123!' status"

Log Yönetimi

MySQL logları sorun gidermenin temel kaynağı. Hangi logların nerede olduğunu ve nasıl okunduğunu bilmek önemli.

# Error log'u takip et
sudo tail -f /var/log/mysql/error.log

# Yavaş sorgu logunu analiz et
sudo mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log

# En çok zaman alan 10 sorguyu göster
sudo mysqldumpslow -s at -t 10 /var/log/mysql/mysql-slow.log

Log dosyaları zamanla büyüyebilir. logrotate ile yönetimi otomatize edin. Ubuntu’da MySQL için logrotate genellikle otomatik yapılandırılmıştır, kontrol edin:

cat /etc/logrotate.d/mysql-server

SSL/TLS Yapılandırması

MySQL 8.0 ve üzerinde SSL varsayılan olarak aktif geliyor. Durumu kontrol edin:

SHOW VARIABLES LIKE '%ssl%';
SHOW STATUS LIKE 'Ssl_cipher';

Kendi sertifikalarınızı oluşturmak için:

# MySQL SSL sertifikalarını otomatik oluştur
sudo mysql_ssl_rsa_setup --datadir=/var/lib/mysql

# Oluşturulan dosyaları kontrol et
ls -la /var/lib/mysql/*.pem

Yapılandırma dosyasına SSL ayarlarını ekleyin:

[mysqld]
ssl-ca=/var/lib/mysql/ca.pem
ssl-cert=/var/lib/mysql/server-cert.pem
ssl-key=/var/lib/mysql/server-key.pem
require_secure_transport=ON

Belirli bir kullanıcının SSL kullanmasını zorunlu kılmak için:

ALTER USER 'uzak_kullanici'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;

Sorun Giderme Senaryoları

“Too many connections” Hatası

Bu hata max_connections limitine ulaşıldığında alınır. Anlık çözüm:

SHOW VARIABLES LIKE 'max_connections';
SET GLOBAL max_connections = 200;

Kalıcı çözüm için yapılandırma dosyasında max_connections değerini artırın ve servisi yeniden başlatın. Ayrıca uygulamanızda bağlantı havuzu (connection pool) kullanıp kullanmadığınızı kontrol edin.

Servis Başlamıyor

# Detaylı hata mesajı için
sudo journalctl -xe -u mysql
sudo cat /var/log/mysql/error.log

# Disk doldu mu kontrol et
df -h /var/lib/mysql

# Dosya izinleri doğru mu
ls -la /var/lib/mysql
sudo chown -R mysql:mysql /var/lib/mysql

InnoDB Corrupt Table Recovery

# my.cnf'e ekle ve servisi başlat
# innodb_force_recovery = 1

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# [mysqld] altına ekle: innodb_force_recovery = 1

sudo systemctl start mysql

# Veritabanını dışa aktar
mysqldump -u root -p --databases etkilenen_db > /backup/kurtarilan.sql

# innodb_force_recovery satırını kaldır, servisi yeniden başlat
# Veriyi geri yükle
mysql -u root -p < /backup/kurtarilan.sql

Sonuç

MySQL kurulumu ve yapılandırması tek seferlik bir iş değil. Sistemi kurup bırakmak yerine düzenli olarak kontrol etmek, logları incelemek ve performans metriklerini takip etmek gerekiyor. Bu rehberde ele aldığımız adımları uygulayarak güvenli, stabil ve performanslı bir MySQL ortamı elde edebilirsiniz.

En önemli hatırlatmalar olarak şunları vurgulamak isterim: root kullanıcısını asla uygulama bağlantılarında kullanmayın, her uygulama için ayrı kullanıcı ve minimum yetki prensibiyle çalışın. Yedekleri düzenli alın ve daha da önemlisi yedekten restore testini periyodik olarak yapın. Slow query log’u aktif tutun ve uzun süren sorguları optimize edin. Son olarak MySQL sürümünüzü güncel tutun, güvenlik yamalarını takip edin.

Prodüksiyon ortamına geçmeden önce bu yapılandırmayı bir test ortamında mutlaka deneyin. Her sistemin ihtiyacı farklı, bu rehber size sağlam bir başlangıç noktası sunuyor ama kendi iş yükünüze göre parametreleri ayarlamanız gerekecek.

Yorum yapın