User Tools

Site Tools


doc:appunti:linux:sa:mysql

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:appunti:linux:sa:mysql [2022/11/21 16:16] – [Configurazione e uso MySQL] niccolodoc:appunti:linux:sa:mysql [2026/09/09 15:29] (current) – [Debug query MySQL] niccolo
Line 179: Line 179:
 </code> </code>
  
 +
 +===== Restore del database mysql =====
 +
 +Le informazioni su **account utente**, **password**, **privilegi** e **permessi** sono contenute nel database di nome **mysql**. È possibile fare il restore di tale database (se ne è stato fatto il dump), ma si deve verificare che le versioni di MariaDB origine e destinazionesiano le stesse. Tale procedura è consigliata solo nel caso in cui si debba recuperare un sistema su una installazione vuota del server MariaDB.
 +
 +La procedura seguente reinizializza completamente il server, recupera il dump e ripristina l'accesso root senza password come da impostazione predefinita Debian:
 +
 +<code bash>
 +systemctl stop mariadb.service
 +rm -r /var/lib/mysql
 +mkdir /var/lib/mysql
 +chown mysql:mysql /var/lib/mysql
 +mariadb-install-db --user=mysql --datadir=/var/lib/mysql
 +systemctl start mariadb.service
 +zcat mysql.sql.gz | mysql mysql
 +</code>
 +
 +Quindi ci si collega la back-end
 +
 +<code>
 +mysql mysql
 +</code>
 +
 +e si impartiscono i comandi SQL:
 +
 +<code sql>
 +ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket;
 +FLUSH PRIVILEGES;
 +</code>
 +
 +
 +
 +
 +===== Restore selettivo di un database =====
 +
 +Se si ha un dump generato con **%%mysqldump --all-databases%%** potrebbe essere necessario fare il restore selettivo di un solo database. Una ricetta che si trova diffusamente in rete, ma che è davvero poco efficiente, consiste nel filtrare l'intero dump con il comando **sed** intercettando nelle istruzioni SQL l'inizio e la fine del database.
 +
 +Questo comando estrae dal dump compresso il singolo database e lo scrive in un dump SQL non compresso:
 +
 +<code bash>
 +zcat mysql-dump.sql.gz \
 +    | sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' \
 +    > dbname-dump.sql
 +</code>
  
 ===== Visualizzare gli errori ===== ===== Visualizzare gli errori =====
Line 288: Line 332:
 SET GLOBAL general_log_file = '/var/log/mysql/mysql.log'; SET GLOBAL general_log_file = '/var/log/mysql/mysql.log';
 SET GLOBAL general_log = 1; SET GLOBAL general_log = 1;
 +</code>
 +
 +Abilitare il logging solo per lo stretto necessario, per evitare consumo di risorse. Impostare **general_log = 0** per fermare il logging.
 +
 +Per vedere le impostazini correnti:
 +
 +<code sql>
 +SHOW GLOBAL VARIABLES LIKE 'general_log_file';
 </code> </code>
  
Line 391: Line 443:
  
 Ovviamente i dati contenuti nella tabella sono persi, ma dovrebbe essere possibile ricostruire la struttura dal file **frm**. Nella pagina **[[https://medium.com/@badalnaik/mariadb-mysql-restore-database-from-frm-and-ibd-files-6ea95269fba2|MariaDB/MySQL — Restore Database From .frm And .ibd Files]]** c'è una ricetta che però richiede il tool **mysqlfrm**. Si tratta di uno script Python che veniva distribuito con il pacchetto **mysql-utilities** ma solo nella vecchia **Debian 9 Stretch**. Ovviamente i dati contenuti nella tabella sono persi, ma dovrebbe essere possibile ricostruire la struttura dal file **frm**. Nella pagina **[[https://medium.com/@badalnaik/mariadb-mysql-restore-database-from-frm-and-ibd-files-6ea95269fba2|MariaDB/MySQL — Restore Database From .frm And .ibd Files]]** c'è una ricetta che però richiede il tool **mysqlfrm**. Si tratta di uno script Python che veniva distribuito con il pacchetto **mysql-utilities** ma solo nella vecchia **Debian 9 Stretch**.
 +
 +===== Debug query MySQL =====
 +
 +È possibile avere l'elenco dei processi in esecuzione da parte di **mysqld** e vari dettagli su di essi:
 +
 +<code sql>
 +SHOW FULL PROCESSLIST\G
 +</code>
 +
 +In particolare è utile esaminare i processi di tipo **Query** e che hanno **Time** (secondi di running time) elevati:
 +
 +<code>
 +...
 +Command: Query
 +   Time: 85262
 +  State: executing
 +   Info: ...
 +</code>
 +
 +Nella riga **Info** è possibile leggere la query eseguita.
 +
 +Una query più strutturata per vedere lo stesso tipo di informazioni è la seguente:
 +
 +<code sql>
 +SELECT ID, USER, HOST, DB, COMMAND, TIME, LEFT(STATE,30) AS STATE, LEFT(INFO,30) AS INFO
 +    FROM information_schema.PROCESSLIST
 +    WHERE COMMAND <> 'Sleep'
 +    ORDER BY TIME DESC;
 +</code>
 +
 +Il campo **STATE** e **INFO** sono stati troncati a 30 caratteri per leggibilità, può essere necessario visualizzarli per intero. Se si vuole ispezionare solo le query (e non ad esempio i processi che gestiscono le repliche remote) si può imporre la clausola **%%WHERE COMMAND = 'Query'%%**.
 +
 +Un'altra utile informazione di debug è conoscere da quale utente/host sono arrivate le query attualmente in esecuzione:
 +
 +<code sql>
 +SELECT USER,HOST,COUNT(*) AS queries
 +    FROM information_schema.PROCESSLIST
 +    WHERE COMMAND <> 'Sleep'
 +    GROUP BY USER,HOST
 +    ORDER BY queries DESC;
 +</code>
 +
 +che restituisce qualcosa del tipo:
 +
 +<code>
 ++-----------------+---------------------+---------+
 +| USER            | HOST                | queries |
 ++-----------------+---------------------+---------+
 +| asterisk        | localhost                 4 |
 +| system user                               2 |
 +| system user     | connecting host           2 |
 +| event_scheduler | localhost                 1 |
 +| root            | localhost                 1 |
 +| replication     | 66.129.155.28:34304 |       1 |
 +| replication     | 176.39.122.13:49282 |       1 |
 ++-----------------+---------------------+---------+
 +</code>
 +
  
doc/appunti/linux/sa/mysql.1669043805.txt.gz · Last modified: by niccolo