Guide de migration et de mise à jour vers MySQL en Slot Francesco Riosa Chris White Jan Kundrát Joshua Saddler Bertrand Coppa Ce document décrit la procédure à suivre pour mettre à jour vers les versions slottées de MySQL. Son objectif est de rendre la mise à jour le plus agréable possible. 3 2006-02-02 Mettre à jour une ancienne installation de MySQL

Ce document couvre la dernière version de MySQL disponible. Il y a actuellement trois versions supportées de MySQL dans Portage :

  • 5.0, qui suit les sorties officielles dans l'arbre stable et qui est activement maintenue.
  • 4.1, qui suit les sorties officielles en implémentant les correctifs majeurs de bogues et de sécurité, mais rien de nouveau n'est ajouté.
  • 4.0, qui contient seulement des corrections de sécurité.

Il y en a deux autres, mais qui ne sont pas supportées. Cela signifie qu'il peut leur manquer des fonctionnalités et que les rapports de bogues ont une priorité très faible. Ce document n'a aucune garantie de fonctionnement avec les versions suivantes :

  • 3.23, qui a été dépréciée.
  • 5.1, qui est actuellement en développement très actif.
mysql-4.0.26 sera utilisé comme point de départ et mysql-5.0.18-r30 comme version cible. Remplacez-les par vos versions.
Installer la nouvelle version

Cette étape demandera de déplacer ou d'effacer certains fichiers de de l'environnement en cours, donc la première chose à faire est de sauvegarder les serveurs de base de données, pas les données. Une fois fait, il est possible d'effacer les fichiers en conflit avec le MySQL slotté et d'installer la nouvelle version en parallèle de celle déjà présente.

# 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

Assurez-vous de bien lancer etc-update ou dispatch-conf afin de mettre à jour le script de démarrage /etc/init.d/mysql.

Copier les données vers le nouveau serveur

Maintenant, nous allons transférer les données. Elles seront importées dans la nouvelle version de MySQL. mysqldump sera utilisé depuis la version slottée de MySQL. Remarquez le suffixe -500 au nom du programme de mysqldump. Cela signifie qu'il vient de la version 5.0.x.

Si vous effectuez une mise à jour de révision (par exemple, de dev-db/mysql-5.0.18 à dev-db/mysql-5.0.18-r30), vous pouvez simplement arrêter la base de données, changer de répertoire de données et relancer le serveur. Vous pouvez donc sauter toute cette partie.
# mysqldump-500 \
  --defaults-file=/etc/mysql/my.cnf \
  --user=root \
  (Remplacez 'your_password' avec votre mot de passe administrateur de
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

Un fichier nommé BACKUP_MYSQL_4.0.SQL sera créé, qui pourra servir à recréer les données. Les données sont stockées dans le langage SQL de MySQL, le Structured Query Language.

Lancez le serveur sans réseau ni gestion des utilisateurs et lancez le 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
Pour convertir les données en UTF-8 au passage, il faut enlever l'option --hex-blob de la commande mysqldump puis filtrer les données à l'aide d'un convertisseur comme iconv. Dans la plupart des cas, cela se fait simplement en faisant un « pipe » : iconv -f ISO_8859-1 -t UTF8 BACKUP_MYSQL_4.0.SQL | mysql-500 --defaults-file=/etc/mysql-500/my.cnf. Des ajustements manuels au fichier SQL peuvent être nécessaires selon la structure et les données contenues.

S'il y des applications qui travaillent toujours avec l'ancienne base de données, il est possible de créer une relation de « réplication » entre les deux bases. Cependant, ce document ne couvre pas cette procédure.

Migrer vers le nouveau serveur

Veuillez tester vos applications avec le serveur fraîchement installé pour vous assurer qu'elles fonctionnent bien avec. Souvent, ces applications ont une option de configuration pour choisir quel port ou socket utiliser lors de la connexion au serveur de base de données. Lancez le serveur sur un autre port (3307 par exemple) et dites à vos applications (ou une copie d'essai) de se connecter avec ces paramètres. Veuillez remarquer que la plupart des applications essaieront d'utiliser les paramètres spécifiés dans la section [client] du fichier de configuration /etc/mysql/my.cnf.

Avant que vous changiez pour le nouveau serveur MySQL, il vous faudra ajuster la variable suivante dans /etc/conf.d/mysql. Sa valeur peut être vide :

# nano -w /etc/conf.d/mysql
(Ajoutez la ligne suivante :)
mysql_slot_500=( )

Une fois que vous êtes satisfait des résultats, effacez tous les paramètres d'essai, arrêtez l'ancien serveur et lancez le nouveau :

# killall mysqld
# /etc/init.d/mysql stop zap start

Ensuite, désinstallez l'ancienne version et faites de la nouvelle celle par défaut. La commande de désinstallation ne pourra pas effacer certains fichiers tels que ceux que nous avons déplacés dans la liste de commandes 2.1. Ceci est voulu et a pour but de protéger les applications directement liées à l'ancienne version de 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

(Installez app-admin/eselect-mysql si ce n'est pas déjà fait)
# eselect mysql list
# eselect mysql set 1
# eselect mysql show
Recompiler les applications

Une fois l'ancienne version de MySQL retirée, vous pouvez installer la nouvelle. Notez que l'outil revdep-rebuild du paquet app-portage/gentoolkit est nécessaire pour recompiler les paquets qui sont liés avec MySQL.

# revdep-rebuild --soname libmysqlclient.so.12 -- -p -v
# revdep-rebuild --soname libmysqlclient.so.12
Selon l'ancienne version de MySQL, la version de libmysqlclient.so peut être 10, 12, 14 ou 15. Choisissez celle qui correspond à votre version du vieux paquet.
Touches finales
(Remplacez toutes les occurrences de 'your_password' avec votre mot
de passe administrateur de 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

Si vous rencontrez des problèmes lors du processus de mise à jour, veuillez remplir rapport de bogue. Merci.