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>
This commit is contained in:
Executable
+57
@@ -0,0 +1,57 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user