Gentoo Logo

Guida all'aggiornamento per MySQL 4.* o 5.0.*

Indice:

1.  Aggiornamento diretto, consigliato per la migrazione da 4.1 a 5.0

Il motore myisam della versione 4.1 è abbastanza maturo da permette un aggiornamento diretto alla successiva versione maggiore di MySQL.

Nota: Questo non va bene per le tabelle di tipo MERGE. Facendo un aggiornamento diretto con questo tipo di tabelle (solo raramente vengono utilizzate comunque) si possono avere facilmente problemi. In questi casi bisogna fare un backup prima e poi ricrearle dopo il processo di aggiornamento. Se non si è sicuri, dare uno sguardo al capitolo Aggiornamento da vecchie versioni di MySQL.

Per questo passo sono richieste due shell, poiché una è occupata dalla sessione di mysql.

Codice 1.1: Aggiornamento diretto da 4.1 a 5.0.*

# quickpkg dev-db/mysql
# alias MYSQL="mysql --user=root
--password='propria_password'"
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
   --execute='SHOW variables LIKE "datadir";' \
   | sed -e 's|datadir[ \t]||')

(Il comando seguente bisogna eseguirlo in una seconda shell)
# mysql --user=root --password='propria_password'
mysql> FLUSH TABLES WITH READ LOCK;

(Ritornare alla prima shell e lanciare questi comandi)
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
   /etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"
# MYSQL --execute="UNLOCK TABLES;"
# tar -tjvf ~/mysql.*.tar.bz2
# emerge -av ">dev-db/mysql-5.0"
# dispatch-conf
# revdep-rebuild
# /etc/init.d/mysql restart
# mysql_upgrade_shell --user=root
--password='propria_password' \
   --protocol=tcp --datadir="${DATADIR}"
# /etc/init.d/mysql restart
# unset DATADIR
# unalias MYSQL

2.  Aggiornamento da precedenti versioni di MySQL

Gli utenti che aggiornano da una vecchia versione di MySQL (<4.0.24) devono prima installare MySQL 4.0.25. Chi invece già usa la versione corrente può tranquillamente saltare questa sezione e continuare con la prossima.

Codice 2.1: Semplice aggiornamento

# emerge -av --buildpkg "<mysql-4.1"

3.  Creazione backup di tutti i dati correnti

Importante: I valori all'interno delle chiavi primarie sono gestiti diversamente nelle varie versioni di MySQL, maggiori dettagli possono essere trovati nel bug #108502, è caldamente consigliato di controllare nelle tabelle se ci sono valori "0" (zeri) o meno e modificarli con un valore maggiore o uguale a "1".

Uno dei più importanti compiti di ogni amministratore è quello di fare un backup di tutti i dati. Ecco come fare:

Codice 3.1: Backup di tutti i database

# mysqldump \
  -uroot \
  --password='propria_password' \
  -hlocalhost \
  --all-databases \
  --opt \
  --allow-keywords \
  --flush-logs \
  --hex-blob \
  --master-data \
  --max_allowed_packet=16M \
  --quote-names \
  --result-file=BACKUP_MYSQL_4.0.SQL

Adesso dovrebbe esserci il file BACKUP_MYSQL_4.0.SQL, che più avanti può essere utilizzato per ripristinare i dati. I dati sono stati scritti in sintassi SQL, Structured Query Language.

Probabilmente converrà controllare se il backup funziona prima di procedere ulteriormente.

4.  Aggiornamento da versioni recenti di MySQL

Se si è saltato il passo #1, adesso si deve creare un pacchetto di backup (del server database, non dei dati) della versione correntemente installata:

Codice 4.1: Pacchetto binario di backup

# quickpkg dev-db/mysql

Ora bisogna eliminare la versione installata con tutti i suoi dati:

Codice 4.2: Disinstallazione MySQL

# /etc/init.d/mysql stop
# emerge -C mysql
# tar cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 /etc/mysql/my.cnf /var/lib/mysql/
# ls -l ~/mysql.*
# rm -rf /var/lib/mysql/ /var/log/mysql

Nota: Esistono due differenti tipi di backup: SQL, il quale è possibile usarlo con varie versioni di MySQL, e un altro che permette di ripristinare velocemente tutti i database. Quest'ultimo verrà trattato più dettagliatamente in seguito.

Dopo aver eliminato completamente la vecchia installazione di MySQL, si può procedere con l'installazione della nuova versione. Notare che revdep-rebuild è necessario per riemergere i pacchetti linkati a MySQL.

Codice 4.3: Aggiornamento dei binari

# emerge -av ">mysql-4.1"
(Aggiornare i file di configurazione, è possibile anche usare dispatch-conf)
# etc-update
# revdep-rebuild

Adesso si deve configurare la nuova versione installata di MySQL e riavviare il demone:

Codice 4.4: Configurazione di base MySQL 4.1

# emerge --config =mysql-4.1.<micro_version>
# /etc/init.d/mysql start

Infine bisogna importare il backup creato in precedenza:

Importante: Come impostazione predefinita il file /etc/mysql/my.cnf imposta il logging binario (log-bin). Ciò registrerà ogni singola transazione che modifica i dati. Se si possiede un database molto grande (1GB o più), si può arrivare a creare file estremamente grandi che possono consumare velocemente lo spazio del disco. Se si possiede poco spazio, può essere utile disattivare il logging binario.

Importante: Il set di caratteri predefinito in MySQL 4.1 o superiore è utf8. Se i dati contangono caratteri non-ASCII, probabilmente si vorrà preservare il set di caratteri del database sostituendo tutte le ricorrenze di utf8 con latin1 nel file /etc/mysql/my.cnf. Maggiori informazioni è possibile trovarle nel capitolo Conversione charset.

Importante: Il database di amministrazione mysql che contiene i nomi degli utenti, password e altro è e deve essere in utf8.

Vecchie versioni delle utility mysqldump potrebbero esportare le tabelle in un ordine errato se vengono usate le foreign keys. Per evitare questo problema, frapporre il comando SQL tra questi due:

Codice 4.5: Foreign keys

SET FOREIGN_KEY_CHECKS=0
SET FOREIGN_KEY_CHECKS=1

Poi, importare il backup.

Codice 4.6: Importazione backup SQL

# cat BACKUP_MYSQL_4.0.SQL \
     | mysql \
     -uroot \
     --password='propria_password' \
     -hlocalhost \
     --max_allowed_packet=16M

# mysql_fix_privilege_tables \
     --defaults-file=/etc/mysql/my.cnf \
     --user=root \
     --password='propria_password' \

Adesso, riavviando il demone di MySQL, se tutto va come previsto si avrà MySQL con versione 4.1.x perfettamente funzionante. :-)

Codice 4.7: Riavviare MySQL

# /etc/init.d/mysql restart

Se ci sono stati problemi durante il processo di upgrade, per favore riportarli su Gentoo Bugzilla.

5.  Ripristinare la vecchia versione di MySQL 4.0

Se non si è soddisfatti di MySQL 4.1, è possibile ritornare indietro alla 4.0.

Codice 5.1: Ritorno alla vecchia versione

# /etc/init.d/mysql stop
# emerge -C mysql
# rm -rf /var/lib/mysql/ /var/log/mysql
# emerge --usepkgonly "<mysql-4.1"
(Sostituire <timestamp> con quello usato durante la creazione del backup.)
# tar -xjpvf mysql.<timestamp>.tar.bz2 -C /
# /etc/init.d/mysql start

Importante: Se altri pacchetti oltre dev-db/mysql sono stati installati seguendo questa guida, è necessario eseguire un revdep-rebuild per essere sicuri che ogni client sia linkato alla corretta libreria mysqlclient.

6.  Conversione del charset

Introduzione

Questo capitolo non è stato scritto per essere una guida completa su come effettuare queste conversioni, ma come una breve lista di suggerimenti che l'utente può approfondire da solo in seguito.

Convertire un database può essere un lavoro complesso e la difficoltà aumenta con il variare dei dati presenti. Per esempio quando si lavora con serialized object o blobs è uno dei casi dove è difficile effettuare la conversione senza problemi.

Indici

Ogni carattere utf-8 è considerato lungo 3 byte compreso un indice. Gli indici in MySQL possono essere grandi al massimo 1000 byte (767 per le tabelle di InnoDB). Notare che i limiti sono misurati in byte, considerato che la lunghezza di una colonna è interpretata come un numero di caratteri.

MySQL può inoltre creare indici come parti di una colonna, questo può essere un po' d'aiuto. Qui sotto ci sono alcuni esempi:

Codice 6.1: Creare indici utilizzando prefissi

$ mysql -uroot -p'propria_password' test

mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
Value: 5.0.24-log
1 row in set (0.00 sec)

mysql> CREATE TABLE t1 (
->   c1 varchar(255) NOT NULL default '',
->   c2 varchar(255) NOT NULL default ''
->   ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t1
->   ADD INDEX idx1 ( c1 , c2 );
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

mysql> ALTER TABLE t1
->   ADD INDEX idx1 ( c1(165) , c2(165) );
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t2 (
->   c1 varchar(255) NOT NULL default '',
->   c2 varchar(255) NOT NULL default ''
->   ) ENGINE=MyISAM DEFAULT CHARSET=sjis;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t2
->   ADD INDEX idx1 ( c1(250) , c2(250) );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t3 (
->   c1 varchar(255) NOT NULL default '',
->   c2 varchar(255) NOT NULL default ''
->   ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t3
->   ADD INDEX idx1 ( c1 , c2 );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

Ambiente

Il sistema deve essere configurato per supportare il locale UTF-8. Maggiori informazioni è possibile trovarle nelle guide: Usare UTF-8 con Gentoo e Guida alla localizzazione

In questo esempio, verranno impostate alcune variabili d'ambiente in /etc/env.d/02locale per far in modo che il sistema utilizzi il locale inglese UTF-8:

Codice 6.2: /etc/env.d/02locale

LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

Dopo aver configurato il file è necessario lanciare env-update && source /etc/profile

iconv

iconv, fornito dal pacchetto sys-libs/glibc, è utilizzato per convertire file di testo da una codifica ad un'altra. La stessa funzione si può ottenere con il pacchetto app-text/recode.

Codice 6.3: Usare iconv

(Da latin1 a utf8)
$ iconv -f ISO-8859-15 -t UTF-8 file1.sql > file2.sql

(Da Japanese a utf8)
$ iconv -f ISO2022JP -t UTF-8 file1.sql > file2.sql

iconv può essere utilizzato per recodificare dei dump sql anche se l'ambiente non è impostato su utf8.

SQL Mangling

E' possibile utilizzare le funzioni di MySQL CONVERT() e CAST() per convertire i dati nei proprio script SQL.

Apache (server web)

Per usare utf-8 con apache, bisogna modificare le seguenti variabili nel file httpd.conf: AddDefaultCharset, CharsetDefault, CharsetSourceEnc. Se i file html non sono codificati in utf-8, essi devono essere convertiti usando iconv o recode.



Stampa

Aggiornato il 4 giugno 2007

La versione originale di questo documento non è più mantenuta

Oggetto: Il team MySQL è fiero di annunciare che MySQl 5.0 sarà presto disponibile nel ramo stabile di Gentoo. Questo documento descrive come effettuare l'aggiornamen to a MySQL 4.* e a MySQL 5.0.*.

Michael Kohl
Autore

Francesco Riosa
Autore

Luca Marturana
Traduzione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.