Veritabanı sistemlerinde sürekliliği sağlamanın ve veri kaybı riskini ortadan kaldırmanın en temel yolu düzenli yedek almaktır. Donanım arızaları, fidye yazılımı (ransomware) saldırıları, hatalı yazılım güncellemeleri veya insan kaynaklı yanlış sorgular, dakikalar içinde geri dönülemez hasarlara yol açabilir. Bu nedenle bir sistem yöneticisinin veya yazılım geliştiricisinin bilmesi gereken ilk operasyonel süreçlerden biri doğru yapılandırılmış bir MySQL yedek stratejisidir.
MySQL ekosisteminde mantıksal (logical) yedekleme için en yaygın ve güvenilir araç mysqldump yardımcı programıdır. Bu araç, veritabanındaki tabloları, verileri ve şemaları standart SQL ifadelerine (CREATE TABLE, INSERT INTO gibi) dönüştürerek metin tabanlı bir dosya üretir.
mysqldump Kullanım Mantığı ve Yetkilendirme
Yedek alma işlemine başlamadan önce komut satırından işlem yapacak kullanıcının MySQL üzerinde gerekli izinlere sahip olması gerekir. Eksiksiz bir mantıksal yedek alabilmek için kullanıcının en az şu izinlere sahip olması önerilir:
- SELECT: Tablolardaki verileri okumak için gereklidir.
- SHOW VIEW: Görünümleri (views) dışa aktarabilmek için gereklidir.
- TRIGGER: Tablolara bağlı tetikleyicileri alabilmek için gereklidir.
- LOCK TABLES: Tutarlılık sağlamak amacıyla yedekleme sırasında tabloları kilitleyebilmek için gereklidir.
Yedek alırken InnoDB depolama motoru kullanılıyorsa, tabloları kilitlemeden ve canlı sistemi aksatmadan işlem yapmak için --single-transaction parametresi tercih edilmelidir. Bu parametre, yedeğin başladığı andaki veri durumunu izole ederek tutarlı bir anlık görüntü (snapshot) oluşturur.
mysqldump ile MySQL Yedek Alma Yöntemleri
Farklı senaryolara göre tek bir veritabanı, birden çok veritabanı veya sunucunun tamamı yedeklenebilir.
Tek Bir Veritabanını Yedekleme
En sık kullanılan yöntem, tek bir veritabanının tüm tablo ve kayıtlarını içeren bir SQL dosyası üretmektir.
mysqldump -u kullanici_adi -p --single-transaction --quick --routines --triggers veritabani_adi > veritabani_yedek.sql
Bu komuttaki parametrelerin işlevleri şunlardır:
-u kullanici_adi: Veritabanına bağlanacak yetkili kullanıcı adını belirtir.-p: Şifrenin komut çalıştırıldıktan sonra güvenli bir şekilde sorulmasını sağlar.--single-transaction: InnoDB tabloları için kilit koymadan tutarlı yedek alır.--quick: Satırları tek tek diskten okuyup doğrudan çıktıya yazar, sunucu belleğinde aşırı yük oluşmasını engeller.--routines: Saklı yordamları (stored procedures) ve fonksiyonları yedeğe dahil eder.--triggers: Tablo tetikleyicilerini yedeğe ekler.>: Çıktıyı belirtilen SQL dosyasına yönlendirir.
Birden Fazla Veritabanını Birlikte Yedekleme
Aynı MySQL sunucusunda bulunan birden fazla projeyi tek bir komutla yedeklemek mümkündür.
mysqldump -u kullanici_adi -p --databases db_proje1 db_proje2 db_proje3 > coklu_yedek.sql
--databases parametresi kullanıldığında, oluşturulan SQL dosyasının içine otomatik olarak CREATE DATABASE ve USE komutları eklenir. Bu sayede geri yükleme aşamasında hedef veritabanlarının önceden elle oluşturulmasına gerek kalmaz.
Tüm MySQL Sunucusunu Yedekleme
Sunucudaki tüm kullanıcıları, izin tablolarını ve sistem veritabanları dahil tüm içerikleri tek seferde yedeklemek için --all-databases parametresi kullanılır.
mysqldump -u root -p --all-databases --single-transaction --routines --triggers > tum_sunucu_yedek.sql
Bu yöntem tam sunucu taşımalarında veya felaket kurtarma senaryolarında tüm yapıyı tek bir metin dosyasında toplamayı sağlar.
Yalnızca Tablo Yapısını (Şemasını) Yedekleme
Bazen test ortamları kurarken gerçek verilere ihtiyaç duyulmaz; yalnızca boş tabloların ve ilişkilerin alınması istenir.
mysqldump -u kullanici_adi -p --no-data veritabani_adi > sema_yedek.sql
--no-data parametresi, INSERT sorgularını dışarıda bırakarak yalnızca CREATE TABLE gibi yapısal SQL komutlarını dosyaya yazar.
Yedeği Sıkıştırarak Alma
Büyük boyutlu veritabanlarında diske doğrudan devasa bir SQL dosyası yazmak yerine çıktıyı anında gzip aracılığıyla sıkıştırmak disk alanından ve işlem süresinden tasarruf sağlar.
mysqldump -u kullanici_adi -p --single-transaction veritabani_adi | gzip > veritabani_yedek.sql.gz
Boru hattı (pipe) operatörü ile mysqldump çıktısı doğrudan sıkıştırma aracına gönderilir ve .sql.gz uzantılı arşiv dosyası oluşturulur.
MySQL Yedek Dosyasını Geri Yükleme
Alınan bir SQL yedeğini sisteme aktarmak için standart mysql istemci aracı kullanılır.
Standart SQL Dosyasını Geri Yükleme
Geri yükleme yapılacak veritabanı daha önceden sistemde bulunmuyorsa öncelikle MySQL sunucusuna bağlanıp veritabanını oluşturmak gerekir.
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS veritabani_adi CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
Veritabanı hazırlandıktan sonra SQL dosyası yönlendirme operatörüyle içe aktarılır:
mysql -u kullanici_adi -p veritabani_adi < veritabani_yedek.sql
Bu komut, dosya içerisindeki tüm sorguları sırayla çalıştırarak tabloları ve verileri hedef veritabanına yeniden işler.
Sıkıştırılmış Yedeği Geri Yükleme
Arşivlenmiş .sql.gz yedeğini diske açmadan doğrudan MySQL içerisine aktarmak için gunzip veya zcat kullanılabilir:
gunzip < veritabani_yedek.sql.gz | mysql -u kullanici_adi -p veritabani_adi
Bu işlem ekstra disk alanı harcamadan sıkıştırılmış içeriği doğrudan akış üzerinden veritabanına yazar.
Geri Yükleme Aşamasında Dikkat Edilmesi Gerekenler
Büyük boyutlu yedekleri geri yüklerken bazı yaygın hatalarla karşılaşılabilir:
- max_allowed_packet Hatası: Eğer tek bir satırda veya BLOB alanda çok büyük veri varsa MySQL bağlantıyı kesebilir. Bu durum için
/etc/mysql/my.cnfdosyasındamax_allowed_packetdeğeri (örneğin 64M veya 128M) artırılmalıdır. - Karakter Kodlaması Uyuşmazlıkları: Yedeği alırken ve yüklerken
--default-character-set=utf8mb4parametresi eklenerek Türkçe ve özel karakterlerin bozulması önlenmelidir. - Yabancı Anahtar (Foreign Key) Kontrolleri: Büyük geri yüklemelerde performansı artırmak için SQL dosyasının başına
SET FOREIGN_KEY_CHECKS=0;, sonuna iseSET FOREIGN_KEY_CHECKS=1;ifadeleri eklenebilir.
Güvenlik ve Otomasyon
Komut satırında şifreyi -pParola şeklinde açık metin olarak yazmak ciddi bir güvenlik açığıdır. Linux sistemlerde ps aux veya history komutları ile diğer kullanıcılar bu şifreyi görebilir. Bunun yerine kullanıcının ev dizininde kısıtlı izinlere sahip bir .my.cnf dosyası oluşturulmalıdır.
Dosya oluşturma ve izin kısıtlama:
touch ~/.my.cnf
chmod 600 ~/.my.cnf
Dosya içeriği:
[client]
user = kullanici_adi
password = gizli_sifreniz
Bu yapılandırma sayesinde mysqldump ve mysql komutlarını çalıştırırken kullanıcı adı ve şifre girmenize gerek kalmaz; araçlar kimlik bilgilerini otomatik olarak bu dosyadan okur.
Düzenli bir MySQL yedek süreci için Linux Cron servisine görev tanımlanabilir. Her gece saat 03:00’da tarih formatlı yedek almak için crontab -e dosyasına şu satır eklenebilir:
0 3 * * * mysqldump --single-transaction veritabani_adi | gzip > /var/backups/mysql/db_$(date +%Y%m%d_%H%M).sql.gz
Özet ve Sonraki Adımlar
Veritabanı güvenliği, yedek dosyasının başarıyla oluşturulduğunu doğrulamakla tamamlanmış sayılmaz. Bir yedeğin geçerliliği, ancak başarıyla geri yüklenebildiğinde kesinleşir. Otomatik alınan yedeklerin belirli aralıklarla izole bir test sunucusunda açılarak bütünlüğünün doğrulanması (restore drill) ve saklanan dosyaların sunucu dışındaki güvenli bir depolama alanına (örneğin uzaktaki bir S3 veya SFTP sunucusu) şifrelenerek aktarılması bir sonraki adımınız olmalıdır.


Comments
No comments yet. Write the first comment.