Guida per l'aggiornamento e il passaggio a versioni MySQL affiancate multiple Francesco Riosa Chris White Jan Kundrát Joshua Saddler Team italiano Questo documento descrive il percorso di aggiornamento alla versione "slotted" di MySQL, e cerca di renderlo più semplice possibile. 3 2006-02-02 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
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.
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.

# 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.

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 .

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.
# mysqldump-500 \
  --defaults-file=/etc/mysql/my.cnf \
  --user=root \
  (Sostituire 'your_password' con la propria password di root MySQL)
  --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:

# 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
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.

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:

# nano -w /etc/conf.d/mysql
(Add the following line:)
mysql_slot_500=( )

Quando si è soddisfatti dei risultati, si possono rimuovere le impostazioni di test, fermare il vecchio server e fare ripartire il nuovo:

# 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 Installare la nuova versione. Questo è un comportamento voluto, e scongiura il malfunzionamento di applicazioni connesse alla vecchia versione di MySQL.

# 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

(emergere app-admin/eselect-mysql se non lo si ha già fatto)
# eselect mysql list
# eselect mysql set 1
# eselect mysql show
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.

# revdep-rebuild --soname libmysqlclient.so.12 -- -p -v
# revdep-rebuild --soname libmysqlclient.so.12
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.
Ritocchi finali
(Sostituire 'your_password' con la propria password di root MySQL)
# 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.