Cómo restaurar una copia de seguridad en SQL Server cuando la base de datos está en uso

Cómo restaurar una copia de seguridad en SQL Server cuando la base de datos está en uso

Evitar errores de “base de datos en uso” en SQL Server Management Studio

En ocasiones, al intentar restaurar una copia de seguridad desde SQL Server Management Studio (SSMS), el sistema muestra errores indicando que la base de datos está siendo utilizada por otros usuarios o conexiones activas.

Una forma rápida de solucionarlo es forzar temporalmente el modo SINGLE_USER, cerrando todas las conexiones abiertas antes de ejecutar la restauración.

Este script permite automatizar el proceso:

USE master;
GO

ALTER DATABASE [mibasededatos]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

RESTORE DATABASE [mibasededatos]
FROM DISK = 'C:\backup\copia_aaammdd_01.bak'
WITH REPLACE;
GO

¿Qué hace cada parte del script?

  • SET SINGLE_USER: pone la base de datos en modo usuario único.
  • WITH ROLLBACK IMMEDIATE: cierra inmediatamente las conexiones activas y cancela procesos abiertos.
  • RESTORE DATABASE: restaura la copia de seguridad indicada.
  • WITH REPLACE: sobrescribe la base de datos existente.

Importante antes de ejecutarlo

  • Asegúrate de que ningún usuario esté trabajando en la base de datos.
  • Comprueba que la ruta del archivo .bak es correcta.
  • El usuario de SQL Server debe tener permisos sobre la carpeta del backup.
  • Usa este procedimiento con precaución en entornos de producción.

Este método es especialmente útil en servidores de desarrollo, pruebas o entornos donde hay conexiones persistentes que impiden restaurar copias desde la interfaz gráfica de SQL Server Management Studio.

Cómo solucionar errores de accesibilidad usando aria-label en botones e iconos

Cómo solucionar errores de accesibilidad usando aria-label en botones e iconos

Pequeños cambios que ayudan a pasar tests de accesibilidad y mejoran la experiencia de usuario

Cuando haces una auditoría con herramientas como Lighthouse, WAVE o axe DevTools, hay dos errores que aparecen constantemente en muchas webs: botones vacíos y enlaces con iconos sin texto accesible.

Es algo muy habitual, sobre todo cuando trabajamos con menús móviles, iconos sociales o botones hechos únicamente con Bootstrap Icons, Font Awesome o SVG.

La buena noticia es que, en muchos casos, la solución es muy sencilla: añadir correctamente aria-label.

Comparto dos ejemplos reales que he aplicado recientemente y que ayudan a eliminar este tipo de avisos rápidamente.


Error “Empty Button” en botones con iconos

Este error suele aparecer mucho en botones de menú hamburguesa o elementos que visualmente muestran un icono, pero no tienen texto legible para lectores de pantalla.

Por ejemplo, este botón funciona perfectamente a nivel visual:

<button class="btn p-0 border-0 d-xl-none" 
        type="button" 
        data-bs-toggle="offcanvas" 
        data-bs-target="#offcanvasMenu">
    <i class="bi bi-list fs-1"></i>
</button>

El problema es que un lector de pantalla no sabe qué hace ese botón. Para la herramienta de accesibilidad, está “vacío”.

La solución es añadir un aria-label describiendo la acción:

<button class="btn p-0 border-0 d-xl-none" 
        type="button" 
        data-bs-toggle="offcanvas" 
        data-bs-target="#offcanvasMenu"
        aria-controls="offcanvasMenu"
        aria-label="Abrir menú">
    <i class="bi bi-list fs-1"></i>
</button>

Con algo tan simple como esto:

  • Desaparece el error “Empty Button”.
  • El botón pasa a ser accesible.
  • Los lectores de pantalla entienden su función.
  • No afecta al diseño visual.

Enlaces con iconos sociales sin texto accesible

Otro caso muy típico aparece con los botones de compartir en redes sociales.

Muchas veces dejamos únicamente el icono:

<a href="https://x.com/intent/tweet?text=<?php echo urlencode($titlecompartir); ?>&url=<?php echo urlencode($urlcompartir); ?>" target="_blank">
    <i class="bi bi-twitter-x"></i>
</a>

Visualmente se entiende perfectamente que sirve para compartir en X, pero a nivel de accesibilidad el enlace no tiene descripción.

La solución vuelve a ser añadir un aria-label:

<a href="https://x.com/intent/tweet?text=<?php echo urlencode($titlecompartir); ?>&url=<?php echo urlencode($urlcompartir); ?>" 
   target="_blank" 
   rel="noopener noreferrer" 
   class="fs-3 mx-3 text-primary"
   aria-label="Compartir en X"
   title="Compartir en X">
    <i class="bi bi-twitter-x"></i>
</a>

En este caso, el lector de pantalla ya puede interpretar correctamente la acción del enlace.


¿title y aria-label hacen lo mismo?

Es una duda bastante habitual.

El atributo title puede mostrar un tooltip visual al pasar el ratón, pero no siempre es suficiente para accesibilidad.

En cambio, aria-label está pensado específicamente para tecnologías asistivas y lectores de pantalla.

Por eso, cuando usamos iconos sin texto visible, es recomendable utilizar ambos:

title="Compartir en X"
aria-label="Compartir en X"

Cuándo merece la pena usar aria-label

Yo suelo utilizarlo sobre todo en estos casos:

  • Botones que solo tienen iconos.
  • Menús hamburguesa.
  • Botones flotantes.
  • Iconos de compartir en redes sociales.
  • SVG sin texto visible.
  • Elementos interactivos donde la función no queda clara para lectores de pantalla.

Importante: no hay que abusar de aria-label

Si un botón ya tiene texto visible, normalmente no hace falta añadirlo.

Por ejemplo:

<button>Enviar formulario</button>

En ese caso el contenido ya es accesible y entendible.


Conclusión

Muchas veces pensamos que mejorar la accesibilidad implica hacer grandes cambios, pero no siempre es así.

Detalles tan pequeños como añadir correctamente un aria-label pueden ayudarte a:

  • Pasar auditorías de accesibilidad.
  • Mejorar la experiencia de usuarios con lectores de pantalla.
  • Optimizar la calidad técnica de la web.
  • Evitar errores frecuentes en Lighthouse o WAVE.

Son cambios rápidos de aplicar y que aportan mucho más valor del que parece.

Infografia accesibilidad aria-label

Ponte Manos a la Web y aplica ya estos cambios!

 

Buenas prácticas al optimizar bases de datos MySQL/MariaDB en WordPress

Buenas prácticas al optimizar bases de datos MySQL/MariaDB en WordPress

Introducción

Cuando pensamos en optimizar un sitio WordPress solemos fijarnos en el hosting, la caché o la velocidad de carga de imágenes. Sin embargo, hay un factor silencioso que con el tiempo puede convertirse en un cuello de botella: la base de datos.

WordPress utiliza MySQL o MariaDB como motor de almacenamiento. Allí se guardan entradas, páginas, configuraciones, usuarios, comentarios y ajustes de plugins. Si no se mantiene limpia y ordenada, la base de datos crece innecesariamente y cada consulta puede volverse más lenta.

En este artículo veremos algunas buenas prácticas para optimizar bases de datos MySQL/MariaDB en WordPress, tanto desde el panel de administración como directamente a nivel de servidor.

¿Por qué es importante optimizar la base de datos?

Optimizar la base de datos puede ayudar a mejorar varios aspectos importantes de una web:

  • Velocidad de carga: cada consulta más ligera reduce el tiempo de respuesta.
  • Menor consumo de recursos: consultas pesadas aumentan el uso de CPU, memoria y disco.
  • Mejor escalabilidad: una base de datos cuidada soporta mejor el crecimiento del tráfico.
  • Prevención de errores: datos redundantes, temporales o corruptos pueden causar fallos en plugins y funcionalidades.

En resumen: optimizar la base de datos es una forma directa de mejorar la experiencia del usuario y la salud general del servidor.

1. Eliminar revisiones y borradores automáticos

Cada vez que editamos una entrada en WordPress, el sistema guarda revisiones y borradores automáticos. Esto es útil, pero con el tiempo puede acumular miles de registros innecesarios.

Podemos hacerlo con plugins como WP-Optimize o Advanced Database Cleaner, pero también directamente desde phpMyAdmin o consola con una consulta SQL.

DELETE FROM wp_posts WHERE post_type = 'revision';

Importante: antes de ejecutar cualquier consulta SQL, conviene hacer siempre una copia de seguridad de la base de datos.

2. Limpiar la tabla de opciones

La tabla wp_options es una de las más importantes de WordPress. En ella se guardan configuraciones del sitio, opciones de plugins, ajustes del tema y datos temporales.

Uno de los problemas habituales es la acumulación de transients, que son datos temporales que WordPress y algunos plugins utilizan para guardar información durante un tiempo determinado.

Para eliminar transients podemos usar una consulta como esta:

DELETE FROM wp_options WHERE option_name LIKE '_transient_%';

También es recomendable revisar esta tabla cuando se han instalado y desinstalado muchos plugins, ya que algunos dejan restos de configuración aunque ya no estén activos.

3. Optimizar tablas principales

MySQL y MariaDB permiten optimizar tablas para reorganizar datos internamente y liberar espacio cuando ha habido muchas operaciones de inserción, edición o eliminación.

En WordPress, algunas de las tablas que más suelen crecer son:

  • wp_posts
  • wp_postmeta
  • wp_options
  • wp_comments
  • wp_commentmeta

Podemos optimizarlas con consultas como estas:

OPTIMIZE TABLE wp_posts;
OPTIMIZE TABLE wp_postmeta;
OPTIMIZE TABLE wp_options;

Esta tarea también puede realizarse desde phpMyAdmin seleccionando las tablas y usando la opción de optimización.

4. Revisar índices y consultas pesadas

En sitios con mucho contenido o plugins complejos, no basta con limpiar la base de datos. También es importante revisar si existen consultas lentas o mal planteadas.

Los índices funcionan como atajos que permiten a MySQL encontrar datos más rápido. Son especialmente útiles en columnas usadas en condiciones WHERE, relaciones JOIN u ordenaciones con ORDER BY.

Una herramienta útil para analizar consultas es EXPLAIN, que muestra cómo MySQL ejecuta una consulta y si está utilizando índices correctamente.

EXPLAIN SELECT * FROM wp_posts WHERE post_status = 'publish';

Esto ayuda a detectar consultas que recorren demasiadas filas o que no aprovechan bien los índices existentes.

5. Automatizar el mantenimiento

En una web con publicaciones frecuentes, hacer este mantenimiento de forma manual puede ser poco práctico. Lo recomendable es programar tareas periódicas.

Algunas opciones habituales son:

  • Usar plugins de optimización con tareas programadas.
  • Configurar cron jobs en el servidor.
  • Ejecutar herramientas como mysqlcheck desde consola.
mysqlcheck -o --all-databases -u usuario -p

La frecuencia dependerá del tamaño y actividad de la web. En sitios pequeños puede bastar con una revisión mensual. En proyectos con muchas publicaciones, usuarios o pedidos, puede ser recomendable hacerlo semanalmente.

6. Monitorizar el crecimiento de la base de datos

Una buena práctica es revisar periódicamente el tamaño de las tablas. Esto permite detectar crecimientos anómalos antes de que afecten al rendimiento.

Por ejemplo, si la tabla wp_postmeta crece demasiado, puede deberse a plugins que guardan mucha información adicional por cada entrada o producto. Si wp_options aumenta sin control, puede haber transients acumulados o configuraciones antiguas.

Desde phpMyAdmin podemos ver fácilmente el tamaño de cada tabla. También existen herramientas como MySQLTuner que ayudan a revisar la configuración general del servidor MySQL/MariaDB.

Conclusión

La base de datos es el corazón de WordPress. Si la descuidamos, tarde o temprano puede afectar al rendimiento de la web, al consumo de recursos del servidor y a la experiencia del usuario.

Con pequeñas acciones periódicas —limpiar revisiones, depurar transients, optimizar tablas, revisar consultas e identificar crecimientos anómalos— podemos mantener una base de datos más ligera y preparada para crecer.

Además, un sitio más rápido no solo beneficia al usuario. También ayuda al SEO técnico, mejora los Core Web Vitals y reduce la carga general del servidor.

Consejos prácticos finales

  • Haz siempre una copia de seguridad antes de tocar la base de datos.
  • Empieza por tareas sencillas, como eliminar revisiones y limpiar transients.
  • No instales plugins de optimización sin revisar bien sus opciones.
  • Programa mantenimientos periódicos según el tamaño de la web.
  • Revisa las tablas que más crecen para detectar posibles problemas.
Optimización de Core Web Vitals en WordPress sin plugins extra

Optimización de Core Web Vitals en WordPress sin plugins extra

Los Core Web Vitals son un conjunto de métricas que el Sr. Google utiliza para evaluar la experiencia de usuario en una web. Estas métricas afectan directamente al SEO y a la satisfacción de los visitantes.y del propio Sr Google (¿por qué negarlo?)

Índice

CWV  WordPress

¿Qué son los Core Web Vitals?

  • LCP (Largest Contentful Paint): mide el tiempo que tarda en mostrarse el contenido principal.
  • FID (First Input Delay) → ahora INP (Interaction to Next Paint): mide la rapidez de respuesta a la primera interacción del usuario.
  • CLS (Cumulative Layout Shift): mide la estabilidad visual (evitar que los elementos “salten” mientras carga la página).

Optimizar LCP

  • Optimiza imágenes (WebP, AVIF, tamaños adecuados).
  • Usa loading="lazy" en imágenes no críticas.
  • Elimina o combina CSS que no uses para reducir peso (con cuidado que la puedes liar).

En WordPress: puedes quitar CSS innecesario en el functions.php de tu tema hijo con wp_dequeue_style():


// functions.php en tu tema hijo
function remove_unused_styles() {
    if ( ! is_page('contacto') ) {
        wp_dequeue_style('contact-form-7'); 
    }
}
add_action('wp_enqueue_scripts', 'remove_unused_styles', 20);

Optimizar INP

  • Reduce JavaScript pesado y elimina lo que no uses con wp_dequeue_script(). (Si algo deja de funcionar vuelve a dejarlo como estaba)
  • Mueve scripts al footer para que no bloqueen el renderizado inicial.

Ejemplo en functions.php de tu tema hijo:


// functions.php en tu tema hijo
function move_scripts_footer() {
    if (is_admin()) return;

    remove_action('wp_head', 'wp_print_scripts');
    remove_action('wp_head', 'wp_print_head_scripts', 9);
    add_action('wp_footer', 'wp_print_scripts', 5);
    add_action('wp_footer', 'wp_print_head_scripts', 5);
}
add_action('wp_enqueue_scripts', 'move_scripts_footer', 20);

Optimizar CLS

  • Reserva espacio en CSS para imágenes y banners (usa width y height o aspect-ratio).
  • Evita cargar fuentes de Google sin display=swap.

En tu functions.php del tema hijo añade:


function cargar_fuentes_google() {
  echo '<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>' . "\n";
  wp_enqueue_style(
    'google-fonts-roboto',
    'https://fonts.googleapis.com/css2?family=Roboto&display=swap',
    false
  );
}
add_action('wp_head', 'cargar_fuentes_google', 5);

Cómo detectar scripts innecesarios

  1. Ver código fuente: busca todos los <script src="...js">.
  2. DevTools > Network > JS: revisa el peso y el origen de cada archivo.
  3. Query Monitor plugin (solo para auditar): te lista qué plugin o tema añadió cada script y estilo.

Una vez identifiques un script que no necesitas en todas las páginas, puedes desactivarlo con algo como:


// functions.php en tu tema hijo
function optimizar_scripts() {
    // Quitar Contact Form 7 excepto en su página
    if ( ! is_page('contacto') ) {
        wp_dequeue_script('contact-form-7'); 
        wp_dequeue_style('contact-form-7');
    }
}
add_action('wp_enqueue_scripts', 'optimizar_scripts', 20);

⚠️ Siempre revisa la web después de quitar un script. Si algo deja de funcionar (un slider, un menú, un formulario), vuelve a activarlo: significa que sí era necesario.

Conclusión

Para mejorar los Core Web Vitals, no basta con pegar código: hay que auditar qué se carga y eliminar lo innecesario de forma segura. Hazlo siempre en el functions.php de tu tema hijo, prueba los cambios en un entorno de staging si puedes, y mide después con PageSpeed Insights o Lighthouse para confirmar las mejoras. (si no las notas tampoco te extrañes, el Sr.Google si lo va a notar)

¿A qué esperas?. Ponte Manos a la web para optimizar tu site

Nueva herramienta gratis para analizar la seguridad de tu web contra scraping de IA

Nueva herramienta gratis para analizar la seguridad de tu web contra scraping de IA

¿Tu web está preparada para frenar a los bots de IA?

Hoy en día, los bots de inteligencia artificial están rastreando miles de webs para llevarse contenido y usarlo en el entrenamiento de modelos. Eso significa que tu trabajo, tus textos o tus imágenes pueden acabar en una base de datos sin que te enteres. Para ayudar con este problema, ImmuniWeb ha sacado una herramienta online gratuita que te dice en segundos si tu web está protegida o no frente a estos bots.

¿Qué hace esta herramienta?

El test forma parte de la Community Edition de ImmuniWeb y básicamente revisa dos cosas:

  • Si tienes un WAF (firewall de aplicaciones web) u otro sistema que bloquee accesos no deseados.
  • Si tu archivo robots.txt está configurado para limitar el rastreo de bots (aunque ojo, muchos bots de IA ni lo respetan).

¿Por qué debería importarte?

Porque cada vez más empresas de IA están usando bots para rascar («robar») contenido sin pedir permiso. Y aunque pongas reglas en robots.txt, la mayoría de estos bots las ignoran. Con esta herramienta sabrás si tu web está en bragas o si al menos tienes algunas barreras que les compliquen el trabajo.

De hecho, el propio CEO de ImmuniWeb, Ilia Kolochenko, lo dijo claro: «El scraping para entrenar modelos de IA está creciendo y los creadores de contenido no reciben nada a cambio«.

Los bots más bloqueados

ImmuniWeb también ha publicado un estudio con datos sobre qué bots de IA son los más rechazados en las webs:

  • GPTBot (OpenAI): bloqueado en el 61,7 % de los sitios que aplican restricciones.
  • Claude (Anthropic): 59,3 %.
  • Gemini (Google): 53,1 %.
  • AmazonBot: 45,7 %.

Como ves, cada vez más webs están cerrando la puerta a estos bots.

Cómo probar tu web

  1. Entra en la herramienta online de ImmuniWeb.
  2. Escribe la dirección de tu sitio.
  3. En segundos tendrás un informe que te dice si tu web bloquea (o no) a los bots de IA.

Al finalizar el test, podrás ver los resultados por pantalla y descargarlos en formato PDF. También puedes registrarte de forma gratuita.

Test Immuniweb

 

Conclusión

Si tienes una web y te preocupa que tu contenido acabe alimentando inteligencias artificiales sin que lo sepas, este test gratuito es un buen punto de partida. No te soluciona todo, pero al menos te da una idea clara de qué tan protegido estás y qué podrías mejorar.

No esperes a que otros se lleven tu trabajo, ponte manos a la web y refuerza la seguridad de tu sitio.