Guida per l'aggiornamento e il passaggio a versioni MySQL affiancate multiple
1.Aggiornamento delle versioni precedenti di MySQL
Questo documento spiega come aggiornare MySQL alla più recente versione
disponibile. Attualmente ci sono tre versioni di MySQL supportate in
Portage:
-
5.0 segue i rilasci del progetto madre nel tree stabile e è mantenuto
attivamente
-
4.1 segue i rilasci del progetto madre con in più la implementazione dei
maggiori bugfix e degli aggiornamenti di sicurezza, e non sono aggiunte
nuove caratteristiche
-
4.0 contiene solamente aggiornamenti riguardanti la sicurezza
Ci sono due versioni addizionali attualmente ma non sono supportate. Con
questo si intende che i bug riportati verranno corretti con una priorità
molto bassa e possono mancare funzionalita'. Il funzionamento di questo
documento non è garantito con le seguenti versioni:
- 3.23 deprecata
- 5.1 attualmente in sviluppo
Nota:
Di seguito si farà riferimento a un sistema che abbia inizialmente installato
mysql-4.0.26 e si voglia aggiornarlo alla versione
mysql-5.0.18-r30. Sostituire le versioni menzionate con quelle
volute.
|
2.Installare la nuova versione
Questo passo richiede di (ri)muovere alcuni file dall'ambiente di produzione,
quindi la prima cosa da fare è archiviare una copia del server
corrente, (si tralasciano i dati per ora). Fatto questo, è possibile
rimuovere i file che creerebbero un conflitto con la versione "slotted" di
MySQL, quindi verrà installata una versione che si affianchi a quella
corrente.
Esempio 1: Archiviare il vecchio server e installare il nuovo |
# quickpkg dev-db/mysql
# rm -rf /usr/include/mysql /usr/bin/mysql_config
# for tmpfile in /usr/lib/*mysql*
do
mv "${tmpfile}" "${tmpfile}.TMP"
ln -s "${tmpfile}.TMP" "${tmpfile}"
done
# emerge -av =dev-db/mysql-5.0.18-r30
|
Assicurarsi di aggiornare lo script di avvio /etc/init.d/mysql
utilizzando etc-update o dispatch-conf.
3.Copiare i dati nel server appena installato
Si inizia con l'esportare i dati, questi verranno importati nella nuova
versione di MySQL. Si utilizza mysqldump dalla versione
slotted di MySQL. Notare il suffisso -500 al nome del
programma mysqldump, è ricavato dalla versione 5.0.x .
Importante:
Se si sta aggiornando tra versioni e revisioni, per esempio da
dev-db/mysql-5.0.18 a dev-db/mysql-5.0.18-r30, si può stoppare
il database, spostare la directory dati a quella della versione nuova, e far
ripartire il server. Ciò permette di saltare questa sezione.
|
Esempio 2: Esportazione dei database |
# mysqldump-500 \
--defaults-file=/etc/mysql/my.cnf \
--user=root \
--password='your_password' \
--host=localhost \
--all-databases \
--opt \
--allow-keywords \
--flush-logs \
--hex-blob \
--master-data \
--max_allowed_packet=16M \
--quote-names \
--result-file=BACKUP_MYSQL_4.0.SQL
|
E' stato creato un file chiamato BACKUP_MYSQL_4.0.SQL, che può
essere usato per ricreare i dati. I dati sono descritti nel dialetto SQL di
MySQL, ossia lo "Structured Query Language".
Avviare il server senza connettività di rete e senza utilizzare il controllo
degli utenti, e quindi eseguire lo script SQL:
Esempio 3: Caricare i dati |
# mv /etc/conf.d/mysql /etc/conf.d/mysql.orig
# cat <<- EOF > /etc/conf.d/mysql
NOCHECK=1
DEBUG=3
mysql_slot_500=(
"skip-networking"
"skip-grant-tables"
"socket=/tmp/mysqld.sock"
)
EOF
# /etc/init.d/mysql start
# mysql-500 --defaults-file=/etc/mysql-500/my.cnf --socket=/tmp/mysqld.sock < BACKUP_MYSQL_4.0.SQL
# /etc/init.d/mysql stop
# mv /etc/conf.d/mysql.orig /etc/conf.d/mysql
|
Nota:
Per convertire i dati alla codifica UTF-8 in questa fase è necessario
rimuovere l'opzione --hex-blob dal comando mysqldump, quindi
"filtrare" i dati tramite un convertitore come iconv. In molti casi
questo si ottiene con un "piping" (accodamento dell'i/o dei programmi) come:
iconv -f ISO_8859-1 -t UTF8 BACKUP_MYSQL_4.0.SQL | mysql-500
--defaults-file=/etc/mysql-500/my.cnf. Tuttavia può essere necessario
modificare manualmente lo script SQL, a seconda della sua struttura e dei
dati ivi contenuti.
|
Se esistono applicazioni che continuano a scrivere sul database
precedente, è possibile impostare una relazione di replicazione (replication
setup) dei dati tra i due database. Tuttavia questo non verrà trattato in
questa sede.
4.Passare al nuovo server
Per essere sicuri che le applicazioni interagiscano correttamente con il
server appena installato, fare delle prove. Praticamente qualsiasi
applicazione legge delle impostazioni di configurazione nelle quali è
possibile specificare quale "porta" di rete oppure quale "socket" utilizzare
per connettersi al database server. Semplicemente, eseguire il server su una
porta alternativa (ad esempio 3307) e impostare la propria applicazione (o
una copia di essa) per connettersi con i paramentri voluti. Prestare
attenzione al fatto che molte applicazioni cercheranno di leggere la sezione
[client] del file /etc/mysql/my.cnf.
Prima di passare al nuovo server MySQL, si deve impostare la seguente
variabile in /etc/conf.d/mysql. Il suo valore potrebbe essere
vuoto:
Esempio 4: Ipostare la variabile mysql_slot_500 |
# nano -w /etc/conf.d/mysql
mysql_slot_500=( )
|
Quando si è soddisfatti dei risultati, si possono rimuovere le impostazioni
di test, fermare il vecchio server e fare ripartire il nuovo:
Esempio 5: Utilizzare il nuovo server |
# killall mysqld
# /etc/init.d/mysql stop zap start
|
Dis-installare la vecchia versione e rendere di default quella nuova. Il
comando "unmerge" non sara' in grado di rimuovere alcuni file, come quelli
spostati precedentemente in Codice
2.1. Questo è un comportamento voluto, e scongiura il malfunzionamento
di applicazioni connesse alla vecchia versione di MySQL.
Esempio 6: Cancellare la vecchia versione |
# emerge --unmerge --pretend mysql
# emerge --unmerge =dev-db/mysql-4.0.26
# cd /etc
# mv mysql mysql.$(date +%F_%H-%M)
# rm -rf /usr/lib/*.TMP
# for i in /usr/lib/*mysql*
do
[[ -z "$( readlink -f $i )" ]] && [[ -L $i ]] && rm $i
done
# eselect mysql list
# eselect mysql set 1
# eselect mysql show
|
5.Re-installare le applicazioni
Una volta rimosso il vecchio MySQL, si possono re-installare i pacchetti che
lo utilizzano. Notare che per trovare e reinstallare i pacchetti è necessario
il programma revdep-rebuild fornito da
app-portage/gentoolkit.
Esempio 7: Ricostruzione dipendenze inverse |
# revdep-rebuild --soname libmysqlclient.so.12 -- -p -v
# revdep-rebuild --soname libmysqlclient.so.12
|
Nota:
A seconda di quale sia la precedente versione, anche quella di
libmysqlclient.so può essere diversa, le versioni conosciute
sono ad oggi 10, 12, 14 o 15. Scegliere la
versione corretta del vecchio pacchetto.
|
6.Ritocchi finali
Esempio 8: Aggiornare il database degli utenti |
# mysql_fix_privilege_tables-500 \
--defaults-file=/etc/mysql-500/my.cnf \
--user=root \
--password='your_password'
# mysql -uroot -p'your_password' mysql -e "FLUSH PRIVILEGES;"
# for tbl in $( mysql --silent -uroot -p'your_password' -e 'USE mysql ; SHOW TABLES LIKE "help%";' )
do
mysql -uroot -p'your_password' -e "use mysql ; TRUNCATE TABLE ${tbl};"
done
# mysql -uroot -p'your_password' mysql < /usr/share/mysql/fill_help_tables.sql
|
Se si sono incontrati problemi nella fase di aggiornamento, si è pregati di
riportarli sul nostro Bugzilla.
|