Mysql
 sql >> база данни >  >> RDS >> Mysql

Конфигурация на MySQL 8

Конфигуриране на MySQL 8

MySQL има два типа параметри:

Статично, което влиза в сила след рестартиране на MySQL сървър Dynamic, който може да се променя онлайн без рестартиране на MySQL сървъра работи във версия 5.7 и по-нова.

Променливите могат да се задават чрез следното:

  • Конфигурационен файл
  • Скрипт за стартиране
  • Използване на команда SET
  • Постоянни конфигурационни параметри

Използване на конфигурационен файл:

Конфигурационният файл може да бъде намерен в  /etc/my.cnf (RHL и CENTOS) и /etc/mysql/my.cnf (Debian), можете да редактирате този файл в избран от вас редактор.

Конфигурационният файл има секции по-долу, свързаният параметър трябва да се съхранява под тях.

  • [mysql]:Разделът се чете от клиента на командния ред на mysql
  • [клиент]:Разделът се чете от всички свързващи се клиенти (включително mysql cli)
  • [mysqld]:Разделът се чете от mysqlserver
  • [mysqldump]:Разделът се чете от помощната програма за архивиране, наречена mysqldump
  • [mysqld_safe]:Чете се от mysqld_safeprocess (скрипт за стартиране на MySQL Server)
[[email protected] ~]# mysql -e "select @@server_id;"
+-------------+
| @@server_id |
+-------------+
|           1 |

променете параметъра server-id на 2 и рестартирайте 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|

Използване на параметри със скрипта за стартиране:

Да предположим, че искате да стартирате MySQL с помощта на скрипт за стартиране, а не чрез systemd,

особено за тестване или за някаква временна промяна. Можете да предадете променливите на скрипта

вместо да го променяте в конфигурационния файл

# /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 &

Можете да видите, че параметърът –init-file се предава на сървъра. Сървърът изпълнява SQL операторите в този файл, преди да стартира

Използване на глобални и сесийни променливи:

Има два типа променливи въз основа на обхвата на променливата:

Глобално:Прилага се за всички нови връзки

Сесия:Отнася се само за текущата връзка (сесия)

Ще използвам sort_buffer_size за този пример, защото има глобален обхват и обхват на ниво сесия, така че това ще обясни обхвата много добре.

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)

Не се промени, защото размерът на sort_buffer има както глобален, така и обхват на ниво сесия, а глобалният е само по подразбиране за нови сесии. Използвахме една и съща клиентска връзка през целия път, така че със същата глобална промяна сменихме стандартното за нови сесии, но нашата сесия не е нова, нашата сесия започна преди промяната на стандартната. Така че можем да използваме Select @@global.sort_buffer_size за запитване на глобалната стойност

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)

Постоянни конфигурационни параметри:

проверете sort_buffer_size от  схемата на производителността, променливите на сесията и таблицата с глобални променливи.

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)

И двете са еднакви, тъй като все още не сме го променили. Нека проверим дали тази стойност идва от.

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)

Така че можем да видим, че променливата идва от /etc/my.cnf и стойността на VARIABLE_SOURCE е GLOBAL, тъй като това не е променено, но сесията е избрала глобалната стойност при свързване.

Нека променим Global sor_buffer_size и да видим какъв ще бъде резултатът.

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)

Сега, както виждаме, че източникът е динамичен, SET_TIME е променен и коренният потребител е направил промените.

Нека проверим променлива, която не е в my.cnf, като изчакване на изчакване.

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)

Можете да видите, че източникът на променливата в този случай е COMPILED което означава, че използваме стойността по подразбиране на сървъра. Нека го променим с нещо друго.

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

Сега, ако проверим отново, източникът ще бъде динамичен, така.

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)

Нека направим това постоянно с командата PERSIST. ЗАБЕЛЕЖКА не сме добавили тези промени във файла my.cnf

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

Излезте от MySQL клиента и проверете дали настройката наистина е в 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" } } } }

Рестартирайте mysql сървъра и проверете дали пътят от променливата wait_timeout идва, той ще идва от /var/lib/mysql/mysqld-auto.cnf, както е показано по-долу.

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)

Ако проверите стойността за „sort_buffer_size“, тя все още е същата, тъй като не сме променили стойността й, все още идва от същия път и източникът е 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)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да извлечете подниз от низ в PostgreSQL/MySQL

  2. Левещайн:MySQL + PHP

  3. mysql_fetch_assoc():предоставеният аргумент не е валиден ресурс за MySQL резултат в php

  4. Измерване на действителното време на MySQL заявка

  5. Имена на динамични таблици във функцията за съхранена процедура