Bir veritabanını taşımak bir yedek ve bir içe aktarmadır. İşi bozan şey, yedeğin içermediğidir - ve bunu site zaten yeni sunucuya yönlendirildikten sonra öğrenmektir.

Yedek

mysqldump --single-transaction --quick --routines --triggers --events \
          --default-character-set=utf8mb4 shop | gzip > shop.sql.gz

Aktarma

scp shop.sql.gz newserver:/tmp/
# or stream it directly, with no file in between
mysqldump --single-transaction shop | gzip | ssh newserver 'gunzip | mysql shop'

Hedefi içe aktarmadan önce doğru kurun

mysql -e "CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
zcat /tmp/shop.sql.gz | mysql shop
Veritabanını önce doğru karakter kümesiyle oluşturun. latin1 bir veritabanına içe aktarmak size doğru görünen bir şema verir ve Arapçayı da emojiyi de sessizce bozar - bakınız karakter kümesi ve harmanlama.

Yedeğin taşımadığı üç şey

  • Kullanıcılar ve yetkiler. mysql şemasında otururlar. Yeniden oluşturun - bakınız kullanıcılar ve yetkiler.
  • Sunucu yapılandırması. Tampon havuzu, max_connections, zaman aşımları. İlgili satırları karşıya taşıyın.
  • Zamanlanmış olaylar - --events vermediyseniz - ve olay zamanlayıcısının yeni sunucuda da açık olması gerekir.
CREATE USER 'shop'@'localhost' IDENTIFIED BY '...';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';
SET GLOBAL event_scheduler = ON;

Geçmeden önce doğrulayın

# same table count, same row counts on the tables that matter
mysql -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='shop'"
mysql shop -e "SELECT COUNT(*) FROM orders; SELECT COUNT(*) FROM customers"
Uygulamayı yeni sunucuya yönlendirmeden önce satır sayılarını eskisiyle karşılaştırın. Yarıda kalan bir içe aktarma bazı yollarda yine de şikâyetsiz biter ve yarım bir veritabanı, biri geçen ayı arayana kadar çalışan bir veritabanına tıpatıp benzer.