Guida all'aggiornamento per MySQL 4.* o 5.0.*
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="
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
--execute='SHOW variables LIKE "datadir";' \
| sed -e 's|datadir[ \t]||')
# mysql --user=root --password=
mysql> FLUSH TABLES WITH READ LOCK;
# 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= \
--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= \
-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"
# 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.
# /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= \
-hlocalhost \
--max_allowed_packet=16M
# mysql_fix_privilege_tables \
--defaults-file=/etc/mysql/my.cnf \
--user=root \
--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"
# 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'' test
mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
Value:
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 );
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 |
$ iconv -f ISO-8859-15 -t UTF-8 file1.sql > file2.sql
$ 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.
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|