Valorile variabilelor de sistem de la nivelul unui server MySQL pot fi stabilite: prin intermediul fisierelor de configurare MySQL (valorile sunt pastrate pana la modificarea / stergerea optiunilor de configurare specifice); din linia de comanda, prin intermediul parametrilor transmisi la pornirea serverului (valorile sunt pastrate pana la o noua repornire a serverului); sau prin comanda SET, daca variabilele prezinta un caracter dinamic (valorile sunt pastrate pana la o noua repornire a serverului).
Clasificarea variabilelor de sistem MySQL se poate realiza pe baza tipului, respectiv a scopului acestora. Astfel, din punct de vedere a tipului, variabilele de sistem pot fi statice, este necesara repornirea serverului pentru activarea lor, respectiv dinamice, activarea lor se realizeaza dupa actualizarea valorii acestora. Pe baza vizibilitatii, variabilele de sistem pot fi clasificate in alte doua categorii: globale, se aplica pentru toate conexiunile nou stabilite; de sesiune, se aplica doar la nivelul sesiunii curente.
Variabila de sistem server_id precizeaza un identificator pentru serverul MySQL, identificator care poate fi utilizat in topologii de replicare. Aceasta variabila prezinta un caracter global dinamic, si implicit detine valoarea 1.
mysql> SHOW GLOBAL VARIABLES -> WHERE `Variable_name`='server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+ 1 row in set (0.05 sec)
Deoarece variabila server_id este una dinamica, este posibila actualizarea ei si prin intermediul comenzii SET, in absenta repornirii serverului MySQL.
mysql> SET GLOBAL server_id = 2; Query OK, 0 rows affected (0.05 sec) mysql> SHOW GLOBAL VARIABLES -> WHERE `Variable_name`='server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 2 | +---------------+-------+ 1 row in set (0.05 sec)
Asa cum am precizat anterior, o repornire a serverului MySQL va determina pierderea valorii variabilei server_id, valoare stabilita la pasul precedent folosind comanda SET.
root@dba:# sudo systemctl restart mysql root@dba:# sudo systemctl status mysql ● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-03-18 15:07:48 EET; 4s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 11842 ExecStartPre=/usr/share/mysql-8.0/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 11877 (mysqld) Status: "Server is operational" Tasks: 38 (limit: 4915) Memory: 336.6M CGroup: /system.slice/mysql.service └─11877 /usr/sbin/mysqld Mar 18 15:07:48 dba systemd[1]: Starting MySQL Community Server... Mar 18 15:07:48 dba systemd[1]: Started MySQL Community Server.
mysql> SHOW GLOBAL VARIABLES -> WHERE `Variable_name`='server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+ 1 row in set (0.05 sec)
Daca se doreste asigurarea unui caracter persistent pentru variabilele a caror valoare este stabilita prin intermediul comenzii SET, este necesara utilizarea cuvantului cheie PERSIST sau a termenului @@persist inaintea numelui variabilei.
mysql> SET PERSIST server_id = 2; Query OK, 0 rows affected (0.05 sec) mysql> SHOW GLOBAL VARIABLES -> WHERE `Variable_name`='server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 2 | +---------------+-------+ 1 row in set (0.05 sec)
root@dba:# sudo systemctl restart mysql
mysql> SHOW GLOBAL VARIABLES -> WHERE `Variable_name`='server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 2 | +---------------+-------+ 1 row in set (0.05 sec)
Dupa cum se poate observa si in secventa de mai sus, variabila globala server_id va pastra valoarea stabilita prin intermediul comenzii SET si dupa repornirea serverului MySQL.
Daca la nivelul fisierului de configurare al serverului MySQL este prezenta o optiune de configurare server_id, valoarea corespunzatoare acesteia va fi ignorata.
root@dba:# pico /etc/mysql/my.cnf
[mysqld] server_id = 1
Variabilele persistente sunt pastrate in format JSON, in fisierul mysqld-auto.cnf ce poate fi localizat la nivelul directorului de date al serverului MySQL. La nivelul acestui fisier sunt pastrate, pe langa numele variabilei si valoare stabilita pentru aceasta, si informatii care au in vedere utilizatorul care a realizat modificarea, momentul in care modificarea a fos realizata, sau statia de pe care s-a facut modificarea.
root@dba:# cat /var/lib/mysql/mysqld-auto.cnf { "Version" : 1 , "mysql_server" : { "server_id" : { "Value" : "2" , "Metadata" : { "Timestamp" : 1616073186897339 , "User" : "airman" , "Host" : "" } } } }
Aceasta informatie poate fi obtinuta si prin interogarea tabelului variables_info din baza de date performnce_schema, astfel:
mysql> SELECT VARIABLE_NAME, VARIABLE_SOURCE, SET_HOST, SET_TIME, SET_USER -> FROM performance_schema.variables_info -> WHERE VARIABLE_NAME = 'server_id'; +---------------+-----------------+----------+----------------------------+-------------+ | VARIABLE_NAME | VARIABLE_SOURCE | SET_HOST | SET_TIME | SET_USER | +---------------+-----------------+----------+----------------------------+-------------+ | server_id | PERSISTED | NULL | 2021-03-18 15:13:06.897339 | airman | +---------------+-----------------+----------+----------------------------+-------------+ 1 row in set (0.04 sec)
Lista variabilele persistente stabilite la nivelul serverului de baze de date MySQL poate fi obtinuta si prin intermediul unui alt tabel din baza de date performance_scheme, persisted_variables.
mysql> SELECT * -> FROM performance_schema.persisted_variables; +---------------+----------------+ | VARIABLE_NAME | VARIABLE_VALUE | +---------------+----------------+ | server_id | 2 | +---------------+----------------+ 1 row in set (0.04 sec)