Fix: DevKinsta “error de MySQL” tras recrearse el datadir de MariaDB

Contexto: DevKinsta (macOS) falló al importar/crear el sitio Rebeca Pal con ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) al ejecutar mysql -u root -p****** -e "create database Rebeca_Pal;" (ver ~/Library/Logs/DevKinsta/main.log). Causa: el volumen Docker devkinsta_db_data fue recreado (CreatedAt = fecha del fallo) y el datadir de MariaDB quedó con root SIN password, mientras que DevKinsta persiste la suya en ~/Library/Application Support/DevKinsta/config.json.

Diagnóstico:

  • DevKinsta NO usa el MySQL del host (/usr/local/mysql): usa MariaDB 10.5 en el contenedor devkinsta_db (Docker Desktop, puerto host 15100).
  • La password de root que espera DevKinsta está en config.json y también en el env MYSQL_ROOT_PASSWORD del contenedor.

Procedimiento (verificado 2026-08-12):

PW=$(python3 -c "import json;print(json.load(open('$HOME/Library/Application Support/DevKinsta/config.json')).get('password',''))")
# alternativa: leer del contenedor → docker inspect devkinsta_db | grep MYSQL_ROOT_PASSWORD
docker exec devkinsta_db mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$PW'; ALTER USER 'root'@'[IP]' IDENTIFIED BY '$PW'; ALTER USER 'root'@'::1' IDENTIFIED BY '$PW'; FLUSH PRIVILEGES;"
# root@'%' no existe; el host interno del contenedor puede faltar:
docker exec devkinsta_db mysql -uroot -p"$PW" -e "DROP USER IF EXISTS 'root'@'e7e8f337b4d6'; CREATE USER 'root'@'e7e8f337b4d6' IDENTIFIED BY '$PW'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'e7e8f337b4d6' WITH GRANT OPTION; FLUSH PRIVILEGES;"
# verificar:
docker exec devkinsta_db mysql -uroot -p"$PW" -e "SHOW DATABASES;"

Después: en la UI de DevKinsta, Reintentar la operación fallida (o eliminar el sitio y re-importar desde Kinsta). NO crear la BD manualmente: el paso database de la operación hace CREATE DATABASE Rebeca_Pal y fallaría si ya existe. Nota: el datadir se recrea en cada pérdida del volumen → revisar si había otros sitios locales (sus BDs se pierden).

Anexo 1 (retries): DevKinsta solo ejecuta CREATE DATABASE UNA vez por sitio; los reintentos saltan ese paso. Si la BD se pierde a mitad de import, recrearla vacía a mano: docker exec devkinsta_db mysql -uroot -p"$PW" -e "CREATE DATABASE Rebeca_Pal CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;".

Anexo 2 (import OK pero el sitio local redirige al staging): la BD importada trae siteurl/home con el dominio remoto (stg-rebecapal-stg.kinsta.cloud). Reemplazar con wp-cli (dentro del contenedor fpm; necesita --allow-root, y NO reemplazar dominios parciales — usar la URL completa):

docker exec devkinsta_fpm sh -c 'cd /www/kinsta/public/rebecapal && \
  wp --allow-root search-replace "https://stg-rebecapal-stg.kinsta.cloud" "https://rebecapal.local" --all-tables --precise && \
  wp --allow-root cache flush && wp --allow-root transient delete --all'

Ojo: si se reemplazó solo “kinsta.cloud”→“rebecapal.local” quedan prefijos “stg-rebecapal-stg.” → limpiar con wp search-replace "stg-rebecapal-stg." "" --all-tables --precise. Los archivos CSS de Elementor guardan URLs viejas: Regenerate CSS o se regeneran solos.