Gentoo Logo

Guide de mise à jour pour MySQL 4.* ou 5.0.*

Table des matières :

1.  Mise à jour directe suggérée pour une migration de 4.1 à 5.0

Le moteur de tables myisam en version 4.1 était déjà suffisament mûr pour permettre une mise à jour directe vers la prochaine version majeure de MySQL.

Note : Ce n'est pas vrai pour les tables MERGE. Vous risquez probablement d'avoir des ennuis si vous essayez une mise à niveau directe pour ce type (rarement utilisé) de tables. Vous devriez vider et recréer ces tables et reconstituer leur contenu durant la mise à niveau. Si vous n'êtes pas sûr de vous, vous devriez commencer par lire comment Mettre une ancienne version de MySQL à jour.

Pour cette étape, deux terminaux sont nécessaires parce que les verrous appartiennent à la session de MySQL.

Exemple de code 1.1 : Mise à jour directe de 4.1 vers 5.0.*

# quickpkg dev-db/mysql
# alias MYSQL="mysql --user=root --password='votre_mot_de_passe'"
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
    --execute='SHOW variables LIKE "datadir";' \
    | sed -e 's|datadir[ \t]||')

(L'étape suivante devra être faite dans le second terminal)
# mysql --user=root --password='votre_mot_de_passe'
mysql> FLUSH TABLES WITH READ LOCK;

(Retour au premier terminal pour exécuter cette commande)
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
    /etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"

(Les commandes suivantes devront être exécutées dans le second terminal)
mysql> UNLOCK TABLES;
mysql> quit

(Retour au premier terminal pour le reste de la mise à niveau)
# tar -tjvf ~/mysql.*.tar.bz2
# emerge -av ">dev-db/mysql-5.0"
# dispatch-conf
# revdep-rebuild
# /etc/init.d/mysql restart
# mysql_upgrade_shell --user=root --password='your_password' \
    --protocol=tcp --datadir="${DATADIR}"
# /etc/init.d/mysql restart
# unset DATADIR
# unalias MYSQL

2.  Mettre une ancienne version de MySQL à jour

Pour mettre MySQL à jour depuis une ancienne version (<4.0.24), il est nécessaire de passer par la version 4.0.25. Si vous utilisez déjà une version plus récente, vous pouvez passer à l'étape suivante.

Exemple de code 2.1 : Mise à jour simple

# emerge -av --buildpkg "<mysql-4.1"

3.  Créer une copie de vos données

Important : Les valeurs dans les clés primaires sont gérées différemment dans les multiples versions de MySQL, référez-vous au bogue #108502 pour plus d'informations. Il est vivement recommandé que vous scanniez vos tables pour des valeurs de « 0 » (zéro) ou négatives et que vous les mettiez à jour pour une valeur plus grande ou égale à « 1 ».

Une des tâches les plus importantes pour un administrateur de base de données est la copie de sauvegarde. Procédons :

Exemple de code 3.1 : « Dump » de toutes les bases

# mysqldump \
  -uroot \
  --password='mot_de_passe' \
  -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

Un fichier nommé BACKUP_MYSQL_4.0.SQL devrait avoir été créé. Vous l'utiliserez pour recréer vos bases de données. Ce fichier est une suite de commandes SQL.

Il est recommandé de vérifier que votre copie de sauvegarde pourra effectivement être utilisée.

4.  Mise à jour depuis une version récente de MySQL

Si vous ne faites pas une mise à jour depuis une ancienne version, vous devez faire une sauvegarde du logiciel que vous utilisez en ce moment.

Exemple de code 4.1 : Conserver un paquet binaire de la version actuelle de MySQL

# quickpkg dev-db/mysql

Ensuite, supprimez la version actuelle et toutes les données :

Exemple de code 4.2 : Enlever MySQL de votre système

# /etc/init.d/mysql stop
# emerge -C mysql
# tar cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 /etc/mysql/my.cnf /var/lib/mysql/
# ls -l ~/mysql.*
# rm -rf /var/lib/mysql/ /var/log/mysql

Note : Vous devriez maintenant avoir deux copies de sauvegarde. La première est portable d'une version à l'autre de MySQL et la seconde vous permet de redémarrer avec la version que vous venez de supprimer. Ce sujet est couvert en détail plus loin dans cette documentation.

Maintenant que vous avez nettoyé votre installation de MySQL, vous pouvez installer la nouvelle version. Remarquez que revdep-rebuild est utilisé pour recompiler tous les paquets qui sont liés à MySQL.

Exemple de code 4.3 : Mise à jour du logiciel

# emerge -av ">mysql-4.1"
(Mise à jour de vos fichiers de configuration. Vous pouvez
également utiliser dispatch-conf)
# etc-update
# revdep-rebuild

Ensuite, configurez la nouvelle installation et démarrez le serveur :

Exemple de code 4.4 : Configurer MySQL 4.1

# emerge --config =mysql-4.1.<sous-version>
# /etc/init.d/mysql start

Ensuite, importez vos données.

Important : La configuration par défaut du fichier /etc/mysql/my.cnf active la journalisation binaire (log-bin). Cette option provoque une journalisation de toutes les transactions effectuées. Si votre base de données est relativement grande (1 Go ou plus), les fichiers de journalisation peuvent rapidement occuper tout l'espace disponible sur votre disque. Si l'espace disque est relativement retreint, il est recommandé de désactiver cette option.

Important : L'encodage par défaut défini dans MySQL 4.1 et supérieur est l'utf8. Si les données contiennent des caractères non-ASCII, vous voudriez probablement conserver l'encodage par défaut de la base de données en remplacant toutes les occurences de utf8 par latin1 dans le fichier de configuration /etc/mysql/my.cnf. Vous trouverez plus d'informations dans le chapitre « À propos de la conversion d'encodage. »

Important : La base de données administrative mysql qui contient les noms d'utilisateurs et les mots de passe parmi d'autres choses, est et doit être encodée en utf8.

Des fonctionnalités plus anciennes de mysqldump peuvent exporter les tables dans un mauvais ordre si des clefs étrangères sont impliquées. Pour contourner ce problème, ajouter à la requête SQL les reports suivants :

Exemple de code 4.5 : Réparation du contrôle des clefs étrangères

SET FOREIGN_KEY_CHECKS=0
SET FOREIGN_KEY_CHECKS=1

Ensuite, importez les sauvegardes.

Exemple de code 4.6 : Importer les données sauvegardées

# cat BACKUP_MYSQL_4.0.SQL \
     | mysql \
     -uroot \
     --password='mot_de_passe' \
     -hlocalhost \
     --max_allowed_packet=16M

# mysql_fix_privilege_tables \
     --defaults-file=/etc/mysql/my.cnf \
     --user=root \
     --password='mot_de_passe'

Si vous redémarrez le serveur MySQL et que tout fonctionne comme avant, vous aurez terminé votre mise à jour.

Exemple de code 4.7 : Redémarrer le serveur MySQL

# /etc/init.d/mysql restart

Si vous avez rencontré des problèmes, n'hésitez pas à nous en faire part via Bugzilla.

5.  Récupérer votre ancienne installation de MySQL 4.0

Si vous n'êtes pas satisfait de MySQL 4.1, il est possible de faire marche arrière et de revenir à la version 4.0.

Exemple de code 5.1 : Retour à la version précédente

# /etc/init.d/mysql stop
# emerge -C mysql
# rm -rf /var/lib/mysql/ /var/log/mysql
# emerge --usepkgonly "<mysql-4.1"
(Remplacez le <timestamp> avec celui utilisé lors de la création
de la sauvegarde.)
# tar -xjpvf mysql.<timestamp>.tar.bz2 -C /
# /etc/init.d/mysql start

Important : Si des paquets différents de dev-db/mysql ont été installés en suivant ce guide, vous devez exécuter revdep-rebuild pour vous assurer que chaque client utilise le bon objet mysqlclient partagé.

6.  À propos de la conversion d'encodage

Introduction

Ce chapitre ne se prétend pas être un guide exhaustif pour expliquer comment faire de telles conversions, mais plutôt une courte liste d'astuces sur lesquelles le lecteur peut élaborer.

Convertir une base de données peut être une tâche compliquée et la difficulté augmente avec la diversité des données. Des choses comme les objets sérialisés et les blobs sont un exemple où il est difficile de conserver les pièces en un seul morceau.

Les index

Chaque caractère utf-8 est considéré comme étant long de 3 octets dans un index. Les index dans MySQL peuvent aller jusqu'à 1000 octets de long (767 octets pour les tables InnoDB). Faites attention que la limite est mesurée en octets alors que la taille d'une colonne est interpretée par un nombre de caractères.

MySQL peut aussi créer des index sur des morceaux d'une colonne et ceci peut nous aider. Voici quelques exemples :

Exemple de code 6.1 : Indexer en utilisant des préfixes

$ mysql -uroot -p'votre_mot_de_passe' test

mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
    Value: 5.0.24-log
1 row in set (0.00 sec)

mysql> CREATE TABLE t1 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t1
  ->   ADD INDEX idx1 ( c1 , c2 );
ERROR 1071 (42000): Specified key was too long; max key length is 1000
bytes

mysql> ALTER TABLE t1
  ->   ADD INDEX idx1 ( c1(165) , c2(165) );
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t2 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=sjis;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t2
  ->   ADD INDEX idx1 ( c1(250) , c2(250) );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t3 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t3
  ->   ADD INDEX idx1 ( c1 , c2 );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

Environnement

Le système doit être configuré pour supporter la locale UTF-8. Vous trouverez plus d'informations dans nos documents Utiliser l'UTF-8 avec Gentoo et Guide de localisation de Gentoo Linux.

Dans cet exemple, on définit quelques variables d'environnement du shell pour utiliser la locale UTF-8 française dans /etc/env.d/02locale :

Exemple de code 6.2 : /etc/env.d/02locale

LC_ALL=fr_FR.UTF-8
LANG=fr_FR.UTF-8

Soyez sûr d'exécuter env-update && source /etc/profile après-ceci.

iconv

iconv, qui est livré avec sys-libs/glibc, est utilisé pour convertir des fichiers texte d'un encodage vers un autre. Le paquet app-text/recode peut également être utilisé.

Exemple de code 6.3 : Utiliser iconv

(De latin1 vers l'utf8)
$ iconv -f ISO-8859-15 -t UTF-8 file1.sql > file2.sql

(Du japonais vers l'utf8)
$ iconv -f ISO2022JP -t UTF-8 file1.sql > file2.sql

iconv peut être utilisé pour ré-encoder un dump sql même si l'environnement n'est pas défini en utf8.

Conversion avec SQL

Il est possible d'utiliser les fonctions MySQL CONVERT() et CAST() pour convertir des données dans vos scripts SQL.

Apache (serveur web)

Pour utiliser l'utf-8 avec apache, vous avez besoin de modifier les variables suivantes dans httpd.conf : AddDefaultCharset, CharsetDefault et CharsetSourceEnc. Si vos fichiers source html ne sont pas encodés en utf-8, ils doivent être convertis avec iconv ou recode.



Imprimer

Dernière mise à jour le 4 juin 2007

La version originale de cette traduction n'est plus maintenue

Résumé : Les développeurs Gentoo qui s'occupent de MySQL sont heureux d'annoncer la disponibilité prochaine de MySQL 5.0 dans la branche stable de Portage. Ce guide décrit la procédure pour une mise à jour vers MySQL 4.* et vers 5.0.*.

Michael Kohl
Auteur

Francesco Riosa
Auteur

Xavier Neys
Traducteur

Patrice Bouvard
Traducteur

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.