Archivio

Posts Tagged ‘MySQL’

Mysql: Illegal mix of collations

15 novembre 2009 Nessun commento

Un errore che può capitare, quando si effettuano query su due db o due tabelle con una collations differente, è il seguente:

ERROR 1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘=’

Questo errore indica che i due campi su cui stiamo effettuando la query hanno una collations differente e non compatibile. Facciamo qualche esempio ecco la nostra tabella:

show create table a;

CREATE TABLE `a` (
`campo1` varchar(64) character set latin1 collate latin1_bin NOT NULL default ”
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

show create table b;

CREATE TABLE `b` (
`campo2` varchar(255) NOT NULL default ”
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

La tabella b non avendo alcuna collations impostata, prenderà quella di default, ovvero:

collate latin1_general_ci

Ora se andiamo a fare una query che preleva i dati da entrambe le tabelle, otterremo il seguente errore:

SELECT *  FROM a,b WHERE campo1 = campo2;

ERROR 1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘=’

Ora per risolvere il problema forziamo la collate  latin1_bin in latin1_general_ci:

ALTER TABLE a character set latin1 collate latin1_general_ci , modify column campo1 varchar(64) character set latin1 collate latin1_general_ci NOT NULL;

A questo punto lo show create table ci mostrerà la nuova collate impostata per il campo campo1 e la query che prima ci restituiva l’errore ora sarà eseguita correttamente.

Abilitare le connessioni da remoto con MySQL server

11 settembre 2009 Nessun commento

mysqlNelle distribuzioni linux il servizio MySQL e’ configurato di default per non accettare connessioni da host esterni. Ma come fare per abilitare la connessione da remoto? La procedura e’ molto semplice ed proposta di seguito:

1) Bisogna accedere al server via ssh con utente root e commentare (semplicemente anteponendo il carattere # ad inizio riga) la direttiva ‘bind-address’ dalla configurazione del servizio (probabilmente /etc/mysql/my.cnf oppure /etc/my.cnf)

2) Supponendo di voler utilizzare un utente preesistente chiamato “IlTuoUtente”, accedendo al database ‘mysql’ dovrete impostare il valore ‘%’ nel campo host della tabella user.
Cosi’ facendo l’utente puo’ collegarsi sia da localhost che da remoto. Questo e’ il comando che dovrete digitare:

update users set host = ‘%’ where user = ‘IlTuoUtente’;

3)  La stessa stessa operazione dovra’ essere effettuata per la tabella ‘db’:

update db set host = ‘%’ where user = ‘IlTuoUtente’;

4) Non vi rimane che riavviare il servizio mysql (con il comando ‘/etc/init.d/mysql restart’)

Backup e restore di database MySql

26 agosto 2009 Nessun commento

Per eseguire il backup  di un database mysql basta eseguire da console il seguente comando:

mysqldump nome_database -u nome_utente -p > dump.sql

Se il database di cui si vuole effettuare il backup si trova su una macchina esterna sulla quale è possibile connetters si deve aggiungere il parametro dell’ host (-h)

mysqldump nome_database -h host(ip o hostname) -u nome_utente -p > dump.sql

Una volta che si ha a disposizione il backup del database se si deve fare il restore il comando da eseguire è il seguente:

mysql < dump.sql -u nomeutente -p

Categorie:Lamp, MySQL Tag: , , ,

Shell script per fare un backup incrementale del database MySQL

23 agosto 2009 3 commenti

Questo script puo’ essere eseguito tramite il cron di sistema per fare un backup incrementale di un database. Nel nostro esempio verra fatto un dump del databse chiamato DATABASE_UNO e una copia di una sola tabella del database DATABASE_DUE. Tutti i backup piu’ vecchi di 3 mesi verranno cancellati:

#!/bin/bash

DATA=`/bin/date +”Giorno_%d-%m-%y_Ora_%H-%M”`

/usr/bin/mysqldump -uUTENTE -pPASSWORD DATABASE_UNO > /var/backupdb/DATABASE_UNO_$DATA.sql
/usr/bin/mysqldump -uUTENTE -pPASSWORD DATABASE_DUE TABELLA > /var/backupdb/TABELLA_$DATA.sql

chmod 600 /var/backupdb/ -R

/usr/bin/find /var/backupdb/ -type f -mtime +93 -exec rm -f {} \;