
MariaDB – Instalación y Configuración
En este Tutorial MariaDB hablaremos sobre el proceso de instalación y configuración que debemos aplicar a este gestor de bases de datos. Pero antes respondamos a una pregunta:
¿Por qué hablamos de MariaDB en un sitio enfocado en Swift y su entorno más cercano?
Pues hace poco terminé de colaborar en un proyecto donde la persistencia de la mayor parte de los datos reside en MariaDB y aunque un gran volumen de los usuarios van a interactuar con el sistema desde Windows yo me esforcé bastante en que la aplicación para macOS fuese nativa (gracias Carlos) a favor de la experiencia de usuario y una mejor integración con el sistema operativo.
[ads1]
Todo esto me motivó a escribir este artículo (y seguramente algunos otros) ya que muchas veces no se tiene muy presente (sobre todo en el mundo hispano) a macOS como plataforma de trabajo viable (quizás por los altos costos) y muchas veces tampoco el desarrollo nativo, algunos piensan que Swift solamente nos permite crear aplicaciones para las plataformas móviles de Apple y no, no es así y sobre eso hablaremos en un futuro tutorial donde veremos como integrar Swift con MariaDB.
Por el momento vamos a centrarnos en como instalar y configurar correctamente MariaDB tanto en macOS como en Linux (Fedora / Ubuntu).
Vamos a incluir Linux ya que como todos saben Swift es un proyecto de Código Abierto y no es de uso exclusivo en plataformas Apple. Hace ya tiempo que podemos hacer uso de Swift en sistemas Linux tanto para crear aplicaciones que corran en la terminal como para crear backends que den soporte, entre otras necesidades, también a la persistencia de datos que pudiera requerir cierta aplicación, datos que pudiéramos almacenar en un sistema de bases de datos tan estable y bien mantenido como lo es MariaDB.
MariaDB
Las distribuciones Linux en su mayoría ya han adoptado MariaDB como remplazo a MySQL. Esta migración ha sido posible sin grandes dolores de cabeza ya que MariaDB es un fork directo de MySQL pero que a diferencia de este último se distribuye bajo la licencia GPL. Por ende MariaDB cuenta con una alta compatibilidad con MySQL, posee las mismas órdenes, interfaces, APIs y bibliotecas, siendo su objetivo poder cambiar un servidor por otro de manera directa.
La primera versión de MariaDB fue lanzada en el año 2009 por su creador Michael Widenius (también creador de MySQL). Actualmente es mantenida por Widenius junto a los principios y amparo de La Fundación MariaDB (The MariaDB Foundation), la ayuda de los Sponsors y por toda una comunidad de desarrolladores, todos muy entusiastas, que se encuentran constantemente corrigiendo bugs y proponiendo mejoras.
[ads2]
Luego de la introducción histórica (Wikipedia)… A continuación se detallan los pasos para instalar el servidor de bases de datos MariaDB en macOS, Ubuntu y Fedora, respectivamente:
Nota: En este tutorial asumimos que el lector tiene conocimientos medianamente avanzados de administración de sistemas, al mismo tiempo recomendamos la lectura de nuestro artículo donde explicamos cómo configurar un entorno de desarrollo en macOS, en el cual también detallamos la instalación en macOS de comandos que aquí usaremos.
macOS:
Comenzamos por abrir iTerm y ejecutamos el comando:
╭─[email protected] ~ ╰─$ brew doctor
…tal y como vemos en la siguiente imagen:
Si obtenemos la misma salida en pantalla significa que estamos listos para hacer uso del comando «brew«, es decir, que todo estaría bien para continuar con el próximo comando en el cual procedemos a la instalación de MariaDB:
╭─[email protected] ~ ╰─$ brew install mariadb
En la siguiente imagen podemos ver la salida en pantalla que produce la ejecución del comando anterior.
A continuación vamos a activar la ejecución del servidor de bases de datos MariaDB al inicio del sistema. Luego de hecho esto cada vez que iniciemos nuestro macOS el servicio asociado a MariaDB comenzará su ejecución nuevamente sin necesidad de hacerlo manualmente. Tal y como nos informa la instalación de MariaDB ejecutamos el siguiente comando:
╭─[email protected] ~ ╰─$ brew services start mariadb
…al ejecutarlo obtenemos la salida en pantalla:
Si en estos momentos ejecutamos el comando «netstat» en pos de visualizar los puertos abiertos:
╭─[email protected] ~ ╰─$ netstat -a -p tcp -f inet | grep -i "listen"
…obtendremos una lista parecida a la siguiente:
Aquí podemos ver claramente en la primera línea que el servidor MariaDB, que por herencia / compatibilidad escucha en el mismo puerto que MySQL, se encuentra escuchando por todas las interfaces de nuestro Mac, tanto por IPv4 como por IPv6.
En caso de que te preguntes como desde el comando «brew» podemos ejecutar el servicio de MariaDB y establecerlo en el sistema de arranque, esto es debido a que brew se integra con launchctl y ejecuta mediante este las operaciones necesarias. De hecho si ejecutamos:
╭─[email protected] ~ ╰─$ launchctl list | grep -i "mariadb" 17678 0 homebrew.mxcl.mariadb ╭─[email protected] ~ ╰─$
…podemos ver que MariaDB figura entre los servicios activos, donde la primera columna es el PID del proceso, la segunda columna es el estatus y la última es el nombre del servicio dentro de launchctl.
Ubuntu:
En el caso de Ubuntu lo primero que hacemos es:
[email protected]:~$ sudo apt update [sudo] password for josuevhn: Hit:1 http://ec.archive.ubuntu.com/ubuntu zesty InRelease Get:2 http://security.ubuntu.com/ubuntu zesty-security InRelease [89,2 kB] Hit:3 http://ec.archive.ubuntu.com/ubuntu zesty-updates InRelease Hit:4 http://ec.archive.ubuntu.com/ubuntu zesty-backports InRelease Fetched 89,2 kB in 0s (112 kB/s) Reading package lists... Done Building dependency tree Reading state information... Done All packages are up to date. [email protected]:~$
…asegurarnos de tener actualizada la lista de paquetes que tenemos disponibles en los repositorios, para acto seguido verificar si hay alguna actualización:
[email protected]:~$ sudo apt upgrade Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. [email protected]:~$
…en mi caso no tengo ninguna actualización disponible pero quizás no ocurra lo mismo contigo así que no te sorprendas si contigo ocurre diferente, es normal y te aconsejo que actualices todo cuanto tengas disponible.
En este punto abrimos la terminal y a continuación ejecutamos:
[email protected]:~$ sudo apt install mariadb-server
…durante el proceso de instalación se nos mostrará una lista con todas las dependencias necesarias para que MariaDB pueda funcionar correctamente. Finalizada la instalación el script de post-instalación establecerá el servicio por defecto durante la carga del sistema y lo iniciará en ese instante.
Podemos verificar que el servicio está ejecutándose en segundo plano y en escucha de peticiones con el comando:
[email protected]:~$ sudo netstat -tnpl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 510/cupsd tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 7326/mysqld tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN 1135/systemd-resolv tcp6 0 0 ::1:631 :::* LISTEN 510/cupsd tcp6 0 0 :::5355 :::* LISTEN 1135/systemd-resolv [email protected]:~$
…en la segunda línea de puertos abiertos se encuentra mariadb que en Ubuntu aún figura como mysql.
En caso de que Ubuntu os informe que no encuentra el comando netstat:
[email protected]:~$ sudo netstat -tnpl sudo: netstat: command not found [email protected]:~$
…si esto les sucede hacemos lo siguiente:
[email protected]:~$ sudo apt install net-tools
…instalamos el paquete que contiene al comando «netstat«, luego de esto ya podemos usarlo como hemos explicado arriba.
Fedora:
En Fedora tal y como hicimos en Ubuntu primero actualizaremos la cache de paquetes con la que contamos en los repositorios, si el sistema se encuentra recién instalado y es la primera vez que vamos a interactuar con DNF ejecutamos el comando:
[[email protected] ~]$ sudo dnf makecache
…ya sea en caso contrario o tras ejecutar el anterior comando proseguimos a verificar e instalar las actualizaciones disponibles:
[[email protected] ~]$ sudo dnf update [sudo] password for josuevhn: Last metadata expiration check: 0:05:58 ago on Mon 31 Jul 2017 10:05:21 PM -05. Dependencies resolved. ================================================================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================================================================= Upgrading: GeoIP-GeoLite-data noarch 2017.07-1.fc26 updates 496 k bluedevil x86_64 5.10.4-1.fc26 updates 411 k breeze-cursor-theme noarch 5.10.4-1.fc26 updates 342 k dnf noarch 2.6.2-1.fc26 updates 331 k dnf-conf noarch 2.6.2-1.fc26 updates 62 k dnf-plugins-core noarch 2.1.3-1.fc26 updates 50 k dnf-yum noarch 2.6.2-1.fc26 updates 45 k f26-backgrounds-base noarch 26.2.7-2.fc26 updates 23 M f26-backgrounds-kde noarch 26.2.7-2.fc26 updates 12 k gdk-pixbuf2 x86_64 2.36.7-2.fc26 updates 458 k gdk-pixbuf2-modules x86_64 2.36.7-2.fc26 updates 98 k ibus-libs x86_64 1.5.16-6.fc26 updates 237 k iputils x86_64 20161105-5.fc26 updates 153 k kactivitymanagerd x86_64 5.10.4-1.fc26 updates 204 k kde-cli-tools x86_64 5.10.4-1.fc26 updates 688 k kde-gtk-config x86_64 5.10.4-1.fc26 updates 225 k kde-style-breeze x86_64 5.10.4-1.fc26 updates 186 k kdecoration x86_64 5.10.4-1.fc26 updates 65 k kdeplasma-addons x86_64 5.10.4-1.fc26 updates 1.7 M kdesu x86_64 1:5.10.4-1.fc26 updates 53 k ... AREA OMITIDA selinux-policy noarch 3.13.1-260.3.fc26 updates 501 k selinux-policy-devel noarch 3.13.1-260.3.fc26 updates 1.3 M selinux-policy-targeted noarch 3.13.1-260.3.fc26 updates 9.4 M sssd x86_64 1.15.3-1.fc26 updates 72 k sssd-ad x86_64 1.15.3-1.fc26 updates 179 k sssd-client x86_64 1.15.3-1.fc26 updates 134 k sssd-common x86_64 1.15.3-1.fc26 updates 1.2 M sssd-common-pac x86_64 1.15.3-1.fc26 updates 134 k sssd-ipa x86_64 1.15.3-1.fc26 updates 272 k sssd-krb5 x86_64 1.15.3-1.fc26 updates 110 k sssd-krb5-common x86_64 1.15.3-1.fc26 updates 146 k sssd-ldap x86_64 1.15.3-1.fc26 updates 178 k sssd-nfs-idmap x86_64 1.15.3-1.fc26 updates 77 k sssd-proxy x86_64 1.15.3-1.fc26 updates 106 k upower x86_64 0.99.5-1.fc26 updates 161 k webkitgtk4 x86_64 2.16.6-1.fc26 updates 12 M webkitgtk4-jsc x86_64 2.16.6-1.fc26 updates 4.2 M webkitgtk4-plugin-process-gtk2 x86_64 2.16.6-1.fc26 updates 9.3 M Installing dependencies: libsss_certmap x86_64 1.15.3-1.fc26 updates 102 k Transaction Summary ================================================================================================================================================================================= Install 1 Package Upgrade 109 Packages Total download size: 137 M Is this ok [y/N]:
Aunque pudimos haber especificado el parámetro «-y» para que la actualización fuese automática yo prefiero detenerme y leer / analizar los paquetes que se van a instalar y/o actualizar y por último especifico «y» para que el proceso continue.
[ads3]
Nota: Aunque no es necesario, he decidido mostrar la anterior salida en pantalla (que seguramente será distinta a la tuya) para que puedan ver por que prefiero Fedora sobre Ubuntu, entre otras cosas por el orden, la claridad con la que todo está dispuesto, la manera en la que se configura de la red a bajo nivel, el firewall, el sistema de arranque, por usar Gnome (aunque yo prefiero KDE, Qt fanboy) y un largo etcétera.
Como dato curioso les comento que Fedora (tanto la versión desktop como server) podemos decir a groso modo que es el laboratorio de Red Hat, cuando ya versiones específicas de paquetes o branches han demostrado ser lo suficientemente estable, pasan a los repositorios de Red Hat y por ende también a su clon binario CentOS, sistemas donde corren muchos de los servidores de Internet, este sitio y posiblemente el tuyo también, de hecho CentOS es la opción preferida por la mayoría de las compañías de hosting.
Como quizás en Fedora el nombre de nuestro servidor de bases de datos MariaDB pudiera tener otro nombre primero buscamos con «dnf» las coincidencias:
[[email protected] ~]$ sudo dnf search mariadb [sudo] password for josuevhn: Last metadata expiration check: 0:27:28 ago on Mon 31 Jul 2017 10:05:21 PM -05. ========================================================================= Name Exactly Matched: mariadb ========================================================================= mariadb.x86_64 : A community developed branch of MySQL ======================================================================== Name & Summary Matched: mariadb ======================================================================== mariadb-bench.x86_64 : MariaDB benchmark scripts and data mariadb-embedded.x86_64 : MariaDB as an embeddable library mariadb-embedded.i686 : MariaDB as an embeddable library mariadb-server.x86_64 : The MariaDB server and related files mariadb-test.x86_64 : The test suite distributed with MariaDB mariadb-java-client-javadoc.noarch : Javadoc for mariadb-java-client mariadb-connect-engine.x86_64 : The CONNECT storage engine for MariaDB mariadb-oqgraph-engine.x86_64 : The Open Query GRAPH engine for MariaDB mariadb-connector-c.i686 : The MariaDB Native Client library (C driver) mariadb-connector-c.x86_64 : The MariaDB Native Client library (C driver) mariadb-devel.i686 : Files for development of MariaDB/MySQL applications mariadb-devel.x86_64 : Files for development of MariaDB/MySQL applications mariadb-libs.x86_64 : The shared libraries required for MariaDB/MySQL clients mariadb-libs.i686 : The shared libraries required for MariaDB/MySQL clients mariadb-connector-c-devel.i686 : Development files for mariadb-connector-c. mariadb-connector-c-devel.x86_64 : Development files for mariadb-connector-c. mariadb-connector-odbc.x86_64 : The MariaDB Native Client library (ODBC driver) mariadb-embedded-devel.i686 : Development files for MariaDB as an embeddable library mariadb-embedded-devel.x86_64 : Development files for MariaDB as an embeddable library mariadb-server-utils.x86_64 : Non-essential server utilities for MariaDB/MySQL applications mariadb-java-client.noarch : Connects applications developed in Java to MariaDB and MySQL databases ============================================================================= Name Matched: mariadb ============================================================================= mariadb-common.x86_64 : The shared files required by server and client mariadb-config.x86_64 : The config files required by server and client mariadb-errmsg.x86_64 : The error messages files required by server and embedded mariadb-common.i686 : The shared files required by server and client mariadb-errmsg.i686 : The error messages files required by server and embedded mariadb-server-galera.x86_64 : The configuration files and scripts for galera replication =========================================================================== Summary Matched: mariadb ============================================================================ percona-xtrabackup.x86_64 : Online backup for InnoDB/XtraDB in MySQL, Percona Server and MariaDB [[email protected] ~]$
La genial salida en pantalla de dnf nos informa de una coincidencia exacta la cual corresponde el meta-paquete de MariaDB, el cual instalará todas las dependencias necesarias, el servidor y todo lo necesario en un entorno genérico. Así que el siguiente comando es:
[[email protected] ~]$ sudo dnf install mariadb [sudo] password for josuevhn: Last metadata expiration check: 0:34:12 ago on Mon 31 Jul 2017 10:05:21 PM -05. Package mariadb-3:10.1.25-1.fc26.x86_64 is already installed, skipping. Dependencies resolved. Nothing to do. Complete! [[email protected] ~]$
Exacto, en Fedora ya viene instalado, solamente tenemos que establecer el servicio para que inicie su ejecución al arranque del sistema y evidentemente iniciarlo. Esto lo hacemos con el comando:
[[email protected] ~]$ sudo systemctl enable mariadb Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service. [[email protected] ~]$
…acabamos de establecer (o mejor dicho la herramienta / comando systemctl lo ha hecho por nosotros) nuestro servicio en el arranque del sistema, y ahora solamente lo iniciamos:
[[email protected] ~]$ sudo service mariadb start Redirecting to /bin/systemctl start mariadb.service [[email protected]el ~]$
Quiero recalcar aquí que tal y como el comando «service» nos informa, la ejecución de «service mariadb start» es lo mismo que «systemctl start mariadb».
Nota: Como la carpeta /bin esta en nuestro PATH de usuario no es necesario especificar el path absoluto del comando systemctl y cuando escribimos mariadb al final omitimos el «.service» ya que systemctl lo induce.
Si ahora ejecutamos:
[[email protected] ~]$ sudo netstat -tnpl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1778/cupsd tcp6 0 0 :::3306 :::* LISTEN 2216/mysqld tcp6 0 0 :::1716 :::* LISTEN 1341/kdeconnectd tcp6 0 0 ::1:631 :::* LISTEN 1778/cupsd [[email protected] ~]$
…podemos constatar que nuestro servidor MariaDB se encuentra ejecutándose el en PID de proceso 2216 y se encuentra escuchando o esperando por conexiones en el puerto 3306 el clásico puerto de MySQL.
Asegurando la Instalación
No podríamos comenzar a trabajar sin antes establecer las políticas de seguridad mínimas en nuestra base de datos.
MariaDB al momento de ser instalada establece una configuración base y un usuario administrador nombrado «root«, sin password asociado. Este estado inicial no es para nada el deseado, por este motivo nos valemos de un comando que nos ayudará a corregir todo esto de una forma interactiva, su nombre es «mysql_secure_installation«, el cual ejecutamos sin parámetros bajo el usuario root del sistema o valiéndonos del comando «sudo» en el caso de las distribuciones Linux, en macOS como MariaDB se ejecuta bajo nuestro usuario no es necesario sudo:
╭─[email protected] ~ ╰─$ mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] Y New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] Y ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] Y ... Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] Y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] Y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! ╭─[email protected] ~ ╰─$
En este ejemplo establecemos una contraseña para el usuario root, eliminamos todos los usuarios anónimos, se deshabilita el acceso remoto al servidor, también se elimina la base de datos «test«, por último se recargan las tablas de privilegios asegurando que todo los cambios tomen efecto. Hecho todo esto por parte de MariaDB ya está todo asegurado.
La ejecución del script anterior no la muestro para Ubuntu / Fedora ya que es idéntica a la de macOS y es relativamente extensa como para triplicar el contenido. Lo que si les muestro es como podemos verificar que la instalación y la configuración de seguridad que hemos aplicado funciona de manera correcta:
macOS:
╭─[email protected] ~ ╰─$ mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 18 Server version: 10.2.7-MariaDB Homebrew Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.13 sec) MariaDB [(none)]> QUIT; Bye ╭─[email protected] ~ ╰─$
Ubuntu:
[email protected]:~$ mysql -u root -p Enter password: ERROR 1698 (28000): Access denied for user 'root'@'localhost' [email protected]:~$
…exacto, en Ubuntu tenemos que ejecutar el comando mysql haciendo uso de sudo:
[email protected]:~$ sudo mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.1.22-MariaDB- Ubuntu 17.04 Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.02 sec) MariaDB [(none)]> QUIT; Bye [email protected]:~$
Fedora:
[[email protected] ~]$ mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 13 Server version: 10.1.25-MariaDB MariaDB Server Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.01 sec) MariaDB [(none)]> QUIT; Bye [[email protected] ~]$
En todas las salidas en pantalla podemos verificar las diferentes versiones y las bases de datos que se encuentran creadas por defecto, en otras palabras… todo ha salido como lo hemos planificado. A partir de aquí ya podemos comenzar a interactuar con MariaDB e integrar nuestro proyecto en Swift con esta base de datos local. Esto último lo veremos en próximos artículos.
Si tienes curiosidad o dudas sobre los beneficios de MariaDB sobre MySQL: las diferencias entre estos dos sistemas de bases de datos, el desempeño de cada uno, la compatibilidad y te gustaría conocer casos de uso pues te recomiendo los siguiente artículos (en inglés):
Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo.
Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.
Cualquier sugerencia, ya sea errores a corregir, información o ejemplos a añadir será, más que bienvenida, necesaria!