Tema
Instalación
Hay muchas formas de tener MySQL funcionando y cada una encaja en una situación distinta. En esta lección instalarás MySQL en Windows (instalador oficial y XAMPP), Ubuntu/Linux, macOS y con Docker, y aprenderás a verificar que todo funciona.
Concepto: ¿qué opción elijo?
| Opción | Ideal para | Ventajas | Desventajas |
|---|---|---|---|
| XAMPP (Windows/macOS) | Empezar con PHP rápido | Apache + PHP + MariaDB + phpMyAdmin en un clic | Trae MariaDB, versiones a veces viejas, root sin contraseña |
| Instalador oficial (Windows) | Desarrollo serio en Windows | MySQL real, incluye Workbench | Instala un servicio permanente |
| apt (Ubuntu/Debian) | Servidores VPS y Linux | Es lo que usarás en producción | Requiere terminal |
| Homebrew (macOS) | Desarrollo en Mac | Fácil de actualizar | — |
| Docker | Cualquier sistema, varios proyectos | Versión exacta, aislado, se borra sin rastro | Hay que aprender Docker |
Recomendación
Si apenas empiezas con PHP en Windows: XAMPP. Si ya trabajas en varios proyectos: Docker. Para tu servidor de producción: apt en Ubuntu (o un servicio administrado).
Windows: instalador oficial
- Entra a
dev.mysql.com/downloads/installer/y descarga MySQL Installer for Windows (o el MSI de MySQL Community Server). - Ejecútalo y elige Server only (o Custom para añadir MySQL Workbench y MySQL Shell).
- En Type and Networking: deja Development Computer, puerto 3306 y marca Open Windows Firewall port solo si te conectarás desde otra máquina.
- Authentication Method: deja Strong Password Encryption (recomendado).
- Accounts and Roles: define una contraseña fuerte para
rooty guárdala en tu gestor de contraseñas. - Windows Service: deja Configure MySQL Server as a Windows Service y Start at System Startup (o desmárcalo si prefieres iniciarlo a mano).
- Termina con Execute y Finish.
Agrega el cliente al PATH para usarlo desde cualquier terminal:
powershell
# Ruta típica (ajusta la versión)
[Environment]::SetEnvironmentVariable(
"Path",
$env:Path + ";C:\Program Files\MySQL\MySQL Server 8.4\bin",
"User"
)
# Cierra y abre la terminal, luego:
mysql --version
mysql -u root -pAdministrar el servicio:
powershell
# Ver estado (el nombre suele ser MySQL84 o MySQL80)
Get-Service MySQL*
# Detener / iniciar (PowerShell como administrador)
Stop-Service MySQL84
Start-Service MySQL84Windows: XAMPP
- Descarga XAMPP desde
apachefriends.orge instálalo enC:\xampp(evitaProgram Files). - Abre el XAMPP Control Panel y pulsa Start en Apache y MySQL.
- Entra a
http://localhost/phpmyadmin.
txt
XAMPP Control Panel
┌─────────┬─────────┬────────┬─────────┐
│ Module │ PID │ Port │ Actions │
├─────────┼─────────┼────────┼─────────┤
│ Apache │ 10244 │ 80,443 │ Stop │
│ MySQL │ 8812 │ 3306 │ Stop │ ← verde = funcionando
└─────────┴─────────┴────────┴─────────┘Usar el cliente de terminal de XAMPP:
powershell
C:\xampp\mysql\bin\mysql.exe -u rootroot sin contraseña
XAMPP crea root sin contraseña. Para tu PC está bien, pero nunca expongas ese MySQL a la red. Puedes ponerle contraseña con ALTER USER 'root'@'localhost' IDENTIFIED BY 'NuevaClave!'; (y luego actualizarla en C:\xampp\phpMyAdmin\config.inc.php).
El puerto 3306 está ocupado
Si MySQL de XAMPP no arranca y el log dice que el puerto 3306 está en uso, probablemente ya tienes otro MySQL instalado como servicio. Detén ese servicio o cambia el puerto de XAMPP en my.ini (port=3307). Para ver quién lo usa: netstat -ano | findstr :3306.
Ubuntu / Debian (servidores)
bash
# 1. Instalar
sudo apt update
sudo apt install -y mysql-server # o: sudo apt install -y mariadb-server
# 2. Verificar el servicio
sudo systemctl status mysql
sudo systemctl enable mysql # iniciar al arrancar el sistema
# 3. Asegurar la instalación
sudo mysql_secure_installationmysql_secure_installation te pregunta:
| Pregunta | Respuesta recomendada |
|---|---|
| ¿Activar VALIDATE PASSWORD? | Sí (nivel medio o fuerte) |
| ¿Eliminar usuarios anónimos? | Sí |
| ¿Prohibir login remoto de root? | Sí |
¿Eliminar la base de datos test? | Sí |
| ¿Recargar privilegios? | Sí |
En Ubuntu, root usa autenticación por socket (auth_socket): entras con sudo mysql sin contraseña, solo si eres administrador del sistema. Es seguro y conviene dejarlo así; crea un usuario aparte para tus apps:
bash
sudo mysqlsql
CREATE DATABASE tienda CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE USER 'tienda_app'@'localhost' IDENTIFIED BY 'Cambia-Esta-Clave-2024!';
GRANT SELECT, INSERT, UPDATE, DELETE ON tienda.* TO 'tienda_app'@'localhost';
EXIT;bash
# Probar el nuevo usuario
mysql -u tienda_app -p tiendaArchivos importantes en Ubuntu:
| Archivo/carpeta | Contenido |
|---|---|
/etc/mysql/mysql.conf.d/mysqld.cnf | Configuración del servidor |
/var/lib/mysql/ | Datos |
/var/log/mysql/error.log | Log de errores (¡lo primero que revisas si no arranca!) |
Versión específica
Los repositorios de Ubuntu traen la versión que eligió la distribución. Si necesitas una versión exacta (por ejemplo 8.4 LTS), agrega el repositorio oficial con el paquete mysql-apt-config de dev.mysql.com/downloads/repo/apt/.
macOS con Homebrew
bash
brew install mysql@8.4
brew services start mysql@8.4
# Añade al PATH lo que indique brew, por ejemplo:
echo 'export PATH="/opt/homebrew/opt/mysql@8.4/bin:$PATH"' >> ~/.zshrc
mysql_secure_installation
mysql -u root -pDocker (cualquier sistema)
Con un solo comando
bash
docker run -d \
--name mysql-tienda \
-e MYSQL_ROOT_PASSWORD=root_secreto \
-e MYSQL_DATABASE=tienda \
-e MYSQL_USER=tienda_app \
-e MYSQL_PASSWORD=app_secreto \
-p 3306:3306 \
-v mysql_tienda_datos:/var/lib/mysql \
mysql:8.4| Parámetro | Qué hace |
|---|---|
-e MYSQL_ROOT_PASSWORD | Contraseña de root (obligatoria) |
-e MYSQL_DATABASE | Crea esa base de datos al iniciar |
-e MYSQL_USER / MYSQL_PASSWORD | Crea un usuario con todos los permisos sobre esa BD |
-p 3306:3306 | Expone el puerto en tu máquina (usa 3307:3306 si ya tienes otro MySQL) |
-v mysql_tienda_datos:/var/lib/mysql | Volumen: los datos sobreviven aunque borres el contenedor |
bash
docker logs -f mysql-tienda # espera "ready for connections"
docker exec -it mysql-tienda mysql -u root -p
docker stop mysql-tienda && docker start mysql-tiendaCon docker-compose (recomendado para proyectos)
Crea docker-compose.yml en la raíz de tu proyecto:
yaml
services:
db:
image: mysql:8.4
container_name: tienda-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: tienda
MYSQL_USER: tienda_app
MYSQL_PASSWORD: ${DB_PASSWORD}
TZ: America/Mexico_City
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_0900_ai_ci
ports:
- "127.0.0.1:3306:3306" # solo accesible desde tu máquina
volumes:
- db_datos:/var/lib/mysql
- ./sql:/docker-entrypoint-initdb.d # scripts .sql que se ejecutan la PRIMERA vez
phpmyadmin:
image: phpmyadmin:5
restart: unless-stopped
environment:
PMA_HOST: db
ports:
- "127.0.0.1:8080:80"
depends_on:
- db
volumes:
db_datos:Y un archivo .env junto a él (agrégalo a .gitignore):
env
DB_ROOT_PASSWORD=root_muy_secreto
DB_PASSWORD=app_secretobash
docker compose up -d
# phpMyAdmin en http://localhost:8080 (usuario root o tienda_app)
docker compose down # detiene (los datos quedan en el volumen)
docker compose down -v # ¡borra también los datos!docker-entrypoint-initdb.d
Si pones 01-esquema.sql y 02-datos.sql (los del curso de SQL) en la carpeta ./sql, el contenedor los ejecuta solo la primera vez que crea el volumen. Para volver a ejecutarlos, borra el volumen con docker compose down -v.
Verificar la instalación
Sin importar el método, comprueba:
bash
mysql --version
mysql -h 127.0.0.1 -P 3306 -u root -psql
SELECT VERSION();
SHOW VARIABLES LIKE 'character_set_server'; -- debería ser utf8mb4
SHOW VARIABLES LIKE 'port';
SHOW DATABASES;Problemas comunes
| Síntoma | Causa probable | Solución |
|---|---|---|
Can't connect to MySQL server on '127.0.0.1' (10061) | El servicio no está corriendo | Inícialo (servicio, XAMPP o docker start) |
Access denied for user 'root'@'localhost' | Contraseña incorrecta o root usa auth_socket | Usa sudo mysql en Ubuntu, revisa la contraseña |
| No arranca en XAMPP | Puerto ocupado o tablas corruptas tras apagado brusco | Revisa mysql_error.log; cambia de puerto o detén el otro servicio |
'mysql' no se reconoce como un comando | El cliente no está en el PATH | Agrega la carpeta bin al PATH |
Authentication plugin 'caching_sha2_password' cannot be loaded | Cliente antiguo con MySQL 8 | Actualiza el cliente/driver |
Ejercicios
- Instala MySQL con el método que prefieras y ejecuta
SELECT VERSION();. - Crea la base de datos
tiendaconutf8mb4y carga los scripts de esquema y datos del curso de SQL. - (Docker) Levanta el
docker-compose.ymlde esta lección y entra a phpMyAdmin. - ¿Por qué en el compose el puerto se publica como
127.0.0.1:3306:3306y no solo3306:3306?
Ver solución
bash
mysql -u root -p -e "CREATE DATABASE tienda CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;"
mysql -u root -p tienda < 01-esquema.sql
mysql -u root -p tienda < 02-datos.sql
mysql -u root -p tienda -e "SELECT COUNT(*) FROM productos;"En PowerShell la redirección < no funciona igual; usa: Get-Content 01-esquema.sql | mysql -u root -p tienda o, dentro del cliente, SOURCE C:/ruta/01-esquema.sql;.
docker compose up -dy abrehttp://localhost:8080; servidordb, usuariorooty la contraseña deDB_ROOT_PASSWORD.Con
3306:3306, Docker publica el puerto en todas las interfaces de red: cualquier equipo de tu red (o de internet, en un VPS) podría intentar conectarse. Con127.0.0.1:solo tu propia máquina puede.
Resumen
- XAMPP para empezar con PHP, instalador oficial para Windows,
apten servidores Linux, Homebrew en Mac, Docker para todo lo demás. - En Ubuntu ejecuta siempre
mysql_secure_installationy crea un usuario por aplicación. - Con Docker usa volúmenes para no perder datos y publica el puerto solo en
127.0.0.1. - Verifica con
mysql --version,SELECT VERSION();y el charset del servidor. - Si algo falla, el log de errores te dice por qué.