Bir web arayüzü üzerinden yapılan büyük içe aktarma neredeyse her zaman başarısız olur: yükleme sınırı, çalışma süresi ya da istek zaman aşımı onu yolun ortasında durdurur. Komut satırından aktarın, bunların hiçbiri geçerli olmaz.

mysql -u user -p dbname < dump.sql
# or, compressed
zcat dump.sql.gz | mysql -u user -p dbname

Onu hızlandırın

# at the top of the session
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
-- import --
SET foreign_key_checks=1;
SET unique_checks=1;
COMMIT;

Büyük bir içe aktarmanın zamanının çoğu kısıtları denetlemeye ve her satırdan sonra diske yazmaya gider. Güvendiğiniz bir döküm için bunu kapatıp sonra geri açmak, saatleri düzenli olarak dakikalara çevirir.

Yalnızca güvendiğiniz bir döküm için ve başka hiçbir şeyin yazmadığı bir veritabanında. Yabancı anahtar denetimleri kapalıyken, bozuk bir döküm bozuk veriyi sessizce içeri alır.

Olup bitişini izleyin

pv dump.sql | mysql -u user -p dbname

pv bir ilerleme çubuğu ve bir tahmin yazdırır. O olmadan uzun bir içe aktarma, takılmış bir içe aktarmadan ayırt edilemez; insanlar da onu yarı yolda öldürür — ki bu beklemekten kötüdür.

Yolun ortasında başarısız olursa

  • Disk doldu — veritabanının hem veriye HEM DE geçici dosyalara yer gerekir. Başlamadan önce df -h ile bakın.
  • MySQL server has gone away — max_allowed_packet değerinden büyük tek bir satır. Onu yükseltin: max_allowed_packet = 256M.
  • Unknown collation — döküm daha yeni bir MySQL'den gelmiş. Ya sürümü yükseltin ya da harmanlamayı dosyanın içinde yeniden yazın.
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' dump.sql
Canlı bir veritabanının üstüne değil, boş bir veritabanına aktarın. Yarı yolda başarısız olursa elinizde atılacak yarım aktarılmış bir kopya olur; yarı yıkılmış bir site değil.