MySQL Veritabanı Kurulumu ve Yönetimi
MySQL veritabanı kurulumu, yapılandırması, yedekleme, performans optimizasyonu ve güvenlik ayarları. Veritabanı yöneticileri için kapsamlı rehber.
7 min read
1.297 words
MySQL Veritabanı Kurulumu ve Yönetimi#
MySQL, dünya çapında en yaygın kullanılan açık kaynak ilişkisel veritabanı yönetim sistemidir. Bu rehberde MySQL kurulumu, yapılandırması ve yönetimi konularını detaylı olarak ele alacağız.
MySQL Kurulumu#
Ubuntu/Debian Sistemlerde Kurulum#
# Paket listesini güncelle sudo apt update # MySQL Server kurulumu sudo apt install mysql-server # MySQL güvenlik yapılandırması sudo mysql_secure_installation # MySQL servisini başlat ve etkinleştir sudo systemctl start mysql sudo systemctl enable mysql # MySQL durumunu kontrol et sudo systemctl status mysql
CentOS/RHEL Sistemlerde Kurulum#
# MySQL repository ekle sudo yum install mysql-server # Alternatif: MariaDB (MySQL fork) sudo yum install mariadb-server mariadb # Servisi başlat sudo systemctl start mysqld sudo systemctl enable mysqld # Root şifresini öğren (MySQL 8.0+) sudo grep 'temporary password' /var/log/mysqld.log
İlk Yapılandırma#
Root Kullanıcısı Ayarları#
# MySQL'e root olarak bağlan sudo mysql # Root şifresini değiştir ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YeniGüçlüŞifre123!'; # Değişiklikleri uygula FLUSH PRIVILEGES; # Çıkış EXIT;
Yeni Kullanıcı Oluşturma#
-- Yeni veritabanı oluştur CREATE DATABASE uygulama_db; -- Yeni kullanıcı oluştur CREATE USER 'uygulama_user'@'localhost' IDENTIFIED BY 'GüçlüŞifre123!'; -- Kullanıcıya yetki ver GRANT ALL PRIVILEGES ON uygulama_db.* TO 'uygulama_user'@'localhost'; -- Sadece okuma yetkisi ver GRANT SELECT ON uygulama_db.* TO 'readonly_user'@'localhost'; -- Yetkilerini yenile FLUSH PRIVILEGES;
MySQL Yapılandırması#
Ana Yapılandırma Dosyası (/etc/mysql/mysql.conf.d/mysqld.cnf)#
[mysqld] # Temel ayarlar user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp # Bağlantı ayarları bind-address = 127.0.0.1 max_connections = 200 connect_timeout = 60 wait_timeout = 600 max_allowed_packet = 64M thread_cache_size = 128 sort_buffer_size = 4M bulk_insert_buffer_size = 16M tmp_table_size = 32M max_heap_table_size = 32M # MyISAM ayarları myisam_recover_options = BACKUP key_buffer_size = 128M table_open_cache = 400 myisam_sort_buffer_size = 512M concurrent_insert = 2 read_buffer_size = 2M read_rnd_buffer_size = 1M # InnoDB ayarları innodb_buffer_pool_size = 256M innodb_log_buffer_size = 8M innodb_file_per_table = 1 innodb_open_files = 400 innodb_io_capacity = 400 innodb_flush_method = O_DIRECT # Logging log_error = /var/log/mysql/error.log slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 log_queries_not_using_indexes = 1 # Binary logging (replication için) server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW expire_logs_days = 10 max_binlog_size = 100M # Güvenlik local-infile = 0
Yapılandırma Değişikliklerini Uygulama#
# Yapılandırmayı test et sudo mysqld --help --verbose | head -n 20 # MySQL'i yeniden başlat sudo systemctl restart mysql # Durumu kontrol et sudo systemctl status mysql
Veritabanı Yönetimi#
Temel Veritabanı İşlemleri#
-- Veritabanlarını listele SHOW DATABASES; -- Veritabanı seç USE veritabani_adi; -- Tabloları listele SHOW TABLES; -- Tablo yapısını göster DESCRIBE tablo_adi; -- Tablo boyutlarını göster SELECT table_name AS "Tablo", ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Boyut (MB)" FROM information_schema.TABLES WHERE table_schema = "veritabani_adi" ORDER BY (data_length + index_length) DESC;
İndeks Yönetimi#
-- İndeks oluştur CREATE INDEX idx_kullanici_email ON kullanicilar(email); -- Composite indeks CREATE INDEX idx_siparis_tarih_durum ON siparisler(tarih, durum); -- Unique indeks CREATE UNIQUE INDEX idx_urun_kod ON urunler(urun_kodu); -- İndeksleri göster SHOW INDEX FROM tablo_adi; -- İndeks sil DROP INDEX idx_kullanici_email ON kullanicilar;
Yedekleme ve Geri Yükleme#
mysqldump ile Yedekleme#
# Tek veritabanı yedekleme mysqldump -u root -p veritabani_adi > yedek_$(date +%Y%m%d).sql # Tüm veritabanlarını yedekle mysqldump -u root -p --all-databases > tum_veritabanlari_$(date +%Y%m%d).sql # Yapı ve veri ayrı yedekleme mysqldump -u root -p --no-data veritabani_adi > yapi_$(date +%Y%m%d).sql mysqldump -u root -p --no-create-info veritabani_adi > veri_$(date +%Y%m%d).sql # Sıkıştırılmış yedek mysqldump -u root -p veritabani_adi | gzip > yedek_$(date +%Y%m%d).sql.gz # Uzak sunucuya yedekleme mysqldump -u root -p veritabani_adi | ssh user@backup-server "cat > /backup/mysql_$(date +%Y%m%d).sql"
Geri Yükleme#
# Yedekten geri yükle mysql -u root -p veritabani_adi < yedek_20240919.sql # Sıkıştırılmış yedekten geri yükle gunzip < yedek_20240919.sql.gz | mysql -u root -p veritabani_adi # Yeni veritabanı oluşturarak geri yükle mysql -u root -p -e "CREATE DATABASE yeni_veritabani;" mysql -u root -p yeni_veritabani < yedek_20240919.sql
Otomatik Yedekleme Scripti#
#!/bin/bash # /usr/local/bin/mysql_backup.sh # Yapılandırma DB_USER="root" DB_PASS="şifre" BACKUP_DIR="/backup/mysql" DATE=$(date +%Y%m%d_%H%M%S) RETENTION_DAYS=30 # Yedek dizinini oluştur mkdir -p $BACKUP_DIR # Veritabanlarını yedekle for DB in $(mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)") do echo "Yedekleniyor: $DB" mysqldump -u$DB_USER -p$DB_PASS --single-transaction --routines --triggers $DB | gzip > $BACKUP_DIR/${DB}_${DATE}.sql.gz done # Eski yedekleri sil find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete echo "Yedekleme tamamlandı: $(date)"
Cron job ekle:
# Günlük 02:00'da yedekleme 0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
Performans Optimizasyonu#
Slow Query Log Analizi#
# Slow query log'u etkinleştir mysql -u root -p -e "SET GLOBAL slow_query_log = 'ON';" mysql -u root -p -e "SET GLOBAL long_query_time = 2;" # Slow query'leri analiz et mysqldumpslow /var/log/mysql/slow.log # En yavaş 10 sorguyu göster mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
Query Optimizasyonu#
-- Query execution plan EXPLAIN SELECT * FROM kullanicilar WHERE email = '[email protected]'; -- İndeks kullanımını kontrol et SHOW INDEX FROM kullanicilar; -- Tablo istatistiklerini güncelle ANALYZE TABLE kullanicilar; -- Tablo optimizasyonu OPTIMIZE TABLE kullanicilar;
InnoDB Buffer Pool Optimizasyonu#
-- Buffer pool durumunu kontrol et SHOW ENGINE INNODB STATUS\G -- Buffer pool hit ratio SELECT (1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)) * 100 AS buffer_pool_hit_ratio FROM (SELECT variable_value AS Innodb_buffer_pool_reads FROM information_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_reads') AS reads, (SELECT variable_value AS Innodb_buffer_pool_read_requests FROM information_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests') AS requests;
Güvenlik Yapılandırması#
Kullanıcı Yetki Yönetimi#
-- Kullanıcı yetkilerini kontrol et SHOW GRANTS FOR 'kullanici'@'localhost'; -- Minimum yetki prensibi REVOKE ALL PRIVILEGES ON *.* FROM 'kullanici'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON uygulama_db.* TO 'kullanici'@'localhost'; -- IP tabanlı erişim kısıtlama CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'şifre'; GRANT SELECT ON uygulama_db.* TO 'app_user'@'192.168.1.%';
SSL/TLS Yapılandırması#
# SSL sertifikaları oluştur sudo mysql_ssl_rsa_setup --uid=mysql # MySQL yapılandırmasında SSL etkinleştir echo "require_secure_transport = ON" >> /etc/mysql/mysql.conf.d/mysqld.cnf # MySQL'i yeniden başlat sudo systemctl restart mysql
-- SSL durumunu kontrol et SHOW VARIABLES LIKE '%ssl%'; -- Kullanıcı için SSL zorunlu kıl ALTER USER 'kullanici'@'localhost' REQUIRE SSL;
Firewall Yapılandırması#
# Sadece localhost'tan erişime izin ver sudo ufw allow from 127.0.0.1 to any port 3306 # Belirli IP'den erişime izin ver sudo ufw allow from 192.168.1.100 to any port 3306 # Firewall durumunu kontrol et sudo ufw status
Monitoring ve Troubleshooting#
Sistem Durumu Kontrolü#
-- Aktif bağlantıları göster SHOW PROCESSLIST; -- Sistem değişkenlerini göster SHOW VARIABLES LIKE '%connection%'; -- Sistem durumunu göster SHOW STATUS LIKE '%connection%'; -- InnoDB durumu SHOW ENGINE INNODB STATUS\G
Log Analizi#
# Error log kontrol sudo tail -f /var/log/mysql/error.log # Slow query log analizi sudo mysqldumpslow -s c -t 10 /var/log/mysql/slow.log # Binary log kontrol sudo mysqlbinlog /var/log/mysql/mysql-bin.000001
Performans Metrikleri#
-- Bağlantı istatistikleri SELECT VARIABLE_NAME, VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME IN ( 'Connections', 'Max_used_connections', 'Threads_connected', 'Threads_running' ); -- Query cache istatistikleri SELECT VARIABLE_NAME, VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'Qcache%';
Replication Kurulumu#
Master Sunucu Yapılandırması#
# /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW binlog_do_db = uygulama_db
-- Replication kullanıcısı oluştur CREATE USER 'repl_user'@'%' IDENTIFIED BY 'replication_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; -- Master durumunu kaydet SHOW MASTER STATUS;
Slave Sunucu Yapılandırması#
# /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] server-id = 2 relay-log = /var/log/mysql/mysql-relay-bin.log
-- Master'a bağlan CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl_user', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; -- Replication'ı başlat START SLAVE; -- Slave durumunu kontrol et SHOW SLAVE STATUS\G
Sonuç#
MySQL veritabanı yönetimi, sistem yöneticileri için kritik bir beceridir. Bu rehberde ele aldığımız konular:
- Kurulum ve temel yapılandırma
- Kullanıcı ve yetki yönetimi
- Yedekleme ve geri yükleme stratejileri
- Performans optimizasyonu
- Güvenlik yapılandırması
- Monitoring ve troubleshooting
- Replication kurulumu
Düzenli bakım, monitoring ve güvenlik güncellemeleri ile MySQL sunucunuzun güvenli ve performanslı çalışmasını sağlayabilirsiniz.