Guide de mise à jour pour MySQL 4.* ou 5.0.*
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="
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
--execute='SHOW variables LIKE "datadir";' \
| sed -e 's|datadir[ \t]||')
# mysql --user=root --password=
mysql> FLUSH TABLES WITH READ LOCK;
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
/etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"
mysql> UNLOCK TABLES;
mysql> quit
# 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= \
--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= \
-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"
# 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.
# /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= \
-hlocalhost \
--max_allowed_packet=16M
# mysql_fix_privilege_tables \
--defaults-file=/etc/mysql/my.cnf \
--user=root \
--password=
|
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"
# 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'' test
mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
Value:
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 );
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 |
$ iconv -f ISO-8859-15 -t UTF-8 file1.sql > file2.sql
$ 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.
Ce document est protégé par la licence Creative
Commons : Paternité - Partage des Conditions Initiales à
l'Identique 2.5.
|