Mover una base de datos es un volcado y una importación. Lo que la estropea es lo que el volcado no contiene, y enterarse de ello cuando el sitio ya apunta al servidor nuevo.
El volcado
mysqldump --single-transaction --quick --routines --triggers --events \
--default-character-set=utf8mb4 shop | gzip > shop.sql.gz
La transferencia
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'
Cree el destino como es debido, antes de importar
mysql -e "CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
zcat /tmp/shop.sql.gz | mysql shop
Cree primero la base con el juego de caracteres correcto. Importar en una base latin1 le da un esquema que parece correcto y destroza el árabe y los emoji en silencio: vea juego de caracteres y cotejo.
Las tres cosas que el volcado no lleva
- Usuarios y permisos. Viven en el esquema mysql. Vuelva a crearlos: vea usuarios y permisos.
- La configuración del servidor. Buffer pool, max_connections, tiempos de espera. Traslade las líneas que le competen.
- Los eventos programados, salvo que haya pasado --events, y el planificador de eventos también debe estar activo en el servidor nuevo.
CREATE USER 'shop'@'localhost' IDENTIFIED BY '...';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';
SET GLOBAL event_scheduler = ON;
Verifique antes de cambiar
# 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"
Compare el número de filas con el servidor viejo antes de apuntar la aplicación al nuevo. Una importación que falla a medias termina igualmente sin quejarse en algunos caminos, y media base de datos se parece exactamente a una que funciona hasta que alguien busca el mes pasado.