Mysql Problems

Mysql timeout

as written here there are problems of mysql for timeout reasons
http://krishcon.com/blogs/20130103/MySQL-netreadtimeout-and-netwritetimout
it is necessary set this variable net_read_timeout and net_write_timeout
More info about variable of mysql are here
http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html

there is this advice to set the variable

[mysqld]
init_connect='SET net_read_timeout=1800'

other info on timeout are in this page http://www.mysqlperformanceblog.com/2007/07/08/mysql-net_write_timeout-vs-wait_timeout-and-protocol-notes/

to see the variable inside the machine

mysql> show variables like '%net%';
#or all the variables
mysql> show variables

Connessione lenta

Capita a volte quando si vuole stabilire una connessione a mysql da una macchina remota che ci siano tempi molto lunghi di enstablish 5 -6 secondi. Il problema sta nel fatto che mysql tenta di risolvere il nome del client che si connette anche se ci si connette attraverso indirizzi ip e non nomi.
Per evitare la lentezza bisogna aggiungere alla macchina dove sta in esecuzione mysql server il nome del client (in linux /etc/hosts ) oppure fare in modo che mysql non effettui più la risoluzione. Io ho scelto quest'ultima opzione e basta aggiungere al file di configurazione di mysql la riga in skip-name-resolve. Questo però non permette che i filtri basati sul nome funzionino quindi nella tabella users di mysql devono esserci solo connessioni permesse con ip o con % che indica qualsiasi tipo di connessione.

[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
skip-name-resolve

Qui ci sono i link sorgenti da cui ho preso le informazioni

http://dev.mysql.com/doc/refman/5.0/en/dns.html
http://bobbyallen.wordpress.com/2007/11/02/slow-connections-on-remote-mysql-servers/

Profiler

http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html

Password di root dimenticata su mysql

Se ci si dimentica la password dell’utente root di MySQL è possibile resettarla in modo piuttosto semplice e rapido.

Per resettare la password dell’utente root di MySQL bisogna eseguire le seguenti operazioni.
-Accedere al server su cui è presente MySQL.

-Fermare il servizio.
/etc/init.d/mysql stop

-Avviare il servizio con l’opzione -skip-grant-tables
mysqld_safe –skip-grant-tables &

-Connettersi al database.
mysql -u root

-Eseguire i seguenti comandi
mysql> use mysql;
mysql> update user set password=PASSWORD(’nuovapassword’) where User=’root’;
mysql> flush privileges;
mysql> quit

-Riavviare il servizio.

In questo modo la password dell’utente root di MySQL viene modificata con quella specificata.

Grazie a http://www.salaserver.com/10458/cosa-fare-in-caso-di-password-di-mysql-dimenticata/

In una macchina non sono riuscito ad usare questa procedura perchè dopo aver avviato il mysql in modalità safe cadeva , questo quando usava l'opzione che faceva –skip-grant-tables se invece aggiungevo anche l'opzione —skip-networking che aumenta la sicurezza in quando permette di collegarsi solo da localhost allora funzionava .

mysqld_safe –skip-grant-tables --skip-networking

Sulla pagina ufficiale di mysql suggeriva anche un altro metodo che faceva caricare un file di testo all'avvio del mysql
mysqld_safe --init-file=/home/me/mysql-init &

dentro il mysql-init dovevano esserci le istruzioni sql
UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
FLUSH PRIVILEGES;

Ma anche con questa modalità su quella macchina mi andava tutto giu.

Installare mysql 5.5 su centos/redhat

Questa guida utilissima lo fa fare http://www.if-not-true-then-false.com/2010/install-mysql-on-fedora-centos-red-hat-rhel/

Mysql flush host error

Su una macchina con un web service che usava male il db mi è apparso un errore del genere

Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

Mysql rileva un utilizzo strano del db che potrebbe simulare un attacco, nel mio caso c'erano troppe connessioni ENSTABLISH lasciate li da molto tempo, il servizio java non chiudeva le connessioni, quindi un attacco di negazione del servizio.

Per sbloccare bisogna lanciare con un account amministrativo il seguente comando da una macchina diversa rispetto a quella che ha il problema di connessioni perchè da quell'ip non può arrivare nessuna nuova connessione, e per eseguire un comando serve sempre una connessione.

mysqladmin -h ip-del-db -u username-amministrativo -p flush-hosts

Il valore della variabile max_connect_errors determina quante richieste successive di connessioni interrotte sono permesse. Dopo questo numero se nel mezzo non c'è una connessione andata a buon fine il demone del server assume che qualcosa di sbagliato stia succedendo e blocca l'host sorgente delle connessioni finchè non viene lanciato il comando di flush.
Il valore di default della variabile è 10 si può cambiare, secondo la guida di mysql io non l'ho provato, settando il valore a startup

shell> mysqld_safe --max_connect_errors=10000 &

oppure a runtime
mysql> SET GLOBAL max_connect_errors=10000;

Un tipo su questo blog http://www.unibia.com/unibianet/freebsd/mysql-fixing-host-blocked-because-many-connection-errors afferma che il problema è causato da mysql che non fornisce un metodo per capire cosa crea il blocco, e lo aggira configurando un mysql-proxy che funge da intermediario tra il cliente il server. Nella pagina ci sono le info di configurazione. Quello che non mi è chiaro e come faccia a funzionare dato che un proxy dovrebbe riportare tutte le connessioni da una parte all'altra ma forse questo proxy riporta sul server solo quelle realmente usate potrebbe essere utile per applicativi scritti male che non si possono modificare.

Quello che dalla lettura non mi risulta completamente chiaro è la differenza tra max_connection e max_connect_errors . Perchè l'articolo sembra che stia a parlare di max_connection_error che potrebbero essere causate per esempio da password errate ma io invece ho riscontrato sicuramente un max_connections.

Per verificare questi valori collegarsi al mysql e digitare questi parametri

mysql> show global variables like 'max_connect_errors';
mysql> show global variables like 'max_connections';
Salvo diversa indicazione, il contenuto di questa pagina è sotto licenza Creative Commons Attribution-ShareAlike 3.0 License