Docker’da MySQL Veritabanı Yedekleme

Bu blog yazısında, Docker ortamında çalışan MySQL veritabanlarınızı nasıl yedekleyeceğinizi adım adım anlatacağız. Kullanacağımız script ile otomatik yedeklemeleri nasıl planlayabileceğinizi ve bu yedekleri güvenli bir şekilde nasıl saklayabileceğinizi öğreneceksiniz.

MySQL veritabanları, web uygulamalarından büyük veri platformlarına kadar birçok sistem için kritik öneme sahiptir. Docker kullanarak geliştirme ve üretim ortamlarınızı yönetiyorsanız, veritabanı yedeklemelerinizi düzenli olarak yapmak, olası veri kaybı durumlarında hayati önem taşır. Bu yazıda, Docker konteynerleri üzerinde MySQL veritabanı yedeklemesi yapmanın basit ve etkili bir yöntemini sunacağız.

MySQL Veritabanı Yedekleme Script’i

Bu bölümde, Docker ortamında çalışan MySQL veritabanları için hazırladığımız yedekleme script’inin her bir bölümünü detaylı olarak ele alacağız. Script, veritabanınızı yedeklemenin yanı sıra, yedek dosyalarını sıkıştırır ve güvenli bir şekilde uzak bir sunucuya aktarmanıza olanak tanır. Ayrıca, belirli sayıda en yeni yedeği korurken daha eski yedekleri otomatik olarak siler.

#!/bin/bash

# Benzersiz yedek dosya adları için geçerli tarih YYYY-MM-DD-HHMMSS formatında
DATE=$(date +%F-%H%M%S)

# Ana bilgisayarda yedek dizini
BACKUP_DIR="/root/backups/mysqldb1"

# Veritabanı erişim bilgileri
DB_HOST="mysqldb1"  # MySQL Docker konteyner adı
DB_USER="root"
DB_PASSWORD="linuxuzmani1234##"
DB_NAME="product"
NETWORK="product_newtork"    # MySQL Docker Konteyner ağı

# Kullanılacak MySQL Docker imajı versiyonu
MYSQL_IMAGE="mysql:8.0"

# Yedek dosya adı
BACKUP_FILENAME="$BACKUP_DIR/$DB_NAME-$DATE.sql"
COMPRESSED_BACKUP_FILENAME="$BACKUP_FILENAME.gz"

# Yedekleme dizininin var olduğundan emin olun
mkdir -p $BACKUP_DIR

# Yeni bir Docker konteyneri içinde mysqldump komutunu çalıştır
docker run --rm --network $NETWORK -e MYSQL_PWD=$DB_PASSWORD $MYSQL_IMAGE \
  mysqldump -h $DB_HOST -u $DB_USER $DB_NAME > $BACKUP_FILENAME

# Yedek dosyayı sıkıştır
gzip $BACKUP_FILENAME

# Yedek dosyayı uzak sunucuya SCP ile aktar
SCP_DEST="root@uzaksunucu_ip:/root/uzak_sunucu_backups/mysqldb1"
scp $COMPRESSED_BACKUP_FILENAME $SCP_DEST

# Sadece en yeni 7 yedeği sakla, daha eski olanları sil
cd $BACKUP_DIR
ls -1t | tail -n +9 | xargs -r rm --

# Uzak sunucuda sadece en yeni 7 yedeği sakla, daha eski olanları sil
SSH_DEST="root@uzaksunucu_ip"
ssh $SSH_DEST "cd /root/uzak_sunucu_backups/mysqldb1; ls -1t | tail -n +8 | xargs -r rm --"

MySQL Veritabanı Yedekleme Script’i Detaylı İnceleme

Bu bölümde, Docker ortamında çalışan MySQL veritabanları için hazırladığımız yedekleme script’inin her bir bölümünü detaylı olarak ele alacağız. Script, veritabanınızı yedeklemenin yanı sıra, yedek dosyalarını sıkıştırır ve güvenli bir şekilde uzak bir sunucuya aktarmanıza olanak tanır. Ayrıca, belirli sayıda en yeni yedeği korurken daha eski yedekleri otomatik olarak siler.

Zaman Damgası ve Dosya Adı Oluşturma

DATE=$(date +%F-%H%M%S)
BACKUP_FILENAME="$BACKUP_DIR/$DB_NAME-$DATE.sql"
  • DATE değişkeni, her yedekleme işlemi için benzersiz bir zaman damgası oluşturur. Bu, yedek dosyalarının üzerine yazılmasını önler ve yedeklerin ne zaman alındığını kolayca anlamanızı sağlar.
  • BACKUP_FILENAME değişkeni, yedek dosyasının adını ve konumunu tanımlar. Dosya adı, veritabanı adı ve alındığı zaman damgasını içerir.

2. Yedekleme Dizinini Kontrol Etme ve Oluşturma

mkdir -p $BACKUP_DIR

mkdir -p komutu, belirtilen yedekleme dizininin var olup olmadığını kontrol eder ve mevcut değilse oluşturur. Bu, script’in her çalıştığında sorunsuz bir şekilde yedekleme yapmasını garanti altına alır.

3. Docker Konteyneri Üzerinden mysqldump Çalıştırma

docker run --rm --network $NETWORK -e MYSQL_PWD=$DB_PASSWORD $MYSQL_IMAGE \
mysqldump -h $DB_HOST -u $DB_USER $DB_NAME > $BACKUP_FILENAME
  • docker run --rm komutu, yedekleme işlemi tamamlandığında konteyneri otomatik olarak siler. Bu, gereksiz kaynak kullanımını önler.
  • --network $NETWORK ve -e MYSQL_PWD=$DB_PASSWORD seçenekleri, Docker konteynerinin doğru ağa bağlanmasını ve MySQL kullanıcı şifresinin güvenli bir şekilde kullanılmasını sağlar.
  • mysqldump komutu, belirtilen MySQL veritabanından yedeği alır ve çıktıyı BACKUP_FILENAME ile belirtilen dosyaya yönlendirir.

4. Yedek Dosyasını Sıkıştırma

gzip $BACKUP_FILENAME

gzip komutu, alınan SQL yedeğini gzip formatında sıkıştırır. Bu, disk alanından tasarruf sağlar ve dosyaların uzak sunucuya aktarılmasını hızlandırır.

5. Yedek Dosyasını Uzak Sunucuya SCP ile Aktarma

scp $COMPRESSED_BACKUP_FILENAME $SCP_DEST

scp komutu, sıkıştırılmış yedek dosyasını güvenli bir şekilde SSH üzerinden uzak sunucuya kopyalar. Bu, yedeklerin farklı bir lokasyonda güvenli bir şekilde saklanmasını sağlar.

6. Eski Yedekleri Temizleme

ls -1t | tail -n +9 | xargs -r rm --

Bu komut, yedekleme dizinindeki dosyaları en yeni olanından başlayarak listeler, ilk 8 dosya dışındaki tüm dosyaları siler. Bu, disk alanını yönetirken yalnızca en yeni yedekleri korumanıza olanak tanır.

Uzak Sunucuda Yedeklerin Yönetimi

Script ayrıca uzak sunucuda yedek dosyalarını yönetmek için SSH komutlarını kullanır:

ssh $SSH_DEST "cd /root/uzak_sunucu_backups/mysqldb1; ls -1t | tail -n +9 | xargs -r rm --"

Bu komut, uzak sunucuda /root/uzak_sunucu_backups/mysqldb1 dizinine SSH üzerinden bağlanır, yedek dosyaları en yeni olanından başlayarak listeler ve ilk 8 dosya hariç diğerlerini siler. Bu otomatik temizleme işlemi, uzak sunucuda yeterli depolama alanının korunmasını sağlar ve yönetimi kolaylaştırır.

Crontab ile Otomatik Yedekleme Ayarlama

Veritabanı yedeklemelerinizi otomatikleştirmek için, Linux’un crontab aracını kullanarak yedekleme script’inizi belirli zamanlarda çalışacak şekilde ayarlayabilirsiniz. Önerilen crontab girdisi şu şekildedir:

0 12 * * * /root/db_backup.sh >> /var/log/db_backup.log 2>&1
0 18 * * * /root/db_backup.sh >> /var/log/db_backup.log 2>&1
59 23 * * * /root/db_backup.sh >> /var/log/db_backup.log 2>&1

Bu zamanlama ile script her gün öğlen 12:00, akşam 18:00 ve gece 23:59’da çalışır. Yedekleme işlemleri ve olası hatalar /var/log/db_backup.log dosyasına kaydedilir.

Docker kullanarak MySQL veritabanı yedeklemeleri yapmak, veri bütünlüğünüzü korumanın önemli bir parçasıdır. Yukarıda verilen script ve crontab ayarları, bu süreci otomatize etmenize ve olası bir veri kaybında verilerinizi güvenle geri yüklemenize olanak tanır. Unutmayın, düzenli yedekleme, veritabanı yönetiminin ayrılmaz bir parçasıdır.

Script’in Öne Çıkan Yararları

  1. Otomatikleştirme: Crontab ile yapılandırıldığında, bu script belirlenen zamanlarda otomatik olarak çalışır ve sürekli bir müdahale gerektirmez. Bu, sistem yöneticileri ve veritabanı yöneticileri için zaman tasarrufu sağlar.
  2. Esneklik: Script, kullanıcı ihtiyaçlarına göre kolayca özelleştirilebilir. Farklı veritabanı adları, kullanıcı bilgileri veya hedef dizinlerle uyumlu hale getirilebilir.
  3. Güvenlik: Yedeklerin sıkıştırılması ve güvenli protokoller kullanılarak uzak sunuculara transfer edilmesi, verilerin korunmasını sağlar.
  4. Depolama Yönetimi: Script’in eski yedekleri otomatik olarak silme özelliği, depolama alanının verimli kullanımını sağlar ve disk alanı maliyetlerini azaltır.

Docker’da çalışan MySQL veritabanlarınız için etkili bir yedekleme stratejisi geliştirmek, olası bir sistem hatası veya veri kaybı durumunda verilerinizi hızla ve güvenle kurtarmanızı sağlar. Bu script, basit bir yapılandırma ile güçlü ve güvenilir bir yedekleme çözümü sunar. Veritabanı yedekleme pratiklerinizi iyileştirmek ve veri güvenliğinizi artırmak istiyorsanız, bu script’i düzenli olarak kullanmayı düşünebilirsiniz.