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.

Come configurare MySQL con utf8 o utf8mb4 correttamente

Se utilizzate un database a utf8mb4 (come vi ho spiegato qui) ma nel client, come ad esempio PhpStorm o altri servizi simili, non vi funziona correttamente la codifica dei caratteri… probabilmente è perché la versione in locale che viene scaricata per gestire tutti gli schemes non è correttamente funzionante.

Potete verificarlo facendo:

show variables like "%collation%";
show variables like '%character%';

Oppure con:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

Database configurato correttamente a utf8mb4

E se per caso character_set_database o collation_database non risulta utf8, eseguite (modificando il dbname):

ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;

Se invece volete utf8mb4 come vi avevo indicato nella guida precedente, vi basterà eseguire:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ora rieseguendo la query precedente dovreste avere tutto correttamente configurato.

Come rendere MySQL compatibile con utf8mb4

Di default MySQL supporta utf8 solo a 3 byte, in realtà per avere massima compatibilità con tutte le tipologie di caratteri (quali ad esempio emojis e altri caratteri non latini) bisogna utilizzare utf8mb4 invece di utf8 normale.

E per farlo dovete semplicemente incollare queste righe all’interno del file di configurazione, che potete trovare qui:

sudo nano /etc/mysql/mysql.cnf oppure dentro /etc/my.cnf.

Al fondo inserite:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

Poi riavviate il servizio semplicemente con sudo service mysql restart.

Come installare phpMyAdmin

Lo so, avevamo già trattato l’argomento phpMyAdmin con una bella guida su come rimuoverlo. Oggi però vediamo come installarlo, indipendentemente da quale sia il vostro sistema operativo.

Se avete Debian o Ubuntu (presupponendo che sia all’ultima versione) vi basterà eseguire dal terminale:

sudo apt install phpmyadmin

Seguite poi i passaggi a schermo e controllate che sia tutto corretto da browser.

Se invece avete Arch:

pacman -S phpmyadmin php-mcrypt

Modificate il file:

nano /etc/php/php.ini

Aggiungendo:

Alias /phpmyadmin "/usr/share/webapps/phpMyAdmin"
 <Directory "/usr/share/webapps/phpMyAdmin">
  DirectoryIndex index.php
  AllowOverride All
  Options FollowSymlinks
  Require all granted
 </Directory>i

E alla fine di:

nano /etc/httpd/conf/httpd.conf

Aggiungete questa riga:

Include conf/extra/phpmyadmin.conf

Riavviate con systemctl restart httpd e voilà.

Come importare un intero database con MySQL

Dopo aver visto come esportare un intero db con mysqldump, mi sembra logico spiegarvi come importarlo. Loggatevi prima con l’utente root:

sudo mysql -u root -p

Create un nuovo db chiamato new con:

create database new;

Poi uscite eseguendo un exit (poi premete invio). Presupponendo che ora siete nel path giusto (e che il file esportato sia dbs.sql come nell’altra guida), eseguite:

sudo mysql -u root -p new < dbs.sql

Mi raccomando aspettate che finisca tutto prima di chiudere o cambiare operazione… è un’operazione alquanto rischiosa!

Come esportare un intero database su MySQL

In qualche articolo precedente avevamo visto come fare un backup con uno script Bash, ora vediamo più semplicemente come esportare un intero db di MySQL con una riga di codice:

sudo mysqldump -u root -p -x -A > /home/user/dbs.sql

Dovrete cambiare l’user root, nel caso non abbiate quell’utente come amministratore con i privilegi. E anche il path con il vostro utente invece di user.

Questo sappiate che vi esporterà tutti i database contenuti al suo interno, compresi quelli di sistema o quelli di phpMyAdmin.

Come accettare connessioni remote con MySQL e MariaDB

Dal titolo si capisce già tutto (se siete ovviamente interessati ad accettare connessioni remote) quindi non sto a dare troppi dettagli, andiamo subito alla pratica. Modificate questo file:

sudo nano /etc/mysql/my.cnf

E aggiungete al fondo (cambiando username e password ovviamente):

[client]
user=root
password=password
port=3306
socket=/var/run/mysql/mysql.sock
[mysqld]
bind-address=0.0.0.0

Notare che la porta 3306 è quella di default utilizzata da MySQL e il bind address è tutta la vostra rete locale.

Una volta salvato, riavviate il servizio con:

sudo service mysql restart

Ora provate a connettervi. Se non dovesse ancora connettersi, forzate l’apertura della porta (nel caso non abbiate riavviato) con:

sudo iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT

Tutto questo può esservi molto utile se utilizzate PhpStorm o altri software di gestione remota di SQL e db vari. Ed è ovviamente compatibile con Raspberry Pi e anche su tutti gli altri sistemi operativi Debian o Ubuntu.

Come rimuovere phpMyAdmin

Qualche secolo fa avevamo visto come installare un web server, oggi vediamo come rimuovere questo amatissimo phpMyAdmin. Aprite il terminale ed eseguite molto intuitivamente:

sudo apt-get purge phpmyadmin*

Nel caso vi dia qualche errore provate a riconfigurare i pacchetti:

sudo dpkg-reconfigure phpmyadmin

E poi riprovate il comando purge.

Successivamente rimuovete ricorsivamente anche la cartella (nel caso non ve l’abbia rimossa):

sudo rm -R /usr/share/phpmyadmin

Come fare il backup a un database MySQL con uno script Bash

Ok anche in questo caso, se volete fare il backup intero a un vostro database in MySQL, vi basterà usare questo semplice script (che in automatico vi zippa anche il file .sql creato):

sudo nano database.sh

Incollate dentro (cambiando ovviamente i vostri parametri):

#!/bin/bash

user="root"
password="pass123"
host="localhost"
db_name="mydb"
backup_path="/home"
date=`date '+%Y%m%d%H%M%S'`

mysqldump --user=$user --password=$password --host=$host $db_name > $backup_path/$db_name-$date.sql
tar -zcvf $db_name-$date.tar.gz $db_name-$date.sql

Dategli i permessi con:

sudo chmod 777 database.sh

E fatevi un bel cron job ogni mattina alle 8.00 con:

sudo crontab -e

Incollando dentro:

0 8 * * * /path/database.sh

Come installare Monit su Raspberry Pi

Monit è un servizio che vi permette (il nome lo lasciava intuire) di monitorare diversi servizi e applicativi che volete rimangano sempre attivi e che non smettano di funzionare da un momento all’altro.

Detto in parole semplici, ogni 2 minuti (potrete cambiarlo) controlla che tutto sia ok, nel caso non lo sia può riportare i servizi in running oppure eseguire qualche operazione tipo un avviso tramite email o qualcosa di simile.

Arriviamo al dunque:

sudo apt-get install monit

Successivamente modificate il file:

sudo nano /etc/monit/monitrc

Togliendo il commento a queste righe per far in modo che possiate controllarlo:

set httpd port 2812
use address localhost # only accept connection from localhost
allow localhost # allow localhost to connect to the server and
allow admin:monit

Poi riavviate monit con: monit reload

E controllate lo stato con monit status e voilà.

Nelle prossime guide vedremo come tener attivi SQL e Apache (nel caso abbiate dei web server che volete rimangano always on).