Eine Datenbank umzuziehen ist ein Dump und ein Import. Schief geht es an dem, was ein Dump nicht enthält - und daran, das erst zu merken, wenn die Website schon auf den neuen Server zeigt.
Dump
mysqldump --single-transaction --quick --routines --triggers --events \
--default-character-set=utf8mb4 shop | gzip > shop.sql.gz
Übertragen
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'
Das Ziel richtig anlegen, vor dem Import
mysql -e "CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
zcat /tmp/shop.sql.gz | mysql shop
Legen Sie die Datenbank zuerst mit dem richtigen Zeichensatz an. Ein Import in eine latin1-Datenbank ergibt ein Schema, das richtig aussieht, und zerlegt Arabisch und Emoji lautlos - siehe Zeichensatz und Sortierung.
Die drei Dinge, die der Dump nicht mitbringt
- Benutzer und Rechte. Sie wohnen im mysql-Schema. Legen Sie sie neu an - siehe Benutzer und Rechte.
- Serverkonfiguration. Buffer Pool, max_connections, Zeitlimits. Übernehmen Sie die betreffenden Zeilen.
- Geplante Ereignisse, es sei denn, Sie haben --events angegeben, und der Event-Scheduler muss auf dem neuen Server ebenfalls aktiv sein.
CREATE USER 'shop'@'localhost' IDENTIFIED BY '...';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';
SET GLOBAL event_scheduler = ON;
Prüfen, bevor Sie umschalten
# 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"
Vergleichen Sie die Zeilenzahlen mit dem alten Server, bevor Sie die Anwendung auf den neuen richten. Ein Import, der auf halber Strecke scheitert, endet auf manchen Wegen trotzdem klaglos, und eine halbe Datenbank sieht genau aus wie eine funktionierende - bis jemand den letzten Monat sucht.