Configurazione di MySQL 8
MySQL ha due tipi di parametri:
Statico, che ha effetto dopo il riavvio del server MySQL Dinamico, che può essere modificato online senza riavviare il server MySQL funziona nella versione 5.7 e successive.
Le variabili possono essere impostate tramite:
- File di configurazione
- Script di avvio
- Utilizzo del comando SET
- Parametri di configurazione persistenti
Utilizzo del file di configurazione:
Il file di configurazione può essere trovato in /etc/my.cnf (RHL e CENTOS) e /etc/mysql/my.cnf(Debian), puoi modificare questo file con l'editor che preferisci.
Il file di configurazione ha le sezioni seguenti, il relativo parametro deve essere mantenuto sotto di esse.
- [mysql]:la sezione viene letta dal client della riga di comando mysql
- [client]:la sezione viene letta da tutti i client di connessione (incluso mysql cli)
- [mysqld]:la sezione viene letta da mysqlserver
- [mysqldump]:la sezione viene letta dall'utilità di backup chiamata mysqldump
- [mysqld_safe]:letto da mysqld_safeprocess (script di avvio di MySQL Server)
[[email protected] ~]# mysql -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 1 |
cambia il parametro server-id su 2 e riavvia il server 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|
Utilizzo dei parametri con lo script di avvio:
Supponiamo di voler avviare MySQL utilizzando uno script di avvio e non tramite systemd,
soprattutto per test o per qualche cambiamento temporaneo. Puoi passare le variabili allo script
invece di cambiarlo nel file di configurazione
# /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 &
Puoi vedere che il parametro –init-file viene passato al server. Il server esegue le istruzioni SQL in quel file prima di iniziare
Utilizzo delle variabili globali e di sessione:
Esistono due tipi di variabili in base all'ambito della variabile:
Globale:si applica a tutte le nuove connessioni
Sessione:si applica solo alla connessione corrente (sessione)
Userò sort_buffer_size per questo esempio perché ha un ambito globale ea livello di sessione, quindi questo spiegherà molto bene l'ambito.
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)
Non è cambiato perché la dimensione di sort_buffer ha un ambito sia globale che a livello di sessione e il globale è solo un valore predefinito per le nuove sessioni. Stavamo usando la stessa connessione client per tutto il percorso, quindi con lo stesso globale abbiamo cambiato l'impostazione predefinita per le nuove sessioni ma la nostra sessione non è nuova, la nostra sessione è iniziata prima della modifica dell'impostazione predefinita. Quindi possiamo usare Select @@global.sort_buffer_size per interrogare il valore globale
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)
Parametri di configurazione persistenti:
controlla sort_buffer_size dallo schema delle prestazioni, dalle variabili di sessione e dalla tabella delle variabili globali.
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)
Entrambi sono gli stessi perché non l'abbiamo ancora cambiato. Verifica che provenga questo valore.
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)
Quindi possiamo vedere che la variabile proviene da /etc/my.cnf e il valore VARIABLE_SOURCE è GLOBAL poiché non è stato ancora modificato la sessione ha selezionato il valore globale al momento della connessione.
Cambiamo il Global sor_buffer_size e vediamo quale sarà il risultato.
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)
Ora come possiamo vedere che l'origine è dinamica, SET_TIME è stato modificato ed è l'utente root che ha apportato le modifiche.
Controlliamo una variabile che non è in my.cnf come il timeout di attesa.
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)
Puoi vedere che la variabile sorgente, in questo caso, è COMPIATA il che significa che stiamo utilizzando il valore predefinito del server. Cambiamo in qualcos'altro.
mysql> SET GLOBAL wait_timeout=100; Query OK, 0 rows affected (0.00 sec)
Ora se controlliamo di nuovo la sorgente sarà dinamica, ecco fatto.
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)
Rendiamolo persistente con il comando PERSIST. NOTA non abbiamo aggiunto queste modifiche nel file my.cnf
mysql> SET PERSIST wait_timeout=100; Query OK, 0 rows affected (0.00 sec)
Esci dal client MySQL e verifica che l'impostazione sia effettivamente in 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" } } } }
Riavvia il server mysql e controlla che il percorso dalla variabile wait_timeout sia in arrivo, proverrà da /var/lib/mysql/mysqld-auto.cnf come mostrato di seguito.
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)
Se controlli il valore per 'sort_buffer_size' è sempre lo stesso perché non abbiamo cambiato il suo valore, proviene ancora dallo stesso percorso e la fonte è 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)