Come mantenere MySQL attivo anche in caso di errori

In qualche guida vi ho mostrato come installare MySQL su Ubuntu o su Raspberry Pi, nel caso vogliate monitorare che tutto funzioni correttamente, potete farlo utilizzando Monit.

sudo nano /etc/monit/monitrc

Aggiungete (o togliete dai commenti) queste 3 righe:

check process mysqld with pidfile /var/run/mysqld/mysqld.pid
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"

E ricaricate Monit:

monit reload

Nel caso invece abbiate l’errore 1136, dovete seguire questa guida.

Come installare MySQL Su Raspberry Pi

La procedura è la stessa che ho indicato su Ubuntu, quindi andate a leggere quella guida.

Di default su Raspberry Pi, se installate Raspbian con la versione completa, invece di MySQL potreste avere MariaDB.

Le differenze, dipende ovviamente da che utilizzo ne dovete fare, ci sono. Ma comunque sta a voi decidere. Qui trovate un confronto molto valido.

Come installare MySQL su Ubuntu

Se volete installare un database MySQL su Ubuntu, la procedura è abbastanza veloce. Andiamo subito al sodo! Aprite il terminale ed eseguite:

sudo apt update
sudo apt upgrade
sudo apt install mysql-server

Quando avrà finito, procediamo con la configurazione iniziale:

sudo mysql_secure_installation

E seguite tutti i passaggi! Poi entrate in MySQL in root:

sudo mysql -u root -p

Ora che siete dentro create un nuovo database (cambiando le stringhe in grassetto) e un nuovo utente con password password:

CREATE DATABASE new_database;
CREATE USER 'marco'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'marco'@'localhost' WITH GRANT OPTION;

Se invece volete uscire e tornare alla schermata precedente eseguite semplicemente un:

exit

Ora se volete importare un database che avete sotto forma di .sql (magari generato da un backup da una VPS):

sudo mysql -u root -p new_database < data-dump.sql

Se invece volete esportarlo:

sudo mysqldump -u root -p new_database > data-dump.sql

Come correggere l’errore 2002 di MySQL

Altro giro, altra corsa! Anche questo fantastico errore, se vi capita (e a me capita anche su installazioni nuove e super aggiornate), può essere davvero fastidioso.

L’errore in questione è:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket...

Evidentemente perché il processo di MySQL non è attivo o non correttamente funzionante.
Controllate lo stato con un semplice sudo service mysql status.

E nel caso fosse tutto attivo, provate ad accedere alla modalità sicura come ho indicato in questo articolo.

Una volta riconfigurato l’account root, riavviate il processo con sudo service mysql restart e tutto dovrebbe rifunzionare come prima!

Come correggere l’errore 1136 di MySQL

Se mentre state cercando di aggiornare MySQL vi dovesse comparire questo errore:

mysql_upgrade: [ERROR] 1136: Column count doesn't match value count at row 1

Direi che la soluzione più veloce è modificare questo file:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

E dopo la riga [mysqld] aggiungete la voce:

skip-grant-tables

Salvate ed eseguite l’upgrade forzato:

sudo mysql_upgrade -uroot -p --force

Inserite la password e aspettate che si aggiorni! Poi riprovate ad eseguire un sudo apt upgrade e vedrete che non dovrebbe più l’errore!

Nel caso non riusciate a loggarvi con l’account root reimpostatela seguendo questa guida.
Una volta aggiornato, togliete la riga da quel file (e nel caso non sia in quel path, cercate quello corretto del processo mysqld che potrebbe essere nella cartella precedente a quella da me indicata).

Come importare grandi database MySQL con BigDump

Per importare grandi dump di database, esiste oramai da qualche anno (e devo anche dire che non è più stato aggiornato) una bella utility chiamata BigDump.

È molto semplice e vi basterà caricare questo file: https://raw.githubusercontent.com/marcotini/bigdump/master/bigdump.php nella directory in cui avete PHP funzionante.

Ovviamente dovrete fare spazio per il vostro database e/o tabelle che avete da importare (se queste non sono già contenute nel file di dump).

Per il resto l’utility è molto intuitiva e spesso potrebbe bloccarsi, quindi fate prima un backup di tutto (se avete già tabelle inserite).

Come controllare se una colonna di MySQL è codificata in UTF8

Similmente come visto per le tabelle, sarà necessario controllare che:

SELECT character_set_name FROM information_schema.`COLUMNS` C WHERE table_schema = "dbname" AND table_name = "tablename" AND column_name = "column_name";

Dia come risultato utf8 o utf8mb4.

Se così non fosse, vi basterà eseguire questa query per convertirla in utf8 o utf8mb4:

ALTER TABLE tablename CHANGE columnname columnname VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Come controllare se una tabella di MySQL è codificata in UTF8

Molto semplicemente eseguendo (cambiando ovviamente dbname e tablename) questa query potete capire la codifica:

select c.character_set_name
from information_schema.tables as t,
     information_schema.collation_character_set_applicability as c
where c.collation_name = t.table_collation
  and t.table_schema = "dbname"
  and t.table_name = "tablename";
Tabella in utf8

Se vi rendete conto che non è in utf8, vi basta eseguire (prima fate un backup):

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Altrimenti se la volete in utf8mb4:

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Altri suggerimenti su come fare conversioni potete trovarne qui, oppure qui.

Come convertire un database di MySQL da utf8 a utf8mb4

Se avete finalmente reso compatibile il vostro database a utf8mb4 e lo avete anche configurato correttamente, che ne dite di convertirlo anche? Comprese le tabelle e colonne?

Ovviamente prima fatevi un bel backup di tutto quanto… ora andiamo alla conversione!

Per ogni database (cambiate dbname):

ALTER DATABASE dbname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Per ogni tabella (cambiate tablename):

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Per ogni colonna (cambiate nome e grandezza delle colonne):

ALTER TABLE tablename CHANGE column_name column_name VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Voilà, ora dovreste essere fully compatible con utf8mb4.