Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Konfiguracja MySQL 8

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)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SUBDATE() vs DATE_SUB() w MySQL:jaka jest różnica?

  2. mysql_fetch_array zwraca tylko jeden wiersz

  3. Błąd MySQL 1215:Nie można dodać ograniczenia klucza obcego

  4. Wybieranie losowych wierszy w MySQL

  5. Jak obliczyć sumę bieżącą w MySQL