Tema
MySQL en hosting compartido
Muchos clientes pequeños (negocios locales, profesionistas, tiendas que empiezan) contratan un hosting compartido con cPanel: es barato y trae todo listo. Ahí no tienes acceso root ni terminal completa, pero sí puedes crear bases de datos, usuarios y administrar todo desde el panel. En esta lección aprenderás el flujo completo: crear la BD, asignar el usuario, usar phpMyAdmin, permitir acceso remoto, migrar tu base local al hosting y configurar tu aplicación.
Concepto
Un hosting compartido es como rentar un departamento en un edificio: compartes el servidor (el edificio) con cientos de clientes, el administrador (el proveedor) controla la instalación, y tú solo tienes llave de tu departamento. Por eso:
- No puedes cambiar
my.cnfni reiniciar MySQL. - No tienes privilegios globales (
SUPER,FILE, crear usuarios con SQL). - Todo se hace desde cPanel (o Plesk, DirectAdmin, hPanel de Hostinger...).
- Hay límites de recursos: conexiones simultáneas, tamaño de BD, tiempo de ejecución.
Paso a paso: crear la base de datos en cPanel
En cPanel, sección Bases de datos → Bases de datos MySQL® (o el Asistente de bases de datos MySQL®, que guía los tres pasos).
1. Crear la base de datos
txt
Crear nueva base de datos
Nueva base de datos: [ cpusuario_ ][ tienda ] [Crear base de datos]
↑ prefijo automáticocPanel antepone tu usuario de cPanel y un guion bajo: si tu usuario es miempresa, la base se llamará miempresa_tienda.
2. Crear el usuario de MySQL
txt
Agregar nuevo usuario
Nombre de usuario: [ miempresa_ ][ app ]
Contraseña: [ ••••••••••••••••••• ] [Generador de contraseñas]
[Crear usuario]Resultado: usuario miempresa_app. Usa el generador de contraseñas y guárdala en tu gestor.
Longitud de nombres
Algunos cPanel limitan el nombre total (prefijo + nombre) a 16 caracteres para usuarios en MySQL antiguos, o 64 en versiones recientes. Si te marca error, acorta el nombre.
3. Asignar el usuario a la base de datos
txt
Agregar usuario a la base de datos
Usuario: [ miempresa_app ▼ ]
Base de datos: [ miempresa_tienda ▼ ] [Agregar]En la siguiente pantalla eliges los privilegios:
txt
☑ TODOS LOS PRIVILEGIOS
───────────────────────
☑ SELECT ☑ INSERT ☑ UPDATE ☑ DELETE
☑ CREATE ☑ ALTER ☑ DROP ☑ INDEX
☑ CREATE TEMPORARY TABLES ☑ LOCK TABLES
☑ REFERENCES ☑ CREATE VIEW ☑ SHOW VIEW ☑ TRIGGER
☑ CREATE ROUTINE ☑ ALTER ROUTINE ☑ EXECUTE ☑ EVENT| Situación | Privilegios recomendados |
|---|---|
| WordPress, Laravel con migraciones, instaladores | TODOS (solo sobre esa base; no afecta otras) |
| App ya instalada, sin cambios de estructura | SELECT, INSERT, UPDATE, DELETE, LOCK TABLES |
| Reportes / lectura | SELECT |
Buena práctica
Crea una base y un usuario por proyecto (miempresa_tienda + miempresa_tiendaapp, miempresa_blog + miempresa_blogapp). Si un sitio es vulnerado, el atacante no alcanza las bases de los demás.
Datos de conexión en hosting
| Dato | Valor típico |
|---|---|
| Host | localhost (la app y MySQL están en el mismo servidor) |
| Puerto | 3306 |
| Base de datos | miempresa_tienda (¡con el prefijo!) |
| Usuario | miempresa_app (¡con el prefijo!) |
| Contraseña | la que generaste |
Error común
Configurar la app con tienda y app, sin el prefijo. Resultado: Access denied for user 'app'@'localhost' o Unknown database 'tienda'. Copia los nombres completos desde cPanel.
Algunos proveedores (Hostinger, GoDaddy en ciertos planes) usan un host distinto a localhost, como mysql.tudominio.com o una IP. Aparece en el panel junto a la base de datos.
phpMyAdmin en el hosting
cPanel → phpMyAdmin. Entra automáticamente con tu usuario de cPanel y ves todas tus bases.
Tareas frecuentes:
- Importar el
.sqlde tu proyecto (pestaña Importar). Límite habitual: 50–512 MB según el proveedor. - Exportar un respaldo rápido antes de cambios importantes.
- Pestaña SQL para consultas puntuales.
- Operaciones → Cotejamiento para cambiar la collation de una tabla.
Si el archivo es demasiado grande para phpMyAdmin:
- Comprímelo (
.sql.gzo.zip): phpMyAdmin acepta comprimidos. - Si tienes Terminal en cPanel (o SSH), súbelo con el Administrador de archivos y ejecuta:
bash
mysql -u miempresa_app -p miempresa_tienda < tienda.sql- Divídelo en partes con herramientas como BigDump (script PHP que importa por partes; bórralo al terminar).
Acceso remoto (Remote MySQL)
Por defecto, solo las apps del propio servidor pueden conectarse. Para conectarte desde DBeaver/Workbench en tu PC, o desde otro servidor:
cPanel → Bases de datos → MySQL® remoto → Agregar host de acceso:
txt
Host (se permite % como comodín): [ 189.203.45.67 ] ← tu IP pública
Comentario: [ Oficina Erick ]
[Agregar host]- Averigua tu IP pública buscando "cuál es mi IP".
- Si tu IP cambia (internet doméstico), tendrás que actualizarla. Evita poner
%(cualquier IP). - Conecta tu cliente con el dominio o IP del servidor como host, puerto 3306.
- Muchos proveedores bloquean el 3306 en su firewall aunque lo agregues; si tienes SSH, usa un túnel SSH.
No dejes accesos remotos abiertos
Cuando termines de trabajar desde una red pública (café, coworking), elimina esa IP de la lista de MySQL remoto.
Migrar tu base de datos local al hosting
Flujo completo para publicar un proyecto que desarrollaste con MySQL local:
txt
Tu PC (XAMPP/Docker) Hosting (cPanel)
┌──────────────────┐ 1. exportar ┌───────────────────────────┐
│ tienda │ ──────────────► │ tienda.sql.gz │
│ (MySQL 8.4) │ │ │
└──────────────────┘ 2. crear BD + usuario en cPanel │
3. importar en phpMyAdmin │
4. configurar .env / wp-config.php │
5. probar │
└───────────────────────────┘1. Revisa la compatibilidad
sql
-- En tu PC y en el hosting (phpMyAdmin → SQL):
SELECT VERSION();| Local | Hosting | Cuidado con |
|---|---|---|
| MySQL 8.x | MariaDB 10.x | Collation utf8mb4_0900_ai_ci no existe en MariaDB |
| MySQL 8.x | MySQL 5.7 | CTEs, funciones de ventana, CHECK, collations _0900_ |
| MariaDB (XAMPP) | MySQL 8 | Generalmente sin problemas |
2. Exporta sin datos sensibles innecesarios
bash
mysqldump --single-transaction --routines --triggers \
--default-character-set=utf8mb4 \
-u root -p tienda > tienda.sqlDEFINER en vistas, triggers y procedimientos
El respaldo incluye cosas como DEFINER=root@localhost. En el hosting no existe root, y la importación falla con "Access denied; you need (at least one of) the SUPER privilege(s)". Elimina los DEFINER antes de importar:
bash
sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' tienda.sql > tienda_hosting.sqlSi el hosting usa MariaDB, cambia la collation:
bash
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' tienda_hosting.sql3. Crea BD y usuario en cPanel e importa
Sigue los pasos de arriba, e importa tienda_hosting.sql desde phpMyAdmin seleccionando primero la base miempresa_tienda en el panel izquierdo.
El respaldo no debe crear la base
Si exportaste con --databases tienda, el archivo contiene CREATE DATABASE tienda; USE tienda; y fallará (no tienes permiso para crear bases con SQL, y el nombre no lleva prefijo). Exporta sin --databases o borra esas dos líneas.
4. Configura tu aplicación
env
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=miempresa_tienda
DB_USERNAME=miempresa_app
DB_PASSWORD="la-contraseña-generada"php
<?php
define( 'DB_NAME', 'miempresa_tienda' );
define( 'DB_USER', 'miempresa_app' );
define( 'DB_PASSWORD', 'la-contraseña-generada' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );php
<?php
return [
'db_host' => 'localhost',
'db_name' => 'miempresa_tienda',
'db_user' => 'miempresa_app',
'db_pass' => 'la-contraseña-generada',
];Protege tus credenciales
El archivo .env debe estar fuera de la carpeta pública (public_html) o bloqueado por el servidor. Comprueba que https://tusitio.com/.env devuelva 403 o 404. Si muestra tus contraseñas, cualquiera puede leerlas.
5. Migrar WordPress: URLs
WordPress guarda la URL del sitio en la BD (http://localhost/tienda). Tras importar, actualízala:
sql
UPDATE wp_options SET option_value = 'https://tusitio.com'
WHERE option_name IN ('siteurl', 'home');Para reemplazar la URL en el contenido usa WP-CLI (wp search-replace 'http://localhost/tienda' 'https://tusitio.com') o un plugin de migración, porque WordPress guarda datos serializados que un REPLACE de SQL puede corromper.
Límites típicos del hosting compartido
| Límite | Valor común | Síntoma al rebasarlo |
|---|---|---|
Conexiones simultáneas por usuario (max_user_connections) | 15–30 | User has exceeded the 'max_user_connections' resource |
| Tamaño de base de datos | 1–3 GB (o "ilimitado" con políticas de uso) | Avisos del proveedor |
| Tiempo de ejecución de consultas | Puede haber "query killers" a los 30–60 s | Consultas canceladas |
| CPU / memoria por cuenta (CloudLinux) | Según plan | Errores 503 / 508 |
Eventos programados, LOAD DATA, SUPER | Deshabilitados | Errores de permisos |
Cuando un proyecto supera estos límites con regularidad, es momento de recomendar al cliente un VPS o una base de datos administrada.
Respaldos en hosting
- cPanel → Copia de seguridad → descargar respaldo de una base de datos MySQL (
.sql.gz). - Muchos hostings incluyen JetBackup con restauración por fecha.
- Con Cron Jobs de cPanel puedes programar
mysqldumpsi el plan lo permite:
bash
/usr/bin/mysqldump --single-transaction -u miempresa_app -p'CLAVE' miempresa_tienda | gzip > /home/miempresa/respaldos/tienda_$(date +\%F).sql.gz(En cron, los % deben escaparse como \%.) Aun así, descarga copias periódicas fuera del hosting: si el proveedor tiene un problema, tus respaldos también podrían perderse.
Ejercicios
- Si tu usuario de cPanel es
panaderiay creas la basepedidosy el usuarioweb, ¿qué valores pones enDB_DATABASEyDB_USERNAME? - Al importar en el hosting aparece: "#1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation". ¿Qué lo causa y cómo lo arreglas?
- Al importar aparece "#1273 - Unknown collation: 'utf8mb4_0900_ai_ci'". ¿Qué indica?
- Escribe la lista de pasos para publicar un proyecto Laravel con su base de datos en un hosting cPanel.
Ver solución
DB_DATABASE=panaderia_pedidosyDB_USERNAME=panaderia_web.- Las instrucciones
DEFINER=root@localhostde vistas, triggers o procedimientos (o unSET @@GLOBAL...). Quita losDEFINERcon el comandosedmostrado en la sección de migración y vuelve a importar. - Que el respaldo viene de MySQL 8 y el hosting usa MariaDB (o MySQL 5.7). Reemplaza la collation por
utf8mb4_unicode_cien el archivo antes de importar. - (a) Revisar versiones local vs hosting. (b) Exportar con
mysqldumpsin--databases. (c) LimpiarDEFINERy collation si hace falta. (d) Crear BD, usuario y asignar privilegios en cPanel. (e) Importar en phpMyAdmin. (f) Subir el código y configurar.envcon nombres con prefijo y hostlocalhost. (g) Verificar que.envno sea accesible públicamente. (h) Probar el sitio y programar respaldos.
Resumen
- En hosting compartido todo se hace desde cPanel: crear BD, crear usuario y asignarlo con privilegios.
- Los nombres llevan el prefijo de tu cuenta (
miempresa_tienda); el host suele serlocalhost. - Para conectarte desde fuera usa MySQL remoto con tu IP específica (o un túnel SSH).
- Al migrar: compara versiones, quita
DEFINER, ajusta collations y no incluyasCREATE DATABASE. - Protege tu
.env, conoce los límites del plan y guarda respaldos fuera del hosting.