#!/bin/bash # # Paso 3 del cutover: sanear el dump. NO importa: eso es el paso 4. # # Dos cosas a la vez sobre el mismo streaming: # - excluir las 5 tablas de respaldo (*_bak y wp_fea_date_slug_posts_backup) # - mapear las collations de MariaDB 11 que MySQL 8.4 rechaza en el CREATE TABLE # # El troceado por tablas se apoya en los comentarios "# Table: `nombre`" que escribe # UpdraftPlus. Si algun dia el dump lo genera mysqldump, esto hay que rehacerlo. # set -euo pipefail DUMP=$(cat /home/rafa/migracion-wp/DUMP-DEL-DIA) echo "== dump: $DUMP" ssh -o BatchMode=yes root@188.40.120.157 "D='$DUMP' bash -s" <<'EOF' set -euo pipefail cd /data/feadulta-migracion OUT=feadulta-saneado.sql T0=$(date +%s) zcat "$D" \ | awk ' /^# Table: `/ { name = $0; sub(/^# Table: `/, "", name); sub(/`.*$/, "", name) skip = (name ~ /_bak$/ || name == "wp_fea_date_slug_posts_backup") ? 1 : 0 if (skip) print " [excluida] " name > "/dev/stderr" } !skip { print } ' \ | sed -E \ -e 's/utf8mb4_uca1400_ai_ci/utf8mb4_0900_ai_ci/g' \ -e 's/utf8mb3_uca1400_ai_ci/utf8mb4_0900_ai_ci/g' \ -e 's/CHARSET=utf8mb3/CHARSET=utf8mb4/g' \ -e 's/CHARACTER SET utf8mb3/CHARACTER SET utf8mb4/g' \ -e 's/utf8mb3_general_ci/utf8mb4_general_ci/g' \ > "$OUT" echo "" echo "== saneo en $(( $(date +%s) - T0 ))s" ls -l "$OUT" | awk '{printf " %.1f MB sin comprimir\n", $5/1048576}' echo "" echo "== VERIFICACION (las tres primeras deben dar 0)" u=$(grep -c 'uca1400' "$OUT" || true); echo " restos de uca1400 : $u" m=$(grep -c 'utf8mb3' "$OUT" || true); echo " restos de utf8mb3 : $m" b=$(grep -oE '^CREATE TABLE `[^`]+`' "$OUT" | grep -cE '_bak|backup' || true); echo " tablas de respaldo: $b" echo " tablas en el saneado: $(grep -cE '^CREATE TABLE ' "$OUT")" echo " DROP TABLE IF EXISTS: $(grep -c '^DROP TABLE IF EXISTS' "$OUT" || true) <- si es 0, hay que vaciar la BD antes" echo " collations resultantes:" grep -oE 'COLLATE=[a-z0-9_]+' "$OUT" | LC_ALL=C sort | uniq -c | sed 's/^/ /' echo " epilogo (debe verse el cierre del dump):" tail -3 "$OUT" | sed 's/^/ /' [ "$u" = "0" ] && [ "$m" = "0" ] && [ "$b" = "0" ] || { echo ""; echo "!! VERIFICACION FALLIDA, no importar"; exit 1; } echo "" echo "== saneado OK" EOF