Конфигуриране на 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)