
MySQL/MariaDB Sunucu Kurulumu ve Temel Yönetim
MySQL ve MariaDB veritabanı sunucusu nasıl kurulur? Güvenli kurulum, kullanıcı yönetimi, yedekleme ve temel SQL komutları ile veritabanı sunucu yönetimi rehberi.
MySQL/MariaDB Sunucu Kurulumu ve Temel Yönetim
MySQL ve MariaDB, WordPress başta olmak üzere web uygulamalarının vazgeçilmez veritabanı sunucularıdır. Bu rehberde sıfırdan veritabanı sunucusu kurulumunu, güvenli yapılandırmayı ve temel yönetim işlemlerini ele alıyoruz.
MySQL vs MariaDB
MariaDB, MySQL'den çatallanan (fork) ve MySQL ile tam uyumlu açık kaynaklı bir veritabanı sunucusudur.
| Özellik | MySQL | MariaDB |
|---|---|---|
| Lisans | Dual (GPL/Ticari) | GPL |
| Performans | İyi | Genellikle daha iyi |
| MySQL uyumluluğu | - | Tam uyumlu |
| Geliştirme | Oracle | Topluluk |
| JSON desteği | Mükemmel (5.7+) | İyi |
Hosting ortamları için MariaDB önerilir.
Kurulum
AlmaLinux / CentOS
# MariaDB
dnf install mariadb-server mariadb
systemctl enable --now mariadb
# MySQL 8.0 (Resmi)
dnf install @mysql:8.0
systemctl enable --now mysqld
Ubuntu / Debian
# MariaDB
apt install mariadb-server mariadb-client
systemctl enable --now mariadb
# MySQL 8.0
apt install mysql-server
systemctl enable --now mysql
Güvenli Kurulum: mysql_secure_installation
Kurulumdan sonra mutlaka çalıştırın:
mysql_secure_installation
Sorulan sorular:
- Root şifresini değiştir? → Evet (güçlü şifre girin)
- Anonim kullanıcıları kaldır? → Evet
- Root uzaktan girişi devre dışı bırak? → Evet
- Test veritabanını kaldır? → Evet
- Yetki tablolarını yeniden yükle? → Evet
MySQL'e Giriş
# Root olarak giriş
mysql -u root -p
# Belirli veritabanına
mysql -u kullanici -p veritabani
# Uzak sunucuya
mysql -h 192.168.1.100 -u kullanici -p
Temel SQL Yönetim Komutları
-- Veritabanlarını listele
SHOW DATABASES;
-- Kullanıcıları listele
SELECT user, host FROM mysql.user;
-- Veritabanı oluştur
CREATE DATABASE sitedb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Kullanıcı oluştur
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'guclu_sifre';
-- Yetki ver
GRANT ALL PRIVILEGES ON sitedb.* TO 'webapp'@'localhost';
FLUSH PRIVILEGES;
-- Yetki göster
SHOW GRANTS FOR 'webapp'@'localhost';
-- Kullanıcı sil
DROP USER 'webapp'@'localhost';
-- Veritabanı sil
DROP DATABASE sitedb;
my.cnf Performans Ayarları
/etc/mysql/conf.d/custom.cnf veya /etc/my.cnf.d/custom.cnf:
[mysqld]
# Karakter seti
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# InnoDB Buffer Pool (RAM'in %50-70'i önerilir)
innodb_buffer_pool_size = 1G # 2GB RAM için
# Bağlantı sınırı
max_connections = 150
# Sorgu önbelleği (MySQL 8.0'da kaldırıldı)
# query_cache_size = 64M # Sadece MySQL 5.7 için
# Log ayarları
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2 # 2 saniyeden yavaş sorguları logla
# Binary log (replikasyon için)
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 7
Değişiklik sonrası:
systemctl restart mariadb
Yedekleme: mysqldump
# Tek veritabanı yedeği
mysqldump -u root -p sitedb > sitedb_backup.sql
# Sıkıştırılmış yedek
mysqldump -u root -p sitedb | gzip > sitedb_backup.sql.gz
# Tüm veritabanları
mysqldump -u root -p --all-databases > all_databases.sql
# Otomatik yedekleme scripti
#!/bin/bash
DATE=$(date +%Y%m%d)
mysqldump -u root -pSIFRENIZ sitedb | gzip > /backup/sitedb_${DATE}.sql.gz
find /backup -name "sitedb_*.sql.gz" -mtime +7 -delete
Performans Tuning ve InnoDB Optimizasyonu
MySQL/MariaDB performansının %80'i doğru my.cnf ayarlarıyla belirlenir. Tipik bir Büyükweb VDS (4-8 GB RAM) için temel tuning:
# /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
# Buffer pool — RAM'in %60-70'i (en kritik ayar)
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4
# Log dosyaları (yazma performansı)
innodb_log_file_size = 512M
innodb_log_buffer_size = 32M
# Flush stratejisi (durability vs hız)
innodb_flush_log_at_trx_commit = 2 # 1=tam ACID, 2=hızlı, 0=cache only
innodb_flush_method = O_DIRECT # OS cache çakışmasını önler
# Bağlantı limitleri
max_connections = 200
thread_cache_size = 16
table_open_cache = 4000
# Sorgu önbelleği (MariaDB 10.5+ kapatın, MySQL 8 zaten kaldırdı)
query_cache_type = 0
query_cache_size = 0
# Yavaş sorgu logu
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
# Karakter seti
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
mysqltuner veya pt-mysql-summary ile mevcut konfigürasyon analizi yapılabilir; öneriler RAM kullanımına ve sorgu pattern'ine göre değişir.
Tuning Doğrulama
-- Buffer pool kullanım oranı (%99'a yakın olmalı)
SELECT (1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)) * 100 AS hit_ratio
FROM (
SELECT VARIABLE_VALUE AS Innodb_buffer_pool_reads FROM information_schema.global_status
WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads'
) r,
(
SELECT VARIABLE_VALUE AS Innodb_buffer_pool_read_requests FROM information_schema.global_status
WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests'
) rr;
-- Buffer pool ne kadar dolu?
SELECT (1 - (free_pages / total_pages)) * 100 AS percent_used
FROM (SELECT VARIABLE_VALUE AS free_pages FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_free') f,
(SELECT VARIABLE_VALUE AS total_pages FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total') t;
Yedekten Geri Yükleme
# Düz SQL
mysql -u root -p sitedb < sitedb_backup.sql
# Sıkıştırılmış
gunzip < sitedb_backup.sql.gz | mysql -u root -p sitedb
Uzak Bağlantı İzni
Güvenlik için MySQL'i uzaktan bağlantıya kapatık tutun. Sadece gerektiğinde açın:
-- Belirli IP'den uzak bağlantı
CREATE USER 'webuser'@'192.168.1.100' IDENTIFIED BY 'sifre';
GRANT SELECT, INSERT, UPDATE, DELETE ON sitedb.* TO 'webuser'@'192.168.1.100';
FLUSH PRIVILEGES;
my.cnf'de bind-address'i değiştirin:
bind-address = 0.0.0.0 # Tüm IP'lerden bağlantıya izin ver
# Sadece belirli IP için:
bind-address = 192.168.1.10
Temel Yönetim Komutları
-- Aktif bağlantılar
SHOW PROCESSLIST;
-- Aktif bağlantıyı sonlandır
KILL 123; -- Connection ID
-- Veritabanı boyutu
SELECT table_schema, ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema
ORDER BY 2 DESC;
-- Yavaş sorgular
SHOW STATUS LIKE 'Slow_queries';
-- Motor durumu
SHOW ENGINE INNODB STATUS;
Master-Slave Replikasyon
Üretim ortamında read-replica ile okuma yükü dağıtılır, ayrıca canlı yedek elde edilir. 2 sunucu (master + slave) gerekir:
Master (Birincil)
# /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
-- Replication kullanıcısı
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'guclu_sifre';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
-- Mevcut binlog konumu
SHOW MASTER STATUS;
-- Çıktı: File: mysql-bin.000001, Position: 154
Slave (İkincil)
[mysqld]
server-id = 2
relay-log = /var/log/mysql/relay-bin.log
read_only = 1
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='replica_user',
MASTER_PASSWORD='guclu_sifre',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G -- Slave_IO_Running ve Slave_SQL_Running: Yes olmalı
Galera Cluster ile Multi-Master
Galera (MariaDB) 3+ node multi-master synchronous replication sağlar. Tüm node'larda yazma alabilir, conflict otomatik çözülür. WordPress + WooCommerce gibi yüksek erişilebilirlik isteyen sistemlerde kullanılır.
Sorgu Optimizasyonu ve Index Stratejisi
EXPLAIN ile Sorgu Planı
EXPLAIN SELECT * FROM siparisler WHERE musteri_id = 42 AND tarih > '2026-01-01';
-- type: ref, key: idx_musteri_tarih, rows: 12 (iyi)
-- type: ALL, rows: 500000 (kötü — full scan)
type kolonu kötüden iyiye: ALL → index → range → ref → eq_ref → const. Hedef ref ve üzeri.
Index Best Practices
-- WHERE, JOIN, ORDER BY kullanılan kolonlara index
CREATE INDEX idx_musteri_id ON siparisler(musteri_id);
-- Composite index — sırayla kullanılır (left-most prefix kuralı)
CREATE INDEX idx_musteri_tarih ON siparisler(musteri_id, tarih);
-- Bu sorgu kullanır: WHERE musteri_id = X AND tarih > Y
-- Bu sorgu kullanmaz: WHERE tarih > Y (sadece sağ taraf)
-- Covering index (sadece index'ten okuma)
CREATE INDEX idx_covering ON urunler(kategori_id, fiyat, stok);
-- Foreign key kolonlarına mutlaka index
ALTER TABLE siparisler ADD INDEX (kullanici_id);
-- Mevcut indexleri listele
SHOW INDEX FROM siparisler;
-- Kullanılmayan index tespiti (sys schema)
SELECT * FROM sys.schema_unused_indexes WHERE object_schema = 'sitedb';
Yavaş Sorgu Tespiti
# slow.log analizi
mysqldumpslow -s t -t 20 /var/log/mysql/slow.log
# pt-query-digest (Percona Toolkit) - daha gelişmiş
pt-query-digest /var/log/mysql/slow.log
pt-query-digest çıktısında en sık tekrarlanan ve en uzun süren sorgular işaretlenir; bunlar optimize edildiğinde sunucu yükü dramatik düşer.
Binlog ile Point-in-Time Recovery
Geleneksel mysqldump yedekleri sadece o anlık görüntüyü tutar. Binary log etkinse belirli bir zamana geri dönüş yapılabilir:
# Tam yedek + binlog yedek
mysqldump --single-transaction --master-data=2 --all-databases | gzip > full-$(date +%F).sql.gz
# Binlog dosyalarını yedekle
cp /var/log/mysql/mysql-bin.* /backup/binlog/
# Restore senaryosu — yedek alındıktan 4 saat sonraki yanlış UPDATE'ten önceki ana dön
# 1. Tam yedeği geri yükle
gunzip < full-2026-05-07.sql.gz | mysql -u root -p
# 2. Binlog'u 14:30'a kadar oynat (UPDATE 14:32'de yapılmıştı)
mysqlbinlog --stop-datetime="2026-05-07 14:30:00" /backup/binlog/mysql-bin.000042 | mysql -u root -p
xtrabackup (Percona) ile yüksek trafik altında bile lock'suz fiziksel yedek alınabilir; çok büyük veritabanları (>50 GB) için mysqldump'a alternatiftir.
Büyükweb VDS'de MySQL
Büyükweb VDS sunucular üzerine MariaDB 10.6+ kurulumu yapılabilir. Büyükweb cPanel hosting paketlerinde MySQL/MariaDB önceden kurulu ve yapılandırılmış olarak gelir.
Sonuç
MySQL ve MariaDB, web uygulamalarının kalbi olan veritabanı sunucularıdır. Güvenli kurulum, doğru konfigürasyon ve düzenli yedekleme ile güvenilir bir veritabanı altyapısı oluşturabilirsiniz. Özellikle innodb_buffer_pool_size ayarı, performans için en kritik parametredir.
Yaygın MySQL/MariaDB Hataları
| Hata | Sebep | Çözüm |
|---|---|---|
| Too many connections | max_connections aşıldı |
Limiti artır veya bağlantı sızıntısı olan kodu düzelt |
| Lock wait timeout exceeded | Uzun süren transaction | SHOW ENGINE INNODB STATUS ile suçlu sorguyu bul, kill et |
| Disk full | Binlog veya InnoDB tablespace büyüdü | PURGE BINARY LOGS; ibtmp1 küçültmek için sunucu restart |
| Access denied for user | Yetki yok ya da yanlış host | GRANT doğrula; SELECT user, host FROM mysql.user ile host eşle |
| MySQL server has gone away | max_allowed_packet küçük |
max_allowed_packet=64M yap, mysql restart |
| Innodb crash recovery | Hatalı kapanış | Otomatik recovery genelde başarılı; başarısızsa innodb_force_recovery=4 |
| Aborted connection | Network kopuk veya timeout | wait_timeout, interactive_timeout artır |
| Slow startup after restart | Buffer pool dump kapalı | innodb_buffer_pool_dump_at_shutdown=ON aktif et |
ProxySQL ile Bağlantı Yönetimi
Yüksek trafikli uygulamalarda PHP/Node.js connection pool yetersiz kalabilir. ProxySQL uygulama ile MySQL arasında akıllı katman:
- Read/Write splitting (master'a yazma, slave'lere okuma)
- Connection multiplexing (10000 client → 100 backend bağlantı)
- Sorgu cache, query rewriting, firewall
apt install proxysql
mysql -u admin -padmin -h 127.0.0.1 -P 6032 < proxysql-config.sql
Sıkça Sorulan Sorular
MySQL mi MariaDB mı?
Büyükweb cPanel paketleri MariaDB ile gelir. Topluluk yönetimi, daha hızlı güncelleme, ekstra storage engine'ler (TokuDB, MyRocks) sebebiyle hosting tarafında MariaDB tercih edilir. WordPress, Joomla, Drupal MariaDB ile sorunsuz çalışır.
Hangi sürümü kullanmalıyım?
2026 itibarıyla MariaDB 10.11 LTS veya 11.4 LTS, MySQL 8.0 veya 8.4 LTS üretim için önerilir. 5.7 ve 10.6 destek dışı.
InnoDB mi MyISAM mı?
InnoDB her zaman tercih edilmeli — transaction, foreign key, crash recovery destekler. MyISAM sadece eski sistemlerde kalmış, yeni proje için kullanılmaz.
Hosting önerisi?
Veritabanı I/O ve RAM hassas. NVMe SSD diskli VDS ideal — E5 v4 VDS paketlerimizde NVMe disk ve DDR4 RAM standart. Yüksek trafik (>10K aktif bağlantı) için fiziksel dedicated veya cluster yapı önerilir.
Yedekleme sıklığı?
Aktif e-ticaret: saatlik binlog + günlük tam yedek. Standart blog: günlük tam yedek. Büyükweb cPanel paketlerinde JetBackup günlük otomatik DB yedeği alır.
İlgili Büyükweb Hizmetleri
Yönetimini kontrol etmek istediğiniz sunucu için Büyükweb VDS / VPS / dedicated paketleri:
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
Sunucu Yönetimi İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

