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/07/04 16:08] niccolodoc:appunti:linux:sa:mysql [2026/04/24 15:19] (current) – [Restore selettivo di un database] niccolo
Line 18: Line 18:
  
 Il server MySQL sta in ascolto sulla porta **TCP 3306**, nell'installazione standard Debian (Lenny) è in ascolto solo su localhost, per collegarlo anche agli altri indirizzi IP bisogna commentare la riga di **bind-address** contenuta in **''/etc/mysql/my.cnf''**. Il server MySQL sta in ascolto sulla porta **TCP 3306**, nell'installazione standard Debian (Lenny) è in ascolto solo su localhost, per collegarlo anche agli altri indirizzi IP bisogna commentare la riga di **bind-address** contenuta in **''/etc/mysql/my.cnf''**.
 +
 +Con Debian più recenti, ad esempio **Debian 11 Bullseye**, è installato il motore MariaDB ed è possibile utilizzare uno snippet di configurazione a parte, ad esempio creando il file **/etc/mysql/mariadb.conf.d/99-local.cnf** con:
 +
 +<file>
 +[mysqld]
 +bind-address = 0.0.0.0
 +</file>
  
 ===== Speciale Debian ===== ===== Speciale Debian =====
Line 142: Line 149:
 SET PASSWORD FOR root=PASSWORD('secret'); SET PASSWORD FOR root=PASSWORD('secret');
 SET PASSWORD FOR dbuser@10.0.1.2=PASSWORD('secret'); SET PASSWORD FOR dbuser@10.0.1.2=PASSWORD('secret');
 +</code>
 +
 +La password è memorizzata storicamente nel campo **Password** della tabella **user**, ma versioni più recenti del motore MySQL (ad esempio **MariaDB 10**) possono usare plugin aggiuntivi e le informazioni staranno nei campi **plugin** e **authentication_string**:
 +
 +<code>
 +SELECT Host, User, Password, plugin, authentication_string FROM user;
 ++-----------+-----------+----------------+-----------------------+-----------------------+
 +| Host      | User      | Password       | plugin                | authentication_string |
 ++-----------+-----------+----------------+-----------------------+-----------------------+
 +| localhost | root      | *CAE6919BF3... |                                             |
 +| localhost | user1                    | mysql_native_password | *1472E83A1E...        |
 +| localhost | user2     | *B4C990D89F... |                                             |
 ++-----------+-----------+----------------+-----------------------+-----------------------+
 </code> </code>
  
Line 159: 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 268: 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>
  
doc/appunti/linux/sa/mysql.1656943707.txt.gz · Last modified: by niccolo