15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
09.10.2024

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şenAçı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çenekAçı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çenekAçı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çenekAçı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çenekAçı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:

ÖzellikmysqldumpPercona XtraBackupMySQL Enterprise BackupBinary Log Yedekleme
Yedekleme türüMantıksal (SQL)Fiziksel (dosya düzeyi)Fiziksel (dosya düzeyi)Artımlı (binlog)
TaşınabilirlikMükemmelSunucu 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 gerektirirKilit gerektirirKilit gerektirirYok
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ıEvetHayırHayırHayır
Belirli bir zamana geri yüklemeHayı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 durumuKüçük-orta VT’ler, geçişlerBüyük üretim VT’leriKurumsal ortamlarSü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:

  1. Döküm dosyası başlık yorumundan binary log konumunu belirleyin.
  2. Temel dökümü geri yükleyin.
  3. İ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 "(Databaseinformation_schemaperformance_schemasys)")

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ışı:

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

“`

  1. SSH üzerinden rsync kullanarak güvenli şekilde aktarın:

“`bash

rsync -avz -e ssh migration.sql.gz user@target-server:/tmp/

“`

  1. 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;"

“`

  1. 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;"

“`

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

Senaryomysqldump Kullanılsın mı?Önerilen Alternatif
Veritabanı < 5 GB, herhangi bir motorEvet
Veritabanı 5–50 GB, yalnızca InnoDBEvet (`–single-transaction` ile)Daha hızlı geri yükleme için XtraBackup
Veritabanı > 50 GB, üretimKoşulluPercona XtraBackup veya MySQL Enterprise Backup
Çapraz sürüm geçişiEvet
Çapraz platform geçişiEvet
Kısmi tablo dışa aktarmaEvet (`–where`)
Şema sürüm kontrolüEvet (`–no-data`)
Sıfıra yakın RTO gerekliHayırFiziksel yedekleme + binlog akışı
Sürekli replikasyon kurulumuKı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.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın