Konfigurowanie MySQL 8
MySQL ma dwa rodzaje parametrów:
Statyczny, który zaczyna obowiązywać po ponownym uruchomieniu serwera MySQL Dynamiczny, który można zmienić online bez ponownego uruchamiania serwera MySQL, działa w wersji 5.7 i nowszych.
Zmienne można ustawić w następujący sposób:
- Plik konfiguracyjny
- Skrypt startowy
- Za pomocą polecenia SET
- Utrzymujące się parametry konfiguracji
Korzystanie z pliku konfiguracyjnego:
Plik konfiguracyjny można znaleźć w /etc/my.cnf (RHL i CENTOS) i /etc/mysql/my.cnf (Debian), możesz edytować ten plik w wybranym przez siebie edytorze.
Plik konfiguracyjny ma poniższe sekcje, powiązany parametr powinien być pod nimi przechowywany.
- [mysql]:Sekcja jest odczytywana przez klienta wiersza poleceń mysql
- [klient]:Sekcja jest czytana przez wszystkich łączących się klientów (w tym mysql cli)
- [mysqld]:Sekcja jest odczytywana przez serwer mysql
- [mysqldump]:Sekcja jest odczytywana przez narzędzie do tworzenia kopii zapasowych o nazwie mysqldump
- [mysqld_safe]:odczytywany przez mysqld_safeprocess (skrypt startowy MySQL Server)
[[email protected] ~]# mysql -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 1 |
zmień parametr server-id na 2 i zrestartuj serwer 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|
Korzystanie z parametrów w skrypcie startowym:
Załóżmy, że chcesz uruchomić MySQL za pomocą skryptu startowego, a nie przez systemd,
szczególnie do testowania lub do tymczasowej zmiany. Możesz przekazać zmienne do skryptu
zamiast zmieniać go w pliku konfiguracyjnym
# /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 &
Widać, że parametr –init-file jest przekazywany do serwera. Serwer wykonuje instrukcje SQL w tym pliku przed uruchomieniem
Korzystanie ze zmiennych globalnych i sesyjnych:
Istnieją dwa typy zmiennych w zależności od zakresu zmiennej:
Globalny:dotyczy wszystkich nowych połączeń
Sesja:Dotyczy tylko bieżącego połączenia (sesji)
W tym przykładzie użyję sort_buffer_size, ponieważ ma to zasięg globalny i na poziomie sesji, więc to bardzo dobrze wyjaśni ten zakres.
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)
Nie zmieniło się to, ponieważ rozmiar sort_buffer ma zarówno zasięg globalny, jak i na poziomie sesji, a globalny jest po prostu domyślny dla nowych sesji. Używaliśmy tego samego połączenia klienta przez cały czas, więc z tym samym globalnym zmieniliśmy domyślne dla nowych sesji, ale nasza sesja nie jest nowa, nasza sesja rozpoczęła się przed zmianą domyślnej. Możemy więc użyć Select @@global.sort_buffer_size do zapytania o wartość globalną
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)
Utrzymujące się parametry konfiguracji:
sprawdź sort_buffer_size ze schematu wydajności, zmiennych sesji i tabeli zmiennych globalnych.
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)
Oba są takie same, ponieważ jeszcze tego nie zmieniliśmy. Sprawdź, czy ta wartość pochodzi.
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)
Widzimy więc, że zmienna pochodzi z /etc/my.cnf, a wartość VARIABLE_SOURCE jest GLOBALNA, ponieważ nie została zmieniona, ale sesja wybrała wartość globalną po połączeniu.
Zmieńmy globalny rozmiar sor_buffer_size i zobaczmy, jaki będzie wynik.
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)
Teraz jak widzimy, że źródło jest dynamiczne, SET_TIME został zmieniony i to użytkownik root dokonał zmian.
Sprawdźmy zmienną, której nie ma w my.cnf, jak np. limit czasu oczekiwania.
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)
Widać, że źródło zmiennej, w tym przypadku, jest SKOMPILOWANE co oznacza, że używamy domyślnej wartości serwera. Zmieńmy to na coś innego.
mysql> SET GLOBAL wait_timeout=100; Query OK, 0 rows affected (0.00 sec)
Teraz, jeśli sprawdzimy ponownie, źródło będzie dynamiczne, gotowe.
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)
Sprawmy, aby było to trwałe za pomocą polecenia PERSIST. UWAGA nie dodaliśmy tych zmian w pliku my.cnf
mysql> SET PERSIST wait_timeout=100; Query OK, 0 rows affected (0.00 sec)
Wyjdź z klienta MySQL i sprawdź, czy ustawienie rzeczywiście znajduje się w 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" } } } }
Zrestartuj serwer mysql i sprawdź ścieżkę z wartości zmiennej wait_timeout, która będzie pochodzić z /var/lib/mysql/mysqld-auto.cnf, jak pokazano poniżej.
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)
Jeśli zaznaczysz wartość „sort_buffer_size”, to nadal jest taka sama, ponieważ nie zmieniliśmy jej wartości, nadal pochodzi z tej samej ścieżki, a źródło jest GLOBALNE.
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)