Memindahkan basis data adalah sebuah cadangan dan sebuah impor. Yang membuatnya kacau adalah apa yang tidak dikandung cadangan itu, dan baru mengetahuinya setelah situs sudah diarahkan ke server baru.

Cadangan

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

Pemindahan

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'

Buat tujuannya dengan benar, sebelum mengimpor

mysql -e "CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
zcat /tmp/shop.sql.gz | mysql shop
Buat dulu basis datanya dengan set karakter yang benar. Mengimpor ke basis data latin1 memberi Anda skema yang tampak benar dan merusak huruf Arab serta emoji tanpa suara - lihat set karakter dan kolasi.

Tiga hal yang tidak dibawa cadangan

  • Pengguna dan hak. Mereka tinggal di skema mysql. Buat ulang - lihat pengguna dan hak.
  • Konfigurasi server. Buffer pool, max_connections, batas waktu. Salin baris-baris yang relevan.
  • Peristiwa terjadwal, kecuali Anda memberi --events, dan penjadwal peristiwa juga harus aktif di server baru.
CREATE USER 'shop'@'localhost' IDENTIFIED BY '...';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';
SET GLOBAL event_scheduler = ON;

Pastikan sebelum berpindah

# 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"
Bandingkan jumlah barisnya dengan server lama sebelum mengarahkan aplikasi ke yang baru. Impor yang gagal di tengah jalan tetap berakhir tanpa mengeluh pada sebagian jalur, dan setengah basis data tampak persis seperti yang utuh sampai ada yang mencari bulan lalu.