mysqldump’a Kapsamlı Kılavuz: MySQL Veritabanı Yedekleme, Geri Yükleme ve Otomasyon
mysqldump, MySQL ve MariaDB ile birlikte gelen ve veritabanı nesnelerini ile verilerini bir dizi SQL ifadesi olarak serileştirerek mantıksal yedeklemeler oluşturan bir komut satırı yardımcı programıdır. Elde edilen döküm dosyası, uyumlu herhangi bir sunucuda özdeş bir veritabanını yeniden oluşturabilir; bu da onu yedeklemeler, sunucular arası geçişler, sürüm yükseltmeleri ve olağanüstü durum kurtarma iş akışları için sektör standardı araç haline getirir.
Percona XtraBackup veya MySQL Enterprise Backup gibi fiziksel yedekleme araçlarının aksine, mysqldump SQL katmanında çalışır — canlı verileri MySQL protokolü aracılığıyla okur ve taşınabilir, insan tarafından okunabilir SQL yazar. Bu taşınabilirlik en büyük gücü ve ölçekte birincil kısıtlamasıdır.
mysqldump Arka Planda Gerçekte Ne Yapar
mysqldump’ı çağırdığınızda, istemci MySQL sunucusuna bağlanır, bilgi şemasını ve veri sözlüğünü sorgular ve standart çıktıya `CREATE DATABASE`, `CREATE TABLE`, `INSERT` ve DDL ifadelerinden oluşan bir akış yayar. Bu akışı bir dosyaya, bir kanala veya bir sıkıştırma yardımcı programına yönlendirirsiniz.
`–single-transaction` ile InnoDB tabloları için mysqldump, herhangi bir veriyi okumadan önce tekrarlanabilir okuma işlemi açar. Bu, global okuma kilitleri edinmeden tutarlı bir anlık görüntü sağlar — döküm sırasında veritabanı tamamen yazılabilir kalır. MyISAM tabloları için böyle bir mekanizma mevcut değildir; mysqldump, yazmaları kısa süreliğine engelleyen `FLUSH TABLES WITH READ LOCK`’a geri döner.
Bu ayrımı anlamak, üretim iş yükleri için mysqldump’ı seçmeden önce kritik öneme sahiptir. Şemanız InnoDB ve MyISAM tablolarını karıştırıyorsa, `–single-transaction` tek başına yetersizdir — `–lock-all-tables` veya bir bakım penceresi gerekecektir.
Ön Koşullar ve Gerekli Ayrıcalıklar
Herhangi bir döküm komutu çalıştırmadan önce aşağıdakileri doğrulayın:
- MySQL veya MariaDB kurulu ve erişilebilir durumda (yerel soket veya TCP/IP).
- Yedekleme kullanıcısı minimum gerekli ayrıcalıklara sahip:
- Tüm hedef tablolarda `SELECT`
- `LOCK TABLES` (yalnızca InnoDB ile `–single-transaction` kullanılmadığı sürece gereklidir)
- Görünümleri dahil etmek için `SHOW VIEW`
- Tetikleyicileri dahil etmek için `TRIGGER`
- MySQL 8+’da `–single-transaction` kullanırken `PROCESS`
- `FLUSH TABLES WITH READ LOCK` için `RELOAD`
- Replikasyon kurulumu için binary log koordinatlarına ihtiyaç duyuyorsanız `REPLICATION CLIENT`
Dökümleri root olarak çalıştırmak yerine özel bir yedekleme kullanıcısı oluşturun:
“`sql
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongPassword!';
GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER, PROCESS, RELOAD, REPLICATION CLIENT
ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
“`
mysqldump’ı root olarak ve kabuk komutuna gömülü bir parola ile çalıştırmak, kimlik bilgilerini işlem listelerinde ve kabuk geçmişinde açığa çıkarır — bu, paylaşımlı veya çok kullanıcılı herhangi bir sistemde önemli bir güvenlik riskidir.
Temel Sözdizimi
“`
mysqldump [OPTIONS] database_name [table1 table2 …] > backup_file.sql
“`
| Bileşen | Açıklama |
|---|
| — | — |
|---|
| `[OPTIONS]` | Bağlantı, çıktı biçimi ve davranışı kontrol eden bayraklar |
|---|
| `database_name` | Dışa aktarılacak hedef veritabanı |
|---|
| `[table1 table2 …]` | İsteğe bağlı: dökümü belirli tablolarla sınırla |
|---|
| `> backup_file.sql` | Standart çıktıyı bir dosyaya yönlendir |
|---|
Tam Seçenek Referansı
Bağlantı Seçenekleri
| Seçenek | Açıklama |
|---|
| — | — |
|---|
| `-u` / `–user` | MySQL kullanıcı adı |
|---|
| `-p` / `–password` | Parola iste (asla satır içine gömmeyiniz) |
|---|
| `-h` / `–host` | Ana bilgisayar adı veya IP adresi (varsayılan: localhost) |
|---|
| `-P` / `–port` | TCP portu (varsayılan: 3306) |
|---|
| `–socket` | Yerel bağlantılar için Unix soket yolu |
|---|
| `–ssl-ca` | Şifreli bağlantılar için CA sertifikası |
|---|
Kapsam Seçenekleri
| Seçenek | Açıklama |
|---|
| — | — |
|---|
| `–databases db1 db2` | Birden fazla adlandırılmış veritabanını dök |
|---|
| `–all-databases` | Sunucudaki her veritabanını dök |
|---|
| `–tables` | Belirli tablolarla sınırla (`–databases`’ı geçersiz kılar) |
|---|
| `–ignore-table=db.tbl` | Belirli bir tabloyu hariç tut; tekrarlanabilir |
|---|
| `–where='condition'` | Yalnızca WHERE koşuluyla eşleşen satırları dışa aktar |
|---|
Tutarlılık ve Kilitleme Seçenekleri
| Seçenek | Açıklama |
|---|
| — | — |
|---|
| `–single-transaction` | Kilitleme olmadan tutarlı InnoDB anlık görüntüsü |
|---|
| `–lock-all-tables` | Karma motorlu şemalar için global okuma kilidi |
|---|
| `–lock-tables` | Veritabanı başına tablo kilidi (InnoDB olmayan için varsayılan) |
|---|
| `–flush-logs` | Döküm öncesinde binary logları döndür |
|---|
| `–master-data=2` | Binary log konumunu yorum olarak yaz (replikasyon) |
|---|
| `–source-data=2` | `–master-data` için MySQL 8.0.26+ değiştirmesi |
|---|
Çıktı ve İçerik Seçenekleri
| Seçenek | Açıklama |
|---|
| — | — |
|---|
| `–no-data` | Yalnızca şema, satır verisi yok |
|---|
| `–no-create-info` | Yalnızca veri, CREATE TABLE ifadeleri yok |
|---|
| `–add-drop-table` | Her CREATE TABLE’dan önce DROP TABLE ekle |
|---|
| `–add-drop-database` | CREATE DATABASE’den önce DROP DATABASE ekle |
|---|
| `–routines` | Saklı prosedürleri ve fonksiyonları dahil et |
|---|
| `–triggers` | Tetikleyicileri dahil et (varsayılan olarak etkin) |
|---|
| `–events` | Zamanlanmış olayları dahil et |
|---|
| `–comments` | Meta veri yorumlarını dahil et (varsayılan olarak etkin) |
|---|
| `–compact` | Daha küçük çıktı için yorumları ve ekstra SQL’i bastır |
|---|
| `–hex-blob` | BLOB/BINARY sütunlarını hex değişmez değerleri olarak dök |
|---|
| `–column-statistics=0` | ANALYZE TABLE ifadelerini devre dışı bırak (MySQL 8 istemcisi ile eski sunucu) |
|---|
mysqldump ile Alternatif Yedekleme Yöntemlerinin Karşılaştırması
Doğru yedekleme stratejisini seçmek, veritabanı boyutuna, RTO/RPO gereksinimlerine ve altyapıya bağlıdır. mysqldump’ın en yaygın alternatiflere kıyasla nasıl bir performans sergilediği aşağıda açıklanmıştır:
| Özellik | mysqldump | Percona XtraBackup | MySQL Enterprise Backup | Binary Log Yedekleme |
|---|
| — | — | — | — | — |
|---|
| Yedekleme türü | Mantıksal (SQL) | Fiziksel (dosya düzeyi) | Fiziksel (dosya düzeyi) | Artımlı (binlog) |
|---|
| Taşınabilirlik | Mükemmel | Sunucu sürümüne bağlı | Sunucu sürümüne bağlı | Temel yedekleme gerektirir |
|---|
| Tutarlılık (InnoDB) | Evet (`–single-transaction`) | Evet (sıcak yedekleme) | Evet (sıcak yedekleme) | Evet |
|---|
| Tutarlılık (MyISAM) | Kilit gerektirir | Kilit gerektirir | Kilit gerektirir | Yok |
|---|
| Hız (büyük VT’ler) | Yavaş | Hızlı | Hızlı | Çok hızlı (artımlı) |
|---|
| Geri yükleme hızı | Yavaş (SQL tekrarı) | Hızlı (dosya kopyası) | Hızlı (dosya kopyası) | Temel + tekrar gerektirir |
|---|
| İnsan tarafından okunabilir çıktı | Evet | Hayır | Hayır | Hayır |
|---|
| Belirli bir zamana geri yükleme | Hayır (yalnızca anlık görüntü) | Evet (binlog ile) | Evet (binlog ile) | Evet |
|---|
| Maliyet | Ücretsiz (dahili) | Ücretsiz (açık kaynak) | Ticari lisans | Ücretsiz (dahili) |
|---|
| En iyi kullanım durumu | Küçük-orta VT’ler, geçişler | Büyük üretim VT’leri | Kurumsal ortamlar | Sürekli replikasyon |
|---|
Bir VPS Hosting ortamında 10–20 GB’ın altındaki veritabanları için mysqldump, en pratik ve taşınabilir çözüm olmaya devam etmektedir. Bu eşiğin ötesinde, fiziksel yedekleme araçları dramatik biçimde daha hızlı yedekleme ve geri yükleme süreleri sunar.
Pratik Kullanım Örnekleri
Örnek 1: Tek Bir Veritabanını Yedekleme
“`bash
mysqldump -u backup_user -p database_name > /backups/database_name_$(date +%F).sql
“`
`$(date +%F)` değiştirmesi, üzerine yazılmasını önlemek için dosya adına otomatik olarak ISO tarihini (örn. `2025-07-15`) ekler.
Örnek 2: Birden Fazla Belirli Veritabanını Yedekleme
“`bash
mysqldump -u backup_user -p –databases app_db analytics_db > /backups/multi_db_backup.sql
“`
`–databases` bayrağı, mysqldump’ın `CREATE DATABASE` ve `USE` ifadeleri yaymasına neden olarak dökümü geri yükleme için bağımsız hale getirir.
Örnek 3: Tüm Veritabanlarını Yedekleme
“`bash
mysqldump -u backup_user -p –all-databases –events –routines –triggers
> /backups/full_server_$(date +%F).sql
“`
Tam sunucu dökümleri için her zaman `–events`, `–routines` ve `–triggers` ekleyin. Bu nesneler açık bayraklar olmadan sessizce atlanır.
Örnek 4: Tutarlı InnoDB Yedeklemesi (Üretime Uygun)
“`bash
mysqldump -u backup_user -p
–single-transaction
–flush-logs
–source-data=2
–routines –triggers –events
database_name > /backups/database_name_$(date +%F).sql
“`
`–flush-logs`, döküm başlangıcında binary logu döndürür. `–source-data=2`, mevcut binary log dosya adını ve konumunu SQL yorumu olarak yazar; bu sayede o konumdan sonraki binlog’ları tekrarlayarak belirli bir zamana geri yükleme yapılabilir.
Örnek 5: gzip ile Sıkıştırılmış Yedekleme
“`bash
mysqldump -u backup_user -p database_name | gzip -9 > /backups/database_name_$(date +%F).sql.gz
“`
CPU kısıtlı sunucular için birden fazla çekirdeği kullanmak amacıyla `pigz`’ı (paralel gzip) kullanın:
“`bash
mysqldump -u backup_user -p database_name | pigz -9 > /backups/database_name_$(date +%F).sql.gz
“`
Örnek 6: Yalnızca Şema Yedeklemesi (Veri Olmadan Yapı)
“`bash
mysqldump -u backup_user -p –no-data database_name > /backups/schema_only.sql
“`
Şemanızı Git’te sürüm kontrolüne almak veya üretim verilerini kopyalamadan bir hazırlık ortamına dağıtmak için kullanışlıdır.
Örnek 7: Yalnızca Veri Yedeklemesi (Şema Olmadan)
“`bash
mysqldump -u backup_user -p –no-create-info database_name > /backups/data_only.sql
“`
Hedef şema zaten mevcut olduğunda ve yalnızca verileri doldurmak veya yenilemek istediğinizde bunu kullanın.
Örnek 8: Tek Bir Tabloyu Yedekleme
“`bash
mysqldump -u backup_user -p database_name orders > /backups/orders_table_$(date +%F).sql
“`
Örnek 9: Filtrelenmiş Bir Satır Alt Kümesini Dışa Aktarma
“`bash
mysqldump -u backup_user -p database_name orders
–where="created_at >= '2025-01-01' AND status='completed'"
> /backups/orders_2025_completed.sql
“`
`–where` seçeneği az kullanılmakla birlikte kısmi dışa aktarmalar, veri arşivleme ve belirli kayıt kümelerinde hata ayıklama için son derece güçlüdür.
Örnek 10: Belirli Tabloları Hariç Tutma
“`bash
mysqldump -u backup_user -p database_name
–ignore-table=database_name.cache
–ignore-table=database_name.sessions
> /backups/database_name_no_cache.sql
“`
Büyük, geçici tabloları (önbellekler, oturum depoları, log tabloları) hariç tutmak, döküm boyutunu ve süresini büyük ölçüde azaltabilir.
Örnek 11: Saklı Prosedürleri, Fonksiyonları ve Tetikleyicileri Dahil Etme
“`bash
mysqldump -u backup_user -p –routines –triggers –events database_name > /backups/full_backup.sql
“`
Örnek 12: Uzak Veritabanı Yedeklemesi
“`bash
mysqldump -u backup_user -p -h 192.168.1.100 -P 3306 database_name
| gzip > /backups/remote_db_$(date +%F).sql.gz |
|---|
“`
Uzak bir sunucuyu yedeklerken trafik varsayılan olarak şifrelenmemiş şekilde ağ üzerinden geçer. `–ssl-ca`, `–ssl-cert` ve `–ssl-key` bayraklarını ekleyin veya SSH üzerinden tünel açın:
“`bash
ssh user@remote-server "mysqldump -u backup_user -p database_name | gzip"
> /backups/remote_db_$(date +%F).sql.gz
“`
mysqldump Yedeğini Geri Yükleme
Tek Bir Veritabanını Geri Yükleme
“`bash
mysql -u root -p database_name < /backups/database_name_2025-07-15.sql
“`
Hedef veritabanı henüz mevcut değilse önce oluşturun:
“`bash
mysql -u root -p -e "CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p database_name < /backups/database_name_2025-07-15.sql
“`
Tam Sunucu Döküm Dosyasından Tüm Veritabanlarını Geri Yükleme
“`bash
mysql -u root -p < /backups/full_server_2025-07-15.sql
“`
`–all-databases`, `CREATE DATABASE` ve `USE` ifadelerini gömdüğünden hedef veritabanı argümanına gerek yoktur.
Sıkıştırılmış Yedekten Geri Yükleme
“`bash
gunzip < /backups/database_name_2025-07-15.sql.gz | mysql -u root -p database_name
“`
Ya da işlem değiştirme kullanarak:
“`bash
mysql -u root -p database_name < <(gunzip -c /backups/database_name_2025-07-15.sql.gz)
“`
Tam Veritabanı Döküm Dosyasından Tek Bir Tabloyu Geri Yükleme
Bu, orijinal döküm dosyasının basit olmayan bir şekilde ele aldığı yaygın bir operasyonel senaryodur. İlgili bölümü çıkarmak için `sed` veya `grep` kullanın:
“`bash
sed -n '/^– Table structure for table `orders`/,/^– Table structure for table `/p'
backup_file.sql | head -n -1 | mysql -u root -p database_name
“`
Alternatif olarak `mysql_extract_table.sh` kullanın veya geçici bir veritabanına aktarıp tabloyu kopyalayın:
“`bash
mysql -u root -p temp_restore < backup_file.sql
mysql -u root -p -e "INSERT INTO database_name.orders SELECT * FROM temp_restore.orders;"
“`
Binary Log Kullanarak Belirli Bir Zamana Geri Yükleme
Döküm `–source-data=2` ile alındıysa ve binary loglama etkinse, döküm sonrasındaki herhangi bir noktaya kurtarabilirsiniz:
- Döküm dosyası başlık yorumundan binary log konumunu belirleyin.
- Temel dökümü geri yükleyin.
- İstenen zaman damgasına kadar sonraki binary log olaylarını uygulayın:
“`bash
mysqlbinlog –start-position=154 –stop-datetime="2025-07-15 14:30:00"
/var/lib/mysql/binlog.000042 | mysql -u root -p database_name
“`
Cron ile Yedeklemeleri Otomatikleştirme
Temel Günlük Yedekleme İşi
Kimlik bilgilerini cron komutlarına gömmek yerine `~/.my.cnf`’da saklayın:
“`ini
[mysqldump]
user=backup_user
password=StrongPassword!
“`
Katı izinleri ayarlayın:
“`bash
chmod 600 ~/.my.cnf
“`
Ardından cron işini oluşturun:
“`bash
crontab -e
“`
“`
Daily compressed backup at 02:00, retained for 30 days
0 2 * * * mysqldump –single-transaction –routines –triggers –events database_name
| gzip -9 > /backups/database_name_$(date +%F).sql.gz |
|---|
Delete backups older than 30 days
10 2 * * * find /backups/ -name "*.sql.gz" -mtime +30 -delete
“`
Üretime Hazır Yedekleme Betiği
Birden fazla veritabanı barındıran Dedicated Servers için daha sağlam bir betik hata loglama, disk alanı kontrolü ve uzak boşaltmayı ele alır:
“`bash
#!/bin/bash
BACKUP_DIR="/backups/mysql"
RETENTION_DAYS=30
LOG_FILE="/var/log/mysql_backup.log"
DATE=$(date +%F_%H-%M)
DATABASES=$(mysql –defaults-file=/etc/mysql/backup.cnf -e "SHOW DATABASES;"
| grep -Ev "(Database | information_schema | performance_schema | sys)") |
|---|
mkdir -p "$BACKUP_DIR"
for DB in $DATABASES; do
OUTPUT="$BACKUP_DIR/${DB}_${DATE}.sql.gz"
mysqldump –defaults-file=/etc/mysql/backup.cnf
–single-transaction –routines –triggers –events
"$DB" | gzip -9 > "$OUTPUT"
if [ $? -eq 0 ]; then
echo "$(date): SUCCESS – $DB -> $OUTPUT" >> "$LOG_FILE"
else
echo "$(date): FAILURE – $DB" >> "$LOG_FILE"
fi
done
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +"$RETENTION_DAYS" -delete
“`
mysqldump İşlemleri için Güvenlik Sertleştirme
Kimlik bilgisi yönetimi, yedekleme güvenliğinin en sık ihmal edilen yönüdür. `-pYourPassword`’ı doğrudan komut satırına asla geçirmeyin — `ps aux` çıktısında ve kabuk geçmişinde görünür. Bunun yerine şu yaklaşımlardan birini kullanın:
- `chmod 600` ile `~/.my.cnf` (kullanıcı başına)
- Root’a ait, yedekleme grubu tarafından okunabilir `chmod 640` ile `/etc/mysql/backup.cnf`
- `MYSQL_PWD` ortam değişkeni (`/proc`’da görünür, yalnızca izole kapsayıcılarda kullanın)
- Kurumsal ortamlar için MySQL Vault veya HashiCorp Vault
Yedekleme dosyası izinleri kısıtlayıcı olmalıdır:
“`bash
chmod 640 /backups/database_name_2025-07-15.sql.gz
chown root:backup_group /backups/database_name_2025-07-15.sql.gz
“`
Beklemedeki şifreleme: Hassas veriler için yedekleme dosyalarını depolamadan veya aktarmadan önce şifreleyin:
“`bash
mysqldump –single-transaction database_name
| gzip |
|---|
| openssl enc -aes-256-cbc -salt -pbkdf2 -pass pass:"$BACKUP_PASSPHRASE" |
|---|
> /backups/database_name_$(date +%F).sql.gz.enc
“`
Aktarım şifrelemesi: Uzak bir sunucudan döküm alırken her zaman SSL/TLS veya SSH tüneli kullanın. Bir VPS with cPanel ortamında cPanel’in yedekleme arayüzü bunu otomatik olarak halleder, ancak manuel mysqldump işlemleri açık SSL bayrakları gerektirir.
Yaygın Tuzaklar ve Bunlardan Kaçınma Yolları
Karakter seti uyumsuzlukları, bozuk geri yüklemelerin en sık görülen nedenidir. Karakter setini her zaman açıkça belirtin:
“`bash
mysqldump –default-character-set=utf8mb4 database_name > backup.sql
mysql –default-character-set=utf8mb4 database_name < backup.sql
“`
Eksik `–column-statistics=0`, bir MySQL 8.0 istemcisi MySQL 5.7 veya MariaDB sunucusundan döküm aldığında hatalara neden olur. MySQL 8 istemcisi, eski sunucuların desteklemediği sütun istatistiklerini dökmeye çalışır:
“`bash
mysqldump –column-statistics=0 -u backup_user -p database_name > backup.sql
“`
`–routines`, `–triggers` ve `–events`’ı unutmak, kritik veritabanı nesnelerini sessizce atlar. Bu bayraklar varsayılan olarak etkin değildir (`–triggers` hariç) ve geçici dökümlerde sıklıkla unutulur.
Büyük tablo dökümleri OOM’a neden oluyor: mysqldump varsayılan olarak tüm sonuç kümelerini bellekte tamponlar. Çok büyük tablolar için satırları tamponlamak yerine tek tek akıtmak amacıyla `–quick` ekleyin (çoğu sürümde varsayılan olarak etkin, ancak doğrulamaya değer):
“`bash
mysqldump –quick –single-transaction database_name > backup.sql
“`
Farklı bir MySQL sürümüne geri yükleme: MySQL 8.0’dan alınan dökümlerde MySQL 5.7’de desteklenmeyen sözdizimi bulunabilir (örn. fonksiyonel indeksler, görünmez sütunlar). Çapraz sürüm geçişlerine güvenmeden önce her zaman sürüm eşleşen bir ortamda geri yüklemeleri test edin.
Otomatik artış değeri kayması: Zaten satır içeren mevcut bir şemaya tablo geri yüklerseniz, hedef tabloyu önce `–add-drop-table` eklemeden veya manuel olarak temizlemeden `INSERT` ifadeleri birincil anahtar çakışmalarında başarısız olur.
Veritabanı Geçişleri için mysqldump Kullanımı
mysqldump, sunucular arasında veritabanı geçişi için standart yaklaşımdır — örneğin bir WordPress sitesini Shared Web Hosting‘den VPS’e taşırken veya daha fazla kaynağa sahip bir VPS Control Panels ortamına yeniden platform oluştururken.
Önerilen geçiş iş akışı:
- Kaynak veritabanını tam seçeneklerle dökün:
“`bash
mysqldump –single-transaction –routines –triggers –events
–default-character-set=utf8mb4 source_db | gzip > migration.sql.gz
“`
- SSH üzerinden rsync kullanarak güvenli şekilde aktarın:
“`bash
rsync -avz -e ssh migration.sql.gz user@target-server:/tmp/
“`
- Hedef veritabanını eşleşen karakter setiyle oluşturun:
“`bash
mysql -u root -p -e "CREATE DATABASE target_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
“`
- Geri yükleyin ve doğrulayın:
“`bash
gunzip < /tmp/migration.sql.gz | mysql -u root -p target_db
mysql -u root -p target_db -e "SHOW TABLES; SELECT COUNT(*) FROM critical_table;"
“`
- Uygulama yapılandırmasını yeni veritabanı ana bilgisayarına işaret edecek şekilde güncelleyin.
E-posta altyapısına da dayanan uygulamalar için, hizmet kesintisini önlemek amacıyla DNS kayıtlarının ve Email Hosting yapılandırmalarının veritabanı geçişiyle paralel olarak güncellenmesini sağlayın.
Yedekleme Bütünlüğünü Doğrulama
Hiç test edilmemiş bir yedekleme, yedekleme değildir — test edilmemiş bir varsayımdır. Bir doğrulama rutini uygulayın:
“`bash
#!/bin/bash
Restore backup to a test database and verify row counts
TEST_DB="backup_verify_$(date +%s)"
BACKUP_FILE="/backups/database_name_$(date +%F).sql.gz"
mysql -u root -p -e "CREATE DATABASE $TEST_DB;"
gunzip < "$BACKUP_FILE" | mysql -u root -p "$TEST_DB"
PROD_COUNT=$(mysql -u root -p -sN -e "SELECT COUNT(*) FROM database_name.orders;")
TEST_COUNT=$(mysql -u root -p -sN -e "SELECT COUNT(*) FROM $TEST_DB.orders;")
if [ "$PROD_COUNT" -eq "$TEST_COUNT" ]; then
echo "Backup verified: row counts match ($PROD_COUNT rows)"
else
echo "BACKUP VERIFICATION FAILED: prod=$PROD_COUNT, test=$TEST_COUNT"
fi
mysql -u root -p -e "DROP DATABASE $TEST_DB;"
“`
Bu doğrulama betiğini cron aracılığıyla haftalık olarak çalıştırın ve başarısızlık durumunda uyarı verin.
Karar Matrisi: mysqldump Ne Zaman Kullanılır
| Senaryo | mysqldump Kullanılsın mı? | Önerilen Alternatif |
|---|
| — | — | — |
|---|
| Veritabanı < 5 GB, herhangi bir motor | Evet | — |
|---|
| Veritabanı 5–50 GB, yalnızca InnoDB | Evet (`–single-transaction` ile) | Daha hızlı geri yükleme için XtraBackup |
|---|
| Veritabanı > 50 GB, üretim | Koşullu | Percona XtraBackup veya MySQL Enterprise Backup |
|---|
| Çapraz sürüm geçişi | Evet | — |
|---|
| Çapraz platform geçişi | Evet | — |
|---|
| Kısmi tablo dışa aktarma | Evet (`–where`) | — |
|---|
| Şema sürüm kontrolü | Evet (`–no-data`) | — |
|---|
| Sıfıra yakın RTO gerekli | Hayır | Fiziksel yedekleme + binlog akışı |
|---|
| Sürekli replikasyon kurulumu | Kısmi (`–source-data=2`) | GTID ile XtraBackup |
|---|
| Karma InnoDB/MyISAM şeması | Evet (`–lock-all-tables` ile) | XtraBackup |
|---|
Teknik Temel Çıkarımlar Kontrol Listesi
- Yedekleme sırasında yazma kilitlerini önlemek için yalnızca InnoDB veritabanlarında her zaman `–single-transaction` kullanın.
- Tam yedekleme olarak tasarlanan herhangi bir döküme her zaman `–routines –triggers –events` ekleyin.
- Kimlik bilgilerini `chmod 600/640` ile `~/.my.cnf` veya `/etc/mysql/backup.cnf`’da saklayın — asla betiklere veya cron komutlarına satır içi olarak eklemeyin.
- MySQL 8.0 istemcisini MySQL 5.7 veya MariaDB sunucusuna karşı kullanırken `–column-statistics=0` ekleyin.
- Karakter kodlaması bozulmasını önlemek için hem döküm hem de geri yükleme sırasında her zaman `–default-character-set=utf8mb4` belirtin.
- Tüm yedeklemeleri gzip veya pigz ile sıkıştırın; hassas dökümleri uzak konuma aktarmadan önce AES-256 ile şifreleyin.
- Binary loglar aracılığıyla belirli bir zamana geri yüklemeyi etkinleştirmek için üretim dökümlere `–flush-logs –source-data=2` ekleyin.
- Disk tükenmesini önlemek için `find … -mtime +N -delete` ile saklama temizliğini otomatikleştirin.
- Geri yüklemeleri düzenli aralıklarla test edin — satır sayılarını doğrulayın ve üretim ile veri bütünlüğünü nokta kontrol edin.
- Karma motorlu şemalar için tutarlılığı garanti etmek amacıyla `–single-transaction` yerine `–lock-all-tables` kullanın.
Sıkça Sorulan Sorular
mysqldump yedekleme sırasında tabloları kilitler mi?
Saf bir InnoDB veritabanında `–single-transaction` ile, kısa bir başlangıç temizlemesinin ötesinde tablo kilidi edinilmez. MyISAM tabloları, işlem desteğinden yoksun oldukları için her zaman bir okuma kilidi (`LOCK TABLES`) gerektirir. Karma motorlu şemalar, döküm süresince yazmaları engelleyen tutarlı bir anlık görüntü için `–lock-all-tables` gerektirir.
Veritabanı şemasını veri olmadan nasıl yedeklerim?
`–no-data` bayrağını kullanın: `mysqldump -u backup_user -p –no-data database_name > schema.sql`. Bu, herhangi bir `INSERT` ifadesi olmadan tüm `CREATE TABLE`, `CREATE VIEW`, saklı prosedürleri ve tetikleyicileri dışa aktarır.
mysqldump neden “column statistics” hatalarıyla başarısız oluyor?
Bu, bir MySQL 8.0 istemcisi MySQL 5.7 veya MariaDB sunucusuna bağlandığında oluşur. Komutunuza `–column-statistics=0` ekleyin. Alternatif olarak sunucuyu MySQL 8.0’a güncelleyin veya sunucu sürümüyle eşleşen bir istemci ikili dosyası kullanın.
mysqldump artımlı yedekleme yapabilir mi?
Hayır. mysqldump her zaman belirtilen kapsamın tam mantıksal döküm dosyasını üretir. Artımlı yedekleme özelliği, `–flush-logs –source-data=2` ile alınan temel bir mysqldump ile birlikte binary log arşivleme (`mysqlbinlog`) gerektirir. Gerçek artımlı fiziksel yedeklemeler Percona XtraBackup veya MySQL Enterprise Backup gerektirir.
Parolaları açığa çıkarmadan mysqldump’ı otomatikleştirmenin en güvenli yolu nedir?
Minimum gerekli ayrıcalıklara sahip özel bir MySQL yedekleme kullanıcısı oluşturun, kimlik bilgilerini `~/.my.cnf`’ın bir `[mysqldump]` bölümünde veya `chmod 600` ile ayrı bir seçenekler dosyasında saklayın ve `–defaults-file=/path/to/backup.cnf` ile referans verin. Bu yaklaşım, kimlik bilgilerini işlem listelerinden, kabuk geçmişinden ve cron iş tanımlarından tamamen uzak tutar.
