Skip to content

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.cnf ni 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ático

cPanel 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ónPrivilegios recomendados
WordPress, Laravel con migraciones, instaladoresTODOS (solo sobre esa base; no afecta otras)
App ya instalada, sin cambios de estructuraSELECT, INSERT, UPDATE, DELETE, LOCK TABLES
Reportes / lecturaSELECT

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 ​

DatoValor típico
Hostlocalhost (la app y MySQL están en el mismo servidor)
Puerto3306
Base de datosmiempresa_tienda (¡con el prefijo!)
Usuariomiempresa_app (¡con el prefijo!)
Contraseñala 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 .sql de 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:

  1. Comprímelo (.sql.gz o .zip): phpMyAdmin acepta comprimidos.
  2. 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
  1. 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();
LocalHostingCuidado con
MySQL 8.xMariaDB 10.xCollation utf8mb4_0900_ai_ci no existe en MariaDB
MySQL 8.xMySQL 5.7CTEs, funciones de ventana, CHECK, collations _0900_
MariaDB (XAMPP)MySQL 8Generalmente sin problemas

2. Exporta sin datos sensibles innecesarios ​

bash
mysqldump --single-transaction --routines --triggers \
  --default-character-set=utf8mb4 \
  -u root -p tienda > tienda.sql

DEFINER 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.sql

Si el hosting usa MariaDB, cambia la collation:

bash
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' tienda_hosting.sql

3. 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ímiteValor comúnSíntoma al rebasarlo
Conexiones simultáneas por usuario (max_user_connections)15–30User has exceeded the 'max_user_connections' resource
Tamaño de base de datos1–3 GB (o "ilimitado" con políticas de uso)Avisos del proveedor
Tiempo de ejecución de consultasPuede haber "query killers" a los 30–60 sConsultas canceladas
CPU / memoria por cuenta (CloudLinux)Según planErrores 503 / 508
Eventos programados, LOAD DATA, SUPERDeshabilitadosErrores 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 mysqldump si 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 ​

  1. Si tu usuario de cPanel es panaderia y creas la base pedidos y el usuario web, ¿qué valores pones en DB_DATABASE y DB_USERNAME?
  2. 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?
  3. Al importar aparece "#1273 - Unknown collation: 'utf8mb4_0900_ai_ci'". ¿Qué indica?
  4. Escribe la lista de pasos para publicar un proyecto Laravel con su base de datos en un hosting cPanel.
Ver solución
  1. DB_DATABASE=panaderia_pedidos y DB_USERNAME=panaderia_web.
  2. Las instrucciones DEFINER=root@localhost de vistas, triggers o procedimientos (o un SET @@GLOBAL...). Quita los DEFINER con el comando sed mostrado en la sección de migración y vuelve a importar.
  3. Que el respaldo viene de MySQL 8 y el hosting usa MariaDB (o MySQL 5.7). Reemplaza la collation por utf8mb4_unicode_ci en el archivo antes de importar.
  4. (a) Revisar versiones local vs hosting. (b) Exportar con mysqldump sin --databases. (c) Limpiar DEFINER y collation si hace falta. (d) Crear BD, usuario y asignar privilegios en cPanel. (e) Importar en phpMyAdmin. (f) Subir el código y configurar .env con nombres con prefijo y host localhost. (g) Verificar que .env no 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 ser localhost.
  • 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 incluyas CREATE DATABASE.
  • Protege tu .env, conoce los límites del plan y guarda respaldos fuera del hosting.

Academia Web — aprende, copia y construye.