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ür | Açıklama | Araç |
|---|---|---|
| Logical | SQL dump | mysqldump |
| Physical | Dosya kopyalama | xtrabackup |
| Incremental | Son değişiklikler | binlog |
| Snapshot | LVM/ZFS snapshot | lvcreate |
mysqldump ile Backup
Tek veritabanı:
Terminal
$ mysqldump -u root -p kubedo > kubedo_backup.sqlTü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çenek | Açıklama |
|---|---|
--single-transaction | InnoDB için tutarlı backup |
--routines | Stored procedure dahil |
--triggers | Trigger’lar dahil |
--events | Event’ler dahil |
--quick | Büyük tablolar için |
--lock-tables | MyISAM 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.sqlSı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ı
| Kolon | Açıklama |
|---|---|
type | Erişim tipi (ALL, index, range, ref, const) |
rows | Tahmini satır sayısı |
key | Kullanılan index |
Extra | Ek bilgiler |
İyi vs Kötü Erişim Tipleri
| Tip | Performans | Açıklama |
|---|---|---|
const | En iyi | Primary key ile tek satır |
ref | İyi | Index ile eşleşme |
range | Orta | Index aralık taraması |
index | Kötü | Full index scan |
ALL | En kötü | Full table scan |
[!TIP]
type: ALLgö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
| Metrik | Komut |
|---|---|
| Bağlantılar | SHOW STATUS LIKE 'Threads_connected' |
| Queries/sec | SHOW STATUS LIKE 'Questions' |
| Buffer hit ratio | SHOW STATUS LIKE 'Innodb_buffer_pool%' |
| Slow queries | SHOW STATUS LIKE 'Slow_queries' |
Monitoring Araçları
- MySQL Enterprise Monitor
- Percona Monitoring and Management (PMM)
- Prometheus + Grafana
- Datadog / New Relic