MySQL, aggiornamento a passaggio a versioni affiancate multiple Francesco Riosa Verra' qui descritto il percorso di aggiornamento alla versione "slotted" di MySQL. 1.6 2006-01-04 Aggiornamento da versioni precedenti di MySQL

Questo documento spiega come aggiornare MySQL alla piu' recente versione disponibile. Attualmente ci sono tre versioni di MySQL supportate in portage:

  • 5.0 Segue la schedulazione del progetto madre (stabile, bachi 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 bachi riportati verranno corretti con una priorita' molto bassa e possono mancare funzionalita'.
Il funzionamento del documento corrente non 'e garantito con queste ultime due.
  • 3.23 antica
  • 5.1 sviluppo attivo

Di seguito si fara' riferimento a un sistema che abbia inizialmente installato mysql-4.0.26 e si voglia aggiornarlo alla versione mysql-5.0.18-r30
Sostituite 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 'e archiviare una copia del server corrente, (tralasciamo i dati per ora).
Fatto questo, 'e possibile rimuovere i file che creerebbero un conflitto con la versione "slotted" di MySQL, quindi verra' 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

Assicurati di aggiornare lo script di avvio /etc/init.d/mysql utilizzando etc-update o dispatch-conf.

Copiare i dati nel server appena installato

Iniziamo con l'esportare i dati, questi verranno importati nella nuova versione di mysql.
Stiamo per utilizzare mysqldump dalla versione slotted di MySQL.
Notare il suffisso "-500" al nome del programma mysqldump, 'e 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

Ora esiste un file chiamato BACKUP_MYSQL_4.0.SQL, quest' ultimo puo' essere usato per ricreare i dati. I dati sono descritti nel dialetto SQL di MySQL, ossia lo "Structured Query Language".

Avviare il server senza connettivita' 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 'e necessario rimuovere l'opzione "--hex-blob" dal comando mysqldump, quindi "filtrare" i dati tramite un convertitore quale "iconv".
In molti casi questo si ottiene con un "piping" (accodamento dell' i/o dei programmi) come di seguito:
"iconv -f ISO_8859-1 -t UTF8 BACKUP_MYSQL_4.0.SQL | mysql-500 --defaults-file=/etc/mysql-500/my.cnf"
Tuttavia puo' essere necessario modificare manualmente lo script SQL, a seconda della sua struttura e dei dati ivi contenuti.
Se esistono applicazione che continuano a scrivere sul database precedente, 'e possibile impostare una relazione di replicazione (replication setup) dei dati tra i due database. Tuttavia questo non verra' trattato in questa sede.
Passare al nuovo server

Se 'e essere sicuri che le applicazioni interagiscano correttamente con il server appena installato, fate delle prove, praticamente qualsiasi applicazione legge delle impostazioni di configurazione nelle quali 'e possibile specificare quale "porta" di rete oppure quale "socket" utilizzare per connettersi al database server.
Semplicemente, eseguite il server su una porta alternativa (ad esempio 3307) e impostate la vostra applicazione o una copia di essa per connettersi con i paramentri voluti.
Prestate attenzione al fatto che molte di esse cercheranno di leggere la sezione "[client]" del file /etc/mysql/my.cnf.

Quando siete soddisfatti dei risultati, rimuovete le impostazioni di test, fermate il vecchio server e fate ripartire il nuovo.
Fate 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-installa la vecchia versione e rendi quella nuova la predefinita. Il comando di "unmerge" non sara' in grado di rimuovere alcuni file, quelli spostati precedentemente in Installare la nuova versione questo 'e un comportamento voluto, e scongiura il malfunzionamento di applicazioni connesse al 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, puoi re-installare i pacchetti che lo utilizzano. Nota che per trovare e reinstallare i pacchetti 'e necessario il programma revdep-rebuild.

# 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 puo' essere diversa, le versioni conosciute sono ad oggi 10, 12, 14 or 15, utilizza 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 avete incontrato problemi nella fase di aggiornamento, siete pregati di riportarli sul nostro Bugzilla.