MySQL Yönetimi

Kullanıcı yönetimi, backup/restore, performans optimizasyonu

Kubedo Academy’e hoş geldiniz! Bu laboratuvarda MySQL kullanıcı yönetimi, backup/restore ve performans optimizasyonunu öğreneceksiniz.


Zorluk seviyesi: Orta
Süre: Yaklaşık 50 dakika


1. Kullanıcı Yönetimi

Kullanıcı Oluşturma

-- Lokal kullanıcı
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'SecurePass123!';

-- Herhangi bir IP'den
CREATE USER 'appuser'@'%' IDENTIFIED BY 'SecurePass123!';

-- Belirli IP'den
CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'SecurePass123!';

Yetki Verme (GRANT)

-- Tam yetki (DBA)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

-- Belirli veritabanına
GRANT ALL PRIVILEGES ON kubedo.* TO 'appuser'@'%';

-- Sadece okuma
GRANT SELECT ON kubedo.* TO 'readonly'@'%';

-- Belirli yetkiler
GRANT SELECT, INSERT, UPDATE ON kubedo.users TO 'appuser'@'%';

Yetkileri Uygulama

Terminal
$ FLUSH PRIVILEGES;

Kullanıcı Bilgileri

-- Kullanıcıları listele
SELECT User, Host FROM mysql.user;

-- Yetkileri görüntüle
SHOW GRANTS FOR 'appuser'@'%';

Yetki Alma ve Silme

-- Yetki alma
REVOKE INSERT ON kubedo.* FROM 'appuser'@'%';

-- Kullanıcı silme
DROP USER 'appuser'@'%';

2. Backup Stratejileri

Backup Türleri

TürAçıklamaAraç
LogicalSQL dumpmysqldump
PhysicalDosya kopyalamaxtrabackup
IncrementalSon değişikliklerbinlog
SnapshotLVM/ZFS snapshotlvcreate

mysqldump ile Backup

Tek veritabanı:

Terminal
$ mysqldump -u root -p kubedo > kubedo_backup.sql

Tüm veritabanları:

mysqldump -u root -p --all-databases > full_backup.sql

Belirli tablolar:

mysqldump -u root -p kubedo users orders > tables_backup.sql

Sıkıştırılmış backup:

mysqldump -u root -p kubedo | gzip > kubedo_$(date +%Y%m%d).sql.gz

mysqldump Seçenekleri

SeçenekAçıklama
--single-transactionInnoDB için tutarlı backup
--routinesStored procedure dahil
--triggersTrigger’lar dahil
--eventsEvent’ler dahil
--quickBüyük tablolar için
--lock-tablesMyISAM için tablo kilitleme

Önerilen production backup:

mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  kubedo > kubedo_backup.sql

3. Restore İşlemleri

SQL Dump’tan Restore

Terminal
$ mysql -u root -p kubedo < kubedo_backup.sql

Sıkıştırılmış dosyadan:

gunzip < kubedo_backup.sql.gz | mysql -u root -p kubedo

Yeni veritabanına restore:

mysql -u root -p -e "CREATE DATABASE kubedo_restored"
mysql -u root -p kubedo_restored < kubedo_backup.sql

[!CAUTION] Restore işlemi mevcut verilerin üzerine yazar! Önce test ortamında deneyin.


4. Binary Log ve Point-in-Time Recovery

Binary Log Nedir?

Binary log, tüm veri değişikliklerini kaydeder. Replikasyon ve point-in-time recovery için kullanılır.

Binary Log Ayarları

# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M

Binary Log’ları Görüntüleme

Terminal
$ SHOW BINARY LOGS;
SHOW MASTER STATUS;

Point-in-Time Recovery

# Binary log'u SQL'e çevir
mysqlbinlog mysql-bin.000001 > binlog.sql

# Belirli zaman aralığı
mysqlbinlog --start-datetime="2025-01-15 10:00:00" \
            --stop-datetime="2025-01-15 12:00:00" \
            mysql-bin.000001 > recovery.sql

5. Performans Optimizasyonu

Yapılandırma Ayarları

# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# Buffer Pool (RAM'in %70-80'i)
innodb_buffer_pool_size = 4G

# Log dosyası boyutu
innodb_log_file_size = 256M

# Bağlantı sayısı
max_connections = 200

# Query cache (MySQL 8.0'da kaldırıldı)
# query_cache_size = 128M

# Slow query log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

Durum Kontrolü

Terminal
$ SHOW STATUS LIKE 'Threads%';
SHOW STATUS LIKE 'Innodb_buffer%';
SHOW PROCESSLIST;

Slow Query Analizi

# Slow query'leri analiz et
mysqldumpslow -s t /var/log/mysql/slow.log

# En yavaş 10 sorgu
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

6. EXPLAIN ile Sorgu Analizi

EXPLAIN Kullanımı

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

EXPLAIN FORMAT=JSON SELECT * FROM users WHERE email = 'test@example.com';

EXPLAIN Çıktısı

KolonAçıklama
typeErişim tipi (ALL, index, range, ref, const)
rowsTahmini satır sayısı
keyKullanılan index
ExtraEk bilgiler

İyi vs Kötü Erişim Tipleri

TipPerformansAçıklama
constEn iyiPrimary key ile tek satır
refİyiIndex ile eşleşme
rangeOrtaIndex aralık taraması
indexKötüFull index scan
ALLEn kötüFull table scan

[!TIP] type: ALL görüyorsanız index eklemeyi düşünün!


7. Tablo Bakımı

Tablo Analizi

ANALYZE TABLE users;

Tablo Optimizasyonu

OPTIMIZE TABLE users;

Tablo Onarımı

-- MyISAM için
REPAIR TABLE users;

-- InnoDB için
ALTER TABLE users ENGINE=InnoDB;

Tablo İstatistikleri

SELECT 
    table_name,
    table_rows,
    data_length / 1024 / 1024 AS data_mb,
    index_length / 1024 / 1024 AS index_mb
FROM information_schema.tables
WHERE table_schema = 'kubedo';

8. Monitoring

Temel Metrikler

MetrikKomut
BağlantılarSHOW STATUS LIKE 'Threads_connected'
Queries/secSHOW STATUS LIKE 'Questions'
Buffer hit ratioSHOW STATUS LIKE 'Innodb_buffer_pool%'
Slow queriesSHOW STATUS LIKE 'Slow_queries'

Monitoring Araçları

  • MySQL Enterprise Monitor
  • Percona Monitoring and Management (PMM)
  • Prometheus + Grafana
  • Datadog / New Relic

Konu Tekrarı - Kısa Sınav


Sonraki Adım

Replikasyon →