Files
feadulta/scripts/cutover/02-sanear-dump.sh
T
rafa 65359338f8 cutover: los scripts con los que se ejecuto, y lo que quedo pendiente
Cutover hecho el 3-ago a las 10:50 UTC. feadulta.com y www.feadulta.com ya
apuntan a 188.40.120.157, proxied. Ventana real ~3 min 10 s: dump 67 s, saneo
2 s, import 114 s, delta de uploads 6 s (0 ficheros, como estaba medido).

Cuadro al digito con produccion: 43.893 posts, 1.228 usuarios, 4.416 terms,
135.959 postmeta. Los options salen 958 frente a 975 porque son transients (hay
580 y caducan solos). Con trafico real: 581 respuestas 200, 62 301, 16 302, cero
5xx y cero errores PHP en 20 minutos, 61 IPs distintas atendidas.

Se anaden los cuatro scripts que faltaban, que hasta hoy solo existian como
comandos sueltos del ensayo: 01-traer-dump, 02-sanear-dump, 03-importar,
04-delta-uploads y 05-mover-dns. El runbook ya los citaba por nombre.

Tres cosas encontradas al ejecutar, anotadas en los propios scripts:

- docker exec -i dentro de un ssh 'bash -s' <<EOF se come el resto del script,
  porque hereda el stdin del heredoc. Las consultas van sin -i y con </dev/null.
- Smart Slider cachea el HTML del slider con URLs absolutas, una fila por idioma
  en wp_nextend2_section_storage con application='cache'. Al verificar el import
  con la constante del staging todavia puesta quedaron 5 filas apuntando a
  nuevo.feadulta.com. Se borran y se regeneran solas.
- El cliente de MariaDB de la jaula de CDMON exige TLS y el servidor local no lo
  tiene: con --skip-ssl si se puede consultar la BD de produccion directamente,
  que es como se comprobo que no habia cambiado nada desde el dump de las 05:09.

Pendiente y fuera de nuestro alcance: purgar la cache de Cloudflare (el token
solo tiene permiso de DNS) y darle a Inma su contrasena nueva. Y los certificados
de Let's Encrypt para www y el apex, que fallan porque el WAF de Cloudflare
devuelve 403 a la validacion; no bloquea mientras la zona este en Full, pero por
eso mismo no se puede subir a Full (strict) todavia.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 07:00:38 -04:00

58 lines
2.2 KiB
Bash
Executable File

#!/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