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
- Yazan
- ADVEYER Teknik Ekip
- 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 | gzippipe yöntemi. - Güvenlik: Parolayı terminalde doğrudan yazma yerine
~/.my.cnfkullan veya SSH anahtar ile eriş. - Tutarlılık (InnoDB):
--single-transaction --quick --skip-lock-tableskullan. (MyISAM için--lock-tablesgerekebilir.)
Standart Yedek Alma (mysqldump)
MySQL veritabanınızı aşağıdaki mysqldump komutunu kullanarak kolayca yedekleyebilirsiniz:
mysqldump -u kullaniciadi -p dbadi > backup.sqlBu 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:
mysqldump -u root -p ornekveritabani > ornekbackup.sqlSı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:
mysqldump -u kullaniciadi -p dbadi | gzip > backup.sql.gzBu 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:
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.gzAçı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.cnfkullan.--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.cnfveya/home/backupuser/.my.cnfiçine:
[client]
user=dbuser
password=DBPASSWORDve 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.gzSSH 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-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 db2veya--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:
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 dbnameYedek 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 testdbBü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):
#!/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.)
fiCron Satırı (günlük 03:15):
15 3 * * * /usr/local/bin/backup_mysql.sh >> /var/log/backup_mysql.log 2>&1Güvenlik Tavsiyeleri
- Parolayı komutta yazma. Kullan
.my.cnfdosyası vechmod 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_passveyagpg --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.encPratik Senaryolar
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.gzTü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.gzRemote 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/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.cnfveya 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).

