Capítulo 1. Instalación de MySQL

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Comencemos nuestro camino de aprendizaje instalando MySQL y accediendo a él por primera vez.

Ten en cuenta que en este libro no nos basamos en una única versión de MySQL. En su lugar, nos hemos basado en nuestro conocimiento colectivo de MySQL en el mundo real. El núcleo del libro se centra en los sistemas operativos Linux (principalmente Ubuntu/Debian y CentOS/RHEL o sus derivados) y en MySQL 5.7 y MySQL 8.0, porque son las que consideramos las versiones "actuales" capaces de soportar cargas de trabajo de producción. Las series MySQL 5.7 y 8.0 aún están en desarrollo, lo que significa que se seguirán publicando nuevas versiones con correcciones de errores y nuevas funciones.

Con MySQL convirtiéndose en la base de datos de código abierto más popular (Oracle, que ocupa el primer lugar, no es de código abierto), ha aumentado la demanda de tener un proceso de instalación rápido. Puedes pensar en la instalación de MySQL desde cero como algo similar a hornear un pastel: el código fuente es la receta. Pero incluso con el código fuente disponible, la receta para construir software no es fácil de seguir. Se tarda tiempo en compilar y, normalmente, es necesario instalar bibliotecas de desarrollo adicionales que exponen a riesgos los entornos de producción. Digamos que quieres una tarta de chocolate; aunque tengas las instrucciones para hacerla tú mismo, puede que no quieras desordenar tu cocina, o que no tengas tiempo para hornearla, así que en vez de eso vas a una pastelería y compras una. Para MySQL, cuando lo quieras listo para usar sin el esfuerzo que supone compilarlo, puedes utilizar los paquetes de distribución.

Existen paquetes de distribución de MySQL para diversas plataformas, como distribuciones de Linux, Windows y macOS. Estos paquetes proporcionan una forma flexible y rápida de empezar a utilizar MySQL. Volviendo al ejemplo de la tarta de chocolate, supongamos que quieres cambiar algo. Quizá quieras una tarta de chocolate blanco. Para MySQL, tenemos lo que se llaman bifurcaciones, que incluyen algunas opciones diferentes. Veremos algunas de ellas en la siguiente sección.

Horquillas MySQL

En ingeniería de software, una bifurcación se produce cuando alguien copia el código fuente de e inicia su propio camino de desarrollo y soporte independientes. La bifurcación puede seguir un camino cercano al de la versión original, como hace la distribución Percona de MySQL, o alejarse, como MariaDB. Como el código fuente de MySQL es abierto y libre, los nuevos proyectos pueden bifurcar el código sin permiso de su creador original. Echemos un vistazo a algunas de las bifurcaciones más notables.

MySQL Edición Comunidad

MySQL Community Edition, también conocida como versión upstream o vainilla de MySQL, es la versión de código abierto distribuida por Oracle. Esta versión impulsa el desarrollo del motor InnoDB y de nuevas funciones, y es la primera en recibir actualizaciones, nuevas funciones y correcciones de errores.

Servidor Percona para MySQL

La distribución Percona de MySQL es un sustituto gratuito y de código abierto de MySQL Community Edition. El desarrollo sigue de cerca esa versión, centrándose en mejorar el rendimiento y el ecosistema general de MySQL. Percona Server también incluye mejoras adicionales como el motor MyRocks, un plugin de Registro de Auditoría y un plugin de Autenticación PAM. Percona fue cofundada por Peter Zaitsev y Vadim Tkachenko.

Servidor MariaDB

Creada por Michael "Monty" Widenius y distribuida por la Fundación MariaDB, MariaDB Server es con diferencia la bifurcación que más se ha alejado de MySQL vainilla. En los últimos años ha desarrollado nuevas funcionalidades y motores, como MariaDB ColumnStore, y fue la primera base de datos en integrarla funcionalidad de clustering Galera 4.

MySQL Edición Empresa

MySQL Enterprise Edition es actualmente la única versión con licencia comercial (lo que significa que tienes que pagar para utilizarla, como una licencia de Windows). También distribuida por Oracle, contiene toda la funcionalidad de la Edición Comunidad más funciones exclusivas de seguridad, copia de seguridad y alta disponibilidad.

Opciones de instalación y plataformas

En primer lugar, debes elegir la versión de MySQL compatible con tu sistema operativo (SO) . Puedes verificar la compatibilidad en el sitio web de MySQL. Las mismas políticas de soporte están disponibles para Percona Server y MariaDB.

A menudo oímos la pregunta: ¿es posible instalar MySQL en un sistema operativo que no es compatible? La mayoría de las veces, la respuesta es sí. Es posible instalar MySQL en Windows 7, por ejemplo, pero el riesgo de que aparezca un error o de que se produzca un comportamiento impredecible (como fugas de memoria o bajo rendimiento) es alto. Debido a estos riesgos, no recomendamos hacerlo para entornos de producción.

El siguiente paso es decidir si instala una versión de desarrollo o de Disponibilidad General (GA). Las versiones de desarrollo tienen las funciones más recientes, pero no las recomendamos para producción porque no son estables. Las versiones GA, también llamadas de producción o estables, están pensadas para su uso en producción.

Consejo

Recomendamos encarecidamente utilizar la versión GA más reciente, ya que incluirá las últimas correcciones de errores estables y mejoras de rendimiento.

Lo último que hay que decidir es qué formato de distribución instalar para el sistema operativo. Para la mayoría de los casos de uso, sirve una distribución binaria. Las distribuciones binarias están disponibles en formato nativo para muchas plataformas, como los paquetes .rpm para Linux o los paquetes .dmg para macOS. Las distribuciones también están disponibles en formatos genéricos, como archivos .zip o archivos .tar comprimidos(tarballs). En Windows, puedes utilizar el Instalador MySQL para instalar una distribución binaria.

Advertencia

Fíjate si la versión es de 32 o 64 bits. La regla general es elegir la versión de 64 bits. A menos que trabajes con un SO antiguo, no debes seleccionar la versión de 32 bits. Esto se debe a que los procesadores de 32 bits sólo pueden gestionar una cantidad limitada de RAM (4 GB o menos), mientras que los procesadores de 64 bits son capaces de gestionar mucha más memoria.

El proceso de instalación consta de cuatro pasos principales, que se describen en las secciones siguientes. Es esencial seguirlos correctamente y establecer los requisitos mínimos de seguridad para la base de datos MySQL.

1. Descarga la distribución que quieres instalar

Cada distribución tiene su propietario y, en consecuencia, su fuente. Algunas distribuciones Linux proporcionan paquetes por defecto en sus repositorios. Por ejemplo, en CentOS 8, la distribución MySQL vanilla está disponible en los repositorios por defecto. Cuando el SO dispone de paquetes por defecto, no es necesario descargar MySQL de un sitio web o configurar tú mismo un repositorio, lo que facilita el proceso de instalación.

Demostraremos cómo instalar los repositorios y descargar los archivos sin necesidad de ir al sitio web durante el proceso de instalación. Sin embargo, si quieres descargar MySQL tú mismo, puedes utilizar los siguientes enlaces:

2. Instala la Distribución

La instalación consiste en los pasos elementales para hacer que MySQL funcione y ponerlo en línea, pero no en asegurar MySQL. Por ejemplo, en este punto, el usuario root de MySQL puede conectarse sin contraseña, lo que es bastante peligroso, ya que el usuario root tiene privilegios para realizar cualquier acción, incluida la eliminación de una base de datos.

3. Realiza los ajustes necesarios tras la instalación

Este paso consiste en asegurarse de que el servidor MySQL funciona correctamente. Es esencial que te asegures de que tu servidor es seguro, y el primer paso para ello es ejecutar el script mysql_secure_installation. Cambiarás la contraseña del usuario root, desactivarás el acceso del usuario root desde un servidor remoto y eliminarás la base de datos de prueba.

4. Ejecutar pruebas

Algunos DBA ejecutan pruebas de rendimiento para cada implementación de , con el fin de medir si el rendimiento es adecuado para el proyecto para el que lo utilizan. La herramienta más habitual para ello es sysbench. Es esencial destacar aquí que sysbench realiza una carga de trabajo sintética, mientras que cuando la aplicación se está ejecutando, la llamamos carga de trabajo real. Las cargas de trabajo sintéticas suelen proporcionar informes sobre el rendimiento máximo del servidor, pero no pueden reproducir la carga de trabajo real (con sus bloqueos inherentes, diferentes tiempos de ejecución de consultas, procedimientos almacenados, desencadenadores, etc.).

En la siguiente sección veremos los detalles del proceso de instalación de algunas de las plataformas más utilizadas.

Instalar MySQL en Linux

El ecosistema Linux es diverso y tiene muchas variantes, como Red Hat Enterprise Linux (RHEL), CentOS, Ubuntu, Debian y otras. Esta sección se centra sólo en las más populares; de lo contrario, ¡este libro trataría por completo del proceso de instalación!

Instalar MySQL en CentOS 7

CentOS, abreviatura de Community Enterprise Linux Operating System, se fundó en 2004, y Red Hat la adquirió en 2014. CentOS es la versión comunitaria de Red Hat, por lo que son prácticamente idénticos, pero CentOS es gratuito y el soporte proviene de la comunidad en lugar de la propia Red Hat. CentOS 7 se lanzó en 2014, y su fecha de fin de vida es en 2024.

Instalar MySQL 8.0

Para instalar MySQL 8.0 en CentOS 7 utilizando el repositorio yum, completa los siguientes pasos.

Conéctate al servidor Linux

Normalmente, por razones de seguridad, los usuarios inician sesión en servidores Linux como usuarios sin privilegios. Aquí tienes un ejemplo de un usuario que inicia sesión en Linux desde un terminal macOS utilizando una clave privada:

$ ssh -i key.pem centos@3.227.11.227

Cuando te hayas conectado correctamente, verás algo así en el terminal:

[centos@ip-172-30-150-91 ~]$

Ser root en Linux

Una vez conectado al servidor, necesitas convertirte en root:

$ sudo su - root

Verás un mensaje como el siguiente en tu terminal:

[root@ip-172-30-150-91 ~]#

Ser root es importante porque para instalar MySQL es necesario realizar tareas como crear el usuario MySQL en Linux, configurar directorios y establecer permisos. También es posible utilizar el comando sudo para todos los ejemplos que mostraremos y que deben ser ejecutados por el usuario root. Sin embargo, si olvidas anteponer a un comando el prefijo sudo, el proceso de instalación quedará incompleto.

Nota

En este capítulo se utilizará el usuario root de Linux en la mayoría de los ejemplos (representado por el prompt # en las líneas de código). Otra ventaja de la representación # es que éste es también el carácter de comentario en Linux. Si copias/pegas a ciegas las líneas del libro, no ejecutarás ningún comando real en el intérprete de comandos.

Configurar el repositorio yum

Ejecuta el siguiente comando para configurar el repositorio yum de MySQL:

# rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7.rpm

Instalar MySQL 8.0 Servidor Comunitario

Como el repositorio yum de MySQL tiene repositorios para varias versiones de MySQL (versiones principales 5.7 y 8.0), primero tenemos que desactivar todos los repositorios:

# sed -i 's/enabled=1/enabled=0/'
/etc/yum.repos.d/mysql-community.repo

A continuación, tenemos que activar el repositorio MySQL 8.0 y ejecutar el siguiente comando para instalar MySQL 8.0:

# yum --enablerepo=mysql80-community install mysql-community-server

Inicia el servicio MySQL

Ahora, inicia el servicio MySQL con el comando systemctl:

# systemctl start mysqld

También es posible iniciar el proceso MySQL manualmente, lo que puede ser útil para solucionar problemas de inicialización cuando MySQL se niega a iniciarse. Para iniciar manualmente, indica la ubicación del archivo my.cnf y qué usuario puede manipular los archivos de la base de datos y el proceso:

# mysqld --defaults-file=/etc/my.cnf --user=mysql

Descubre la contraseña por defecto del usuario root

Cuando instalas MySQL 8.0, MySQL crea una contraseña temporal para la cuenta de usuario root. Para identificar la contraseña de la cuenta de usuario root, ejecuta el siguiente comando:

# grep "A temporary password" /var/log/mysqld.log

El comando proporciona una salida como la siguiente:

2020-05-31T15:04:12.256877Z 6 [Note] [MY-010454] [Server] A temporary
password is generated for root@localhost: #z?hhCCyj2aj

Asegurar la instalación de MySQL

MySQL proporciona un script de shell que puedes ejecutar en los sistemas Unix, mysql_secure_installation, que te permite mejorar la seguridad de la instalación de tu servidor de las siguientes maneras:

  • Puedes establecer una contraseña para la cuenta raíz.

  • Puedes desactivar el acceso root desde fuera del localhost.

  • Puedes eliminar cuentas de usuario anónimas.

  • Puedes eliminar la base de datos de prueba, a la que por defecto pueden acceder usuarios anónimos.

Ejecuta el comando mysql_secure_installation para asegurar el servidor MySQL:

# mysql_secure_installation

Te pedirá la contraseña actual de la cuenta root:

Enter the password for user root:

Introduce la contraseña temporal obtenida en el paso anterior y pulsa Intro. Aparecerá el siguiente mensaje:

The existing password for the user account root has expired. Please
set a new password.

New password:
Re-enter new password:
Nota

Esta sección sólo cubrirá los aspectos básicos del cambio de la contraseña de root para conceder acceso al servidor MySQL. Mostraremos más detalles sobre la concesión de privilegios y la creación de una política de contraseñas en el Capítulo 8.

Tendrás que introducir dos veces la nueva contraseña de la cuenta raíz. Las versiones más recientes de MySQL vienen con una política de validación, lo que significa que la nueva contraseña debe respetar unos requisitos mínimos para ser aceptada. Los requisitos por defecto son que las contraseñas deben tener al menos ocho caracteres e incluir:

  • Al menos un carácter numérico

  • Al menos un carácter en minúscula

  • Al menos un carácter en mayúscula

  • Al menos un carácter especial (no alfanumérico)

A continuación, te preguntará si quieres realizar algunos cambios en la configuración inicial. Para garantizar la máxima protección, te recomendamos que elimines los usuarios anónimos, desactives el inicio de sesión de root remoto y elimines la base de datos de prueba (es decir, que respondas afirmativamente a todas las opciones):

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

Remove test database and access to it? (Press y|Y for Yes, any other key
for No) : y

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

Conectarse a MySQL

Este paso es opcional, pero lo utilizamos para verificar que hemos ejecutado todos los pasos correctamente. Utiliza este comando para conectarte al servidor MySQL:

# mysql -u root -p

Te pedirá la contraseña del usuario root. Escribe la contraseña y pulsa Intro:

Enter password:

Si tiene éxito, mostrará la línea de comandos MySQL:

mysql>

Iniciar MySQL 8.0 al iniciar el servidor (opcional)

Para configurar MySQL para que se inicie siempre que arranque el servidor, utiliza el siguiente comando:

# systemctl enable mysqld

Instalación de MariaDB 10.5

Para instalar MariaDB 10.5 en CentOS 7, tendrás que ejecutar pasos similares a los de la distribución MySQL vainilla.

Ser root en Linux

En primer lugar, necesitamos convertirnos en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Instalar el repositorio MariaDB

El siguiente conjunto de comandos descargará el repositorio de MariaDB y lo configurará para el siguiente paso. Ten en cuenta que en los comandos yum, estamos utilizando la opción -y. Esta opción le dice a Linux que asuma que la respuesta es para todas las preguntas siguientes:

# yum install wget -y
# wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
# chmod +x mariadb_repo_setup
# ./mariadb_repo_setup

Instalar MariaDB

Con el repositorio configurado, el siguiente comando instalará la última versión estable de MariaDB y sus dependencias:

# yum install MariaDB-server -y

El final de la salida será similar a esto:

Installed:
  MariaDB-compat.x86_64 0:10.5.8-1.el7.centos                                                                                         MariaDB-server.x86_64 0:10.5.8-1.el7.centos

Dependency Installed:
  MariaDB-client.x86_64 0:10.5.8-1.el7.centos MariaDB-common.x86_64
  0:10.5.8-1.el7.centos boost-program-options.x86_64 0:1.53.0-28.el7
  galera-4.x86_64 0:26.4.6-1.el7.centos        libaio.x86_64
  0:0.3.109-13.el7               lsof.x86_64 0:4.87-6.el7
  pcre2.x86_64 0:10.23-2.el7                  perl.x86_64
  4:5.16.3-299.el7_9              perl-Carp.noarch 0:1.26-244.el7
  ...

Replaced:
  mariadb-libs.x86_64 1:5.5.64-1.el7

Complete!

El símbolo ¡Completado! al final del registro indica que la instalación se ha realizado correctamente.

Iniciar MariaDB

Con MariaDB instalado, inicializa el servicio con el comando systemctl:

# systemctl start mariadb.service

Puedes utilizar este comando para verificar su estado:

# systemctl status mariadb
  mariadb.service - MariaDB 10.5.8 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled;
   vendor preset: disabled)
...
Feb 07 12:55:04 ip-172-30-150-91.ec2.internal systemd[1]: Started
MariaDB 10.5.8 database server.

MariaDB seguro

En este punto, MariaDB se ejecutará en modo inseguro. A diferencia de MySQL 8.0, MariaDB tendrá una contraseña de root vacía para que puedas acceder a ella al instante:

# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 44
Server version: 10.5.8-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.

MariaDB [(none)]>

Puedes ejecutar mysql_secure_installation para asegurar MariaDB igual que lo harías para MySQL 8.0 (para más detalles, consulta la sección anterior). Hay una ligera variación en la salida, con una pregunta extra:

Switch to unix_socket authentication [Y/n] y
Enabled successfully!
Reloading privilege tables..
 ... Success!

Responder cambia la conexión de modo TCP/IP a modo socket Unix. Hablaremos de los distintos tipos de conexión en "Archivos por defecto de MySQL 5.7".

Instalación de Percona Server 8.0

Instala Percona Server 8.0 en CentOS 7 siguiendo el siguiente paso.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Instala el repositorio Percona

Puedes instalar el repositorio Percona yum ejecutando el siguiente comando como root o con sudo:

# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

La instalación crea un nuevo archivo de repositorio, /etc/yum.repos.d/percona-original-release.repo. Ahora, activa el repositorio de Percona Server 8.0 utilizando este comando:

# percona-release setup ps80

Instalar Percona Server 8.0

Para instalar el servidor, ejecuta este comando:

# yum install percona-server-server

Inicializar Percona Server 8.0 con systemctl

Una vez que hayas instalado los binarios de Percona Server 8.0, inicia el servicio:

# systemctl start mysql

Y valida su estatus:

# systemctl status mysql
 mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled;
   vendor preset: disabled)
   Active: active (running) since Sun 2021-02-07 13:22:15 UTC; 6s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 14472 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited,
  status=0/SUCCESS)
 Main PID: 14501 (mysqld)
   Status: "Server is operational"
    Tasks: 39 (limit: 5789)
   Memory: 345.2M
   CGroup: /system.slice/mysqld.service
           └─14501 /usr/sbin/mysqld

Feb 07 13:22:14 ip-172-30-92-109.ec2.internal systemd[1]: Starting
MySQL Server...
Feb 07 13:22:15 ip-172-30-92-109.ec2.internal systemd[1]: Started MySQL
Server.

En este punto, los pasos son similares a los de la instalación vainilla. Consultalas secciones sobre la obtención de la contraseña temporal y la ejecución del comando mysql_secure_installation en "Instalación de MySQL 8.0".

Instalación de MySQL 5.7

Instala MySQL 5.7 en CentOS 7 siguiendo estos pasos.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Instalar el repositorio MySQL 5.7

Puedes instalar el repositorio yum de MySQL 5.7 ejecutando el siguiente comando como root o con sudo:

# yum localinstall\
    https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm -y

La instalación crea un nuevo archivo de repositorio, /etc/yum.repos.d/mysql-community.repo.

Instala los binarios de MySQL 5.7

Para instalar el servidor, ejecuta este comando:

# yum install mysql-community-server -y

Inicializar MySQL 5.7 con systemctl

Una vez que hayas instalado los binarios de MySQL 5.7, inicia el servicio:

# systemctl start mysqld

Y ejecuta este comando para validar su estado:

# systemctl status mysqld

En este punto, los pasos son similares a los de la instalación de MySQL 8.0 vainilla. Consultalas secciones sobre la obtención de la contraseña temporal y la ejecución del comando mysql_secure_installation en "Instalación de MySQL 8.0".

Instalación de Percona Server 5.7

Instala Percona Server 5.7 en CentOS 7 siguiendo estos pasos.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Instala el repositorio Percona

Puedes instalar el repositorio Percona yum ejecutando el siguiente comando como root o con sudo:

# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

La instalación crea un nuevo archivo de repositorio, /etc/yum.repos.d/percona-original-release.repo. Utiliza este comando para activar el repositorio de Percona Server 5.7:

# percona-release setup ps57

Instala los binarios de Percona Server 5.7

Para instalar el servidor, ejecuta este comando:

# yum install Percona-Server-server-57 -y

Inicializar Percona Server 5.7 con systemctl

Una vez que hayas instalado los binarios de Percona Server 5.7, inicia el servicio:

# systemctl start mysql

Y valida su estatus:

# systemctl status mysql

En este punto, los pasos son similares a los de la instalación de MySQL 8.0 vainilla. Consultalas secciones sobre la obtención de la contraseña temporal y la ejecución del comando mysql_secure_installation en "Instalación de MySQL 8.0".

Instalar MySQL en CentOS 8

La versión actual de CentOS es CentOS 8, y está construida sobre RHEL 8. Normalmente, CentOS disfruta del mismo ciclo de vida de soporte de diez años que el propio RHEL. Este ciclo de vida de soporte tradicional daría a CentOS 8 una fecha de fin de vida en 2029. Sin embargo, en diciembre de 2020, un anuncio de Red Hat señaló la intención de poner una lápida en la tumba de CentOS 8 mucho antes, en 2021. (Red Hat dará soporte a CentOS 7 junto con RHEL 7 hasta 2024.) Los usuarios actuales de CentOS tendrán que migrar al propio RHEL o al más reciente proyecto CentOS Stream. Están surgiendo algunos proyectos comunitarios, pero en este momento, el futuro de CentOS es incierto.

Sin embargo, compartiremos aquí los pasos de instalación, ya que muchos usuarios utilizan RHEL 8 y Oracle Linux 8 en la industria.

Instalar MySQL 8.0

La última versión de MySQL 8.0 es disponible para instalar desde el repositorio predeterminado de AppStream utilizando el módulo MySQL que los sistemas CentOS 8 y RHEL 8 activan por defecto. Por tanto, hay alguna variación con respecto al método tradicional yum. Veamos los detalles.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Instalar los binarios de MySQL 8.0

Ejecuta el siguiente comando para instalar el paquete mysql-server y varias de sus dependencias:

# dnf install mysql-server

Cuando se te pida, pulsa y y luego Intro para confirmar que quieres continuar:

Output
...
Transaction Summary
=======================================================================
Install  50 Packages
Upgrade   8 Packages

Total download size: 50 M
Is this ok [y/N]: y

Iniciar MySQL

Llegados a este punto, has instalado MySQL en tu servidor, pero aún no está operativo. El paquete que has instalado configura MySQL para que se ejecute como un servicio de systemd llamado mysqld.service. Para iniciar MySQL, debes utilizar el comando systemctl:

# systemctl start mysqld.service

Comprueba si el servicio está funcionando

Para comprobar si el servicio funciona correctamente, ejecuta el siguiente comando:

# systemctl status mysqld

Si has iniciado MySQL correctamente, la salida mostrará que el servicio MySQL está activo:

# systemctl status mysqld
mysqld.service - MySQL 8.0 database server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled;
   vendor preset: disabled)
   Active: active (running) since Sun 2020-06-21 22:57:57 UTC; 6s ago
  Process: 15966 ExecStartPost=/usr/libexec/mysql-check-upgrade
  (code=exited, status=0/SUCCESS)
  Process: 15887 ExecStartPre=/usr/libexec/mysql-prepare-db-dir
  mysqld.service (code=exited, status=0/SUCCESS)
  Process: 15862 ExecStartPre=/usr/libexec/mysql-check-socket
  (code=exited, status=0/SUCCESS)
 Main PID: 15924 (mysqld)
   Status: "Server is operational"
    Tasks: 39 (limit: 23864)
   Memory: 373.7M
   CGroup: /system.slice/mysqld.service
           └─15924 /usr/libexec/mysqld --basedir=/usr

Jun 21 22:57:57 ip-172-30-222-117.ec2.internal systemd[1]: Starting
MySQL 8.0 database server...
Jun 21 22:57:57 ip-172-30-222-117.ec2.internal systemd[1]: Started
MySQL 8.0 database server.

MySQL 8.0 seguro

Al igual que al instalar MySQL 8.0 en CentOS 7, tienes que ejecutar el comando mysql_secure_installation (para más detalles, consulta la sección correspondiente en "Instalar MySQL 8.0" ). La principal diferencia es que no existe una contraseñatemporal para CentOS 8, así que cuando el script te pida la contraseña de root, déjala en blanco y pulsa Intro.

Iniciar MySQL 8.0 al iniciar el servidor (opcional)

Para configurar MySQL para que se inicie siempre que arranque el servidor, utiliza el siguiente comando:

# systemctl enable mysqld

Instalación de Percona Server 8.0

Para instalar Percona Server 8.0 en CentOS 8, primero tienes que instalar el repositorio. Veamos los pasos.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Instala los binarios de Percona Server 8.0

Ejecuta el siguiente comando para instalar el repositorio Percona:

# yum install https://repo.percona.com/yum/percona-release-latest.noarh.rpm

Cuando se te pida, pulsa y y luego Intro para confirmar que quieres continuar:

Last metadata expiration check: 0:03:49 ago on Sun 07 Feb 2021 01:16:41 AM UTC.
percona-release-latest.noarch.rpm                                                                                                                                                                                                        109 kB/s |  19 kB     00:00
Dependencies resolved.

<snip>

Total size: 19 k
Installed size: 31 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :
  1/1
  Installing       : percona-release-1.0-25.noarch
  1/1
  Running scriptlet: percona-release-1.0-25.noarch
  1/1
* Enabling the Percona Original repository
<*> All done!
* Enabling the Percona Release repository
<*> All done!
The percona-release package now contains a percona-release script that
can enable additional repositories for our newer products. For example, to
enable the Percona Server 8.0 repository use:

  percona-release setup ps80

Note: To avoid conflicts with older product versions, the percona-release setup
command may disable our original repository for some products. For more
information, please visit:

  https://www.percona.com/doc/percona-repo-config/percona-release.html

  Verifying: percona-release-1.0-25.noarch 1/1

Installed:
  percona-release-1.0-25.noarch

Habilitar el repositorio para Percona 8.0

La instalación crea un nuevo archivo de repositorio en /etc/yum.repos.d/percona-original-release.repo. Habilita el repositorio de Percona Server 8.0 utilizando este comando:

# percona-release setup ps80

El comando te pide que desactives el módulo RHEL 8 para MySQL. Puedes hacerlo pulsando y:

* Disabling all Percona Repositories
On RedHat 8 systems it is needed to disable dnf mysql module to install
Percona-Server
Do you want to disable it? [y/N] y
Disabling dnf module...
Percona Release release/noarch YUM repository
6.4 kB/s | 1.4 kB     00:00
Dependencies resolved.

<snip>

Complete!
dnf mysql module was disabled
* Enabling the Percona Server 8.0 repository
* Enabling the Percona Tools repository
<*> All done!

O hazlo manualmente con el siguiente comando:

# dnf module disable mysql

Instala los binarios de Percona Server 8.0

Ya estás preparado para instalar Percona Server 8.0 en tu servidor CentOS 8/RHEL 8. Para evitar que se te pregunte de nuevo si quieres continuar, añade la dirección -y a la línea de comandos:

# yum install percona-server-server -y

Iniciar y asegurar Percona Server 8.0

Ahora que has instalado los binarios de Percona Server 8.0, puedes iniciar el servicio mysqld y configurarlo para que se inicie al arrancar el sistema:

# systemctl enable --now mysqld
# systemctl start mysqld

Comprueba el estado del servicio

Es importante validar que has completado todos los pasos correctamente. Utiliza este comando para comprobar el estado del servicio:

# systemctl status mysqld
mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled;
   vendor preset: disabled)
   Active: active (running) since Sun 2021-02-07 01:30:50 UTC; 28s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 12864 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited,
  status=0/SUCCESS)
 Main PID: 12942 (mysqld)
   Status: "Server is operational"
    Tasks: 39 (limit: 5789)
   Memory: 442.6M
   CGroup: /system.slice/mysqld.service
           └─12942 /usr/sbin/mysqld

Feb 07 01:30:40 ip-172-30-92-109.ec2.internal systemd[1]: Starting MySQL Server..
Feb 07 01:30:50 ip-172-30-92-109.ec2.internal systemd[1]: Started MySQL Server.
Consejo

Si alguna vez quieres desactivar la opción de que MySQL se inicie al arrancar, puedes hacerlo ejecutando el siguiente comando:

# systemctl disable mysqld

Instalación de MySQL 5.7

Instala MySQL 5.7 en CentOS 8 siguiendo estos pasos.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Desactivar el módulo MySQL por defecto

Sistemas como RHEL 8, Oracle Linux 8 y CentOS 8 activan el módulo MySQL por defecto. A menos que este módulo esté desactivado, enmascara los paquetes proporcionados por los repositorios de MySQL, impidiendo que instales una versión diferente a MySQL 8.0. Por tanto, utiliza estos comandos para eliminar este módulo por defecto:

# dnf remove @mysql
# dnf module reset mysql && dnf module disable mysql

Configurar el repositorio MySQL 5.7

No hay repositorio MySQL para CentOS 8, así que utilizaremos el repositorio de CentOS 7 como referencia. Crea un nuevo archivo de repositorio:

# vi /etc/yum.repos.d/mysql-community.repo

Y pega los siguientes datos en el archivo:

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=0

[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/7/$basearch/
enabled=1
gpgcheck=0

[mysql-tools-community]
name=MySQL Tools Community
baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/7/$basearch/
enabled=1
gpgcheck=0

Instala los binarios de MySQL 5.7

Con el módulo por defecto desactivado y el repositorio configurado, ejecuta el siguiente comando para instalar el paquete mysql-server y sus dependencias:

# dnf install mysql-community-server

Cuando se te pida, pulsa y y luego Intro para confirmar que quieres continuar:

Output
...
Install  5 Packages

Total download size: 202 M
Installed size: 877 M
Is this ok [y/N]: y

Iniciar MySQL

Has instalado los binarios de MySQL en tu servidor, pero aún no está operativo. El paquete que has instalado configura MySQL para que se ejecute como un servicio de systemd llamado mysqld.service. Para iniciar MySQL, necesitas utilizar el comando systemctl:

# systemctl start mysqld.service

Comprueba si el servicio está funcionando

Para comprobar que el servicio funciona correctamente, ejecuta el siguiente comando:

# systemctl status mysqld

Si has iniciado MySQL correctamente, la salida mostrará que el servicio MySQL está activo:

# systemctl status mysqld
mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled;
   vendor preset: disabled)
   Active: active (running) since Sun 2021-02-07 18:22:12 UTC; 9s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 14396 ExecStart=/usr/sbin/mysqld --daemonize
  --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
  (code=exited, status=0/SUCCESS)
  Process: 8137 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited,
  status=0/SUCCESS)
 Main PID: 14399 (mysqld)
    Tasks: 27 (limit: 5789)
   Memory: 327.2M
   CGroup: /system.slice/mysqld.service
           └─14399 /usr/sbin/mysqld --daemonize
           --pid-file=/var/run/mysqld/mysqld.pid

Feb 07 18:22:02 ip-172-30-36-53.ec2.internal systemd[1]: Starting MySQL Server...
Feb 07 18:22:12 ip-172-30-36-53.ec2.internal systemd[1]: Started MySQL Server.

MySQL seguro 5.7

En este punto, los pasos son similares a los de la instalación de MySQL 8.0 vainilla. Consultalas secciones sobre la obtención de la contraseña temporal y la ejecución del comando mysql_secure_installation en "Instalación de MySQL 8.0".

Iniciar MySQL 5.7 al iniciar el servidor (opcional)

Para configurar MySQL para que se inicie siempre que arranque el servidor, utiliza el siguiente comando:

# systemctl enable mysqld

Instalar MySQL en Ubuntu 20.04 LTS (Focal Fossa)

Ubuntu es una distribución de Linux basada en Debian que se compone principalmente de software libre y de código abierto. Oficialmente, hay tres ediciones de Ubuntu: Escritorio, Servidor y Core para dispositivos IoT y robots. La versión con la que trabajaremos en este libro es la de Servidor.

Instalar MySQL 8.0

Para Ubuntu, el proceso es ligeramente diferente, ya que Ubuntu utiliza el repositorio apt. Veamos los pasos.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Configurar el repositorio apt

En Ubuntu 20.04 (Focal Fossa), puedes instalar MySQL utilizando el repositorio de paquetes apt. En primer lugar, asegúrate de que tu sistema está actualizado:

# apt update

Instalar MySQL 8.0

A continuación, instala el paquete mysql-server:

# apt install mysql-server -y

El comando apt install instalará MySQL pero no te pedirá que establezcas una contraseña ni que hagas ningún otro cambio de configuración. A diferencia de la instalación de CentOS, Ubuntu inicializa MySQL en modo inseguro.

En instalaciones nuevas de MySQL, deberás ejecutar el script de seguridad incluido en el sistema de gestión de bases de datos (SGBD). Este script cambia algunas de las opciones por defecto menos seguras para los inicios de sesión de root remoto y la base de datos de prueba. Abordaremos este problema en el paso de seguridad después de inicializar MySQL.

Iniciar MySQL

Llegados a este punto, has instalado MySQL en tu servidor, pero aún no está operativo. Para iniciar MySQL, necesitas utilizar el comando systemctl:

# systemctl start mysql

Comprueba si el servicio está funcionando

Para comprobar que el servicio funciona correctamente, ejecuta el siguiente comando:

# systemctl status mysql

Si has iniciado MySQL correctamente, la salida mostrará que el servicio MySQL está activo:

mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled;
     vendor preset: enabled)
     Active: active (running) since Sun 2021-02-07 20:19:51 UTC; 22s ago
    Process: 3514 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
    (code=exited, status=0/SUCCESS)
   Main PID: 3522 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 1164)
     Memory: 332.7M
     CGroup: /system.slice/mysql.service
             └─3522 /usr/sbin/mysqld

Feb 07 20:19:50 ip-172-30-202-86 systemd[1]: Starting MySQL Community Server...
Feb 07 20:19:51 ip-172-30-202-86 systemd[1]: Started MySQL Community Server.

MySQL 8.0 seguro

En este punto, los pasos son similares a los de la instalación vainilla en CentOS 7 (ver "Instalar MySQL 8.0"). Sin embargo, MySQL 8.0 en Ubuntu se inicializa sin asegurar, lo que significa que la contraseña de root está vacía. Para asegurarla, ejecuta mysql_secure_installation:

# mysql_secure_installation

Esto te llevará a través de una serie de indicaciones para realizar algunos cambios en las opciones de seguridad de la instalación de MySQL, que son similares a las de la versión de CentOS descrita anteriormente.

Aquí hay una pequeña variación porque en Ubuntu es posible cambiar la política de validación, que gestiona la fortaleza de la contraseña. En este ejemplo, estamos estableciendo la política de validación en MEDIO (1):

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
Please set the password for root here.

New password:

Re-enter new password:

Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other
key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL 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.

Instalación de Percona Server 8

Instala Percona Server 8.0 en Ubuntu 20.04 LTS siguiendo estos pasos.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Instala el GNU Privacy Guard

Oracle firma los paquetes descargables de MySQL con GNU Privacy Guard (GnuPG), una alternativa de código abierto al conocido Pretty Good Privacy (PGP) creado por Phil Zimmermann. La mayoría de las distribuciones de Linux vienen con GnuPG instalado por defecto, pero en este caso tienes que instalarlo tú:

# apt-get install gnupg2 -y

Obtén los paquetes del repositorio del sitio web de Percona

A continuación, recupera los paquetes del repositorio Percona con el comando wget:

# wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)\
    _all.deb

Instala el paquete descargado con dpkg

Una vez descargado, instala el paquete con el siguiente comando:

# dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb

A continuación, puedes comprobar el repositorio configurado en el archivo /etc/apt/sources.list.d/percona-original-release.list.

Habilitar el repositorio

El siguiente paso es habilitar Percona Server 8.0 en el repositorio y actualizarlo:

# percona-release setup ps80
# apt update

Instala los binarios de Percona Server 8.0

A continuación, instala el paquete percona-server-server con el comando apt-get install:

# apt-get install percona-server-server -y

Iniciar MySQL

Llegados a este punto, has instalado MySQL en tu servidor, pero aún no está operativo. Para iniciar MySQL, necesitas utilizar el comando systemctl:

# systemctl start mysql

Comprueba si el servicio está funcionando

Para comprobar que el servicio funciona correctamente, ejecuta el siguiente comando:

# systemctl status mysql

En este punto, Percona Server se ejecutará en modo inseguro. Ejecutar mysql_secure_installation te llevará a través de una serie de indicaciones para realizar algunos cambios en las opciones de seguridad de tu instalación MySQL, que son idénticas a las descritas para instalar MySQL 8.0 vainilla en la sección anterior.

Instalación de MariaDB 10.5

Instala MariaDB 10.5 en Ubuntu 20.04 LTS siguiendo estos pasos.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Actualiza el sistema con el gestor de paquetes apt

Asegúrate de que tu sistema está actualizado e instala el paquete software-properties-common con los siguientescomandos:

# apt update && sudo apt upgrade
# apt -y install software-properties-common

Este paquete contiene los archivos comunes para las propiedades del software, como el backend D-Bus y una abstracción de los repositorios apt utilizados.

Importar la clave GPG de MariaDB

Ejecuta el siguiente comando para añadir la clave del repositorio al sistema:

# apt-key adv --fetch-keys \
    'https://mariadb.org/mariadb_release_signing_key.asc'

Añade el repositorio MariaDB

Después de importar la clave GPG del repositorio, tienes que añadir el repositorio apt ejecutando el siguiente comando:

# add-apt-repository \
    'deb [arch=amd64] http://mariadb.mirror.globo.tech/repo/10.5/ubuntu focal main'
Nota

Existen diferentes espejos para descargar el repositorio de MariaDB. En este ejemplo, utilizamos http://mariadb.mirror.globo.tech.

Instalar los binarios de MariaDB 10.5

El siguiente paso es la instalación del Servidor MariaDB:

# apt install mariadb-server mariadb-client

Comprueba si el servicio está funcionando

Para comprobar si el servicio MariaDB se está ejecutando correctamente, ejecuta el siguiente comando:

# systemctl status mysql

En este punto, MariaDB 10.5 se ejecutará en modo inseguro. Ejecutar mysql_secure_installation te llevará a través de una serie de indicaciones para realizar algunos cambios en las opciones de seguridad de tu instalación MySQL, que son idénticas a las descritas para instalar MySQL 8.0 vainilla en Ubuntu anteriormente en esta sección.

Instalación de MySQL 5.7

Instala MySQL 5.7 en Ubuntu 20.04 LTS siguiendo estos pasos.

Ser root en Linux

En primer lugar, necesitas convertirte en root. Consulta las instrucciones en "Instalación de MySQL 8.0".

Actualiza el sistema con el gestor de paquetes apt

Puedes asegurarte de que tu sistema está actualizado e instalar el paquete software-properties-common con el siguiente comando:

# apt update -y && sudo apt upgrade -y

Añadir y configurar el repositorio MySQL 5.7

Añade el repositorio MySQL ejecutando los siguientes comandos:

# wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb
# dpkg -i mysql-apt-config_0.8.12-1_all.deb

En el indicador, elige "ubuntu bionic" como se muestra en la Figura 1-1 y haz clic en Aceptar.

lm2e 0101
Figura 1-1. Elige "ubuntu bionic".

El siguiente indicador muestra MySQL 8.0 elegido por defecto(Figura 1-2). Con esta opción seleccionada, pulsa Intro.

lm2e 0102
Figura 1-2. Elige la opción Servidor MySQL y Cluster

En la siguiente opción, como se muestra en la Figura 1-3, elige MySQL 5.7 y haz clic en Aceptar.

lm2e 0103
Figura 1-3. Elige la opción MySQL 5.7

Tras volver a la pantalla principal, pulsa Aceptar para salir, como se muestra en la Figura 1-4.

lm2e 0104
Figura 1-4. Pulsa OK para salir

A continuación, tienes que actualizar los paquetes de MySQL:

# apt-get update -y

Valida la política de Ubuntu para instalar MySQL 5.7:

# apt-cache policy mysql-server

Comprueba la salida para ver qué versión de MySQL 5.7 está disponible:

# apt-cache policy mysql-server
mysql-server:
  Installed: (none)
  Candidate: 8.0.23-0ubuntu0.20.04.1
  Version table:
     8.0.23-0ubuntu0.20.04.1 500
        500 http://br.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
        500 http://br.archive.ubuntu.com/ubuntu focal-security/main amd64
        Packages
     8.0.19-0ubuntu5 500
        500 http://br.archive.ubuntu.com/ubuntu focal/main amd64 Packages
     5.7.33-1ubuntu18.04 500
        500 http://repo.mysql.com/apt/ubuntu bionic/mysql-5.7 amd64 Packages

Instala los binarios de MySQL 5.7

Ahora que has comprobado que la versión MySQL 5.7 está disponible(5.7.33-1ubuntu18.04), instálala:

# apt-get install mysql-client=5.7.33-1ubuntu18.04 -y
# apt-get install mysql-community-server=5.7.33-1ubuntu18.04 -y
# apt-get install mysql-server=5.7.33-1ubuntu18.04 -y

El proceso de instalación te pedirá que elijas la contraseña de root, como se muestra en la Figura 1-5.

lm2e 0105
Figura 1-5. Define la contraseña de root y pulsa OK

Comprueba si el servicio está funcionando

Para comprobar si el servicio MySQL 5.7 se está ejecutando correctamente, ejecuta el siguiente comando:

# systemctl status mysql

En este punto, MySQL 5.7 tendrá una contraseña establecida para el usuario root. Sin embargo, aún querrás ejecutar mysql_secure_installation para establecer la política de contraseñas, eliminar el inicio de sesión remoto de root y los usuarios anónimos, y eliminar la base de datos de prueba. Consulta "Proteger MySQL 8.0" para más detalles.

Instalar MySQL en macOS Big Sur

MySQL para macOS está disponible en varias formas diferentes. Dado que la mayoría de las veces MySQL se instala en macOS con fines de desarrollo, sólo mostraremos cómo instalarlo utilizando el instalador nativo de macOS (el archivo .dmg ). Ten en cuenta que también es posible utilizar el tarball para instalar MySQL en macOS.

Instalar MySQL 8

Primero, descarga el archivo .dmg de MySQL del sitio web de MySQL.

Consejo

Según Oracle, los paquetes de macOS Catalina funcionan para Big Sur.

Una vez descargado, ejecuta el paquete para iniciar el procedimiento de instalación, como se muestra en la Figura 1-6.

lm2e 0106
Figura 1-6. Paquete .dmg de MySQL 8.0.23

A continuación, debes autorizar la ejecución de MySQL, como se muestra en la Figura 1-7.

lm2e 0107
Figura 1-7. Solicitud de autorización MySQL 8.0.23

La Figura 1-8 muestra la pantalla de bienvenida del instalador.

lm2e 0108
Figura 1-8. Pantalla inicial de MySQL 8.0.23

La Figura 1-9 muestra el acuerdo de licencia. Incluso con el software de código abierto, es necesario aceptar los términos de la licencia; de lo contrario, no podrás continuar.

lm2e 0109
Figura 1-9. Acuerdo de licencia de MySQL 8.0.23

Ahora puedes definir la ubicación y personalizar la instalación, como se muestra en la Figura 1-10.

lm2e 0110
Figura 1-10. Personalización de la instalación de MySQL 8.0.23

Vas a proceder con la instalación estándar. Tras hacer clic en Instalar, es posible que se te pida que introduzcas la contraseña de usuario de macOS para ejecutar la instalación con privilegios superiores, como muestra la Figura 1-11.

lm2e 0111
Figura 1-11. Solicitud de autorización de macOS

Una vez que hayas instalado MySQL, el proceso de instalación te pedirá que elijas la encriptación de la contraseña. Deberías utilizar el método de autenticación más reciente (la opción por defecto), como se muestra en la Figura 1-12, que es más seguro.

lm2e 0112
Figura 1-12. Cifrado de contraseñas en MySQL 8.0.23

El último paso consiste en crear la contraseña de root e inicializar MySQL, como se muestra en la Figura 1-13.

lm2e 0113
Figura 1-13. Contraseña raíz de MySQL 8.0.23

Ya has instalado MySQL Server, pero no se carga (ni se inicia) por defecto. Para iniciarlo, abre Preferencias del Sistema y busca el icono de MySQL, como se muestra en la Figura 1-14.

lm2e 0114
Figura 1-14. MySQL en Preferencias del Sistema

Haz clic en el icono para abrir el panel MySQL. Deberías ver algo similar a la Figura 1-15.

lm2e 0115
Figura 1-15. Opciones de inicio de MySQL

Además de la opción obvia, que es iniciar el proceso MySQL, hay un panel de configuración (con la ubicación de los archivos MySQL) y una opción para reinicializar la base de datos (ya la inicializaste durante la instalación). Inicia el proceso MySQL. Puede que se te pida de nuevo la contraseña de administrador.

Con MySQL en marcha, es posible validar la conexión y confirmar que MySQL Server funciona correctamente. Puedes utilizar MySQL Workbench para comprobarlo, o instalar el cliente MySQL utilizando brew:

$ brew install mysql-client

Una vez que hayas instalado el cliente MySQL, puedes conectarte con la contraseña que definiste en la Figura 1-13. En el terminal, ejecuta el siguiente comando:

$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.23 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type help; or \h for help. Type \c to clear the current input statement.
mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 8.0.23    |
+-----------+
1 row in set (0.00 sec)

Instalar MySQL en Windows 10

Oracle proporciona un Instalador de MySQL para Windows para facilitar la instalación. Ten en cuenta que el Instalador de MySQL es una aplicación de 32 bits, pero puede instalar MySQL en binarios de 32 y 64 bits. Para iniciar el proceso de instalación, debes ejecutar el archivo instalador y elegir el tipo de instalación, como se muestra en la Figura 1-16.

Elige el tipo de configuración Predeterminado de Desarrollador y haz clic en Siguiente. No entraremos en detalles sobre las demás opciones porque no recomendamos utilizar MySQL para sistemas de producción, principalmente porque el ecosistema MySQL está desarrollado para Linux.

lm2e 0116
Figura 1-16. Personalización de la instalación de MySQL 8.0.23 en Windows

A continuación, el instalador comprueba si se cumplen todos los requisitos(Figura 1-17).

lm2e 0117
Figura 1-17. Requisitos de instalación

Haz clic en Ejecutar. Puede que sea necesario instalar Microsoft Visual C++(Figura 1-18).

lm2e 0118
Figura 1-18. Instala Microsoft Visual C++ si es necesario

Haz clic en Siguiente, y el instalador mostrará los productos que están listos para instalar(Figura 1-19).

lm2e 0119
Figura 1-19. Haz clic en Ejecutar para instalar el software MySQL

Haz clic en Ejecutar y llegarás a la pantalla donde puedes configurar las propiedades de MySQL. Puedes utilizar la configuración por defecto para TCP/IP y el puerto del Protocolo X, como se muestra en la Figura 1-20, o puedes personalizarlos si lo deseas.

A continuación, elegirás el método de autenticación. Selecciona la versión más nueva que es más segura, como se muestra en la Figura 1-21.

lm2e 0120
Figura 1-20. Tipo y opciones de configuración de red
lm2e 0121
Figura 1-21. Cifrado de contraseñas: utiliza contraseñas basadas en SHA-256

A continuación, especifica la contraseña del usuario root y si quieres añadir usuarios adicionales a la base de datos MySQL, como se muestra en la Figura 1-22.

lm2e 0122
Figura 1-22. Configurar usuarios

Con los usuarios configurados, define el nombre del servicio y el usuario que ejecutará el servicio, como se muestra en la Figura 1-23.

lm2e 0123
Figura 1-23. Configurar el nombre del servicio

Cuando hagas clic en Siguiente, el instalador comenzará a configurar MySQL. Una vez que el instalador de MySQL finalice su ejecución, deberías ver algo parecido a la Figura 1-24.

lm2e 0124
Figura 1-24. Si la instalación ha ido bien, no hay errores

Ahora tu servidor de base de datos está operativo. Como has seleccionado el perfil Desarrollador, el instalador realizará la instalación del Enrutador MySQL. El Enrutador MySQL no es esencial para esta configuración, y como no recomendamos Windows para producción, nos saltaremos esta parte. Nos sumergiremos en los detalles del router en "Router MySQL".

Ahora puedes validar tu servidor utilizando MySQL Workbench, como se muestra en la Figura 1-25. Deberías ver una opción de conexión MySQL.

lm2e 0125
Figura 1-25. La opción de conexión MySQL en el MySQL Workbench

Haz doble clic en la conexión y Workbench te pedirá que introduzcas la contraseña, como se muestra en la Figura 1-26.

lm2e 0126
Figura 1-26. Introduce la contraseña de root para conectarte

Ya puedes empezar a utilizar MySQL en tu plataforma Windows, como se muestra en la Figura 1-27.

lm2e 0127
Figura 1-27. Ya puedes empezar a probar tu entorno

Contenido del directorio MySQL

Durante el proceso de instalación, MySQL crea todos los archivos necesarios para poner en marcha el servidor. MySQL almacena sus archivos en un directorio llamado directorio de datos. Los administradores de bases de datos (DBA) suelen referirse a él como datadir, que es el nombre del parámetro de MySQL que almacena la ruta a este directorio. La ubicación por defecto en las distribuciones Linux es /var/lib/mysql. Puedes comprobar su ubicación ejecutando el siguiente comando en la instancia de MySQL:

mysql> SELECT @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

Archivos por defecto de MySQL 5.7

La siguiente lista describe brevemente los archivos y subdirectorios que suelen encontrarse en el directorio de datos:

Los archivos de registro REDO

MySQL crea los archivos de registro de rehacer como ib_logfile0 y ib_logfile1 en el directorio de datos. Escribe en los archivos de registro de rehacer de forma circular, para que los archivos no crezcan más allá de su tamaño de configuración (configurado por innodb_log_file_size). Como en cualquier otro sistema de gestión de bases de datos relacionales (RDBMS) compatible con ACID, los archivos de rehacer son fundamentales para proporcionar durabilidad a los datos y capacidad de recuperación en caso de fallo.

El archivo auto.cnf

MySQL 5.6 introdujo el archivo auto.cnf. Sólo tiene una sección [auto] que contiene una única server_uuid y un valor. El server_uuid crea una firma única para el servidor, y la capa de replicación la utiliza para comunicarse con diferentes servidores para replicar datos.

Advertencia

MySQL crea automáticamente el archivo auto.cnf en el directorio de datos cuando se inicializa, y este archivo no debe modificarse. Explicamos los detalles en el Capítulo 9.

Los archivos *.pem

En resumen, estos archivos permiten utilizar conexiones cifradas para la comunicación entre un cliente y el servidor MySQL. Las conexiones cifradas son una parte fundamental de la capa de seguridad de la red para evitar accesos no autorizados mientras los datos están en tránsito desde la aplicación al servidor MySQL. MySQL 5.7 habilita SSL por defecto y crea también los certificados. Sin embargo, es posible utilizar certificados proporcionados por diferentes autoridades de certificación (CA) del mercado.

El subdirectorio performance_schema

El Esquema de Rendimiento de MySQL es una función para que permite monitorizar la ejecución del Servidor MySQL a bajo nivel durante el tiempo de ejecución. Cuando podemos utilizar el Esquema de Rendimiento para monitorizar una métrica concreta, decimos que MySQL tiene instrumentación. Por ejemplo, los instrumentos del Esquema de Rendimiento pueden proporcionar el número de usuariosconectados:

mysql> SELECT * FROM performance_schema.users;
+-----------------+---------------------+-------------------+
| USER            | CURRENT_CONNECTIONS | TOTAL_CONNECTIONS |
+-----------------+---------------------+-------------------+
| NULL            |                  40 |                46 |
| event_scheduler |                   1 |                 1 |
| root            |                   0 |                 1 |
| rsandbox        |                   2 |                 3 |
| msandbox        |                   1 |                 2 |
+-----------------+---------------------+-------------------+
5 rows in set (0.03 sec)
Nota

Mucha gente se sorprende al ver NULL en la columna user. El valor NULL se utiliza para hilos internos o para una sesión de usuario que no ha podido autenticarse. Lo mismo ocurre con la columna host de la tabla performance_schema.accounts:

mysql> SELECT user, host,
        total_connections AS cxns
    -> FROM performance_schema.accounts
        ORDER BY cxns DESC;
+-----------------+-----------+------+
| user            | host      | cxns |
+-----------------+-----------+------+
| NULL            | NULL      |   46 |
| rsandbox        | localhost |    3 |
| msandbox        | localhost |    2 |
| event_scheduler | localhost |    1 |
| root            | localhost |    1 |
+-----------------+-----------+------+
5 rows in set (0.00 sec)

Aunque la instrumentación existe desde MySQL 5.6, fue en MySQL 5.7 cuando obtuvo muchas mejoras y se convirtió en una parte fundamental de las herramientas del DBA para investigar y solucionar problemas a nivel de MySQL.

El archivo ibtmp1

Cuando la aplicación necesita crear tablas temporales o MySQL necesita utilizar una tabla temporal interna en disco, MySQL las crea en un espacio de tablas temporales compartido. El comportamiento por defecto es crear un archivo de datos autoampliable llamado ibtmp1 que es ligeramente superior a 12 MB (su tamaño se controla con el parámetroinnodb_temp_data_file_path ).

El archivo ibdata1

El archivo ibdata1 es probablemente el archivo más famoso del ecosistema MySQL. En MySQL 5.7 y versiones anteriores, contiene los datos del diccionario de datos InnoDB, el búfer de doble escritura, el búfer de cambios y los registros de deshacer. También puede contener datos de tablas e índices si desactivamos la opcióninnodb_file_per_table . Cuando innodb_file_per_table está activado, cada tabla de usuario tiene untablespace y un archivo dedicado. Ten en cuenta que es posible tener varios archivos ibdata en el directorio de datos de MySQL.

Nota

En MySQL 8.0, algunos de estos componentes se eliminaron de ibdata1 y se asignaron a archivos independientes. Los componentes restantes son la tabla de búfer de cambios y los datos de índice si las tablas secrean en el espacio de tablas del sistema (desactivando el innodb_file_per_table).

El archivo mysql.sock

Se trata de un archivo de socket Unix que el servidor utiliza para la comunicación con los clientes locales. Este archivo sólo existe cuando MySQL se está ejecutando, y eliminarlo o crearlo manualmente puede provocar problemas.

Nota

Un socket Unix es un mecanismo de comunicación entre procesos que permite el intercambio bidireccional de datos entre procesos que se ejecutan en la misma máquina. Los sockets IP (principalmente los sockets TCP/IP) son un mecanismo que permite la comunicación entre procesos a través de la red.

Puedes conectarte al Servidor MySQL en Linux utilizando dos métodos: el protocolo TCP o un socket. Por motivos de seguridad, si la aplicación y MySQL están en el mismo servidor, puedes desactivar las conexiones TCP remotas. Hay dos formas de hacerlo en el Servidor MySQL: establecer el protocolo bind-address a 127.0.0.1 en lugar del valor por defecto * (que acepta conexiones TCP/IP de todo el mundo), o modificar el parámetroskip-networking , que desactiva las conexiones de red a MySQL.

El subdirectorio mysql

El directorio mysql corresponde al esquema del sistema MySQL, que contiene la información del Servidor MySQL mientras se ejecuta. Por ejemplo, incluye información sobre los usuarios y sus privilegios, las tablas de zonas horarias y la replicación. Puedes ver los archivos nombrados según sus respectivos nombres de tabla con el comando ls:

# cd /var/lib/mysql
# ls -l mysql/

-rw-r-----. 1 vinicius.grippa percona    8820 Feb 20 15:51 columns_priv.frm
-rw-r-----. 1 vinicius.grippa percona       0 Feb 20 15:51 columns_priv.MYD
-rw-r-----. 1 vinicius.grippa percona    4096 Feb 20 15:51
columns_priv.MYI
-rw-r-----. 1 vinicius.grippa percona    9582 Feb 20 15:51 db.frm
-rw-r-----. 1 vinicius.grippa percona     976 Feb 20 15:51 db.MYD
-rw-r-----. 1 vinicius.grippa percona    5120 Feb 20 15:51 db.MYI
-rw-r-----. 1 vinicius.grippa percona      65 Feb 20 15:51 db.opt
-rw-r-----. 1 vinicius.grippa percona    8780 Feb 20 15:51 engine_cost.frm
-rw-r-----. 1 vinicius.grippa percona   98304 Feb 20 15:51 engine_cost.ibd
...
-rw-r-----. 1 vinicius.grippa percona   10816 Feb 20 15:51 user.frm
-rw-r-----. 1 vinicius.grippa percona    1292 Feb 20 15:51 user.MYD
-rw-r-----. 1 vinicius.grippa percona    4096 Feb 20 15:51 user.MYI

Archivos por defecto de MySQL 8.0

MySQL 8.0 introdujo algunos cambios en el núcleo de los datos estructura de directorios. Algunos de estos cambios están relacionados con la implementación del nuevo diccionario de datos, y otros con la mejora de la gestión de la base de datos. La siguiente lista describe los nuevos archivos y cambios:

Los archivos del tablespace de deshacer

MySQL (InnoDB) utiliza archivos de deshacer para deshacer las transacciones de que necesitan ser revertidas y asegurar transacciones aisladas siempre que necesite realizar una lectura consistente.

A partir de MySQL 8.0, los archivos de registro de deshacer se separaron del tablespace del sistema(ibdata1) y se colocaron en el directorio de datos. También es posible establecer otra ubicación cambiando el parámetroinnodb_undo_directory .

Los archivos .dblwr (introducidos en la versión 8.0.20)

El búfer de doble escritura se encarga de escribir en el disco las páginas arrastradas desde el conjunto de búferes antes de que MySQL escriba las páginas en los archivos de datos. Los nombres de archivo de doble escritura tienen el siguiente formato: #ib_<tamaño_de_página>_<número_de_archivo>.dblwr (por ejemplo, #ib_16384_0.dblwr, #ib_16384_0.dblwr). Es posible cambiar la ubicación de estos archivos modificando el parámetroinnodb_doublewrite_dir .

El archivo mysql.ibd (introducido en la versión 8.0)

En MySQL 5.7, las tablas de diccionario y las tablas de sistema almacenaban los datos y metadatos en el directorio mysql dentro del datadir. En MySQL 8.0, todo esto se almacena en el archivo mysql.ibd y está protegido por los mecanismos InnoDB para garantizar la coherencia.

Utilizar la interfaz de línea de comandos

El binario mysql es un sencillo intérprete de comandos SQL con funciones de edición de la línea de entrada . Su uso es sencillo (ya lo hemos utilizado unas cuantas veces durante el proceso de instalación). Para invocarlo, ejecuta el siguiente comando:

# mysql

Podemos ampliar su funcionalidad ejecutando consultas en él:

# mysql -uroot -pseKret -e "SHOW ENGINE INNODB STATUS\G"

Y podemos ejecutar comandos más avanzados, enlazándolos con otros comandos para realizar tareas más complejas. Por ejemplo, podemos extraer un volcado de unabase de datos, enviarlo a través de la red y restaurarlo en otro servidor MySQL en la misma línea de comandos:

# mysql -e "SHOW MASTER STATUS\G" && nice -5 mysqldump \
    --all-databases --single-transaction -R --master-data=2 --flush-logs \
    --log-error=/tmp/donor.log --verbose=TRUE | ssh mysql@192.168.0.1 mysql \
    1> /tmp/receiver.log 2>&1

MySQL 8.0 introdujo MySQL Shell, que es mucho más potente que su predecesor. MySQL Shell soporta los lenguajes JavaScript, Python y SQL, proporcionando capacidades de desarrollo y administración para el Servidor MySQL. Entraremos en más detalle sobre esto en "MySQL Shell".

Utilizar Docker

Con la llegada de la virtualización y su popularización con los servicios en la nube , han surgido muchas plataformas, entre ellas Docker. Nacido en 2013, Docker es una solución que ofrece una forma portátil y flexible de implementar software. Proporciona aislamiento de recursos mediante el uso de funciones de Linux como los cgroups y los espacios de nombres del núcleo.

Docker es útil para los DBA que a menudo necesitan instalar una versión específica de MySQL, MariaDB o Percona Server para MySQL para realizar algunos experimentos. Con Docker, es posible implementar una instancia MySQL en segundos para realizar algunas pruebas. Una vez terminadas las pruebas, puedes destruir la instancia y liberar los recursos del sistema operativo para otras tareas. Todos los procesos de despliegue de una máquina virtual (VM), instalación de paquetes y configuración de la base de datos son más sencillos cuando se utiliza Docker.

Instalar Docker

Una ventaja de utilizar Docker es que una vez que el servicio está en marcha, los comandos son los mismos en todos los sistemas operativos. Que los comandos sean los mismos significa que la curva de aprendizaje para utilizar Docker es más rápida en comparación con el aprendizaje de diferentes versiones de Linux como CentOS y Ubuntu, por ejemplo.

El proceso de instalación de Docker es, en algunos aspectos, similar al de instalación de MySQL. Para Windows y macOS basta con instalar los binarios, y después el servicio está en marcha. Para los sistemas operativos basados en Linux sin interfaz gráfica, el proceso requiere configurar el repositorio.

Instalar Docker en CentOS 7

Los paquetes de CentOS para Docker son, en general, más antiguos que los disponibles para RHEL y en los repositorios oficiales de Docker. En el momento de escribir estas líneas, la versión de Docker que proporcionan los repositorios normales de CentOS es la 1.13.1, mientras quela versión estable del upstream es la 20.10.3. No hay diferencia a efectos de este libro, pero siempre recomendamos utilizar la última versión para entornos de producción.

Ejecuta el siguiente comando para instalar el paquete Docker desde el repositorio CentOS por defecto:

# yum install docker -y

Si quieres instalar Docker desde el repositorio upstream para asegurarte de que utilizas la última versión, sigue estos pasos:

  1. Instala yum-utils para activar el comando yum-config-manager:

    # yum install yum-utils -y
  2. Utiliza yum-config-manager para añadir el repositorio docker-ce:

    # yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
  3. Instala los paquetes necesarios:

    # yum install docker-ce docker-ce-cli containerd.io -y
  4. Inicia el servicio Docker:

    # systemctl start docker
  5. Activa el autoarranque del servicio Docker tras reiniciar el sistema:

    # systemctl enable --now docker
  6. Para validar si el servicio Docker se está ejecutando, ejecuta el comando systemctl status:

    # systemctl status docker
  7. Para verificar que Docker Engine está instalado correctamente, puedes ejecutar el contenedor hello-world:

    # docker run hello-world

Instalar Docker en Ubuntu 20.04 (Focal Fossa)

Para instalar la última versión de Docker desde el repositorio upstream, elimina primero cualquier versión anterior de Docker (llamada docker, docker.io o docker-engine). Desinstálalas con este comando:

# apt-get remove -y docker docker-engine docker.io containerd runc

Con el repositorio por defecto eliminado, puedes iniciar el proceso de instalación:

  1. Asegúrate de que Ubuntu está actualizado con este comando:

    # apt-get update -y
  2. Instala paquetes para permitir que apt utilice un repositorio a través de HTTPS:

    # apt-get install -y \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
  3. A continuación, añade la clave GPG oficial de Docker:

    # curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo \
        apt-key add -
  4. Con la clave en su sitio, añade el repositorio estable de Docker:

    # add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
  5. Ahora, utiliza el comando apt para instalar los paquetes Docker:

    # apt-get install -y docker-ce docker-ce-cli containerd.io
  6. Ubuntu iniciará el servicio por ti, pero puedes comprobarlo ejecutando este comando:

    # systemctl status docker
  7. Para hacer que el servicio Docker se inicie automáticamente cuando se reinicie el SO, utiliza:

    # systemctl enable --now docker
  8. Comprueba la versión de Docker con la que instalaste:

    # docker --version
  9. Para verificar que Docker Engine está instalado correctamente, puedes ejecutar el contenedor hello-world:

    # docker run hello-world

Implementación del contenedor MySQL

Una vez que tengas el motor Docker instalado y en funcionamiento, el siguiente paso es la implementación del contenedor Docker MySQL.

Advertencia

Hemos diseñado las siguientes instrucciones para que una instancia de prueba funcione rápida y fácilmente; ¡no las utilices para unaimplementación de producción!

Para implementar la última versión de MySQL con Docker, ejecuta este comando:

# docker run --name mysql-latest \
  -p 3306:3306 -p 33060:33060 \
  -e MYSQL_ROOT_HOST=% -e
  MYSQL_ROOT_PASSWORD='learning_mysql' \
  -d mysql/mysql-server:latest

Docker Engine lanzará la última versión de la instancia MySQL y será accesible remotamente desde cualquier lugar con la contraseña de root especificada. Instalar MySQL con Docker significa que no tienes acceso a ninguna de las herramientas, utilidades o bibliotecas estándar disponibles en un host tradicional (bare metal o VM). Tendrás que implementar estas herramientas por separado o utilizar los comandos incluidos en la imagen Docker si los necesitas.

A continuación, conéctate al contenedor MySQL utilizando el cliente MySQL:

# docker exec -it mysql-latest mysql -uroot -plearning_mysql

Como has mapeado el puerto TCP 3306 en el contenedor al puerto 3306 en el host Docker con el parámetro -p 3306:3306, puedes conectarte a la base de datos MySQL desde cualquier cliente MySQL (Workbench, MySQL Shell) disponible que pueda alcanzar el host (nombre de host o IP) y ese puerto.

Veamos algunos comandos para gestionar el contenedor.

Para detener el contenedor Docker MySQL, ejecuta:

# docker stop mysql-latest

No intentes utilizar docker run para iniciar de nuevo el contenedor. En su lugar, utiliza esto:

# docker start mysql-latest

Para investigar un problema -por ejemplo, si el contenedor no se inicia- accede a sus registros utilizando este comando:

# docker logs mysql-latest

Para eliminar el contenedor Docker que has creado, ejecuta

# docker stop mysql-latest
# docker rm mysql-latest

Para comprobar cuáles y cuántos contenedores Docker se están ejecutando en el host, utiliza

# docker ps

Es posible personalizar la parametrización de MySQL utilizando opciones de la línea de comandos de Docker Engine. Para configurar el tamaño del buffer pool de InnoDB y el método de descarga, ejecuta lo siguiente:

# docker run --name mysql-latest \
  -p 3306:3306 -p 33060:33060  \
  -e MYSQL_ROOT_HOST=% -e
  MYSQL_ROOT_PASSWORD='strongpassword' \
  -d mysql/mysql-server:latest \
  --innodb_buffer_pool_size=256M \
  --innodb_flush_method=O_DIRECT

Para ejecutar una versión de MySQL distinta de la última, comprueba primero que está disponible en Docker Hub. Por ejemplo, supongamos que quieres ejecutar MySQL 5.7.31. El primer paso es comprobar la lista oficial de Imágenes Docker de MySQL en Docker Hub para ver si existe.

Una vez hayas confirmado su existencia, ejecútalo con el siguiente comando:

# docker run --name mysql-5.7.31 \
  -p 3307:3306 -p 33061:33060  \
  -e MYSQL_ROOT_HOST=% -e \
  MYSQL_ROOT_PASSWORD='learning_mysql' \
  -d mysql/mysql-server:5.7.31

Es posible ejecutar varias instancias Docker de MySQL al mismo tiempo, pero un problema potencial son los conflictos de puertos TCP. En el ejemplo anterior, fíjate en que hemos mapeado diferentes puertos host para el contenedor mysql-5.7.31 (3307 y 33061). Además, el nombre del contenedor debe ser único.

Implementación de contenedores MariaDB y Percona Server

Sigue los mismos pasos descritos en la sección anterior para desplegar un contenedor MySQL para desplegar un contenedor MariaDB o Percona Server. La principal diferencia es que utilizan imágenes Docker diferentes y tienen sus propios repositorios oficiales.

Para implementar un contenedor MariaDB, ejecuta:

# docker run --name maria-latest \
  -p 3308:3306 \
  -e MYSQL_ROOT_HOST=% -e \
  MYSQL_ROOT_PASSWORD='learning_mysql' \
  -d mariadb:latest

Y para Percona Server, ejecuta

# docker run --name ps-latest \
  -p 3309:3306 -p 33063:33060 \
  -e MYSQL_ROOT_HOST=% -e \
  MYSQL_ROOT_PASSWORD='learning_mysql' \
  -d percona/percona-server:latest \
  --innodb_buffer_pool_size=256M \
  --innodb_flush_method=O_DIRECT
Nota

Estamos asignando puertos diferentes para MariaDB (-p 3308:3306) y Percona (-p 3309:3306) porque estamos implementando todos los contenedores en el mismo host:

# docker ps
CONTAINER ID            IMAGE
5e487dd41c3e            percona/percona-server:latest

COMMAND                 CREATED           STATUS
"/docker-entrypoint..." About a minute ago Up 51 seconds
"docker-entrypoint..."  2 minutes ago      Up 2 minutes

PORTS                   NAMES
0.0.0.0:3309->3306/tcp, ps-latest
0.0.0.0:33063->33060/tcp
f5a217f1537b            mariadb:latest
0.0.0.0:3308->3306/tcp  maria-latest

Si estás implementando un único contenedor, puedes utilizar el puerto 3306 o cualquier puerto personalizado que desees utilizar.

Utilizar Sandboxes

En el desarrollo de software, un sandbox es un entorno de pruebas que aísla los cambios de código y permite la experimentación y las pruebas antes de su implementación en producción. Los DBA utilizan principalmente los sandboxes para probar nuevas versiones de software, pruebas de rendimiento y análisis de errores, y los datos presentes en MySQL son desechables.

Nota

En el contexto de las bases de datos MySQL es frecuente oír los términos maestro y esclavo en . El origen de estas palabras es claramente negativo. Por ello, Oracle, Percona y MariaDB han decidido cambiar esta terminología y utilizar en su lugar fuente y réplica. En este libro, utilizaremos ambos conjuntos de términos porque te encontrarás con los dos, pero ten en cuenta que estas empresas implementarán la siguiente terminología en las próximas versiones:

Antiguo

Nuevo

maestro

fuente

esclavo

réplica

lista negra

lista de bloqueo

lista blanca

allowlist

En 2018, Giuseppe Maxia presentó DBdeployer, una herramienta de que proporciona una forma fácil y rápida de implementar MySQL y sus bifurcaciones. Soporta diversas topologías de MySQL, como maestro/esclavo (fuente/replica), maestro/maestro (fuente/fuente), Galera Cluster y Replicación de Grupos.

Instalar DBdeployer

La herramienta está desarrollada en lenguaje Go y funciona con macOS y Linux (Ubuntu y CentOS), y se proporcionan ejecutables independientes. Consigue la última versión aquí:

# wget https://github.com/datacharmer/dbdeployer/releases/download/v1.58.2/ \
    dbdeployer-1.58.2.linux.tar.gz
# tar -xvf dbdeployer-1.58.2.linux.tar.gz
# mv dbdeployer-1.58.2.linux /usr/local/bin/dbdeployer

Si tienes tu directorio /usr/local/bin/ en la variable $PATH, ahora deberías poder ejecutar los comandos dbdeployer:

# dbdeployer --version
dbdeployer version 1.58.2

Utilizar DBdeployer

El primer paso para utilizar DBdeployer es descargar el binario de MySQL que quieras ejecutar y descomprimirlo en el directorio donde almacenes tus binarios. Nosotros utilizaremos Linux - Generic tarballs ya que son compatibles con la mayoría de las distribuciones de Linux, y almacenaremos nuestros binarios en el directorio /opt/mysql:

# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/ \
    mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz
# mkdir /opt/mysql
# dbdeployer --sandbox-binary=/opt/mysql/ unpack \
    mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz

El comando unpack extraerá y moverá los archivos al directorio especificado. El resultado esperado de esta operación es:

# dbdeployer --sandbox-binary=/opt/mysql/ unpack
mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz
Unpacking tarball mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz to
/opt/mysql/8.0.11
.........100.........200........289
Renaming directory /opt/mysql/mysql-8.0.11-linux-glibc2.12-x86_64 to
/opt/mysql/8.0.11

Ahora podemos utilizar el siguiente comando para crear un nuevo sandbox MySQL independiente con el binario recién extraído:

# dbdeployer --sandbox-binary=/opt/mysql/ deploy single 8.0.11

Y podemos observar cómo DBdeployer inicializa MySQL:

# dbdeployer --sandbox-binary=/opt/mysql/ deploy single 8.0.11
Creating directory /root/sandboxes
Database installed in $HOME/sandboxes/msb_8_0_11
run 'dbdeployer usage single' for basic instructions'
. sandbox server started

Confirma que MySQL se está ejecutando con el comando ps:

# ps -ef | grep mysql
root      4249     1  0 20:18 pts/0    00:00:00 /bin/sh bin/mysqld_safe
--defaults-file=/root/sandboxes/msb_8_0_11/my.sandbox.cnf
root      4470  4249  1 20:18 pts/0    00:00:00 /opt/mysql/8.0.11/bin/mysqld
--defaults-file=/root/sandboxes/msb_8_0_11/my.sandbox.cnf
--basedir=/opt/mysql/8.0.11 --datadir=/root/sandboxes/msb_8_0_11/data
--plugin-dir=/opt/mysql/8.0.11/lib/plugin --user=root
--log-error=/root/sandboxes/msb_8_0_11/data/msandbox.err
--pid-file=/root/sandboxes/msb_8_0_11/data/mysql_sandbox8011.pid
--socket=/tmp/mysql_sandbox8011.sock --port=8011
root      4527  3836  0 20:18 pts/0    00:00:00 grep --color=auto mysql

Ahora podemos conectarnos a MySQL utilizando el comando use de DBdeployer:

# cd sandboxes/msb_8_0_11/
# ./use

o utilizando las credenciales raíz por defecto:

# mysql -uroot -pmsandbox -h 127.0.0.1 -P 8011
Nota

Obtuvimos la información del puerto del comando anterior ps. Recuerda que hay dos formas de conectarse a MySQL: mediante TCP/IP o utilizando un socket. También podemos obtener la ubicación del archivo de socket de la salida del comando ps y conectarnos con él, como se muestra aquí:

# mysql -uroot -pmsandbox -S/tmp/mysql_sandbox8011.sock

Si queremos configurar un entorno de replicación con una topología fuente/réplica, podemos hacerlo con la siguiente línea de comandos:

# dbdeployer --sandbox-binary=/opt/mysql/ deploy replication 8.0.11

Y tendremos tres procesos mysqld en marcha:

# ps -ef | grep mysql
root      4673     1  0 20:26 pts/0    00:00:00 /bin/sh bin/mysqld_safe
--defaults-file=/root/sandboxes/rsandbox_8_0_11/master/my.sandbox.cnf
root      4942  4673  1 20:26 pts/0    00:00:00
/opt/mysql/8.0.11/bin/mysqld
...
--pid-file=/root/sandboxes/rsandbox_8_0_11/master/data/mysql_sandbox201
12.pid --socket=/tmp/mysql_sandbox20112.sock --port=20112

root      5051     1  0 20:26 pts/0    00:00:00 /bin/sh bin/mysqld_safe
--defaults-file=/root/sandboxes/rsandbox_8_0_11/node1/my.sandbox.cnf
root      5320  5051  1 20:26 pts/0    00:00:00
/opt/mysql/8.0.11/bin/mysqld
--defaults-file=/root/sandboxes/rsandbox_8_0_11/node1/my.sandbox.cnf
...
--pid-file=/root/sandboxes/rsandbox_8_0_11/node1/data/mysql_sandbox2011
3.pid --socket=/tmp/mysql_sandbox20113.sock --port=20113

root      5415     1  0 20:26 pts/0    00:00:00 /bin/sh bin/mysqld_safe
--defaults-file=/root/sandboxes/rsandbox_8_0_11/node2/my.sandbox.cnf
root      5684  5415  1 20:26 pts/0    00:00:00
/opt/mysql/8.0.11/bin/mysqld
...
--pid-file=/root/sandboxes/rsandbox_8_0_11/node2/data/mysql_sandbox2011
4.pid --socket=/tmp/mysql_sandbox20114.sock --port=20114

Otra topología que DBdeployer puede configurar es la Replicación en Grupo. Para este ejemplo, definiremos un base-port. Al hacerlo, ordenaremos a DBdeployer que configure nuestros servidores a partir del puerto 49007:

# dbdeployer deploy --topology=group replication --sandbox-binary=/opt/mysql/\
    8.0.11 --base-port=49007

Veamos ahora un ejemplo de implementación de Galera Cluster utilizando Percona XtraDB Cluster 5.7.32. Indicaremos el base-port, y queremos que nuestros nodos se configuren con la opciónlog-slave-updates:

# wget https://downloads.percona.com/downloads/Percona-XtraDB-Cluster-57/\
    Percona-XtraDB-Cluster-5.7.32-31.47/binary/tarball/Percona-XtraDB-Cluster-\
    5.7.32-rel35-47.1.Linux.x86_64.glibc2.17-debug.tar.gz
# dbdeployer --sandbox-binary=/opt/mysql/ unpack\
    Percona-XtraDB-Cluster-5.7.32-rel35-47.1.Linux.x86_64.glibc2.17-debug.tar.gz
# dbdeployer deploy --topology=pxc replication\
    --sandbox-binary=/opt/mysql/ 5.7.32 --base-port=45007 -c log-slave-updates

Como hemos visto, es posible personalizar los parámetros de MySQL. Una opción interesante es habilitar la replicación MySQL utilizando identificadores globales de transacción, o GTIDs (hablaremos de los GTIDs con más detalle en el Capítulo 13):

# dbdeployer deploy replication --sandbox-binary=/opt/mysql/ 5.7.32 --gtid

Nuestro último ejemplo muestra que es posible implementar varias versiones independientes a la vez: aquí creamos cinco instancias independientes:

# dbdeployer deploy multiple --sandbox-binary=/opt/mysql/ 5.7.32 -n 5

Los ejemplos anteriores son sólo una pequeña muestra de las capacidades de DBdeployer. La documentación completa está disponible en GitHub. Otra opción para comprender el universo de posibilidades es utilizar --help en la línea de comandos:

# dbdeployer --help
dbdeployer makes MySQL server installation an easy task.
Runs single, multiple, and replicated sandboxes.

Usage:
  dbdeployer [command]

Available Commands:
  admin           sandbox management tasks
  cookbook        Shows dbdeployer samples
  defaults        tasks related to dbdeployer defaults
  delete          delete an installed sandbox
  delete-binaries delete an expanded tarball
  deploy          deploy sandboxes
  downloads       Manages remote tarballs
  export          Exports the command structure in JSON format
  global          Runs a given command in every sandbox
  help            Help about any command
  import          imports one or more MySQL servers into a sandbox
  info            Shows information about dbdeployer environment samples
  sandboxes       List installed sandboxes
  unpack          unpack a tarball into the binary directory
  update          Gets dbdeployer newest version
  usage           Shows usage of installed sandboxes
  versions        List available versions

Flags:
      --config string           configuration file (default
                                "/root/.dbdeployer/config.json")
  -h, --help                    help for dbdeployer
      --sandbox-binary string   Binary repository (default
                                "/root/opt/mysql")
      --sandbox-home string     Sandbox deployment directory (default
                                "/root/sandboxes")
      --shell-path string       Which shell to use for generated
                                scripts (default "/usr/bin/bash")
      --skip-library-check      Skip check for needed libraries (may
                                cause nasty errors)
      --version                 version for dbdeployer

Use "dbdeployer [command] --help" for more information about a command.

Actualizar el servidor MySQL

Si la pregunta más común que surge es sobre la replicación, la segunda más común es sobre cómo actualizar una instancia MySQL. Si el procedimiento no está bien probado antes de realizarlo en producción, las posibilidades de tener un problema son altas. Hay dos tipos de actualizaciones que puedes realizar:

  • Una actualización mayor en MySQL sería cambiar las versiones de 5.6 a 5.7 o de 5.7 a 8.0. Una actualización de este tipo es más complicada y compleja que una actualización menor, porque los cambios en la arquitectura son más sustanciales. Por ejemplo, un cambio considerable en MySQL 8.0 consistió en modificar el diccionario de datos, que ahora es transaccional y está encapsulado por InnoDB.

  • Una actualización menor sería cambiar de MySQL 5.7.29 a 5.7.30 o de MySQL 8.0.22 a MySQL 8.0.23. La mayoría de las veces, tendrás que instalar la nueva versión utilizando el gestor de paquetes de tu distribución. Una actualización menor es más sencilla que una mayor porque no implica cambios en la arquitectura. Las modificaciones se centran en corregir errores, mejorar el rendimiento y optimizar el código.

Para empezar a planificar una actualización, elige primero entre dos estrategias. Éstas son las estrategias recomendadas según la documentación y son las que utilizamos nosotros:

Mejora in situ

Esto implica cerrar MySQL, sustituir los antiguos binarios o paquetes de MySQL por los nuevos, reiniciar MySQL en el directorio de datos existente y ejecutar mysql_upgrade.

Nota

A partir de MySQL 8.0.16, el binario mysql_upgrade está obsoleto, y el propio servidor MySQL ejecuta su funcionalidad (puedes pensar en ello como una "actualización del servidor"). MySQL añadió este cambio junto con la actualización del diccionario de datos (actualización DD), que es un proceso para actualizar las definiciones de las tablas del diccionario de datos. Las ventajas del nuevo proceso incluyen:

  • Mejoras más rápidas

  • Proceso más sencillo

  • Mayor seguridad

  • Reducción significativa de los pasos de actualización

  • Más fácilmente automatizable

  • Sin reinicios

  • Plug and play

Actualización lógica

Esto implica exportar los datos en formato SQL desde la versión antigua de MySQL utilizando una utilidad de copia de seguridad o de exportación como mysqldump o mysqlpump, instalar la nueva versión de MySQL y aplicar los datos SQL a la nueva versión de MySQL. En otras palabras, este proceso implica reconstruir todo el diccionario de datos y los datos de usuario. Una actualización lógica suele llevar más tiempo que una actualización in situ.

Independientemente de la estrategia que elijas, es esencial establecer una estrategia de reversión en caso de que algo vaya mal. La estrategia de reversión variará en función del plan de actualización que elijas, y el tamaño de la base de datos y la topología presente (si utilizas réplicas o Galera Cluster, por ejemplo) influirán en esta decisión.

Aquí tienes algunos puntos adicionales que debes tener en cuenta al planificar una actualización:

  • Se admite la actualización de MySQL 5.7 a 8.0. Sin embargo, la actualización sólo se admite entre versiones GA. Para MySQL 8.0, es necesario que actualices desde una versión MySQL 5.7 GA (5.7.9 o superior). No se admiten actualizaciones desde versiones de MySQL 5.7 que no sean GA.

  • Se recomienda actualizar a la última versión antes de actualizar a la siguiente. Por ejemplo, actualiza a la última versión de MySQL 5.7 antes de actualizar a MySQL 8.0.

  • No se admiten actualizaciones que se salten versiones. Por ejemplo, no se admite la actualización directa de MySQL 5.6 a 8.0.

Nota

Según nuestra experiencia, pasar de MySQL 5.6 a MySQL 5.7 es la actualización que causa más problemas de rendimiento, especialmente si la aplicación utiliza tablas derivadas (consulta "Consultas anidadas en la cláusula FROM"). MySQL 5.7 modificó la variable de sistemaoptimizer_switch , activando por defecto la opciónderived_merge , y esto puede perjudicar el rendimiento de las consultas.

Otro cambio que complica las cosas es que MySQL 5.7 implementa el cifrado de red por defecto (SSL). Las aplicaciones que no utilizaban SSL en MySQL 5.6 pueden sufrir un impacto sustancial en el rendimiento.

Finalmente, MySQL 5.7 cambió el sync_binlog por defecto al modo síncrono. Este modo es el más seguro, pero puede perjudicar el rendimiento debido al mayor número de escrituras en disco.

Veamos un ejemplo de actualización de MySQL 5.7 upstream a MySQL 8.0 upstream utilizando el método in-place:

  1. Detén el servicio MySQL. Realiza un apagado limpio utilizando systemctl:

    # systemctl stop mysqld
  2. Elimina los binarios antiguos:

      # yum erase mysql-community -y

    Este proceso sólo elimina los binarios y no toca el datadir (ver "El contenido del directorio MySQL").

  3. Sigue los pasos habituales para el proceso de instalación (consulta "Instalación de MySQL en Linux"). Por ejemplo, para utilizar MySQL 8.0 Versión Comunidad en CentOS 7 utilizando yum:

    # yum-config-manager --enable mysql80-community
  4. Instala los nuevos binarios:

    # yum install mysql-community-server -y
  5. Inicia el servicio MySQL:

    # systemctl start mysqld

Podemos observar en los registros que MySQL actualizó el diccionario de datos y que ahora estamos ejecutando MySQL 8.0.21:

# tail -f /var/log/mysqld.log
2020-08-09T21:20:10.356938Z 2 [System] [MY-011003] [Server] Finished
populating Data Dictionary tables with data.
2020-08-09T21:20:11.734091Z 5 [System] [MY-013381] [Server] Server
upgrade from '50700' to '80021' started.
2020-08-09T21:20:17.342682Z 5 [System] [MY-013381] [Server] Server
upgrade from '50700' to '80021' completed.
...
2020-08-09T21:20:17.463685Z 0 [System] [MY-010931] [Server]
/usr/sbin/mysqld: ready for connections. Version: '8.0.21'  socket:
'/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.
Nota

Te recomendamos encarecidamente que antes de actualizar MySQL consultes las notas de la versión. Contienen un resumen de los cambios realizados y las correcciones de errores. Las notas de la versión están disponibles para MySQL upstream, Percona Server y MariaDB.

Una pregunta habitual es si es seguro actualizar a la última versión principal. La respuesta es... depende. Como ocurre con cualquier producto nuevo en la industria, los primeros en adoptarlo tienden a beneficiarse de las nuevas funciones, pero también son probadores, y pueden descubrir y verse afectados por nuevos errores. Cuando se lanzó MySQL 8.0, nuestra recomendación fue esperar tres versiones menores antes de plantearse el cambio. La regla de oro de este libro es probarlo todo por adelantado antes de ejecutar el siguiente paso. Si aprendes precisamente eso de este libro, consideraremos cumplida nuestra misión.

Get Aprender MySQL, 2ª Edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.