Skip to content

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ónIdeal paraVentajasDesventajas
XAMPP (Windows/macOS)Empezar con PHP rápidoApache + PHP + MariaDB + phpMyAdmin en un clicTrae MariaDB, versiones a veces viejas, root sin contraseña
Instalador oficial (Windows)Desarrollo serio en WindowsMySQL real, incluye WorkbenchInstala un servicio permanente
apt (Ubuntu/Debian)Servidores VPS y LinuxEs lo que usarás en producciónRequiere terminal
Homebrew (macOS)Desarrollo en MacFácil de actualizar—
DockerCualquier sistema, varios proyectosVersión exacta, aislado, se borra sin rastroHay 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 ​

  1. Entra a dev.mysql.com/downloads/installer/ y descarga MySQL Installer for Windows (o el MSI de MySQL Community Server).
  2. Ejecútalo y elige Server only (o Custom para añadir MySQL Workbench y MySQL Shell).
  3. En Type and Networking: deja Development Computer, puerto 3306 y marca Open Windows Firewall port solo si te conectarás desde otra máquina.
  4. Authentication Method: deja Strong Password Encryption (recomendado).
  5. Accounts and Roles: define una contraseña fuerte para root y guárdala en tu gestor de contraseñas.
  6. Windows Service: deja Configure MySQL Server as a Windows Service y Start at System Startup (o desmárcalo si prefieres iniciarlo a mano).
  7. 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 -p

Administrar 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 MySQL84

Windows: XAMPP ​

  1. Descarga XAMPP desde apachefriends.org e instálalo en C:\xampp (evita Program Files).
  2. Abre el XAMPP Control Panel y pulsa Start en Apache y MySQL.
  3. 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 root

root 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_installation

mysql_secure_installation te pregunta:

PreguntaRespuesta 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 mysql
sql
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 tienda

Archivos importantes en Ubuntu:

Archivo/carpetaContenido
/etc/mysql/mysql.conf.d/mysqld.cnfConfiguración del servidor
/var/lib/mysql/Datos
/var/log/mysql/error.logLog 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 -p

Docker (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ámetroQué hace
-e MYSQL_ROOT_PASSWORDContraseña de root (obligatoria)
-e MYSQL_DATABASECrea esa base de datos al iniciar
-e MYSQL_USER / MYSQL_PASSWORDCrea un usuario con todos los permisos sobre esa BD
-p 3306:3306Expone el puerto en tu máquina (usa 3307:3306 si ya tienes otro MySQL)
-v mysql_tienda_datos:/var/lib/mysqlVolumen: 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-tienda

Con 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_secreto
bash
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 -p
sql
SELECT VERSION();
SHOW VARIABLES LIKE 'character_set_server';   -- debería ser utf8mb4
SHOW VARIABLES LIKE 'port';
SHOW DATABASES;

Problemas comunes ​

SíntomaCausa probableSolución
Can't connect to MySQL server on '127.0.0.1' (10061)El servicio no está corriendoInícialo (servicio, XAMPP o docker start)
Access denied for user 'root'@'localhost'Contraseña incorrecta o root usa auth_socketUsa sudo mysql en Ubuntu, revisa la contraseña
No arranca en XAMPPPuerto ocupado o tablas corruptas tras apagado bruscoRevisa mysql_error.log; cambia de puerto o detén el otro servicio
'mysql' no se reconoce como un comandoEl cliente no está en el PATHAgrega la carpeta bin al PATH
Authentication plugin 'caching_sha2_password' cannot be loadedCliente antiguo con MySQL 8Actualiza el cliente/driver

Ejercicios ​

  1. Instala MySQL con el método que prefieras y ejecuta SELECT VERSION();.
  2. Crea la base de datos tienda con utf8mb4 y carga los scripts de esquema y datos del curso de SQL.
  3. (Docker) Levanta el docker-compose.yml de esta lección y entra a phpMyAdmin.
  4. ¿Por qué en el compose el puerto se publica como 127.0.0.1:3306:3306 y no solo 3306: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;.

  1. docker compose up -d y abre http://localhost:8080; servidor db, usuario root y la contraseña de DB_ROOT_PASSWORD.

  2. 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. Con 127.0.0.1: solo tu propia máquina puede.

Resumen ​

  • XAMPP para empezar con PHP, instalador oficial para Windows, apt en servidores Linux, Homebrew en Mac, Docker para todo lo demás.
  • En Ubuntu ejecuta siempre mysql_secure_installation y 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é.

Academia Web — aprende, copia y construye.