Instalar y Configurar MySQL57

Hablar de bases de datos en PHP es hablar de MySQL un RDMS (Sistema de Gestión de Bases de Datos Relacionales) enormemente extendido para el desarrollo de aplicaciones web.

En este módulo vamos a ver la instalación de MySQL 5.7, la configuración inicial y las comprobaciones necesarias para asegurarnos que el servicio de bases de datos funciona correctamente. Así mismo revisaremos una serie de comandos y scripts de MySQL necesarios para realizar comprobaciones y administración del servidor MySQL.

17-Feb-2016

En los servidores web basados en Apache y php la pieza para completar la operatividad de las aplicaciones que alojan, es sin duda la base de datos que nos permitirá almacenar y procesar contenidos dinámicos.

Hablar de bases de datos en PHP es hablar de MySQL un RDMS  (sistema de gestión de bases de datos relacionales) enormemente extendido para el desarrollo de aplicaciones web.

Logo MySQL

MySQL no se desarrolló originalmente para uso comercial y es una base de datos de código abierto. Según informes de mercado, se considera que hay alrededor de 10 millones de instalaciones de MySQL lo que da una idea de la importancia que esta base de datos está tomando en el mundo de la web.

MySQL es ideal tanto para pequeñas como para grandes aplicaciones web, es muy rápido fiable y fácil de usar. Utiliza el estándar SQL, admite scripts y desencadenantes (Triggers). Hoy en día se desarrolla, distribuye, y recibe el apoyo de ‘Oracle Corporation’.

Actualmente se encuentra en su revisión 5.7. Si deseamos encontrar más información podemos visitar las siguientes direcciones:

Instalar MySQL

La instalación del servidor MySQL por lo general requiere de los siguientes pasos:

  • Instalar el paquete mysql57-server con el instalador de paquetes pkg
  • Habilitar MySQL en el arranque del sistema actualizando el archivo rc.conf
  • Crear archivo con opciones globales del servidor en su archivo de configuración my.cnf
  • Reiniciar el sistema reboot
  • Comprobar que el servicio está en funcionamiento utilizando el comando netstat y el script mysql.server
  • Cambiar la contraseña temporal del usuario root  por medio del comando mysqladmin
  • Realizar tareas de post-instalación seguras ejecutando el script mysql_secure_installation

NOTA: durante todo el proceso de instalación y configuración de nuestro servidor MySQL5.7, tenemos que estar logeados como el usuario root del sistema. Por lo que se recomienda iniciar sesión con usuario de privilegios altos y posteriormete cambiar a root por medio del comando 'su'.

Instalar el paquete mysql57-server

Para instalar el paquete de mysql57-server en nuestro servidor utilizaremos el comando pkg.

# pkg install mysql57-server 
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 2 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
    mysql57-server: 5.7.10_3
    mysql57-client: 5.7.10_3

The process will require 193 MiB more space.
16 MiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching mysql57-server-5.7.10_3.txz: 100%  13 MiB  2.8MB/s  00:05
Fetching mysql57-client-5.7.10_3.txz: 100%  3 MiB  1.3MB/s  00:02
Checking integrity... done (0 conflicting)
[1/2] Installing mysql57-client-5.7.10_3...
[1/2] Extracting mysql57-client-5.7.10_3: 100%
[2/2] Installing mysql57-server-5.7.10_3...
===> Creating users and/or groups.
Creating group 'mysql' with gid '88'.
Creating user 'mysql' with uid '88'.
[2/2] Extracting mysql57-server-5.7.10_3: 100%
Message from mysql57-client-5.7.10_3:
* * * * * * * * * * * * * * * * * * * * * * * *

This is the mysql CLIENT without the server.
for complete server and client, please install databases/mysql57-server

* * * * * * * * * * * * * * * * * * * * * * * *
Message from mysql57-server-5.7.10_3:
*****************************************************************************

Remember to run mysql_upgrade the first time you start the MySQL server
after an upgrade from an earlier version.

Initial password for first time use of MySQL is saved in $HOME/.mysql_secret
ie. when you want to use "mysql -u root -p" first you should see password
in /root/.mysql_secret

*****************************************************************************

Durante la instalación se crearán el usuario ‘mysql’ y el grupo ‘mysql’ especiales para la gestión de MySQL.

NOTA: observar en los comentarios finales de la instalación, como se nos advierte que durante  la primera ejecución del servidor MySQL se generará una clave temporal para el usuario root de la base de datos y que se almacenará en el archivo .mysql_secret del directorio /root. Esta clave nos hará falta para realizar las primeras operaciones de administración y configuración de MySQL, como es el proceso de asignar la clave al usuario root de MySQL.

Iniciar el servicio durante el arranque del sistema

Tras la instalación tendremos que editar el archivo /etc/rc.conf y agregar la línea que nos permita activar el servidor MySQL en cada inicio del sistema.

Añadiremos la línea, guardaremos los cambios y saldremos del editor.

mysql_enable = “YES”

Si no deseamos editar el fichero para añadir esta línea, también lo podemos conseguir con la siguiente instrucción:

# echo mysql_enable='"YES"' >> /etc/rc.conf 

Configurar opciones globales del servidor creando el archivo de configuración my.cnf

MySQL permite establecer opciones globales para la configuración del servidor por medio del archivo my.cnf, que colocaremos en el directorio /etc/ del sistema.

Durante la instalación se crea un archivo de ejemplo de nombre my-default.cnf en la ruta /usr/local/share/mysql que podemos utilizar para realizar las configuraciones y copiarlo, renombrándolo en la ruta /etc.

# cd /usr/local/share/mysql
# cp my-default.cnf /etc/my.cnf
# ee /etc/my.cnf

Una vez copiado lo editamos con ee y le introducimos una serie de cambios. A continuación se muestran algunas de las líneas que podemos añadir al archivo my.cnf.

 port=3306
 explicit_defaults_for_timestamp=1
 character_set_server=utf8
 collation_server= utf8_general_ci
 init_connect='set collation_connection=utf8_general_ci'
 innodb_buffer_pool_size = 512M
 max_connections = 250

Para una explicación más amplia del archivo y sus configuraciones revisar la sección ‘Archivo de configuración my.cnf’ que se muestra más adelante.

Reiniciamos el servidor

A continuación reiniciamos el sistema

# reboot

Comprobar que MySQL está en ejecución

Para comprobar si el servicio de MySQL está en ejecución podemos utilizar una serie de comandos o scripts:

  • Comando netstat que mostrará un listado de las conexiones activas:
# netstat –a
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address     Foreign Address    (state)
tcp46   0   0 *.mysql        *.*          LISTEN
.
.
.
Active UNIX domain sockets
Address Type  Recv-Q Send-Q  Inode   Conn   Refs Nextref Addr
c71c6158 stream   0   0 c7387e6c    0    0    0 /tmp/mysql.sock
  • Script mysql.server con el argumento status:
# cd /usr/local/share/mysql
# ./mysql.server status
SUCCESS! MySQL running (646)

Revisar la sección ‘Script mysql.server que se muestra más adelante.

Cambiar la contraseña temporal del usuario root

Como se nos advirtió al final del proceso de instalación, MySQL crea una contraseña temporal para el usuario root la primera vez que este se pone en marcha.

Evidentemente por motivos de seguridad, la primera tarea será cambiar esta contraseña por una nueva que la tendremos que utilizar posteriormente para ejecutar scripts de MySQL  y para realizar tareas administrativas.

Una vez logeados como administrador del sistema utilizando el comando ‘su’, mostraremos el contenido del archivo .mysql_secret situado en la carpeta /root del sistema.

# cat /root/.mysql_secret
# Password set for user 'root@localhost' at 2016-02-16 10:43:36
NfTjvqqf<KtA

A continuación por medio del comando mysqladmin (cliente para la administración de servidores MySQL), utilizando como usuario ‘root’ y como opción ‘password’, asignaremos la nueva contraseña al usuario root.
Cuando nos solicite la primera contraseña tendremos que indicar la que contiene el archivo .mysql_secret.

# mysqladmin -u root -p password
Enter password:            → Contraseña temporal del archivo .mysql_secret ←
New password:              → Nueva contraseña del usuario root ←
Confirm new password:      → Confirmar la nueva contraseña ←
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. 

A partir de este momento la nueva contraseña que se utilizará para las tareas administrativas, será la que le acabamos de establecer.

Podemos realizar una prueba pidiéndole a mysqladmin que nos muestre información acerca de la versión del servidor que está en ejecución.

# mysqladmin -u root -p ver
Enter password: → Nueva contraseña del usuario root ← 
mysqladmin  Ver 8.42 Distrib 5.7.10, for FreeBSD10.1 on amd64
Copyright (c) 2000, 2015, 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.

  Server version          5.7.10
  Protocol version        10
  Connection              Localhost via UNIX socket
  UNIX socket             /tmp/mysql.sock
  Uptime:                 3 min 23 sec

Threads: 1  Questions: 6  Slow queries: 0  Opens: 106  Flush tables: 1  Open tables: 99  Queries per second avg: 0.029

Revisar la sección ‘Comando mysqladmin (tareas administrativas)’ que se muestra más adelante.

Realizar una post-instalación asegurando el servidor (mysql_secure_installation)

Cuando se inicie por primera vez el servidor en nuestro sistema, inicializará el directorio de datos /var/db/mysql con las bases de datos, tablas y usuarios del sistema de gestión de MySQL.

Después de este proceso es muy recomendable realizar una instalación segura  por medio del script mysql_secure_installation que se localiza en el directorio /usr/local/bin

El script realiza las siguientes operaciones:

  • Activar el plugin para el control de contraseñas seguras.
  • Establecer una contraseña para la cuenta root..
  • Eliminar cuentas root que son accesibles desde fuera del host local.
  • Eliminar cuentas de usuario anónimo.
  • Eliminar la base de datos de prueba ‘test’ (que por defecto a esta base de datos pueden acceder todos los usuarios, incluso los usuarios anónimos), y privilegios que permiten que cualquiera pueda acceder a las bases de datos con nombres que comienzan con test.

Su funcionamiento es muy sencillo ya que es una especie de asistente donde simplemente tendremos que contestar Y o N según lo que deseemos hacer.
A la hora de ejecutarlo tendremos que utilizar el usuario root con la nueva contraseña creada en el apartado anterior.

# cd /usr/local/bin
# mysql_secure_installation -u root -p
Enter password: 	→ Nueva contraseña del usuario root ←

Securing the MySQL server deployment.


VALIDATE PASSWORD PLUGIN 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 plugin?

→ activamos el plugin de validación de contraseñas ←
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

→ Indicamos un nivel medio de validación ←
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1 
Using existing password for root.

Estimated strength of the password: 100
→ No modificamos la contraseña actual del usuario root ←
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n 

 ... skipping.
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.

→ Eliminamos el usuario anónimo ←
Remove anonymous users? (Press y|Y for Yes, any other key for No) : 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.

→ Impedimos el acceso remoto del root ←
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y 
Success.

By default, MySQL 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.

→ Eliminamos la base de datos test ←
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : 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.

→ Recargamos la tabla de privilegios ←
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

Testear el funcionamiento de MySQL

Adicionalmente realizaremos otro tipo de tareas, destinadas a comprobar que el servidor funciona de forma correcta y es accesible para los scripts php.

  • Crear un nuevo usuario en MySQL con permiso de acceso desde cualquier servidor.
  • Crear una base de datos y asignarle al nuevo usuario todos los permisos de uso.
  • Crear un script en php de prueba que se conecte a la nueva base de datos.

Crear primer usuario con privilegios en nuestro servidor MySQL

Para realizar esta tarea, utilizaremos el intérprete de comandos de MySQL al que se accede por medio del comando mysql.

# mysql –u root –p
Enter password: → Nueva contraseña del usuario root ←
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.10 Source distribution

Copyright (c) 2000, 2015, 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>

Cuando nos muestre el prompt mysql>, le iremos introduciendo las ordenes escritas en SQL (Structured Query Language) .

Para crear el usuario utilizaremos la sentencia CREATE USER seguida del nombre de usuario y la clave de identificación como se muestra a continuación:

mysql> CREATE USER 'remoto'@'%' IDENTIFIED BY 'R1.mo_To';
Query OK, 0 rows affected (0,01 sec) → Query OK, nos indica que la ejecución ha sido correcta ←

Como nombre le asignamos ‘remoto’ el signo ‘%’ le indica a MySQL que va a poder conectarse desde cualquier sitio. Si quisiéramos que el nuevo usuario sólo se pudiera conectar de forma local desde el servidor hubiéramos utilizado ‘localhost’ en lugar de ‘%’.

La clave se indica por medio de la opción IDENTIFIED BY ‘clave_usuario’.

A continuación pasamos a asignarle los permisos o privilegios que tendrá el nuevo usuario utilizando la sentencia GRANT USAGE.

mysql> GRANT USAGE ON *.* TO 'remoto'@'%' IDENTIFIED BY 'R1.mo_To' WITH MAX_QUERIES_PER_HOUR 0 
MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
Query OK, 0 rows affected, 1 warning (0,00 sec)

Esta sentencia le permite realizar cualquier cantidad de consultas, conexiones y actualizaciones.

Crear una base de datos y otorgar al nuevo usuario todos los permisos

Vamos a crear una nueva base de datos de nombre ‘dbwebremoto’ para realizar la prueba de conexión y le otorgaremos todos los permisos de uso al nuevo usuario que acabamos de crear.

Para crear la base de datos utilizamos la sentencia CREATE DATABASE IF NOT EXISTS seguida del nombre que deseemos asignarle.

mysql> CREATE DATABASE IF NOT EXISTS `dbwebremoto`;
Query OK, 1 row affected (0,00 sec)

Al incluir la opción IF NOT EXISTS a la sentencia, nos aseguramos que sólo se creará en el caso de que no exista.

El siguiente paso es asignarle al usuario ‘remoto’ todos los permisos de trabajo sobre la base de datos ‘dbwebremoto’. Para ello utilizaremos la sentencia GRANT ALL PRIVILEGES ON.

mysql> GRANT ALL PRIVILEGES ON `dbwebremoto`.* TO 'remoto'@'%';
Query OK, 0 rows affected (0,00 sec)

Crear script en php que se conecte a la nueva base de datos

Sólo nos queda crear una página web con un pequeño script en php que se conecte a la base de datos utilizando las credenciales del usuario, para comprobar que el servidor admite las conexiones y que los pasos anteriores son correctos.

Nos situamos en el directorio /mnt/webapps/www que es nuestro DocumentRoot y creamos la página web de pruebas.

#  cd /mnt/webapps/www
#  ee conecta.php
^[ (escape) menu ^y search prompt ^k delete line   ^p prev li     ^g prev page
^o ascii code    ^x search        ^l undelete line ^n next li     ^v next page
^u end of file   ^a begin of line ^w delete word   ^b back 1 char ^z next word
^t top of text   ^e end of line   ^r restore word  ^f forward char
^c command       ^d delete char   ^j undelete char              ESC-Enter: exit
=====line 18 col 38 lines from top 18 =========================================
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Conexión a MySQL</title>
</head>
<body>
<h1>Pruebas de conexión al servidor MySQL</h1>
<?php
// Variables donde definimos los datos para la conexión 
$host='localhost';
$usuario='remoto';
$clave='R1.mo_To';
$bd='dbwebremoto';

// Realizamos la conexión al servidor MySQL
$Conector=@new mysqli($host, $usuario, $clave, $bd);

// Si se produce algún error en la apertura mostramos línea de información y finalizamos  el script
if(mysqli_connect_errno()) {
  printf("Fallo en la conexión: %s<br />Servidor: %s<br />Base Datos: %s<br /> Usuario: %s ",
      mysqli_connect_error(),$host,$bd, $usuario);
  exit();
}

// Esta instrucción indica que la comunicación con la basase de datos es utf8
// que es el juego de caracteres que se utiliza en los encabezados de casi todas las páginas
$Conector->query("SET NAMES 'UTF8'");

// Mostramos mensaje
echo "<p>Conexión abierta con éxito a la base de datos <strong>$bd</strong> " .
   "por el usuario <strong>$usuario</strong></p>";

// Cerramos la conexión y volvemos a mostrar mensaje
$Conector->close();
echo "<p>Conexión a la base de datos <strong>$bd</strong> Cerrada</p>";
?>
</body>
</html>
"conecta.php" 27 lines, 896 characters

Una vez guardada, abrimos el navegador, le indicamos la URL de acceso a nuestra página y comprobamos que la conexión se haya podido realizar.

Prueba de conexión a la base de datos

Inicializar el directorio de datos MySQL

¿Dónde almacenar las BD de MySQL?

Este proceso nos permite crear el directorio de datos de MySQL, vital para el funcionamiento de nuestro servidor MySQL ya que contiene la base  de datos principal del servidor con las tablas del sistema, así como cada una de las bases de datos que vayamos creando para la gestión de las aplicaciones web.

En las versiones anteriores a la  MySQL5.7, podíamos encontrar el script mysql_install_db que se encargaba de inicializar el directorio de datos de MySQL y crear las tablas de permisos del sistema si no existían, en las versiones actuales es considerado como obsoleto, ya que su funcionalidad se ha integrado en mysqld.

Este proceso ahora es automático la primera vez que se inicia el servidor MySQL, por lo que no será necesario que nosotros nos encarguemos de este proceso.

Si deseamos realizar nosotros mismos la inicialización del directorio de datos para una instalación de MySQL, ejecutaremos mysqld con la opción --initialize o --initialize-insecure.

Por lo general, estas operaciones sólo se necesitan la primera vez que se instala MySQL, de modo que este paso puede obviarse si se está actualizando una instalación existente.

Inicialmente si no se le indica lo contrario las bases de datos de MySQL se albergarán en el directorio /var/db/mysql, aunque esta ubicación la podemos cambiar durante la ejecución de mysqld con la opción --datadir.

mysqld [opciones]

Opción Acción
--initialize Realiza el proceso de inicializar el directorio de datos.
--user=nombre_usuario Login del usuario con el que se ejecuta mysqld (demonio con el que se ejecuta el servicio de MySQL). Por defecto se utiliza el usuario ‘mysql’ creado durante la instalación del servidor.
--basedir=nombre_directorio Path al directorio base (directorio principal de MySQL donde se encuentran los ejecutables y scripts de trabajo). Por defecto se utiliza /usr/local/bin
--datadir=nombre_directorio Path al directorio de datos (directorio que alberga las bases de datos). Por defecto se utiliza /var/db/mysql.
--explicit_defaults_for_timestamp=1 ó 0 Desde MySQL 5.6.6 en adelante, el uso de TIMESTAMP con un DEFAULT implícito está desaprobado y temporalmente existirá un warning para activar la variable explicit_defaults_for_timestamp. Con esta opción podremos activar el uso de este tipo de datos.

Si quisiéramos cambiar la ubicación de las bases de datos, por ejemplo a un directorio de nuestros puntos de montaje  /mnt/datos/mysql, realizaríamos los siguientes pasos:

# mkdir /mnt/datos/mysql 			→ creamos el directorio de datos ←
# chown -R mysql:mysql /mnt/datos/mysql 	→ signamos propietario y grupo del directorio ←
# chmod -R 1775 /mnt/datos/mysql 		→ asignamos permisos para propietario y grupo ←
# cd /usr/local/libexec
# ./mysqld --initialize --user=mysql --basedir=/usr/local --datadir=/mnt/datos/mysql --explicit_defaults_for_timestamp=1

Establecer la contraseña del administrador (root)

Cuando se instala el servidor MySQL y se crean las bases de datos del sistema, también se crea el usuario root para la administración de las bases de datos, pero con una contraseña temporal. Por lo que se hace extremadamente necesario establecer una contraseña para el administrador de las bases de datos.

Esta tarea la podremos realizar de varias formas:

  • Comando mysqladmin localizado el directorio /usr/local/bin.
# /usr/local/bin/mysqladmin -u root password 
New password:
Confirm new password:

Omitimos  el valor de la contraseña para que no se muestre en el intérprete de comandos por motivos de seguridad y que sea el propio mysqladmin el que nos solicite su valor.

La contraseña tendrá que cumplir los niveles de seguridad establecidos por VALIDATE PASSWORD PLUGIN’ que establecimos durante la ejecución del comando mysql_secure_installation.

  • Script mysql_secure_installation localizado el directorio /usr/local/bin.
  • Iniciando una sesión con el intérprete de comandos de mysql.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY ‘NuevaClave';

Resetear contraseña del administrador

Si deseamos resetear la contraseña del root, podemos ejecutar las siguientes instrucciones:

  • Detener el servidor MySQL con el comando kill enviando una señal normal (no indicar -9) para eliminar el proceso mysqld. Usar el path actual de acceso al fichero .pid mediante el siguiente comando:
# kill `cat /mysql-data-directory/host_name.pid` 

Utilizar comillas de ejecución (backticks) en lugar de comillas simples y sustituir mysql-data-directory por la ruta del directorio de datos actual y host_name.pid por el nombre del fichero .pid de nuestro servidor.

  • Crear un fichero que contenga una línea con la sentencia descrita anteriormente para el intérprete de comandos mysql.
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NuevaClave';

En nuestro ejemplo, guardaremos el fichero con el nombre reset-ini en el directorio /root

  • Iniciar el servidor MySQL utilizando el comando mysqld_safe con la opcion especial --init_file
mysqld_safe --init-file=/root/reset-ini & 

Cuando se inicie servidor ejecutará la sentencia escrita en el fichero cambiando la contraseña actual del root.

  • Eliminar el fichero reset-ini creado para este proceso.

Comando mysqladmin

Tareas administrativas de MySQL

El comando mysqladmin es un cliente para la realización de tareas administrativas. Podremos usarlo para comprobar el estado y configuración del servidor, para crear y eliminar bases de datos, y más operaciones.

mysqladmin [opciones] comando [opciones comando]

Comandos de mysqladmin (algunos):

Comando Acción
ver Mostrar la versión del servidor que está en ejecución.
create nombre_bd Crea una nueva base de datos de nombre nombre_bd.
drop nombre_bd Elimina la base de datos de nombre nombre_bd y todas sus tablas.
extended-status Muestra información ampliada sobre el estado del servidor mostrando el valor de sus variables de trabajo.
flush-hosts Limpia toda la información almacenada en la memoria cache del host.
flush-status Limpia las variables de estado (reinicializa las variables)
password nueva_clave ó
-p nueva_clave
Establece la contraseña para el usuario (la cuenta) con el que nos conectamos al servidor con mysqladmin. Este será el comando que utilizaremos para cambiarle la contraseña del usuario root.
Si el valor de la contraseña contiene espacios u otros caracteres que son especiales para el intérprete de comandos, deberemos encerrarlo entre comillas.
A parit de la versión 5.6, la nueva contraseña puede omitirse tras el comando password. En este caso, mysqladmin solicita el valor de contraseña, que le permite evitar que especifique la contraseña en la línea de comandos.
shutdown Detiene el servidor

Opciones de mysqladmin (algunas):

Opción Acción
--compress ó
-C
Comprime toda la información enviada entre el cliente y el servidor
--connect_timeout=segundos Segundos de espera para finalizar la conexión.
--host=nombre_host ó
-h nombre_host
Conectar con el servidor MySQL en un equipo dado (host)
--ssl Habilitar SSL para la conexión. La utilización de esta opción implica también el uso de las opciones (--ssl-cert=file_name y --ssl-key=file_name) para indicar donde se encuentran los archivos de certificado y de clave respectivamente.
--user=nombre_usuario ó
-u nombre_usuario
Nombre de usuario MySQL a usar cuando se conecta al servidor
--port=num_puerto ó
-P num_puerto
Nº de puerto utilizado para la conexión.

Archivo de configuración my.cnf

Configuración de MySQL

MySQL utiliza un fichero de configuración al igual que otros servidores, llamado my.cnf que tiene que estar situado en el directorio de datos que por defecto es: /var/db/mysql o en el directorio /etc de nuestro sistema y que almacena configuraciones del servidor que podemos modificar para variar el comportamiento.

En las anteriores distribuciones de MySQL tenían una serie de plantillas de configuración que podíamos utilizar para nuestro servidor (my-small.cnf, my-medium.cnf, my-large.cnf, and my-huge.cnf) dependiendo del sistema que se iba a configurar (pequeñas, medianas, grandes y muy grandes sistemas). Desde MySQL 5.6.8, estos archivos más antiguos ya no son distribuidos.

Vamos a comentar algunas de las configuraciones que vale la pena establecer para nuestro servidor:

[mysqld]
port=3306

Si deseáramos cambiar el puerto por el que se conectan los clientes al servidor, modificaremos el valor de la variable port. Este cambio sólo se realiza en sistemas especiales ya que el puerto por defecto de las conexiones al servidor es el 3306.

[mysqld]
explicit_defaults_for_timestamp=1

Debido a un cambio en el comportamiento de los datos de tipo TIMESTAMP a partir de la versión 5.6 de MySQL, se genera un aviso ‘[Warning] TIMESTAMP with implicit DEFAULT value is deprecated’. Para desactivar el aviso deberemos añadir esta opción al fichero my.cnf, gracias a la que habilitaremos el nuevo comportamiento de TIMESTAMP.

[mysqld]
# Si queremos establecer como juego de caracteres latin1 (español independiente de MAYÚSCULAS y minúsculas)

character_set_server=latin1
collation_server=latin1_spanish_ci
init_connect='set collation_connection=latin1_spanish_ci'

# Si queremos establecer como juego de caracteres utf8 (suele ser el que se recomienda, 
# ya que por lo general los encabezados de documentos web utilizan este juego de caracteres)

character_set_server=utf8
collation_server= utf8_general_ci
init_connect='set collation_connection=utf8_general_ci'

Establecer el juego de caracteres por defecto que usará el servidor.

[mysqld]
innodb_buffer_pool_size = 512M

Establecer la cantidad de RAM para los datos más importantes de la cache de MySQL. Por defecto se establece a 128M, pero dependiendo de la cantidad de RAM de la que dispongamos se recomienda utilizar entre un 70% (para servidores dedicados) y un 10%. Como nuestro servidor tiene 2Gb de RAM y también tiene en ejecución el servidor web la estableceremos a 512M (25% de la memoria).

[mysqld]
max_connections = 250

La cantidad máxima admisible de conexiones de cliente simultáneas. Por defecto, este es de 151, nosotros la vamos a aumentar para permitir un total de 250.

El intérprete de comandos de MySQL

Comando mysql

MySQL nos ofrece un intérprete de comandos que se ejecuta desde la terminal, con el que podemos consultar información del servidor y realizar tareas administrativas como crear o eliminar bases de datos, tablas, desencadenantes, usuarios, ejecutar consultas, etc.

Para iniciar una sesión escribiremos el nombre del comando seguido de las opciones –u root –p para autenticarnos como root.

# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.10 Source distribution

Copyright (c) 2000, 2015, 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>

Cuando se nos muestre el prompt del interprete (mysql >) podremos ir escribiendo las sentencias que deseamos ejecutar en nuestro servidor.

Para salir del intérprete escribiremos el comando quit.

Veamos una serie de ejemplos sobre su utilización:

  • Consultar las variables de nuestro servidor con la sentencia SHOW VARIABLES LIKE.
mysql> SHOW VARIABLES LIKE 'max_%'; → Mostramos un listado de las variables que empiezan por max_ ←
+----------------------------+----------------------+
| Variable_name       | Value        |
+----------------------------+----------------------+
| max_allowed_packet     | 4194304       | → los valores de capacidad vienen expresados en bytes ←
| max_binlog_cache_size   | 18446744073709547520 |
| max_binlog_size      | 1073741824      |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_connect_errors     | 100         |
| max_connections      | 250         | → Establecida desde my.cnf ←
| max_delayed_threads    | 20          |
| max_digest_length     | 1024         |
| max_error_count      | 64          |
| max_execution_time     | 0          |
| max_heap_table_size    | 16777216       |
| max_insert_delayed_threads | 20          |
| max_join_size       | 18446744073709551615 |
| max_length_for_sort_data  | 1024         |
| max_points_in_geometry   | 65536        |
| max_prepared_stmt_count  | 16382        |
| max_relay_log_size     | 0          |
| max_seeks_for_key     | 18446744073709551615 |
| max_sort_length      | 1024         |
| max_sp_recursion_depth   | 0          |
| max_tmp_tables       | 32          |
| max_user_connections    | 0          |
| max_write_lock_count    | 18446744073709551615 |
+----------------------------+----------------------+
23 rows in set (0,01 sec)

mysql> SHOW VARIABLES LIKE 'collation_%'; → Variables que empiezan por collation_ ←
+----------------------+-------------------+
| Variable_name    | Value       |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database  | utf8_general_ci  |
| collation_server   | utf8_general_ci  | → Establecida desde my.cnf ←
+----------------------+-------------------+
3 rows in set (0,00 sec)

mysql> SHOW VARIABLES LIKE 'character_%'; → Variables que empiezan por character_ ←
+--------------------------+----------------------------------+
| Variable_name      | Value              |
+--------------------------+----------------------------------+
| character_set_client   | latin1              |
| character_set_connection | latin1              |
| character_set_database  | utf8               |
| character_set_filesystem | binary              |
| character_set_results  | latin1              |
| character_set_server   | utf8               | → Establecida desde my.cnf ←
| character_set_system   | utf8               |
| character_sets_dir    | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0,00 sec)

mysql> SHOW VARIABLES LIKE 'innodb_buffer_%';
+-------------------------------------+----------------+
| Variable_name            | Value     |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size    | 134217728   |
| innodb_buffer_pool_dump_at_shutdown | ON       |
| innodb_buffer_pool_dump_now     | OFF      |
| innodb_buffer_pool_dump_pct     | 25       |
| innodb_buffer_pool_filename     | ib_buffer_pool |
| innodb_buffer_pool_instances    | 1       |
| innodb_buffer_pool_load_abort    | OFF      |
| innodb_buffer_pool_load_at_startup | ON       |
| innodb_buffer_pool_load_now     | OFF      |
| innodb_buffer_pool_size       | 536870912   | → Establecida desde my.cnf ←
+-------------------------------------+----------------+
10 rows in set (0,00 sec)

mysql> SHOW VARIABLES LIKE 'explicit_%';
+---------------------------------+-------+
| Variable_name          | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON  | → Establecida desde my.cnf ←
+---------------------------------+-------+
1 row in set (0,00 sec)

mysql> quit → Salimos del intérprete ←
Bye #
  • Crear una base de datos (CREATE DATABASE IF NOT EXISTS)
mysql> CREATE DATABASE IF NOT EXISTS datosweb;
Query OK, 1 row affected (0,00 sec)
  • Eliminar una base de datos (DROP DATABASE IF EXISTS)
mysql> DROP DATABASE IF EXISTS datosweb;
Query OK, 0 rows affected (0,00 sec)
  • Crear usuario (CREATE USER)
mysql> CREATE USER 'luis'@'localhost' IDENTIFIED BY 'L1.u._IS';
Query OK, 0 rows affected (0,01 sec)

Si deseamos obtener una descripción más detallada de todas las variables que se pueden configurar, sus valores por defecto y el efecto que causan en la ejecución del servidor podemos consultar la siguiente dirección http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

El script mysql.server

Iniciar y detener el servidor

Situado en el directorio /usr/local/share/mysql se encuentra el script mysql.server, que se encarga de iniciar, detener, reiniciar, recargar o mostrar el estado del servidor MySQL.

Su funcionamiento es muy simple y sólo tendremos que indicar la acción que deseamos llevar a cabo.

Argumento Acción
start Inicia el servidor
stop Detiene el servidor
restart Reinicia el servidor (lo detiene y lo vuelve a iniciar)
reload Recarga de nuevo el servicio (es obligatorio que el servidor este iniciado)
status Muestra el estado del servidor
# cd /usr/local/share/mysql
# ./mysql.server
Usage: mysql.server {start|stop|restart|reload|force-reload|status} [ MySQL server options ]
# ./mysql.server start    → Iniciamos el servidor ←
Starting MySQL. SUCCESS!
# ./mysql.server status   → Mostramos el estado del servidor ←
SUCCESS! MySQL running (1619)
# ./mysql.server restart   → Reiniciamos el servidor ←
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
# ./mysql.server status   → Mostramos el estado del servidor ←
SUCCESS! MySQL running (1737)
# ./mysql.server stop    → Detenemos el servidor ←
Shutting down MySQL.. SUCCESS!
# ./mysql.server start    → Iniciamos el servidor ←
Starting MySQL. SUCCESS!
# ./mysql.server reload   → Recargamos el servicio (es obligatorio que ya esté en marcha el servidor) ←
SUCCESS! Reloading service MySQL