[{"data":1,"prerenderedAt":151},["ShallowReactive",2],{"seo-verification":3,"blog-alojar-mysql-en-un-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-alojar-mysql-en-un-vps-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":95,"ctaBody":96,"ctaButton":97,"ctaUrl":98,"relatedPosts":99},57,"alojar-mysql-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"heberger-mysql-vps","hosting-mysql-on-a-vps","استضافة-mysql-على-خادم-vps","Alojar MySQL en un VPS: guía completa","Instale MySQL 8.4 LTS en un VPS: requisitos, seguridad, rendimiento InnoDB, acceso remoto seguro, copias de seguridad automatizadas y resolución de errores.",9,0,false,"2026-04-24T00:00:00+00:00","2026-09-17T14:09:38+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},6,"Bases de datos","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-mysql-vps-poster.svg",{"categorySlug":34,"appSlug":35},"bases-de-datos","mysql-stack","MySQL hace funcionar una inmensa parte de la web: WordPress, Magento, Laravel y miles de aplicaciones PHP. Autoalojarlo en un VPS le ofrece un rendimiento dedicado, un control completo de la configuración de InnoDB y unos costes controlados, lejos de los límites de los alojamientos compartidos.",[38,42,52,55,77,80,83,86,89,92],{"type":39,"title":40,"body":41},"h2","Por qué autoalojar MySQL en un VPS","En un alojamiento compartido, su base MySQL comparte la RAM y la I\u002FO con cientos de otros sitios, y usted no puede modificar ni `innodb_buffer_pool_size`, ni los modos SQL, ni la versión del motor. En un VPS dispone de recursos dedicados, elige entre MySQL 8.4 LTS y MariaDB, y accede al archivo `my.cnf` para optimizar cada parámetro. Es la opción adecuada para una tienda de comercio electrónico, un CMS con mucho tráfico o una API que necesita transacciones rápidas y un buffer pool generoso. También gestiona sus propios usuarios, sus grants a nivel de tabla y su estrategia de replicación maestro-esclavo.",{"type":43,"title":44,"items":45},"ul","Los beneficios concretos de un MySQL autoalojado",[46,47,48,49,50,51],"Recursos dedicados: todo el buffer pool de InnoDB para sus datos, sin vecinos ruidosos.","Acceso completo a `my.cnf`: `innodb_buffer_pool_size`, `max_connections`, modos SQL estrictos.","Elección del motor: MySQL 8.4 LTS para la estabilidad a largo plazo, o MariaDB por sus motores adicionales.","Replicación maestro-esclavo configurable para derivar las lecturas o para la recuperación ante incidentes.","Copias de seguridad lógicas (`mysqldump`) o físicas (`xtrabackup`) según su volumen.","Sin cuota arbitraria sobre el tamaño de las bases de datos ni sobre el número de conexiones simultáneas.",{"type":39,"title":53,"body":54},"Requisitos concretos antes de empezar","**Versión recomendada:** MySQL 8.4 LTS (versión actual: 8.4.11), la rama LTS oficial, con soporte hasta 2032. Evite MySQL 8.0 en instalaciones nuevas: el soporte activo termina en 2025.\n\n**RAM:** 1 GB como mínimo para un entorno de prueba o un blog ligero. Planifique **2 GB** para un WordPress o una pequeña aplicación en producción, y **4 a 8 GB** para Magento, PrestaShop o una API de alto tráfico. La regla base: asigne el 60-70% de la RAM disponible a `innodb_buffer_pool_size`.\n\n**CPU:** 2 vCPU cubren la mayoría de los casos. Escale a 4 vCPU cuando las consultas sean frecuentes o active la replicación.\n\n**Almacenamiento:** 30 GB de SSD NVMe como punto de partida; reserve espacio adicional para los binlogs si activa la replicación o la restauración point-in-time.\n\n**Puertos:** MySQL escucha por defecto en el puerto **3306**. Este puerto **nunca** debe estar abierto en la interfaz pública. El parámetro `bind-address` en `my.cnf` debe apuntar a `127.0.0.1` o a la dirección de red privada, no a `0.0.0.0`.\n\n**Sistema:** Ubuntu 22.04 o 24.04 LTS, Docker y Docker Compose v2, un volumen persistente dedicado.",{"type":56,"title":57,"steps":58},"steps","Desplegar MySQL 8.4 con Docker en producción",[59,62,65,68,71,74],{"title":60,"body":61},"Asegurar el VPS","Actualice el sistema (`apt update && apt upgrade -y`), instale Docker, desactive la conexión SSH por contraseña en favor de las claves (`PasswordAuthentication no` en `sshd_config`) y cierre el puerto 3306 hacia el exterior:\n```bash\nufw deny 3306\nufw allow OpenSSH\nufw enable\n```\nMySQL solo debe escuchar en la red interna del contenedor Docker.",{"title":63,"body":64},"Definir el docker-compose.yml","Declare un servicio `mysql:8.4`, monte un volumen en `\u002Fvar\u002Flib\u002Fmysql` y pase las variables de entorno mediante un archivo `.env`:\n```bash\n# .env\nMYSQL_ROOT_PASSWORD=contraseña_root_fuerte\nMYSQL_DATABASE=mi_base\nMYSQL_USER=app_user\nMYSQL_PASSWORD=contraseña_app\n```\n```bash\n# docker-compose.yml\nservices:\n  mysql:\n    image: mysql:8.4\n    restart: unless-stopped\n    env_file: .env\n    volumes:\n      - mysql_data:\u002Fvar\u002Flib\u002Fmysql\n      - .\u002Fconf.d:\u002Fetc\u002Fmysql\u002Fconf.d:ro\n    ports:\n      - \"127.0.0.1:3306:3306\"\nvolumes:\n  mysql_data:\n```\nNótese el bind en `127.0.0.1` en `ports`: el puerto solo será accesible desde el propio VPS.",{"title":66,"body":67},"Crear una base de datos y un usuario dedicado","Tras `docker compose up -d`, conéctese al contenedor:\n```bash\ndocker exec -it mysql mysql -u root -p\n```\nCree la base de datos y el usuario de aplicación:\n```bash\nCREATE DATABASE mi_base CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nCREATE USER 'app_user'@'%' IDENTIFIED BY 'contraseña_app';\nGRANT SELECT, INSERT, UPDATE, DELETE ON mi_base.* TO 'app_user'@'%';\nFLUSH PRIVILEGES;\n```\nLimite los grants al mínimo necesario: nunca use `GRANT ALL PRIVILEGES` para una cuenta de aplicación.",{"title":69,"body":70},"Endurecer la instalación","Ejecute el equivalente de `mysql_secure_installation` manualmente:\n```bash\n-- Eliminar usuarios anónimos\nDELETE FROM mysql.user WHERE User='';\n-- Prohibir el inicio de sesión root remoto\nDELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');\n-- Eliminar la base de datos de prueba\nDROP DATABASE IF EXISTS test;\nFLUSH PRIVILEGES;\n```\nNo utilice nunca la cuenta `root` desde su aplicación. Verifique que `bind-address = 127.0.0.1` esté presente en su `conf.d\u002Fcustom.cnf`.",{"title":72,"body":73},"Exponer en TLS si es necesario","Si una aplicación externa debe conectarse de forma remota, nunca exponga el puerto 3306 directamente en Internet. Utilice un **túnel SSH**:\n```bash\nssh -L 3306:127.0.0.1:3306 user@su-vps.com -N\n```\nConecte su cliente MySQL a `127.0.0.1:3306` — el tráfico viaja cifrado por SSH. Para conexiones permanentes entre VPS, configure MySQL para escuchar solo en la interfaz de red privada y permita solo la IP del servidor de aplicación en UFW.",{"title":75,"body":76},"Planificar las copias de seguridad","Programe un `mysqldump --single-transaction` diario mediante cron para obtener dumps coherentes sin bloqueo:\n```bash\n# \u002Fetc\u002Fcron.d\u002Fmysql-backup\n0 2 * * * root docker exec mysql mysqldump -u root -p\"${MYSQL_ROOT_PASSWORD}\" --single-transaction --all-databases | gzip > \u002Fbackups\u002Fmysql-$(date +\\%Y\\%m\\%d).sql.gz\n```\nConserve al menos 7 días de retención y **archive los dumps fuera del VPS**. Pruebe la restauración una vez al mes: un backup no probado no es un backup. Para bases de datos grandes, pase a Percona XtraBackup.",{"type":39,"title":78,"body":79},"Seguridad: los gestos imprescindibles","**`mysql_secure_installation` en un contenedor.** La imagen Docker oficial no lo ejecuta automáticamente: hágalo manualmente tras el primer arranque (paso 4 anterior).\n\n**Eliminación del root remoto.** La cuenta `root` solo debe ser accesible desde `localhost`. Una cuenta root accesible desde `%` es la primera vulnerabilidad explotada durante un escaneo de puertos.\n\n**Usuario dedicado por aplicación.** Cada aplicación conectada recibe su propia cuenta MySQL con derechos restringidos a su propia base de datos. Una aplicación comprometida no podrá leer ni modificar los datos de las demás.\n\n**UFW + bind-address.** La doble protección es obligatoria: `ufw deny 3306` a nivel del firewall del sistema, y `bind-address = 127.0.0.1` en `my.cnf` del lado de MySQL. Uno no sustituye al otro.\n\n**Contraseñas fuertes.** Use `caching_sha2_password` (plugin por defecto en MySQL 8.x) y contraseñas generadas (mínimo 20 caracteres). Guárdelas en secretos gestionados, nunca en el código fuente.",{"type":39,"title":81,"body":82},"Optimizar el rendimiento de InnoDB","Estos parámetros se añaden en su archivo `conf.d\u002Fcustom.cnf` montado en solo lectura en el contenedor.\n\n**`innodb_buffer_pool_size`**: el parámetro más importante. Configúrelo al 60-70% de la RAM del VPS. En un VPS de 4 GB, eso supone entre 2,5 y 2,8 GB. Demasiado pequeño = lecturas de disco frecuentes; demasiado grande = swap.\n\n**`innodb_flush_log_at_trx_commit`**: el valor `2` ofrece un buen equilibrio rendimiento\u002Fdurabilidad para la mayoría de aplicaciones. El valor `1` (por defecto) es más seguro pero más lento; el `0` es el más rápido pero arriesgado en caso de fallo.\n\n**`max_connections`**: ajústelo según su carga real. El valor por defecto (151) suele ser demasiado bajo para una aplicación de alto tráfico. Cada conexión consume ~1 MB de RAM.\n\n**`slow_query_log`**: actívelo con `slow_query_log = 1` y `long_query_time = 1` para capturar todas las consultas que superen 1 segundo. Es su primera herramienta de optimización.\n\nEjemplo de `custom.cnf` para un VPS de 4 GB:\n```bash\n[mysqld]\ninnodb_buffer_pool_size = 2G\ninnodb_flush_log_at_trx_commit = 2\nmax_connections = 200\nslow_query_log = 1\nlong_query_time = 1\nlog_bin = \u002Fvar\u002Flib\u002Fmysql\u002Fbinlog\nbinlog_format = ROW\n```",{"type":39,"title":84,"body":85},"Acceso remoto seguro: el túnel SSH","Exponer el puerto 3306 en la interfaz pública de su VPS es un grave error de seguridad: los escáneres automáticos intentan ataques de fuerza bruta sobre este puerto continuamente. La buena práctica es el túnel SSH.\n\n**Conexión puntual desde su equipo:**\n```bash\nssh -L 3306:127.0.0.1:3306 user@su-vps.com -N\n```\nAbra su cliente MySQL sobre `127.0.0.1:3306` — el tráfico viaja cifrado por SSH.\n\n**Conexión permanente entre VPS:** si su aplicación corre en un segundo VPS de la misma red privada, configure MySQL para escuchar solo en la dirección de red privada (`bind-address = 10.0.0.X`) y permita solo la IP del servidor de aplicación en UFW:\n```bash\nufw allow from 10.0.0.5 to any port 3306\n```\n\n**A evitar:** `bind-address = 0.0.0.0` sin firewall, puerto 3306 abierto públicamente, o cuentas MySQL con `Host='%'` sin restricción de IP.",{"type":39,"title":87,"body":88},"Copias de seguridad automatizadas: estrategia completa","Una estrategia de copia de seguridad MySQL se apoya en dos niveles complementarios.\n\n**Nivel 1 — dump lógico diario (`mysqldump`):** consistente gracias a `--single-transaction` (sin bloqueo de lectura en InnoDB), portable entre versiones. Adecuado para bases de hasta unas decenas de GB.\n\n**Nivel 2 — binlogs para restauración point-in-time:** active `log_bin` desde el principio. Combinados con un dump completo semanal, los binlogs permiten reproducir cada transacción hasta el segundo anterior a un incidente.\n\n**Para bases grandes — Percona XtraBackup:** copia de seguridad física sin interrumpir el servicio, restauración rápida (copia de archivos en lugar de re-ejecución SQL).\n\n**Retención y archivado:** no almacene las copias de seguridad únicamente en el VPS. Un VPS corrupto se lleva sus propios backups. Exporte a almacenamiento de objetos o a un servidor SFTP remoto, y conserve al menos 7 días.\n\n**Probar la restauración:** un backup no probado no es un backup. Planifique una prueba mensual: restaure en un contenedor temporal y verifique que sus datos están intactos.\n\n```bash\n# Restauración desde un dump comprimido\nzcat \u002Fbackups\u002Fmysql-20260917.sql.gz | docker exec -i mysql mysql -u root -p\n```",{"type":39,"title":90,"body":91},"Resolución de errores: 5 errores frecuentes","**`Access denied for user 'app'@'...'`**\nLa cuenta existe pero el `Host` no coincide. MySQL verifica la IP de origen exacta. Si la aplicación se conecta desde un contenedor Docker, la IP de origen puede ser `172.17.0.x` y no `localhost`. Compruebe con:\n```bash\nSELECT User, Host FROM mysql.user;\n```\nSolución: cree la cuenta con `'app_user'@'%'` (o la IP exacta del contenedor) y ejecute `FLUSH PRIVILEGES`.\n\n**`Too many connections`**\nSe ha alcanzado `max_connections`. Compruebe el número de conexiones activas:\n```bash\nSHOW STATUS LIKE 'Threads_connected';\n```\nAumente `max_connections` en `custom.cnf` **y** verifique que su aplicación usa un pool de conexiones.\n\n**`Table '...' is marked as crashed`**\nCorrupción de InnoDB, a menudo tras un cierre brusco. Intente la reparación:\n```bash\nmysqlcheck -u root -p --auto-repair --all-databases\n```\nSi la tabla no puede repararse, restaure desde su último backup consistente.\n\n**`Can't connect to MySQL server on '127.0.0.1' (111)`**\nMySQL no está escuchando en la interfaz esperada. Compruebe `bind-address` en `custom.cnf` y reinicie el contenedor. Verifique también que el contenedor está en marcha con `docker compose ps`.\n\n**`ERROR 1819 (HY000): Your password does not satisfy the current policy`**\nEl plugin de validación de contraseñas de MySQL 8 rechaza las contraseñas simples. Use una contraseña de al menos 8 caracteres con mayúsculas, dígitos y símbolos, o establezca `validate_password.policy = LOW` en `custom.cnf` solo para entornos de desarrollo.",{"type":93,"body":94},"tip","Active los binlogs (`log_bin` + `binlog_format=ROW`) desde el principio: son la clave de la restauración point-in-time. Combinados con un `mysqldump` completo semanal, permiten reproducir todas las transacciones hasta el segundo anterior a un incidente. Y si monta un esclavo en replicación en un segundo VPS, esos mismos binlogs alimentan la réplica en tiempo real para sus lecturas derivadas.","Aloje su MySQL en un VPS de alto rendimiento","El VPS Cloud de ServOrbit con plantilla Docker lista para usar le ofrece SSD y recursos garantizados para ejecutar MySQL sin concesiones.","Lanzar mi VPS Cloud","\u002Fmarketplace\u002Fbases-de-datos\u002Fmysql-stack",[100,118,136],{"id":101,"slug":102,"slugs":103,"title":107,"excerpt":108,"readTime":109,"views":18,"isPinned":19,"publishedAt":110,"updatedAt":111,"category":112,"categories":113,"featuredImage":30,"bgImage":31,"posterImage":115,"relatedSolution":116},56,"alojar-postgresql-en-un-vps",{"fr":104,"en":105,"ar":106,"es":102},"heberger-postgresql-vps","postgresql-on-a-vps-a-reliable-and-controlled-database","postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها","PostgreSQL en VPS: base de datos fiable y controlada","Aloje PostgreSQL en un VPS: volúmenes, copias de seguridad, acceso de red restringido y configuración sólida para sus aplicaciones.",4,"2026-04-25T00:00:00+00:00","2026-09-08T22:00:02+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[114],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":34,"appSlug":117},"postgresql-stack",{"id":119,"slug":120,"slugs":121,"title":125,"excerpt":126,"readTime":127,"views":18,"isPinned":19,"publishedAt":128,"updatedAt":129,"category":130,"categories":131,"featuredImage":30,"bgImage":31,"posterImage":133,"relatedSolution":134},58,"alojar-redis-en-un-vps",{"fr":122,"en":123,"ar":124,"es":120},"heberger-redis-vps","hosting-redis-on-a-vps","استضافة-redis-على-خادم-vps","Alojar Redis en un VPS: la guía completa","Despliegue Redis en su VPS Cloud: requisitos de RAM\u002FCPU, seguridad (ACL, TLS), persistencia RDB\u002FAOF, resolución de errores y alta disponibilidad.",10,"2026-04-23T00:00:00+00:00","2026-09-08T21:59:59+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[132],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-redis-vps-poster.svg",{"categorySlug":34,"appSlug":135},"redis-stack",{"id":137,"slug":138,"slugs":139,"title":143,"excerpt":144,"readTime":145,"views":18,"isPinned":19,"publishedAt":146,"updatedAt":111,"category":147,"categories":148,"featuredImage":30,"bgImage":31,"posterImage":150,"relatedSolution":30},59,"alojar-mongodb-en-un-vps",{"fr":140,"en":141,"ar":142,"es":138},"heberger-mongodb-vps","hosting-mongodb-on-a-vps","استضافة-mongodb-على-خادم-vps","Alojar MongoDB en un VPS","Aloje MongoDB en su VPS Cloud: despliegue Docker, replica set, autenticación, indexación y copias de seguridad controladas.",3,"2026-04-22T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[149],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-mongodb-vps-poster.svg",1789665002669]