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