sql >> Base de Datos >  >> RDS >> Mysql

Configuración de MySQL 8

Configuración de MySQL 8

MySQL tiene dos tipos de parámetros:

Estático, que surte efecto después de reiniciar el servidor MySQL. Dinámico, que se puede cambiar en línea sin reiniciar. El servidor MySQL funciona en la versión 5.7 y posteriores.

Las variables se pueden establecer a través de lo siguiente:

  • Archivo de configuración
  • Script de inicio
  • Usando el comando SET
  • Parámetros de configuración persistentes

Usando el archivo de configuración:

El archivo de configuración se puede encontrar en  /etc/my.cnf (RHL y CENTOS) y /etc/mysql/my.cnf(Debian), puede editar este archivo en el editor de su elección.

El archivo de configuración tiene las siguientes secciones, el parámetro relacionado debe mantenerse debajo de ellas.

  • [mysql]:el cliente de línea de comandos de mysql lee la sección
  • [cliente]:la sección es leída por todos los clientes que se conectan (incluido mysql cli)
  • [mysqld]:mysqlserver lee la sección
  • [mysqldump]:la utilidad de copia de seguridad llamada mysqldump lee la sección
  • [mysqld_safe]:leído por mysqld_safeprocess (secuencia de comandos de inicio del servidor MySQL)
[[email protected] ~]# mysql -e "select @@server_id;"
+-------------+
| @@server_id |
+-------------+
|           1 |

cambie el parámetro server-id a 2 y reinicie el servidor mysql

#vim /etc/my.cnf
server-id=2 (edit this parameter in config file)

#sudo systemctl restart mysqld

[[email protected] ~]# mysql -e "select @@server_id;"
+-------------+
| @@server_id |
+-------------+
|           2|

Uso de parámetros con el script de inicio:

Suponga que desea iniciar MySQL usando un script de inicio y no a través de systemd,

especialmente para pruebas o para algún cambio temporal. Puede pasar las variables al script

en lugar de cambiarlo en el archivo de configuración

# /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/centos7.err --pidfile=/usr/local/mysql/data/centos7.pid --init-file=/tmp/mysql-init &

Puede ver que el parámetro –init-file se pasa al servidor. El servidor ejecuta las instrucciones SQL en ese archivo antes de iniciar

Uso de variables globales y de sesión:

Hay dos tipos de variables según el alcance de la variable:

Global:se aplica a todas las conexiones nuevas

Sesión:se aplica solo a la conexión actual (sesión)

Usaré sort_buffer_size para este ejemplo porque tiene un alcance global y de nivel de sesión, por lo que explicará muy bien el alcance.

mysql> SET GLOBAL sort_buffer_size = 512 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@sort_buffer_size;
+--------------------+
| @@sort_buffer_size |
+--------------------+
|             262144 |
+--------------------+
1 row in set (0.00 sec)

No cambió porque el tamaño de sort_buffer tiene un alcance global y de nivel de sesión y el global es solo un valor predeterminado para las nuevas sesiones. Estábamos usando la misma conexión de cliente todo el tiempo, así que con el mismo global cambiamos el valor predeterminado para las nuevas sesiones, pero nuestra sesión no es nueva, nuestra sesión comenzó antes del cambio del valor predeterminado. Entonces podemos usar Select @@global.sort_buffer_size para consultar el valor global

mysql> SELECT @@global.sort_buffer_size;
+---------------------------+
| @@global.sort_buffer_size |
+---------------------------+
|                    524288 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT @@global.sort_buffer_size, @@session.sort_buffer_size;
+---------------------------+----------------------------+
| @@global.sort_buffer_size | @@session.sort_buffer_size |
+---------------------------+----------------------------+
|                    524288 |                     262144 |
+---------------------------+----------------------------+
1 row in set (0.00 sec)

Parámetros de configuración persistentes:

verifique sort_buffer_size del esquema de rendimiento, las variables de sesión y la tabla de variables globales.

mysql> SELECT * FROM performance_schema.session_variables WHERE variable_name LIKE 'sort_buffer_size';
+------------------+----------------+
| VARIABLE_NAME    | VARIABLE_VALUE |
+------------------+----------------+
| sort_buffer_size | 262144         |
+------------------+----------------+
1 row in set (0.01 sec)

mysql> SELECT * FROM performance_schema.global_variables WHERE variable_name LIKE 'sort_buffer_size';
+------------------+----------------+
| VARIABLE_NAME    | VARIABLE_VALUE |
+------------------+----------------+
| sort_buffer_size | 262144         |
+------------------+----------------+
1 row in set (0.01 sec)

Ambos son iguales ya que no lo hemos cambiado todavía. Verifiquemos de dónde proviene este valor.

mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'sort_buffer_size';
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
| VARIABLE_NAME    | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE            | SET_TIME | SET_USER | SET_HOST |
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
| sort_buffer_size | GLOBAL          | /etc/my.cnf   | 32768     | 18446744073709551615 | NULL     | NULL     | NULL     |
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
1 row in set (0.01 sec)

Entonces podemos ver que la variable proviene de /etc/my.cnf y el valor VARIABLE_SOURCE es GLOBAL ya que esto no ha cambiado, pero la sesión seleccionó el valor global al momento de la conexión.

Cambiemos Global sor_buffer_size y veamos cuál será el resultado.

mysql> SET GLOBAL sort_buffer_size = 512 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'sort_buffer_size';
+------------------+-----------------+---------------+-----------+----------------------+----------------------------+----------+-----------+
| VARIABLE_NAME    | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE            | SET_TIME                   | SET_USER | SET_HOST  |
+------------------+-----------------+---------------+-----------+----------------------+----------------------------+----------+-----------+
| sort_buffer_size | DYNAMIC         |               | 32768     | 18446744073709551615 | 2020-08-09 11:04:01.681846 | root     | localhost |
+------------------+-----------------+---------------+-----------+----------------------+----------------------------+----------+-----------+
1 row in set (0.01 sec)

Ahora, como podemos ver que la fuente es dinámica, SET_TIME se ha cambiado y es el usuario raíz el que ha realizado los cambios.

Verifiquemos una variable que no está en my.cnf como el tiempo de espera.

mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'wait_timeout';
+---------------+-----------------+---------------+-----------+-----------+----------+----------+----------+
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | SET_TIME | SET_USER | SET_HOST |
+---------------+-----------------+---------------+-----------+-----------+----------+----------+----------+
| wait_timeout  | COMPILED        |               | 1         | 31536000  | NULL     | NULL     | NULL     |
+---------------+-----------------+---------------+-----------+-----------+----------+----------+----------+
1 row in set (0.00 sec)

Puede ver que la fuente variable, en este caso, es COMPILED lo que significa que estamos usando el valor predeterminado del servidor. Cambiémoslo a otra cosa.

mysql> SET GLOBAL wait_timeout=100;
Query OK, 0 rows affected (0.00 sec)

Ahora, si volvemos a verificar, la fuente será dinámica, ahí vamos.

mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'wait_timeout';
+---------------+-----------------+---------------+-----------+-----------+----------------------------+----------+-----------+
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE | SET_TIME                   | SET_USER | SET_HOST  |
+---------------+-----------------+---------------+-----------+-----------+----------------------------+----------+-----------+
| wait_timeout  | DYNAMIC         |               | 1         | 31536000  | 2020-08-09 11:08:57.537268 | root     | localhost |
+---------------+-----------------+---------------+-----------+-----------+----------------------------+----------+-----------+
1 row in set (0.01 sec)

Hagamos esto persistente con el comando PERSIST. NOTA no hemos agregado estos cambios en el archivo my.cnf

mysql> SET PERSIST wait_timeout=100;
Query OK, 0 rows affected (0.00 sec)

Salga del cliente MySQL y verifique que la configuración esté realmente en mysqld-auto.cnf.

[[email protected] ~]# sudo cat /var/lib/mysql/mysqld-auto.cnf
{ "Version" : 1 , "mysql_server" : { "mandatory_roles" : { "Value" : "dbt3_read23" , "Metadata" : { "Timestamp" : 1592984803211900 , "User" : "root" , "Host" : "localhost" } } , "wait_timeout" : { "Value" : "100" , "Metadata" : { "Timestamp" : 1596960656007284 , "User" : "root" , "Host" : "localhost" } } } }

Reinicie el servidor mysql y verifique que la ruta del valor de la variable wait_timeout esté llegando, vendrá de /var/lib/mysql/mysqld-auto.cnf como se muestra a continuación.

mysql> SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'wait_timeout';
+---------------+-----------------+--------------------------------+-----------+-----------+----------------------------+----------+-----------+
| VARIABLE_NAME | VARIABLE_SOURCE | VARIABLE_PATH                  | MIN_VALUE | MAX_VALUE | SET_TIME                   | SET_USER | SET_HOST  |
+---------------+-----------------+--------------------------------+-----------+-----------+----------------------------+----------+-----------+
| wait_timeout  | PERSISTED       | /var/lib/mysql/mysqld-auto.cnf | 1         | 31536000  | 2020-08-09 11:10:56.007284 | root     | localhost |
+---------------+-----------------+--------------------------------+-----------+-----------+----------------------------+----------+-----------+
1 row in set (0.01 sec)

Si verifica el valor de 'sort_buffer_size', sigue siendo el mismo que no cambiamos su valor, aún proviene de la misma ruta y la fuente es GLOBAL.

mysql>  SELECT * FROM performance_schema.variables_info WHERE variable_name LIKE 'sort_buffer_size';
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
| VARIABLE_NAME    | VARIABLE_SOURCE | VARIABLE_PATH | MIN_VALUE | MAX_VALUE            | SET_TIME | SET_USER | SET_HOST |
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
| sort_buffer_size | GLOBAL          | /etc/my.cnf   | 32768     | 18446744073709551615 | NULL     | NULL     | NULL     |
+------------------+-----------------+---------------+-----------+----------------------+----------+----------+----------+
1 row in set (0.00 sec)