Creando una máquina virtual para MySQL/MariaDB

Imagen de Creando una máquina virtual para MySQL/MariaDB

El otro día tenía un proyecto que implicaba importar una base de datos MySQL en mi PC local, uso Windows allí y Xampp para tener un webserver, siempre funciona de maravillas, pero no es lo mismo cuando intentás meterle una base de datos grande. Ahí todo empezó a fallar.

Cuando me refiero a fallar es que nunca más levante tu MySQL y pierdas todo el trabajo que tengas en progreso, me cansé y opté por otra opción: cada uno de esos proyectos grandes, su propio MySQL en una máquina virtual.

¿Por qué no Docker me dirán? Pues bien, Docker es una mierda en Windows aun cuando por detrás uno utilice WSL (que es básicamente Linux dentro de Windows) por el sistema de archivos. Si uno tiene un proyecto en Docker pero accede a archivos FUERA del dock, suerte con ello, es lo peor que vi en mi vida, la performance más baja de la historia, parece hecho por alguien que te odia :D 

Así que como opción era factible pero requería que metiera todos mis archivos de trabajo DENTRO del Docker en cuestión, que bloqueara el puerto 80 y el 3306 sólo para eso (tengo mis cosas en el xampp sin tento problema), así que opté por otra de las ideas que tenía en mente: Virtualziación.

MySQL en una VM

Las VM las uso hace décadas así que no es algo precisamente complejo de instalar, simplemente usando VirtualBox podemos tener un pequeño Ubuntu Server separado que sólo encendemos cuando necesitamos trabajar en ese proyecto grande. 

La ventaja de funcionar como una PC por separado es que no interrumpe nada de la instalación local del webserver, mi xampp puede convivir sin problemas porque, al no ser la misma máquina, no hay ningún cruce de puertos ni nada por el estilo (el punto flojo de Docker).

Todo proyecto local de sitio web sólo requiere que le cambie la config para que apunte a ese servidor MySQL, único "trabajo extra", una pavada.

Ubuntu Server

Podría haber instalad un ubuntu completo pero quiero el menor uso de RAM posible así la VM no implica dejarme sin RAM para el resto de las cosas, con 4GB debería sobrarle, pero encontré un problema con Ubuntu Server.

Por alguna razón sus devs consideraron racional ocupar sólo un 50% del disco disponible ya que, según ellos, el escenario "real" sería donde uno hace snapshots del servidor y esas cosas. No señores, no todos lo usamos así, el instalador podría ser más claro y permitirte usar el 100% de una si tantas vueltas.

Por suerte es fácil, una vez instalado, ajustar esto:

Como root o con sudo, para ver cómo se llama la unidad:

vgdisplay

Luego hacemos el extend apuntando a esa unidad:

lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv

Y por último el resize del file system:

resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

Via

Listo, ahora con un df -h podemos ver que usamos la totalidad del espacio requerido

Usar la VM como otro equipo de red y no NAT

Puede parecer una tontería pero es de lo más importante, de base VirtualBox deja la conexión de red como NAT, pero aquí necesitamos que el IP de la máquina virtual sea accesible por la red donde estemos trabajando.

Para eso hay que cambiar la configuración de NAT a Bridge, así pues nuestra PC tendrá dos IP, uno para el host y otra para la VM. Detalle: suponemos que están haciendo esto mirando hacia un router hogareño donde entrega IP sin problemas, claro.

Crear el usuario de MySQL para poder trabajar

Inicialmente MySQL no tiene ni usuario ni nada configurado, lo primero es darle un password a Root 

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASS';

Luego crean el nuevo usuario, porque no es lo ideal trabajar como root>

CREATE USER 'fabio'@'%' IDENTIFIED BY 'password';

El % habilita a que se entre desde cualqueir IP, si le dan permisos como 'localhost' el usuario sólo servirá para recibir conexiones desde la misma máquina virtual y no desde el host, por eso uso el %. Le damos todos los privilegios posibles porque la seguridad no aplica 😁

GRANT ALL PRIVILEGES ON *.* TO 'fabio'@'%' WITH GRANT OPTION;

Exit y listo por aquí

En caso de Firewall...

Si en la instalación configuraron el firewall entonces van a tener que abrir el puerto 3306 que es el default de MySQL, es sencillo, se usa ufw en Ubunu:

sudo ufw allow 3306 sudo ufw status

Si tienen Debian o alguna otra cosa siempre se puede configurar IPTables.

Abrir el MySQL a conexiones externas

Como estamos en un Ubuntu Server la idea es que nadie pueda ver el servidor desde afuera, sólo acepta conexiones por localhost, para cambiar este comportamiento sólo hay que editar la configuración.

sudo nano /etc/mysql/mysql.cnf

Donde figura 

bind-address = 127.0.0.1

hay que cambiar por 

bind-address = 0.0.0.0

Luego reiniciamos:

sudo systemctl restart mysqld

Obviamente NUNCA hagan esto con un servidor productivo, si se quiere entrar a un server MySQL lo ideal es que sea por un túnel SSH con archivo de credenciales y ese tipo de conexiones seguras, esto es para trabajar en local.

Y listo

Ahora podemos conectar nuestros proyectos a esta base de datos, pueden crear varias VM y cada una con una DB distinta.

Hasta sirve para testear sistemas que requieran bases replicadas sin gastar dinero en un AWS para andar probando ideas, o instalar un Redis o un Varnish o lo que sea en un entorno local, cada VM puede funcionar bastante bien con relativa poca RAM.

De hecho, a la hora de llevar esto a productivo seguramente el servidor que usen no tenga más de 2GB o 4GB de RAM, usando la edición "server" de Ubuntu el uso de recursos es mucho menor que en la de Desktop.

Y lo mejor es que esto hace totalmente separado al desarrollo del sistema operativo y podés ver cómo ejecutará en uno más parecido a producción. Nada implica, claro está, que MySQL no reviente por alguna otra razón, pero al menos podés crear una VM para cada proyecto y la muerte de uno no te liquida el otro (como me sucedió a mí ).

PS: no sé por qué se me ocurrió que era buena idea crear imágenes con un vikingo dándole al teclado 😁


Volver al inicio Ver original

copyright©2025 Fabio Baccaglioni - Fabio.com.ar - Versión simplificada Old School