mysqldump çıktısını sıkıştırarak yedekleme
Selamlar arkadaşlar, bu yazımda MySQL tarafında neredeyse her ekibin bir noktada karşılaştığı bir konuya bakacağız: mysqldump çıktısını nasıl sıkıştırırız, hangi araç hangi senaryoda işe yarar. Bence bu, özellikle veri tabanı büyüdükçe bir 'lüks' olmaktan çıkıp 'zaruret' haline geliyor. Hadi başlayalım.
10 GB'lık bir veritabanı düz mysqldump ile çoğu zaman 10 GB ya da daha büyük bir SQL dosyası üretir. SQL metin formatı çok tekrar eden satır içerdiği için sıkıştırma oranları gerçekten cömert: tipik olarak %70-90 arasında bir kazanç görüyorsunuz. Hem disk hem de dosyayı başka bir sunucuya çekerken bant genişliği için iyi haber. mysqldump çıktısını stdout'a yazdığı için Linux'un sıkıştırma araçlarıyla doğrudan pipe'lanabilir, ekstra ara dosya yok.
gzip ile klasik yol
İşin yüzde sekseni bu komutla biter. gzip neredeyse her sunucuda kurulu, hız ve oran dengesi makul:
mysqldump -u root -p \
--single-transaction \
--quick \
myapp \
| gzip > /backup/myapp_$(date +%Y%m%d_%H%M%S).sql.gz
--single-transaction InnoDB tablolarda tutarlı bir snapshot alır, --quick ise satır satır okuyup belleği şişirmez. Pipe sonrası gzip doğrudan dosyaya yazıyor. Açıkçası ben günlük cron yedeklerinde uzun yıllar bu satırı kullandım, başını ağrıtmaz.
pigz ile paralel gzip
Sunucunun çekirdek sayısı gzip'i tek başına bekletmesin. pigz aynı algoritmayı paralel uygular:
mysqldump -u root -p \
--single-transaction \
myapp \
| pigz -p 4 > /backup/myapp_$(date +%Y%m%d).sql.gz
Çıktı yine .gz, restore tarafında bir şey değişmiyor. CPU'sunu paylaşacağı başka iş yoksa yedek penceresini ciddi şekilde kısaltır.
zstd: hız ve oran arasında tatlı nokta
Son birkaç yıldır zstd gerçekten yaygınlaştı, çoğu dağıtımın deposunda hazır. Bana sorarsanız gece yedekleri için en mantıklı varsayılan bu artık:
mysqldump -u root -p \
--single-transaction \
myapp \
| zstd -o /backup/myapp_$(date +%Y%m%d).sql.zst
Hem gzip kadar hızlı, hem de oran olarak ona yakın ya da daha iyi. --long veya seviye ayarlarıyla daha da kurcalayabilirsiniz ama varsayılanlar çoğu durumda yeter.
xz: arşiv için en iyi oran
Yedek bir kez alınacak ve aylarca soğuk depoda duracaksa xz (LZMA) en iyi sıkıştırmayı verir, fakat yavaştır:
mysqldump -u root -p \
--single-transaction \
myapp \
| xz -T 4 > /backup/myapp_$(date +%Y%m%d).sql.xz
-T 4 paralel iş parçacığı (thread) verir. Geceleri pencere bolsa, saklama maliyeti yüksekse xz işini görür.
Karşılaştırma
Bicim | Oran | Hiz | CPU | Uzanti
--------|----------|-----------|-----------|----------
gzip | iyi | hizli | dusuk | .sql.gz
pigz | iyi | daha hizli| yuksek | .sql.gz
bzip2 | daha iyi | yavas | orta | .sql.bz2
xz | en iyi | yavas | yuksek | .sql.xz
zstd | iyi | hizli | dusuk-orta| .sql.zst
Uzak sunucudan yedek alıyorsanız
mysqldump ile sunucu arasındaki trafiği de ayrıca sıkıştırabilirsiniz - bu disk sıkıştırmasından bağımsızdır:
mysqldump -u root -p \
--compression-algorithms=zlib \
--single-transaction \
--host=remote-db.example.com \
myapp \
| gzip > /backup/myapp_remote_$(date +%Y%m%d).sql.gz
Eski --compress bayrağı MySQL 8.0.18'de deprecate, 8.4'te tamamen kaldırıldı. Yerine --compression-algorithms kullanın (zlib, zstd, uncompressed).
Geri yükleme
Sıkıştırılmış dosyayı doğrudan mysql'e pipe etmek en temiz yol:
zcat /backup/myapp_20260331.sql.gz | mysql -u root -p myapp
xzcat /backup/myapp_20260331.sql.xz | mysql -u root -p myapp
zstd -d < /backup/myapp_20260331.sql.zst | mysql -u root -p myapp
Sık karşılaşılan hatalar
- Bütünlüğü hiç doğrulamamak: Dosyanın diske düşmesi, dosyanın sağlam olduğu anlamına gelmez.
gzip -t dosya.gzveyazstd -t dosya.zstile periyodik kontrol yapın. --single-transactionkoymadan InnoDB yedeği almak: Yedek sırasında aktif yazımlar olursa tutarsız bir snapshot çıkar. Bu bayrak yedeği bir transaction içine alır.- Sadece sıkıştırılmış dosyaya bakıp restore'u test etmemek: Yedek 'kullanılabilir' midir, ancak restore deneyince anlaşılır. Ayda bir test ortamına geri yükleyin.
Kapanış
Bu yazıda mysqldump çıktısını gzip, zstd ve xz ile nasıl sıkıştıracağımıza, restore akışına ve uzak sunucu yedeklerinde nelere dikkat edileceğine baktık. Şahsi kanaatim, günlük yedekler için zstd, uzun süreli arşivler için xz makul bir varsayılan. Umarım faydalı olur, bir sonraki yazıda görüşmek üzere.
