# MySQL: instalación y primeros pasos

**Categoría:** Datos y bases de datos · **Nivel:** Inicial · **Lectura:** 13 min
**Publicada:** 2026-07-27 · **Actualizada:** 2026-07-27 · **Autoría:** Underc0de
**Versión HTML (canónica):** https://underc0de.org/guias/bases-de-datos/mysql-instalacion-y-primeros-pasos/

Cómo elegir entre las series LTS e Innovation, instalar en Windows, Linux y macOS, asegurar la instalación, crear tu primera base y usuario, y hacer respaldos.

## Respuesta rápida

Instalar **MySQL** son tres decisiones y un paso obligatorio. Primero, **qué serie**: la **LTS** (por ejemplo 8.4) para aprender y para producción, o la **Innovation** (9.x) si necesitás lo más nuevo. Segundo, **cómo**: instalador gráfico en Windows, paquete nativo en macOS, repositorio APT o YUM en Linux, o Docker. Tercero, y esto no es opcional: ejecutar `mysql_secure_installation`, que pone contraseña a root, elimina cuentas anónimas y borra la base `test`. Y antes de conectar cualquier aplicación, **crear un usuario propio** con permisos solo sobre la base que necesita.

## Qué versión instalar

La primera decisión sorprende a quien viene de otros programas, porque MySQL mantiene **dos líneas de versiones en paralelo**. La documentación oficial lo plantea así: hay que decidir «si instalar desde una serie LTS, como MySQL 8.4, o desde una serie Innovation, como MySQL 9.6», y aclara que «ambas incluyen correcciones de errores, mientras las versiones de innovación incluyen las funciones y los cambios más nuevos».

![Dos decisiones en orden. Primero qué serie: la LTS, como MySQL 8.4, recomendada para aprender y para producción; o la Innovation, como MySQL 9.x, con las funciones más nuevas. Segundo cómo instalarla según el sistema: instalador oficial y MySQL Configurator en Windows, paquete nativo en macOS, repositorio APT en Debian y Ubuntu, repositorio YUM en Red Hat y Oracle Linux, o Docker. Y el tercer paso que no se saltea: ejecutar mysql_secure_installation.](../../assets/img/guias/mysql-instalacion-y-primeros-pasos-rutas.svg)

*Las versiones avanzan seguido. Antes de descargar, confirmá cuál es la LTS vigente en la documentación oficial.*

Sobre el número de versión, la documentación explica el esquema: el primer número es la versión mayor, el segundo es la menor —que **no cambia dentro de una serie LTS pero sí en una Innovation**— y el tercero es la versión dentro de la serie.

> **Para aprender, elegí la LTS:** dos razones prácticas: el comportamiento no cambia entre actualizaciones menores, y el material escrito que vas a encontrar coincide con lo que ves en pantalla. Que exista una versión con número más alto no significa que te convenga.

## Instalación por sistema

La documentación oficial cubre un capítulo entero por plataforma. Estos son los caminos recomendados en cada caso, y en todos conviene descargar desde el sitio oficial de MySQL y no desde repositorios de terceros.

### Windows

Se usa el **instalador oficial**, que descarga y configura todo con interfaz gráfica, y el **MySQL Configurator** para la configuración del servidor. Durante el proceso te va a pedir la contraseña de `root`: anotala en un gestor de contraseñas antes de continuar, porque recuperarla después es bastante más trabajo que guardarla.

### macOS

El camino nativo es el **paquete `.dmg`**, que instala el servidor y agrega un panel de preferencias para arrancarlo y detenerlo. La documentación también cubre la instalación del *launch daemon* para que arranque con el sistema.

### Linux

Acá hay más opciones, y la elección importa. Los **repositorios oficiales de MySQL** —APT para Debian y Ubuntu, YUM para Red Hat y Oracle Linux— son el camino recomendado, porque te dan la versión que elegiste y actualizaciones del propio proyecto. La alternativa son los repositorios nativos de la distribución, que son más cómodos pero suelen traer una versión más vieja o, en algunas distribuciones, MariaDB en lugar de MySQL.

```bash
# Después de agregar el repositorio oficial de MySQL
sudo apt update
sudo apt install mysql-server

# Comprobar que el servicio está corriendo
sudo systemctl status mysql
```

### Docker

La documentación contempla también el despliegue en **contenedores**. Es la vía más cómoda para probar sin tocar el sistema, para tener varias versiones a la vez y para borrar todo sin dejar rastro. La contra es que agrega un concepto más para aprender al mismo tiempo: si nunca usaste contenedores, instalá nativo primero.

## Asegurar la instalación

Este es el paso que la mayoría de los tutoriales omite y el más importante de la guía. MySQL incluye un programa cuyo único trabajo es cerrar los agujeros que deja una instalación recién hecha.

```bash
mysql_secure_installation
```

Se ejecuta **sin argumentos** y hace preguntas. Según la documentación oficial, permite:

- **Poner contraseña a las cuentas `root`.**
- **Quitar las cuentas `root` accesibles desde fuera del equipo local.** Una cuenta administrativa alcanzable por la red es el primer objetivo de cualquier escaneo automatizado.
- **Eliminar las cuentas anónimas.** Existen por compatibilidad histórica y permiten conectarse sin usuario.
- **Borrar la base de datos `test`**, que «por defecto puede ser accedida por todos los usuarios, incluso los anónimos», junto con los privilegios que permiten a cualquiera usar bases cuyo nombre empiece con `test_`.

Además ofrece activar el componente `validate_password`, que comprueba la robustez de las contraseñas que se definan a partir de ese momento. Conviene aceptarlo.

> **Por qué esto no es paranoia:** una instalación de MySQL sin este paso queda con cuentas sin contraseña, acceso anónimo habilitado y una base accesible por cualquiera. Si además el puerto queda expuesto —algo que pasa con una sola regla mal puesta en el firewall o un contenedor publicado sin pensarlo— eso se encuentra en minutos. En el foro de Underc0de hay material sobre cómo se atacan estas instalaciones justamente para entender qué hay que cerrar.

## Conectarse por primera vez

El cliente de línea de comandos se llama `mysql`, y es la forma más directa de comprobar que todo funciona.

```sql
-- Conectarse como root. Pide la contraseña; no la escribas en el comando.
-- mysql -u root -p

-- Ya dentro del cliente, comprobaciones útiles:
SELECT VERSION();          -- qué versión estás corriendo
SHOW DATABASES;            -- qué bases existen
SELECT CURRENT_USER();     -- con qué cuenta estás conectado
EXIT;
```

Un detalle de seguridad que vale como hábito general: **nunca pongas la contraseña en la misma línea del comando**. Escribir `-pMiClave` funciona, y deja la contraseña en el historial del shell y visible en la lista de procesos del sistema. Con `-p` a secas te la pide de forma interactiva.

Si preferís una interfaz gráfica, existe MySQL Workbench, del propio proyecto. Para aprender conviene arrancar por la línea de comandos: es lo que vas a encontrar en cualquier servidor y no esconde lo que está pasando.

## Crear tu base y tu usuario

Con el servidor asegurado, el primer trabajo real. Y acá aparece la decisión que más gente omite: **no uses `root` para tu aplicación**.

```sql
-- 1. Crear la base con codificación moderna y completa
CREATE DATABASE tienda
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_0900_ai_ci;

-- 2. Crear un usuario propio, solo para esta aplicación
CREATE USER 'app_tienda'@'localhost'
  IDENTIFIED BY 'una-contraseña-larga-y-única';

-- 3. Darle permisos únicamente sobre esa base, y solo los que usa
GRANT SELECT, INSERT, UPDATE, DELETE
  ON tienda.* TO 'app_tienda'@'localhost';

FLUSH PRIVILEGES;
```

Tres cosas de ese bloque que valen la explicación:

- **`utf8mb4`, no `utf8`.** El juego de caracteres llamado `utf8` en MySQL es histórico e incompleto: no cubre los caracteres de cuatro bytes, así que los emojis y algunos símbolos se rompen. `utf8mb4` es el UTF-8 completo.
- **`'app_tienda'@'localhost'`.** La segunda parte limita *desde dónde* puede conectarse esa cuenta. Con `localhost`, solo desde la misma máquina. Poner `'%'` permite desde cualquier lugar, y casi nunca es lo que hace falta.
- **Permisos enumerados, no `ALL PRIVILEGES`.** Si la aplicación nunca borra registros, no le des `DELETE`. Es la diferencia entre un incidente acotado y uno total.

## Cargar un esquema y datos

Para practicar necesitás datos, y hay dos caminos. El primero es cargar tu propio esquema desde un archivo:

```bash
mysql -u root -p tienda < esquema.sql
```

El segundo, y el más recomendable para aprender, es usar una **base de muestra** ya poblada. La oficial de MySQL es **Sakila**, que según su documentación fue desarrollada inicialmente por Mike Hillyer del equipo de documentación de MySQL AB, y está pensada para servir como esquema estándar en libros, tutoriales y artículos. Además ilustra características del motor como vistas, procedimientos almacenados y disparadores.

En el foro de Underc0de, *DtxdF* la recomendó en 2021 precisamente por eso: es muy útil cuando estás empezando o cuando necesitás probar el motor sobre una estructura estándar. Con Sakila cargada, las consultas de [la guía de SQL](../introduccion-a-sql-desde-cero/index.md) pasan de leerse a ejecutarse.

## Respaldos y restauración

La herramienta incluida es `mysqldump`, y genera un archivo de texto con las instrucciones necesarias para recrear la base completa.

```bash
# Respaldar una base
mysqldump -u root -p tienda > respaldo-tienda.sql

# Restaurar sobre una base vacía
mysql -u root -p tienda_nueva < respaldo-tienda.sql
```

> **Los dos hábitos que hacen que el respaldo sirva:** el primero: que esté **programado** y no dependa de que alguien se acuerde. El segundo, y el que más se saltea: **probar la restauración**. Un respaldo que nunca se restauró no es un respaldo, es una suposición. Restauralo una vez en una base de prueba y verificá que los datos estén.

## Lo que no hay que hacer nunca

Como este es un portal de una comunidad de seguridad, vale ser explícito. Estas cinco cosas son las que convierten una instalación de práctica en un problema real, y todas se hacen sin mala intención.

- **Exponer el puerto de MySQL a internet.** La base solo tiene que ser alcanzable desde la aplicación que la usa. Si la app está en el mismo servidor, `localhost` alcanza; si no, va detrás de una red privada o un túnel, nunca abierta.
- **Usar `root` desde la aplicación.** Convierte cualquier vulnerabilidad de la app en control total del servidor de base de datos.
- **Conceder `ALL PRIVILEGES` por comodidad.** Enumerar los permisos toma treinta segundos más.
- **Poner la contraseña en el comando o en el repositorio.** Queda en el historial del shell, en la lista de procesos y en el historial de *commits*, que es para siempre. Van en variables de entorno o en un archivo de configuración fuera del control de versiones.
- **Copiar datos de producción a tu máquina para probar.** Es cómodo y es el origen de una cantidad enorme de filtraciones. Si necesitás datos realistas, anonimizalos o generalos.

Y una construcción que merece mención aparte: **concatenar entradas del usuario dentro de una consulta SQL**. Es el origen de la inyección de SQL, la vulnerabilidad más conocida en aplicaciones con base de datos. La defensa no es filtrar caracteres sino usar **consultas preparadas** con parámetros, que separan el código de los datos. Si te interesa entender cómo se explota esto para poder defenderlo, el enfoque metódico y legal está en [fundamentos de hacking ético](../../hacking/fundamentos-hacking-etico/index.md).

## Errores frecuentes

- **Saltear `mysql_secure_installation`.** Deja cuentas sin contraseña, acceso anónimo y la base `test` abierta.
- **Perder la contraseña de `root`.** Se puede recuperar, pero implica reiniciar el servidor en un modo especial. Guardala al instalar.
- **Usar `utf8` en lugar de `utf8mb4`.** Los emojis y algunos símbolos se guardan mal, y arreglarlo después implica convertir tablas.
- **Instalar desde el repositorio de la distribución sin fijarse.** Podés terminar con una versión vieja o con MariaDB creyendo que es MySQL.
- **Crear el usuario con `'%'` como origen.** Habilita la conexión desde cualquier lugar cuando casi siempre alcanza `localhost`.
- **No probar nunca la restauración.** El respaldo se descubre roto justo cuando hace falta.
- **Practicar sobre datos reales.** Cargá Sakila y dejá los datos de personas fuera de tu entorno de práctica.

## Preguntas frecuentes

**¿Qué versión de MySQL conviene instalar?**
La documentación oficial plantea la decisión como una elección entre dos series. La serie LTS, por ejemplo MySQL 8.4, recibe correcciones de errores y su número de versión menor no cambia dentro de la serie. La serie Innovation, por ejemplo MySQL 9.x, también recibe correcciones y además incluye las funciones y los cambios más nuevos. Para aprender y para la mayoría de los proyectos conviene la LTS: hay menos sorpresas y el material escrito coincide con lo que ves. Como las versiones avanzan seguido, conviene confirmar cuál es la LTS vigente antes de descargar.

**¿Qué hace mysql_secure_installation y por qué es obligatorio?**
Es un programa que viene con MySQL y mejora la seguridad de la instalación recién hecha. Según la documentación oficial, permite poner contraseña a las cuentas root, quitar las cuentas root accesibles desde fuera del equipo local, eliminar las cuentas anónimas y borrar la base de datos test, que por defecto puede ser accedida por cualquier usuario, incluso los anónimos. Se ejecuta sin argumentos. No es opcional en la práctica: una instalación sin este paso queda con cuentas sin contraseña y accesibles, y es exactamente lo que buscan los escaneos automatizados.

**¿Puedo usar la cuenta root para mi aplicación?**
Podés y no deberías. La cuenta root tiene permisos sobre todo el servidor, así que si la aplicación se ve comprometida, quien entre puede leer, modificar y borrar cualquier base, además de crear usuarios. Lo correcto es crear un usuario por aplicación y darle permisos únicamente sobre la base que necesita, y solo los que necesita. Es una diferencia de dos líneas al instalar y cambia por completo el alcance de un incidente.

**¿Cómo hago un respaldo de mi base?**
Con la herramienta mysqldump, que viene incluida y genera un archivo de texto con las instrucciones necesarias para recrear la base completa. Se restaura redirigiendo ese archivo al cliente mysql. Lo importante no es el comando sino dos hábitos: que el respaldo esté programado y no dependa de que alguien se acuerde, y que se pruebe la restauración. Un respaldo que nunca se restauró es una suposición, no un respaldo.

**¿Conviene instalar MySQL o usar Docker?**
Para aprender, cualquiera de las dos sirve, y la documentación oficial contempla ambas. La instalación nativa deja el servicio corriendo en tu sistema y es lo más parecido a un servidor real. Docker no toca tu sistema, permite tener varias versiones a la vez y se borra sin dejar rastro, lo que es cómodo para probar. La contra de Docker es que agrega un concepto más para aprender al mismo tiempo. Si nunca usaste contenedores, instalá nativo primero.

**¿Qué diferencia hay entre MySQL y MariaDB?**
MariaDB nació como una bifurcación de MySQL cuando Oracle adquirió la empresa que lo desarrollaba, y durante años fueron casi intercambiables. Con el tiempo se separaron: hoy tienen funciones propias y diferencias de comportamiento, aunque el SQL básico funciona igual en las dos. Para aprender no importa cuál elijas. Para un proyecto conviene decidirlo temprano y no asumir que se puede cambiar de una a otra sin trabajo.

## Fuentes

Documentación oficial y material de la comunidad consultados para esta guía. Fecha de consulta: 27 de julio de 2026.

1. **MySQL.** [Which MySQL Version and Distribution to Install](https://dev.mysql.com/doc/refman/8.4/en/which-version.html). La elección entre series LTS e Innovation y el esquema de numeración de versiones.
2. **MySQL.** [mysql_secure_installation](https://dev.mysql.com/doc/refman/8.4/en/mysql-secure-installation.html). Las cuatro acciones que realiza, el componente `validate_password` y su uso sin argumentos.
3. **MySQL.** [Installing MySQL](https://dev.mysql.com/doc/refman/8.4/en/installing.html). Capítulos por plataforma: Windows con instalador y Configurator, macOS con paquetes nativos, Linux con repositorios APT y YUM, y despliegue con Docker.
4. **MySQL.** [Sakila Sample Database](https://dev.mysql.com/doc/sakila/en/). Origen, propósito y características del motor que ilustra.
5. **Underc0de, foro.** [«MySQL: Base de datos de muestra para practicar»](https://underc0de.org/foro/base-de-datos/mysql-base-de-datos-de-muestra-para-practicar/), por *DtxdF*, 26 de mayo de 2021, sección Base de Datos.
6. **Underc0de, foro.** [«Curso Aprende MySQL sin dolor de Cabeza»](https://underc0de.org/foro/base-de-datos/curso-aprende-mysql-sin-dolor-de-cabeza/), por *Mr.Kratos*, 30 de julio de 2018, sección Base de Datos. Material formativo compartido por la comunidad.

## Guías relacionadas

- [Cómo diseñar una base de datos sencilla](../como-disenar-una-base-de-datos-sencilla/index.md) — el paso anterior de la ruta.
- [Introducción a SQL desde cero](../introduccion-a-sql-desde-cero/index.md) — para ejecutar consultas sobre lo que instalaste.
- [Base de datos relacional vs no relacional](../relacional-vs-no-relacional/index.md)
- [Fundamentos de hacking ético](../../hacking/fundamentos-hacking-etico/index.md) — para el lado defensivo.
- [Guías de Datos y bases de datos](../index.md)

---

Esta guía forma parte de un proyecto de la comunidad Underc0de para organizar conocimiento técnico en español. Fuente canónica: https://underc0de.org/guias/bases-de-datos/mysql-instalacion-y-primeros-pasos/
