Mysqldump İLE YEDEKLEME YAPMAYA INSIGHT
IMHO Sadece nasıl yaklaşacağınızı biliyorsanız, yedekleme yapmak bir sanat formuna dönüşmüştür.
Seçeneklerin var
Seçenek 1: mysqldump bir mysql örneği
Bu en kolay olanı, no-brainer !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Tek bir dosyada yazılmış her şey: tablo yapıları, indeksler, tetikleyiciler, saklı prosedürler, kullanıcılar, şifreli şifreler. Diğer mysqldump seçenekleri, farklı INSERT komut stillerini, günlük dosyasını ve konum koordinatlarını ikili günlüklerden, veritabanı oluşturma seçeneklerinden, kısmi veriden (- yerden seçeneği) vb. Dışa aktarabilir.
Seçenek 2: mysqldump ayrı veritabanlarına ayrı veri dosyalarına
Bir veritabanı listesi oluşturarak başlayın (bunu yapmak için 2 teknik)
Teknik 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Teknik 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Teknik 1 en hızlı yoldur. Teknik 2 en kesin ve en güvenli olandır. Teknik 2 daha iyidir, çünkü bazen kullanıcılar / var / lib / mysql (datadir) 'de genel amaçlı, veritabanı ile ilgili olmayan klasörler oluştururlar. İnformation_schema, klasörü information_schema.schemata tablosuna bir veritabanı olarak kaydeder. Teknik 2, mysql verisi içermeyen klasörleri atlar.
Veritabanlarının listesini derledikten sonra, listede dolaşmaya devam edebilir ve istenirse paralel olarak bile mysqldump atabilirsiniz.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
Bir seferde başlatılacak çok fazla veritabanı varsa, paralel olarak bir seferde 10'a boşaltın:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Seçenek 3: mysqldump ayrı tabloları ayrı veri dosyalarına
Bir tablo listesi oluşturarak başlayın
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
Sonra tüm tabloları 10'lu gruplar halinde boşalt
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Seçenek 4: GÖRÜNTÜLEĞİNİZİ KULLANIN
Yukarıda belirtilen Seçeneklerin varyasyonlarını ve temiz fotoğraflar için teknikleri deneyin
Örnekler
- Tablo listesini, artan veya azalan tabloların boyutuna göre sıralayın.
- Ayrı bir işlem kullanarak, mysqldumps'ı başlatmadan önce "HIZLI TABLOLARI OKUYAN KİLİTLE; UYKU SEÇİMİ (86400)" çalıştırın. MyShldumps tamamlandıktan sonra bu işlemi öldür. Bir veritabanı hem InnoDB hem de MyISAM içeriyorsa bu yararlıdır.
- Mysqldumps tarihli klasörlere kaydedin ve eski yedek klasörleri dışarı döndürün.
- Tüm örnek mysqldumps bağımsız sunuculara yükleyin.
UYARI
Sadece Seçenek 1 her şeyi getirir. Dezavantajı, bu şekilde oluşturulan mysqldumps'ın, mysqldump'un oluşturduğu mysql'nin yalnızca aynı sürüm sürümüne yeniden yüklenebilmesidir. Başka bir deyişle, bir MySQL 5.0 veritabanından bir mysqldump, 5.1 veya 5.5'e yüklenemez. Sebep ? MySQL şeması büyük sürümleri arasında tamamen farklıdır.
Seçenek 2 ve 3, kullanıcı adlarını ve şifreleri kaydetmeyi içermez.
İşte daha okunaklı ve daha taşınabilir kullanıcılar için SQL Grants'tan kurtulmanın genel yolu
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
Seçenek 3 saklı yordamları kaydetmediğinden, aşağıdakileri yapabilirsiniz
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
Dikkat edilmesi gereken bir diğer nokta, InnoDB ile ilgilidir. Büyük bir InnoDB tampon havuzunuz varsa, herhangi bir yedekleme yapmadan önce onu en iyi şekilde yıkamak mantıklıdır. Aksi takdirde, MySQL zaman yıkama tablolarını artık kirli sayfalarla arabellek havuzunun dışına harcar. İşte önerdiğim şey:
Yedeklemeyi gerçekleştirmeden yaklaşık 1 saat önce bu SQL komutunu çalıştırın
SET GLOBAL innodb_max_dirty_pages_pct = 0;
MySQL 5.5'te varsayılan innodb_max_dirty_pages_pct 75'tir. MySQL 5.1 ve arkasında, varsayılan innodb_max_dirty_pages_pct 90'dır. İnnodb_max_dirty_pages_pct değerini 0 olarak ayarlayarak bu, kirli sayfaların diske temizlenmesini hızlandıracaktır. Bu, herhangi bir InnoDB tablosuna karşı herhangi bir mysqldump yapmadan önce, InnoDB verilerinin eksik olan iki fazlı işlemlerini temizleme etkisini önleyecek veya en azından azaltacaktır.
Mysqldump üzerinde son dünya
Çoğu insan mysqldump’tan diğer araçların lehine uzak durmaktadır ve bu araçlar gerçekten iyidir.
Bu araçlar arasında
- MAATKIT (paralel boşaltma / geri yükleme komut dosyaları, Percona'dan [Deprecated but great])
- XtraBackup ( Percona'dan TopNotch Anlık Görüntüsü Yedeklemesi)
- CDP R1Soft ( Zamanında anlık görüntüler alan MySQL Modül Seçeneği )
- MySQL Kurumsal Yedekleme (eski adıyla InnoDB Hot Backups [ticari])
Gerçek bir MySQL DBA ruhuna sahipseniz, mysqldump'ı kucaklayabilir ve üzerinde tam bir ustalığa sahip olabilirsiniz. Tüm yedeklemeleriniz MySQL DBA becerilerinizin bir yansıması olabilir .