Veritabanı

MySQL Yedek Alma ve Geri Yükleme

MySQL Yedek Alma ve Geri Yükleme

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.cnf dosyasında max_allowed_packet değ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=utf8mb4 parametresi 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 ise SET 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.

#mysql#mysqldump#sistem yonetimi#veritabanı#yedekleme

Comments

No comments yet. Write the first comment.

Write a comment

Comments are published after admin approval.