Günlük 22 GB MySQL veritabanını yedekleme


28

Şu anda mysqldump kullanarak yedekleme yapmak mümkün. Ancak web sunucusunu devralmak zorundayım VE yedeği almak yaklaşık 5 dakika sürüyor. Eğer web sunucusunu indirmezsem, sonsuza kadar sürer ve asla bitmez + web sitesine yedekleme sırasında erişilemez hale gelir.

22 GB'mi ve büyüyen veritabanımı yedeklemenin daha hızlı / daha iyi bir yolu var mı?

Tüm masalar MyISAM.


Bu bağlantıya bir göz atın bu benzer bir soru için serverfault.com/questions/8044/backup-mysql-server
Charles Faiga

Yanıtlar:


28

Evet.

İkinci bir makineye çoğaltmayı ayarlayın. Yedekleme yapmanız gerektiğinde ikincil makineyi kilitleyebilir, mysqlhotcopy veya mysqldump gerçekleştirebilir ve ardından kilidini açabilirsiniz. Master'ınızla tekrar bir araya gelecek ve master'ı hiçbir zaman çevrimdışı yapmak zorunda kalmayacaksınız.

Bunu, aynı makinede bile yapabilirsiniz; yazma G / Ç'yi iki katına çıkarmayı düşünmüyorsanız, ancak ideal olarak, gerçek zamanlı olarak ikinci bir fiziksel sunucuya yedeklemeniz ve anlık görüntü yedeklemenizi istediğiniz sıklıkta almanız gerekir. üretim sunucunuzu rahatsız etmeden.

Bilinen bir durum ve binlog kullanarak bir veritabanını geri yüklemek de teorik olarak mümkündür. Bunu hiç yapmadım, o yüzden lütfen önce araştırın, ancak veritabanınızın bilinen bir durumunu yedekleyebilir, ardından tüm yeni binlogları yedekleyebilir ve geri yüklemeniz gerektiğinde bunları yeniden çalabilirsiniz. Binloglar doğrusal olarak yazıldığından, yeni binlogları uzaktaki bir bilgisayara yeniden senkronize etmek çok hızlı olacaktır.

Düzenleme: Gerçekten de, yedekleme için binlog kullanımı belgelenmiştir.

Bu soru çok alakalı


Evet, bu harika çalışıyor ve benim cevabım olacaktı. Tek önemli dezavantajı, çoğaltma günlük olarak doğru çalıştığından emin olmanız gerekir . Mesai saatleri içerisinde köle veritabanımızın anlık görüntülerini ve ustadan her gece yedeklemeyi alıyoruz.

5

İşletim sisteminin Linux olduğunu varsaydığım için afedersiniz. LVM kullanmıyorsanız, kullanmalısınız. Eğer öyleyse, burada anlık görüntü yoluyla yedekleme yapmak için çok basit bir yoldur.

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

Bu, bir köle sunucusu eklemek zorunda kalmadan gece yedeklemenizi sağlar. Yüksek Kullanılabilirlik için bir köle sunucusuna sahip olmaktan çok hoşlanıyorum, ancak o köleyi yaratana kadar sıkışıp kaldığınızı düşünmenizi istemiyorum.


2

HAZIR KİLİTLİ FLUSH TABLOLARI Bir üretim sisteminde düzenli (hatta yarı düzenli) bir şekilde yapmak istediğiniz bir şey değildir. Sadece son çare olmalı.

En az iki çoğaltma bağımlısı ayarlayın (bu, elbette OKUYUCU KİLİTLİ YANIK TABLOLAR gerektirir). Bir kere ayarlandıktan sonra, bir tanesi yedek master olarak senkronize kalırken bir tanesini yedeklemeden alabilirsiniz.

Ayrıca, kölelerinizden biri arızalanırsa, ikinci (veya üçüncü) köleyi yeniden oluşturmak için bu görüntüden bir anlık görüntü kullanabilirsiniz. Tüm köleleriniz başarısız olursa, OKU KİLİTLİ FLUSH TABLOLAR'a geri dönersiniz.

Verilerin her zaman düzenli olarak senkronize olduğunu kontrol eden bir sürecin olduğunu unutmayın - bunu yapmak için mk-table-checksum gibi bir şey kullanın (bu ayarların yapılması için önemsiz değildir, ayrıntılar için Maatkit belgelerine bakın).

22 GB nispeten küçük olduğundan, bunu yaparken hiç sorun yaşamayacaksınız. Büyük bir veritabanıyla yapmak daha problemli olabilir.


1

Buradaki çözüm yukarıda açıklandığı gibi iki yönlüdür:

  1. Sunucunuzun çoğaltmasını çevrimdışı alabileceğiniz bir köle olarak ayarlayın. Bunu yapmanın en iyi yolu, mysqldump ve --master-data parametresini kullanarak bir veritabanı dökümü yapmaktır.
  2. Köle üzerinde her gece yedekleme ayarlayın. Kullanıcının mysqldump işlevini --master-data --flush-logs ve --single işlem bayraklarıyla veya mysql sunucusunu durdurabilir, veri dosyalarını diskte kopyalayabilir ve yeniden başlatabilirsiniz (çoğaltma nerede bıraktı).
  3. MySQL'in hala çoğaltıldığından emin olmak için kontrol etmek ve her seferinde (örneğin 5, 10, 20 dakikada bir) bir komut dosyası çalıştırın. Kullanmak için bekliyoruz, yapmak için basit bir python komut dosyası yazdım .

Masalarınız için InnoDB kullanıyorsanız, herhangi bir masa kilidini yapmak zorunda kalmamak ve ustada bile tutarlı bir veri tabanı dökümü almaktan kaçınmak için --single-işlem bayrağını kullanabilirsiniz. Sunucuyu devirmek Yukarıdaki çözüm, daha iyi bir çözümdür.

Ayrıca, Linux'ta LVM kullanıyorsanız, bölümün LVM anlık görüntüsünü alabilir, ardından bunu yedekleyebilirsiniz. LVM anlık görüntüleri atomiktir, bu nedenle 'tabloları okuma kilidiyle temizleyin' ve ardından anlık görüntüsünüzü alın ve kilidini açın, tutarlı bir anlık görüntü elde edersiniz.

Döküm işleminin çok uzun sürmesini sağlayan G / Ç çekişmesi konusunda endişeleriniz varsa, üçüncü bir makine ekleyebilir ve disklerinizin kırılmasını önlemek için mysqldump'ı ağ üzerinden çalıştırabilirsiniz.


0

Ortamınıza bağlı olarak, anlık görüntüler genellikle gitmek için mükemmel bir yoldur. Özellikle, bir sebepten ustayı yedeklemeniz gerekiyorsa. Master ve slave çiftleri çalıştırıyoruz ve her ikisinde de anlık görüntü yedekleri kullanıyoruz.

  1. FLUSH TABLES WITH READ LOCK;
  2. Veritabanında bir anlık görüntü çekin ve dosya sistemlerini günlüğe kaydedin.
  3. UNLOCK TABLES;
  4. Veri dosyalarınızı anlık olarak anlık görüntüden kopyalayın.

InnoDB tablolarıyla, SET AUTOCOMMIT=0;okuma kilidini çalıştırmadan önce çalıştırmak istersiniz .



-1

Kademeli bir yedekleme yapabilirsiniz. Her saat başı kayıtların 1 / 24'ünü yedekleyin. Bu yaklaşımla ilgili tek sorun, günün ilk birkaç saatinde çökerse, o zamandan itibaren çarpma saatine kadar herhangi bir şey kaybedersiniz. Her iki durumda da, 24 saatlik kayıt kaybedilmiştir (bunun sizin için ne kadar önemli olduğunu bilmiyorum).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.