Web hosting paketlerinde ücretsiz site taşıma

ADVEYER
USD / TLGünün kuru (13 Kasım 2026). TL fiyatlar bu kurla hesaplanır. 50,21 ₺

Linux’ta SSH ile MySQL Yedek Alma ve Geri Yükleme

Linux’ta SSH ve mysqldump ile MySQL yedek alma: sıkıştırma, uzak sunucudan yedek, geri yükleme, cron ile otomasyon ve güvenlik önerileri.

Tahmini Süre
6 dakika
Zorluk
Orta
Yayın Tarihi
Son Güncelleme
Bu Sayfada

Linux sunucularda MySQL veritabanı yedekleme işlemi, özellikle büyük boyutlu SQL dosyaları söz konusu olduğunda doğru yöntemler kullanılmazsa oldukça zahmetli hale gelebilir. Örneğin, phpMyAdmin belirli limitler nedeniyle büyük veritabanlarında yedekleme veya geri yükleme işlemlerinde yetersiz kalabilir.

Bu gibi durumlarda, SSH üzerinden doğrudan komut satırında işlem yapmak, büyük veritabanlarını yedeklemenin en pratik ve etkili yöntemidir. Aşağıdaki adımları izleyerek SSH ile MySQL veritabanı yedeği alabilir, yedeği geri yükleyebilir ve yedeklemeyi otomatik hale getirebilirsiniz.

Hangi Durumda 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.)

Standart Yedek Alma (mysqldump)

MySQL veritabanınızı aşağıdaki mysqldump komutunu kullanarak kolayca yedekleyebilirsiniz:

bash
mysqldump -u kullaniciadi -p dbadi > backup.sql

Bu komut, belirtilen veritabanının yedeğini backup.sql adlı dosyaya kaydeder. Komutu çalıştırdığınızda sizden MySQL kullanıcı parolanız istenecektir.

Örnek:

bash
mysqldump -u root -p ornekveritabani > ornekbackup.sql

Sıkıştırılmış Yedek Alma

Büyük veritabanlarında yerden tasarruf etmek istiyorsanız, yedeğinizi sıkıştırılmış bir şekilde alabilirsiniz:

bash
mysqldump -u kullaniciadi -p dbadi | gzip > backup.sql.gz

Bu yöntemle yedeğiniz .gz uzantılı bir sıkıştırılmış dosya olarak kaydedilir. Böylece hem disk alanından tasarruf eder, hem de yedekleme sürecini hızlandırırsınız.

Uzak Sunucudan Tek Komutla Yedek Alma

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

bash
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:
ini
[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):

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

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:

bash
ssh -L 33306:127.0.0.1:3306 kullanıcı@uzak-sunucu-ip -N
  • -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ı.

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 : 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.

Yedeği Geri Yükleme (Restore)

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

bash
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:

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

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:
bash
zcat file.sql.gz | mysql -u testuser -p testdb
# veya
gunzip < file.sql.gz | mysql -u testuser -p testdb

Büyük Veritabanları: Performans ve 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.

Otomatik Yedekleme: Script, Cron ve Saklama Süresi

Yedekleme işlemini otomatik hale getirmek isterseniz, bu komutları cron job olarak zamanlayabilir ve düzenli aralıklarla otomatik MySQL yedeği alabilirsiniz.

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

bash
#!/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):

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

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:

bash
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

Pratik Senaryolar

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

bash
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

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

bash
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

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

Uzakta depolama alanı yeterliyse:

bash
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/

MySQL Yedek Alma Özet Kontrol Listesi

  • 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).

Bu Rehber İşinize Yaradı mı?

İlgili Rehberler