MySQL, aggiornamento e passaggio a versioni affiancate multiple Francesco Riosa Verrà qui descritto il percorso di aggiornamento alla versione "slotted" di MySQL. 1 2006-01-25 Aggiornamento da 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 la schedulazione del progetto madre (stabile, bug corretti attivamente)
  • 4.1 Segue la schedulazione del progetto madre (solo cambiamenti che riguardano un ampio numero di utenti)
  • 4.0 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 del documento corrente non è garantito con queste ultime due.

  • 3.23 antica
  • 5.1 sviluppo attivo
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 .

# mysqldump-500 \
  --defaults-file=/etc/mysql/my.cnf
  -uroot \
  --password='your_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

Esiste un file chiamato BACKUP_MYSQL_4.0.SQL, questo 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
# echo '
  NOCHECK=1
  DEBUG=3
  mysql_slot_500=(
    "skip-networking"
    "skip-grant-tables"
  )
  ' > /etc/conf.d/mysql
# /etc/init.d/mysql-500 start
# mysql-500 --defaults-file=/etc/mysql-500/my.cnf < BACKUP_MYSQL_4.0.SQL
# mv /etc/conf.d/mysql.orig /etc/conf.d/mysql
# /etc/init.d/mysql-500 stop
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 di esse cercheranno di leggere la sezione [client] del file /etc/mysql/my.cnf.

Quando si è soddisfatti dei risultati, si possono rimuovere le impostazioni di test, fermare il vecchio server e fare ripartire il nuovo. Fare anche in modo che sia quest'ultimo a partire all'avvio della macchina.

# rc-update del mysql default
# rc-update add mysql-500 default
# /etc/init.d/mysql stop
# /etc/init.d/mysql-500 start

Dis-installare la vecchia versione e rendere di default quella nuova. Il comando "unmerge" non sara' in grado di rimuovere alcuni file, 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
# rm -rf /usr/lib/*.TMP
# for i in /usr/lib/*mysql* ; do
    readlink -f $i || [[ -L $i ]] && rm $i
  done
# 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 installazione, anche la versione di libmysqlclient.so può essere diversa, le versioni conosciute sono ad oggi 10, 12, 14 o 15, utilizzare quella del vecchio pacchetto.
Ritocchi finali
# 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.