SSH Üzerinden MySQL Veritabanı Yedeği Alma

1) Kısa özet — hangi durumlarda hangi yöntem

  • Küçük/orta boyutlu veritabanları: mysqldump + gzip — en yaygın, taşınması kolay.

  • Büyük veritabanları / yüksek performans ihtiyacı: Percona XtraBackup veya LVM snapshot — online (hot) yedekleme, hızlı kurtarma.

  • Hızlı tek komut ile uzak sunucudan yedek indirme: SSH ile mysqldump | gzip pipe yöntemi.

  • Güvenlik: Parolayı terminalde doğrudan yazma yerine ~/.my.cnf kullan veya SSH anahtar ile eriş.

  • Tutarlılık (InnoDB): --single-transaction --quick --skip-lock-tables kullan. (MyISAM için --lock-tables gerekebilir.)

2) Temel: tek komutla uzak sunucudan yedek alma (en sık kullanılan)

Sunucuda root/ssh erişimin varsa ve mysqldump kurulu ise local bilgisayarına yedek almak için:

ssh kullanıcı@uzak-sunucu-ip "mysqldump -u dbuser -p'dbpassword' --single-transaction --quick --routines --events --triggers dbname | gzip -c" > /local/backups/dbname_$(date +%F_%H%M).sql.gz

Açıklamalar:

  • ssh kullanıcı@uzak-sunucu-ip "..." — uzak komutu çalıştırır.

  • mysqldump -u dbuser -p'dbpassword' — dikkat: parola komutta görünür (güvenlik riski). Mümkünse .my.cnf kullan.

  • --single-transaction --quick — InnoDB için tutarlı, bellek kullanımını düşürür.

  • --routines --events --triggers — prosedür, olay ve trigger yakalamak için.

  • gzip -c → sıkıştırıp STDOUT’a yazıyor, > ile local dosyaya kaydediyoruz.

Daha güvenli parola yöntemi (önerilen):

  • Uzak sunucuda /root/.my.cnf veya /home/backupuser/.my.cnf içine:

[client]
user=dbuser
password=DBPASSWORD

ve dosya izinleri chmod 600 ~/.my.cnf olmalı. Böylece mysqldump -p sormazken parola görünmez.

Komut örneği (.my.cnf kullanılarak):

ssh backup@uzak "mysqldump --defaults-file=/home/backup/.my.cnf --single-transaction --quick --routines --events --triggers dbname | gzip -c" > dbname_$(date +%F).sql.gz

3) Alternatif: yerel bilgisayardan SSH tüneli açıp mysqldump çalıştırma

Eğer MySQL portu (3306) sadece localhost’ta açıksa ve SSH ile tünel açmak istersen:

ssh -L 33306:127.0.0.1:3306 kullanıcı@uzak-sunucu-ip -N # yeni terminalde: mysqldump -h 127.0.0.1 -P 33306 -u dbuser -p dbname | gzip -c > dbname_$(date +%F).sql.gz
  • -L 33306:127.0.0.1:3306 → local 33306 portunu uzakın 3306 portuna bağlarsın.

  • Tünel kullanışlıysa otomasyonun parolasız bağlantı (my.cnf) ile yapılmalı.

4) Restore (geri yükleme) nasıl yapılır?

Sıkıştırılmış yedeği geri yüklemek:

gunzip < dbname_2025-11-06.sql.gz | mysql -u root -p dbname
# veya doğrudan ssh üzerinden:
ssh kullanıcı@uzak "gunzip -c /path/to/dbname.sql.gz | mysql -u dbuser -p'dbpass' dbname"

Eğer dosya büyükse pv ile izleyebilirsin:

pv dbname.sql.gz | gunzip | mysql -u root -p dbname

5) mysqldump seçenekleri — hangi durumda ne kullanmalı

  • --single-transaction : InnoDB için online ve tutarlı snapshot sağlar (tablo kilidi yok). Mutlaka kullan.

  • --quick : Dump sırasında satır satır okur, belleği korur.

  • --skip-lock-tables : Tabloları kilitlemeyi atlar (InnoDB ile uyumlu).

  • --lock-tables : MyISAM vb için tablo kilidi gerekir.

  • --routines --events --triggers --gtids : Stored procedure, event ve trigger’ları da yedekler.

  • --databases db1 db2 veya --all-databases : birden fazla DB ya da tümünü dump eder.

  • --single-transaction --master-data=2 : replika kurulumları için binlog pozisyonunu kaydetmek istiyorsan kullan.

6) Büyük veritabanları — performans & alternatif çözümler

  • Percona XtraBackup: fiziksel (binary) hot-backup alır, InnoDB tabloları için ideal, point-in-time recovery ile güçlü.

  • LVM snapshot: disk seviyesinde snapshot alıp ardından dosyaları kopyalamak.

  • mydumper / myloader: paralel dump/restore yaparak hız kazandırır.

Eğer DB boyutu GB’larca ise mysqldump yedekleme ve geri yükleme çok uzun sürebilir. O zaman XtraBackup tercih et.

7) Otomasyon: basit yedekleme script + cron + retention

backup_mysql.sh örneği (uzak sunucudan çekme):

#!/bin/bash
# Konfigürasyon
REMOTE_USER=backup
REMOTE_HOST=1.2.3.4
REMOTE_MYCNF="/home/backup/.my.cnf"
DBNAME=yourdb
BACKUP_DIR=/backup/mysql
DATE=$(date +%F_%H%M)
SSH_OPTS="-o StrictHostKeyChecking=no"

mkdir -p "$BACKUP_DIR"

# Yedek al (uzakta mysqldump çalıştır, gzip ile sıkıştır, local'e kaydet)
ssh $SSH_OPTS ${REMOTE_USER}@${REMOTE_HOST} "mysqldump --defaults-file=${REMOTE_MYCNF} --single-transaction --quick --routines --events --triggers ${DBNAME} | gzip -c" > ${BACKUP_DIR}/${DBNAME}_${DATE}.sql.gz

# Retention: 7 günden eski dosyaları sil
find ${BACKUP_DIR} -type f -name "${DBNAME}_*.sql.gz" -mtime +7 -exec rm {} \;

# Opsiyonel: yedek doğrulama (kontrol)
if gunzip -t ${BACKUP_DIR}/${DBNAME}_${DATE}.sql.gz >/dev/null 2>&1; then
  echo "Backup OK: ${DBNAME}_${DATE}.sql.gz"
else
  echo "Backup FAILED: ${DBNAME}_${DATE}.sql.gz" >&2
  # bildirim ekleyebilirsin (mail, slack vb.)
fi

Cron Satırı (günlük 03:15):

15 3 * * * /usr/local/bin/backup_mysql.sh >> /var/log/backup_mysql.log 2>&1

8) Güvenlik tavsiyeleri

  • Parolayı komutta yazma. Kullan .my.cnf dosyası ve chmod 600.

  • SSH anahtar ile parola olmadan ama güvenli bağlantı kur (public key auth).

  • Yedeklere erişimi kısıtla (sadece backup kullanıcıları).

  • Yedekleri şifrele: openssl enc -aes-256-cbc -salt -pbkdf2 -pass file:/root/.backup_pass veya gpg --symmetric.

  • Yedekleri farklı lokasyona (offsite) kopyala (rsync SFTP/Scp/ rclone ile S3).

  • Yedekleme scriptlerini logla ve başarı/başarısızlığı monitör et.

Örnek şifreleme komutu:

ssh user@host "mysqldump --defaults-file=/home/backup/.my.cnf yourdb | gzip -c" | openssl enc -aes-256-cbc -salt -pbkdf2 -out /backups/yourdb_$(date +%F).sql.gz.enc

9) Yedek bütünlüğünü kontrol etme

  • gunzip -t file.sql.gz : gzip içeriğini test eder.

  • Gerekirse yedeği geçici bir veritabanına geri yükleyerek doğrula:

zcat file.sql.gz | mysql -u testuser -p testdb
# veya
gunzip < file.sql.gz | mysql -u testuser -p testdb

10) Örnekler — pratik senaryolar

A) Tek veritabanını uzak sunucuda alıp local’e kaydet (parolasız MySQL config)

ssh backup@1.2.3.4 "mysqldump --defaults-file=/home/backup/.my.cnf --single-transaction --quick --routines --events --triggers yourdb" | gzip -c > /backups/yourdb_$(date +%F).sql.gz

B) Tüm veritabanlarını çek (all-databases)

ssh backup@1.2.3.4 "mysqldump --defaults-file=/root/.my.cnf --all-databases --single-transaction --quick | gzip -c" > /backups/all_dbs_$(date +%F).sql.gz

C) Remote mysqldump çalıştırıp remote sunucuda sıkıştırılmış dosya bırak (sonra scp ile çek)

Uzakta depolama alanı yeterliyse:

ssh backup@1.2.3.4 "mysqldump --defaults-file=/home/backup/.my.cnf yourdb | gzip -c > /tmp/yourdb_$(date +%F).sql.gz"
scp backup@1.2.3.4:/tmp/yourdb_$(date +%F).sql.gz /local/backups/

11) MySQL Veritabanı Yedeği Alma Özet öneriler (quick checklist)

  • Küçük veritabanları → mysqldump --single-transaction --quick + gzip.

  • Büyük ve aktif veritabanları → XtraBackup veya LVM snapshot.

  • Parolaları terminalde yazma; .my.cnf veya başka güvenli metod kullan.

  • Cron ile otomasyon + retention (ör: 7 gün).

  • Yedekleri test et (gunzip -t veya test restore).

  • Offsite kopya + şifreleme (opsiyonel ama önerilir).

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir