Copias de seguridad

Respaldos por tabla para minimizar la pérdida de datos

Imagen relacionada con respaldos por tabla

¿Se han perdido pedidos, usuarios o respuestas de formularios tras una actualización o fallo? Una restauración completa puede romper la integridad y prolongar la recuperación; quien gestiona el sitio necesita recuperar datos concretos rápido y sin afectar el resto del WordPress.

Un backup granular copia y restaura solo tablas concretas de la base de datos (por ejemplo wp_posts o wp_woocommerce_orders), minimizando tiempos de inactividad. Métodos seguros: mysqldump --tables, phpMyAdmin, binlogs/PITR y réplicas; scripts reproducibles (Bash, WP-CLI), manejo de dependencias FK y conflictos, estrategias para hosts compartidos sin SSH y para bases de datos grandes. Comprobar las tablas críticas y sus dependencias es el primer paso; continuar con el resumen del proceso.

Índice

Anuncio

Resumen del proceso

  1. Identificar tablas críticas y dependencias. Comprobar engine y collation.
  2. Exportar esquema y datos de las tablas objetivo con flags transaccionales.
  3. Guardar dump de la tabla actual como rollback inmediato.
  4. Restaurar en modo controlado (desactivar FK si procede). Comprobar duplicados.
  5. Ejecutar pruebas funcionales en staging y en producción fuera pico.
  6. Documentar y rotar backups en remoto, cifrados y con retención.
Tiempo estimado: para tablas pequeñas el ciclo completo (dump, import, verificación) suele llevar entre 10 y 20 minutos; para tablas grandes puede tardar horas sin réplica.

Imagen relacionada con respaldos por tabla

Paso 1: conceptos clave y ventajas

Breve definición: un respaldo por tabla exporta el esquema y/o los datos de tablas concretas de MySQL/MariaDB. Sirve para recuperar pedidos, usuarios o metadatos sin restaurar toda la base.

Diferencia técnica: un dump lógico (.sql) contiene instrucciones CREATE/INSERT. Un snapshot físico copia ficheros InnoDB y suele ser más rápido, pero no siempre permite extraer solo una tabla sin herramientas adicionales.

Motores: InnoDB permite transacciones y el flag --single-transaction. MyISAM no soporta transacciones; exportar tablas MyISAM puede requerir bloqueo.

Tablas críticas de WordPress: wp_posts, wp_postmeta, wp_users, wp_usermeta, wp_options y tablas de ecommerce. Exportar solo una de estas sin revisar sus dependencias suele romper funcionalidades.

Advertencia: exportar solo datos sin el esquema puede causar errores por columnas nuevas o collation distinto. Siempre exportar el esquema si hay dudas.

Anuncio

Paso 2: ventajas de respaldos por tabla frente a copias completas

Reducción de downtime. Restaurar una tabla suele ser mucho más rápido que cargar una base completa. Esto baja el RTO para incidentes puntuales.

Ahorro de espacio y tiempo. Los dumps de tablas críticas ocupan menos y se comprimen mejor. Para tiendas con pedidos frecuentes, solo salvando tablas de pedidos se reduce el RPO.

Menor I/O en producción si se usa réplica o export desde esclavo. Para bases grandes, exportar desde un esclavo evita impacto en el maestro.

Límites: no válido cuando el incidente afecta al esquema o a áreas múltiples acopladas. En esos casos la restauración completa o PITR con binlogs es la opción segura.

Paso 3: cómo hacer backup granular de tablas en WordPress

Este bloque contiene comandos reproducibles según acceso y tamaño de BD. Escoger la opción según el entorno: SSH disponible, acceso a réplica, o solo panel phpMyAdmin.

Mysqldump por tablas

Comando estándar para InnoDB:

bash mysqldump --single-transaction --quick --skip-lock-tables -u USUARIO -p NOMBRE_BD --tables wp_posts wp_postmeta > backup_tablas.sql

Explicación breve de flags:

Para tablas enormes exportar por rangos:

bash mysqldump -u USUARIO -p NOMBRE_BD wp_posts --where="post_date >= '2026-01-01'" > posts_2026.sql

Si no hay espacio en disco local, usar streaming y compresión:

bash mysqldump -u USUARIO -p NOMBRE_BD --tables wp_posts | gzip > /tmp/wp_posts.sql.gz

Tiempo real: volcar 1M filas puede tardar entre 20 y 60 minutos según I/O y CPU.

phpMyAdmin y hosting compartido

Flujo seguro:

Errores frecuentes: timeout o límites de upload. Si ocurre dividir por tablas individuales o usar SELECT INTO OUTFILE si el host lo permite.

SELECT INTO OUTFILE / LOAD DATA INFILE

Útil cuando se tiene acceso al filesystem MySQL:

sql SELECT * FROM wp_posts WHERE post_type='shop_order' INTO OUTFILE '/tmp/orders.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '/n';

Requiere permisos de archivo y es muy rápido. Importación con LOAD DATA INFILE.

WP-CLI para integrarlo en scripts

Obtener credenciales y lanzar mysqldump sin hardcodear:

bash DB_NAME=$(wp config get DB_NAME) DB_USER=$(wp config get DB_USER) DB_PASS=$(wp config get DB_PASSWORD) DB_HOST=$(wp config get DB_HOST) mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" --single-transaction --quick "$DB_NAME" --tables wp_posts > /backups/wp_posts.sql

Usar --path si el WP no está en el directorio actual.

Métodos para bases de datos grandes y sin impacto

Referencias: guías oficiales de Percona son útiles para entornos grandes.

1. Identificar tablas
2. Exportar esquema + datos
3. Importar en modo controlado
4. Verificar y documentar
Flujo: elegir origen (maestro/esclavo) → exportar con flags transaccionales → importar con FK controladas → ejecutar checks.

Cuando el entorno requiere copias físicas (por ejemplo Percona XtraBackup) y se necesita restaurar solo una tabla InnoDB, el proceso difiere del dump lógico. Es viable si innodb_file_per_table=1:

  1. Generar backup físico con xtrabackup --backup --target-dir=/backups/xtrabackup
  2. Preparar el backup: xtrabackup --prepare --target-dir=/backups/xtrabackup
  3. Exportar la tabla concreta desde el backup con xtrabackup --export --target-dir=/backups/xtrabackup --datadir=/var/lib/mysql y esto produce .ibd y .cfg listos para importar.
  4. En el servidor de destino crear la tabla vacía con el mismo esquema (CREATE TABLE ...) y ejecutar ALTER TABLE nombre_tabla DISCARD TABLESPACE; copiar el .ibd y el .cfg al datadir correspondiente y finalmente ALTER TABLE nombre_tabla IMPORT TABLESPACE. Puntos críticos: la tabla debe tener file-per-table, las versiones de MySQL/MariaDB deben ser compatibles y hay que respetar permisos/propietarios de archivos. Probar el flujo en staging es esencial porque la manipulación de tablespaces físicas es delicada y puede dejar la tabla inaccesible si algo falla.

Paso 4: plugins para backup granular de tablas MySQL

Plugins ofrecen facilidad en hosting sin SSH. No todos permiten exportar tablas individuales.

Recomendaciones prácticas:

Ejemplos habituales: UpdraftPlus y BlogVault ofrecen backups gestionados. ManageWP centraliza tareas. Para entornos críticos conviene comparar con la opción del proveedor (snapshots de infraestructura).

Anuncio

Paso 5: restaurar tablas específicas: guía paso a paso

Checklist previo:

Identificar claves foráneas relacionadas:

sql SELECT TABLE_SCHEMA, TABLE_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_SCHEMA='nombre_bd' AND REFERENCED_TABLE_NAME='wp_users';

Procedimiento de import seguro:

  1. Poner modo mantenimiento si la tabla afecta operaciones críticas.
  2. Respaldar la tabla existente (dump pre_restore).
  3. Opcional: SET FOREIGN_KEY_CHECKS=0;
  4. Importar el SQL: mysql -u user -p DB < backup_tabla.sql
  5. Reactivar FK: SET FOREIGN_KEY_CHECKS=1;
  6. Ejecutar comprobaciones: identificar filas huérfanas o duplicados.

Comandos SQL para comprobaciones comunes:

sql -- Filas huérfanas en postmeta SELECT COUNT(*) FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);

-- Ver usuarios sin meta SELECT u.ID FROM wp_users u LEFT JOIN wp_usermeta m ON u.ID = m.user_id WHERE m.umeta_id IS NULL LIMIT 10;

Resolución de conflictos:

sql DELETE t1 FROM wp_users t1 INNER JOIN wp_users t2 WHERE t1.ID > t2.ID AND t1.user_email = t2.user_email;

Restauración en hosting compartido sin SSH:

Recuperar wp_users y wp_usermeta tras eliminación accidental

  1. Exportar ambas tablas en formato SQL.
  2. Importar primero wp_users, luego wp_usermeta.
  3. Ejecutar verificación de correspondencia de IDs.

Query de verificación final:

sql SELECT u.ID, COUNT(m.umeta_id) AS metas FROM wp_users u LEFT JOIN wp_usermeta m ON u.ID = m.user_id GROUP BY u.ID LIMIT 20;

Para recuperar datos a nivel de fila o hasta un punto en el tiempo es imprescindible detallar el uso de binlogs y mysqlbinlog. Un flujo práctico sería:

  1. Identificar el binlog y el intervalo temporal relevante (por ejemplo usando SHOW BINARY LOGS y mysqlbinlog --start-datetime/--stop-datetime)
  2. Extraer las transacciones del intervalo con mysqlbinlog --start-datetime='2026-03-01 10:00:00' --stop-datetime='2026-03-01 10:30:00' /var/lib/mysql/binlog.000012 > tramo.sql
  3. Revisar tramo.sql para filtrar únicamente las sentencias que afectan a la tabla objetivo (buscar recurrentemente el nombre de la tabla o usar mysqlbinlog --database=nombre_bd). Si los binlogs usan formato ROW, añadir --base64-output=DECODE-ROWS -vv permite ver los cambios por fila y localizar sólo los eventos de la tabla afectada; para aplicar, ejecutar mysql -u usuario -p nombre_bd < tramo_filtrado.sql. Advertencia práctica: antes de aplicar binlogs en producción, ensayar en un entorno clon y mantener siempre un dump de rollback de las tablas destino, porque la reproducción indiscriminada puede afectar otras tablas si no se filtran las transacciones.

Paso 6: automatizar backups granulares con scripts y WP-CLI

Principios: rotación, cifrado, logs y alertas. Ejecutar pruebas periódicas de restauración.

Script Bash reproducible (ejemplo comentado):

bash BACKUP_DIR=/backups/$(date +%F) mkdir -p "$BACKUP_DIR" DB_NAME=$(wp config get DB_NAME) DB_USER=$(wp config get DB_USER) DB_PASS=$(wp config get DB_PASSWORD) DB_HOST=$(wp config get DB_HOST) TABLES=(wp_posts wp_postmeta wp_users) for t in "${TABLES[@]}"; do mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" --single-transaction --quick "$DB_NAME" --tables "$t" | gzip > "$BACKUP_DIR/$t.sql.gz" done tar -czf - "$BACKUP_DIR" | openssl enc -aes-256-cbc -salt -out "$BACKUP_DIR.tar.gz.enc" -k "$ENCRYPT_PASS" find /backups -maxdepth 1 -type d -mtime +14 -exec rm -rf {} /;

Puntos críticos: no dejar contraseñas en crontab. Usar archivo .my.cnf con permisos 600 o variables de entorno con permisos restrictivos.

Ejemplo crontab diaria (00:30):

cron 30 0 * * * /usr/bin/bash /usr/local/bin/backup_tables.sh >> /var/log/backup_tables.log 2>&1

Automatización sin SSH: usar plugins con programación y envío a S3/GCP. Verificar compatibilidad con el proveedor de hosting.

Dato operativo: WordPress lidera la web con aproximadamente 43% de sitios (2024). Esto justifica políticas de backup estrictas en sitios de alto tráfico.

Para bases de datos muy grandes (decenas de millones de filas) las técnicas comunes (mysqldump --single-transaction) pueden tener efectos secundarios: una transacción larga impide la purga de UNDO y consume espacio, y seleccionar por OFFSET es ineficiente. Reglas prácticas:

  1. Exportar por rangos en la clave primaria con WHERE id BETWEEN X AND Y (ej. exportar bloques de 100k filas), no usar OFFSET.
  2. Preferir operaciones desde una réplica para no impactar el maestro.
  3. Usar herramientas como pt-archiver para extraer filas incrementalmente sin bloquear (pt-archiver --source h=host,D=db,t=wp_posts --txn-size=1000 --limit=1000 --where "post_date >= '2026-01-01'" --purge=false --file /tmp/posts_chunk.sql).
  4. Al importar, respetar el orden de tablas relacionadas o desactivar temporalmente las FK y ejecutar comprobaciones posteriores.
  5. Documentar y automatizar los chunks en scripts con backoff entre bloques para limitar I/O. Estas tácticas reducen el riesgo de crear transacciones muy largas y mantienen la base usable durante el proceso.

Playbook operativo: errores que arruinan el resultado y cuándo no funciona este método

Errores que rompen la restauración

Cuándo no aplicar restauración por tabla

Matriz de decisión rápida

Comparativa técnica

Método Velocidad Impacto I/O Necesidad de acceso Complejidad
mysqldump (tablas) Media Bajo/Medio SSH Baja
phpMyAdmin export Baja a media Variable Panel Baja
Réplicas + dump Rápida Muy bajo en maestro SSH + réplica Media
Percona XtraBackup Muy rápida (físico) Bajo Acceso a FS / DBA Alta
Binlogs / PITR Variable Muy bajo Acceso a binlogs Alta
Excepción: Si el hosting devuelve snapshots atómicos, preferirlos para fallos masivos. No aplicar dumps por tabla en ese caso.
Recomendación operativa: programar pruebas de restauración trimestrales (4 veces al año). Esta práctica se viene adoptando desde hace dos años en equipos que gestionan tiendas con alto volumen.

Anuncio

Preguntas frecuentes

¿Cómo hacer un backup en WordPress?

Respuesta: usar plugin o export manual con mysqldump y rsync. En entornos con SSH, mysqldump por tabla y rsync de wp-content es la opción más flexible.

Para copias completas usar wp db export o mysqldump y sincronizar wp-content con rsync. Para copias granulares exportar solo las tablas críticas. Comprimir y cifrar antes de subir a S3 o GCP. Probar la restauración en staging tras cada cambio mayor.

¿Dónde están las copias de seguridad de WordPress?

Respuesta: pueden estar en el servidor, en el panel del hosting o en almacenamiento remoto.

En hosting compartido suelen ubicarse en áreas de backup del proveedor (cPanel/Plesk). Plugins almacenan en S3, Dropbox o GCP. Snapshots de proveedor cloud quedan en el data center. Comprobar la retención y probar accesos. Para cumplimiento RGPD (2018) mantener datos en la UE cuando proceda.

¿Puede WordPress manejar una base de datos grande?

Respuesta: sí, con ajuste de infraestructura y estrategias específicas.

Es necesario escalado horizontal (réplicas), índices adecuados, caching y backups físicos como Percona XtraBackup o snapshots LVM. En grandes volúmenes, exportar desde réplica evita impacto. Monitorizar queries y planificar RTO/RPO.

¿Cuál es el mejor plugin de caché para WordPress?

Respuesta: depende del entorno y del hosting.

Opciones habituales: WP Super Cache, W3 Total Cache y LiteSpeed Cache. Algunas plataformas gestionadas ya integran caching a nivel servidor. La caché reduce I/O y mejora tiempos, pero no sustituye a las copias de seguridad.

¿Se pueden restaurar solo filas específicas?

Respuesta: sí, con binlogs o con dumps parciales usando WHERE.

Para filas concretas usar mysqldump con --where o mysqlbinlog para aplicar transacciones hasta un punto. Filtrar por tabla puede requerir procesamiento de binlogs. Estos métodos requieren mayor cuidado para mantener consistencia referencial.

¿Cómo evitar romper relaciones entre tablas al restaurar?

Respuesta: exportar y restaurar dependencias en orden y verificar FK.

Identificar constraints en information_schema, desactivar temporalmente FOREIGN_KEY_CHECKS solo cuando se tienen respaldos y comprobaciones. Restaurar tablas referenciadas primero (por ejemplo wp_posts antes de wp_postmeta) y ejecutar queries de verificación. Mantener dump pre_restore para rollback inmediato.

Cierre operativo, pasos siguientes y recursos

Cinco mandamientos para respaldos por tabla:

Checklist de acción inmediata (ejecutar ahora):

  1. Identificar 3 tablas críticas y hacer un dump inmediato de ellas.
  2. Guardar los dumps cifrados en remoto y notificar al equipo.
  3. Programar una restauración de prueba en staging esta semana.

Recursos y documentación oficial:

Nota final: si faltan binlogs, o si existe corrupción de archivos InnoDB, escalar a DBA o al soporte del hosting y solicitar acceso a snapshots del proveedor. El proceso aquí descrito no funciona para corrupción física.
RESUMIR CON IA: Extrae lo importante

Comparte este artículo:

Josu Barrios

Josu Barrios

Somos especialistas en mantenimiento WordPress para empresas, profesionales y tiendas online. Contamos con experiencia en seguridad web, optimización de rendimiento, actualizaciones, copias de seguridad y resolución de incidencias técnicas, ayudando a que cada sitio funcione de forma rápida, estable y protegida. Nuestro enfoque combina soporte técnico profesional, buenas prácticas de seguridad y seguimiento continuo para ofrecer un servicio fiable, transparente y orientado a resultados reales.