Manuel MySQL 4.1.x ? Version Française Copyright (c) 2002?2003 MySQL AB Manuel MySQL 4.1.x ? Version Française Sommaire 1.1 A propos du manuel..........................................................................................................1 1.1.1 Conventions utilisées dans ce manuel.....................................................................2 1.2 Qu'est ce que MySQL?.....................................................................................................3 1.2.5 Compatibilité an 2000..............................................................................................8 1.3 Qui est MySQL AB ?.......................................................................................................10 1.3.1 Les services et le modèle d'affaire de MySQL AB.................................................10 1.3.1.6 Publicité.........................................................................................................12 1.3.2 Contacts.................................................................................................................13 1.4 Support MySQL et licences............................................................................................13 1.4.3 Licences MySQL....................................................................................................15 1.4.3.2 Utiliser MySQL sous licence GPL libre.........................................................15 1.4.4 Logos MySQL AB et marque déposée...................................................................16 1.4.4.2 Logos MySQL qui peuvent être utilisés dans autorisation préalable............17 1.4.4.5 Utiliser le nom MySQL sur des documents imprimés ou des présentations.................................................................................................18 1.4.4.6 Utilisation du nom MySQL dans un nom de société ou de produit...............18 1.5 MySQL 4.x In A Nutshell.................................................................................................18 1.5.6 MySQL 4.1 : Les nouvelles fonctionnalités............................................................20 1.6 Sources d'informations MySQL.......................................................................................20 1.6.2 Listes de diffusion MySQL.....................................................................................21 1.6.2.4 Conseils pour répondre sur la liste de diffusion............................................27 1.7 Quels standards respecte MySQL?................................................................................27 1.7.4 Différences de MySQL avec ANSI SQL92.............................................................30 1.7.4.1 Sous sélections (Sub SELECT s).................................................................31 i Manuel MySQL 4.1.x ? Version Française Sommaire 1.7.4.7 '??' comme début de commentaire...............................................................36 1.7.5 Erreurs connues et problèmes de conceptions de MySQL....................................37 1.8 Les évolutions de MySQL (la liste des tâches)...............................................................40 1.8.5 Ce qui n'est pas prévu...........................................................................................45 1.9 Comparatif de MySQL avec les autres serveurs SQL....................................................45 1.9.1 MySQL face à mSQL.............................................................................................45 1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL..........................................................................................................48 1.9.1.3 Comparatif des syntaxes SQL de mSQL 2.0 et MySQL...............................48 1.9.2 Comparatif de MySQL avec PostgreSQL..............................................................51 1.9.2.3 Performances comparées de MySQL et PostgreSQL..................................55 2.1 Installation standard rapide de MySQL...........................................................................59 2.1.2 Installer MySQL sous Windows.............................................................................60 2.1.2.3 Démarrer le serveur pour la première fois....................................................62 2.2 Notes générales à propos de l'installation......................................................................63 2.2.7 Installer MySQL à partir d'une distribution binaire.................................................70 2.3 Installer MySQL à partir des sources..............................................................................72 2.3.7 La distribution source Windows.............................................................................82 2.4 Configuration après l'installation, et tests........................................................................83 2.4.3 Lancer et arrêter MySQL automatiquement...........................................................89 ii Manuel MySQL 4.1.x ? Version Française Sommaire 2.5 Changer de version de MySQL.......................................................................................90 2.5.5 Migrer depuis une autre architecture.....................................................................96 2.6 Notes spécifiques aux systèmes d'exploitation...............................................................97 2.6.1 Notes relatives à Linux (toutes versions)...............................................................97 2.6.1.7 Notes relatives à Linux IA64.......................................................................104 2.6.2 Notes relatives à Windows...................................................................................104 2.6.2.4 Connexion à un serveur MySQL distants, sous Windows avec SSH.........108 2.6.2.7 MySQL pour Windows face à MySQL pour Unix........................................109 2.6.3 Remarques pour Solaris......................................................................................111 2.6.3.2 Remarques pour Solaris x86.......................................................................114 2.6.4 Notes relatives à BSD..........................................................................................115 2.6.4.7 Notes relatives aux versions 4.x de BSD/OS..............................................118 2.6.5 Notes relatives à Mac OS X.................................................................................118 2.6.5.2 Mac OS X Server........................................................................................118 2.6.6 Notes sur les autres Unix.....................................................................................118 2.6.6.8 Notes relatives à SGI Irix............................................................................125 2.6.6.10 Notes relatives à la version 7.0 fr Caldera (SCO) Unixware.....................127 2.6.9 Notes relatives à Novell NetWare........................................................................128 iii Manuel MySQL 4.1.x ? Version Française Sommaire 2.7 Commentaires sur l'installation de Perl.........................................................................129 2.7.4 Problèmes lors de l'utilisation des interfaces Perl DBI et DBD............................130 3.3 Création et utilisation d'une base de données..............................................................136 3.3.4 Récupérer des informations à partir d'une table..................................................140 3.3.4.4 Trier les enregistrements............................................................................143 3.3.4.9 Utiliser plus d'une table...............................................................................151 3.5 Exemples de requêtes usuelles....................................................................................154 3.5.4 La ligne contenant la plus grande valeur d'un certain champ par rapport à un groupe.....................................................................................................................156 3.5.9 Utiliser AUTO_INCREMENT................................................................................159 3.7 Requêtes du projet Twin...............................................................................................161 3.7.2 Afficher une table avec l'état des paires de jumeaux...........................................164 3.8 Utilisation de MySQL avec Apache...............................................................................164 4.1 Configuration de MySQL...............................................................................................165 4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine....................173 4.2 Règles de sécurité et droits d'accès au serveur MySQL..............................................175 4.2.3 Options de démarrage qui concernent la sécurité...............................................178 iv Manuel MySQL 4.1.x ? Version Française Sommaire 4.2.11 Causes des erreurs Access denied...................................................................191 4.3 Gestion des comptes utilisateurs de MySQL................................................................195 4.3.9 Utilisation des connexions sécurisées.................................................................207 4.3.9.3 Options de GRANT.....................................................................................208 4.4 Prévention des désastres et restauration.....................................................................209 4.4.6 Utilisation de myisamchk pour la maintenance des tables et leur 4.4.6.10 Optimisation de tables...............................................................................223 4.4.8 Obtenir des informations sur une table................................................................224 4.5 Référence de langage d'administration de la base de données...................................228 4.5.6 Syntaxe de SHOW...............................................................................................231 4.5.6.2 SHOW TABLE STATUS.............................................................................233 4.5.6.3 Syntaxe de SHOW STATUS.......................................................................234 v Manuel MySQL 4.1.x ? Version Française Sommaire 4.5.6.8 Syntaxe de SHOW CREATE TABLE..........................................................247 4.6 Localisation de MySQL et utilisation internationale......................................................247 4.6.1 Le jeu de caractères utilisé pour les données et le stockage...............................247 4.6.1.1 Jeu de caractères allemand........................................................................248 4.6.7 Problèmes avec les jeux de caractères...............................................................252 4.7 Scripts serveur MySQL et utilitaires..............................................................................252 4.7.5 mysqld?max , la version étendue du serveur mysqld..........................................262 4.8 MySQL Scripts clients et utilitaires................................................................................263 4.8.10 Comment exécuter des commandes SQL depuis un fichier texte.....................281 4.9 Les fichiers de log de MySQL.......................................................................................282 4.9.6 Entretien des fichiers de log.................................................................................286 4.10 Réplication de MySQL................................................................................................286 4.10.8 Correction de problèmes courants.....................................................................303 5.1 Vue d'ensemble de l'optimisation..................................................................................306 5.1.1 Limitations et inconvénients des choix conceptuels de MySQL...........................306 vi Manuel MySQL 4.1.x ? Version Française Sommaire 5.1.5 Utiliser vos propres tests de performance............................................................310 5.2 Optimisation des SELECT s et autres requêtes...........................................................311 5.2.2 Mesurer les performances d'une requête............................................................317 5.2.12 Autres conseils d'optimisation............................................................................324 5.3 Verrouillage de tables...................................................................................................326 5.3.2 Problème de verrouillage de tables......................................................................327 5.4 Optimisation de la structure de la base de données.....................................................328 5.4.8 Inconvénients de la création d'un grand nombre de tables dans la même base de données.....................................................................................................335 5.5 Optimisation du serveur MySQL...................................................................................335 5.5.1 Réglage du système, au moment de la compilation, et paramètres du démarrage...............................................................................................................335 5.5.6 Syntaxe de SET...................................................................................................341 5.6 Problèmes avec les disques.........................................................................................344 5.6.1 Utiliser des liens symboliques..............................................................................345 5.6.1.2 Utiliser des liens symboliques avec les tables............................................345 6.1 Structure du langage.....................................................................................................347 6.1.1 Literals: Comment écrire les chaînes et les nombres..........................................347 6.1.1.4 Valeurs NULL..............................................................................................349 6.1.2 Noms de bases, tables, index, colonnes et alias.................................................350 vii Manuel MySQL 4.1.x ? Version Française Sommaire 6.1.7 Est?ce que MySQL est sensible aux mots réservés ?.........................................356 6.2 Types de colonnes........................................................................................................357 6.2.2 Les types date et heure........................................................................................363 6.2.2.4 Le type YEAR..............................................................................................368 6.2.3 Les types chaînes................................................................................................369 6.2.3.4 Le type SET................................................................................................372 6.2.6 Capacités des colonnes.......................................................................................374 6.3 Fonctions à utiliser dans les clauses SELECT et WHERE...........................................375 6.3.1 Opérateurs et fonctions tout?types......................................................................376 6.3.1.4 Les fonctions de contrôle............................................................................380 6.3.2 Fonctions de chaînes de caractères....................................................................381 6.3.2.2 Sensibilité à la casse...................................................................................390 6.3.3 Fonctions numériques..........................................................................................390 6.3.3.2 Fonctions mathématiques...........................................................................391 6.3.6 Autres fonctions...................................................................................................404 6.3.6.2 Fonctions diverses......................................................................................405 6.3.7 Fonctions avec la clause GROUP BY..................................................................410 6.4 Manipulation de données : SELECT , INSERT , UPDATE , DELETE..........................412 6.4.1 Syntaxe de SELECT............................................................................................412 6.4.1.2 Syntaxe de UNION......................................................................................417 6.4.3 Syntaxe de INSERT.............................................................................................418 6.4.3.1 Syntaxe de INSERT ... SELECT.................................................................420 6.4.9 Syntaxe de LOAD DATA INFILE..........................................................................425 viii Manuel MySQL 4.1.x ? Version Française Sommaire 6.4.10 Syntaxe de DO...................................................................................................431 6.5 Définition de données : CREATE , DROP , ALTER......................................................431 6.5.3 Syntaxe de CREATE TABLE...............................................................................432 6.5.3.1 Modification automatique du type de colonnes...........................................439 6.5.8 Syntaxe de DROP INDEX....................................................................................444 6.6 Commandes de bases de l'utilisateur de MySQL.........................................................444 6.6.2 Syntaxe de DESCRIBE (obtenir des informations sur les colonnes)...................444 6.7 Commandes relatives aux verrous et aux transactions................................................445 6.7.3 Syntaxe de SET TRANSACTION........................................................................447 6.8 Recherche en Texte?entier (Full?text) dans MySQL....................................................448 6.8.3 A faire dans la recherche Full?text......................................................................452 6.9 Cache de requêtes MySQL...........................................................................................452 6.9.4 Status du cache de requêtes et maintenance......................................................455 7.1 Tables MyISAM.............................................................................................................456 7.1.2 Formats de table MyISAM....................................................................................459 7.1.2.3 Caractéristiques des tables compressées..................................................461 7.1.3 Problèmes avec les tables MyISAM.....................................................................462 7.1.3.2 Clients is using or hasn't closed the table properly.....................................462 7.2 Tables assemblées MERGE.........................................................................................463 7.2.1 Problèmes avec les tables MERGE.....................................................................465 7.3 Tables ISAM.................................................................................................................466 7.4 Tables HEAP................................................................................................................466 7.5 Tables InnoDB..............................................................................................................467 7.5.3 Créer des bases InnoDB......................................................................................473 7.5.3.1 Si quelque chose se passe mal à la création de la base de données........474 7.5.6 Sauver et restaurer une base InnoDB..................................................................477 7.5.6.1 Points de contrôle.......................................................................................479 ix Manuel MySQL 4.1.x ? Version Française Sommaire 7.5.8 Modèle transactionnel de InnoDB........................................................................479 7.5.8.9 Le moniteur InnoDB....................................................................................487 7.5.10 Structures de tables et d'index...........................................................................489 7.5.10.4 Structure physique d'une ligne..................................................................491 7.5.11 Gestion de l'espace fichiers et des entrées/sorties disque................................491 7.5.11.3 Défragmentation des tables......................................................................493 7.5.15 Informations de contact InnoDB.........................................................................502 7.6 Tables BDB ou BerkeleyDB..........................................................................................503 7.6.8 Erreurs pouvant survenir lors de l'utilisation des tables BDB...............................506 8.1 API PHP pour MySQL...................................................................................................508 8.1.1 Problèmes fréquents avec MySQL et PHP..........................................................508 8.2 API Perl pour MySQL....................................................................................................508 8.2.3 Plus d'informations relatives à DBI / DBD............................................................514 8.3 Support ODBC avec MySQL........................................................................................514 8.3.2 Comment remplir les différents champs dans le programme d'administrateur ODBC......................................................................................................................515 8.3.7 Rapporter des problèmes avec MyODBC............................................................522 x Manuel MySQL 4.1.x ? Version Française Sommaire 8.4 Interface C pour MySQL...............................................................................................523 8.4.3 Description des fonctions de l'API C....................................................................529 8.4.3.11 mysql_eof()...............................................................................................535 8.4.3.26 mysql_get_proto_info().............................................................................543 8.4.3.47 mysql_select_db().....................................................................................558 xi Manuel MySQL 4.1.x ? Version Française Sommaire 8.4.3.52 mysql_use_result()....................................................................................561 8.4.4 Description des fonctions threadées de C...........................................................562 8.4.4.4 mysql_thread_safe()...................................................................................563 8.4.5 Description des fonctions C du serveur embarqué..............................................563 8.4.5.2 mysql_server_end()....................................................................................564 8.4.6 Questions courantes sur la librairie C..................................................................564 8.4.6.1 Pourquoi est ce qu'après mysql_query() ait indiqué un résultat positif, mysql_store_result() retourne parfois NULL ?............................................564 8.4.6.4 Problèmes lors de la liaison avec l'API C....................................................566 8.4.9 libmysqld, la librairie du serveur embarqué MySQL.............................................568 8.4.9.7 Licence du serveur embarqué.....................................................................573 8.5 Interfaces MySQL pour C++.........................................................................................573 8.5.1 Borland C++.........................................................................................................573 8.9 Couche MySQL pour Eiffel...........................................................................................574 9.1 Rouages de MySQL......................................................................................................575 9.1.2 Suite de test de MySQL.......................................................................................575 9.1.2.3 Rapporter des bugs dans la suite de tests MySQL.....................................577 9.2 Ajouter des fonctions à MySQL....................................................................................578 9.2.2 Ajouter une nouvelle fonction définie par l'utilisateur (UDF)................................579 9.2.2.5 Compiler et installer des fonctions utilisateurs............................................586 xii Manuel MySQL 4.1.x ? Version Française Sommaire 9.2.3 Ajouter de nouvelles fonctions natives.................................................................587 9.3 Ajouter une nouvelle procédure à MySQL....................................................................588 9.3.2 Ecrire une procédure............................................................................................589 10.2 Erreurs communes rencontrées avec MySQL............................................................591 10.2.16 Fichier non trouvé............................................................................................600 10.3 Notes relatives à l'installation......................................................................................601 10.3.3 Problèmes avec les permissions sur fichiers.....................................................603 10.4 Notes relatives à l'administration................................................................................604 10.4.6 Problèmes de fuseaux horaires.........................................................................609 10.5 Problèmes relatifs aux requêtes.................................................................................609 10.5.7 Problèmes de comparaisons avec nombres à virgule flottante..........................614 10.6 Questions relatives aux définitions de tables..............................................................616 10.6.3 Problèmes avec les tables temporaires.............................................................617 xiii Manuel MySQL 4.1.x ? Version Française Sommaire 12.3 Supporters de MySQL................................................................................................630 13.1 Changes in release 4.1.x (Alpha)................................................................................632 13.1.1 Changes in release 4.1.0...................................................................................632 13.2 Changes in release 4.0.x (Beta).................................................................................633 13.2.7 Changes in release 4.0.0 (Oct 2001: Alpha)......................................................643 13.3 Changes in release 3.23.x (Stable).............................................................................644 13.3.35 Changes in release 3.23.21.............................................................................667 xiv Manuel MySQL 4.1.x ? Version Française Sommaire 13.3.56 Changes in release 3.23.0 (05 Aug 1999: Alpha)............................................677 13.4 Changes in release 3.22.x (Older; still supported)......................................................679 13.4.29 Changes in release 3.22.7 (Sep 1998: Beta)...................................................687 xv Manuel MySQL 4.1.x ? Version Française Sommaire 13.4.36 Changes in release 3.22.0...............................................................................691 13.5 Changes in release 3.21.x..........................................................................................692 13.5.35 Changes in release 3.21.0...............................................................................704 13.6 Changes in release 3.20.x..........................................................................................705 13.6.7 Changes in release 3.20.11...............................................................................708 xvi Manuel MySQL 4.1.x ? Version Française Sommaire 13.6.14 Changes in release 3.20.0...............................................................................711 13.7 Changes in release 3.19.x..........................................................................................712 13.7.3 Changes in release 3.19.3.................................................................................712 14.1 Déboguer un serveur MySQL.....................................................................................714 14.1.5 Utilisation des fichiers de log pour trouver d'où viennent les erreurs de mysqld.....................................................................................................................718 14.1.6 Faire une batterie de tests lorsque vous faites face à un problème de table corrompue...............................................................................................................719 14.6 Différences entre les différents packages de threads.................................................725 xvii 1 Informations générales Le logiciel MySQL (TM) est un serveur de base de données SQL très rapide, multi?threadé, multi?utilisateur et robuste. Le serveur MySQL est destiné aux missions stratégiques et aux systèmes de production à forte charge, ainsi qu'à l'intégration dans des logiciels déployés à grande échelle. MySQL est une marque déposée de MySQL AB . Le logiciel MySQL dispose de deux licenses . Les utilisateurs peuvent choisir entre utiliser MySQL comme un logiciel Open Source / Logiciel libre , sous les termes de la licence GNU General Public License ( MySQL AB . MySQL Support and Licensing . Le site web de MySQLfournit les dernières informations sur le serveur MySQL . La liste suivante décrit les sections particulières de ce manuel : Pour plus d'informations sur la société derrière le • serveur de base de données MySQLPour une présentation des capacités de • serveur de base de données MySQL , voyez Pour les instructions d'installation, voyez Installation de MySQL . • Pour des conseils sur le port du • serveur de base de données MySQL sur de Pour des informations sur la mise à jour vers la version 3.23, voyez Passer de la version • Pour des informations sur la mise à jour vers la version 3.22, voyez Passer de la version • Pour une introduction au • serveur de base de données MySQL , voyez Tutoriel Pour des exemples de • SQL et des tests de performances, voyez le dossier de tests ( sql?bench de la distribution. Pour connaître l'historique des fonctionnalités et bogues, voyez Historique des versions de • Pour une liste des bogues connus et des limitations, voyez Erreurs connues et manques de • Pour les plans de développement, voyez MySQL and the future (The TODO) . • Pour une liste de tous les contributeurs à ce projet, voyez Contributeurs . • Important : Les rapports d'erreurs (aussi appelés bogues), ainsi que les questions et rapporter des bogues ou problèmes .Le script mysqlbug doit être utilisé pour générer le rapport de bogues. Pour les distributions sources, le script mysqlbug est accessible dans le dossier scripts . Pour les distributions binaires, mysqlbug est installé dans le dossier bin . Si vous avez trouvé un problème de sécurité critique dans le code du serveur MySQL , vous devez envoyez un email à . 1.1 A propos du manuel Ceci est le manuel de référence de MySQL ; il documente MySQL jusqu'à la version 4.0.5a. Les évolutions fonctionnelles sont toujours indiquées avec une référence à la version d'évolution, de manière à ce que ce manuel soit toujours valable, même si vous utilisez une ancienne version de MySQL . Etant un manuel de référence, il ne fournit aucune description générale sur le langage SQL ou les concepts de bases de données relationnelles.Comme le logiciel de base de données MySQL est en développement constant, ce manuel es mis à jour fréquemment. La version la plus 1 Informations générales 1 Manuel MySQL 4.1.x ? Version Française HTML, PDF et Windows HLP. L'original du document est un fichier au format Texinfo. La version HTML est produite automatiquement avec une version modifiée de texi2html . La version en texte plein et version Info sont produites par makeinfo . La version PostScript est produite avec texi2dvi et dvips . La version PDF est produite avec pdftex . Si vous avez du mal à trouver des informations dans ce manuel, vous pouvez essayer notre version suggestions concernant des ajouts ou des corrections à ce manuel, vous pouvez les envoyez à Axmark et Michael (Monty) Widenius. Il est actuellement entretenu par Michael (Monty) Widenius, Arjen Lentz et Paul DuBois. Pour les autres contributeurs, voyez les Contributeurs . La traduction de ce manuel a été faite sous la direction de Damien Seguy, et organisée par Mehdi Achour. David Manusset, Guillaume Plessis, Patrick Haond, Sylvain Maugiron et Yannick Torres ont contribué largement à cette traduction et son entretien. Le copyright (2002) de ce manuel est la propriété de la société suédoise MySQL ABlicenses utilisées par MySQL . 1.1.1 Conventions utilisées dans ce manuel Ce manuel utilise certaines conventions typographiques : constant La police à largeur fixe est utilisée pour les noms de commandes et les options, les requêtes SQL, les noms de bases de données, de tables et de colonnes, le code C et Perl, les variables d'environnement. Par exemple, ``Pour voir comment mysqladmin fonctionne, exécutez?le avec l'option ??help .'' filename La police à largeur fixe avec des guillemets d'encadrement indique des noms de fichiers et de chemins de dossiers. Par exemple : ``La distribution est installée dans le dossier /usr/local/ .'' 'c' La police à largeur fixe avec des guillemets d'encadrement est aussi utilisée pour indiquer des séquences de caractères. Par exemple : ``Pour spécifier un caractère joker, utilisez le caractère '%' .'' italic Les polices en italique sont utilisées pour attirer l'attention, comme ceci . boldface Le gras est utilisé pour les entêtes de tables, et aussi pour attirer fortement votre attention . Lorsque les commandes qui sont affichées sont destinées à être exécutées par un programme particulier, le nom du programme est indiqué dans l'invite de la commande. Par exemple, shell> indique une commande que vous exécutez depuis votre console shell, et mysql> indique une commande que vous exécutez depuis le client mysql : shell> tapez une commande shell ici mysql> tapez une requête SQL ici Les commandes shell sont affichées en utilisant la syntaxe du Bourne. Si vous utilisez le style csh 1.1.1 Conventions utilisées dans ce manuel 2 Manuel MySQL 4.1.x ? Version Française ?shell, vous aurez peut être a adapter légèrement les commandes. Par exemple, la syntaxe de modification d'une variable et d'exécution d'une commande ressemble à ceci en Bourne shell : shell> NOMVAR=valeur une_commande En csh , vous auriez a exécuter la commande suivante : shell> setenv NOMVAR valeur shell> une_commande Souvent, les noms de bases de données, tables ou colonnes doivent être remplacés dans les commandes. Pour indiquer qu'une telle substitution est nécessaire, ce manuel utilise les noms de nom_de_base , nom_de_table et nom_colonne . Par exemple, vous pourriez avoir une requête comme ceci : mysql> SELECT nom_colonne FROM nom_de_base.nom_de_table; Cela signifie que si vous devez saisir une requête semblable, vous devriez utiliser votre propre nom de colonne, table et base de données, ce qui pourrait se traduire par ceci : mysql> SELECT author_name FROM biblio_db.author_list; Les mot réservés SQL ne sont pas sensibles à la casse, et peuvent être écrits en majuscules ou minuscules. Ce manuel utilise les les illustrations de syntaxe, les crochets ( '[' et ']' ) sont utilisés pour indiquer des clauses ou mots optionnels. Par exemple, dans la requête suivante, IF EXISTS est optionnel : DROP TABLE [IF EXISTS] nom_de_table Lorsqu'un élément de syntaxe est constitué d'un certain nombre d'alternatives, les alternatives sont séparées par des barres verticales ( '|' ). Lorsqu'un membre d'un tel jeu de possibilités peut être choisi, les alternatives sont listées entre crochets ( '[' et ']' ): TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) Lorsqu'un élément d'un jeu de possibilités doit être choisi, les alternatives sont placées entre accolades ( '{' et '' }): {DESCRIBE | DESC} nom_de_table {nom_colonne | wild} 1.2 Qu'est ce que MySQL? MySQL , le plus populaire des serveurs de bases de données SQL Open Source , est développé, distribué et supporté par MySQL AB . MySQL AB est une société commerciale, fondée par les développeurs de MySQL, qui développent leur activité en fournissant des services autour de MySQL . Qu'est ce que MySQL AB ? Le site web de MySQLdernières actualités sur le logiciel MySQL et sur la société MySQL AB . MySQL est un système de gestion de bases de données. Une base de données est un ensemble organisé de données. Cela peut aller d'une simple liste de courses au supermarché à une galerie de photos, ou encore les grands systèmes d'informations des multi?nationales. Pour ajouter, lire et traiter des données dans une base de données, vous avez besoin d'un système de gestion de bases de données tel que le serveur MySQL . Comme les ordinateurs sont très bons à manipuler de grandes quantités de données, le système de gestion de bases de données joue un rôle central en informatique, aussi bien en tant qu'application à part entière, qu'intégré dans d'autres logiciels. MySQL est un serveur de bases de données relationnel. Un serveur de bases de données stocke les données dans des tables séparées plutôt que de tout rassembler dans une seule table. Cela améliore la rapidité et la souplesse de l'ensemble. Les tables sont reliées par des relations définies, qui rendent possible la combinaison de données entre plusieurs tables durant une requête. Le SQL dans `` MySQL '' signifie `` Structured Query Language '' : le langage standard pour les traitements de bases de données. MySQL est Open Source . Open Source (Standard Ouvert) signifie qu'il est possible à chacun d'utiliser et de modifier le logiciel. Tout le monde peut télécharger MySQL sur Internet, et l'utiliser 1.2 Qu'est ce que MySQL? 3 Manuel MySQL 4.1.x ? Version Française sans payer aucun droit. Toute personne en ayant la volonté peut étudier et modifier le code source pour l'adapter à ses besoins propres. Le logiciel MySQL utilise la licence GPL ( GNU General Public Licensepour définir ce que vous pouvez et ne pouvez pas faire avec ce logiciel, dans différentes situations. Si vous ne vous sentez pas confortable avec la licence GPL ou bien que vous devez intégrer MySQL dans une application commerciale, vous pouvez acheter une licence commercial auprès de MySQL AB. Licences MySQL . Pourquoi utiliser le serveur de bases de données MySQL ? Le serveur de bases de données MySQL est très rapide, fiable et facile à utiliser. Si c'est ce que vous recherchez, vous devriez faire un essai. Le serveur de bases de données MySQL dispose aussi de fonctionnalités pratiques, développées en coopération avec nos utilisateurs. Vous pouvez trouver une comparaison des performances du serveur MySQL avec d'autres systèmes de bases de données dans nos pages de tests de performances. La suite de tests comparatifs de MySQL . Le serveur MySQL a été développé à l'origine pour gérer de grandes bases de données plus rapidement que les solutions existantes, et a été utilisé avec succès dans des environnements de production très contraints et très exigeants, depuis plusieurs années. Bien que toujours en développement, le Le serveur MySQL offre des fonctions nombreuses et puissantes. Ses possibilités de connexions, sa rapidité et sa sécurité font du serveur MySQL une serveur hautement adapté à Internet. Les caractéristiques techniques du serveur MySQL . logiciel de bases de données MySQL est un système client/serveur, constitué d'un serveur SQL multi?threadé qui supporte différents systèmes de stockage, plusieurs logiciels clients et librairies, outils d'administration, ainsi que de nombreuses interfaces de programmation (des API ). Nous fournissons aussi le serveur MySQL sous la forme d'une librairie multi?threadé que vous pouvez inclure dans vos applications, pour obtenir un produit plus compact, plus rapide et plus facile à gérer. Il existe un grand nombre de contributions à MySQL . Il est très probable que vous pourrez trouver votre éditeur préféré ou que votre environnement de programmation supporte déjà le serveur de base de données MySQL . La prononciation officielle de MySQL est ``My Ess Que Ell'' (en anglais), ce qui donne ``Maille Esse Cu Elle'' en phonétique française. Evitez d'utiliser la prononciation ``my sequel'', mais nous ne nous formaliserons pas que vous utilisiez ``my sequel'' ou une autre prononciation adaptée. 1.2.1 Histoire de MySQL Nous avons débuté avec l'intention d'utiliser mSQL pour se connecter à nos tables en utilisant nos propres routines bas niveau ISAM. Cependant, après quelques tests, nous sommes arrivés à la conclusion que mSQL n'était pas assez rapide et flexible pour nos besoins. Cela nous a conduit à créer une nouvelle interface SQL pour notre base de données, mais en gardant la même API que mSQL . Cette API a été choisie pour la facilité de port des programmes de tiers. Les liens avec le nom MySQL ne sont pas parfaitement établis. Notre dossier de base et un grand nombre de librairies et outils étaient préfixés par ``my'' depuis plus de 10 ans. Mais la fille de Monty, plus jeune que lui, était aussi appelée My. Lequel des deux a conduit au nom de MySQL est toujours un mystère, même pour nous. 1.2.1 Histoire de MySQL 4 Manuel MySQL 4.1.x ? Version Française 1.2.2 Les fonctionnalités principales de MySQL La liste suivante décrit les caractéristiques principales du logiciel de bases de données MySQL . MySQL 4.x In A Nutshell . Interne et portabilité Ecrit en C et C++. Testé sur un large éventail de compilateurs différents. Utilise GNU Automake, Autoconf et Libtool pour une meilleure portabilité. Dispose d'API pour C, C++, Eiffel, Java, Perl, PHP, Python, Ruby et Tcl. Complètement multi?threadé, grâce aux threads du noyau. Cela signifie que vous pouvez l'utiliser facilement sur un serveur avec plusieurs processeurs. Tables B?tree très rapide, avec compression d'index. Système l'allocation mémoire très rapide, exploitant les threads. Jointures très rapides, exploitant un système de jointures multiples en une seule passe optimisé. Tables en mémoire, pour réaliser des tables temporaires. Les fonctions SQL sont implémentées grâce à une librairie de classes optimisées, qui sont aussi rapides que possible! Généralement, il n'y a aucune allocation mémoire une fois que la requête a été initialisée. Le code de MySQL est vérifié avec Purify (un utilitaire de détection des fuites mémoires commercial) ainsi qu'avec Valgrind, un outil GPL ( ). Column Types Nombreux types de colonnes : entiers signés ou non, de 1, 2, 3, 4, et 8 octets, FLOAT , DOUBLE , CHAR , VARCHAR , TEXT , BLOB , DATE , TIME , DATETIME , TIMESTAMP , YEAR , SET et ENUMEnregistrements de taille fixe ou variable. Toutes les colonnes ont des valeurs par défaut. Vous pouvez utiliser la commande INSERT pour insérer un sous ensemble de colonnes : les colonnes qui ne sont pas explicitement cités prennent alors leur valeur par défaut. Commandes et fonctions Support complet des opérateurs et fonctions dans la commande SELECT et la clause WHERE . Par exemple : mysql> SELECT CONCAT(first_name, " ", last_name) ?> FROM tbl_name ?> WHERE income/dependents > 10000 AND age > 30; Support complet des clauses SQL GROUP BY et ORDER BY . Support des fonctions de groupages ( COUNT() , COUNT(DISTINCT ...) , AVG() , STD() , SUM() , MAX() et MIN() ). Support des clauses LEFT OUTER JOIN et RIGHT OUTER JOIN avec les syntaxes ANSI SQL et ODBC. Les alias de tables et colonnes sont compatibles avec le standard SQL92. DELETE , INSERT , REPLACE et UPDATE retourne le nombre de lignes affectées. Il est possible d'obtenir le nombre de lignes trouvées en modifiant une option lors de la connexion au serveur. La commande spécifique à MySQL SHOW est utilisée pour obtenir des informations sur les bases, tables et index. La commande EXPLAIN sert à optimiser les requêtes. Les noms de fonctions ne sont jamis en conflit avec les noms de tables ou colonnes. Par exemple, ABS est un nom de colonne valide. La seule restriction est que, lors d'un appel de fonction, aucun espace n'est toléré 1.2.2 Les fonctionnalités principales de MySQL 5 Manuel MySQL 4.1.x ? Version Française entre le nom de la fonction et la parenthèse ouvrante '('Vous pouvez utiliser simultanément des tables de différentes bases (depuis la version 3.22). Securité Un système de droits et de mots de passe très souple et sécuritaire, qui vérifie aussi les hôtes se connectant. Les mots de passe sont bien protégés, car tout les échanges de mot de passe sont chiffrés, même lors des connexions. Charges supportées et limites Gère les très grandes bases de données. Nous utilisons le serveur MySQL avec des bases qui contiennent 50 millions de lignes et nous connaissons des utilisateurs qui utilisent le serveur MySQL avec plus de 60 000 tables and et 5 000 000 000 (milliards) de lignes. Jusqu'à 32 index sont permis par table. Chaque index est constitué de 1 à 16 colonnes ou parties de colonnes. La taille maximale d'un index est de 500 octets (ce qui peut être configuré à la compilation du serveur MySQL . Un index peut utiliser un préfixe issu d'un champs CHAR ou VARCHAR . Connectivité Les clients peuvent se connecter au serveur MySQL en utilisant les sockets TCP/IP, les sockets Unix (Unix) ou les Named Pipes (NT). Support de ODBC (Open?DataBase?Connectivity) pour Win32 (avec les sources). Toutes les fonctions ODBC 2.5 et de nombreuses autres. Par exemple, vous pouvez utiliser MS Access pour vous connecter au serveur MySQL . Support ODBC pour MySQL . Traductions Le serveur fournit des messages d'erreurs au client dans de nombreuses Support complet de plusieurs jeux de caractères, comprenant ISO?8859?1 (Latin1), german, big5, ujis, and more. Par exemple, les caractères nordiques 'Â', 'ä' et 'ö' sont autorisés dans les noms de tables et colonnes. Toutes les données sont sauvées dans le jeu de caractères choisi. Les comparaisons normales de chaînes sont insensibles à la casse. Le tri est fait en fonction du jeu de caractères choisi (par défaut, le jeu suédois). Il est possible de le changer lorsque le serveur MySQL est démarré. Pour voir un exemple très avancé de tri, voyez le code de tri pour le Tchèque. Le serveur MySQL supporte de nombreux jeux de caractères qui peuvent être spécifié à la compilation et durant l'exécution. Clients et utilitaires Inclut myisamchk , un utilitaire rapide pour vérifier les tables, les optimiser et les réparer. Toutes les fonctionnalités de myisamchk sont aussi disponibles Tous les programmes MySQL peuvent être appelés avec l'option ??help ou ?? pour obtenir de l'aide en ligne. 1.2.3 Jusqu'à quel point MySQL est il stable ? Cette section répond aux questions `` Jusqu'à quel point MySQL est il stable ? '' et `` Puis?je faire confiance à MySQL pour mon projet ? '' Nous allons tenter d'apporter des réponses claires à ces questions importantes qui concernent tous les utilisateurs potentiels. Les informations de cette section sont fournies par les listes de diffusions, qui sont très actives et promptes à identifier les problèmes et les rapporter. 1.2.3 Jusqu'à quel point MySQL est il stable ? 6 Manuel MySQL 4.1.x ? Version Française Le code original date du début des années 80 et fournit une base de code stable, tout en assurant une compatibilité ascendante avec le format ISAM. A TcX, le prédécesseur de MySQL AB , le code de MySQL a fonctionné sur des projets depuis la mi 1996, sans aucun problème. Lorsque le Serveur MySQL a été livré à un public plus large, nous avons réalisé qu'il contenait du code ``jamais testé'' qui a été rapidement identifié par les utilisateurs, qui effectuait des requêtes différentes des nôtres. Chaque nouvelle version avait moins de problèmes de portabilité, même si chaque nouvelle version avait de nombreuses nouvelles fonctionnalités. Chaque version du Serveur MySQL était parfaitement fonctionnelle. Les seuls problèmes étaient rencontrés par les utilisateurs de code de ces ``zone d'ombres''. Naturellement, les nouveaux utilisateurs ne connaissent pas ces zones : cette section tente de les présenter, dans la mesure de nos connaissances. Les descriptions correspondent surtout aux versions 3.23 du Serveur MySQL . Tous les bogues connus et rapportés ont été corrigés dans la dernière version, à l'exception de et manques de MySQL . La conception du serveur MySQL est faite en plusieurs couches, avec des modules indépendants. Certains des modules les plus récents sont listés ici, avec leur niveau de test : Réplication ?? Gamma De grands serveurs en grappe utilisant la réplication sont en production, avec de bons résultats. L'amélioration de la réplication continue avec MySQL 4.x. Tables InnoDB ?? Stable (en 3.23 depuis 3.23.49) Le gestionnaire transactionnel de tables InnoDB a été déclaré stable en MySQL version 3.23, à partir de la version 3.23.49. InnoDB est utilisé dans de grands systèmes complexes, avec forte charge. Tables BDB ?? Gamma Le code de Berkeley DB est très stable, mais nous sommes encore en train d'améliorer l'interface du gestionnaire transactionnel de table BDB du serveur MySQL . Cela demande encore du temps pour qu'il soit aussi bien testé que les autres types de tables. FULLTEXT ?? Beta La recherche en texte plein fonctionne mais n'est pas encore largement adoptée. Des améliorations importantes sont prévues pour MySQL 4.0. MyODBC 2.50 (utilise ODBC SDK 2.5) ?? Gamma En utilisation croissante. Certains problèmes sont apparus avec des applications tierces, et indépendemment du pilote ODBC ou du serveur utilisé. Tables à restauration automatique MyISAM ?? Gamma Ce statut ne concerne que le nouveau code du gestionnaire de tables MyISAM qui vérifie si la table a été correctement fermée lors de l'ouverture, et qui exécute automatiquement la vérification et réparation éventuelles de la table. Insertions de masse ?? Alpha Nouvelle fonctionnalité des tables MyISAM pour MySQL 4.0 qui permet des insertions plus rapides. Verrouillage ?? Gamma Cette fonctionnalité est très dépendante du système. Sur certains systèmes, il y a de gros problèmes lors de l'utilisation du verrouillage système (avec la fonction fcntl() ). Dans ces cas, il faut utiliser mysqld avec l'option ??skip?external?locking . Les problèmes sont connus sur certaines distributions Linux, et sur SunOS lorsqu'il est utilisé avec des disques en mode NFS. MySQL AB fournit un support de première qualité pour les clients payant, mais les listes de diffusions de MySQL sont généralement rapides à donner des réponses aux questions les plus communes. Les bogues sont généralement corrigés aussitôt avec un patch. Pour les bogues 1.2.3 Jusqu'à quel point MySQL est il stable ? 7 Manuel MySQL 4.1.x ? Version Française sérieux, il y a presque toujours une nouvelle version. 1.2.4 Quelles tailles de tables supporte MySQL ? MySQL version 3.22 a une limite de 4Go par table. Avec le nouveau format de table MyISAM , disponible avec MySQL version 3.23, la taille maximale des tables a été poussée à 8 millions de teraoctets (2 ^ 63 octets). Notez, toutefois, que les systèmes d'exploitation ont leur propres limites. Voici quelques exemples : Système d'exploitation Limite Linux?Intel 32 bit 2Go, 4Go ou plus, suivant la version de Linux Linux?Alpha 8To (?) Solaris 2.5.1 2Go (4Go possibles avec un patch) Solaris 2.6 4Go (peut être modifié avec une option) Solaris 2.7 Intel 4Go Solaris 2.7 UltraSPARC 512Go En Linux 2.2, vous pouvez avoir des tables plus grandes que 2Go en utilisant le patch LFS pour les systèmes de fichiers ext2. En Linux 2.4, le patche existe aussi pour ReiserFS. Cela signifie que les tables MySQL sont généralement limitées par le système d'exploitation. Par défaut, les tables MySQL peuvent atteindre une taille de 4Go. Vous pouvez vérifier la taille des tables avec la commande SHOW TABLE STATUS ou la commande en ligne myisamchk ?dv nom_de_table . Syntaxe de SHOW . Si vous avez besoin de tables plus grandes que 4Go (et que votre système d'exploitation le supporte, modifiez les paramètres AVG_ROW_LENGTH et MAX_ROWS lorsque vous créez votre table. Syntaxe de CREATE TABLE . Vous pouvez aussi les modifier ultérieurement avec ALTER TABLE . Syntaxe de ALTER TABLE . Si vos tables sont accessibles uniquement en lecture, vous pouvez aussi utiliser l'utilitaire myisampack pour rassembler et compresser plusieurs tables en une seule. myisampack compresse généralement la table de près de 50%, ce qui vous augmente d'autant la taille maximale de la table. myisampack , le générateur de tables MySQL compressées en lecture seule . Vous pouvez aussi contourner les limites du système d'exploitation avec les tables MyISAM , en utilisant l'option RAID . Syntaxe de CREATE TABLE . Une autre solution est d'utiliser la librairie MERGE , qui permet de gérer plusieurs tables comme une seule. Tables MERGE . 1.2.5 Compatibilité an 2000 Le serveur MySQL lui même n'a aucun problème de compatibilité avec l'an 2000 (Y2K) : Le • serveur MySQL utilise les fonctions de date Unix, et n'a aucun problème avec les dates jusqu'en 2069 ; toutes les années écrites en deux chiffres sont supposées faire partie de l'intervalle allant de 1970 à 2069 , ce qui signifie que si vous stockez la date 01 dans une colonne de type year , le serveur MySQL la traitera comme 2001 . 1.2.4 Quelles tailles de tables supporte MySQL ? 8 Manuel MySQL 4.1.x ? Version Française Toutes les fonctions de dates de • MySQL sont stockées dans un fichier , et sont codées très soigneusement pour être compatibles avec l'an 2000. En • MySQL version 3.22 et plus récent, le type de colonne YEAR peut stocker les valeurs 0 et de 1901 à 2155 sur un seul octet, tout en affichant 2 ou 4 chiffres. Vous pouvez rencontrer des problèmes avec les applications qui utilisent le serveur MySQL sans être compatible avec l'an 2000. Par exemple, les vieilles applications utilisent des valeurs d'années sur deux chiffres (ce qui est ambigu), plutôt qu'avec 4 chiffres. Ce problème peut être complété par des applications qui utilisent des valeurs telles que 00 ou 99 comme indicateur de données ``manquante''. Malheureusement, ces problèmes peuvent se révéler difficiles à corriger car différentes applications peuvent être écrites par différents programmeurs, et chacun utilise un jeu différent de conventions et de fonctions de gestion des dates. Voici une illustration simple qui montre que le serveur MySQL n'a aucun problème avec les dates jusqu'en 2030 : mysql> DROP TABLE IF EXISTS y2k; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE y2k (date DATE, ?> date_time DATETIME, ?> time_stamp TIMESTAMP); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO y2k VALUES ?> ("1998?12?31","1998?12?31 23:59:59",19981231235959), ?> ("1999?01?01","1999?01?01 00:00:00",19990101000000), ?> ("1999?09?09","1999?09?09 23:59:59",19990909235959), ?> ("2000?01?01","2000?01?01 00:00:00",20000101000000), ?> ("2000?02?28","2000?02?28 00:00:00",20000228000000), ?> ("2000?02?29","2000?02?29 00:00:00",20000229000000), ?> ("2000?03?01","2000?03?01 00:00:00",20000301000000), ?> ("2000?12?31","2000?12?31 23:59:59",20001231235959), ?> ("2001?01?01","2001?01?01 00:00:00",20010101000000), ?> ("2004?12?31","2004?12?31 23:59:59",20041231235959), ?> ("2005?01?01","2005?01?01 00:00:00",20050101000000), ?> ("2030?01?01","2030?01?01 00:00:00",20300101000000), ?> ("2050?01?01","2050?01?01 00:00:00",20500101000000); Query OK, 13 rows affected (0.01 sec) Records: 13 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM y2k; +????????????+?????????????????????+????????????????+ | date | date_time | time_stamp | +????????????+?????????????????????+????????????????+ | 1998?12?31 | 1998?12?31 23:59:59 | 19981231235959 | | 1999?01?01 | 1999?01?01 00:00:00 | 19990101000000 | | 1999?09?09 | 1999?09?09 23:59:59 | 19990909235959 | | 2000?01?01 | 2000?01?01 00:00:00 | 20000101000000 | | 2000?02?28 | 2000?02?28 00:00:00 | 20000228000000 | | 2000?02?29 | 2000?02?29 00:00:00 | 20000229000000 | | 2000?03?01 | 2000?03?01 00:00:00 | 20000301000000 | | 2000?12?31 | 2000?12?31 23:59:59 | 20001231235959 | | 2001?01?01 | 2001?01?01 00:00:00 | 20010101000000 | | 2004?12?31 | 2004?12?31 23:59:59 | 20041231235959 | | 2005?01?01 | 2005?01?01 00:00:00 | 20050101000000 | | 2030?01?01 | 2030?01?01 00:00:00 | 20300101000000 | | 2050?01?01 | 2050?01?01 00:00:00 | 00000000000000 | +????????????+?????????????????????+????????????????+ 13 rows in set (0.00 sec) 1.2.4 Quelles tailles de tables supporte MySQL ? 9 Manuel MySQL 4.1.x ? Version Française Cet exemple montre que les types DATE et DATETIME ne poseront aucun problème avec les dates futures (ils gèrent les dates jusqu'en 9999).Le type TIMESTAMP , qui est utilisé pour stocker la date courante, est valide jusqu'en 2030?01?01 . TIMESTAMP va de 1970 en 2030 sur les machines 32 bits (valeur signée). Sur les machines 64 bits, il gère les dates jusqu'en 2106 (valeur non signée).Même si le serveur MySQL est compatible an 2000, il est de votre responsabilité de fournir des données non ambiguës. Voyez Y2K issues and date types pour les règles du serveur MySQL pour traiter les dates ambiguës (les données contenant des années exprimées sur deux chiffres). 1.3 Qui est MySQL AB ? MySQL AB est l'entreprise des fondateurs de MySQL et les principaux développeurs. A l'origine, MySQL AB a été établie en Suède, par David Axmark, Allan Larsson et Michael Monty Widenius. Tous les développeurs du serveur MySQL sont employés par l'entreprise. Nous sommes une organisation virtuelle, avec des employés répartis dans une douzaine de pays à travers le monde. Nous communiquons intensivement entre nous sur l'Internet tous les jours, et avec nos utilisateurs, fans et partenaires. Nous nous consacrons au développement du logiciel MySQL et à la diffusion de notre base de données auprès des nouveaux utilisateurs. MySQL AB est propriétaire des droits du code source de MySQL , du logo MySQL? . Les valeurs fondamentales de MySQL témoignent de notre implication auprès de MySQL et des Logiciels libres .Nous souhaitons que la base de données MySQL soit : Le meilleur serveur de bases de données dans le monde et le plus répandu. • Le rendre accessible à tous. • Facile à utiliser. • En amélioration constante, tout en restant rapide et sécuritaire. • Plaisant à utiliser et améliorer. • Sans aucun bogue. • MySQL AB et les collaborateurs de MySQL AB : Font la promotion des • logiciels libres et supportent la communauté des Logiciels libres . Sont de bons citoyens. • Préfèrent les partenaires qui partagent nos valeurs et notre état d'esprit. • Répondent aux emails et fournissent de l'aide. • Sont une entreprise virtuelle, qui travaille en réseau avec les autres. • Militent contre les brevets logiciels. • Le site web de MySQLMySQL et MySQL AB . 1.3.1 Les services et le modèle d'affaire de MySQL AB Une des questions les plus fréquentes que nous rencontrons est : `` Comment arrivez?vous à vivre en développant un produit gratuit ? '' Voici comment. 1.3 Qui est MySQL AB ? 10 Manuel MySQL 4.1.x ? Version Française MySQL AB fait des affaires en vendant du support, des services, des licences commerciales et en percevant des royalties. Nous utilisons ces fonds pour le développement des produits et des affaires de MySQL . La compagnie est profitable depuis sa conception. En octobre 2001, nous avons accepté un financement de la part d'un groupe d'investisseurs scandivanes important et de quelques business angels. Cet investissement est utilisé pour consolider notre modèle d'affaires et assurer les bases de notre croissance à long terme. 1.3.1.1 Support MySQL AB est dirigé par ses propriétaires, qui sont les fondateurs et les principaux développeurs de la base de données MySQL . Les développeurs se consacrent au support des utilisateurs et des autres utilisateurs, afin de rester au courant de leurs besoins et leurs problèmes. Tout notre support est donné par des développeurs qualifiés. Les questions vraiment épineuses sont étudiées par Michael Monty Widenius, auteur principal du code du serveur ou contactez notre équipe de vente à . 1.3.1.2 Formation et certification MySQL AB organise des formations MySQL à travers le monde entier. Nous offrons des cours inter et intra entreprise, adaptés aux besoins spécifiques de chaque société. La formation MySQL est aussi disponible auprès de nos partenaires, les centres de formation certifiés MySQL . Nos documents de formation utilisent les mêmes exemples de bases de données que notre documentation et nos applications d'exemple, et ils sont toujours mis à jour pour prendre en compte les dernières versions de MySQL . Nos formateurs sont épaulés par notre équipe de développement pour garantir la qualité de la formation et le développement continu des documents de cours. Cela vous assure aussi qu'il n'y aura pas de questions laissées ouvertes durant les cours. Suivre nos formations vous permettra d'atteindre tous vos buts avec votre application MySQL . Vous allez aussi : Gagner du temps. • Améliorer les performances de vos applications. • Réduire ou éliminer les besoins en matériels supplémentaires, ce qui réduira vos coûts. • Améliorer la sécurité. • Améliorer la satisfaction de vos clients et collaborateurs. • Vous préparer à la • certification MySQL . Si vous êtes intéressé par nos formations, en tant que participant potentiel, ou comme partenaire de .Le programme de certification MySQL est publié dans le second semestre 2002. Pour plus de détails, voyez . 1.3.1.3 Conseil MySQL AB et ses partenaires accrédités offrent des services de conseil aux utilisateurs du serveur MySQL et à ceux qui intègrent le serveur MySQL dans leurs logiciels, à travers le monde. 1.3.1.1 Support 11 Manuel MySQL 4.1.x ? Version Française Nos consultants peuvent vous aider à concevoir et paramétrer vos bases, construire des requêtes efficaces, optimiser votre plate?forme, résoudre les problèmes de migration, installer la réplication, bâtir des applications transactionnelles robustes et bien plus encore. Nous aidons aussi les clients à intégrer le serveur MySQL dans leurs produits et applications, pour un déploiement d'envergure. Nos consultants travaillent en collaboration étroite avec notre équipe de développement pour assurer la qualité technique de nos services professionnels. Les missions de conseil peuvent aller de sessions de démarrage de deux jours à des projets de plusieurs semaines ou mois. Notre expertise couvre non seulement le serveur MySQL , mais s'étend aussi aux langages de programmation tels que PHP, Perl et d'autres vous êtes interessé par nos services de conseil ou si vous souhaitez devenir un partenaire conseil, visitez la section conseil de notre site . 1.3.1.4 Licences commerciales La base de données MySQL est publiée sous la licence GNU General Public License ( GPL ). Cela signifie que le logiciel MySQL peut être utilisé gratuitement, en acceptant les termes de la licence GPL . Si vous ne voulez pas être lié par les termes de la licence GPL (comme le fait que votre application aussi doit être GPL ), vous pouvez acheter une licence du même produit auprès de MySQL AB . Voyez . Comme MySQL AB est propriétaire du copyright du code source de MySQL , nous pouvons utiliser une double licence , qui fait que le même produit est disponible sous la licence GPL et sous une licence commerciale. Cela ne change en rien l'implication de MySQL AB dans le mouvement des logiciels libres . .Nous vendons aussi des licences commerciales aux logiciels Open Source GPL qui ajoutent à la valeur du serveur serveur MySQL . Un bon exemple est le gestionnaire de table transactionnel InnoDB qui offre le support ACID , le verrouillage de ligne, la restauration après crash, le multi versionnage, le support des clés étrangères, etc. Tables InnoDB . 1.3.1.5 Partenariats MySQL AB a un programme de partenariat mondial qui couvre la formation, le conseil et le support, les publications, la revente et la distribution des produits MySQL . Les partenaires MySQL AB spéciales des marques de commerce MySQL pour identifier leurs produits et promouvoir leur vous êtes intéressé à devenir un partenaire MySQL AB , envoyez un email à . Le mot MySQL et le logo MySQL avec le dauphin sont des marques commerciales de MySQL AB . les fondateurs de MySQL ont placé depuis plusieurs années. 1.3.1.6 Publicité Le site web MySQLutilisateurs. En Octobre 2001, nous avons eu 10 millions de pages vues. Nos visiteurs représentent un groupe effectuant des décisions d'achat et des recommandations pour le matériel et les logiciels. Douze pour cents de nos visiteurs émettent des décisions d'achat, et seulement 9 % n'en prennent pas du tout. Plus de 65 % d'entre eux ont effectué un ou plusieurs achats sur internet ces six derniers mois, et 70 % prévoient d'en faire un dans le mois à venir. 1.3.1.4 Licences commerciales 12 Manuel MySQL 4.1.x ? Version Française 1.3.2 Contacts Le site web de MySQLMySQL et MySQL AB .Pour les contacts presse et les questions qui ne sont pas couvertes par les vous avez un contrat de support valide avec MySQL AB , vous obtiendrez des réponses rapides et précises de notre équipe technique sur le logiciel MySQLemail à .Pour des informations sur les formations MySQL , visitez la section l'équipe de formation de MySQL des informations sur le programme de certification MySQL , voyez la section restreint à Internet, contactez l'équip de conseil de MySQL ABMySQL AB . Plus d'informations sur les licences sont disponibles à les licences ou que vous souhaitez un devis pour un achat de nombreuses licences, remplissez le MySQL ABpolitique de marque de commerce de MySQL , reportez?vous à Logos MySQL AB et marques déposées .Si vous êtes interessé par un des emplois à MySQL AB la fin de votre des discussions générales entre utilisateurs, dirigez vos questions sur bogues), ainsi que les questions et suggestions doivent être envoyés à la liste de diffusion . Si vous avez trouvé un trou de sécurité critique dans le serveur MySQL , vous avez un résultat de test que nous pouvons publier, contactez?nous à remarques spécifiques à la version française, vous pouvez aussi contacter directement Damien fonctionnement ou du contenu du site web .Pour les questions à propos des portails MySQL ( ), envoyez un email à . MySQL AB a une politique .Pour toutes les autres questions, envoyez un email à . 1.4 Support MySQL et licences Cette section décrit le support MySQL et les accords de licence. 1.3.2 Contacts 13 Manuel MySQL 4.1.x ? Version Française 1.4.1 Support proposé par MySQL AB Le support technique de MySQL AB est la réponse individualisée à vos problèmes particuliers, en direct, de l'équipe d'ingénieurs qui programme la base de données MySQL . Nous tâchons d'avoir un support technique exhaustif et global. Presque tous les problèmes qui impliquent MySQL sont importants pour nous, s'ils sont importants pour vous. Typiquement, les clients qui recherchent de l'aide sur les différentes commandes, qui souhaitent résoudre des problèmes de performance, réparer des systèmes corrompus, comprendre les impacts des systèmes d'exploitation ou des réseaux sur les performances de MySQL , mettre en place des bonnes pratiques pour la sauvegarde et l'entretien, utiliser les API s, etc. Notre support couvre uniquement le seveur MySQL et nos propres utilitaires, pas les produits tiers d'entreprises qui accèdent au serveur MySQL , même si nous pouvons parfois informations détaillées sur de support peuvent aussi être commandés en ligne. Si vous avez un accès restreint à Internet, vous identique à l'assurance vie. Vous pouvez vivre très heureux sans pendant plusieurs années, mais lorsque vous rencontrerez une catastrophe, il sera trop tard pour l'acheter. Si vous utilisez MySQL pour des applications importantes et que vous rencontrez des problèmes, cela peut vous prendre très longtemps pour comprendre par vous? même. Vous pourriez alors avoir besoin de communiquer avec les techniciens les plus expérimentés de MySQL , ceux qui sont employés par MySQL AB . 1.4.2 Copyrights et licences utilisées par MySQL MySQL AB est propriétaire du copyright du code source de MySQL , des logos MySQL , de la sont disponibles pour la diffusion de MySQL : Toutes les sources spécifiques de • MySQL pour le serveur, le client mysqlclient et la librairie, ainsi que la librairie GNU readline sont couverts par la licence GNU General Public Licensedisponible dans le fichier intitulé COPYING dans les distributions. La librairie • GNU getopt est sous la licence GNU Lesser General Public License . Certaines parties du code source (la librairie • regexp ) sont placées sous un copyright de type Berkeley. Les anciennes versions de • MySQL (3.22 et plus récentes) sont sujettes à des licences plus spécifique de chaque version pour plus de détails. La manuel n'est actuellement • PAS distribué sous la licence GPL . L'utilisation du manuel est sujette à ces conditions : Les conversions en d'autres formats sont autorisées, mais le contenu ne doit pas ? être modifié ou édité de quelque manière que ce soit. Vous pouvez créer une version imprimée pour votre utilisation personnelle. ? Pour toutes les autres utilisations, telles que la vente de versions imprimées, ou ? l'utilisation (en partie ou en totalité) du manuel dans d'autres publications, un accord doit être conclu au préalable avec MySQL AB . interessé par la traduction du manuel. Pour plus de détails sur comment les licences MySQLaussi Logos MySQL AB et marques déposées . 1.4.1 Support proposé par MySQL AB 14 Manuel MySQL 4.1.x ? Version Française 1.4.3 Licences MySQL Le logiciel MySQL est publié sous la licence GNU General Public License ( GPL ), qui est probablement mieux connue sous le nom de Open Source . Les termes exacts de la licence GPL .Comme le logiciel MySQL est publié sous la licence GPL , il est souvent utilisé gratuitement, mais pour certains usages vous souhaiterez peut?être acheter une licence commerciale auprès de MySQL ABplus d' anciennes versions de MySQL (3.22 et plus anciennes) sont sujettes à une documentation spécifique de chaque version pour information. Notez bien que l'utilisation du logiciel MySQL sous une licence commerciale. GPL , ou toute autre ancienne licence MySQL ne vous donne pas automatiquement le droit d'utiliser les marques commerciales de MySQL AB . Logos MySQL AB et marques déposées . 1.4.3.1 Utiliser MySQL avec la licence commerciale La licence GPL est contagieuse, dans le sens où lorsqu'un programme est lié à la licence GPL , toutes les sources de toutes les parties du produit final doivent aussi être publiée sous la licence GPL . Sinon, vous violez la licence, et annulez vos droits d'utiliser le programme GPL . Vous avez besoin d'une licence commerciale pour : Lorsque vous reliez un programme à un logiciel • GPL issu de MySQL et que vous ne voulez pas que le produit final soit publié sous la licence GPL , peut être parce que vous souhaitez publier un produit commercial ou conserver du code non? GPL pour d'autres raisons. Lorsque vous achetez une licence commerciale vous n'utilisez plus MySQL sous la licence GPL , même si c'est le même code. Lorsque vous distribuez une application non? • GPL qui fonctionne uniquement avec MySQL , et que vous distribuez cette application avec MySQL . Ce type de solution est considéré comme un lien, même si c'est fait via le réseau. Lorsque vous distribuez des copies de • MySQL sans fournir le code source original, comme requis par la licence GPL . Lorsque vous voulez supporter le développement de • MySQL même si vous n'avez pas besoin formellement de la licence commerciale. Acheter du support auprès de MySQL AB est une autre bonne solution pour contribuer au développement de MySQL , avec des avantages directs pour vous. Support offert par MySQL AB . Si vous avez besoin d'une licence, vous en aurez besoin d'une pour chaque installation de MySQL . Cela est valable quelque soit le nombre de processeurs de la machine, et il n'y a pas de limite artificielle de nombre de connexion simultané les licences commerciales, voyez notre site restreint à internet, contactez notre équipe de vente à . 1.4.3.2 Utiliser MySQL sous licence GPL libre Vous pouvez utiliser le logiciel MySQL sous la licence gratuite GPL si vous acceptez les termes et conditions de la licence GPL . Pour une liste exhaustive des questions courantes à propos de la licence GPL , voyez la FAQ générale de la Free Software Foundation à 1.4.3 Licences MySQL 15 Manuel MySQL 4.1.x ? Version Française ? . Quelques cas courants : Lorsque vous distribuez votre application et le code source • MySQL , ensemble avec la licence GPL . Lorsque vous distribuez le code source • MySQL avec d'autres programmes qui ne sont pas liés ou dépendant de MySQL pour leur fonctionnalités, même si vous vendez la distribution commercialement. Ceci s'appelle une agrégation simple en termes GPL . Si vous ne distribuez • aucune partie de MySQL , vous pouvez l'utiliser gratuitement. Lorsque vous êtes un fournisseur de services Internet (ISP), qui offre un hébergement web • avec le MySQL . Cependant, nous vous encourageons à faire affaires avec un ISP qui dispose du support MySQL, car cela vous donne l'assurance que si votre hébergeur a des problèmes avec l'installation de MySQL , votre hébergeur aura les ressources pour résoudre votre problème. Notez que si votre ISP n'a pas de licence commerciale pour le le MySQL , il devrait au moins fournir l'accès en lecture aux sources aux clients pour qu'ils vérifient que l'installation de MySQL est correctement patchée. Lorsque vous utilisez le serveur de bases de données • MySQL en conjonction avec un serveur web, vous n'avez pas besoin de licence commerciale (aussi longtemps que ce n'est pas un produit que vous distribuez). Ceci est même vrai si vous avec un serveur web qui utilise le serveur MySQL , car vous ne distribuez pas de partie de MySQL . Cependant, dans ce cas, nous vous demandons d'acheter du support MySQL car MySQL aide votre entreprise Si vous utilisez le serveur de bases de données MySQL sans avoir besoin de licence commerciale, nous vous encourageons à acheter le support auprès de MySQL AB malgré tout. De cette façon, vous contribuez au développement de MySQL et en obtenez des avantages immédiats vous?même. Support offert par MySQL AB . Si vous utilisez MySQL dans un contexte commercial tel que vous en tirez profit, nous vous demandons de participer au développement de MySQL en achetant du support. Nous pensons que comme MySQL aide votre entreprise, il est raisonnable de vous demander d'aider à votre tour MySQL AB . (Sinon, lorsque vous nous posez des questions de support, non seulement vous utilisez gratuitement un système dans lequel nous avons investi beaucoup de temps, mais en plus, vous nous demandez du support gratuit, en plus !) 1.4.4 Logos MySQL AB et marque déposée Beaucoup d'utilisateurs de MySQL souhaitent afficher le logo du dauphin MySQL AB sur leur sites web, leur livres ou leurs produits. Nous encourageons ces actes, tant qu'on part du principe que le mot MySQL et le logo du dauphin MySQL sont des marques déposées par MySQL AB et ne doivent être utilisés que dans les conditions décrites à la page suivante : . 1.4.4.1 Le logo original de MySQL Le dauphin MySQL a été conçu par l'agence de publicité finlandaise Priority, en 2001. Le dauphin a été choisi en tant que symbole représentatif de MySQL , car c'est un animal intelligent, rapide et élancé, qui parcourt sans effort l'océan des données. Nous aimons aussi les dauphins. Le logo original de MySQL ne peut être utilisé que par les représentants de MySQL AB et par ceux qui ont un accord signé leur permettant de le faire. 1.4.4 Logos MySQL AB et marque déposée 16 Manuel MySQL 4.1.x ? Version Française 1.4.4.2 Logos MySQL qui peuvent être utilisés dans autorisation préalable Nous avons conçu un jeu de logos qui peuvent être utilisés sous conditions , et qui peuvent être web tiers sans autorisation écrite de MySQL AB . L'utilisation de ces logos n'est pas inconditionnelle, mais, comme leur nom l'implique, sujette à notre politique de marque de commerce qui est aussi disponible sur notre site web. Il est recommandé de lire ce document avant d'utiliser les logos sur votre site web. En bref, les pré?requis sont : Utilisez le logo que vous souhaitez tel que présenté sur le site web . • Vous pouvez l'étendre ou le réduire suivant vos besoins, mais ne modifier ni les couleurs, ni le design, ni le graphisme en aucune façon. Faîtes en sorte qu'il soit évident que vous, et non pas • MySQL AB , êtes le créateur de ce site, qui arbore les couleurs de MySQL . N'utilisez pas le logo d'une façon qui porte préjudice à • MySQL AB ou aux valeurs de MySQL AB . Nous nous réservons le droit de retirer notre autorisation d'utiliser le logo de MySQL AB . Si vous utilisez le logo sur un site web, rendez?le clickable, avec un lien sur le site • Si vous utilisez le serveur web • MySQL sous licence GPL dans votre application, votre application doit porter la mention Open Source et être capable de se connecter à un serveur MySQL . vous conviendraient. 1.4.4.3 Quand avez vous besoin d'autorisation pour utiliser le logo MySQL? Dans les cas suivants vous devez obtenir une permission écrite de MySQL AB avant d'utiliser les logos MySQL : Lorsque vous affichez un des logos • MySQL AB n'importe où, en dehors de votre site web. Lorsque vous affichez l'un des logos • MySQL AB hormis les logos à utilisation conditionnée mentionnés auparavant sur le site web, ou ailleurs En dehors des raisons commerciales et légales, nous nous devons de suivre l'utilisation du logo MySQL sur les produits, livres, etc. Nous demanderons une compensation pour l'affichage des logos MySQL AB sur les produits, car nous pensons qu'il est raisonnable qu'une partie des revenus ainsi générés servent à poursuivre le développement de la base de données MySQL . 1.4.4.4 Logos de partenariat MySQL AB Le logo partenariat MySQL ne doit être utilisé que par les compagnies et les personnes ayant un partenariat écrit avec MySQL AB Le partenariat inclut une certification en tant que consultant ou professeur MySQL . Merci de visiter Partnering . 1.4.4.2 Logos MySQL qui peuvent être utilisés dans autorisation préalable 17 Manuel MySQL 4.1.x ? Version Française 1.4.4.5 Utiliser le nom MySQL sur des documents imprimés ou des présentations MySQL AB apprécie les références à la base MySQL . Il faut toutefois garder à l'esprit que MySQL est une marque commerciale, propriété de MySQL AB . A cause de cela, il faut ajouter au logo le symbole de marque de commerce ( TM ) lors de la première ou de la plus visible utilisation du mot MySQL dans le texte et, là où approprié, établir clairement que MySQL est une marque commerciale de MySQL AB . Reportez?vous à notre politique de marque commerciale à pour plus de détails. 1.4.4.6 Utilisation du nom MySQL dans un nom de société ou de produit L'utilisation du mot MySQL dans le nom d'une compagnie, d'un produit ou d'un nom de domaine Internet est interdite sans une permission écrite de MySQL AB . 1.5 MySQL 4.x In A Nutshell Longtemps promis par MySQL AB et longtemps attendu par nos utilisateurs, le serveur MySQL 4.0 et de nos plus part des nouvelles fonctionnalités du serveur MySQL 4.0 sont adaptées à nos affaires courantes et utilisateurs développant le logiciel de bases de données MySQL en tant que solution pour les tâches critiques et les bases de données à lourdes charges. Les autres nouveautés ciblent les utilisateurs de bases de données intégrées. 1.5.1 Phases de publication La publication du serveur MySQL 4.x se déroule en plusieurs étapes, en commencant par la première version, nommée 4.0.0?alpha, qui contient déjà la plupart des nouvelles fonctionnalités. Des fonctionnalités supplémentaires ont été ajoutées en MySQL 4.0.1, 4.0.2, et ainsi de suite ; MySQL 4.0.3 a été déclarée beta. D'autres fonctionnalités seront ajoutées en MySQL 4.1, destinée à la publication en phase alpha à la fin de 2002. 1.5.2 Utilisation immédiate en production Il est recommandé aux utilisateurs de ne pas passer leurs systèmes en production sous le serveur MySQL 4.x, jusqu'à ce qu'elle soit publiée en phase béta (telle que la 4.0.3 beta). Toutefois, même la version initiale a passé avec succès notre batterie de tests, sans aucune erreur sur aucune plate?forme que nous avons utilisé. Etant donné le grand nombre de fonctionalités supplémentaires, nous recommandons le serveur MySQL, même en version alpha, pour les phases de développement. L'agenda de publication du serveur MySQL 4.x est tel qu'il atteindra un état stable avant les applications qui sont aujourd'hui en phase de développement. 1.5.3 MySQL intégré libmysqld rend le serveur MySQL parfaitement utilisable pour une vaste gamme d'applications. En utilisant la librairie intégrée MySQL, vous pouvez intégrer le serveur MySQL dans diverses applications et appareils électroniques, où l'utilisateur final n'aura aucune visibilité sur les systèmes sous?jacents. Intégrer MySQL est idéal pour les applications de back office dans les systèmes Internet, les bornes publiques, les serveurs web hautes performances, les bases de données 1.4.4.5 Utiliser le nom MySQL sur des documents imprimés ou des présentations 18 Manuel MySQL 4.1.x ? Version Française distribuées sur CD ROM, etc. De nombreux utilisateurs de libmysqld profitent de la double licence de MySQL. Pour ceux qui ne souhaitent pas être liés par la licence GPL, le logiciel est aussi disponible avec une licence commerciale. La librairie intégrée MySQL utilise la même interface que le client normal, ce qui la rend pratique et facile à utiliser. libmysqld, la librairie du serveur MySQL embarqué . 1.5.4 Autres nouveautés de MySQL 4.0 La version 4.0 améliore la • vitesse du serveur MySQL dans de nombreuses situations, comme les INSERT de masse, les recherches sur les index compactés, la création d'index en texte plein, ainsi que sur les dénombrements de lignes distinctes. Le gestionnaire de table • InnoDB est proposé comme gestionnaire standard du serveur MySQL, incluant le support complet des transactions et le verrouillage des lignes . Nos utilisateurs allemands, autrichiens et suisses noteront que leur jeu de caractères, le • latin1_de , gère correctement les tri en allemand , plaçant les umlauts allemands dans le même ordre que celui de l'annuaire. La migration depuis les autres systèmes de bases de données vers MySQL ont été • simplifiés pour inclure TRUNCATE TABLE (comme sous Oracle) et IDENTITY comme synonymes pour les clés automatiquement incrémentés (comme sous Sybase). De nombreux utilisateurs apprécieront que MySQL supporte désormais la commande UNION , une fonctionnalité longtemps attendue. En mettant en place de nouvelles fonctionnalités pour les utilisateurs, nous n'avons pas • oublié la communauté de nos utilisateurs fidèles. Nous avons désormais des commandes DELETE et UPDATE multi tables. En ajoutant le support des liens symboliques à MyISAM au niveau des tables (et non pas au niveau des bases, comme avant), ainsi qu'en supportant les liens symboliques par défaut sous Windows, nous espérons montrer que nous prenons à coeur les demandes d'améliorations. Les fonctions comme SQL_CALC_FOUND_ROWS et FOUND_ROWS() permettent de savoir combien de lignes une requête sans clause LIMIT aurait retourné. 1.5.5 Fonctionnalités à venir de MySQL 4.x Vous pouvez anticiper les fonctionnalités suivantes dans les prochaines versions de MySQL Server 4.x : Les utilisateurs exigeants du serveur MySQL apprécieront les nouveautés de notre système • de réplication et des sauvegardes en ligne, à chaud. Les versions suivantes incluront aussi la replication garantie ; déjà en place dans la version 4.0, la commande LOAD DATA FROM MASTER évoluera rapidement vers une configuration automatique. Les sauvegardes en ligne rendront simples les réplications, sans interrompre le serveur principal, et auront peu d'impact sur les performances des systèmes sous forte charge. Une fonctionnalité pratique pour les administrateurs de bases données sera la possibilité de • modifier les paramètres de démarrage de mysqld sans interrompre le serveur. Les nouvelles fonctionnalités de recherche en texte plein ( • FULLTEXT ) du serveur MySQL 4.0 permettent l'indexation de grandes quantités de texte avec des logiques binaires ou humaines de recherche. Les utilisateurs peuvent paramétrer la taille de mot minimale et définir leur propre liste de mots ignorés. C'est tout une nouvelle gamme d'applications qui seront possibles avec le serveur MySQL. De nombreuses applications exploitant la base en lecture bénéficieront d'une augmentation • de vitesse grâce à la réécriture du cache des clés. 1.5.4 Autres nouveautés de MySQL 4.0 19 Manuel MySQL 4.1.x ? Version Française De nombreux développeurs apprécieront la nouvelle commande • d'aide MySQL dans le client. 1.5.6 MySQL 4.1 : Les nouvelles fonctionnalités Le serveur MySQL 4.0 définit les bases des nouvelles fonctionnalités des versions 4.1 et plus de MySQL, comme les requêtes imbriquées (4.1), les procédures stockées (5.0), et les règles d'intégrité des clefs étrangères pour les tables au format MyISAM (5.0), ce qui forme la partie haute de la liste de souhaits de plusieurs de nos utilisateurs. Après ces additions, la critique devra être plus imaginative pour trouver les déficiences du système de gestion de bases de données MySQL. Déjà connu depuis longtemps pour sa stabilité, sa rapidité et sa facilité de prise en main, MySQL remplira pleinement les attentes de tous les acheteurs exigeants. 1.6 Sources d'informations MySQL 1.6.1 Portails MySQL Les portails MySQLtrouver des partenaires MySQL AB , ainsi que des livres ou des solutions MySQL . Les solutions sont classées et rangées en ordre d'importance, pour que vous puissiez facilement trouver les vous enregistrant en tant qu'utilisateur, vous gagnez la possibilité de commenter et noter les solutions du portail. Vous recevrez aussi des lettres d'actualité suivant votre profil d'utilisateur, qui est modifiable à tout moment. Les catégories actuelles du portail MySQL incluent : Partenaires Trouver des partenaires MySQL AB dans le monde. Livres Commenter, voter et acheter des livres concernant MySQL . Développement Différents liens vers des sites web qui utilisent le serveur MySQL dans différentes situations, avec une description pour chaque site. Ces informations vous donneront une idée de qui utilise MySQL et comment le serveur MySQL peut vous satisfaire. Parlez?nous de votre site ou de vos réussites ! Visitez . Logiciels Trouver, acheter et télécharger différentes applications et compléments à utiliser avec le serveur MySQL . Distributions Depuis ce site, vous pouvez trouver les différentes distributions Linux et d'autres logiciels qui contiennent MySQL . Fournisseurs de services Les entreprises qui proposent des services autour de MySQL . 1.5.6 MySQL 4.1 : Les nouvelles fonctionnalités 20 Manuel MySQL 4.1.x ? Version Française 1.6.2 Listes de diffusion MySQL Cette section vous présente les listes de diffusions MySQL, et donne des conseils quand à leur utilisation. En vous inscrivant à une des listes de diffusion, vous recevrez les messages que les autres auront envoyé, et vous pourrez envoyer vos propres questions et réponses. 1.6.2.1 Les listes de diffusions de MySQL Pour vous inscrire à la liste de diffusion principale de MySQL, envoyez un courrier électronique à d'où vous envoyez votre message est importante. La ligne de sujet et le corps sont ignorés. Si votre adresse de réponse n'est pas valide, vous pouvez spécifier votre adresse explicitement, en ajoutant un tiret après le mot subscribe ou unsubscribe, suivi de votre adresse dans laquelle vous aurez remplacé le caractère '@' par '=' . Par exemple, pour inscrire l'adresse [email protected] , envoyez un message à mysql?subscribe? . sont géré automatiquement par le robot ezmlm. Des informations sur ezmlm sont disponibles à . Toutefois, n'envoyez pas de mail d'inscription ou de désinscription à à des milliers d'utilisateurs.Votre site local peut avoir beaucoup d'inscrits à la liste ce que les messages envoyés par à votre site local soit propagés par votre serveur local. Dans ce cas, contactez votre administrateur local pour être ajouté ou retiré de la liste. Si vous voulez que le trafic de cette liste soit envoyé à une autre boîte aux lettres de votre client mail, installez un filtre basé sur les entêtes du message. Vous pouvez utiliser notamment les entêtes List?ID: et Delivered?To: pour identifier les messages de la liste. Les listes de diffusion MySQL suivantes existent : Ceci est la liste de diffusion d'annonces des versions de MySQL et des programmes compagnons. C'est une liste à faible volume, et tout utilisateur doit y être inscrit. La liste de diffusion principale pour les discussions générales sur MySQL. Notez que certains sujets sont à diriger sur les listes spécialisées. Si vous postez sur la mauvaise liste, vous pourriez ne pas avoir avoir de réponse. La liste mysql en format journalier. Cela signifie que vous recevrez tous les messages de la journée en un seul gros email. Sur cette liste, vous ne devriez envoyez que des bogues complets, reproductibles ainsi que le rapport qui va avec, en utilisant le script mysqlbug (si vous utilisez Windows, il faut aussi inclure la description du système d'exploitation et la version de MySQL MySQL). De préférence, vous devriez tester le problème avec la dernière version stable ou de développement du serveur MySQL avant de l'envoyer. Tout le monde doit être capable de reproduire le bogue simplement avec la ligne de commande mysql test < script avec le cas de test inclus. Tous les bogues doivent être posté sur la liste, et seront corrigés ou documentés dans la prochaine 1.6.2 Listes de diffusion MySQL 21 Manuel MySQL 4.1.x ? Version Française version de MySQL!. Si les modifications sont trop petites, nous publierons aussi un patch qui résout le problème. La liste bugs en format journalier. Une liste pour ceux qui travaillent sur le code MySQL. Sur cette liste, vous pouvez discuter du développement de MySQL et envoyer des patchs. La liste internals en format journalier. Une liste pour ceux qui utilisent MySQL et java. Elle concerne majoritairement les pilotes JDBC. La liste java en format journalier. Une liste pour ceux qui utilisent MySQL sur les systèmes d'exploitation de Microsoft, tels que Windows 9x/Me/NT/2000/XP. La liste win32 en format journalier. Une liste pour tout ce qui concerne la connexion à MySQL avec le pilote ODBC. La liste myodbc en format journalier. Une liste pour tout ce qui concerne le client graphique MySQL Control Center . La liste mysqlcc en format journalier. Une liste pour tout ce qui concerne la programmation avec les API C++ de MySQL. La liste plusplus en format journalier. Une liste pour tout ce qui concerne Perl et le support du module msql?mysql?modules. La liste msql?mysql?modules en format journalier. Vous pouvez vous inscrire ou vous désinscrire de toutes les listes en même temps de la même façon que nous l'avons décrit au début. Dans votre message d'inscription, utilisez simplement le nom de liste approprié. Par exemple, pour vous inscrire à la liste myodbc , envoyez un message à pas obtenir d'informations sur la liste de diffusion, une de vos options est de prendre un contrat de support auprès de MySQL AB, qui vous donnera un contact direct avec les développeurs MySQL. Support offert par MySQL AB . Le tableau suivant présente diverses autres listes de diffusions consacrée à MySQL, dans d'autres langues que l'anglais. Notez que ces ressources ne sont pas gérées par MySQL AB, ce qui fait que nous ne pouvons pas garantir leur qualité. Envoyez un message à subscribe mysql [email protected]?mail.address . Envoyez un message à subscribe mysql?de [email protected]?mail.address . Vous 1.6.2 Listes de diffusion MySQL 22 Manuel MySQL 4.1.x ? Version Française aurez plus d'informations sur cette liste à . Envoyez un message à subscribe mysql?br [email protected]?mail.address . Envoyez un message à subscribe mysql [email protected]?mail.address . 1.6.2.2 Poser des questions ou rapporter un bogue Avant de soumettre un rapport de bogue ou une question, commencez par ces étapes simples : Etudiez le manuel MySQL et faites y une recherche à : Nous • nous efforçons de mettre à jour le manuel fréquemment, en y ajoutant les solutions aux ) est particulièrement pratique car il est possible qu'une nouvelle version de MySQL propose déjà la solution à votre problème. Recherchez dans les archives des listes de diffusion de MySQL : • Vous pouvez aussi utiliser l'URL pour rechercher dans toutes • les pages web (y compris le manuel) qui sont situés à . Si vous n'arrivez pas à trouver une réponse à votre question dans le manuel ou dans les archives, vérifiez auprès de votre expert MySQL local. Si vous ne trouvez toujours pas la réponse, vous pouvez lire la section suivante et envoyer un mail bien préparé à . 1.6.2.3 Comment rapporter un bogue ou un problème Ecrire un bon rapport de bogue requiert de la patience, et le faire dès le début épargnera votre temps et le notre. Un bon rapport de bogue qui contient un cas de test complet améliorera vos chances de voir le bogue corrigé à la prochaine version. Cette section vous aidera à écrire correctement un rapport de bogue, de manière à ce que vous ne gaspillez pas votre temps à faire des textes qui ne nous aideront que peu ou pas. Nous vous recommandons d'utiliser le script mysqlbug pour générer un rapport de bogue (ou rapporter un problème), dans la mesure du possible. mysqlbug est situé dans le dossier scripts de la distribution, ou, pour les distributions binaire, dans le dossier bin du dossier d'installation de MySQL. Si vous êtes dans l'incapacité d'utiliser mysqlbug , vous devez tout de même inclure toutes les informations nécessaires listées dans cette section. Le script mysqlbug vous aide à générer un rapport en déterminant automatiquement les informations suivantes, mais si quelque chose d'important lui échappe, ajoutez le dans votre message! Lisez cette section avec attention, et assurez vous que toutes les informations décrites ici sont présentes dans votre message. Pour rapporter un bogue ou un problème, il faut le soumettre à poster qu'un rapport complet de bogue regénérable, avec le script mysqlbug . Si vous travaillez sous Windows, vous devez ajouter une description de votre système d'exploitation et de votre version de MySQL. De préférence, il vaut mieux utiliser la dernière version de MySQL, version stable ou de développement, avant d'envoyer un message. Tout le monde doit être capable de reproduire le bogue en utilisant simplement la ligne de commande `` mysql test < script '', avec le cas de bogue fourni, ou bien d'exécuter un script shell ou Perl qui est inclut dans le rapport de bogue. Tous les bogues postés sur la liste bogues seront corrigés ou documentés dans la prochaine version de MySQL. Si seul de petits changements sont nécessaires, nous publierons aussi un vous avez découvert un problème de sécurité sensible dans MySQL, il faut 1.6.2.2 Poser des questions ou rapporter un bogue 23 Manuel MySQL 4.1.x ? Version Française envoyer un email à . Sachez qu'il est toujours possible de répondre à un message qui contient trop d'informations, alors qu'il est impossible de répondre à um message qui contient trop peu d'informations. Souvent, il est facile d'omettre des faits parce que vous pensez connaître la cause du problème et supposez que ces détails ne sont pas importants. Un bon principe à suivre est : si vous avez un doute à propos de quelque chose, faites nous en part. Il est bien plus rapide et bien moins frustrant d'écrire quelques lignes de plus dans un rapport plutôt que d'être obligé de demander une nouvelle fois et d'attendre une réponse parce que vous avez oublié une partie des informations la première fois. L'erreur la plus commune est de ne pas indiquer le numéro de la version de MySQL qui est utilisé, ou de ne pas indiquer le système d'exploitation que vous utilisez (y compris le numéro de version de ce système d'exploitation). Ce sont des informations de première importance, et dans 99% d4es cas, le rapport de bogue est inutilisable sans ces informations. Souvent, nous recevons des questions telles que ``Pourquoi est ce que cela ne fonctionne pas pour moi?''. Puis nous nous aperçevons que la fonctionnalités en question n'est même pas programmée dans la version de MySQL utilisée, ou que le bogue décrit est déjà corrigé dans une nouvelle version de MySQL. Parfois aussi, les erreurs sont dépendantes des plate?formes. Dans ce cas, il est presque impossible de les corriger sans savoir quel système d'exploitation et quelle version exacte est utilisée. Pensez aussi à fournir des informations concernant votre compilateur, si c'est pertinent. Souvent, les développeurs trouvent des bogues dans les compilateurs, et pensent que c'est liés à MySQL. La plupart des compilateurs sont en constant développement, et s'améliorent de version en version. Pour déterminer si votre problèe dépend de votre compilateur, nous avons besoin de savoir quel compilateur est utilisé. Notez que les problèmes de compilations sont des bogues, et doivent être traités avec un rapport de bogues. Il est particulièrement utile de fournir une bonne description du bogue dans le rapport de bogue. Cela peut être un exemple de ce que vous avez fait qui a conduit au problème, ou une description précise. Les meilleurs rapports sont ceux qui incluent un exemple complet permettant de reproduire le bogue. Faire une batterie de tests lorsque vous faites face à un problème de table corrompue . Si un programme produit un message d'erreur, il est très important d'inclure ce message dans votre rapport. Il est préférable que le message soit le message exact, car il est alors possible de le retrouver en utilisant les archives : même la casse doit être respectée. N'essayez jamais de vous rappeler d'un message d'erreur, mais faites plutôt un copier/coller du message complet dans votre rapport. Si vous avez un problème avec MyODBC, essayez de générer un fichier de trace MyODBC. Reporter les problèmes rencontrés avec MyODBC . Pensez aussi que de nombreux personnes qui liront votre rapport utilisent un formatage de 80 colonnes. Lorsque vous générez votre rapport et vos exemples avec l'outil de ligne de commande, utilisez une largeur de 80 colonnes. Utilisez l'option ??vertical (ou la fin de commande \G ) pour les affichages qui excèdent une telle largeur (par exemple, avec la commande EXPLAIN SELECT ; voyez l'exemple un peu plus tard dans cette section. Voici un pense?bête des informations à fournir dans votre rapport : Le numéro de version de la distribution de MySQL que vous utilisez (par exemple MySQL • Version 3.22.22). Vous pouvez connaitre cette version en excutant la commande mysqladmin version . mysqladmin est situé dans le dossier bin de votre distribution MySQL. 1.6.2.2 Poser des questions ou rapporter un bogue 24 Manuel MySQL 4.1.x ? Version Française Le fabricant et le modèle de votre serveur. • Le système d'exploitation et la version que vous utilisez. Pour la plupart des systèmes • d'exploitation, vous pouvez obtenir cette information en utilisant la commande Unix command uname ?a . Parfois, la quantité de mémoire (physique et virtuelle) est important. Si vous hésitez, ajoutez • la. Si vous utilisez une version de MySQL sous forme de source, le nom et le numéro de • version du compilateur sont nécessaires. Si vous utilisez une version exécutable, le nom de la distribution est important. Si le problème intervient lors de la compilation, incluez le message d'erreur exact et les • quelques lignes de contexte autour du code en question dans le fichier où il est situé. Si • mysqld s'est arrété, il est recommandé d'inclure la requête qui a mené à cet arrêt de mysqld . Vous pouvez généralement la trouver en exécutant mysqld en ayant activé les Si une table ou une base sont liés au problème ajoutez le résultat de la commande • mysqldump ??no?data db_name tbl_name1 tbl_name2 ... . C'est très simple à faire, et c'est un moyen efficace d'obtenir un descriptif de table, qui nous permettra de recrééer une situation comparable à la votre. Pour les problèmes liés à la vitesse, ou des problèmes liés à la commande • SELECT , pensez à inclure le résultat de la commande EXPLAIN SELECT ... , et au moins le nombre de ligne que la commande SELECT doit produire. Vous devriez aussi inclure le résultat de la commande SHOW CREATE TABLE table_name pour chaque table impliquée. Plus vous nous fournirez d'informations, plus nous aurons de chance de vous aider efficacement. Par exemple, voici un excellent rapport de bogue (posté avec le script mysqlbug , et effectivement rédigé en ANGLAIS) :Exemple réalisé avec mysql en ligne de commande (notez l'utilisation de la fin de commande \G , pour les résultats qui pourraient dépasser les 80 colonnes de large) : mysql> SHOW VARIABLES; mysql> SHOW COLUMNS FROM ...\G <output from SHOW COLUMNS> mysql> EXPLAIN SELECT ...\G <output from EXPLAIN> mysql> FLUSH STATUS; mysql> SELECT ...; <A short version of the output from SELECT, including the time taken to run the query> mysql> SHOW STATUS; <output from SHOW STATUS> Si un bogue ou un problème survient lors de l'exécution de • mysqld , essayez de fournir un script qui reproduit l'anomalie. Ce script doit inclure tous les fichiers sources nécessaires. Plus votre script reproduira fidèlement votre situation, le mieux ce sera. Si vous pouvez priorité!Si vous ne pouvez pas fournir de script, fournissez tout au moins le résultat de la commande mysqladmin variables extended?status processlist dans votre mail pour fournir des informations sur les performances de votre système. Si vous ne pouvez pas reproduire votre situation en quelques lignes, ou si une table de test • est trop grosse à être envoyée par mail (plus de 10 lignes), exportez vos tables sous forme de fichier avec la commande mysqldump et créez un fichier README qui décrit votre problèéez une archive compressée de votre fichier en utilisant tar et gzip ou zip , et placez le via ftpSi vous pensez que le serveur MySQL fournit des résultats étranges pour une requête, • incluez non seulement le résultat, mais aussi votre propre explication sur ce que le résultat devrait être, et un diagnostic de la situation. Lorsque vous donnez un exemple du problème, il est mieux d'utiliser des noms de variables • et de tables qui existent dans votre situation, plutôt que d'inventer de nouveaux noms. Le 1.6.2.2 Poser des questions ou rapporter un bogue 25 Manuel MySQL 4.1.x ? Version Française problème peut être lié au noms des variables ou tables que vous utilisez! Ces cas sont rares, mais il vaut mieux éviter les ambiguités. Après tout, il est plus facile pour vous de fournir un exemple qui utilise votre situation réelle, et c'est bien mieux pour nous aussi. Si vous avez des données que vous ne souhaitez pas divulguer, vous pouvez utiliser le site ftples données sont vraiment ultra secrètes et que vous ne souhaitez même pas nous les montrer, alors utilisez d'autres noms et données pour votre rapport, mais considérez cela comme un dernier recours. Incluez toutes les options utilisées, si possible. Par exemple, indiquez les options que vous • utilisez lors du démarrage de mysqld , et celle que vous utilisez avec les programmes comme mysqld et mysql , et le script configure , qui sont souvent primordiaux et pertinents. Ce n'est jamais une mauvaise idée que de les inclure. Si vous utilisez des modules, comme Perl ou PHP, incluez aussi les versions de ces logiciels. Si votre question porte sur le système de droits, incluez le résultat de l'utilitaire • mysqlaccess , celui de mysqladmin reload et tous les messages d'erreurs que vous obtenez lors de la connexion. Lorsque vous testez votre système de droits, il faut commencer par utiliser la commande mysqladmin reload version et de vous connecter avec le proramme qui vous pose problème. mysqlaccess est situé dans le dossier bin de votre installation de MySQL. Si vous avez un patch pour un bogue, c'est une excellente chose. Mais ne supposez pas • que nous n'avons besoin que du patch, ou même que nous allons l'utiliser, si vous ne fournissez pas les informations nécessaires pour le tester. Nous pourrions trouver des problèmes générés par votre patch, ou bien nous pourrions ne pas le comprendre du tout. Si tel est le cas, nous ne l'utiliserons nous ne pouvons pas vérifier exactement ce pourquoi est fait le patch, nous ne l'utiliserons pas. Les cas de tests seront utiles ici. Montrez nous que votre patch va générer toutes les situations qui pourraient arriver. Si nous trouvons un cas limite dans lequel votre patche ne fonctionne pas, même si il est rare, il risque d'être inutile. Les diagnostics sur la nature du bogue, la raison de son déclenchement ou les effets de • bords sont généralement faux. Même l'équipe MySQL ne peut diagnostiquer sans commencer par utiliser un débogueur pour déterminer la cause véritable. Indiquez dans votre mail que vous avez vérifié le manuel de référence et les archives de • courrier, de façon à avoir épuiser les solutions que d'autres avant vous auraient pu trouver. Si vous obtenez un message • parse error , vérifiez votre syntaxe avec attention. Si vous ne pouvez rien y trouvez à redire, il est très probable que votre version de MySQL ne supporte pas encore cette fonctionnalité que vous essayez d'utiliser. Si vous utilisez la syntaxe que vous utilisez, c'est que MySQL ne supporte pas votre syntaxe. Dans ce cas, vos seules options sont d'implémenter vous même la syntaxe ou d'envoyez un message à vous utilisez, mais que vous avez une ancienne version du serveur MySQL, il est recommandé de vérifier l'historique d'évolution de MySQL pour savoir quand la syntaxe a été supportée. Dans ce cas, vous avez l'option de mettre à jour votre MySQL avec une Si vous avez un problème tel que vos données semblent corrompues, ou que vous recevez • constamment des errors lors d'accès à une table, vous devriez commener par essayer de réparer votre table avec l'utilitaire de ligne de commande myisamchk ou les syntaxes SQL CHECK TABLE et REPAIR TABLESi vous avez des tables qui se corrompent facilement, il vous faut essayer de trouver quand • et pourquoi cela arrive. Dans ce cas, le fichier mysql?data?directory/'hostname'.err peut contenir des informations pertinentes qu'il est bon d'inclure dans votre rapport de bogues. Normalement, mysqld ne doit jamais corrompre une table si il a été interrompu au milieur d'une mise à jour. Si vous pouvez trouvez la cause de l'arrêt de mysqld , il est bien plus facile pour nous de fournir un 1.6.2.2 Poser des questions ou rapporter un bogue 26 Manuel MySQL 4.1.x ? Version Française Si possible, téléchargez et installez la version la plus récente du serveur MySQL, et vérifiez • si cela résoud votre problème. Toutes les versions de MySQL sont testées à fond, et doivent fonctionner sans problème. Nous croyons à la compatibilité ascendante, et vous devriez pouvoir passer d'une version à l'autre facilement. Quelle version de MySQL utiliser ? . Si vous disposez de l'accès au support client, contactez aussi le support client à Pour des informations sur les rapports de bogues avec MyODBCproblèmes rencontrés avec MySQL ODBC . Pour des solutions aux problèmes les plus courants, voyez Problèmes . Lorsque des solutions vous sont envoyées individuellement et non pas à la liste, il est considéré comme bien vu de rassembler ces réponses et d'en envoyer un résumé sur le liste, de manière à ce que les autres en profitent aussi. 1.6.2.4 Conseils pour répondre sur la liste de diffusion Si vous pensez que votre réponse peut avoir un intérêt général, vous pouvez envisager de l'envoyer sur la liste de diffusion, plutôt que de faire une réponse personnelle aux demandeurs. Essayez de rendre votre réponse aussi générale que possible, pour que suffisamment d'autres personnes puissent en profiter. Lorsque vous envoyez une réponse sur la liste, assurez vous qu'elle ne représente pas un doublon d'une réponse précédente. Essayez de résumer l'essentiel de la question dans votre réponse. Ne vous croyez pas obligé de citer tout le message original. Attention : n'envoyez pas de message avec le mode HTML activé ! De nombreux utilisateurs ne lisent pas leurs emails avec un navigateur. 1.7 Quels standards respecte MySQL? Cette section présente comment MySQL interprète les standards SQL ANSI. Le serveur MySQL dispose de nombreuses extensions au standard ANSI et vous trouverez ici comment les exploiter. Vous trouvrez aussi des informations sur les fonctionnalités manquantes de MySQL et comment y trouver des palliatifs. Notre but n'est pas, sans une bonne raison, de restreindre les capacités de MySQL à un usage unique. Même si nous n'avons pas les ressources de développement à consacrer à toutes les opportunités, nous sommes toujours interessés et prêts à aider ceux qui utilisent MySQL dans de nouveaux domaines. Un de nos objectifs avec ce produit est de tendre à la compatibilité ANSI 99, mais sans sacrifier la vitesse ou la robustesse. Nous ne reculons pas devant l'ajout de nouvelle fonctionnalités au langage SQL, ou le support de fonctionnalités hors SQL, qui améliorent le confort d'utilisation de MySQL. La nouvelle interface de gestionnaires HANDLER de MySQL 4.0 est un exemple de cette stratégie. Syntaxe des HANDLER .) Nous continuons de supporter les bases transactionnelles et non transactionnelles pour combler les besoins des sites web ou des applications à fort besoin d'archivage, ainsi que les applications critiques à très haute disponibilité. 1.6.2.4 Conseils pour répondre sur la liste de diffusion 27 Manuel MySQL 4.1.x ? Version Française Le serveur MySQL a été conçu pour travailler avec des bases de taille moyenne (de 10 à 100 millions de lignes, ou des tables de 100 Mo) sur des systèmes de petite taille. Nous continuons d'améliorer MySQL pour qu'il fonctionne avec des bases gigantesques (tera octets), tout en conservant la possibilité de compiler une version réduite de MySQL pour qu'il fonctionne sur des appareils embarqués ou nomades. L'architecture compacte de MySQL rend possible le support de ces applications si différentes, sans aucun conflit dans les sources. Nous n'étudions pas le support du temps réel ou des bases de données en grappe (même si vous pouvez dores et déjà réaliser de nombreuses applications avec les services de réplication). Nous ne croyons pas au support natif du XML en base, mais nous allons faire en sorte d'ajouter le support XML que réclame nos clients du coté client. Nous pensons qu'il est préférable de conserver le serveur central aussi ``simple et efficace'' que possible, et développer les librairies qui gèrent la complexité du coté client. Cela fait partie de la stratégie que nous avons mentionné plus tôt, pour ne sacrifier ni la vitesse, ni la robustesse du serveur. 1.7.1 Quels standards suit MySQL ? SQL92, niveau de base. ODBC niveau 0?3.51. Nous nous dirigeons vers le support complet du standard ANSI SQL99, mais sans aucune concession sur la vitesse ou la qualité du code. 1.7.2 Exécuter MySQL en mode ANSI Si vous démarrez mysqld avec l'option ??ansi , les comportements suivants du serveurs MySQL changent : || • devient l'opérateur de concaténation de chaîne, et non pas l'opérateur binaire OR . Vous pouvez ajouter des espaces entre le nom d'une fonction et la parenthèse ouvrante sur • les arguments : '(' . Cela impose le traitement des noms de fonctions comme des mots réservés. '"' • devient le caractère de protection des identifiants (comme le caractère '`' de MySQL) et n'est plus un caractère de limite de chaîne. REAL • est synonyme de FLOAT au lieu d'être synonyme de DOUBLE . Le niveau d'isolation par défaut des transactions est • SERIALIZABLE . Syntaxe de SET TRANSACTION . Ceci revient à utiliser les options suivantes : ??sql?mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY . 1.7.3 Extensions de MySQL à la norme ANSI SQL92 Le serveur MySQL inclut des extensions que vous ne trouverez probablement pas dans les autres bases de données. Soyez prévenus que si vous les utilisez, votre code ne sera probablement pas portable sur d'autres serveurs SQL. Dans certains cas, vous pouvez écrire du code qui inclut des spécificités de MySQL, mais qui restent portables, en les incluant dans des commentaires de la forme /*! ... */ . Dans ce cas, le serveur MySQL va analyser la chaîne et exécuter le code à l'intérieur de ces commentaires comme une commande normale, mais d'autres serveurs ignoreront ces commentaires. Par exemple : 1.7.1 Quels standards suit MySQL ? 28 Manuel MySQL 4.1.x ? Version Française SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ... Si vous ajoutez le numéro de version après le point d'exclamation '!' , la syntaxe sera exécutée uniquement si la version du serveur MySQL est égale ou plus récente que le numéro de version utilisé. CREATE /*!32302 TEMPORARY */ TABLE t (a int); Cela signifie que si vous avez la version 3.23.02 ou plus récente, le serveur MySQL va utiliser le mot réservé TEMPORARY .Voici une liste des apports spécifiques de MySQL : Les types de colonnes • MEDIUMINT , SET , ENUM et les types BLOB et TEXT . Les attributs de champs • AUTO_INCREMENT , BINARY , NULL , UNSIGNED et ZEROFILL . Toutes les comparaisons de chaînes sont insensibles à la casse par défaut, et l'ordre de tri • est déterminé par le jeu de caractères courant (ISO?8859?1 Latin1 par défaut). Si vous en souhaitez un autre, il faut déclarer les colonnes avec l'attribut BINARY ou utiliser l'opérateur BINARY pour forcer les comparaisons à prendre en compte la casse, en fonction du jeu de caractères utilisé sur l'hôte du serveur MySQL. le serveur MySQL fait correspondre à chaque base un dossier dans le système de fichiers, • et à chaque table, il fait correspondre un fichier, placé dans le dossier de base. Ceci a quelques conséquences : Les noms des bases de données et des tables sont sensibles à la casse sur les ? systèmes d'exploitation qui ont des systèmes de fichiers sensibles à la casse Les bases de données, les tables, les index, les colonnes et les alias peuvent ? commencer par un chiffre (mais ne peuvent pas être constitués uniquement de chiffres). Vous pouvez utiliser les commandes systèmes standard pour sauver, renommer, ? déplacer, effacer et copier des tables. Par exemple, pour renommer une table, il suffit de renommer les fichiers .MYD , .MYI et .frm et de leur donner un nouveau nom. Dans une requête SQL, vous pouvez accéder à des tables situées dans différentes bases • de données, avec la syntaxe db_name.tbl_name . Certains serveurs SQL fournissent la même fonctionnalité, mais l'appellent un User space . Le serveur MySQL ne supporte par les espaces de nom de tables, comme dans : create table my_tablespace . LIKE • est possible avec des colonnes numériques. Utilisez • INTO OUTFILE et STRAIGHT_JOIN dans les requêtes SELECT . Syntaxe des L'option • SQL_SMALL_RESULT de la commande SELECT . La commande • EXPLAIN SELECT pour avoir le détail des jointures de tables. L'utilisation de noms d'index, de préfixes d'index, et l'utilisation des mots?clés • INDEX or KEY dans une commande de création de table CREATE TABLE . Syntaxe de CREATE TABLE . L'utilisation des clauses • TEMPORARY et IF NOT EXISTS avec CREATE TABLE . L'utilisation de • COUNT(DISTINCT list) où list contient plus d'un élément. L'utilisation de • CHANGE col_name , DROP col_name ou DROP INDEX , IGNORE ou RENAME dans une commande ALTER TABLEL'utilisation de • RENAME TABLE . Syntaxe de RENAME TABLE . L'utilisation de multiple • ADD , ALTER , DROP et CHANGE dans les clauses de la commande ALTER TABLE . L'utilisation de • DROP TABLE avec les mots?clés IF EXISTS . Vous pouvez effacer plusieurs tables avec une seule commande • DROP TABLE . La clause • LIMIT de la commande DELETE . 1.7.1 Quels standards suit MySQL ? 29 Manuel MySQL 4.1.x ? Version Française La clause • DELAYED des commandes INSERT et REPLACE . La clause • LOW_PRIORITY des commandes INSERT , REPLACE , DELETE et UPDATE . L'utilisation de la commande • LOAD DATA INFILE . Dans de nombreuses situations, cette syntaxe est compatible avec la commande d'Oracle LOAD DATA INFILELes commandes • ANALYZE TABLE , CHECK TABLE , OPTIMIZE TABLE et REPAIR TABLE . La commande • SHOW . Syntaxe de SHOW . Les chaînes de caractères peuvent être soit délimitées par • '"' , soit par ''' . Pas seulement par ''' . L'utilisation du caractère de protection • '\' . La commande • SET . Syntaxe de SET . Vous n'êtes pas obligé de nommer toutes les colonnes que vous sélectionnez dans la • clause GROUP BY . Cela donne de meilleures performances pour certaines situations spécifiques, mais classiques. Fonctions à utiliser dans les définitions GROUP BY . Vous pouvez spécifier • ASC ou DESC dans la clause GROUP BY . Pour aider les utilisateurs qui viennent d'autres environnements SQL, le serveur MySQL • supporte des alias de nombreuses fonctions. Par exemple, toutes les fonctions de chaînes de caractères supportent simultanément les syntaxes ANSI SQL et ODBC. Le serveur MySQL comprend les opérateurs • || et comme opérateurs logiques OR et AND, comme en langage C. Pour le serveur MySQL, les opérateurs || et OR sont synonymes, ainsi que et AND . En conséquence, MySQL ne supporte pas l'opérateur de concaténation de chaînes ANSI SQL || . Utilisez plutôt la fonction CONCAT() . Comme CONCAT() prend un nombre illimité d'arguments, il est facile de convertir des expressions utilisant || , pour qu'elles fonctionnent sur le serveur MySQL. CREATE DATABASE • et DROP DATABASE . Syntaxe de CREATE DATABASE . L'opérateur • % est synonyme de MOD() . C'est à dire que N % M est équivalent à MOD(N,M) . % est supporté pour les programmeurs C, et pour la compatibilité avec PostgreSQL. Les opérateurs • = , <> , <= , < , >= , > , << , >> , <=> , AND , OR ou LIKE peuvent être utilisés pour les comparaisons de colonnes à gauche de la clause FROM dans les commandes SELECT . Par exemple : mysql> SELECT col1=1 AND col2=2 FROM tbl_name; La fonction • LAST_INSERT_ID() . mysql_insert_id() . Les opérateurs d'expressions régulières étendus • REGEXP et NOT REGEXP . CONCAT() • et CHAR() avec un argument ou plus de deux arguments. Avec le serveur MySQL, ces fonctions peuvent prendre n'importe quel nombre d'arguments. Les fonctions • BIT_COUNT() , CASE , ELT() , FROM_DAYS() , FORMAT() , IF() , PASSWORD() , ENCRYPT() , MD5() , ENCODE() , DECODE() , PERIOD_ADD() , PERIOD_DIFF() , TO_DAYS() et WEEKDAY() . L'utilisation de la fonction • TRIM() pour réduire les chaînes. L'ANSI SQL ne supporte que les suppressions de caractères uniques. • Les fonctions de groupe de la clause GROUP BY STD() , BIT_OR() et BIT_AND() . L'utilisation de • REPLACE à la place de DELETE + INSERT . Syntaxe des REPLACE . Les commandes • FLUSH , RESET et DO . La possibilité de modifier les variables dans les commandes avec l'opérateur • := : SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; 1.7.4 Différences de MySQL avec ANSI SQL92 Nous tâchons de rendre le serveur MySQL compatible avec le standard ANSI SQL, et le standard 1.7.4 Différences de MySQL avec ANSI SQL92 30 Manuel MySQL 4.1.x ? Version Française ODBC SQL, mais dans certains cas, MySQL se comporte différemment. Pour les colonnes de type • VARCHAR , les espaces terminaux sont supprimés lors du Dans certains cas, les colonnes • CHAR sont transformées automatiquement en colonnes VARCHARLes droits d'un utilisateur sur une table ne sont pas supprimés si la table est détruite. Vous • devez explicitement utiliser la commande REVOKE pour supprimer les droits d'un utilisateur NULL AND FALSE • donnera la valeur NULL et non pas FALSE . Nous pensons que dans cette situation, il n'est pas bon d'évaluer de nombreuses conditions supplémentaires. Pour voir la liste des priorités de développement des nouvelles extensions de MySQL, consultez la de ce manuel. MySQL and the future (The TODO) . 1.7.4.1 Sous sélections (Sub SELECT s) Jusqu'à la version 4.0, le serveur MySQL ne prenait en charge que les requêtes imbriquées de la forme INSERT ... SELECT ... et REPLACE ... SELECT ... . Vous pouvez néanmoins utiliser la fonction IN() dans d'autres contextes. Les sous?requêtes sont implémentées dans l'arborescence de développement 4.1. En attendant, vous pourrez dans la plupart des cas réécrire la requête sans sous?requêtes : SELECT * FROM table1 WHERE id IN (SELECT id FROM table2); Ceci peut être réécrit de la façon suivante : SELECT table1.* FROM table1,table2 WHERE ; Les requêtes : SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2); SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 WHERE ); peuvent être réécrites ainsi : SELECT table1.* FROM table1 LEFT JOIN table2 ON WHERE IS NULL; Pour des requêtes plus complexes, vous pouvez généralement créer des tables temporaires contenant les sous?requêtes. Cependant, dans certains cas cette option ne fonctionnera pas. Le cas le plus fréquent se produit avec les instructions DELETE , pour lesquelles le SQL standard ne prend pas en charge les jointures (sauf dans les sous Select). Dans une telle situation, en attendant que les sous?requêtes soient prises en charge par MySQL Server, vous disposez de deux première option consiste à utiliser un langage de programmation procédural (tel que Perl ou PHP) afin de soumettre une requête SELECT pour obtenir les clés primaires des enregistrements à supprimer. On utilise ensuite ces valeurs pour construire l'instruction DELETE ( DELETE FROM ... WHERE ... IN (key1,key2, ...) ). La seconde option consiste à utiliser le SQL interactif pour construire automatiquement un ensemble d'instructions DELETE , grâce à l'extension MySQL CONCAT() (à la place de l'opérateur standard || ). Par exemple : SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", , "'", ';') FROM tab1, tab2 WHERE tab1.col1 = tab2.col2; 1.7.4.1 Sous sélections (Sub SELECT s) 31 Manuel MySQL 4.1.x ? Version Française Vous pouvez placer cette requête dans un fichier script et rediriger son entrée vers l'interpréteur de ligne de commande mysql , tout en ouvrant un canal de communication (pipe) pour diriger sa sortie vers une seconde instance de l'interpréteur : shell> mysql ??skip?column?names mydb < | mysql mydb La version 4.0 de MySQL prend en charge les instructions DELETE sur plusieurs tables pouvant être utilisées afin de supprimer efficacement des lignes à partir d'informations issues d'une table, voire de plusieurs tables en même temps. 1.7.4.2 SELECT INTO TABLE Le serveur MySQL ne supporte pas encore l'extension Oracle SQL : SELECT ... INTO TABLE ... . A la place, le serveur MySQL supporte la syntaxe ANSI SQL INSERT INTO ... SELECT ... , qui revient au même. Syntaxe de INSERT ... SELECT . INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100; Vous pouvez aussi utiliser SELECT INTO OUTFILE... ou CREATE TABLE ... SELECT . 1.7.4.3 Transactions et opérations atomiques Le serveur MySQL support les transactions avec les gestionnaires de tables InnoDB et BDB . Types de tables MySQL . InnoDB dispose aussi de la compatibilité ACID . Toutefois, les tables non transactionnelles de MySQL telles que MyISAM exploitent un autre concept pour assurer l'intégrité des données, appelé `` opérations atomiques ''. Les opérations atomiques disposent d'une bien meilleure protection des données pour des performances également accrues. Comme MySQL supporte les deux méthodes, l'utilisateur est capable de choisir celle qui correspond à ses besoins, suivant qu'il a besoin de vitesse ou de sécurité. Ce choix peut être fait table par table. Comment exploiter les capacités de MySQL pour protéger l'intégrité des données, et comment ces fonctionnalités se comparent?elles avec les méthodes transactionnelles ? En mode transactionnel, si votre application a été écrite en dépendant de l'appel de • ROLLBACK au lieu de COMMIT dans les situations critiques, les transactions sont plus plus pratiques. Les transactions s'assurent que les modifications non achevées ou les activités corrosives ne sont pas archivées dans la base. Le serveur a l'opportunité d'annuler automatiquement l'opération, et votre base de données est serveur MySQL, dans la plupart des cas, vous permet de résoudre les problèmes potentiels en incluant de simples vérifications avant les modifications, et en exécutant des scripts simples pour vérifier l'intégrité de vos bases de données, ainsi que les incohérences, et pour réparer automatiquement les problèmes, ou encore vous alerter si une erreur est identifiée. Notez qu'en utilisant simplement le log de MySQL, ou en utilisant un log supplémentaire, vous pouvez normalement réparer à la perfection toutes les tables, sans aucune perte de données. Souvent, les modifications de données transactionnelles fatales peuvent être réécrites de • manière atomique. En général, tous les problèmes d'intégrité que les transactions résolvent peuvent être corrigés avec la commande LOCK TABLES ou des modifications atomiques, qui assurent que vous n'aurez jamais d'annulation automatique de la base, ce qui est un problème commun des bases transactionnelles. Même un système transactionnel peut perdre des données si le serveur s'arrête. La • différence entre les systèmes repose alors dans ce petit laps de temps où ils peuvent perdre des données. Aucun système n'est sécurisé à 100 %, mais simplement ``suffisament 1.7.4.2 SELECT INTO TABLE 32 Manuel MySQL 4.1.x ? Version Française sécurisé''. Même Oracle, réputé pour être la plus sûre des bases de données transactionnelles, est montré du doigt pour perdre des données dans ces être tranquille avec MySQL, que vous utilisiez les tables transactionnelles ou pas, vous n'avez besoin que de sauvegardes et de logs de modifications. Avec ces deux outils, vous pourrez vous protéger de toutes les situations que vous pourriez rencontrer avec d'autres bases de données transactionnelles. De toute manière, il est bon d'avoir des sauvegardes, indépendamment de la base que vous utilisez. La méthode transactionnelle a ses avantages et ses inconvénients. De nombreux utilisateurs et développeurs d'applications dépendent de la facilité de pallier un problème lorsqu'une annulation semble nécessaire ou presque. Cependant, même si vous êtes néophyte des opérations atomiques, ou plus familier avec les transactions, prenez en considération le gain de vitesse que les tables non transactionnelles offrent. Ces gains vont de 3 a 5 fois la vitesse des tables transactionnelles les plus rapides et les mieux optimisées. Dans des situations où l'intégrité est de la plus grande importance, le serveur MySQL assure une intégrité du niveau des transactions, ou encore mieux avec les tables non transactionnelles. Si vous verrouillez les tables avec LOCK TABLES , toutes les modifications seront bloquées jusqu'à ce que la vérification d'intégrité soit faite (à comparer avec un verrou en écriture), les lectures et insertions sont toujours possibles. Les nouvelles lignes ne seront pas accessibles en lecture tant que le verrou n'aura pas été levé. Avec INSERT DELAYED , vous pouvez faire attendre les insertions dans une pile, jusqu'à ce que les verrous soit levés, sans que le client n'attende cette levée de verrou. Syntaxe des INSERT DELAYED . ``Atomique'', avec le sens que nous lui donnons, n'a rien de magique. Ce terme signifie simplement que vous pouvez être certain que lorsque vous modifiez des données dans une table, aucun autre utilisateur ne peut interférer avec votre opération, et qu'il n'y aura pas d'annulation automatique (ce qui pourrait arriver avec des tables transactionnelles si nous ne sommes pas trop soigneux). Le serveur MySQL garantit aussi qu'il n'y aura pas de lectures erronées. Voici quelques techniques pour travailler avec des tables non transactionnelles : Les boucles qui requièrent les transactions peuvent normalement être implémentées avec la • commande LOCK TABLES , et vous n'avez nul besoin de curseur lorsque vous modifiez des lignes à la volée. Pour éviter d'utiliser l'annulation • ROLLBACK , vous pouvez adopter la stratégie suivante : Utilisez la commande ? LOCK TABLES ... pour verrouiller toutes les tables que vous voulez utiliser. Testez vos conditions. ? Modifiez si tout est correct. ? Utilisez ? UNLOCK TABLES pour libérer vos tables. Ceci est probablement une méthode bien plus rapide que ne le proposent les transactions, avec des annulations ROLLBACK possibles mais pas certaines. La seule situation que ce cas ne prend pas en compte est l'interruption du processus au milieu d'une mise à jour. Dans ce cas, tous les verrous seront levés, mais certaines modifications peuvent ne pas avoir été exécutées. Vous pouvez aussi utiliser des fonctions pour modifier des lignes en une seule opération. • Vous pouvez créer une application très efficace en utilisant cette technique : Modifiez les champs par rapport à leur valeur actuelle. ? Modifiez uniquement les champs que vous avez réellement changé. ? Par exemple, lorsque nous modifions les données d'un client, nous ne modifions que les données du client qui ont changé et nous vérifions uniquement si les données modifiées ou les données qui en dépendent ont changé comparativement aux données originales. Les tests sur les données modifiées sont faits avec la clause WHERE dans la commande UPDATE 1.7.4.2 SELECT INTO TABLE 33 Manuel MySQL 4.1.x ? Version Française . Si la ligne a été modifiée, nous indiquons au client : "Some of the data you have changed has been changed by another user". En français : "certaines données que vous voulez modifier ont été modifiées par un autre utilisateur". Puis nous affichons l'ancienne ligne et la nouvelle ligne, pour laisser l'utilisateur décider quelle version il veut nous conduit à un résultat proche du verrouillage de ligne, mais en fait, c'est bien mieux, car nous ne modifions que les colonnes qui en ont besoin, en utilisant des valeurs relatives. Cela signifie qu'une commande UPDATE typique ressemble à ceci : UPDATE tablename SET pay_back=pay_back+'relative change'; UPDATE customer SET customer_date='current_date', address='new address', phone='new phone', dette=dette+'emprunt' WHERE customer_id=id AND address='old address' AND phone='old phone'; Comme vous pouvez le voir, c'est très efficace, et fonctionne même si un autre client a modifié la valeur pay_back ou dette . Dans de nombreuses situations, les utilisateurs ont souhaité les commandes • ROLLBACK et/ou LOCK TABLES afin de gérer des identifiant uniques pour certaines tables. Ils peuvent être gérés bien plus efficacement en utilisant une colonne de type AUTO_INCREMENT , en corrélation avec la fonction LAST_INSERT_ID() ou la fonction C mysql_insert_id() . mysql_insert_id() . Vous pouvez éviter le verrouillage de ligne. Certaines situations le requièrent vraiment, mais elles sont rares. Les tables InnoDB supportent le verrouillage de ligne. Avec les tables MyISAM, vous pouvez utiliser une colonne de type flag, et faire ceci : UPDATE tbl_name SET row_flag=1 WHERE id=ID; MySQL retournera 1 pour le nombre de lignes affectées si la ligne a été trouvée, car row_flag ne vaut pas déjà 1 dans la ligne originale. Vous pouvez comprendre la requête ci?dessus comme si le serveur MySQL avait utilisé la commande suivante : UPDATE tbl_name SET row_flag=1 WHERE id=ID AND row_flag <> 1; 1.7.4.4 Procédures stockées et triggers Une procédure stockée est une liste de commandes SQL qui peuvent être compilées et stockées sur le serveurs. Une fois que cela est fait, les clients n'ont pas besoin de soumettre à nouveau toute la commande, mais font simplement référence à la procédure stockée. Cela conduit à des performances bien meilleures, car les commandes n'ont pas à être analysées plusieurs fois, et que bien moins d'informations transitent sur le réseau. Vous pouvez aussi élevez le niveau conceptuel de votre application en mettant en place des librairies de fonctions sur le serveur. Un trigger est une procédure stockée qui est activée lorsqu'un événement particulier survient. Par exemple, vous pouvez installer une procédure stockée qui est déclenchée dès qu'une ligne est effacée dans une table d'achat, pour que le client soit automatiquement effacé si tous ses achats sont effacés. La future version du langage sera capable de supporter les procédures stockées. Notre objectif est d'impolémenter les procédures stockées pour la version 5.0 du serveur MySQL. Nous nous 1.7.4.4 Procédures stockées et triggers 34 Manuel MySQL 4.1.x ? Version Française pencherons aussi sur les triggers. 1.7.4.5 Les clés étrangères Notez que les clés en SQL ne sont pas utilisées pour joindre des tables, mais pour assurer l'intégrité référentielle (contraintes de clés étrangères). Si vous voulez obtenir des résultats issus de tables multiples avec une commande SELECT , vous allez joindre les tables comme ceci : SELECT * FROM table1,table2 WHERE = ; tables InnoDBtypes de tables, le serveur mySQL accepte la syntaxe FOREIGN KEY dans la commande CREATE TABLE , mais ne la prend pas en compte. La syntaxe FOREIGN KEY dans la clause ON DELETE ... est principalement utilisée pour des raisons de documentation. Certaines applications ODBC peuvent utiliser cette clause pour produire des conditions WHERE automatiques, mais c'est généralement simple à éviter. FOREIGN KEY est parfois utilisé pour vérifier une contrainte, mais cette vérification n'est pas nécessaire en pratique, si les lignes sont insérées dans la table dans le bon ordre. Avec le serveur MySQL, vous pouvez contourner le problème de l'absence de la clause ON DELETE ... en ajoutant la commande DELETE appropriée dans l'application, lorsque vous effacez une ligne dans une table qui a une clé étrangère. En pratique, cette technique est aussi rapide (et même parfois plus rapide), et bien plus portable que l'utilisation des clés étrangères. Avec le serveur MySQL 4.0, vous pouvez utiliser les commandes d'effacement multi?tables pour effacer des lignes dans plusieurs tables en une seule commande. Syntaxe des DELETE . Dans un futur proche, nous allons étendre l'implémentation de la clause FOREIGN KEY pour que cette information soit stockée dans le fichier de spécification des tables et puisse être lu par mysqldump et ODBC. Dans une étape ultérieure, nous allons implémenter les contraintes de clé étrangère pour les applications qui ne peuvent pas être codées sans. Gardez bien en tête que les clés étrangères sont souvent méconnues, ce qui peut causer de graves problèmes. Même lorsqu'elles sont utilisées correctement, ce n'est pas une solution magique pour les problèmes d'intégrité référentielle, même si cela simplifie parfois les choses. Voici des avantages aux contraintes de clés étrangères : En supposant que les relations soient proprement conçues, les clés étrangères rendent plus • difficile pour un programmeur d'insérer des valeurs incohérentes dans la base. L'utilisation des modifications et effacement en cascade simplifie le code du client. • Les règles de clés étrangères proprement conçues aident à la documentation des relations • entre les tables. Inconvénients : Les erreurs, qui sont faciles à faire durant la conception des relations, peuvent causer des • problèmes graves : par exemple, des règles de contrainte circulaires, ou des combinaisons erronées d'effacement. Une application correctement écrite s'assure d'elle?même de l'intégrité référentielle des • données avant d'exécuter une requête. De ce fait, les vérifications supplémentaires de la base sont inutiles et réduisent les performances de l'application. 1.7.4.5 Les clés étrangères 35 Manuel MySQL 4.1.x ? Version Française Il n'est pas rare pour un administrateur de bases de données de faire une topologie • complexe des relations entre tables qui rendent très complexe, voire impossible de restaurer des tables. 1.7.4.6 Les vues Il est prévu d'implémenter les vues dans la version 5.0 du serveur MySQL. Les vues sont la plupart du temps utiles pour donner accès aux utilisateurs à un ensemble de relations représentées par une table (en mode inaltérable). Beaucoup de bases de données SQL ne permettent pas de mettre à jour les lignes dans une vue, vous devez alors faire les mises à jour dans les tables séparées. Vu que le serveur MySQL est la plupart du temps utilisé dans des applications où le développeur à un contrôle total sur l'utilisation de la base de données, la plupart de nos utilisateurs n'ont pas considéré les vues comme très importantes (du moins, personne n'a été assez intéressé à ce sujet pour être prêt à financer l'implémentation des vues). On n'a pas forcément besoin des vues pour restreindre l'accès aux colonnes, et ce, parce que MySQL a un système de droits très sophistiqué. Sécurité générale et accès à MySQL . 1.7.4.7 '??' comme début de commentaire Certaines bases de données SQL utilisent '??' comme début de commentaire. Le serveur MySQL utilise '#' . Vous pouvez aussi utiliser la syntaxe du langage C /* ceci est un commentaire */ . Syntaxe des commentaires . MySQL version 3.23.3 et plus récent supporte les commentaires de type '??' , si ce commentaire est suivi d'un espace. Ceci est dû au fait que ce type de commentaire a causé beaucoup de problèmes avec les requêtes générées automatiquement, qui contiennent du code tel que celui?ci, où nous insérons automatiquement la valeur du paiement dans la table !payment! : UPDATE tbl_name SET credit=credit?!payment! Pensez à ce qui se passe lorsque la valeur de payment est négative. Comme 1??1 est valide en SQL, la conséquence est de commencer un commentaire '??' .En utilisant notre implémentation des commentaires avec le serveur MySQL version 3.23.3 et plus récent, 1?? ceci est un commentaire ne pose pas ce type de problème. Une autre fonctionnalité supplémentaire est que le client en ligne de commande mysql supprime toutes les lignes qui commencent par '??' . Les informations suivantes sont destinées aux utilisateurs de MySQL avec des versions antérieures à la version 3.23.3 : Si vous avez un programme SQL dans un fichier texte qui contient des commentaires au format '??' , il est recommandé d'utiliser : shell> replace " ??" " #" < text?file?with?funny? \ | mysql database au lieu du classique : 1.7.4.6 Les vues 36 Manuel MySQL 4.1.x ? Version Française shell> mysql database < text?file?with?funny? Vous pouvez aussi éditer le fichier de commande ``lui?même'' pour remplacer les commentaires '??' par des commentaires '#' : shell> replace " ??" " #" ?? text?file?with?funny? Puis, rétablissez?les avec : shell> replace " #" " ??" ?? text?file?with?funny? 1.7.5 Erreurs connues et problèmes de conceptions de MySQL Les problèmes suivants sont connus, et sont en tête de liste pour être corrigés : ANALYZE TABLE • , sur une table de type BDB, peut rendre la table inutilisable, dans certains cas, jusqu'au prochain redémarrage de mysqld . Lorsque cela survient, vous rencontrez les erreurs suivantes dans le fichier d'erreur MySQL : 001207 22:07:56 bdb: log_flush: LSN past current end?of?log N'exécutez pas de commande • ALTER TABLE sur une table BDB sur laquelle vous avez exécuté des transactions à plusieurs commandes, jusqu'à ce que ces transactions soient achevées : la transaction sera probablement ignorée. ANALYZE TABLE • , OPTIMIZE TABLE et REPAIR TABLE peuvent causer des problèmes sur les tables avec lesquelles vous utilisez la commande INSERT DELAYED . Faire un • LOCK TABLE ... et FLUSH TABLES ... ne vous garantit pas qu'il n'y a pas une transaction en court sur la table. Les tables BDB sont lentes à ouvrir. Si vous avez de nombreuses tables BDB dans une • base, cela prendra du temps au client mysql pour accéder à la base si vous n'utilisez pas l'option ?A , ou si vous utilisez la commande rehash . C'est particulièrement vrai si vous n'avez pas de cache de table important. Les problèmes suivants sont connus et seront corrigés en leur temps : Lorsque vous utilisez la commande • SET CHARACTER SET , il n'est pas possible d'utiliser les caractères traduits dans les noms de bases, de tables ou de colonnes. Il n'est pas possible d'utiliser • _ ou % avec la commande ESCAPE dans la clause LIKE... ESCAPE . Si vous avez une colonne de type • DECIMAL avec un nombre stocké dans un autre format (+01.00, 1.00, 01.00), GROUP BY peut considérer ces valeurs comme différentes. Lorsque • DELETE FROM merge_table est utilisé sans la clause WHERE , elle va simplement effacer le fichier de la table, et ne pas effacer les tables associées. Vous ne pouvez pas compiler le serveur dans un autre dossier lorsque vous utilisez les • MIT?pthreads. Comme cela requiert une modification des MIT?pthreads, nous ne Les valeurs de type • BLOB ne peuvent pas être utilisées ``correctement'' dans les clauses GROUP BY ou ORDER BY ou DISTINCT . Seuls, les max_sort_length premiers octets (par défaut, 1024) seront utilisés pour les comparaisons de BLOB . Ceci peut être modifié avec l'option ?O max_sort_length de mysqld . Un palliatif à ce problème est d'utiliser une sous partie de chaîne : SELECT DISTINCT LEFT(blob,2048) FROM tbl_name . Les calculs sont faits avec des • BIGINT ou DOUBLE (les deux sont normalement de 64 bits). La précision dépend alors de la fonction utilisée. La règle générale est que les fonctions de bits utilisent la précision des BIGINT , IF et ELT() utilisent la précision des BIGINT ou DOUBLE , et les autres utilisent la précision des DOUBLE . Il faut donc éviter d'utiliser les entiers non signés de grande taille, surtout s'ils dépassent la taille de 63 bits (9223372036854775807) pour toute autre fonction que les champs de bits ! La version 4.0 gère bien mieux les BIGINT que la 3.23. Toutes les colonnes de type chaînes, hormis les • BLOB et TEXT , voient automatiquement leurs caractères blancs finaux supprimés. Pour le type CHAR c'est correct, et c'est considéré 1.7.5 Erreurs connues et problèmes de conceptions de MySQL 37 Manuel MySQL 4.1.x ? Version Française comme une fonctionnalité par la norme ANSI SQL92. Le hic est que pour le serveur MySQL les colonnes VARCHAR sont traitées de la même façon. Vous ne pouvez avoir que des colonnes de taille 255 pour les • ENUM et SET . Avec les fonctions d'agrégation • MIN() , MAX() et compagnie, MySQL compare actuellement les colonnes de type ENUM et SET par leur valeur de chaîne, plutôt que par leur position relative dans l'ensemble. safe_mysqld • redirige tous les messages de mysqld vers le log mysqld . Le problème est que si vous exécutez mysqladmin refresh pour fermer et ouvrir à nouveau l'historique, stdout et stderr sont toujours redirigés vers l'ancien log. Si vous utilisez ??log extensivement, vous devriez éditer safe_mysqld pour loger vers 'hostname'.err au lieu de 'hostname'.log , de façon à pouvoir facilement récupérer la place de l'ancien log, en effaçant les vieux, et en exécutant mysqladmin refresh . Dans la commande • UPDATE , les colonnes sont modifiées de gauche à droite. Si vous faite référence à une colonne modifiée, vous obtiendrez sa valeur modifiée, plutôt que sa valeur originale. Par exemple : mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1; Cette commande va modifier la colonne KEY avec 2 au lieu de 1 . Vous ne pouvez pas utiliser les tables temporaires plus d'une fois dans la même requête. • Par exemple, cette commande ne fonctionne pas : mysql> SELECT * FROM temporary_table, temporary_table AS t2; RENAME • ne fonctionne pas avec les tables TEMPORARY , ou les tables utilisées dans un rassemblement ( MERGE ). L'optimiseur peut gérer la clause • DISTINCT différemment si vous utilisez des colonnes cachées dans une jointure. Dans une jointure, les colonnes cachées sont comptées comme une partie du résultat (même si elles ne sont pas montrées), tandis que dans les requêtes normales, les colonnes cachées ne participent pas aux DISTINCT . Nous allons probablement modifier ceci dans le futur, pour ne jamais exploiter les colonnes cachées avec DISTINCT . Voici un exemple : SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC; et SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND = band_downloads.mp3id ORDER BY DESC; Dans le second cas, MySQL 3.23.x pourrait vous donner deux lignes identiques dans le résultat (car les lignes cachées id diffèrent).Notez que cela n'arrive que pour les requêtes où vous n'avez pas de colonnes de la clause ORDER BY dans le résultat, ce que vous ne pourriez pas faire en ANSI SQL. Comme le serveur MySQL vous permet de travailler avec des tables qui ne supportent pas • les transactions, et donc, l'annulation rollback , certains comportements sont différents avec MySQL d'avec d'autres serveurs SQL. C'est nécessaire pour s'assurer que MySQL n'a jamais besoin d'annuler une commande SQL. Cela peut sembler un peu étrange au moment ou les colonnes doivent être vérifiées par l'application, mais cela vous fournit une accélération notable, à cause d'optimisations qui ne pourraient pas avoir lieu vous donnez une valeur incorrecte à une colonne, MySQL va stocker le meilleur code possible dans la colonne, au lieu d'annuler la transaction : Si vous essayez de stocker une valeur qui est hors de l'intervalle de validité dans ? une colonne numérique, MySQL va stocker la plus petite ou la plus grande valeur 1.7.5 Erreurs connues et problèmes de conceptions de MySQL 38 Manuel MySQL 4.1.x ? Version Française qu'il connaisse dans cette colonne. Si vous essayez de stocker une chaîne qui ne commence pas pas un chiffre dans ? une colonne numérique, MySQL va stocker 0. Si vous essayez de stocker la valeur ? NULL dans une colonne qui n'accepte pas la valeur NULL , le serveur MySQL va stocker 0 ou '' (chaîne vide) à la place : ce comportement peut être modifié avec l'option de compilation ?DDONT_USE_DEFAULT_FIELDS). MySQL vous autorise le stockage de dates erronées dans les colonnes de type ? DATE et DATETIME (comme 2000?02?31 ou 2000?02?00). L'idée est que ce n'est pas au serveur SQL de faire le travail de validation. Si MySQL peut stocker une date, et relire exactement cette date, alors MySQL va stocker cette date. Si la date est totalement fausse (hors de l'intervalle de validité du serveur), la valeur spéciale 0000?00?00 sera utilisée. Si vous utilisez une valeur non supportée avec une colonne de type ? ENUM , la valeur stockée sera la chaîne vide, de valeur numérique 0. Si vous utilisez une valeur invalide dans une colonne de type ? SET , la valeur sera ignorée. Si vous exécutez une • PROCEDURE sur une requête qui retourne un résultat vide, dans certains cas, PROCEDURE ne transformera pas les colonnes. La création de table de type • MERGE ne vérifie pas si les tables sous?jacentes sont de type compatible. Le serveur MySQL ne supporte pas encore les valeurs Server • NaN , ?Inf et Inf pour les doubles. Utiliser ces valeurs générera des problèmes lorsque vous essayerez d'exporter et d'importer des données. Comme solution temporaire, vous pouvez remplacer NaN par NULL (si possible) et ?Inf et Inf par les valeurs maximales possibles des colonnes double . Les valeurs négatives passées à • LIMIT sont traitées comme des valeurs positives. Si vous utilisez la commande • ALTER TABLE pour ajouter un index de type UNIQUE à un table utilisée dans un rassemblement de tables MERGE , puis que vous utilisez ALTER TABLE pour ajouter un index normal à la table MERGE , l'ordre des clés sera différent pour les tables s'il y avait déjà une ancienne clé qui n'était pas unique. Ceci est dû au fait que ALTER TABLE place les clés UNIQUE avant les clés normales, pour être capable de détecter les clés doublons plus vite. Les bogues suivants sont connus dans les anciennes versions de MySQL : Vous pouvez obtenir un thread gelé si vous utilisez la commande • DROP TABLE sur une table qui fait partie des tables verrouillées par LOCK TABLES . Dans les cas suivants, vous pouvez obtenir un crash : • Le gestionnaire d'insertions retardées a déjà des insertions en attente pour une ? table. LOCK table ? avec WRITE . FLUSH TABLES ? . Pour les versions de MySQL avant la 3.23.2, une commande • UPDATE qui modifiait une clé avec la clause WHERE sur la même clé, pouvait échouer car la même clé était utilisée pour rechercher les lignes et la même ligne pouvait être trouvée plusieurs fois : UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100; Un palliatif est : mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100; Cela fonctionnera, car MySQL ne va pas utiliser d'index sur une expression dans la clause WHERE . Avant la version 3.23 de MySQL, tous les types numériques étaient traités comme des • champs à virgule fixe. Cela signifie que vous deviez spécifier le nombre de décimales que le champ devait avoir. Tous les résultats étaient retournés avec le nombre correct de décimales. 1.7.5 Erreurs connues et problèmes de conceptions de MySQL 39 Manuel MySQL 4.1.x ? Version Française Pour les bogues spécifiques aux systèmes d'exploitation, voyez la section sur la compilation et le port. 1.8 Les évolutions de MySQL (la liste des tâches) Cette section liste les fonctionnalités que nous prévoyons d'ajouter à MySQL. La liste est grossièrement réalisée dans l'ordre de priorité. Si vous voulez modifier cet ordre, Support and Licensing . L'objectif est de supporter complètement la norme ANSI SQL99, tout en lui ajoutant de nombreuses améliorations. Le défi est de faire tout cela sans sacrifier la vitesse d'exécution, ni la qualité du code. 1.8.1 Ce que devrait inclure la version 4.0 Tout est fait. Nous ne fournissons plus que des corrections de bogues pour MySQL 4.0. Changements dans la publication 4.0.x (Beta) . Le développement est passé à la version 4.1 1.8.2 Ce qui est prévu pour la version 4.1 Les fonctionnalités suivantes sont prévues pour être ajoutées dès la version 4.1. Notez que comme nous avons de nombreux développeurs qui travaillent sur différents projets, il y aura aussi de nombreuses améliorations. Il y a aussi de faibles chances pour que ces fonctionnalités soient ajoutées à la version 4.0. Certaines fonctionnalités sont déjà installées dans la version MySQL 4.1. Sous?sélections. • SELECT id FROM t WHERE grp IN (SELECT grp FROM g WHERE u > 100); Un nouveau format de définition de table (fichiers • .frm ). Il nous permettra de ne pas être à court de place lors de l'ajout de nouvelles options. Les anciens fichiers sont toujours compatibles avec la version 4.0. Toutes les nouvelles tables utiliseront ce nouveau nouveau format de fichier nous permettra d'ajouter de nouveaux types de colonnes, plus d'options pour les clés, et alloueront de la place pour les définitions des FOREIGN KEY . SHOW COLUMNS FROM table_name • (utilisé par le client mysql pour afficher le détail des colonnes) ne devrait pas ouvrir la table, mais uniquement le fichier de définition. Cela consommera moins de mémoire, et sera plus rapide. Le support des clés étrangères pour les tables • MyISAM , incluant les effacement en cascade. La réplication infaillible. • La réplication devrait fonctionner avec la fonction • RAND() et la variable utilisateur @var . Sauvegarde à chaud, avec faible réduction des performances. La sauvegarde en ligne • rendra simple le nouveau système de réplication, sans éteindre le serveur maître. Tables dérivées : • SELECT a.col1, b.col2 FROM (SELECT MAX(col1) AS col1 FROM root_table) a, other_table b WHERE a.col1=b.col1; Cela peut se faire automatiquement, en créant des tables temporaires pour les tables dérivées, pour la durée de la requête. 1.8 Les évolutions de MySQL (la liste des tâches) 40 Manuel MySQL 4.1.x ? Version Française Fonction de groupement • ROLLUP et CUBE OLAP (Online Analytical Processing) pour les applications de dépôts de données. Permettre que la commande • DELETE , sur les tables MyISAM , utilise le cache de lignes. Pour cela, nous devons modifier les threads de cache de ligne lorsque nous modifions le fichier .MYD . Lors de l'utilisation de • SET CHARACTER SET , il faudrait traduire toute la requête, et non pas seulement les chaînes. Cela permettra aux utilisateurs d'utiliser les caractères traduits dans les noms de tables, bases et colonnes. Ajouter la méthode • record_in_range() à la commande MERGE pour être capable de choisir le bon index lorsqu'il y a trop de choix. Nous devrions aussi étendre l'interface d'informations pour lire la distribution des clés de chaque index, si analyze est exécuté sur toutes les tables. Résoudre le problème avec la commande • RENAME TABLE lorsqu'elle est utilisée sur une table active MERGE , ce qui conduit actuellement à la corruption de la table. Une librairie MySQL intégrée plus rapide est plus compacte (compatible avec l'ancienne). • Support OpenSSL stable (MySQL 4.0 supporte OpenSSL mais cela reste rudimentaire et • pas totalement testé). Ajout du support en fonction de l' • UNICODE . Transtypage de jeux de caractères et des syntaxes pour gérer simultanément plusieurs jeux • de caractères. Aide pour toutes les commandes du client. • Nouveau protocole client/serveur plus rapide qui supportera les commandes préparées, les • paramètres liés, et les résultats liés, les transferts binaires de données, les alertes... Ajout des vrais noms de tables et de bases (dans le cas d'un alias) à la structure • MYSQL_FIELD. Ajout d'options au protocole client/serveur pour obtenir des informations sur la progression • des requêtes lentes. L'implémentation de • RENAME DATABASE . Pour que cela soit sécuritaire pour tous les gestionnaires de table, cela doit fonctionner comme ceci : Créer la nouvelle base de données. ? Pour chaque table, renommer la table dans la nouvelle base de données, en utilisant ? l'équivalent de la commande RENAME . Effacer l'ancienne base de données. ? Ajouter le vrai support des • VARCHAR (Il y a déjà ce support avec les tables MyISAM ). Optimiser le type • BIT pour qu'il prenne un bit (actuellement, BIT prend un caractère). Nouvelle interface interne avec les fichiers. Cela rendra plus générique la gestion des • fichiers, et rendra plus simple des extensions du type RAID. (L'implémentation actuelle est un hack.) Améliorer les tables en mémoire ( • HEAP ) : Support des index B?tree ? Lignes de taille dynamique ? Accélération de la gestion des lignes (moins de copie) ? 1.8.3 Ce qui doit être fait dans un futur proche Limiter le nombre de threads qui travaillent à la restauration d'une table MyISAM en même • temps. Changer le code de la commande • INSERT ... SELECT pour supporter les insertions concurrentes, en option. Retourner le type original des champs avec la commande • SELECT MIN(column) ... GROUP BY . Support des résultats multiples. • Rendre possible la spécification de • long_query_time avec une granularité en 1.8.3 Ce qui doit être fait dans un futur proche 41 Manuel MySQL 4.1.x ? Version Française microsecondes. Lier le code de • myisampack dans le serveur. Porter le code de MySQL sur QNX. • Porter le code de MySQL sur BeOS. • Porter le code du client MySQL sur LynxOS. • Ajouter un buffer de clés temporaires durant les commandes • INSERT/DELETE/UPDATE de manière a le restaurer proprement si le fichier d'index se remplit. Si vous exécutez une commande • ALTER TABLE sur une table qui est liée symboliquement sur un autre disque, les tables temporaires devraient être créées dans ce disque. Implémenter un type • DATE/DATETIME qui gère les données de fuseaux horaires correctement, afin de simplifier la gestion de ces derniers. FreeBSD et MIT?pthreads; est?ce que les threads en veille consomment du temps • processeur ? Vérifier si les threads verrouillés consomment du temps processeur. • Corriger le script de configure pour que l'on puisse compiler toutes les librairies (comme • MyISAM ) sans les threads. Ajouter une option pour vider périodiquement les pages de clés, avec des clés retardées si • on ne les a pas utilisées depuis un bon moment. Permettre les jointures sur des parties de clés (problème d'optimisation). • INSERT SQL_CONCURRENT • et mysqld ??concurrent?insert pourraient réaliser des insertions concurrentes à la fin du fichier, si le fichier est verrouillé en lecture. Les curseurs coté serveur. • Vérifier si • lockd fonctionne avec les noyaux moderne. Si ce n'est pas le cas, nous devons corriger lockd ! Pour tester cela, démarrez mysqld avec l'option ??enable?locking et lancez différents tests de fork*. Si cela fonctionne, il ne doit y avoir aucune erreur. Permettre des variables SQL dans la clause • LIMIT , comme LIMIT @a,@b . Permettre les modifications de variables dans les commandes • UPDATE . Par exemple : UPDATE TABLE foo SET @a=a+b,[email protected], [email protected]+c . Changer les modifications de variables utilisateur pour que l'on puisse les utiliser avec la • clause GROUP BY , comme ceci : SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM nom_de_table GROUP BY id . Ne pas utiliser de valeur par défaut • DEFAULT automatiquement. Générer une erreur lorsque la commande INSERT ne contient pas la valeur d'une colonne qui n'a pas de valeur par DEFAULT . Corriger • libmysql.c pour permettre les commandes mysql_query() dans une ligne sans lire les résultats, ou afficher une erreur lorsque l'on tente de le faire. Vérifier pourquoi MIT?pthreads • ctime() ne fonctionne pas sur certains systèmes FreeBSD. Ajouter une option • IMAGE à la commande LOAD DATA INFILE pour ne pas modifier les colonnes de type TIMESTAMP et AUTO_INCREMENT . Ajouter la syntaxe • LOAD DATE INFILE ... UPDATE . Pour les tables avec clés primaires, si les données ne contiennent pas de clé ? primaire, les entrées qui correspondent à cette clé primaire sont modifiées avec le reste des colonnes. Cependant, les colonnes qui manquent dans les données entrantes sont ignorées. Pour les tables avec des clés primaires à qui il manque une partie de la clé dans les ? données entrantes, ou si il n'y a pas la clé primaire, les données sont traitées comme pour LOAD DATA INFILE ... REPLACE INTO . Faire que la commande • LOAD DATA INFILE comprenne ceci : LOAD DATA INFILE '' INTO TABLE tbl_name TEXT_FIELDS (text_field1, text_field2, text_field3) SET table_field1=CONCAT(text_field1, text_field2), table_field3=23 IGNORE text_field3 Ceci peut être utilisé pour sauter les colonnes de texte supplémentaire dans le fichier, ou 1.8.3 Ce qui doit être fait dans un futur proche 42 Manuel MySQL 4.1.x ? Version Française pour modifier des colonnes en se basant sur les données lues. LOAD DATA INFILE 'file_name' INTO TABLE 'nom_de_table' ERRORS TO • err_nom_de_table . Cette commande enregistrera les erreurs et les alertes dans la table err_nom_de_table . Cette table aura la structure suivante : line_number ? numéro de ligne dans le fichier de données error_message ? Le message d'erreur ou d'alerte Ou peut être data_line ? La ligne du fichier de données Affichage automatique de • mysql vers Netscape. LOCK DATABASES • (avec différentes options). Fonctions : ADD_TO_SET(value,set) et REMOVE_FROM_SET(value,set). • Ajouter les syntaxes • t1 JOIN t2 ON ... et t1 JOIN t2 USING ... Actuellement, vous ne pouvez utiliser cette syntaxe qu'avec LEFT JOIN . Bien plus de valeurs dans la commande • show status . Les lignes lues et modifiées. Les sélections sur une table et les jointures. Le nombre moyen de table dans une sélection. Le nombre de clause ORDER BY et GROUP BY dans les requêtes. Si vous interrompez • mysql au beau milieu d'une requête, vous devriez ouvrir une autre connexion, et tuer l'ancienne requête. Alternativement, une tentative de détection doit avoir lieu sur le serveur. Ajouter un gestionnaire d'interface pour les informations de tables, de manière à pouvoir • l'utiliser comme une table système. Cela serait un peu lent si vous demandez toutes les informations sur toutes les tables, mais c'est très souple. SHOW INFO FROM tbl_name pour les informations simples de tables devrait être implémenté. NATURAL JOIN • . Permettre la commande • SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a) ; dans ce cas, a est supposé provenir de la table crash_me . Corriger le code pour que • ON et USING fonctionne avec les jointures de type JOIN . Commande Oracle • CONNECT BY PRIOR ... pour rechercher les hiérarchies. mysqladmin copy database new?database • ; requiert la commande COPY dans mysqld . La liste des processus devrait afficher le nombre de requêtes et de threads. • SHOW HOSTS • doit afficher les informations sur les noms d'hôte en cache. Options de • DELETE et REPLACE dans la commande UPDATE (cela effacerait des lignes lorsque une clé voit un doublon surgir durant la mise à jour). Modifier le format de • DATETIME pour stocker les fractions de secondes. Ajout de tous les types de données qui manquent de ANSI92 et ODBC 3.0. • Changer les noms des tables de chaîne vide en • NULL pour les colonnes calculées. Ne pas utiliser • Item_copy_string sur les valeurs numériques pour éviter la conversion nombre ?> chaîne ?> nombre dans le cas de : SELECT COUNT(*)*(id+0) FROM nom_de_table GROUP BY id Rendre possible l'utilisation de la nouvelle librairie d'expression régulière GNU en lieu et • place de celle qui a actuellement cours (la librairie GNU devrait être bien plus rapide). Modifier la commande • ALTER TABLE pour qu'elle n'interrompe pas les clients qui exécutent des commandes INSERT DELAYED . Corriger le code pour que lorsque les colonnes sont référencées dans une commande • UPDATE , elle contiennent les anciennes valeurs, et non pas les nouvelles. Ajouter la simulation de • pread() / pwrite() sous Windows pour permettre les insertions concurrentes. Un analyseur de fichiers de log, qui pourrait traiter les données et indiquer quelles tables • sont les plus souvent utilisées, combien de jointures sont faites, etc. Cela aidera les utilisateurs à identifier les points sensibles dans leur conception de bases de données. Ajouter • SUM(DISTINCT) . Ajouter les fonctions de groupement • ANY() , EVERY() et SOME() . En ANSI SQL, elles ne fonctionnent que sur les colonnes de type booléen, mais nous pouvons les étendre pour qu'elles fonctionnent sur n'importe quelle type de colonne ou d'expression en appliquant la 1.8.3 Ce qui doit être fait dans un futur proche 43 Manuel MySQL 4.1.x ? Version Française conversion valeur == 0 ?> FALSE et valeur <> 0 ?> TRUE. Faire que le type de • MAX(column) soit le même que le type de la colonne utilisé. Par exemple : mysql> CREATE TABLE t1 (a DATE); mysql> INSERT INTO t1 VALUES (NOW()); mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1; mysql> SHOW COLUMNS FROM t2; Inventer une syntaxe pratique pour une commande qui va modifier avec • UPDATE une ligne si elle existe, et sinon, faire un insertion INSERT si cette ligne n'existe pas. (Comme REPLACE le fait avec INSERT / DELETE ). 1.8.4 Ce qui est prévu pour plus tard Implémenter la fonction : • get_changed_tables(timeout,table1,table2,...) . Remplacer la lecture dans les tables par une zone mémoire aussi souvent que possible. • Actuellement, seules les tables compressées utilisent des memmap. Rendre le code des timestamp automatiques bien plus pratique. Ajouter les timestamps • dans le log avec SET TIMESTAMP=#; . Utiliser un mutex de lecture/écriture pour gagner de la vitesse. • Ajouter le support complet des clés étrangères pour les tables • MyISAM , probablement après l'implémentation des procédures stockées et des triggers. Des vues simples (sur une table, puis sur une expression). • Fermer automatiquement des tables si une table, une table temporaire ou un fichier • temporaire reçoit une erreur 23 (plus assez de fichiers ouverts). Lors de la rencontre de field=#, changez toutes les occurrences du champ en #. • Actuellement, cela n'est fait que pour les cas simples. Changer toutes les expressions constantes par des expressions calculées, si possible. • Optimiser la relation clé = expression. Actuellement, seul les relations clé = champ et clé = • constante sont optimisées. Fusionner les fonctions de copie pour améliorer le code. • Changez • pour le remplacer par un analyseur de ligne de commande plus petit, et qui gère mieux les messages. Changer l'analyseur pour utiliser uniquement une règle pour tous les nombres d'arguments • possibles dans une fonction. Utiliser les calculs de noms complets dans la clause ORDER (pour ACCESS97). • MINUS • , INTERSECT et FULL OUTER JOIN . (actuellement, UNION [en 4.0] et LEFT OUTER JOIN fonctionnent). SQL_OPTION MAX_SELECT_TIME=# • pour donner une limite de temps à une requête. Diriger le log d'historique vers une base. • Améliorer • LIMIT pour permettre la lecture de données à la fin du résultat. Alertes lors des connexion/écriture/lecture du client. • Notez ces modifications de • safe_mysqld : selon la FSSTND (que Debian essaie de suivre) les fichiers PID devraient être placés dans /var/run/<progname>.pid et les fichiers de logs dans /var/log . Il serait bien si vous pouviez mettre le "DATADIR" dans la première déclaration de "pidfile" et "log", de façon à ce que l'emplacement de ces fichiers puisse être modifié en une seule ligne. Permettre au client de commander le log des actions. • Ajouter l'utilisation de • zlib() pour les fichiers gzip , avec la commande LOAD DATA INFILE . Corriger le tri et le groupage avec les colonnes • BLOB (en partie résolu). Procédures stockées. Les triggers sont aussi au programme. • Un langage de modification simple et atomique, qui peut être utilisé pour écrire des boucles • dans le serveur MySQL. 1.8.4 Ce qui est prévu pour plus tard 44 Manuel MySQL 4.1.x ? Version Française Utiliser des sémaphores pour compter les threads. Il faut commencer par implémenter des • sémaphores pour MIT?pthreads. Ne pas assigner de nouvelle valeur • AUTO_INCREMENT lorsque l'on utilise la valeur 0. Utilisez NULL à la place. Ajouter le support complet pour les • JOIN avec parenthèses. Comme alternative à la relation un thread, une connexion, gérer un groupe de threads pour • répondre aux requêtes. Permettre la pose de plusieurs verrous avec • GET_LOCK . Lors de ces verrous multiples, gérer le cas des blocages par verrous qui pourrait être introduit. Le temps est indiqué en temps de travail et non pas en temps normal. 1.8.5 Ce qui n'est pas prévu Rien. Nous nous dirigeons vers la compatibilité complète avec ANSI 92/ANSI 99. • 1.9 Comparatif de MySQL avec les autres serveurs SQL Nos utilisateurs ont réussi à exécuter nos tests avec un grand nombre de serveurs SQL Open Source ou non. Nous connaissons des tests exécutés avec Oracle , DB/2 , Microsoft SQL Server et d'autres produits commerciaux. Pour des raisons légales, nous ne pouvons pas les publier dans notre manuel de référence.Cette section inclut la comparaison de MySQL avec mSQL pour des raisons historiques, et avec PostgreSQL car c'est aussi une base Open Source . Si vous avez des résultats de tests que nous pouvons publier, contactez?nous à page web de l'utilitaire crash?me à l'adresse ? . 1.9.1 MySQL face à mSQL Performance tests comparatifs de MySQL . Comme il n'y a pas de création de threads, que l'analyseur est plus petit, et que les fonctionnalités sont moins nombreuses, mSQL devrait être plus rapide avec : les tests qui réalisent des connexions répétées et qui n'exécutent qu'une simple requête à chaque fois. les opérations d' INSERT dans des tables très simples, avec peu de colonnes et d'index. les commandes de CREATE TABLE et DROP TABLE . les commandes SELECT sur tout ce qui n'est pas indexé (un scan de table est très facile). Comme ces opérations sont très simples, il est difficile d'être meilleur lorsque les coûts d'administration sont bien plus forts. Une fois la connexion établie, le serveur MySQL devrait être bien plus rapide.D'un autre coté, le serveur MySQL est plus rapide que mSQL (et que les autres serveurs SQL) avec : les opérations SELECT complexes. les lectures de grands résultats (le serveur MySQL a un protocole plus rapide, plus sûr et bien meilleur). 1.8.5 Ce qui n'est pas prévu 45 Manuel MySQL 4.1.x ? Version Française les tables à taille de chaînes variable, car le serveur MySQL a une gestion plus efficace et utilise les colonnes VARCHAR indexées. la gestion des tables avec de nombreuses colonnes. la gestion des tables ayant des grandes lignes. les commandes SELECT avec de nombreuses expressions. les commandes SELECT sur de grandes tables. la gestion de nombreuses connexions simultanées. Le serveur MySQL est complètement multi?threadé. Chaque connexion possède son propre thread, ce qui signifie qu'il y a pas d'attente entre les threads (à moins que l'un d'entre eux modifie une table que l'autre veut utiliser). En mSQL , une fois que la connexion a été établie, les autres doivent attendre que la première ait fini, indépendamment de la durée d'exécution de la requête. Lorsque la première connexion se termine, le suivant peut être servi, tandis que les autres attendent. les jointures. mSQL peut devenir irrémédiablement lent si vous modifiez l'ordre des tables dans la colonne SELECT . Dans la suite de test, il s'est vu des tests 15000 fois plus lent que MySQL. Ceci est dû au manque d'optimisateurs chez mSQL . Toutefois, si vous avez placé les tables dans le bon ordre avec mSQL 2 et que la clause WHERE est simple et utilise les index, la jointure peut les clauses ORDER BY et GROUP BY . la clause DISTINCT . l'utilisation des colonnes de type TEXT et BLOB . Support de SQL GROUP BY et HAVING . mSQL ne supporte pas du tout la clause GROUP BY . MySQL supporte totalement la clause GROUP BY avec les clauses HAVING et les fonctions suivantes : COUNT() , AVG() , MIN() , MAX() , SUM() et STD() . COUNT(*) est optimisée pour retourner très vite le résultat si SELECT lit les lignes dans une table, qu'aucune autre colonne n'est lue, et qu'il n'y a pas de clause WHERE . MIN() et MAX() accepte les chaînes de caractères comme arguments. Les INSERT et UPDATE avec calculs d'expression. MySQL peut faire des calculs d'expression dans les commandes INSERT et UPDATE . Par exemple : mysql> UPDATE SET x=x*10+y WHERE x<20; Aliasing. MySQL supporte les alias de colonne. Identification simple des colonnes. Avec MySQL, si un nom de colonne est unique dans les tables utilisées pour une jointure, vous n'avez pas à utiliser son identifiant total. SELECT avec des fonctions MySQL dispose de nombreuses fonctions (trop nombreuses à lister ici : voir Fonctions ). Efficacité d'utilisation de l'espace disque C'est à dire, comment pouvez?vous réduire la taille de vos tables ?MySQL a des types très précis, et vous pouvez créer des tables avec un très petit espace. Un exemple de type de données pratique est le type MEDIUMINT qui occupe 3 octets. Si vous avez 100 millions d'enregistrement, économiser un octet par enregistrement est très important. mSQL2 a un jeu de type de données plus limité, ses tables sont donc plus grosses. Stabilité Il est difficile de juger de cela objectivement. Pour un début sur la stabilité du serveur MySQL, voyez Degré de stabilité de MySQL . Nous n'avons aucune expérience avec la stabilité du code de mSQL , alors nous ne 1.8.5 Ce qui n'est pas prévu 46 Manuel MySQL 4.1.x ? Version Française nous prononceront pas là?dessus. Prix Un autre point important est la licence. MySQL dispose d'une licence plus souple que mSQL , est il est aussi moins cher que mSQL . Quelque soit le produit que vous utilisez, n'oubliez pas de prendre un contrat de support par email ou une licence commerciale. interface Perl MySQL a la même interface avec Perl que mSQL , avec des fonctionnalités supplémentaires. JDBC (Java) MySQL supporte de nombreux pilotes JDBC : le pilote mm : un pilote JDBC de type 4, écrit par Mark Matthews Le pilote Resin : un pilote JDBC commercial et Open Source. Le pilote gwe : une interface Java par GWE technologies (non supporté). Le pilote jms : un pilote gwe amélioré par Xiaokun Kelvin ZHU Le pilote twz : un pilote JDBC de type 4, écrit par Terrence W. Zellers personnelles et éducationnelles (non supporté). Le pilote recommandé est le pilote mm. Le pilote Resin est aussi bon (les tests sont bons) mais nous n'avons pas reçu beaucoup d'informations à son savons que mSQL a un pilote JDBC, mais nous n'avons pas l'expérience pour le comparer. Vitesse de développement MySQL a une petite équipe de développeur, mais nous sommes très habitués à coder en C et C++, très rapidement. Comme les threads, les fonctions, GROUP BY et de nombreuses autres fonctionnalités ne sont pas encore codées pour mSQL , il y a beaucoup faire pour nous rattraper. Pour mesurer cela, vous pouvez consulter le fichier d'historique de mSQL HISTORY pour l'an dernier, et le comparer avec la Il est alors assez évident de voir qui se développe plus vite. Programmes utilitaires Les deux projets mSQL et MySQL ont des contributions de tiers très intéressantes. Comme il est plus facile de porter vers les versions plus récentes (depuis mSQL vers MySQL), presque toutes les applications intéressantes de mSQL sont disponibles pour MySQL. MySQL est livré avec un programme simple msql2mysql qui corrige les différences de syntaxe entre mSQL et MySQL pour la plupart des fonctions de l'API C. Par exemple, il modifie les occurrences de msqlConnect() en mysql_connect() . Convertir un programme client de mSQL vers MySQL requiert un effort minimal. 1.9.1.1 Comment convertir des outils mSQL pour MySQL Selon notre expérience, il ne prend pas longtemps pour convertir des outils tels que msql?tcl et msqljava qui utilisent l'API C de mSQL pour qu'ils fonctionnent avec l'API C de MySQL. La procédure de conversion est la suivante : Exécutez le script shell • msql2mysql sur la source. Ce script requiert le programme replace , qui est distribué avec le serveur MySQL. 1.9.1.1 Comment convertir des outils mSQL pour MySQL 47 Manuel MySQL 4.1.x ? Version Française Compilez. • Corrigez les erreurs de compilation. • Les différences entre l'API C de mSQL et de MySQL sont : MySQL utilise la structure • MYSQL comme type de connexion, alors que mSQL utilise un int . mysql_connect() • prend un pointeur sur la structure MYSQL comme paramètre. Il est facile d'en définir un globalement, ou d'utiliser la fonction malloc() pour en obtenir un. mysql_connect() prend aussi deux paramètres supplémentaires, qui sont le nom de l'utilisateur et son mot de passe. Vous pouvez aussi utiliser NULL, NULL pour retrouver l'utilisation classique. mysql_error() • prend la structure MYSQL comme paramètre. Ajoutez simplement ce paramètre à votre vieux code msql_error() , si vous portez du vieux code. MySQL retourne un numéro d'erreur et un message d'erreur pour tous les messages • d'erreurs. mSQL ne retourne que le texte d'erreur. Certaines incompatibilités existent du fait que le serveur MySQL supporte des connexions • multiples, dans le même processus. 1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL Il y a tellement de différences qu'il est impossible (ou tout au moins très difficile) de ne pas les supporter toutes. Les traits les plus caractéristiques de différences entre le protocole de communication de MySQL et de mSQL : Un buffer de message peut contenir plusieurs lignes. • Le buffer de message est dynamiquement agrandi si la requête ou le résultat sont plus • grands que le buffer courant, jusqu'à une taille limite configurable. Tous les paquets sont numérotés pour identifier les paquets doublons ou manquants. • Toutes les valeurs de colonnes sont échangées en mode ASCII. La taille de la colonne est • envoyée dans un paquet binaire (1,2 ou 3 octets). MySQL peut lire un résultat non bufferisé (sans avoir a stocker tout le résultat dans le client). • Si une opération de lecture/écriture prendre plus de 30 secondes, le serveur ferme la • connexion. Si la connexion est inactive pendant 8 heures, le serveur ferme la connexion. • 1.9.1.3 Comparatif des syntaxes SQL de mSQL 2.0 et MySQL Types de colonnes Serveur MySQL Dispose des types traditionnels (entre autres : Syntaxe de CREATE TABLE ): le type ENUM pour les chaînes à valeurs limitées. le type SET pour les combinaisons de valeurs. BIGINT pour les entiers 64?bit. MySQL supporte aussi les attributs de types suivants : option UNSIGNED pour les entiers et nombres à virgule flottante. otion ZEROFILL pour les entiers. option AUTO_INCREMENT pour les colonnes qui sont PRIMARY KEY . mysql_insert_id() . valeur par DEFAULT pour toutes les colonnes. 1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL 48 Manuel MySQL 4.1.x ? Version Française mSQL2 Les types de colonnes de mSQL correspondent aux types de MySQL dans cette table : mSQL type Type MySQL correspondant CHAR(len) CHAR(len) TEXT(len) TEXT(len) . len est la taille maximale. Et LIKE fonctionne. INT INT . Avec de nombreuses options supplémentaires. REAL REAL . Ou FLOAT . Les versions 4 et 8 octets sont disponibles. UINT INT UNSIGNED DATE . Utilise le format ANSI SQL plutôt que le format spécifique de DATE mSQL . TIME TIME MONEY DECIMAL(12,2) . Un nombre à virgule fixe. Création d'index Serveur MySQL Les index peuvent être spécifiés au moment de la création de la table avec la commande CREATE TABLE . mSQL Les index doivent être créés après la création de la table, avec une commande CREATE INDEX séparée. Insertion d'un identifiant unique dans une table Serveur MySQL Utilisez l'option de colonne AUTO_INCREMENT . mysql_insert_id() . mSQL Créez une SEQUENCE dans la table et sélectionnez la colonne _seq . Obtenir un identifiant unique pour une ligne Serveur MySQL Ajoutez la clé PRIMARY KEY ou UNIQUE à la table et utilisez ceci. Nouveau en version 3.23.11 : si la clé PRIMARY ou UNIQUE est constituée d'une seule colonne et qu'il est de type entier, vous pouvez y faire référence avec _rowid . mSQL Utilisez la colonne _rowid . Notez bien que _rowid peut changer durant ce temps, en fonction de nombreux facteurs. Lire la date de dernière modification d'une colonne Serveur MySQL Ajoutez une colonne de type TIMESTAMP dans la table. Cette colonne prend automatiquement la date et l'heure courante lors des commandes INSERT ou UPDATE si vous ne lui affectez pas de valeur, ou si vous lui donnez la valeur NULL . mSQL Utilisez la colonne _timestamp . Comparaisons avec la valeur NULL Serveur MySQL 1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL 49 Manuel MySQL 4.1.x ? Version Française MySQL suit la norme ANSI SQL, et la comparaison avec une valeur NULL retourne toujours NULL . mSQL Avec mSQL , NULL = NULL est vrai (TRUE). Vous devez changer =NULL en IS NULL et <>NULL en IS NOT NULL lorsque vous portez du vieux code de mSQL vers MySQL. Comparaisons de chaînes Serveur MySQL Normalement, la comparaison de chaînes est faîte sans tenir compte de la casse, et l'ordre de tri est déterminé par le jeu de caractères courant (ISO?8859?1 Latin1 par défaut). Si vous ne le souhaitez pas, déclarez vos colonnes avec l'option BINARY , qui fera que les comparaisons peuvent être faites en fonction de l'ordre ASCII utilisé sur l'hôte MySQL. mSQL Toutes les comparaisons de chaînes sont faites en tenant compte de la casse, en fonction de l'ordre ASCII. Recherche insensible à la casse Serveur MySQL LIKE est un opérateur sensible ou non à la casse, suivant les colonnes utilisées. Si possible, MySQL utilise des index si l'argument de LIKE ne commence pas par un caractère joker. mSQL Utilise CLIKE . Gestion des espaces finaux Serveur MySQL Supprime tous les espaces de fin de chaînes dans les colonnes CHAR et VARCHAR . Utilisez les colonnes de type TEXT si ce comportement n'est pas souhaité. mSQL Conserve les espaces finaux. clause WHERE Serveur MySQL MySQL établit correctement les priorités : AND est calculé avant les OR . Pour obtenir le comportement de mSQL avec MySQL, utilisez les parenthèses (tel que présenté dans l'exemple un peu plus loin). mSQL évalue les opérations de gauche à droite. Cela signifie que certaines opérations logiques exprimées avec trois arguemnts ou plus ne peuvent être exprimées. Cela signifie aussi que vous devez modifier des requêtes lorsque vous passez à MySQL : tout ce que vous avez à faire est d'ajouter des parenthèses. Supposez que vous avez le code mSQL suivant : mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4; Pour le passer sur MySQL et le faire fonctionner comme sur mSQL , vous devez ajouter ces parenthèses : mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4)))); Contrôle d'accès 1.9.1.2 Différences entre les protocoles de communication de mSQL et de MySQL 50 Manuel MySQL 4.1.x ? Version Française Serveur MySQL Possède des tables qui stockent les droits de chaque utilisateur, hôte et base. Comment le système de droits fonctionne . mSQL Dispose d'un fichier dans lequel vous pouvez ajouter et modifier les droits d'accès des utilisateurs. 1.9.2 Comparatif de MySQL avec PostgreSQL Lorsque vous lirez ces sections, notez bien que les deux produits évoluent continuellement. Les équipes de MySQL AB et de PostGreSQL travaillent toutes deux à rendre leur base les meilleures possibles, et elles présentent toutes les deux des alternatives sérieuses aux bases de données commerciales. La comparaison qui suit a été fait par MySQL AB. Nous avons essayé d'être aussi précis et objectifs que possible, mais même si nous connaissons MySQL sur le bout des doigts, nous n'avons pas une connaissance aussi pointues des possibilitées de PostgreSQL : nous pourrions être en erreur. Nous corrigerons ces erreurs dès qu'elles seront portées à notre attention. Nous souhaitons noter que PostgreSQL et MySQL sont deux produits largement répandus, mais qui présentent des objectifs différents, même si tous les deux se dirigent vers la compatibilité ANSI SQL. Cela signifie que pour certaines applications, MySQL est bien plus optimisé, et pour d'autres, c'est PostGreSQL. Lorsque vous choisissez votre serveur de base de données, commencez par vérifier que le jeu de fonctionnalités de votre base correspond bien à votre application. Si vous avez besoin de vitesse pure, MySQL est probablement votre choix. Si vous avez besoin des fonctionnalités que PostGreSQL propose, utilisez PostgreSQL . 1.9.2.1 Stratégies de développement de MySQL et PostgreSQL Lorsque nous ajoutons des fonctionnalités à MySQL, nous mettons un point d'honneur à le faire de manière optimale et définitive. Le code doit être tellement bon que vous n'y verrez rien à ajouter dans un futur accessible. Nous sommes peu enclins à sacrifier la vitesse aux fonctionnalités, mais nous faisons notre possible pour trouver une solution qui donnera le meilleur. Cela signifie que le développement prend plus de temps, mais que le résultat en vaut la peine. Ce type de développement n'est possible que parce que le code est vérifié par quelques (actuellement 2) personnes avant qu'il ne soit inclus dans le serveur. Chez MySQL AB, nous croyons aux publications fréquentes car cela nous permet de transmettre nos nouveautés plus rapidement aux utilisateurs. Comme nous publions une nouvelle version mineure toutes les trois semaines, et une version majeure chaque année. Toutes les versions sont testées soigneusement, avec nos outils de tests et sur de nombreuses plate?formes. PostgreSQL est basé sur un noyau de nombreux contributeurs. Avec cette configuration, il est logique d'ajouter de nombreuses fonctionnalités, au lieu de les implanter optimalement, car il sera toujours temps d'optimiser lorsque le besoin s'en fera sentir. Une autre différence majeure entre MySQL et PostgreSQL est que presque tout le code de MySQL est fait par des développeurs employés par MySQL AB et qui travaillent toujours sur ce code. Les seules exceptions sont le moteur de transaction et la librairie d'expressions régulières. Le contraste est saisissant avec le code de PostgreSQL, dont la majorité est réalisée par un grand groupe de personnes avec différentes sensibilités. Ce n'est que récemment que les développeurs 1.9.2 Comparatif de MySQL avec PostgreSQL 51 Manuel MySQL 4.1.x ? Version Française de PostGreSQL ont annoncé qu'ils ont eu finalement le temps de faire le tour du code de la version courante. Les deux stratégies de développement présentées ont leur mérites et inconvénients. Chez MySQL AB, nous pensons, bien sur, que notre modèle est le meilleur car il conduit à une meilleure cohérence du code, et, à notre avis, moins de bogues. Comme nous sommes les auteurs du serveur MySQL, nous sommes les mieux placés pour coordonner les publications. 1.9.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL Sur la page crash?meune liste des avantages et limitations que l'on peut détecter avec un programme. Notez bien que de nombreuses évaluations numériques peuvent être modifiées avec les options de démarrage des différentes bases de données. Cette page web est extrêmement pratique si vous voulez vous assurer que votre application fonctionnera sur différents serveurs SQL, ou si vous voulez convertir votre application d'un serveur à l'autre. MySQL offre les avantages suivants sur PostgreSQL: MySQL • est généralement plus rapide que PostgreSQL. MySQL 4.0.1 a aussi un cache de requêtes qui peut accélérer les requêtes pour les lectures de tables les plus fréquentes. MySQL a une base d'utilisateurs bien plus grande que PostgreSQL. Par conséquent, le • code est testé dans de meilleures conditions, et il a été historiquement plus stable que PostgreSQL. MySQL est utilisé plus souvent en environnement de production que PostgreSQL, notamment grâce au fait que MySQL AB, ex TCX DataKonsult AB, a fourni un support commercial de haute qualité pour le serveur MySQL depuis la première publication, tandis que, jusqu'à récemment, PostgreSQL n'avait pas de support. MySQL fonctionne bien mieux sur Windows que PostgreSQL. MySQL fonctionne comme • une application Windows native (un service sur NT/2000/XP), tandis que PostgreSQL fonctionne en mode émulation de Cygwin . Nous avons entendu dire que PostgreSQL n'est pas encore stable sous Windows mais non n'avons pas été capable de le vérifier nous?mêmes. MySQL a plus d'API avec d'autres langages, et est supporté par un plus grand nombre de • MySQL fonctionne avec les systèmes critiques, à forte charge, 24h/24 et 7j/7. Dans la • plupart des cas, nous n'avons jamais à effectuer d'entretien de MySQL. PostgreSQL ne supporte par encore les systèmes 24h/24 et 7j/7, car il faut exécuter VACUUM une fois de temps en temps pour récupérer l'espace vide issu des commandes UPDATE et DELETE , et pour faire des analyses statistiques qui sont primordiales pour obtenir de bonnes performances avec PostgreSQL. VACUUM est aussi nécessaire après avoir ajouté un grand nombre de lignes dans une table. Sur un système très occupé avec de nombreuses modifications, VACUUM doit être exécuté très fréquemment, et parfois, plusieurs fois dans la journée. Durant l'exécution de VACUUM , qui peut prendre plusieurs heures si la base de données est importante, le serveur est, d'un point de vue production, quasiment mort. Notez qu'avec PostgreSQL version 7.2, l'entretien simple des tables ne nécessite plus le verrouillage des tables, et le niveau d'utilisation est alors à peu près normal. Une nouvelle commande VACUUM FULL effectue les entretiens traditionnels en verrouillant la table, et en réduisant sa taille sur le disque. Le système de réplication de MySQL a été testé soigneusement, et il est utilisé sur des sites • comme : Yahoo Finance ( ) ? ( ) ? Slashdot ( ) ? 1.9.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL 52 Manuel MySQL 4.1.x ? Version Française Dans les deux distributions de MySQL, vous trouverez des suites de tests, • mysql?test?run et crash?meque la suite de performances. Le système de tests est souvent modifié avec des nouveaux tests pour les nouvelles fonctionnalités, ainsi que les bogues qui nous sont rapportés. Nous testons chacune de nos versions sur un grand nombre de plate?formes. Ces tests sont plus sophistiqués que tout ce que nous avons pu voir chez PostgreSQL, et il nous assurent que le serveur MySQL reste de bonne qualité. Il y a bien plus de livres concernant MySQL que PostgreSQL. O'Reilly, SAMS, Que etNew • Riders sont des éditeurs importants, avec des livres traitant de MySQL. Toutes les fonctionnalités de MySQL sont aussi documentées sur le manuel en ligne, car lorsqu'une nouvelle fonctionnalité est implémentée, les développeurs MySQL doivent la documenter avant qu'elle soit inclue dans le source. MySQL support plus de fonctions ODBC que • PostgreSQL . MySQL a une commande • ALTER TABLE beaucoup plus puissante. MySQL supporte les tables sans transaction pour les applications qui ont besoin de plus de • vitesse. Les tables peuvent être placées en mémoire, comme les tables HEAP , ou bien sur le disque, comme les tables MyISAMMySQL supporte deux types de gestionnaires de tables, qui supportent les transactions : • InnoDB et BerkeleyDB . Comme chaque moteur de transactions travaille dans différentes conditions, cela donne plus de possibilités aux auteurs d'applications pour choisir leur Les tables groupées • MERGE vous donnent un moyen d'accéder instantanément a plusieurs tables de même structure, et de les utiliser ensemble, comme une seule. C'est le moyen parfait lorsque vous avez des tables de logs trop grosses, et que vous les séparez par mois. Tables MERGE . La possibilité de compresser les tables en lecture seule, mais tout en ayant un accès direct • aux lignes de la table, vous donnent plus de performance en lecture, en réduisant la taille des données lues sur le disque. C'est très pratique pour les archives. MySQL possède le support d'outils de recherche en texte plein. Recherche full?text avec • Vous pouvez accéder à de nombreuses bases de données avec la même connexion, du • moment que vous avez les droits pour le faire. MySQL est codé depuis le début pour être multi?threadé, tandis que PostgreSQL utilise les • processus. Le temps de changement de contexte et d'accès aux zones de stockage est bien plus court avec des threads qu'entre des processus séparés. Cela donne un avantage de vitesse à MySQL dans les applications multi?utilisateurs, et aussi avec les systèmes à plusieurs processeurs symétriques. MySQL a un système de droits bien plus avancé que PostgreSQL. Alors que PostgreSQL • ne supporte que des droits pour les commandes INSERT , SELECT et UPDATE/DELETE au niveau de l'utilisateur pour une base ou une table, MySQL vous permet de définir un jeu de droits complet pour une base, une table ou une colonne. MySQL vous permet aussi de MySQL supporte un protocole client/serveur compressé qui améliore grandement les • performances sur les connexions lentes. MySQL applique le concept des ``gestionnaires de table'', et est la seule base de données • relationnelle que nous connaissons qui utilise ce concept. Cela permet différents types de tables depuis le moteur SQL, et chaque table peut être optimisée pour différentes performances. Tous les types de tables MySQL (excepté • InnoDB ) sont implémentés avec des fichiers (une table par fichier), ce qui rend très souple les sauvegardes, les déplacements et les effacements, ou même l'utilisation des liens symboliques pour les tables et les bases, même lorsque le serveur est éteint. 1.9.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL 53 Manuel MySQL 4.1.x ? Version Française Les outils pour réparer et optimiser les tables • MyISAM (le type de tables MySQL le plus courant). Un outil de réparation n'est nécessaire que pour les corruptions physiques dans un fichier de données, et généralement, pour corriger une défaillance du matériel. Elle permet à la majorité des données d'être récupérées. Changer de version de MySQL est très simple. Lorsque vous changer de version de • MySQL, vous n'avez pas à exporter et réimporter vos données, comme vous devez le faire avec PostgreSQL. Les inconvénients de MySQL face à PostgreSQL: Le support des transactions de MySQL n'est pas aussi bien testé que celui de PostgreSQL. • Comme le serveur MySQL utilise les threads, qui ne sont pas encore parfaitement rodés sur • tous les systèmes d'exploitation, il faut alors utiliser les exécutables binaires de manière optimale. Le verrouillage de table, tel qu'utilisé par les tables non transactionnelles • MyISAM , est dans de nombreux cas plus rapide que les verrous de page, de ligne ou le versionnage. L'inconvénient est que si l'on ne prend pas garde au fonctionnement du verrouillage de table, une requête seule, à longue durée d'exécution peut bloquer la table en écriture pour un long moment. Cela peut être évité en concevant correctement l'application. Sinon, on Avec UDF (user?defined functions, fonction définies par les utilisateurs), il est possible de • faire évoluer les fonctions du serveur MySQL aussi bien pour les fonctions SQL normales que pour les fonctions d'agrégation, mais ce système n'est pas aussi pratique que pour Les modifications qui s'effectuent sur plusieurs tables sont bien plus difficiles à faire avec • MySQL. Toutefois, cela a été corrigé avec la version 4.0.2 et les commandes UPDATE multi?tables, et en MySQL version 4.1, avec les sous?sélections. En MySQL version 4.0, on peut utiliser les effacements multi?tables pour effacer plusieurs lignes dans différentes tables simultanément. Syntaxe des DELETE . PostgreSQL offre actuellement les avantages suivants sur MySQL : Notez que comme nous connaissons le plan de développement de MySQL, nous avons inclus la table suivante, avec les version du serveur MySQL où les fonctionnalités seront supportées. Malheureusement, nous ne pouvions pas faire les mêmes comparaisons avec les fonctionnalités à venir de PostgreSQL, car nous ne connaissons pas le plan de développement de PostgreSQL. Fonctionnalité version de MySQL Sous?sélections 4.1 Clé étrangères 5.0 (3.23 avec InnoDB) Vues 5.0 Procédures stockées 5.0 Triggers 5.0 Unions 4.0 Jointures totales 4.1 Contraintes 4.1 ou 5.0 Curseurs 4.1 ou 5.0 R?trees 4.1 (pour les tables MyISAM) Tables héritées Non prévu 1.9.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL 54 Manuel MySQL 4.1.x ? Version Française Type de données extensible Non prévu Autres raisons de considérer PostgreSQL : L'utilisation standard de PostgreSQL est parfois plus proche de la norme ANSI SQL. • Il est possible d'accélérer les traitements de PostgreSQL en codant des procédures • stockées. Pour les données géographiques, les R?trees font de PostgreSQL un meilleur choix que • MySQL. (note : MySQL version 4.1 dispose des R?trees pour les tables MyISAM). L'optimiseur PostgreSQL fait des optimisations que l'optimiseur de MySQL ne peut faire. La • plus importante est lors de jointures, lorsqu'il n'y a pas les clés nécessaires, ou lorsque les jointures se font avec des clés combinées par un OR. La suite de tests de MySQL vous devriez éviter lorsque vous utilisez différentes bases de données. PostgreSQL a une plus grande équipe de développement qui contribue au serveur. • Les inconvénients de PostgreSQL face à MySQL : L'utilitaire • VACUUM rend PostgreSQL difficile à utiliser en environnement de production 24h/24 et 7j/7. Les tables sont obligatoirement transactionnelles. • Les commandes • INSERT , DELETE et UPDATE sont plus lentes. Pour une liste complète des inconvénients, examinez la première table de cette section. 1.9.2.3 Performances comparées de MySQL et PostgreSQL Le seul test de vitesse Open Source que nous connaisssons et qui peut être utilisé pour tester les performances de MySQL et de PostgreSQL (et d'autres bases de données) est le nôtre. Il est de nombreuses fois aux développeurs de PostgreSQL et aux utilisateurs de PostgreSQL de nous aider à développer et améliorer ce test, pour en faire le meilleur test possible, mais nous n'avons pas reçu de réponse de leur part. Nous, les développeurs MySQL, avons, à cause de cela, passé de nombreuses heures à obtenir les meilleures performances de PostgreSQL pour ces tests, mais comme nous ne connaissons pas intimement le serveur PostgreSQL, nous sommes certains d'être passé à coté de certains points. Sur la page de test, nous avons documenté exactement comment nous avons exécuté le test, pour qu'il soit facile à tout le monde de reproduire et de confirmer nos résultats. Les tests sont généralement exécutés avec et sans l'option ??fast . Lorsque l'option ??fast est utilisée, nous tentons d'utiliser tous les trucs connus du serveur pour que l'exécution soit aussi rapide que possible. L'idée est que le mode normal doit montrer comment le serveur devrait se comporter avec une configuration normale, et le mode ??fast montre comment le serveur se comporte si le développeur utilise toutes les extensions du serveur pour accélérer son application. Lorsque nous exécutons PostgreSQL avec l'option ??fast , nous exécutons la commande VACUUM après chaque modification importante de la table, et après l'effacement de table, pour conserver la base dans un état parfait pour les prochaines sélections. Le temps nécessaire à l'exécution de la commande VACUUM est mesuré séparément. Lorsque PostgreSQL 7.1.1 fonctionne, nous n'avons pu le faire fonctionner avec l'option ??fast car durant les test d' INSERT , le postmaster (démon PostgreSQL) s'est arrété, et la base était 1.9.2.3 Performances comparées de MySQL et PostgreSQL 55 Manuel MySQL 4.1.x ? Version Française tellement corrompue qu'il a été impossible de redémarrer le postmaster. Après un deuxième problème identique, nous avons décidé de reporter les tests ??fast jusqu'à la prochaine version de PostgreSQL. Les détais sur la machine avec laquelle nous avons exécuté les tests sont disponible sur la page de tests. Avant de passer aux autres tests de performances que nous connaissons, nous souhaitons vous donner des détails sur le contexte des tests. Il est très facile d'écrire un test qui montre que toutes les bases du monde sont les meilleures, en se limitant simplement aux points forts de la base, et en ne testant rien qui soit une faiblesse. De plus, si la conclusion se ramène à un seul chiffre, c'est encore plus facile. Cela revient à mesurer la vitesse de MySQL par rapport à PostgreSQL en regardant simplement les temps moyens des tests de MySQL sur notre page. En se basant sur ces informations, notre serveur MySQL serait 40 fois plus rapide que PostgreSQL, ce qui est, bien sûr, faux. Nous pourrions même rendre les choses encore pires en prenant les tests où PostgreSQL a les pires performances, et dire que MySQL est plus de 2000 fois plus rapide que PostgreSQL. Le fait est que MySQL fait un certain nombre d'optimisation que PostgreSQL ne fait pas. C'est aussi vrai, bien sûr, dans le sens inverse. Un optimiseur SQL est un programme complexe, et une compagnie peut passer des années à le rendre de plus en plus rapide. Lorsque vous regardez les résultats des tests, vous devriez vous limiter aux opérations que vous utilisez dans votre application, et utiliser simplement ces résultats pour décider quelle base de données est la plus adaptée à vos besoins. Les résultats de tests vous montrent quelles opérations sont le point faible de chaque base, et vous donnent des indications sur ce qu'il faudra éviter de faire. Nous connaissons deux tests de performances qui indiquent que PostgreSQL est plus rapide que MySQL. Ces deux tests sont faits dans un environnement multi?utilisateur, un test que nous, chez MySQL AB, nous n'avons pas eu le temps de mettre en place car c'est une tâche énorme de le faire pour que ce soit équitable pour chaque base. Le premier est le test payant, effectué pour Great Bridge, une entreprise qui a tenté durant 16 mois de bâtir un modèle d'affaires avec PostgreSQL mais qui a désormais cessé les opérations. C'est probablement le pire test que nous ayons jamais vu. Non seulement ce test était bâti pour ne tester que les points forts de PostgreSQL, mais il était totalement déloyal pour toutes les autres bases de données utilisées dans le test. Note : nous savons aussi que même certains des développeurs principaux de PostgreSQL n'ont pas aimé la manière avec laquelle Great Bridge a dirigé le test, et nous ne blâmons pas l'équipe de PostgreSQL pour ces tests. Ce test a été condamné dans de nombreux articles et groupes d'utilisateurs, et nous ne citerons que quelques?uns des points qui étaient incorrects. Les tests ont été exécutés avec un outil commercial très cher, qui rendent impossibles aux • entreprises Open Source comme nous de vérifier les résultats ou même de voir comment les tests ont été mis en place. L'outil n'était même pas un véritable outil de test de performances, mais une application de mise en place et de tests. Dire que c'est un outil ``standard'' de tests est bien loin de la vérité. Great Bridge a admis qu'ils ont optimisé le serveur PostgreSQL (avec • VACUUM avant le test) et optimisé le démarrage pour les tests, ce qu'ils n'ont pas fait pour les autres bases. Ils disent ``Ce processus optimise les index et libère un peu d'espace sur le disque. Les index 1.9.2.3 Performances comparées de MySQL et PostgreSQL 56 Manuel MySQL 4.1.x ? Version Française optimisés améliorent les performances marginalement''. Nos tests indiquent clairement la différence lorsqu'on exécute une série de sélections sur une base qui a été entretenue avec VACUUM ou pas : le facteur peut atteindre 10. Les résultats des tests étaient eux?même très étranges. La documentation de tests AS3AP • mentionne qu'ils sont des ``sélections, jointures simples, projections, agrégations, modification d'une ligne et modifications massives''. PostgreSQL est bon pour les SELECT s et les JOIN s (spécialement après l'exécution de la commande VACUUM ), mais n'est pas très performant pour les INSERT s ou les UPDATE . Les tests semblent indiquer que seuls des SELECT ont été exécutés. Cela peut facilement expliquer le nombre de bons résultats pour PostgreSQL dans ce test. Les mauvais résultats de MySQL seront évident un peu plus bas, dans ce document. Ils ont exécuté les soi?disant tests depuis une machine sous Windows vers un serveur • Linux, via ODBC, une configuration que personne n'utiliserait pour un environnement multi?utilisateur. Cela testait surtout le pilote ODBC et le protocole Windows utilisé entre les clients et le serveur, plutôt que le serveur lui?même. Lorsque les tests ont été exécutés avec Oracle et MS?SQL (Great Bridge a indirectement • indiqué que ces bases étaient utilisées dans les tests), ils n'ont pas utilisé le protocole natif mais ODBC. Toute personne qui a utilisé Oracle sait que toutes les vraies applications utilisent l'interface native au lieu d'ODBC. Faire un test via ODBC et dire que les résultats sont comparables avec les situations d'utilisation de la base dans le monde réel ne peut être considéré comme équitable. Ils auraient dû faire deux tests, avec et sans ODBC, pour fournir des faits (après que leurs experts aient optimisé les serveurs, bien sûr). Ils font référence au tests TPC?C, mais ils ne mentionnent nulle part que le test n'était pas • un vrai test TPC?C et qu'ils n'étaient pas autorisés à dire que c'était un tel test. Un test TPC?C ne peut être conduit que par les règles approuvées par le TPC Council ( de TPC et discrédité leurs propres tests. Les règles dictées par le TPC Council sont très strictes pour s'assurer que personne ne produit de faux résultats ou tire des conclusions invérifiables. Apparemment, Great Bridge n'était pas interessé par cela. Après le premier test, nous avons contacté Great Bridge et nous leur avons mentionné les • erreurs évidentes qu'ils avaient faits avec le serveur MySQL : Travailler avec une version beta de notre pilote ODBC. ? Travailler avec un système Linux qui n'était pas optimisé pour les threads. ? Utiliser une vieille version de MySQL alors qu'il en existait une nouvelle. ? Ne pas démarrer MySQL avec les bonnes options pour gérer les environnements ? fortement multi?utilisateurs (la configuration par défaut est optimisée pour consommer le moins de ressources). Great Bridge a exécuté un nouveau test, avec notre nouveau pilote ODBC, et avec de meilleures options de démarrage de MySQL mais ils ont refusé d'utiliser notre librairie glibc ou notre binaire standard (utilisé par 80% de nos utilisateurs), qui étaient statiquement compilé avec la librairie glibc.Selon nos sources, Great Bridge n'a rien fait pour s'assurer que les autres bases de données étaient correctement configurées pour leur environnement de tests. Nous sommes certains qu'ils n'ont pas contacté Oracle ou Microsoft pour leur demander des conseils de configurations. Le test était payé par Great Bridge, et ils ont décidé de publier une partie des résultats, bien • choisis (au lieu de tous les publier). Tim Perdue, un inconditionnel de PostgreSQL et un utilisateur réticent de MySQL, publia une nous avons eu connaissance de la comparaison, nous avons téléphoné à Tim Perdue à ce propos, car il y avait de nombreux résultats étranges dans ses publications. Par exemple, il statuait que MySQL avait un problème avec 5 utilisateurs durant ses tests, alors que nous avons des utilisateurs avec des machines similaires, qui utilisent MySQL avec plus de 2000 utilisateurs simultanés, et 400 1.9.2.3 Performances comparées de MySQL et PostgreSQL 57 Manuel MySQL 4.1.x ? Version Française requêtes par secondes. (Dans ce cas, la limite est la bande passante du réseau, pas le serveur SQL). Il semblait qu'il utilisait un noyau Linux qui avait des problèmes avec les threads, comme les noyaux avant le 2.4 qui avait des problèmes avec les threads sur les machines à plusieurs processeurs. Nous avons documenté dans le manuel comment corriger ce problème, et Tim devrait être bientôt au courant de ce problème. Les autres problèmes possibles pourraient provenir d'une vieille librairie glibc ou du fait que MySQL n'utilise pas une version exécutable de notre site web, qui est bâtie avec une version corrigée de glibc library. Dans ces cas, les symptômes sont ceux que Tim a mesuré. Nous avons demandé à Tim d'avoir accès a ses données pour que nous puissions reproduire le test, et s'il pouvait vérifier la version de MySQL sur sa machine pour voir ce qui n'allait pas. Il a promis qu'il nous contacterait mais n'a rien fait à ce jour. A cause de cela, nous ne pouvons pas non plus avoir confiance en ce test. Avec le temps qui passe, les technologies évoluent, et les tests précédents ne sont désormais plus valables. Le serveur MySQL dispose d'un jeu de gestionnaires de tables, avec des choix très comment les tests ci?dessus s'effectuent avec les différents gestionnaires de tables de MySQL. PostgreSQL a aussi, bien sûr, de nouvelles fonctionnalités depuis que ces tests ont été menés. Comme ces tests ne sont pas publiquement disponibles, il n'y a pas moyen pour nous de savoir comment les bases se comportent de nos jours avec ces tests. Conclusion : Les seuls tests qui existent aujourd'hui, disponibles au téléchargement pour tous, et que vous pouvez exécuter avec MySQL, PostgreSQL sont les tests de MySQL. Chez MySQL AB, nous croyons que les bases de données Open Source devraient être testées avec des outils Open Source ! C'est le seul moyen de nous assurer que personne ne peut faire de tests que personne ne peut reproduire, et les utiliser pour proclamer que sa base est meilleure que les autres. Sans connaître le fond des choses, il est impossible de répondre à une telle déclaration. Ce que nous trouvons étrange est que chaque test que nous avons vu à propos de PostgreSQL est impossible à reproduire, et indique que PostgreSQL est le meilleur dans la plupart des tests, alors que les nôtres , que tout le monde peut reproduire, montrent le contraire. Avec cela, nous ne voulons pas dire que PostgreSQL n'est pas bon dans de nombreuses tâches (il l'est !!), ou qu'il n'est pas plus rapide que MySQL dans certaines conditions. Nous voulons juste voir un test équitable où PostgreSQL se comporte bien, pour que nous puissions avoir une compétition amicale ! Pour plus d'informations sur nos tests, voyez La suite de tests comparatifs de MySQL . Nous travaillons actuellement sur une suite de tests de perfomance qui inclue des tests multi utilisateurs, et une meilleure documentation sur les tests individuels pour indiquer ce qu'ils font et comment ajouter d'autres tests à la suite. 1.9.2.3 Performances comparées de MySQL et PostgreSQL 58 2 Installation de MySQL Ce chapitre décrit comment obtenir et installer MySQL : Pour une liste de sites à partir desquels vous pouvez obtenir MySQL, voyez Comment • Pour savoir quelles plate?formes sont supportées, voyez Systèmes d'exploitation supportés • pour faire fonctionner MySQL. Certains sont plus robustes et efficaces que d'autres, voyez Plusieurs versions de MySQL sont disponibles à la fois sous forme de binaires ou de code • source. Nous fournissons aussi un accès public à notre arbre source aux personnes souhaitant suivre les derniers développements et nous aider à tester le nouveau code. Pour Les instructions d'installation à partir des binaires ou des sources sont données dans • Chacun de ces jeux d'instructions inclut une partie sur des problèmes spécifiques que vous pourriez rencontrer. Pour les procédures consécutives à l'installation, voyez Configuration et tests consécutifs à • sources ou à partir des binaires. 2.1 Installation standard rapide de MySQL 2.1.1 Installer MySQL sous Linux Il est recommandé d'installer MySQL sous Linux en utilisant un fichier RPM. Les RPM de MySQL sont actuellement compilé sur une RedHAt en version 6.2, mais devraient fonctionner sur toute autre version de Linux qui supporte rpm et utilise glibc . Si vous avez des problèmes avec un fichier RPM, si vous obtenez par exemple l'erreur `` Sorry, the host 'xxxx' could not be looked uples distribution binaires . Les fichiers RPM dont vous pourriez avoir besoin sont : MySQL? • Le serveur MySQL. Vous en aurez besoin à moins que vous ne vouliez que vous connecter à un serveur MySQL tournant sur une autre machine. MySQL?client? • Les programmes clients MySQL standards. Vous avez certainement besoin d'installer ce paquet. MySQL?bench? • Tests et bancs d'essai. Nécessite Perl et les modules RPM msql?mysql?modules. MySQL?devel? • 2 Installation de MySQL 59 Manuel MySQL 4.1.x ? Version Française Librairies et fichiers d'inclusions dont vous aurez besoin pour compiler d'autres clients MySQL, tels que les modules Perl. MySQL? • Celui?ci contient le code source de tous les paquets précédents. Il peut donc être utilisé pour construire des fichiers RPM pour d'autres architectures (par exemple, l'Alpha ou le SPARC). Pour voir tous les fichiers présents dans un paquet RPM, lancez : shell> rpm ?qpl MySQL? Pour effectuer une installation standard minimale, lancez : shell> rpm ?i MySQL? MySQL?client? Pour installer uniquement le paquet du client MySQL, lancez : shell> rpm ?i MySQL?client? Le fichier RPM place les données dans /var/lib/mysql . Le RPM crée aussi les entrées appropriées dans /etc/rc.d/ pour lancer le serveur automatiquement au démarrage. (Cela signifie que, si vous avez déjà effectué une installation auparavant, vous pouvez avoir besoin de faire une sauvegarde de vos fichiers de démarrage précédents si vous les changez, de façon à ne pas les perdre.)Après l'installation des fichiers RPM, le démon mysqld devrait fonctionner et vous l'installation . Si quelque chose se passe mal, vous pouvez trouver davantage d'informations dans le chapitre d'installation des binaires. Installer une distribution binaire de MySQL . 2.1.2 Installer MySQL sous Windows Le serveur MySQL pour Windows est disponible sous deux formes : La forme binaire contient un programme de configuration qui installe tout ce dont vous avez • besoin de telle façon que vous puissiez démarrer le serveur immédiatement. La distribution sous forme de code source contient tout le code et les fichiers de support • distribution sous forme de sources pour Windows . En règle générale, vous devriez utiliser la distribution aurez besoin des choses suivantes : Un système d'exploitation Windows 32?bit tel que Windows 9x, Me, NT, 2000, ou XP. La • famille NT (NT, Windows 2000 et XP) permet de faire fonctionner le serveur MySQL en tant tables de plus de 4 Go, vous devez installer MySQL sur un système de fichiers NTFS ou supérieur. N'oubliez pas d'utiliser MAX_ROWS et AVG_ROW_LENGTH quand vous créez les Support du protocole TCP/IP. • Une copie du binaire ou de la distribution MySQL pour WIndows, qui peut être téléchargée • fichier au format zip et nous vous recommandons l'utilisation d'un client FTP adéquat qui supporte la reprise des transferts afin d'éviter des problèmes de corruption de fichiers pendant le téléchargement. Un programme d'extraction • ZIP pour décompresser le fichier de la distribution. Suffisamment d'espace disque pour décompresser, installer et créer les bases de données • en relation avec vos besoins. 2.1.2 Installer MySQL sous Windows 60 Manuel MySQL 4.1.x ? Version Française Si vous envisagez de vous connecter à MySQL via • ODBC , vous aurez aussi besoin du pilote MyODBC . Support ODBC pour MySQL . 2.1.2.1 Installation des binaires Si vous travaillez avec les serveurs NT/2000/XP, loguez?vous en utilisateur avec les • permissions d'administrateur. Si vous faites une mise à jour d'une version plus récente de MySQL, il est nécessaire • d'arrêter le serveur. Si vous utilisez le serveur en tant que service, utilisez : C:\> NET STOP MySQL Dans les autres cas, utilisez : C:\mysql\bin> mysqladmin ?u root shutdown Avec les serveurs NT/2000/XP, si vous voulez changer l'exécutable du serveur (e.g., ?max • or ?nt), il est aussi nécessaire de stopper le service : C:\mysql\bin> mysqld?max?nt ??remove Dézipper les fichiers dans un emplacement temporaire. • Exécutez le fichier • pour commencer l'installation. Si vous voulez l'installer à un autre emplacement que celui pas défaut c:\mysql , utilisez le bouton Parcourir pour spécifier un emplacement. Terminer le processus d'installation. • 2.1.2.2 Préparation de l'environnement MySQL de Windows A partir de la version 3.23.38 de MySQL, la distribution Windows inclut le binaire du serveur normal et le binaire du serveur MySQL?Max. Voici une liste des différents serveurs MySQL que vous pouvez utiliser : Binaire Description Compilé avec débogage total et vérification automatique de l'allocation de mysqld mémoire, liens symboliques, tables InnoDB et BDB. mysqld?opt Binaire optimisé sans le support des tables transactionnelles. Binaire optimisé pour NT/2000/XP sans support des tunnels nommés. Vous mysqld?nt pouvez faire fonctionner cette version sur Windows 9x/Me, mais dans ce cas, les tunnels nommés ne sont pas crées et vous devez avoir TCP/IP installé. Binaire optimisé avec support des liens symboliques et des tables InnoDB et mysqld?max BDB. mysqld?max?nt Comme mysqld?max , mais compilé avec le support des tunnels nommés. A partir de la version 3.23.50, les tunnels nommés ne sont activés que si on démarre mysqld avec ??enable?named?pipe . Tous les binaires précédents sont optimisés pour le processeur Pentium Pro mais devraient fonctionner avec n'importe quel processeur Intel >= i386. Vous devrez utiliser un fichiers d'options pour spécifier votre configuration MySQL dans les circonstances suivantes : Le répertoire d'installation ou de données est différent de ceux par défaut ( • c:\mysql et c:\mysql\data ). Vous voulez utilisez l'un de ces serveurs : • ? 2.1.2.1 Installation des binaires 61 Manuel MySQL 4.1.x ? Version Française mysqld? ? mysqld?max? ? Vous avez besoin de paramétrer la configuration du serveur. • Normalement, vous pouvez utiliser l'outil WinMySQLAdmin pour éditer le fichier d'options . Dans ce cas, vous n'avez pas à vous soucier de ce qui suit. Il y'a deux fichiers d'options avec la même fonction : et . Toutefois, pour éviter la confusion, il est préférable de n'en utiliser qu'un seul. Les deux fichiers sont en texte plein. Le fichier , si utilisé, doit être crée dans le répertoire racine du lecteur C. Le fichier , si utilisé, doit être crée dans le répertoire système de Windows. (Ce répertoire est souvent nommé C:\WINDOWS ou C:\WINNT . Vous pouvez déterminer sa valeur exacte en regardant la valeur de la variable d'environnement windir .) MySQL regarde en premier le fichier , puis le fichier . Si votre PC utilise un système de boot ou le lecteur C n'est pas le lecteur de boot, votre seule option est d'utiliser le fichier . Notez aussi que si vous utilisez l'outil WinMySQLAdmin , celui?ci n'utilisera que le fichier . Le répertoire \mysql\bin contient un fichier d'aide avec les instruction pour utiliser cet outil. En utilisant , créez le fichier d'options et éditez la section [mysqld] pour spécifier les valeurs des paramètres basedir et datadir : [mysqld] # set basedir to installation path, e.g., c:/mysql basedir=le_dossier_d'installation # set datadir to location of data directory, # e.g., c:/mysql/data or d:/mydata/data datadir=le_dossier_des_données Notez que les chemins de Windows doivent être spécifiés dans les fichiers d'options en utilisant des slashes normaux ( / ) au lieu des backslashes ( \ ). Si vous utilisez des backslashes, vous devez les doubler. Si vous voulez utiliser un répertoires de données autre que c:\mysql\data , vous devez copier le contenu entier du dossier c:\mysql\data au nouvel endroit. Si vous voulez utiliser les tables transactionnelles InnoDB , vous aurez besoin de créer manuellement deux nouveaux répertoires pour contenir les les données et les logs InnoDB, c:\ibdata et c:\iblogs . Vous aurez aussi besoin d'ajouter quelques lignes supplémentaires dans le fichier d'options. Options de démarrage InnoDB . Si vous ne voulez pas utiliser les tables InnoDB , ajoutez l'option skip?innodb au fichier d'options. Maintenant, vous pouvez commencer à tester le démarrage du serveur. 2.1.2.3 Démarrer le serveur pour la première fois Tester à partir d'une console DOS est la meilleure chose à faire car le serveur affiche des messages qui y apparaissent. Si quelque chose n'est pas bon dans votre configuration, ces messages vous aiderons à identifier et corriger le problème. Assurez?vous d'être dans le répertoire où se situe le serveur, puis entrez cette commande : 2.1.2.3 Démarrer le serveur pour la première fois 62 Manuel MySQL 4.1.x ? Version Française C:\mysql\bin> mysqld?max ??standalone Vous devriez voir ce qui suit pendant le démarrage du serveur : InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist: InnoDB: a new database to be created! InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200 InnoDB: Database physically writes the file full: wait... InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280 InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be created InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280 InnoDB: Doublewrite buffer not found: creating new InnoDB: Doublewrite buffer created InnoDB: creating foreign key constraint system tables InnoDB: foreign key constraint system tables created 011024 10:58:25 InnoDB: Started Windows . 2.2 Notes générales à propos de l'installation Methods of Installation, , , 2.2.1 Comment obtenir MySQL ? courante et les instructions de téléchargement.Notre miroir principal est situé sur informations à propos des futurs miroirs et de quoi nous informer de la non?validité de l'un d'entre eux. 2.2.2 Systèmes d'exploitation supportés par MySQL Nous utilisons GNU Autoconf , alors il est possible de porter MySQL sur tous les systèmes modernes qui utilisent les threads Posix et un compilateur C++. Pour compiler uniquement le client, un compilateur C++ est simplement nécessaire. Nous utilisons et développons le logiciel nous?même, en commençant par Sun Solaris (Versions 2.5 ? 2.7) et SuSE Linux version 7.x. Notez que pour de nombreux systèmes d'exploitation, le support natif des threads ne fonctionne qu'avec les dernières versions. MySQL a été compilé avec succès sur les combinaisons système d'exploitation/package de threads suivants : AIX 4.x, 5.x avec les threads natifs. Notes sur IBM?AIX . • Amiga. • BSDI 2.x avec le package MIT?pthreads. Notes relatives aux versions 2.x de BSD/OS . • BSDI 3.0, 3.1 et 4.x avec les threads natifs. Notes relatives aux versions 2.x de BSD/OS . • DEC Unix 4.x avec les threads natifs. Notes sur Alpha?DEC?UNIX (Tru64) . • FreeBSD 2.x avec le package MIT?pthreads. Notes relatives à FreeBSD . • FreeBSD 3.x et 4.x avec les threads natifs. Notes relatives à FreeBSD . • 2.2 Notes générales à propos de l'installation 63 Manuel MySQL 4.1.x ? Version Française HP?UX 10.20 avec les threads DCE ou avec le package MIT?pthreads. Notes sur HP?UX • HP?UX 11.x avec les threads natifs Notes sur HP?UX Version 11.x . • Linux 2.0+ avec LinuxThreads 0.7.1+ ou • glibc 2.0.7+. Notes relatives à Linux (toutes les Mac OS X. Notes relatives à Mac OS X . • NetBSD 1.3/1.4 Intel et NetBSD 1.3 Alpha (requiert GNU make). Notes relatives à NetBSD . • OpenBSD > 2.5 avec les threads natifs. OpenBSD < 2.5 avec le package MIT?pthreads. • OS/2 Warp 3, FixPack 29 et OS/2 Warp 4, FixPack 4. Notes relatives à OS/2 . • SGI Irix 6.x avec les threads natifs. Notes sur SGI Irix . • Solaris 2.5 et plus récent, avec les threads natifs sur SPARC et x86. Notes relatives à • SunOS 4.x avec le package MIT?pthreads. Notes relatives à Solaris . • Caldera (SCO) OpenServer avec un port récent du package FSU Pthreads. Notes sur • Caldera (SCO) UnixWare 7.0.1. Notes sur Caldera Unixware Version 7.0 . • Tru64 Unix • Windows 9x, Me, NT, 2000 et XP. Notes relatives à Windows . • Notez que toutes les plate?formes ne sont pas équipées de la même façon pour faire fonctionner MySQL. Les capacités d'une plateforme pour supporter de fortes charges avec MySQL est déterminé par ceci : Stabilité générale de la librairie de threads. Une plateforme qui a une excellente réputation • en général, mais une librairie de threads instable, dont le code est utiisé par MySQL, même si le reste est parfait, fera de MySQL une application instable. La capacité du noyeau et/ou de la librairie de threads de profiter des capacités • multi?processeurs, symétrique ou pas. En d'autres termes, lorsqu'un processus crée un thread, il doit être possible pour ce thread de s'exécuter sur différents processeurs. La capacité du noyau et/ou de la librairie de threads de faire fonctionner de nombreux • threads qui posent et lévent des verrous mutex en peut de temps, fréquemment, sans changement de contexte excessif. En d'autres termes, si l'implémentation de pthread_mutex_lock() est trop soucieux du temps CPU, cela va ralentir sérieusement MySQL. Si ce problème n'est pas réglé, ajouter des processeurs supplémentaires va finalement ralentir MySQL. Performance et stabilité générale du système de fichiers. • La capacité du système d'exploitation de gérer de grands fichiers, et de le faire • efficacement, si vos tables sont grandes. Notre niveau d'expertise avec la plate?forme, chez MySQL AB. Si vous connaissons bien • une plate?forme, vous pourront introduire des optimisations et des corrections spécifiques à la plate?forme, et activé lors de la compilation. Nous pouvons aussi fournir des conseils judicieux pour cnofigurer votre système optimalement pour MySQL. Le temps de tests que vous avons consacré à des configurations similaires, en interne. • Le nombre d'utilisateur de MySQL qui font fonctionner MySQL avec succès sur cette • plate?forme, avec des configurations similaires. SI ce nombre est grand, les chances de rencontrer un problème spécifique sont faibles. En se basant sur les critères précédents, les meilleures plate?forme pour MySQL sont x86 avec SuSE Linux 7.1, 2.4 kernel, et ReiserFS (ou toute autre distribution Linux similaire) et SPARC avec Solaris 2.7 ou 2.8. FreeBSD vient en troisième, mais nous espérons bien le voir rejoindre le groupe de tête, une fois que la librairie de threads sera améliorée. Nous espérons aussi être bientôt capables d'ajouter les autres plate?formes sur laquelle MySQL compile, et fonctionne correctement, mais pas toujours le bon niveau de stabilité et de performances. Cela réclame des efforts de notre 2.2 Notes générales à propos de l'installation 64 Manuel MySQL 4.1.x ? Version Française part, en coopération avec les développeurs de ces plate?formes. Si vous êtes interessés par l'amélioration de ces composants, et que vous êtes en position pour influencer le développement, demandez des instructions détaillées à MySQL en envoyant un email à . Notez bien que la comparaison précédente ne signifie pas qu'un système d'exploitation est meilleur que l'autre, en général. Nous avons classé les systèmes en fonction de leur capacité à faire fonctionner un système MySQL, et nous nous limitons à cette comparaison. Avec cela en tête, le résultat de cette comparaison serait différent si nous y ajoutions d'autres problèmes. Et dans certains cas, la seule raison qui fait qu'un OS est meilleur que l'autre est parce que nous y avons consacré plus de temps, pour optimiser et tester. Nous nous bornons à exprimer notre point de vue pour vous aider à décider quelle plate forme choisir pour votre serveur MySQL. 2.2.3 Quelle version de MySQL utiliser ? La première décision à prendre est de savoir si vous voulez utiliser la dernière version de développement ou la dernière version stable : En règle générale, si vous utilisez MySQL pour la première fois ou si vous essayer de le • porter vers un système pour lequel il n'existe pas de distribution binaire, nous vous recommandons d'utiliser la dernière version stable (actuellement la version 3.23). Notez que toutes les versions de MySQL sont passées aux bancs de test MySQL avant chaque sortie (même les versions de développement). D'autre part, si vous utilisez un vieux système et que vous voulez procéder à une mise à • jour, sans pour autant risquer de mettre à jour sans raison, vous devriez mettre à jour vers la dernière version de la même branche que celle que vous êtes en train d'utiliser (dans le cas où un numéro de version supérieur existe). Nous avons essayé de résoudre uniquement les bogues fatals et de produire des patchs petits et sûrs pour cette version. La seconde décision est de déterminer si vous devez utiliser une distribution source ou binaire. Dans la plupart des cas, vous devrez utiliser une distribution binaire, si celle?ci existe pour votre plate?forme, car elle s'installera certainement plus facilement qu'une distribution source. Dans les cas suivants, vous devrez opter pour une installation à partir des sources : Si vous voulez installer MySQL à un endroit particulier. (Les distributions binaires standards • sont ``prêtes à l'emploi'' à n'importe quel endroit, mais vous pouvez vouloir davantage de flexibilité). Pour être apte à satisfaire les différents besoins des utilisateurs, nous fournissons deux • distributions binaires : une compilée avec le support du gestionnaire de tables non transactionnel (un binaire petit et rapide), et une autre configurée avec la plupart des options avancées, telles que le support des transactions. Les deux versions sont compilées à partir des mêmes sources. Tous les clients natifs MySQL peuvent se connecter aux deux distribution binaire avancée est marquée du suffixe ?max et est configurée avec les mêmes options que mysqld?maxmysqld . Si vous souhaitez utiliser des fichiers RPM de MySQL?Max, vous devez tout d'abord installer les RPM MySQL standards. Si vous voulez configurer • mysqld avec certaines options supplémentaires qui ne sont pas présentes dans les distributions binaires standards. Ci?dessous, une liste des options les plus courantes que vous pourriez vouloir utiliser : ??with?innodb ? ??with?berkeley?db ? 2.2.3 Quelle version de MySQL utiliser ? 65 Manuel MySQL 4.1.x ? Version Française ??with?raid ? ??with?libwrap ? ??with?named?z?lib (Ceci est appliqué à certains binaires) ? ??with?debug[=full] ? La distribution binaire standard est normalement compilée avec le support de tous les jeux • de caractères et sont supposés fonctionner sur nombre de processeurs de la même vous souhaitez un serveur MySQL plus véloce, vous pouvez vouloir le recompiler juste avec le support des jeux de caractères dont vous avez besoin, utiliser un meilleur compilateur (comme pgcc ), ou utiliser des options de compilations davantage optimisées pour votre processeur. Si vous avez rencontré des bogues et que vous les avez rapporté à l'équipe de • développement MySQL, vous recevrez probablement un patch que vous devrez appliquer à la distribution source pour que le bogue soit résolu. Si vous voulez consulter (et/ou modifier) le code C et C++ qui compose MySQL, vous • devrez obtenir une distribution source. Le code source est toujours la solution ultime. Les distributions sources contiennent aussi davantage de tests et d'exemples que les distributions binaires. La politique de nommage de MySQL utilise des numéros de version qui consiste en trois nombres suivis d'un suffixe. Par exemple, une version nommée mysql?3.21.17?beta doit être interprétée de la façon suivante : Le premier nombre ( • 3 ) décrit le format de fichier. Toutes les versions 3 ont le même format de fichier. Le second nombre ( • 21 ) correspond au niveau de version. Normalement, il y a le choix entre deux d'entre eux. L'un correspond à la version/branche stable (actuellement 23 ) et l'autre se réfère à la branche de développement (actuellement 4.0 ). Normalement, les deux versions sont stables, mais la version de développement peut comporter des lacunes, manquer de documentation sur des nouvelles fonctionnalités, ou peut ne pas compiler sur certains systèmes. Le troisième nombre ( • 17 ) est le numéro de version au sein du niveau de version. Celui?ci est incrémenté à chaque nouvelle publication. En temps normal, vous souhaiterez utiliser la dernière version du niveau de version que vous avez choisi. Le suffixe ( • beta ) indique le niveau de stabilité de la version. Les suffixes possibles sont : alpha ? indique que la publication contient de grandes portions de nouveau code qui n'a pas été testé à 100%. Les bogues connus (d'ordinaire, il n'y en a aucun) doivent aussi de nouvelles commandes et extensions dans la plupart des versions alpha. Du développement actif qui inclut des changements majeurs dans le code peut concerner les versions alpha, mais tout sera testé avant de faire une publication. Il ne devrait pas y avoir de bogues connus dans les publications de MySQL. beta ? signifie que tout le nouveau code a été testé. Aucune fonctionnalité majeure qui pourrait causer corruption du code n'est ajoutée. Il ne doit pas y avoir un seul bogue connu. Une version alpha passe en beta quand il n'y a pas eu de bogue fatal rapporté depuis au moins un mois et que nous ne prévoyons pas de nouvelle fonctionnalité qui pourrait corrompre d'anciennes commandes. gamma ? est une version bêta qui existe depuis un certain temps et qui semble fonctionner correctement. Seulement des changements mineurs sont effectués. C'est ce que de nombreuses autres compagnies appellent une publication. S'il n'y a pas de suffixe, cela signifie que la version fonctionne depuis un certain ? temps sur différents sites avec aucun rapport de bogue autre que des bogues spécifiques à une plate?forme. Seuls des corrections critiques sont appliquées à la publication. C'est ce que l'on appelle une version stable. 2.2.3 Quelle version de MySQL utiliser ? 66 Manuel MySQL 4.1.x ? Version Française Toutes les versions de MySQL passent par nos tests et bancs d'essais standards pour nous assurer qu'elles peuvent être utilisées sans danger. Les séries de tests s'améliorent en permanence car les tests standards sont étendus dans le temps pour traquer tous les bogues précédemment trouvées. Notez bien que toutes les versions de MySQL ont été testées au moins avec : Une batterie de tests internes C'est une reproduction d'un système de production client. Il comporte de nombreuses tables avec des centaines de Mo de données. Les bancs de tests MySQL Ils effectuent une série de requêtes communes. C'est aussi un test pour savoir si le comparatifs de MySQL . Le test crash?me Il tente de déterminer de quelles fonctionnalités disposent les bases de données et quelles en sont les limites. La suite de tests comparatifs de MySQL . Un autre test provient du fait que nous avons la version la plus récente de MySQL dans notre propre environnement de production interne, sur au moins une machine. Nous avons plus de 100 Go de données à manipuler. 2.2.4 Dispositions d'installation Cette section décrit les répertoires par défaut crées en installant les distributions binaires et les distributions de sources. Une distribution binaire est installée en la décompressant dans le répertoire d'installation que vous avec choisis (souvent /usr/local/mysql ) et crée les répertoires suivants à cet endroit : Répertoire Contenu du répertoire bin Programmes clients et le serveur mysqld data Fichiers de log et bases de données include Fichiers (entêtes) inclus lib Librairies scripts mysql_install_db share/mysql Fichiers de messages d'erreurs sql?bench Benchmarks Une distribution des sources est installée après que vous l'ayez configuré et compilé. Par défaut, l'installation se fait dans /usr/local , dans les sous?répertoires suivants : Répertoire Contenu du répertoire bin Programmes clients et scripts include/mysql Fichiers (entêtes) inclus info Documentation au format Info lib/mysql Librairies libexec Le serveur mysqld share/mysql Fichiers de messages d'erreurs sql?bench Benchmarks et test crash?me var Fichiers de log et bases de données 2.2.4 Dispositions d'installation 67 Manuel MySQL 4.1.x ? Version Française Dans le répertoire d'installation, les dispositions d'une installation des sources diffère d'une installation binaire des façons suivantes : Le serveur • mysqld est installé dans le répertoire libexec plutôt que dans le répertoire bin . Le répertoire des données est • var plutôt que data . mysql_install_db • est installé dans le répertoire /usr/local/bin plutôt que dans /usr/local/mysql/scripts . Le répertoire des fichier d'entête et les répertoires des librairies sont • include/mysql et lib/mysql au lieu de include et lib . Vous pouvez créer votre propre installation binaire à partir d'une distribution de sources compilées en exécutant le script scripts/make_binary_distribution . 2.2.5 Quand et comment sont publiées les nouvelles versions MySQL évolue rapidement ici, à MySQL AB, et nous voulons le partager avec les autres utilisateurs de MySQL. Nous essayons de faire une nouvelle version à chaque fois que nous avons implanté des fonctionnalités qui seront utiles à d'autres. Nous essayons aussi d'aider les utilisateurs dont les requêtes sont faciles à programmer. Nous prenons en considération tout ce que nos clients nous demandent, et nous accordons une attention particulière à nos clients qui ont pris une licence e?mail étendue. Personne n'est obligé de télécharger une nouvelle version. La sections News vous indiquera si la nouvelle version contient une fonctionnalité que vous attendez. Historique des versions de MySQL . Nous utilisons la politique suivante, lors de la mise à jour de MySQL : Pour chaque modification mineure, le dernier numéro de la chaîne de version est • incrémenté. Lorsqu'il y a des nouvelles fonctionnalités importantes ou des incompatibilité mineures avec la version précédente, nous incrémentons le chiffre du milieu. Lorsque le format de fichier change, le premier numéro est incrémenté. Des versions tables et testées sont publiées une à deux fois dans l'année, mais si de petits • bogues apparaissent, une version qui ne va corriger que ces bogues sera publiée. Des versions fonctionnelles avec des corrections de bogues pour les vieilles versions sont • publiées toutes les 1 à 8 semaines. Les distributions binaires de certaines plate?formes seront compilées par nos soins pour les • versions majeures. D'autres personnes font des versions binaires pour d'autres systèmes, mais probablement moins fréquemment. Nous rendons généralement public les correctifs, une fois que nous avons découverts de • prochaine version. Pour les bogues non critiques mais ennuyant, nous allons les ajouter dans le serveur de • sources de MySQL, et ils seront publiés dans la prochaine version. Si il y a un bogue fatal dans une version, nous publierons une nouvelle version aussitôt que • possible. Nous apprécions que les autres éditeurs fasse la même chose. La version stable actuelle est la version 3.23; nous avons déjà commencé à développer activement la version 4.0. Les bogues seront corrigés dans cette version. Nous ne croyons pas à un gel complet, car cela laisserait en plan des corrections de bogues, et des listes de souhaites. ``Un peu gelé'' signifie que nous pourrions apporter de petits ajouts qui ``n'affecterons pas presque sûrement pas le fonctionnement''.MySQL utilise un système de numérotation légèrement différent pour les 2.2.5 Quand et comment sont publiées les nouvelles versions 68 Manuel MySQL 4.1.x ? Version Française autres produits. En général, il est relativement sûr d'utiliser une version qui a été publiée il y a quelques semaines sans être remplacée par une nouvelle version. 2.2.6 Binaires compilés par MySQL AB Comme service, nous, MySQL AB, proposons un jeu de distributions binaires de MySQL qui sont compilés sur nos machines, ou les machines auxquelles nos clients nous ont gentiment donné accès. Ces distributions sont générées avec le script scripts/make_binary_distribution et sont configurés avec les compilateurs et options suivantes : SunOS 4.1.4 2 sun4c avec gcc 2.7.2.1 CC=gcc CXX=gcc CXXFLAGS="?O3 ?felide?constructors" ./configure ??prefix=/usr/local/mysql ??disable?shared ??with?extra?charsets=complex ??enable?assembler SunOS 5.5.1 (et plus) sun4u avec egcs 1.0.3a ou 2.90.27 ou gcc 2.95.2 et plus récent CC=gcc CFLAGS="?O3" CXX=gcc CXXFLAGS="?O3 ?felide?constructors ?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql ??with?low?memory ??with?extra?charsets=complex ??enable?assembler SunOS 5.6 i86pc avec gcc 2.8.1 CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure ??prefix=/usr/local/mysql ??with?low?memory ??with?extra?charsets=complex Solaris 2.8 sparc avec gcc 2.95.3 CC=gcc CFLAGS="?O3 ?fno?omit?frame?pointer" CXX=gcc CXXFLAGS="?O3 ?fno?omit?frame?pointer ?felide?constructors ?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql "??with?comment=Official MySQL binary" ??with?extra?charsets=complex "??with?server?suffix=" ??enable?thread?safe?client ??enable?local?infile ??enable?assembler ??disable?shared Linux 2.0.33 i386 avec pgcc 2.90.29 ( egcs 1.0.3a) CFLAGS="?O3 ?mpentium ?mstack?align?double" CXX=gcc CXXFLAGS="?O3 ?mpentium ?mstack?align?double ?felide?constructors ?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql ??enable?assembler ??with?mysqld?ldflags=?all?static ??with?extra?charsets=complex Linux 2.2.x avec x686 avec gcc 2.95.2 CFLAGS="?O3 ?mpentiumpro" CXX=gcc CXXFLAGS="?O3 ?mpentiumpro ?felide?constructors ?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql ??enable?assembler ??with?mysqld?ldflags=?all?static ??disable?shared ??with?extra?charsets=complex SCO 3.2v5.0.4 i386 avec gcc 2.7?95q4 CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure ??prefix=/usr/local/mysql ??with?extra?charsets=complex AIX 2 4 avec gcc 2.7.2.2 CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure ??prefix=/usr/local/mysql ??with?extra?charsets=complex OSF/1 V4.0 564 alpha avec gcc 2.8.1 2.2.6 Binaires compilés par MySQL AB 69 Manuel MySQL 4.1.x ? Version Française CC=gcc CFLAGS=?O CXX=gcc CXXFLAGS=?O3 ./configure ??prefix=/usr/local/mysql ??with?low?memory ??with?extra?charsets=complex Irix 6.3 IP32 avec gcc 2.8.0 CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure ??prefix=/usr/local/mysql ??with?extra?charsets=complex BSDI BSD/OS 3.1 i386 avec gcc 2.7.2.1 CC=gcc CXX=gcc CXXFLAGS=?O ./configure ??prefix=/usr/local/mysql ??with?extra?charsets=complex BSDI BSD/OS 2.1 i386 avec gcc 2.7.2 CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure ??prefix=/usr/local/mysql ??with?extra?charsets=complex FreeBSD 4.4?stable i386 avec gcc 2.95.3 CC=gcc CFLAGS="?O3 ?fno?omit?frame?pointer" CXX=gcc CXXFLAGS="?O3 ?fno?omit?frame?pointer ?felide?constructors ?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql "??with?comment=Official MySQL binary" ??with?extra?charsets=complex "??with?server?suffix=" ??enable?thread?safe?client ??enable?local?infile ??enable?assembler ??with?named?z?libs=not?used ??disable?shared Si vous avez des options plus optimales pour l'une des configurations précédement listées, vous pouvez toujours nous en faire part sur la liste de distribution des développeurs ( ). Les distributions RPM antérieures à la version 3.22 de MySQL sont contribuées par nos utilisateurs. A partir de la version 3.22, les RPM sont générés par nous chez MySQL AB. Si vous voulez compiler une version de débogage de MySQL, vous devez ajouter ??with?debug ou ??with?debug=full aux lignes de configurations précédentes et effacer les options ?fomit?frame?pointer . Pour les distributions Windows, voyez Installer MySQL sous Windows . 2.2.7 Installer MySQL à partir d'une distribution binaire Construction du programme client . Vous aurez besoin des outils suivants pour installer les binaires MySQL : GNU • gunzip pour décompresser la distribution. Un programme • tar pour désarchiver la distribution. GNU tar est connu pour fonctionner. Le tar de Sun connaît quelques problèmes. L'utilisation de fichiers RPM (RedHat Package Manager) est une autre façon d'installer MySQL sous Linux. Installer MySQL sous Linux .Si vous rencontrez des problèmes, utilisez toujours mysqlbugbogue, mysqlbug rassemble des informations sur le système qui aidera les autres à résoudre votre problème. En n'utilisant pas mysqlbug , vous amoindrissez vos chances d'obtenir une solution à votre problème ! Vous trouverez mysqlbug dans le répertoire scripts après avoir désarchivé la distribution. Comment rapporter des bogues ou problèmes . 2.2.7 Installer MySQL à partir d'une distribution binaire 70 Manuel MySQL 4.1.x ? Version Française Les commandes de base que vous devez lancer pour installer et utiliser MySQL à partir des binaires sont les suivantes : shell> groupadd mysql shell> useradd ?g mysql mysql shell> cd /usr/local shell> gunzip < /path/to/mysql?VERSION? | tar xvf ? shell> ln ?s full?path?to?mysql?VERSION?OS mysql shell> cd mysql shell> scripts/mysql_install_db shell> chown ?R root . shell> chown ?R mysql data shell> chgrp ?R mysql . shell> bin/safe_mysqld ??user=mysql & or shell> bin/mysqld_safe ??user=mysql & si vous utilisez MySQL 4.x Vous pouvez ajouter des nouveaux utilisateurs en utilisant le script bin/mysql_setpermission si vous installez les modules Perl DBI et Msql?Mysql?modules . Une description plus détaillée est disponible ci?dessous. consécutifs à l'installation , pour la configuration et les tests consécutifs à l'installation : Choisissez le répertoire ou vous voulez désarchiver la distribution et déplacez?vous y. Dans • l'exemple suivant, nous désarchivons la distribution dans le répertoire /usr/local et créons un répertoire /usr/local/mysql dans lequel MySQL est installé. (Les instructions suivantes supposent bien sûr que vous avez les autorisations suffisantes pour créer des fichiers dans /usr/local . Si ce répertoire est protégé, vous aurez besoin de faire l'installation en tant que root .) Procurez?vous un fichier de distribution à partir d'un des sites cités dans Comment obtenir • MySQL .Les distributions binaires de MySQL sont fournies sous forme d'archives tar compressées et ont des noms de la forme mysql?VERSION? , où VERSION est un nombre (par exemple, 3.21.15 ), et OS indique le type de système d'exploitation pour lequel la distribution est compilée (par exemple, pc?linux?gnu?i586 ). Si vous voyez une distribution binaire avec le suffixe • ?max , cela signifie que le binaire supporte les tables avec les transactions ainsi que d'autres fonctionnalités. partir du même code source. Ajoutez un utilisateur et un groupe avec les droits desquels • mysqld fonctionnera : shell> groupadd mysql shell> useradd ?g mysql mysql Ces commandes ajoutent le groupe mysql group et l'utilisateur mysql . La syntaxe de useradd et de groupadd peut varier de façon significative suivant les versions d'Unix. Elles peuvent aussi s'appeler adduser et addgroup . Vous pouvez aussi souhaiter nommer le groupe et l'utilisateur autrement que mysql . Déplacez?vous dans le répertoire d'installation choisi : • shell> cd /usr/local Décompressez la distribution et créez le répertoire d'installation : • shell> gunzip < /chemin/de/mysql?VERSION? | tar xvf ? shell> ln ?s chemin?complet?de?mysql?VERSION?OS mysql La première commande crée un répertoire mysql?VERSION?OS . La seconde commande crée un lien symbolique vers ce répertoire. Cela vous permet de vous référer plus facilement au répertoire d'installation en appelant /usr/local/mysql . Déplacez vous dans le répertoire d'installation : • 2.2.7 Installer MySQL à partir d'une distribution binaire 71 Manuel MySQL 4.1.x ? Version Française shell> cd mysql Vous y trouverez de nombreux fichiers et sous?répertoires. Les plus importants lors de l'installation sont les sous?répertoires bin et scripts . Si vous souhaitez utiliser • mysqlaccess et placer la distribution MySQL à un endroit non standard, vous devez changer l'endroit où mysqlaccess s'attend à trouver le client mysql . Editez le script bin/mysqlaccess aux environs de la ligne 18. Cherchez une ligne qui ressemble à ceci : $MYSQL = '/usr/local/bin/mysql'; # path to mysql executable Changez le chemin pour avoir le bon endroit où mysql est actuellement stocké sur votre système. Si vous ne le faites pas, vous obtiendrez une erreur Broken pipe quand vous lancerez mysqlaccess . Créez les tables de privilèges MySQL (ceci est nécessaire si vous n'avez jamais installé • MySQL auparavant) : shell> scripts/mysql_install_db Veuillez noter que les versions de MySQL antérieures à la version 3.22.10 démarraient le serveur MySQL quand vous exécutiez mysql_install_db . Ce n'est plus le cas. Nommez • root en tant que propriétaire des binaires et l'utilisateur avec les droits duquel vous ferez fonctionner mysqld comme propriétaire du répertoire de données : shell> chown ?R root /usr/local/mysql shell> chown ?R mysql /usr/local/mysql/var shell> chgrp ?R mysql /usr/local/mysql La première commande change les attributs owner en faveur de l'utilisateur root , la seconde change les attributs owner du répertoire de données en faveur de l'utilisateur mysql , et la troisième change les attributs group en faveur du groupe mysql . Si vous voulez installer le support de l'interface Perl • DBI / DBD , référez?vous à Si vous souhaitez que MySQL se lance automatiquement au démarrage de votre machine, • vous pouvez copier support?files/mysql.server à l'endroit où votre système stocke ses fichiers de démarrage. Davantage d'informations sont disponibles dans le script support?files/mysql.serverautomatiquement . Après que tout soit installé, vous devez initialiser et tester votre distribution : shell> /usr/local/mysql/bin/safe_mysqld ??user=mysql & consécutifs à l'installation . 2.3 Installer MySQL à partir des sources Avant de procéder à l'installation à partir des sources, vérifiez auparavant que notre distribution binaire pour votre plate?forme ne fonctionne pas. Nous faisons un maximum d'efforts pour nous assurer que nos binaires sont compilés avec les meilleures options possibles. Vous avez besoin des outils suivants pour compiler et installer MySQL à partir des sources : GNU • gunzip pour décompresser la distribution. Un programme • tar pour désarchiver la distribution. GNU tar est connu pour fonctionner. Le tar de Sun connaît quelques problèmes. Un compilateur C++ ANSI fonctionnel. • gcc >= 2.95.2, egcs >= 1.0.2 ou egcs 2.91.66 , SGI C++, et SunPro C++ sont quelques?uns des compilateurs réputés pour fonctionner. libg++ n'est pas nécessaire si vous utilisez gcc . gcc 2.7.x souffre d'un bogue qui l'empêche de compiler quelques fichiers C++ correctement écrits, tels que 2.3 Installer MySQL à partir des sources 72 Manuel MySQL 4.1.x ? Version Française . Si vous disposez seulement de gcc 2.7.x, vous devez mettre à jour votre gcc afin de compiler MySQL. gcc 2.8.1 est aussi reconnu pour rencontrer des problèmes sur certaines plate?formes, il devrait donc être désactivé si un autre compilateur existe pour la plate?forme. gcc >= 2.95.2 est recommandé pour compiler MySQL dans ses versions 3.23.x. Un bon programme • make . GNU make est une fois de plus recommandé et est quelquefois requis. Si vous rencontrez des problèmes, nous vous recommandons d'essayer GNU make 3.75 ou supérieur. Si vous utilisez une version récente de gcc , suffisamment récente pour reconnaître l'option ?fno?exceptions , il est très important que vous l'utilisiez. Sinon, vous risquez de compiler un binaire qui crashe aléatoirement. Nous recommandons donc l'utilisation de ?felide?constructors et ?fno?rtti en même temps que ?fno?exceptions . En cas de doute, faites la chose suivante : CFLAGS="?O3" CXX=gcc CXXFLAGS="?O3 ?felide?constructors ?fno?exceptions \ ?fno?rtti" ./configure ??prefix=/usr/local/mysql ??enable?assembler \ ??with?mysqld?ldflags=?all?static Sur la plupart des systèmes, il en résultera un binaire rapide et vous rencontrez des problèmes, utilisez toujours mysqlbugMême si le problème n'est pas un bogue, mysqlbug rassemble des informations sur le système qui aidera les autres à résoudre votre problème. En n'utilisant pas mysqlbug , vous amoindrissez vos chances d'obtenir une solution à votre problème ! Vous trouverez mysqlbug dans le répertoire scripts après avoir désarchivé la distribution. Comment rapporter des bogues ou problèmes . 2.3.1 Vue d'ensemble de l'installation rapide Les commandes de base que vous devez exécuter pour installer MySQL à partir des sources sont : shell> groupadd mysql shell> useradd ?g mysql mysql shell> gunzip < mysql? | tar ?xvf ? shell> cd mysql?VERSION shell> ./configure ??prefix=/usr/local/mysql shell> make shell> make install shell> scripts/mysql_install_db shell> chown ?R root /usr/local/mysql shell> chown ?R mysql /usr/local/mysql/var shell> chgrp ?R mysql /usr/local/mysql shell> cp support?files/my? shell> /usr/local/mysql/bin/safe_mysqld ??user=mysql & ou shell> /usr/local/mysql/bin/mysqld_safe ??user=mysql & si vous utilisez MySQL 4.x. Si vous voulez avoir le support des tables InnoDB, vous devez éditer le fichier et enlever le caractère # avant le paramètre qui commence par , et Options de démarrage InnoDB .Si vous utilisez un fichier RPM source, faites : shell> rpm ??rebuild MySQL? Cela produira un fichier RPM binaire que vous pourrez pouvez ajouter des utilisateurs en lançant le script bin/mysql_setpermission si vous installez les modules Perl DBI et Msql?Mysql?modules . 2.3.1 Vue d'ensemble de l'installation rapide 73 Manuel MySQL 4.1.x ? Version Française Ci?dessous, une description plus détaillée. consécutifs à l'installation , pour la configuration et les tests consécutifs à l'installation : Notez le répertoire où vous voulez décompacter les sources et déplacez vous y. • Récupérez une distribution des sources à partir d'un des sites listés sur Comment obtenir • Si vous souhaitez utiliser les tables Berkeley DB avec MySQL, vous devez obtenir une • version modifiée du code source de Berkeley DB. Veuillez lire le chapitre relatif aux tables Berkeley DB avant de procéder. Tables BDB ou BerkeleyDB .Les distributions des sources MySQL sont fournies sous forme d'archive tar compressées et ont des noms comme mysql? , où VERSION est un nombre comme 4.0.5a. Ajoutez un utilisateur et un groupe avec les droits desquels • mysqld fonctionnera : shell> groupadd mysql shell> useradd ?g mysql mysql Ces commandes ajoutent le groupe mysql group et l'utilisateur mysql . La syntaxe de useradd et de groupadd peut varier de façon significative suivant les versions d'Unix. Elles peuvent aussi s'appeler adduser et addgroup . Vous pouvez aussi souhaiter nommer le groupe et l'utilisateur autrement que mysql . Décompressez la distribution dans le répertoire courant : • shell> gunzip < /path/to/mysql? | tar xvf ? Cette commande crée un répertoire nommé mysql?VERSION . Déplacez?vous dans le répertoire racine de la distrbution décompressée : • shell> cd mysql?VERSION Notez bien que vous devez alors configurer et compiler MySQL depuis ce répertoire racine. Vous ne pouvez pas le compiler à partir d'un autre répertoire. Configurez votre version et compilez tout : • shell> ./configure ??prefix=/usr/local/mysql shell> make Quand vous lancez la commande configure , vous pouvez spécifier quelques options. Lancez ./configure ??helpoptions habituelles de configure , traite des options les plus configure échoue, l'aide, ajoutez s'il vous plait les quelques lignes de qui pourraient selon vous aider à résoudre le problème. Ajoutez aussi les deux dernières lignes de sortie de configure si configure s'arrête précipitemment. Envoyez le rapport de bogue en utilisant le script mysqlbug . Comment rapporter des bogues ou problèmes . sur les problèmes les plus courants. Installez tout : • shell> make install Vous aurez certainement besoin de lancer cette commande en tant que root . Créez les tables de gestion des droits MySQL (ceci est nécessaire uniquement si vous • n'avez pas installé MySQL auparavant): shell> scripts/mysql_install_db Veuillez noter que les versions de MySQL antérieures à la version 3.22.10 démarraient le serveur MySQL quand vous exécutiez mysql_install_db . Ce n'est plus le cas! Nommez • root en tant que propriétaire des binaires et l'utilisateur avec les droits duquel vous ferez fontionner mysqld comme propriétaire du répertoire de données : shell> chown ?R root /usr/local/mysql shell> chown ?R mysql /usr/local/mysql/var shell> chgrp ?R mysql /usr/local/mysql 2.3.1 Vue d'ensemble de l'installation rapide 74 Manuel MySQL 4.1.x ? Version Française La première commande change les attributs owner en faveur de l'utilisateur root , la seconde change les attributs owner du répertoire de données en faveur de l'utilisateur mysql , et la troisième change les attributs group en faveur du groupe mysql . Si vous voulez installer le support de l'interface Perl • DBI / DBD , référez?vous à Si vous souhaitez que MySQL se lance automatiquement au démarrage de votre machine, • vous pouvez copier support?files/mysql.server à l'endroit où votre système stocke ses fichiers de démarrage. Davantage d'informations sont disponibles dans le script support?files/mysql.serverautomatiquement . Après que tout soit installé, vous devez initialiser et tester votre distribution : shell> /usr/local/mysql/bin/safe_mysqld ??user=mysql & Si cette commande échoue immédiatement sur un mysqld daemon ended , vous pouvez trouvez des informations dans le fichier mysql?data?directory/'hostname'.err . La raison la plus courante est que vous avez déjà un autre serveur mysqldconsécutifs à l'installation . 2.3.2 Appliquer des patches Parfois, des patches sont publiés sur la liste de diffusion ou sont placés sur la page des patches sur la liste de diffusion, sauvegardez le message qui contient le patch, placez?le dans le répertoire racine de vos sources MySQL et lancez les commandes suivantes : shell> patch ?p1 < patch?file?name shell> rm config.cache shell> make clean Les patches venant du site FTP sont distribués sous forme de fichiers en texte clair ou bien sous forme de fichiers compressés avec gzip . Appliquez un patch en texte clair de la même façon qu'avec les patches de la liste de diffusion. Pour appliquer un patch compressé, déplacez?vous dans le répertoire racine de vos sources et lancez les commandes suivantes : shell> gunzip < patch?file? | patch ?p1 shell> rm config.cache shell> make clean Après avoir appliqué un patch, suivez les instructions d'une installation normale à partir des sources, à commencer par l'étape du ./configure . Après avoir lancé le make install , redémarrez votre serveur MySQL. Vous aurez certainement besoin d'arrêter tout autre serveur MySQL avant de lancer make install . (Utilisez pour cela mysqladmin shutdown .) Certains systèmes n'autorisent pas l'installation d'une nouvelle version d'un programme ; elle remplace la version qui est en train de s'exécuter. 2.3.3 Options habituelles de configure Le script configure vous donne un bon moyen de contrôler la configuration de votre distribution MySQL. Habituellement, vous faites cela en spécifiant les options dans la ligne de commande de configure . Vous pouvez aussi affecter le comportement de configure en utilisant certaines 2.3.2 Appliquer des patches 75 Manuel MySQL 4.1.x ? Version Française supportées par configure , exécutez cette commande : shell> ./configure ??help Les options de configure les plus utilisées sont décrites ici : Pour ne compiler que les librairies et programmes clients, et non le serveur, utilisez l'option • ??without?server : shell> ./configure ??without?server Si vous n'avez pas de compilateur C++, mysql ne compilera pas (c'est le programme client qui requière C++). Dans ce cas, vous pouvez supprimer la partie de code dans configure qui vérifie l'existence d'un compilateur C++, puis exécuter ./configure avec l'option ??without?server . La compilation essaiera encore de construire mysql , mais vous pouvez ignorer les messages d'erreurs concernant . (Si make stoppe, essayez make ?k pour dire de continuer même si on rencontre des erreurs.) Si vous voulez obtenir une librairie MySQL embarquée ( • libmysqld.a ) vous devez utiliser l'option ??with?embedded?server . Si vous ne voulez pas que vos fichiers de log et bases de données soient dans • /usr/local/var , utiliser une commande configure se rapprochant de l'une des commandes suivantes : shell> ./configure ??prefix=/usr/local/mysql shell> ./configure ??prefix=/usr/local \ ??localstatedir=/usr/local/mysql/data La première change le préfixe de l'installation pour que tout soit installé dans /usr/local/mysql au lieu de /usr/local par défaut. La seconde commande préserve le préfixe d'installation par défaut mais change le répertoire par défaut pour les bases de données (normalement /usr/local/var ) en /usr/local/mysql/data . Après que vous ayez compilé MySQL, vous pouvez changer ces options dans les fichiers d'options. Fichier d'options . Si vous utilisez Unix et que vous voulez que la socket de MySQL soit à un autre endroit que • celui par défaut (normalement /tmp ou /var/run ) utilisez une commande configure comme celle?ci : shell> ./configure ??with?unix?socket? Notez que le fichier donné doit avoir un chemin absolu ! Vous pourrez aussi changer le chemin vers mysql.sockprotéger . Si vous voulez compiler des programmes liés statiquement (par exemple, pour créer une • distribution binaire, pour obtenir plus de vitesse, ou pour résoudre des problèmes avec quelques distributions RedHat Linux), exécutez configure de la manière suivante : shell> ./configure ??with?client?ldflags=?all?static \ ??with?mysqld?ldflags=?all?static Si vous utilisez • gcc et n'avez pas libg++ ou libstdc++ d'installés, vous pouvez dire à configure d'utiliser gcc en tant que compilateur C++ : shell> CC=gcc CXX=gcc ./configure Quand vous utilisez gcc en tant que compilateur C++, aucune tentative de liaison avec libg++ ou libstdc++ ne sera effectuée. Il peut être bon d'utiliser cette méthode même si vous avez les librairies citées, car quelques versions de celles?ci ont causé des problèmes à des utilisateurs MySQL par le passé.Voici quelques variables d'environnement à définir selon le compilateur que vous utilisez : Compilateur Options recommandées gcc 2.7.2.1 CC=gcc CXX=gcc CXXFLAGS="?O3 ?felide?constructors" CC=gcc CXX=gcc CXXFLAGS="?O3 ?felide?constructors egcs 1.0.3a ?fno?exceptions ?fno?rtti" gcc 2.95.2 2.3.2 Appliquer des patches 76 Manuel MySQL 4.1.x ? Version Française CFLAGS="?O3 ?mpentiumpro" CXX=gcc CXXFLAGS="?O3 ?mpentiumpro \ ?felide?constructors ?fno?exceptions ?fno?rtti" CFLAGS="?O3 ?mpentiumpro ?mstack?align?double" CXX=gcc \ pgcc 2.90.29 ou CXXFLAGS="?O3 ?mpentiumpro ?mstack?align?double plus récent ?felide?constructors \ ?fno?exceptions ?fno?rtti" Dans la plupart des cas, vous pouvez obtenir un binaire MySQL raisonnablement optimal en utilisant les options de la table précédente et en ajoutant les options suivantes aux lignes de configuration : ??prefix=/usr/local/mysql ??enable?assembler \ ??with?mysqld?ldflags=?all?static En d'autres termes, la ligne de configuration ressemble à ce qui suit pour les versions récentes de gcc : CFLAGS="?O3 ?mpentiumpro" CXX=gcc CXXFLAGS="?O3 ?mpentiumpro \ ?felide?constructors ?fno?exceptions ?fno?rtti" ./configure \ ??prefix=/usr/local/mysql ??enable?assembler \ ??with?mysqld?ldflags=?all?static compilés avec une optimisation totale et devraient être parfaits pour la plupart des pouvez modifier pour rendre le binaire encore plus rapide, mais cela est réservé aux utilisateurs avancés. Comment la compilation et les liaisons affectent la vitesse de MySQL . Si la génération échoue et produit des erreurs disant que votre compilateur ou outil de liaison n'est pas capable de créer la librairie partagée .# ( '#' étant un numéro de version), vous pouvez contourner ce problème en donnant l'option ??disable?shared à configure . Dans ce cas, configure ne générera pas de librairie partagée .# . Vous pouvez configurer MySQL pour qu'il n'utilise pas les valeurs • DEFAULT pour les colonnes non? NULL (c'est à dire, les colonnes qui ne peuvent être NULL ). Cela fait générer des erreurs aux requêtes INSERT si vous ne spécifiez pas explicitement une valeur pour toutes les colonnes non? NULL . Pour supprimer l'utilisation des valeurs par défaut, exécutez configure de cette façon : shell> CXXFLAGS=?DDONT_USE_DEFAULT_FIELDS ./configure Par défaut, MySQL utilise le jeu de caractères ISO?8859?1 (Latin1). Pour changer le jeu par • défaut, utilisez l'option ??with?charset : shell> ./configure ??with?charset=CHARSET CHARSET peut être l'un des big5 , cp1251 , cp1257 , czech , danish , dec8 , dos , euc_kr , gb2312 , gbk , german1 , hebrew , hp8 , hungarian , koi8_ru , koi8_ukr , latin1 , latin2 , sjis , swe7 , tis620 , ujis , usa7 , ou win1251ukrentre le serveur et le client, regardez du côté de la commande SET CHARACTER SET . Syntaxe de SET . Attention : Si vous changez les jeux de caractères après avoir crée des tables, vous devrez exécuter myisamchk ?r ?q ??set?character?set=charset sur chaque table. Vous index pourraient être stockés de manière incorrecte sinon. (Cela peut survenir si vous installez MySQL, créez quelques tables, puis reconfigurez MySQL pour qu'il utilise un jeu de caractères différent et le réinstallez.) Avec l'option ??with?extra?charsets=LIST vous pouvez définir les jeux de caractères additionnels à compiler dans le serveur. Ici LIST est soit une liste de jeux de caractères séparés par des espaces, soit complex pour inclure tous les jeux de caractères ne pouvant être chargés dynamiquement, ou encore all pour inclure tous les jeux de caractères dans les binaires. 2.3.2 Appliquer des patches 77 Manuel MySQL 4.1.x ? Version Française Pour configurer MySQL avec le code de débogage, utilisez l'option • ??with?debug : shell> ./configure ??with?debug Cela alloue un vérificateur d'allocation de mémoire qui peut trouver quelques erreurs et qui Si vos programmes clients utilisent les threads, vous avez besoin de compiler une version • sûre pour les threads de la librairie du client MySQL avec l'option de configuration ??enable?thread?safe?client . Cela créera une librairie libmysqlclient_r avec Les options relatives à un système d'exploitation particulier peuvent être trouvées dans la • d'exploitation . 2.3.4 Installer à partir de l'arbre source de développement Attention : Vous devez lire cette partie seulement si vous voulez nous aider à tester notre nouveau code. Si vous souhaitez seulement faire fonctionner MySQL sur votre système, vous devriez utiliser la distribution d'une version standard (que ce soit une distribution sous forme de sources ou de binaire). Pour obtenir notre arbre source de développement le plus réent, suivez les instructions suivantes : Téléchargez • BitKeeper à partir de ? . Vous aurez besoin de Bitkeeper 2.0 ou supérieur pour accéder à notre dépôt. Suivez les instructions pour l'installer. • Après avoir installé • BitKeeper , commencez par vous déplacer dans le répertoire à partir duquel vous voulez travailler, et lancez l'une des commandes suivantes pour dupliquer la branche MySQL de votre choix :Pour dupliquer la branche 3.23, utilisez cette commande : shell> bk clone :7000 mysql?3.23 Pour dupliquer la branche 4.0, utilisez cette commande : shell> bk clone :7001 mysql?4.0 Pour dupliquer la branche 4.1, utilisez cette commande : shell> bk clone :7004 mysql?4.1 Dans les exemples précédents, l'arbre source sera déposé dans les sous?répertoires mysql?3.23/ , mysql?4.0/ , ou mysql?4.1/ de votre répertoire premier téléchargement de l'arbre source peut prendre un certain temps, selon la vitesse de votre connexion. Soyez patients. Vous aurez besoin de GNU • autoconf 2.52 , de automake 1.5 , de libtool 1.4 , et de m4 pour lancer la prochaine série de commandes. shell> cd mysql?4.0 shell> bk ?r get ?Sq shell> aclocal; autoheader; autoconf; automake; shell> ./configure # Ajoutez ici vos options favorites shell> make Si vous obtenez des erreurs étranges pendant cette étape, vérifiez bien que vous avez vraiment installé libtool ! Une collection de nos scripts de configuration les plus courants de trouve dans le sous?répertoire BUILD/ . Si vous êtes fainéants, vous pouvez utiliser BUILD/compile?pentium?debug . Pour compiler sur une architecture différente, modifiez ce script en enlevant les drapeaux spécifiques au Pentium. Quand la compilation est achevée, lancez • make install . Prenez garde sur des machines de production. Cette commande pourrait écraser votre installation actuelle. Si vous avez une autre installation de MySQL, nous vous recommandons de lancer ./configure avec des valeurs des options prefix , with?tcp?port , et unix?socket?path différentes de 2.3.4 Installer à partir de l'arbre source de développement 78 Manuel MySQL 4.1.x ? Version Française celles de votre serveur de production. Torturez votre nouvelle installation et tentez de faire planter les nouvelles fonctionnalités. • Commencez par lancer make testSi vous avez échoué avec l'étape • make et que la distribution ne compile pas, envoyez un indispensables outils GNU, et qu'ils échouent dans l'analyse de vos fichiers de configuration, envoyez aussi un rapport. D'autre part, si vous exécutez aclocal et que vous obtenez l'erreur command not found ou un problème du même type, n'envoyez pas de rapport. A la place, assurez vous que les outils nécessaires sont bien installés et que votre variable PATH est configurée de telle façon que votre interpréteur de commandes les trouvent. Après la première opération • bk clone pour obtenir l'arbre source, vous devez lancer régulièrement bk pull pour obtenir les mises à jour. Vous pouvez examiner l'historique des changements de l'arbre avec toutes les différences • en utilisant bk sccstool . Si vous apercevez des différences anormales ou sur lesquelles De même, si vous pensez avoir une meilleure méthode pour traiter un problème, envoyez un e?mail accompagné d'un patch à la même adresse. bk diffs vous fournira un patch après que vous ayez fait vos changements aux sources. Si vous n'avez pas le temps de coder votre idée, envoyez en juste une description. BitKeeper • dispose d'une aide agréable à laquelle vous pouvez accéder via bk helptool . Veuillez noter que chaque commit ( • bk ci ou bk citool ) postera un message avec un aperçu des changements à notre liste de diffusion interne, à la façon habituelle des propositions avec seulement les commentaires des changements. Généralement, vous n'aurez pas besoin d'utiliser commit (l'arbre public interdisant les bk push ), mais plutôt d'utiliser la méthode bk diffs décrite plus haut. 2.3.5 Problèmes de compilation? Tous les programmes MySQL compilent proprement chez nous, sans aucune alerte sur Solaris avec gcc . Sur d'autres systèmes, des alertes peuvent apparaître à cause de différences dans le avec MIT?pthreads. Pour d'autres problèmes, voyez la liste suivante. La solution à de nombreux problèmes implique une reconfiguration. Si vous avez besoin de faire une reconfiguration voici quelques conseils généraux : Si • configure est exécuté après une première exécution, il peut utiliser des informations qui ont été rassemblées durant une première invocation. Ces informations sont stockées dans le fichier config.cache . Lorsque configure est lancé, il commence par regarder dans ce fichier, et lire le contenu qui existe, en supposant que ces données sont toujours correctes. Cette supposition est invalide si vous faîtes une reconfiguration. Chaque fois que vous exécutez • configure , vous devez exécuter à nouveau make pour recompiler. Toutefois, vous devrez peut être supprimer les vieux fichiers d'objets qui ont été compilé en utilisant différentes configurations précédentes. Pour éviter d'utiliser de vieilles informations de configuration, ou des vieux fichiers d'objet, vous pouvez utiliser ces commandes, avant configure : shell> rm config.cache shell> make clean Alternativement, vous pouvez aussi utiliser make distclean .La liste suivante décrit certains problèmes lors de la compilation de MySQL, qui surviennent souvent : 2.3.5 Problèmes de compilation? 79 Manuel MySQL 4.1.x ? Version Française Si vous avez des problèmes lors de la compilation de • , comme ceux qui sont décrits ci?dessous, vous avez probablement été à court de mémoire ou d'espace de swap : Internal compiler error: program cc1plus got fatal signal 11 ou Out of virtual memory ou Virtual memory exhausted Le problème est que gcc requiert de grandes quantité de mémoire pour compiler avec les fonctions inline. Essayez d'exécuter configure avec l'option ??with?low?memory : shell> ./configure ??with?low?memory Cette option ajoute ?fno?inline dans la ligne de compilation, si vous utilisez gcc et ?O0 si vous utilisez autre chose. Vous pouvez essayer ??with?low?memory même si il vous reste suffisamment de mémoire, et que vous ne pensez pas être limité. Ce problème a été observé sur des systèmes avec de généreuses configurations, et ??with?low?memory résout ce problème. Par défaut, • configure choisit c++ comme compilateur, et GNU c++ pour les liens avec ?lg++ . Si vous utilisez gcc , ce comportement peut poser les problèmes suivants : configure: error: installation or configuration problem: C++ compiler cannot create executables. Vous pourriez aussi observer des problèmes durant la compilation, avec g++ , libg++ ou libstdc++ .La cause de ces problèmes est que vous avez peut être que vous n'avez pas g++ , ou que vous avez g++ mais pas libg++ , ou libstdc++ . Regardez le fichier de log . Il va sûrement contenir la raison exacte du mauvais fonctionnement de votre compilateur. Pour contourner ce problème, vous pouvez utiliser gcc comme compilateur C++. Essayez de modifier la variable d'environnement CXX avec la valeur "gcc ?O3" . Par exemple : shell> CXX="gcc ?O3" ./configure Cela fonctionne car gcc compile les sources C++ aussi bien que g++ , mais il n'est pas lié avec libg++ ou libstdc++ par dé autre moyen pour régler ces problèmes, bien sur, est d'installer g++ , libg++ et libstdc++ . Nous vous recommandons toutefois de ne pas utiliser libg++ ou libstdc++ avec MySQL car cela ne fera qu'accroître la taille de votre exécutable binaire, sans vous apporter d'avantages. Par le passé, certaines versions de ces librairies ont posé des problèmes étranges aux utilisateurs MySQL. Si votre compilation échoue avec des erreurs, ou si l'une des erreurs suivantes apparaît, • vous devez changer la version de make en GNU make : making all in mit?pthreads make: Fatal error in reader: Makefile, line 18: Badly formed macro assignment ou make: file `Makefile' line 18: Must be a separator (: ou pthread.h: No such file or directory Solaris et FreeBSD sont connus pour avoir des problèmes avec make . GNU make version 3.75 est reconnu pour fonctionner. Si vous voulez définir des options supplémentaires qui seront utilisées par votre compilateur • C ou C++, faites le en ajoutant ces options aux variables d'environnement CFLAGS et CXXFLAGS . Vous pouvez aussi spécifier le nom du compilateur via les variables CC et CXX . Par exemple : shell> CC=gcc shell> CFLAGS=?O3 shell> CXX=gcc shell> CXXFLAGS=?O3 shell> export CC CFLAGS CXX CXXFLAGS options disponibles sur divers systèmes. 2.3.5 Problèmes de compilation? 80 Manuel MySQL 4.1.x ? Version Française Si vous obtenez un message d'erreur comme celui?ci, vous devrez mettre à jour votre • version de gcc : client/libmysql.c:273: parse error before `__attribute__' gcc 2.8.1 est connu pour fonctionner, mais nous recommandons l'utilisation de gcc 2.95.2 ou egcs 1.0.3a. Si vous obtenez des erreurs telles que celles qui sont affichées ci?dessous lors de la • compilation de mysqld , c'est que configure n'a pas correctement détecter le dernier argument des fonctions accept() , getsockname() ou getpeername() : cxx: Error: , line 645: In this statement, the referenced type of the pointer value "&length" is "unsigned long", which is not compatible with "int". new_sock = accept(sock, (struct sockaddr *)&cAddr, &length); Pour corriger ce problème, éditez le fichier config.h (qui est généré par le fichier configure ). Recherchez ces lignes : /* Define as the base type of the last arg to accept */ #define SOCKET_SIZE_TYPE XXX Remplacez XXX par size_t ou int , suivant votre système d'exploitation. Notez que vous devrez faire cette manipulation à chaque fois que vous exécuterez le script configure car configure regénère config.h . Le fichier • est généré à partir du fichier . Normalement, le processus de création ne s'occupe pas de , car MySQL en a déjà une copie. Cependant, si vous devez le recréer, vous pouvez rencontrer cette erreur : "", line xxx fatal: default action causes potential... Cela indique que votre version de yacc est inadéquate. Vous devrez probablement réinstaller bison (la version GNU de yacc ) et l'utiliser à la place. Si vous avez besoin de déboguer • mysqld ou un client MySQL, exécutez le script configure avec l'option ??with?debug , puis recompilez vos clients avec la nouvelle librairie. Déboguer un client MySQL . 2.3.6 Notes relatives aux MIT?pthreads Cette section décrit quelques informations concernant l'utilisation des MIT?pthreads. Notez que sur Linux vous ne devez pas utiliser les MIT?pthreads mais installer LinuxThreads ! Notes relatives à Linux (toutes les versions de Linux) . Si votre système ne fournit pas un support nattif des threads, vous aurez besoin de construire MySQL en utilisant le package des MIT?pthreads. Cela inclut les anciens systèmes FreeBSD, plus partie de la distribution des sources ! si vous avez besoin de ce package, vous pouvez l'obtenir récupéré, décompressez l'archive dans le répertoire racine de votre répertoire des sources de MySQL. Cela créera le répertoire mit?pthreads . Sur la plupart des systèmes, vous pouvez forcer l'utilisation des MIT?pthreads en exécutant • configure avec l'option ??with?mit?threads : shell> ./configure ??with?mit?threads La compilation dans un dossier non?sources n'est pas supporté lors de l'utilisation des MIT?pthreads car nous voulons minimiser les changements de leur code. La vérification pour l'utilisation des MIT?pthreads ne survient que durant la partie du • processus de configuration qui s'occupe du code du serveur. Si vous avez configuré la distribution en utilisant ??without?server pour ne construire que le client, les clients ne sauront pas si les MIT?pthreads sont utilisés et utiliserons les socket Unix pour les 2.3.6 Notes relatives aux MIT?pthreads 81 Manuel MySQL 4.1.x ? Version Française connexions par défaut. Puisque les sockets Unix ne fonctionnent pas avec les MIT?pthreads sur certaines plate?formes, cela signifie que vous devrez utiliser ?h ou ??host quand vous exécuterez les programmes clients. Lorsque MySQL est compilé en utilisant les MIT?pthreads, le verrouillage système est • désactivé par défaut pour des soucis de performances. Vous pouvez demander au serveur d'utiliser les verrous systèmes avec l'option ??external?locking . Cela n'est requis que si vous avez besoin de faire fonctionner deux serveurs MySQL avec les mêmes données (non recommandé). De temps en temps, la commande • bind() des pthreads n'arrive pas à attacher une socket sans afficher d'erreurs (du mois, sous Solaris). Le résultat est que toutes les connexions au serveur échouent. Par exemple : shell> mysqladmin version mysqladmin: connect to server at '' failed; error: 'Can't connect to mysql server on localhost (146)' La solution est de terminer le serveur mysqld et de le redémarrer. Cela ne nous est arrivé que quand nous avons forcé le serveur à se terminer et que nous l'avons redémarré immédiatement après. Avec les MIT?pthreads, l'appel système à • sleep() n'est pas interruptible avec SIGINT (break). On ne s'en rend compte qua quand on exécute mysqladmin ??sleep . Vous devez attendre que l'appel système à sleep() se termine avant que le processus ne s'arrête. Lors de la liaison, vous pouvez obtenir des messages d'erreurs comme ceux?ci (du moins • sur Solaris); ils peuvent être ignorés : ld: warning: symbol `_iob' has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken ld: warning: symbol `__iob' has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken D'autres avertissements peuvent être ignorés : • implicit declaration of function `int strtoll(...)' implicit declaration of function `int strtoul(...)' Nous n'avons pas réussi à faire fonctionner • readline avec les MIT?pthreads. (Cela n'est pas nécessaire, mais peut être utile à quelqu'un.) 2.3.7 La distribution source Windows Vous aurez besoin de : Un compilateur VC++ 6.0 (mis à jour avec 4 ou 5 SP et le paquet Pré?processeur) Le • paquet Pré?processeur est nécessaire pour l'assembleur de macros. D'avantage de détails La distribution source MySQL pour Windows, qui peut être obtenue sur • . Compiler MySQL Créez un répertoire de travail (par exemple, workdir) • Décompressez la distribution source dans ce répertoire. • Lancez le compilateur VC++ 6.0. • Dans le menu • Fichier , sélectionnez Ouvrir un espace de travail . Ouvrez l'espace de travail • que vous trouverez dans le répertoire de travail. Dans le menu • Générer , sélectionnez le menu Choisir la configuration active . 2.3.7 La distribution source Windows 82 Manuel MySQL 4.1.x ? Version Française Choisissez • mysqld ? Win32 Debug puis cliquez sur OK. Appuyez sur • F7 pour commencer à compiler le serveur de débogage, les bibliothèques, et quelques applications clientes. Quand la compilation est terminée, copiez les bibliothèques et les exécutables dans un • répertoire séparé. Compilez les versions que vous souhaitez de la même manière. • Créez le répertoire pour les outils MySQL : par exemple, • c:\mysql A partir du répertoire workdir, copiez les répertoires suivants dans c:\mysql : • Data ? Docs ? Share ? Créez le répertoire • c:\mysql\bin et copier toutes les applications serveur et client compilées auparavant. Si vous le souhaitez, vous pouvez aussi créer le répertoire • lib et y copier les librairies compilées auparavant. Faites un nettoyage en utilisant Visual Studio. • l'environnement MySQL sous Windows . 2.4 Configuration après l'installation, et tests Une fois que vous avez installé MySQL (que ce soit avec les sources ou avec la distribution binaire), vous devez initialiser les tables de droits, démarrer le serveur et vous assurer que tout fonctionne bien. Vous pouvez aussi vouloir configurer le démarrage et l'extinction automatique du serveur. Normalement, vous installez les tables de droits et démarrez le serveur comme ceci, pour une distribution source : shell> ./scripts/mysql_install_db shell> cd mysql_installation_directory shell> ./bin/safe_mysqld ??user=mysql & Pour une distribution binaire (pas un RPM ou un package), faites ceci : shell> cd mysql_installation_directory shell> ./bin/mysql_install_db shell> ./bin/safe_mysqld ??user=mysql & Cela crée la base mysql qui va contenir tous les droits, ainsi que la base test, que vous pouvez utiliser pour tester MySQL, ainsi que les droits pour l'utilisateur qui fait fonctionner mysql_install_db et un utilisateur root (sans mots de passe). Cela va aussi démarrer le serveur mysqld . mysql_install_db ne va pas écraser d'anciens droits installé, et il peut être utilisé en toutes circonstances. Si vous ne voulez pas de base test , vous pouvez la supprimer avec la commande mysqladmin ?u root drop test . Les tests sont plus facilement exécuté depuis le niveau supérieur de la distribution MySQL. Pour la distribution binaire, c'est votre dossier d'installation (typiquement, /usr/local/mysql ). Pour une distribution source, c'est le dossier principal de votre dossier source MySQL. Dans les commandes présentées dans cette section et dans les sous sections suivantes, BINDIR est le chemin jusqu'au programmes binaires de la distribution, comme mysqladmin et safe_mysqld . Pour une distribution binaire, il s'agit du dossier bin dans la distribution. Pour une distribution source, BINDIR vaut sûrement /usr/local/bin , à moins que vous ne spécifiez un 2.4 Configuration après l'installation, et tests 83 Manuel MySQL 4.1.x ? Version Française dossier d'installation différent que /usr/local avec le script configure . EXECDIR est le chemin jusqu'au serveur mysqld . Pour une distribution binaire, c'est la même valeur que BINDIR . Pour une distribution source, EXECDIR est probablement /usr/local/libexec . Les tests sont décrits en détails : Si besoin, démarrez le serveur • mysqld et modifiez les tables initiales de droits de MySQL qui contiennent les privilèges qui déterminent les droits de connexion des utilisateurs au serveur. Cela se fait normalement avec le script mysql_install_db : shell> scripts/mysql_install_db Typiquement, mysql_install_db doit être exécuté uniquement lors de votre première installation de MySQL. Par conséquent, si vous faites évoluer une installation, vous pouvez éviter cette étape. Cependant, mysql_install_db est tout à fait sécuritaire, et vous ne modifiera pas des tables existants, alors dans le doute, vous pouvez toujours utiliser mysql_install_db . mysql_install_db crée six tables ( user , db , host , tables_priv , columns_priv , and func ) dans la base mysql database. Une description des droits initiaux est proposé permettront au root MySQL de faire ce qu'il souhaite, et notamment, d'autoriser la création et l'utilisation de la base test ou dont le nom commence par test_ . Si vous ne configurez pas les tables de droits, l'erreur suivante va apparaître dans le fichier de log, au démarrage du serveur : mysqld: Can't find file: '' Cela peut aussi arriver avec la distribution binaire de MySQL, si vous ne démarrez pas MySQL exactement avec pouvez avoir besoin d'exécuter mysql_install_db en tant que root . Toutefois, si vous pouvez exécuter le serveur MySQL en tant qu'utilisateur avec peu de droits (non?root), tant que cet utilisateur a les droits de lecture et d'écriture dans le dossier de données. Les instructions pour faire fonctionner MySQL avec un autre utilisateur sont données dans le chapitre Comment faire tourner MySQL en tant qu'utilisateur normal . Si vous avez des problèmes avec mysql_install_dbmysql_install_db . Il y des alternatives à l'utilisation de mysql_install_db tel qu'il est fourni dans la distribution MySQL : Vous pouvez éditer le script ? mysql_install_db avant de l'exécuter, pour modifier les droits initiaux qui sont implantés dans les tables de droits. C'est pratique si vous voulez installer MySQL sur de nombreuses machines, avec les mêmes droits. Dans ce cas, vous aurez probablement à ajouter quelques insertions INSERT dans les tables et ! Si vous voulez modifier des éléments dans la table de droits après les avoir installé, ? vous pouvez exécuter mysql_install_db , puis utiliser mysql ?u root mysql pour vous connecter aux tables de droit en tant que root MySQL, et exécuter les commandes SQL nécessaires, directement dans les tables de droits. Il est possible de recréer complètement les tables de droits une fois qu'elles ont été ? créées. Vous pouvez faire cela si vous avez déjà installé les tables, mais que vous voulez les recréer après édition de mysql_install_db . MySQL . 2.4 Configuration après l'installation, et tests 84 Manuel MySQL 4.1.x ? Version Française Démarrez le serveur MySQL comme ceci : • shell> cd mysql_installation_directory shell> bin/safe_mysqld & Utilisez • mysqladmin pour vérifier que le serveur fonctionne. Les commandes suivantes fournissent un accès simple pour tester si le serveur fonctionne correctement : shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variables Le résultat de mysqladmin version varie suivant votre plate?forme et votre version de MySQL, mais il doit être similaire à ceci : shell> BINDIR/mysqladmin version mysqladmin Ver 8.14 Distrib 3.23.32, for linux on i586 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license. Server version 3.23.32?debug Protocol version 10 Connection Localhost via Unix socket TCP port 3306 UNIX socket Uptime: 16 sec Threads: 1 Questions: 9 Slow queries: 0 Opens: 7 Flush tables: 2 Open tables: 0 Queries per second avg: 0.000 Memory in use: 132K Max memory used: 16773K Pour savoir ce que vous pouvez faire d'autre avec BINDIR/mysqladmin , appelez le avec l'option ??help . Vérifiez que vous pouvez éteindre le serveur : • shell> BINDIR/mysqladmin ?u root shutdown Verifiez que vous pouvez redémarrer le serveur. Faites cela avec • safe_mysqld ou directement avec mysqld . Par exemple : shell> BINDIR/safe_mysqld ??log & Si safe_mysqld échoue, essayez d'exécuter MySQL depuis le dossier d'installation (si Exécutez un test simple pour vérifier que le serveur fonctionne. Le résultat devrait être • similaire à ces lignes ci : shell> BINDIR/mysqlshow +???????????+ | Databases | +???????????+ | mysql | +???????????+ shell> BINDIR/mysqlshow mysql Database: mysql +??????????????+ | Tables | +??????????????+ | columns_priv | | db | | func | | host | | tables_priv | | user | +??????????????+ 2.4 Configuration après l'installation, et tests 85 Manuel MySQL 4.1.x ? Version Française shell> BINDIR/mysql ?e "SELECT host,db,user FROM db" mysql +??????+????????+??????+ | host | db | user | +??????+????????+??????+ | % | test | | | % | test_% | | +??????+????????+??????+ Il y a aussi la suite de performances dans le dossier sql?bench (dans le dossier d'installation MySQL) que vous pouvez utiliser pour comparer les performances de MySQL avec d'autres plate?formes. Le dossier sql?bench/Results contient le résultat de nombreux tests avec différentes bases et plate?forme. Pour exécuter tous les tests, exécutez cette commande : shell> cd sql?bench shell> run?all?tests Si vous n'avez pas de dossier sql?bench , vous utilisez probablement une distribution binaire au format RPM. Les distribution source RPM incluent le dossier de tests. Dans ce cas, vous devez d'abord installer la suite de test avant de l'utiliser. Depuis MySQL Version 3.22, il y a des fichiers de tests RPM, appelé mysql?bench?VERSION? qui contient les données de tests et les donné vous avez une distribution source, vous pouvez aussi exécuter les tests dans le dossier tests . Par exemple, pour exécuter , faites ceci : shell> BINDIR/mysql ?vvf test < Les résultats attendus sont présentés dans le fichier . 2.4.1 Problèmes d'exécution de mysql_install_db Le but du script mysql_install_db est de générer un nouveau système de droits pour MySQL. Il ne modifiera aucune autre donnée! Il ne fera rien du tout si vous avez des tables de droits installées. Si vous voulez recréer vos tables de droits, vous devez éteindre le serveur mysqld , si il fonctionnait, et faire ceci : mv mysql?data?directory/mysql mysql?data?directory/mysql?old mysql_install_db Cette section liste les problèmes que vous pourriez rencontrer lors de l'exécution du script mysql_install_db : mysql_install_db n'installe pas les tables de droits Vous réalisez que mysql_install_db n'arrive pas à installer les tables de droits, et se termine sur ce message : starting mysqld daemon with databases from XXXXXX mysql daemon ended Dans ce cas, examinez le fichier de log très attentivement! Le fichier de log est situé dans le dossier XXXXXX indiqué dans le message d'erreur, et il indiquera pourquoi mysqld n'a pas démarré. SI vous ne comprenez pas ce qui est arrivé, incluez le log dans votre message, lors de l'envoi du rapport de bugs avec mysqlbugrapporter des bogues ou problèmes . Un démon mysqld fonctionne déjà Dans ce cas, vous n'avez probablement pas exécuté mysql_install_db du tout. Vous avez exécuté mysql_install_db une fois, lorsque vous avez installé MySQL pour la première fois. Installer un second démon mysqld n'est pas possible lorsque le premier fonctionne. 2.4.1 Problèmes d'exécution de mysql_install_db 86 Manuel MySQL 4.1.x ? Version Française Cela arrive lorsque vous avez une installation MySQL pré?existantes, mais que vous voulez installer une autre version ailleurs (par exemple, pour faire des tests ou simplement pour avoir deux installations). Généralement, le problème survient lorsque le second serveur est démarré, et qu'il essaie d'utiliser les mêmes ports et sockets que le premier. Dans ce cas, vous recevez des message d'erreur tels que : Can't start server: Bind on TCP/IP port: Address already in use ou Can't start server: Bind on unix socket...serveurs sur la même machine . You don't have write access to /tmp Si vous n'avez pas les droits d'accès suffisant pour créer un fichier de socket à l'endroit prévu (dans /tmp ) ou les permissions pour créer un fichier temporaire dans /tmp, vous allez avoir une erreur lors de l'utilisation de mysql_install_db ou avec mysqld . Vous pouvez spécifier une socket différente et un dossier temporaire différent avec les options suivantes : shell> TMPDIR=/some_tmp_dir/ shell> shell> export TMPDIR MYSQL_UNIX_PORT Voir Comment protéger . some_tmp_dir doit être un chemin vers un dossier dans lequel vous avez les permissions d'écriture. Variables d'environnement MySQL . Après cela, vous devriez être capable d'exécuter mysql_install_db et démarrer le serveur avec ces commandes : shell> scripts/mysql_install_db shell> BINDIR/safe_mysqld & mysqld crashes immediately Si vous utilisez RedHat version 5.0 avec une version de glibc plus ancienne que 2.0.7?5, assurez vous que vous avez installé les patchs glibc ! Il y a beaucoup de littérature à ce propos dans les archives de listes de diffusion. Des liens vers les (toutes les versions de Linux) . Vous pouvez aussi démarrer mysqld manuellement avec l'option ??skip?grant?tables puis ajouter les tables de droits avec S mysql : shell> BINDIR/safe_mysqld ??skip?grant?tables & shell> BINDIR/mysql ?u root mysql Dans la base mysql , exécutez manuellement les commandes SQL disponibles dans mysql_install_db . Assurez vous que vous n'oubliez pas la commande mysqladmin flush?privileges ou mysqladmin reload pour dire au serveur de prendre en compte les tables de droits. 2.4.2 Problèmes de démarrage du serveur MySQL Si vous allez utiliser des tables qui supportent les transactions (InnoDB, BDB), vous devez commencer par créer un fichier my.cnfde tables MySQL . 2.4.2 Problèmes de démarrage du serveur MySQL 87 Manuel MySQL 4.1.x ? Version Française Généralement, vous démarrez le serveur mysqld de l'une de ces façons : En utilisant le script • mysql.server . Ce script est utilisé à la base au moment du démarrage et de l'extinction du système, et il est décrit avec plus de détail dans le chapitre En appelant le script • safe_mysqld , qui va déterminer les options correctes pour mysqld puis utiliser ces options. Pour Windows NT/2000/XP, voyez Démarrer MySQL avec Windows NT / 2000 / XP . • En appelant • mysqld directement. Lorsque le démon mysqld démarre, il change le dossier de travail par le dossier de données. C'est là qu'il doit trouver les fichiers de log, et le fichier pid (ID de processus), ainsi que les dossiers de bases. Le chemin du dossier de données est codé en dur lorsque la distribution est compilée. Cependant, si mysqld cherche le dossier de données ailleurs que là ou il est vraiment, il ne va pas fonctionner correctement. Si vous avez des problèmes avec les chemins, vous pouvez utiliser les options dont mysqld dispose pour vous permettre de modifier dynamiquement le chemin du dossier de données : il suffit d'appeler mysqld avec l'option ??help . Vous pouvez remplacer les valeurs par défaut en spécifiant les chemins corrects en ligne de commande avec mysqld . Ces options fonctionneront aussi avec safe_mysqld . Normalement, vous devez appeler mysqld uniquement depuis le dossier d'installation de MySQL. Vous pouvez faire cela avec l'option ??basedir . Vous pouvez aussi consulter l'affichage de ??help pour vérifier le changement des options de chemin (notez que ??help doit être l'option finale d'une commande mysqld . Par exemple : shell> EXECDIR/mysqld ??basedir=/usr/local ??help Une fois que vous avez déterminé le chemin que vous souhaitez, vous pouvez démarrer le serveur sans l'option ??help .Quelque soit la méthode que vous utilisez pour démarrer le serveur, si elle échoue, vérifiez le fichier de log pour savoir pourquoi. Les fichiers de log sont situés dans le dossier de données (typiquement /usr/local/mysql/data pour une distribution binaire, /usr/local/var pour une distribution source, et \mysql\data\ sous Windows). Regardez dans le dossier de données et recherchez des fichiers de la forme et ou host_name est le nom de votre serveur. Vérifiez alors les dernières lignes de ce fichier : shell> tail shell> tail Recherchez des lignes comme celles?ci : 000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed 000729 14:50:10 bdb: warning: : No such file or directory 000729 14:50:10 Can't init databases Cela signifie que vous n'avez pas démarré mysqld avec ??bdb?no?recover et Berkeley DB a trouvé une erreur dans les fichiers de log lorsqu'il a essayé de restaurer votre base. Pour pouvoir continuer, vous devez déplacer le vieux fichier de log Berkeley DB vers un autre dossier, pour l'examiner plus tard. Les fichiers de logs sont nommés log.0000000001 , et ce nombre augmente au fil du vous exécutez mysqld avec les tables BDB et que mysqld fait des core dumps au démarrage, c'est peut être que vous avez des problèmes avec le fichier de restauration de BDB. Dans ce cas, essayez de démarrer mysqld avec ??bdb?no?recover . Si cela aide, vous devriez alors retirer tous les fichiers de log log.* du dossier de données, et démarrer mysqld à nouveau. Si vous obtenez l'erreur suivant, cela signifie que d'autres programmes (ou un autre serveur mysqld ) fonctionne déjà avec le port TCP/IP ou la socket que mysqld essaie d'utiliser : Can't start server: Bind on TCP/IP port: Address already in use 2.4.2 Problèmes de démarrage du serveur MySQL 88 Manuel MySQL 4.1.x ? Version Française ou Can't start server : Bind on unix socket... Utilisez ps pour vous assurer que vous n'avez pas d'autre serveur mysqld qui fonctionne. SI vous ne pouvez pas trouver d'autre serveur en fonctionnement, essayer d'exécuter la commande telnet votre?nom?d?hote numero?de?port?tcp puis pressez la touche 'Entrée' plusieurs fois. SI vous n'obtenez pas de message d'erreur comme telnet: Unable to connect to remote host: Connection refused , alors un autre processus utilise le port TCP/IP de mysqld . Voyez Problèmes d'exécution de mysql_install_dbserveurs MySQL sur la même machine . Si mysqld est en fonctionnement, vous pouvez connaître les chemins qu'il utilise avec la commande suivante : shell> mysqladmin variables ou shell> mysqladmin ?h 'your?host?name' variables Si vous obtenez une erreur Errcode 13 , qui indique Permission denied , lors du démarrage de mysqld , cela signifie que vous n'avez pas les droits de lecture ou d'écriture sur le dossier de données de MySQL, ou dans le dossier de logs. Dans ce cas, vous devriez démarrer mysqld en tant que root, ou changer les permissions des fichiers et dossiers utilisés.Si safe_mysqld démarre le serveur, mais que vous n'arrivez pas à vous y connecter, vous devriez vous assurer que vous avez une entrée dans le fichier /etc/hosts qui ressemble à ceci : 127.0.0.1 localhost Ce problème survient uniquement sur les systèmes qui n'ont pas une librairie de threads fonctionnels, ou pour lesquels MySQL a été configuré pour utiliser les MIT? vous ne pouvez pas faire démarrer mysqld , essayez de faire un fichier de trace pour identifier le problème. Créer des fichiers de traçage . Si vous utilisez les tables InnoDB , reportez vous aux options de configuration spécifiques à InnoDB . Options de démarrage InnoDB . Si vous utilisez les tables BDB (Berkeley DB), vous devriez vous familiariser avec les options de démarrage spécifiques à BDB. Options de démarrage BDB . 2.4.3 Lancer et arrêter MySQL automatiquement. Les scripts mysql.server et safe_mysqld peuvent être utilisés pour démarrer le serveur automatiquement au moment du démarrage du serveur. mysql.server peut aussi servir à arrêter le serveur. Le script mysql.server peut servir à démarrer ou arrêter le serveur en l'appelant avec les arguments start ou stop : shell> mysql.server start shell> mysql.server stop mysql.server est installé dans le dossier share/mysql du dossier d'installation de MySQL, ou dans le dossier support?files de la distribution source.Avant que mysql.server ne démarre le serveur, il change de dossier pour aller dans le dossier d'installation et appelle safe_mysqld . Vous pourriez avoir à éditer mysql.server si vous avez une installation binaire dans une situation non standard. Modifiez la commande cd avec le dossier correct, avant qu'il n'exécute 2.4.3 Lancer et arrêter MySQL automatiquement. 89 Manuel MySQL 4.1.x ? Version Française safe_mysqld . Si vous voulez que le serveur fonctionne avec un utilisateur spécifique, ajouter l'option user appropriée dans le fichier , tel que présenté ultérieurement dans cette section. mysql.server stop arrête le serveur en lui envoyant un signal. Vous pouvez éteindre le serveur manuellement avec la commande mysqladmin shutdown . Vous pouvez ajouter ces commandes de démarrage et d'arrêt aux endroits appropriés dans votre fichier /etc/rc* lorsque vous démarrez MySQL dans les applications de production. Notez que si vous modifiez mysql.server , et que vous passez à une nouvelle version de MySQL, votre vesrion modifiée sera écrasée, et vous devriez faire une copie de sauvegarde de votre votre système utilise /etc/rc.local pour démarrer des scripts externes, vous devriez ajouter la ligne suivante : /bin/sh ?c 'cd /usr/local/mysql ; ./bin/safe_mysqld ??user=mysql &' Vous pouvez aussi ajouter des options à mysql.server via le fichier global file. Un fichier typique peut ressembler à ceci : [mysqld] datadir=/usr/local/mysql/var port=3306 user=mysql [mysql.server] basedir=/usr/local/mysql Le script mysql.server comprend les options suivantes : datadir , basedir et pid?file . La table suivante montre quels groupes d'options chaque scripts de démarrage utilise : Script Groupe d'options mysqld mysqld and server mysql.server mysql.server , mysqld , and server safe_mysqld mysql.server , mysqld , and server Fichier d'options . 2.5 Changer de version de MySQL Vous pouvez toujours les fichiers de structures et de données entre les différentes versions de MySQL. La version de base actuelle est la version 3. Si vous changez le jeu de caractères lors de l'utilisation de MySQL (ce qui va aussi affecter le tri), vous devez exécuter la commande myisamchk ?r ?q ??set?character?set=charset sur toutes les tables. Sinon, vos index ne seront pas correctement triés. Si vous avez peur des nouvelles versions, vous pouvez toujours renommer votre vieux mysqld avec un nom comme mysqld?ancienne_version . Si votre nouveau serveur mysqld se comportement bizarrement, vous pourrez toujours l'éteindre, et redémarrer avec votre vieux mysqld ! Lorsque vous faites une évolution de version, vous devriez toujorus faire une sauvegarde de vos anciennes données. Si après un changement de version, vous rencontrez des problèmes avec les clients recompilés, 2.5 Changer de version de MySQL 90 Manuel MySQL 4.1.x ? Version Française comme Commands out of sync ou des core dumps inopinés, vous avez probablement utiliser un vieux fichier d'entête ou une vieille librairie lors de la compilation de vos programmes. Dans ce cas, vérifiez la date de votre fichier mysql.h , et de votre librairie libmysqlclient.a , pour vous assurer qu'ils proviennent bien de la nouvelle distribution MySQL. Si ce n'est pas le cas, recompilez vos programmes! Si vous avez des problèmes comme si le nouveau serveur mysqld qui ne veut pas démarrer, ou que vous ne pouvez pas vous connecter sans un mot de passe, vérifiez que vous n'avez pas un vieux fichier dans votre installation! Vous pouvez le vérifier comme ceci : program?name ??print?defaults . Si cette commande affiche autre chose que le nom du programme, vous avez un fichier actif, qui perturbe vos opérations. C'est une bonne idée que de reconstruire et reinstaller le module Msql?Mysql à chaque fois que vous faites une nouvelle version de MySQL, en particulier si vous rencontrez des symptômes tels que les DBI qui font des core dump après votre mise à jour de MySQL. 2.5.1 Passer de la version 3.23 à la version 4.0 En général, ce que vous devez faire pour passer en version 4.0, à partir d'une version plus ancienne : Exécutez le script • mysql_fix_privilege_tables pour ajouter de nouveaux droits et fonctionnalités à a table MySQL. Editez les scripts de démarrage MySQL pour les fichiers de configuration pour ne plus • utiliser les options abandonnées, listées ci?dessous. Convertissez vos vieilles tables • ISAM en tables MyISAM avec la commande : mysql_convert_table_format database . Notez que cela ne doit être fait que si toutes les tables de la base sont des tables ISAM ou MyISAM . Si ce n'est pas le cas, vous devrez alors utiliser la commande ALTER TABLE table_name TYPE=MyISAM sur toutes les tables ISAM . Assurez vous que vous n'avez pas de client MySQL qui utilise des librairies partagées • (comme les modules Perl Msql?Mysql). Si vous en avez, vous devriez les recompiler car les structures utilisées dans ont changées. MySQL 4.0 va fonctionner même si vous ne suivez pas les instructions ci?dessus, mais il ne sera pas capable de profiter des nouveaux droits disponibles avec MySQL 4.0 et vous pourriez rencontrer des problèmes lors de l'évolution vers MySQL 4.1 ou plus récent. Les fichiers ISAM fonctionne toujours en MySQL 4.0 mais il est abandonné, et il sera désactivé en MySQL 5.0. Les anciens clients doivent fonctionner avec le serveur version 4.0 sans aucun problème. Même si vous suivez les instructions ci?dessus, vous pourrez retourner en version MySQL 3.23.52 ou plus récent, si vous rencontrez des difficultés avec MySQL 4.0. Dans ce cas, vous devez utiliser la commande mysqldump sur toutes les tables qui utilisent un index en texte plein, et restaurer ces tables en 3.23 (car la version 4.0 utilise un nouveau format pour les index en texte plein). Voici une liste plus complète de points à contrôler lorsque vous passez à la version 4.0 : MySQL 4.0 a de très nombreux nouveaux droits dans la table • . Syntaxe de GRANT et REVOKE . Pour faire fonctionner ces nouveaux droits, vous devez exécuter le script mysql_fix_privilege_tables . Jusqu'à ce que ce script soit exécuté, les utilisateurs 2.5.1 Passer de la version 3.23 à la version 4.0 91 Manuel MySQL 4.1.x ? Version Française auront les droits de SHOW DATABASES , CREATE TEMPORARY TABLES , et LOCK TABLES . Les droits de SUPER et EXECUTE héritent leur valeur du droit de PROCESS . REPLICATION SLAVE et REPLICATION CLIENT héritent leur valeur de FILE . Si vous avez un script qui crée automatiquement des nouveaux utilisateur, vous devez le modifier pour y inclure les nouveaux droits. Si vous n'utilisez pas la commande GRANT dans ces scripts, c'est une bonne idée que de les vérifier. En version 4.0.2, l'option ??safe?show?database est abandonnée (et ne fait plus rien du tout). Options de démarrage de mysqld liées à la sécurité . Si vous obtenez des interdictions d'accès pour les nouveaux utilisateurs en version 4.0.2, vous devriez vérifier si vous avez besoin de nouveaux droits que vous n'utilisiez pas avant. En particulier, vous aurez besoin du droit de REPLICATION SLAVE (au lieu de FILE ) pour les nouveaux esclaves. Les paramètres de démarrage • myisam_max_extra_sort_file_size et myisam_max_extra_sort_file_size sont désormais exprimés en octets, et non plus en Mo, comme cela était le cas jusqu'en version 4.0.3). Les systèmes externes de verrouillages des tables MyISAM/ISAM sont désormais désactivés par défaut. Vous pouvez les réactiver avec l'option ??external?locking Pour la plupart des utilisateurs, ce n'est jamais nécessaire. Les options de démarrage suivantes ont été renommées : • Ancien nom Nouveau nom . myisam_bulk_insert_tree_size bulk_insert_buffer_size query_cache_startup_type query_cache_type record_buffer read_buffer_size record_rnd_buffer read_rnd_buffer_size sort_buffer sort_buffer_size warnings log?warnings Les options de démarrage record_buffer , sort_buffer et warnings vont encore fonctionner avec MySQL 4.0 mais elles sont obsolètes. Les variables SQL suivantes ont changé de nom. • Ancien nom Nouveau nom . SQL_BIG_TABLES BIG_TABLES SQL_LOW_PRIORITY_UPDATES LOW_PRIORITY_UPDATES SQL_MAX_JOIN_SIZE MAX_JOIN_SIZE SQL_QUERY_CACHE_TYPE QUERY_CACHE_TYPE Les anciens noms fonctionneront encore en MySQL 4.0, mais sont obsolètes. Vous devez utiliser la commande • SET GLOBAL SQL_SLAVE_SKIP_COUNTER=# au lieu de SET SQL_SLAVE_SKIP_COUNTER=# . Renommez les options de démarrage • ??skip?locking en ??skip?external?locking et ??enable?locking en ??external?locking . SHOW MASTER STATUS • retourne désormais une liste vide si les logs binaires ne sont pas activés. SHOW SLAVE STATUS • retourne désormais une liste vide si l'esclave n'est pas initialisé. mysqld • dispose désormais de l'option ??temp?pool activée par défaut, car cela donne de meilleurs performances sur certains systèmes d'exploitation. Les colonnes • DOUBLE et FLOAT acceptent désormais l'option UNSIGNED pour le stockage (auparavant, UNSIGNED était ignoré pour ces colonnes). ORDER BY column DESC • trie désormais les valeurs NULL en premier. En version 3.23, ce n'était pas toujours le cas. 2.5.1 Passer de la version 3.23 à la version 4.0 92 Manuel MySQL 4.1.x ? Version Française SHOW INDEX • a 2 colonnes de plus ( Null et Index_type ) qu'il n'avait pas en version 3.23. SIGNED • est un mot réservé. Le résultat de toutes les opérations sur les bits, • | , , << , >> et ~ est maintenant non signé. Cela peut poser des problèmes si vous aviez un contexte dans lequel vous souhaitez un résultat signé. Fonctions de Note • : lorsque vous utilisez la soustraction entre des entiers dont l'un est UNSIGNED , le résultat sera non signé! En d'autres termes, avant de passer à la version MySQL 4.0, vous devriez vérifier les situations où votre application soustrait une valeur d'un entier non signé, et que vous attendez une valeur négative, ou si vous soustrayez une valeur non signée d'une colonne. Vous pouvez désactiver ce comportement en utilisant l'option de démarrage ??sql?mode=NO_UNSIGNED_SUBTRACTION lorsque vous démarrez mysqldPour utiliser • MATCH ... AGAINST (... IN BOOLEAN MODE) avec vos table,s vous devez les reconstruire avec ALTER TABLE table_name TYPE=MyISAM , même si la table est déjà au format MyISAM . LOCATE() • et INSTR() sont sensibles à la casse, si l'un des arguments est une chaîne binaire. Sinon, ils sont insensibles à la casse. STRCMP() • utilise désormais le jeu de caractères courant pour les comparaisons, ce qui signifie que le comportement par défaut des comparaisons est désormais insensible à la casse. HEX(string) • retourne désormais les caractères convertis sous la forme d'une chaîne hexadécimale. Si vous voulez convertir un nombre en hexadécimal, vous devez vous assurer d'appeler HEX() avec un argument numérique. En version 3.23, • INSERT INTO ... SELECT fonctionne toujours avec l'option IGNORE . En version 4.0.1, MySQL va s'arrêter (et peut être annuler la transaction) si vous ne spécifiez pas l'option IGNORE . safe_mysqld • est renommée en mysqld_safe . Pour encore un peu de temps, nous allons inclure dans nos distributions binaires le script safe_mysqld vous la forme d'un lien symbolique vers mysqld_safe . Les fonctions de l'ancienne API C API • mysql_drop_db , mysql_create_db et mysql_connect ne sont plus supportées, à moins que vous ne compiliez MySQL avec CFLAGS=?DUSE_OLD_FUNCTIONS . Au lieu de cela, il sera plus sage de changer vos programmes, pour qu'il utilisent la nouvelle API 4.0. Dans la structure • MYSQL_FIELD , length et max_length ont évolué de unsigned int en unsigned long . Cela ne va pas causer de problèmes, hormis le fait qu'ils peuvent générer des messages d'alerte lorsqu'ils sont utilisé comme argument de fonctions comme printf() . Vous devriez utiliser la commande • TRUNCATE TABLE lorsque vous voulez effacer toutes les lignes d'une table, et que vous ne souhaitez pas savoir combien de lignes ont été effacées de la table (car TRUNCATE TABLE est plus rapide que DELETE FROM table_name ). Vous allez rencontrer une erreur si vous avez un verrou actif ou une transaction active, et • que vous essayez d'utiliser les commandes TRUNCATE TABLE ou DROP DATABASE . Vous devriez utiliser des entiers pour stocker les valeurs dans les colonnes de type BIGINT • (au lieu d'utiliser des chaînes, comme vous le faisiez en MySQL 3.23). Utiliser des chaînes va toujours fonctionner, mais passer des entiers est bien plus efficace. Le format de • SHOW OPEN TABLE a été changé. Les clients multi?threadés doivent utiliser • mysql_thread_init() et mysql_thread_end()Si vous voulez recompiler le module Perl DBD::mysql, vous devez prendre les versions • Msql?Mysql?modules 1.2218 ou plus récente, car les anciennes versions des module DBD utilisent une fonction drop_db() abandonnée. RAND(seed) • retourne un nombre différent en version 4.0 qu'en version 3.23 : cela est fait 2.5.1 Passer de la version 3.23 à la version 4.0 93 Manuel MySQL 4.1.x ? Version Française pour différencier plus fortement RAND(seed) de RAND(seed+1) . 2.5.2 Passer de la version 3.22 à la version 3.23 MySQL version 3.23 supporte les nouvelles tables MyISAM et les anciennes tables ISAM . Vous n'avez pas à convertir vos anciennes tables pour utiliser la nouvelle version 3.23. Par défaut, toutes les nouvelles tables seront créées avec le type MyISAM (à moins que vous ne lanciez mysqld avec l'option ??default?table?type=isam ). Vous pouvez changer la table ISAM en table MyISAM avec la commande ALTER TABLE table_name TYPE=MyISAM ou le script Perl mysql_convert_table_format . Les clients des versions 3.22 et 3.21 vont fonctionner sans problèmes avec la verison 3.23 du serveur. La liste suivante indique les points à vérifier lors de la migration : Toutes les tables qui utilisent le jeu de caractères • tis620 doivent être corrigées avec myisamchk ?r ou REPAIR TABLE . Si vous exécutez une commande • DROP DATABASE sur un lien symbolique, le lien et la base originale seront effacés. Cela n'arrivait pas en 3.22 car configure ne détectait pas les appels à readlink . OPTIMIZE TABLE • ne fonctionne que pour les tables MyISAM . Pour les autres types de tables, vous devez utiliser ALTER TABLE pour optimiser la table. Durant la commande OPTIMIZE TABLE , la table est verrouillée. Le client MySQL • mysql est démarré par défaut avec l'option option ??no?named?commands (?g) . Cette option peut être désactivée avec ??enable?named?commands (?G) . Cela peut causer des problèmes d'incompatibilité dans certains cas : par exemple, dans les scripts SQL qui utilisent des commandes nommées sans point virgule! Le format long de la commande devrait fonctionner correctement. Les fonctions de date qui travaille sur des parties de dates (comme • MONTH() ) vont désormais retourner 0 pour la date 0000?00?00 . (MySQL 3.22 retournait NULL .) Si vous utilisez le jeu de caractères • allemand pour les tris, vous devez réparer vos tables avec isamchk ?r , car nous avons fait des modifications dans l'ordre de tri. Le type de retour par défaut de • IF dépendant maintenant des deux arguments, et plus seulement du premier. AUTO_INCREMENT • ne fonctionne pas sur les nombres négatifs. La raison pour cela est que les nombres négatifs posaient des problèmes d'écrasement entre ?1 et 0. AUTO_INCREMENT pour les tables MyISAM est maintenant géré à un niveau plus bas, et il est bien plus rapide. Pour les tables MyISAM, les anciens numéros ne sont plus réutilisés, même si vous effacez des lignes dans la table. CASE • , DELAYED , ELSE , END , FULLTEXT , INNER , RIGHT , THEN et WHEN sont de nouveaux mots réservés. FLOAT(X) • est maintenant un véritable type de nombre à virgule flottante, avec un nombre défini de décimales. Lors de la déclaration de • DECIMAL(length,dec) , la taille de l'argument n'inclut plus une place pour le signe ou le séparateur décimal. Une chaîne • TIME doit être fournie au format suivant : [[[DAYS] [H]H:]MM:]SS[.fraction] ou [[[[[H]H]H]H]MM]SS[.fraction] . LIKE • compare maintenant les chaînes en appliquant les mêmes règles que = . Si vous voulez l'ancien comportement, vous pouvez compiler MySQL avec l'option CXXFLAGS=?DLIKE_CMP_TOUPPER . REGEXP • est maintenant insensible à la casse pour les chaînes normales (non binaires). 2.5.2 Passer de la version 3.22 à la version 3.23 94 Manuel MySQL 4.1.x ? Version Française Quand vous vérifiez/réparez des tables, vous devez utiliser • CHECK TABLE ou myisamchk pour les tables MyISAM ( .MYI ) et isamchk pour les tables ISAM ( .ISM ). Si vous voulez que les fichiers d'export de • mysqldump soit compatibles entre les versions MySQL 3.22 et 3.23, vous ne devez pas utiliser l'option ??opt ou ??all de mysqldump . Vérifiez tous vos appels à • DATE_FORMAT() pour vous assurer qu'il y a un signe pourcentage '%' avant chaque caractère de format (MySQL version 3.22 et plus récent avait déjà cette syntaxe). mysql_fetch_fields_direct • est maintenant une fonction (c'était une macro), qui retourne un pointeur sur MYSQL_FIELD au lieu de MYSQL_FIELD . mysql_num_fields() • ne peut plus être utilisé sur les objets MYSQL* (c'est maintenant une fonction qui prend MYSQL_RES* comme argument. Il faut donc utiliser mysql_field_count() à la place). En MySQL version 3.22, le résultat de • SELECT DISTINCT ... était toujours trié. En version 3.23, vous devez spécifier la clause GROUP BY ou ORDER BY pour obtenir un résultat trié. SUM() • retourne désormais NULL , au lieu de 0, si il n'y a pas de lignes à calculer. Ceci s'accorde avec la norme SQL. AND • ou OR avec les valeurs NULL vont désormais retourner NULL au lieu de 0. Cela affecte surtout les requêtes qui utilisait NOT ou une expression AND/OR telle que NOT NULL = NULL . LPAD() et RPAD() vont réduire la taille de la chaîne résultante, si elle est plus grand que l'argument de taille. 2.5.3 Passer de la version 3.21 à la version 3.22 Rien qui n'affecte la compatibilité n'a changé entre les versions 3.21 et 3.22. Le seul problème courant est que les nouvelles tables qui sont créées avec le type DATE vont désormais utiliser le nouveau format de stockage. Vous ne pourrez pas accéder à ces nouveaux formats depuis les vieilles versions de mysqld . Après avoir installé MySQL version 3.22, vous devriez démarrer le nouveau serveur, et exécuter le script mysql_fix_privilege_tables . Il va ajouter les nouveaux droits à la commande GRANT . SI vous oubliez cela, vous obtiendrez des erreurs Access denied lorsque vous essayez d'utiliser les commandes ALTER TABLE , CREATE INDEX ou DROP INDEX . Si votre compte root MySQL utilise un mot de passe, vous devriez l'indiquer au script mysql_fix_privilege_tables . L'interface C de mysql_real_connect() a changé. Si vous avez un vieux client qui appelle cette fonction, vous devez placer un 0 pour le nouvel argument db (ou réécrire le client pour qu'il envoie l'élément db , et accélère les connexions). Vous devez aussi appeler mysql_init() avant d'appeler mysql_real_connect() ! Ce changement a été fait pour permettre l'appel de la fonction mysql_options() , qui sauve les options dans la structure MYSQL . La variable key_buffer de mysqld a changé de nom, et est devenue key_buffer_size , mais vous pouvez toujours utiliser l'ancien nom dans vos fichiers de démarrage. 2.5.4 Passer de la version 3.20 à la version 3.21 Si vous avez une version de MySQL plus ancienne que la version 3.20.28 et que vous voulez passer à la version 3.21, vous devez suivre ces étapes : Vous pouvez démarrer le serveur mysqld version 3.21 avec le script safe_mysqld ??old?protocol pour l'utiliser avec les clients de la version 3.20. Dans ce cas, la fonction mysql_errno() des nouveaux clients ne sera pas fonctionnelle, et seul CR_UNKNOWN_ERROR 2.5.3 Passer de la version 3.21 à la version 3.22 95 Manuel MySQL 4.1.x ? Version Française (mais il fonctionne pour les erreurs client), et le serveur utilisera l'ancienne fonction password() plutôt que la nouvelle. Si vous n'utilisez pas l'option ??old?protocol avec mysqld , vous devez suivre ces instructions : Tous les clients doivent être recompilés. Si vous utilisez ODBC, vous devez obtenir le • nouveau pilote MyODBC 2.x. Le script • scripts/add_long_password doit être utilisé pour convertir le champs Password de la table en CHAR(16) . Tous les mots de passe doivent être réassignés dans la table • pour utiliser les mots de 62 bits au lieu de 31 bits. Le format de table n'a pas changé, ce qui vous évite d'avoir à convertir des tables. • MySQL version 3.20.28 et plus récent peut gérer les nouvelles tables user sans affecter les clients. Si vous avez une version plus ancienne que la 3.20.28, les mots de passe ne seront plus valide, si vous convertissez la table user . Pour être tranquille, commencez par faire passer votre version à la 3.20.28 puis passez en version 3.21. Le nouveau client fonctionne avec le serveur 3.20.x mysqld , alors si vous rencontrez des problèmes avec la version 3.21.x, vous pouvez toujours vous rabattre sur les vieux serveurs 3.20.x sans recompiler les clients. Si vous n'utilisez pas l'option ??old?protocol de mysqld , les vieux clients vont émettre une erreur : ERROR: Protocol mismatch. Server Version = 10 Client Version = 9 La nouvelle interface Perl DBI / DBD supporte aussi l'ancienne interface mysqlperl . Le seul changement que vous devez faire si vous utilisez mysqlperl est de changer les arguments de la fonction connect() . Les nouveaux arguments sont : host , database , user , et password (les arguments user et password ont été échangés). L'interface DBI . Les modifications actuelles affectent les requêtes des anciennes applications : HAVING • doit être spécifié avant la clause ORDER BY . Les paramètres de la fonction • LOCATE() ont été échangés. Il y a de nouveaux mots réservés. Les plus notables sont • DATE , TIME et TIMESTAMP . 2.5.5 Migrer depuis une autre architecture Si vous utilisez MySQL version 3.23, vous pouvez copier les fichiers .frm , .MYI et .MYD entre les différentes architectures qui supportent le même format de nombre à virgule flottante (MySQL prend en charge les échanges d'octets). Les données MySQL des tables ISAM et les fichiers d'index ( .ISD et *.ISM , respectivement) sont dépendantes de l'architecture, et dans certains cas, dépendantes du système d'exploitation. Si vous voulez déplacer des applications vers une autre machine qui a une autre architecture, ou un autre système d'exploitation que votre machine courante, il est recommandé de ne pas faire une simple copie de base en copiant les fichiers vers leur nouvelle destination. Utilisez plutôt mysqldump . Par défaut, mysqldump va créer un fichier de requêtes SQL. Vous pouvez alors transférer le fichier sur une autre machine, et le fournir comme script à un client mysql . Essayez la commande mysqldump ??help pour voir quelles options sont disponibles. Si vous 2.5.5 Migrer depuis une autre architecture 96 Manuel MySQL 4.1.x ? Version Française envoyez les données vers une nouvelle version de MySQL, il recommandé d'utiliser l'option mysqldump ??opt pour obtenir un export compact et plus rapide. Le plus facile (mais pas le plus rapide) pour déplacer une base de données entre deux machines et d'exécuter les commandes suivantes sur la machine qui héberge la base : shell> mysqladmin ?h 'other hostname' create db_name shell> mysqldump ??opt db_name \ | mysql ?h 'other hostname' db_name Si vous voulez copier la base depuis une machine distante sur un réseau lent, vous pouvez utiliser : shell> mysqladmin create db_name shell> mysqldump ?h 'other hostname' ??opt ??compress db_name \ | mysql db_name Vous pouvez aussi stocker le résultat dans un fichier, et transférer le fichier sur la machine de destination, puis charger ce fichier dans le serveur. Par exemple, vous pouvez exporter la base vers un fichier source comme ceci : shell> mysqldump ??quick db_name | gzip > Le fichier créé est compressé. Transférez le fichier contenant le contenu de votre base sur la machine de destination, puis utilisez ces commandes : shell> mysqladmin create db_name shell> gunzip < | mysql db_name Vous pouvez aussi utiliser mysqldump et mysqlimport pour accomplir cette opération. Pour les grandes tables, c'est bien plus rapide que d'utiliser simplement mysqldump . Dans les commandes suivantes, DUMPDIR représente le chemin complet du dossier que vous utilisez pour stocker le résultat de mysqldump .Premièrement, créez un dossier pour les fichiers d'exportation, puis faites l'export : shell> mkdir DUMPDIR shell> mysqldump ??tab=DUMPDIR db_name Puis transférez les fichiers du dossier DUMPDIR dans un dossier correspondant, dans la machine de destination, puis chargez ces fichiers dans MySQL comme ceci : shell> mysqladmin create db_name # Création de la base shell> cat DUMPDIR/*.sql | mysql db_name # Création des tables dans la base shell> mysqlimport db_name DUMPDIR/*.txt # Chargement des données dans les tables N'oubliez pas non plus de copier le contenu de votre base mysql car c'est là que résident les droits ( user , db , host ). Vous devrez alors exécuter les commandes en tant que root MySQL sur la nouvelle machine, jusqu'à ce que vous ayez réinstallé mysql . Après l'importation de la base mysql sur la nouvelle machine, exécutez la commande mysqladmin flush?privileges pour que le serveur relise les droits. 2.6 Notes spécifiques aux systèmes d'exploitation 2.6.1 Notes relatives à Linux (toutes versions) Les notes suivantes relatives à glibc ne s'appliquent que dans la situation où vous construisez MySQL vous?même. Si vous n'utilisez pas Linux sur une machine x86 machine, dans la plupart des cas, il sera mieux pour vous d'utiliser nos binaires. Nous lions nos binaires avec la meilleur version patchée de glibc que nous pouvons fournir et avec les meilleurs options du compilateur, en essayant de les rendre bons pour un serveur qui connait de fortes charges. Et donc, si vous lisez le texte suivant et que vous avez un doute sur ce que vous devez faire, essayez d'abord notre binaire pour voir s'il vous convient, et ne vous souciez de vosz propres constructions qu'après vous être 2.6 Notes spécifiques aux systèmes d'exploitation 97 Manuel MySQL 4.1.x ? Version Française assurés que notre binaire ne répond pas à vos attentes. Dans ce cas, nous apprécierons une note à propos de cela, pour que nous puissions faire mieux la prochaine fois. Pour les besoins d'un utilisateur de base, pour des configurations avec beaucoup de connexions et/ou des tables dépassant la limite des 2G, notre binaire est dans la plupart des cas le meilleur choix.MySQL utilise LinuxThreads sur Linux. Si vous utilisez une vielle version de Linux qui ne possède pas glibc2 , vous devz installer LinuxThreads avant d'essayer de compiler MySQL. Vous pouvez obtenir LinuxThreads à l'adresse suivante : . Note : Nous avons rencontré quelques problèmes étranges avec Linux 2.2.14 et MySQL sur les systèmes SMP. Si vous avez un système SMP, nous vous recommandons de mettre à jour à Linux 2.4 dès que possible ! Votre système n'en sera que plus rapide et plus stable ! Notez que les versions de glibc inférieure ou égale à la 2.1.1 ont un bogue fatal dans la gestion de pthread_mutex_timedwait , qui est utilisé lors que vous exécutez INSERT DELAYED . Nous vous recommandons de ne pas utiliser INSERT DELAYED avant de mettre à jour glibc. Si vous planifiez d'avoir plus de 1000 connexions simultanées, vous aurez besoin d'apporter quelques modifications à LinuxThreads, le recompiler, et relier MySQL avec le nouveau libpthread.a . Augmentez PTHREAD_THREADS_MAX dans sysdeps/unix/sysv/linux/bits/local_lim.h à 4096 et diminuez STACK_SIZE dans linuxthreads/internals.h à 256 KB. Les chemins sont relatifs à la racine de glibc . Notez que MySQL ne sera pas stable autour de 600?1000 connexions si STACK_SIZE est à 2 MB (par défaut). Si MySQL n'arrive pas à ouvrir assez de fichiers, ou à créer assez de connexions, il se peut que vous n'ayez pas configuré Linux pour qu'il gère assez de fichiers. Dans Linux 2.2 ou plus, vous pouvez connaitre le nombre de gestionnaires de fichiers alloués en faisant : cat /proc/sys/fs/file?max cat /proc/sys/fs/dquot?max cat /proc/sys/fs/super?max Si vous avez plus de 16 MB de mémoire, vous devez ajouter qauelque chose comme ce qui suit dans vos scripts d'initialisation ( /etc/init.d/boot.local sur SuSE Linux) : echo 65536 > /proc/sys/fs/file?max echo 8192 > /proc/sys/fs/dquot?max echo 1024 > /proc/sys/fs/super?max Vous pouvez aussi exécuter les commandes précédentes à partir de la ligne de commande en tant que root, mais les changements seront perdus au prochain redémarrage de l'ordinateur. Vous pouvez sinon définir ces paramètres lors du démarrage de la machine en utilisant l'outil sysctl , qui est utilisé par plusieurs distributions Linux (SuSE l'a aussi ajouté, à partir de SuSE Linux 8.0). Ajoutez simplement les valeurs suivantes dans un fichier nommé : # Increase some values for MySQL ?max = 65536 fs.dquot?max = 8192 fs.super?max = 1024 Vous devez aussi ajouter ce qui suit à : [safe_mysqld] open?files?limit=8192 Cela devrait permettre à MySQL de créer jusqu'à 8192 fichiers de constante STACK_SIZE des LinuxThreads contrôle l'espacement des piles de threads dans l'espace d'adressage. Elle doit être assez grande pour qu'il y ait plusieurs chambres pour la pile de chaque 2.6 Notes spécifiques aux systèmes d'exploitation 98 Manuel MySQL 4.1.x ? Version Française thread individuel, mais assez petite pour empêcher les piles de certains threads d'agir sur les données globales de mysqld . Malheureusement, l'implémentation Linux de mmap() , comme nous l'avons découvert, will successfully unmap an already mapped region if you ask it to map out an address already in use, zeroing out the data on the entire page, instead of returning an error. So, the safety of mysqld or any other threaded application depends on the "gentleman" behaviour of the code that creates threads. The user must take measures to make sure the number of running threads at any time is sufficiently low for thread stacks to stay away from the global heap. With mysqld , you should enforce this "gentleman" behaviour by setting a reasonable value for the max_connections variable. Si vous construisez MySQL vous?mêmes et ne voulez pas vous amuser à patcher LinuxThreads, vous ne devez pas dépasser 500 pour la valeur de max_connections . Cela devrait même être moins si vous avez un tampon de clefs assez large, de grosses tables heap, ou d'autres choses qui peuvent faire allouer beaucoup de mémoire à mysqld , ou si vous utilisez un noyau 2.2 avec un patch 2G. Si vous utilisez notre binaire ou RPM 3.23.25 ou plus, vous pouvez mettre max_connections à 1500 sans problèmes, en supposant que vous n'avez ni de grosses tables heap ni grands tampons de clefs. Plus vous réduirez STACK_SIZE dans LinuxThreads plus les threads créés seront sûrs. Nous recommandons une valeur entre 128K et 256K. Si vous utilisez beaucoup de connexions simultanées vous souffrirez peut?être d'une "fonctionnalité" du noyau 2.2 qui pénalise un processus lors du fork ou du clonage d'un enfant en essayant de prévenir un attaque du type fork bomb. This will cause MySQL not to scale well as you increase the number of concurrent clients. On single?CPU systems, we have seen this manifested in a very slow thread creation, which means it may take a long time to connect to MySQL (as long as 1 minute), and it may take just as long to shut it down. On multiple?CPU systems, we have observed a gradual drop in query speed as the number of clients increases. In the process of trying to find a solution, we have received a kernel patch from one of our users, who claimed it made a lot of difference for his site. The patch is available at testing of this patch on both development and production systems. It has significantly improved MySQL performance without causing any problems and we now recommend it to our users who are still running high?load servers on 2.2 kernels. This issue has been fixed in the 2.4 kernel, so if you are not satisfied with the current performance of your system, rather than patching your 2.2 kernel, it might be easier to just upgrade to 2.4, which will also give you a nice SMP boost in addition to fixing this fairness bug. We have tested MySQL on the 2.4 kernel on a 2?CPU machine and found MySQL scales much better?there was virtually no slowdown on queries throughput all the way up to 1000 clients, and the MySQL scaling factor (computed as the ratio of maximum throughput to the throughput with one client) was 180%. We have observed similar results on a 4?CPU system?virtually no slowdown as the number of clients was increased up to 1000, and 300% scaling factor. So for a high?load SMP server we would definitely recommend the 2.4 kernel at this point. We have discovered that it is essential to run mysqld process with the highest possible priority on the 2.4 kernel to achieve maximum performance. This can be done by adding renice ?20 $$ command to safe_mysqld . In our testing on a 4?CPU machine, increasing the priority gave 60% increase in throughput with 400 clients. Nous essayons aussi actuellement d'obtenir des informations sur le bon fonctionnement de MySQL sur le noyaux 2.4 sur les systèmes 4?voies and 8?voies. Si vous avez accès à un tel système et que vous avez effectués quelques tests de performances, envoyez?nous un mail à greatly hurts MySQL performance, especially on SMP systems. The implementation of mutex in LinuxThreads in glibc?2.1 is very bad for programs with many threads that only hold the mutex for a short time. On an SMP system, ironic as it is, if you link MySQL against unmodified 2.6 Notes spécifiques aux systèmes d'exploitation 99 Manuel MySQL 4.1.x ? Version Française LinuxThreads , removing processors from the machine improves MySQL performance in many cases. We have made a patch available for glibc 2.1.3 to correct this behaviour ( ?2.1?patch ).With glibc?2.2.2 MySQL version 3.23.36 will use the adaptive mutex, which is much better than even the patched one in glibc?2.1.3 . Be warned, however, that under some conditions, the current mutex code in glibc?2.2.2 overspins, which hurts MySQL performance. The chance of this condition can be reduced by renicing mysqld process to the highest priority. We have also been able to correct the overspin behaviour with a patch, available at overspin, maximum number of threads, and stack spacing all in one. You will need to apply it in the linuxthreads directory with patch ?p0 </tmp/linuxthreads?2.2.2.patch . We hope it will be included in some form in to the future releases of glibc?2.2 . In any case, if you link against glibc?2.2.2 you still need to correct STACK_SIZE and PTHREAD_THREADS_MAX . We hope that the defaults will be corrected to some more acceptable values for high?load MySQL setup in the future, so that your own build can be reduced to ./configure; make; make install . We recommend that you use the above patches to build a special static version of libpthread.a and use it only for statically linking against MySQL . We know that the patches are safe for MySQL and significantly improve its performance, but we cannot say anything about other applications. If you link other applications against the patched version of the library, or build a patched shared version and install it on your system, you are doing it at your own risk with regard to other applications that depend on LinuxThreads . Si vous rencontrez des problèmes étranges lors de l'installation de MySQL, ou quoi que ce soit qui s'en rapproche, il est fort possible que cela soit un problème de librairie ou de compilateur. Si c'est le cas, l'utilisation de notre binaire les résoudra. Un problème connu avec la distribution binaire est que avec les anciens systèmes Linux qui utilisent libc (comme RedHat 4.x ou Slackware), vous obtiendrez quelques erreurs non?fatales de résolutions de noms d'hôtes. Notes relatives à Linux pour les distribution binaires . Lors de l'utilisation des LinuxThreads vous verrez un minimum de trois processus en cours. Il s'agit en fait de threads, il y'a a un pour le gestionnaire des LinuxThreads, un pour gérer les connexions, et un autre pour gérer les alarmes et les signaux.Notez que le noyau Linux et la librairie LinuxThread ne peuvent avoir par défaut que 1024 threads. Cela signifie que vous ne pouvez avoir que 1021 connexions à MySQL sur un système non?patché. La page vous voyez un processus de démon mysqld mort avec ps , cela signifie le plus souvent que vous crashe constamment . To get a core dump on Linux if mysqld dies with a SIGSEGV signal, you can start mysqld with the ??core?file option. Note that you also probably need to raise the core file size by adding ulimit ?c 1000000 to safe_mysqld or starting safe_mysqld with ??core?file?size=1000000 . safe_mysqld , le script père de mysqld . Si vous liez votre propre client MySQL et que vousobtenez l'erreur suivante : .1: ./my: fatal: .4: open failed: No such file or directory lors de son exécution, le problème peut être contourné des façons suivantes : Liez le client avec les options suivantes (au lieu de • ?Lpath ) : ?Wl,r/path? . Copiez • dans /usr/lib . 2.6 Notes spécifiques aux systèmes d'exploitation 100 Manuel MySQL 4.1.x ? Version Française Ajoutez le chemin vers le répertoire où se trouve • à la variable d'environnement LD_RUN_PATH avant de mettre en marche votre client. Si vous utilisez le compilateur Fujitsu (fcc / FCC) vous aurez quelques problèmes en compilant MySQL car les fichiers d'entêtes Linux sont très orientés gcc . La ligne suivante de configure devrait fonctionner avec fcc/FCC : CC=fcc CFLAGS="?O ?K fast ?K lib ?K omitfp ?Kpreex ?D_GNU_SOURCE \ ?DCONST=const ?DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="?O ?K fast ?K lib \ ?K omitfp ?K preex ??no_exceptions ??no_rtti ?D_GNU_SOURCE ?DCONST=const \ ?Dalloca=__builtin_alloca ?DNO_STRTOLL_PROTO \ '?D_EXTERN_INLINE=static __inline'" ./configure ??prefix=/usr/local/mysql \ ??enable?assembler ??with?mysqld?ldflags=?all?static ??disable?shared \ ??with?low?memory 2.6.1.1 Notes relatives à Linux pour les distributions binaires MySQL requière au moins la version 2.0 de Linux. Attention : Certains utilisateurs de MySQL nous ont avertis qu'ils ont rencontré de graves problèmes de stabilité avec MySQL et le noyau 2.2.14 de Linux. Si vous utilisez ce noyau, vous devez mettre à jour à la 2.2.19 (ou plus récent) ou a un noyau 2.4. Si vous utilisez un ordinateur multi?processeurs, vous devriez sérieusement songer à passer au noyau 2.4 qui vous aportera de grandes performances niveau vitesse. La version binaire est liée avec ?static , ce qui signifie que normalement vous n'avez pas besoin de vous soucier des versions des librairies système que vous avez. Vous n'avez pas besoin d'installer LinuxThreads non plus. Un programme lié avec ?static est légèrement plus grand qu'un programme liée dynamiquement mais aussi un peu plus rapide (3?5%). Un problème, toutefois, est que vous ne pouvez utiliser de fonctions définies par l'utilisateur avec un programme lié statiquement. Si vous allez écrire ou utiliser des fonctions UDF (c'est réservé aux développeurs C ou C++), vous devez compiler MySQL vous?mêmes, en utilisant les liaisons dynamiques. Si vous utilisez un système basé sur libc (au lieu de glibc2 ), vous aurez probablement quelques problèmes de résolution des noms d'hôtes et des problèmes avec getpwnam() avec les versions binaires. (Cela vient du fait que glibc dépend malheureusement de quelques librairies externes pour résoudre les noms d'hôtes et getpwent() , même quand elle est compilée avec ?static ). Dans ce cas, vous obtiendrez probablement l'erreur suivante quand vous exécuterez mysql_install_db : Sorry, the host 'xxxx' could not be looked up ou l'erreur suivante quand vous essayez de démarrer mysqld avec l'option ??user : getpwnam: No such file or directory Vous pouvez résoudre ce problème de la façon suivante : Obtenez une distribution des sources MySQL (un distribution RPM ou le • ) et installez la à la place. Exécutez • mysql_install_db ??force ; cela n'exécutera pas le test resolveip dans mysql_install_db . Le mauvais côté est que vous ne pourrez pas utiliser de noms d'hôtes dans les tables de droits; vous devez utiliser les adresses IP à la place (sauf pour localhost ). Si vous utilisez une vielle version de MySQL qui ne supporte pas ??force , vous devez supprimer le test resolveip dans mysql_install à l'aide d'un éditeur. Démarrez • mysqld avec su au lieu d'utiliser ??user . 2.6.1.1 Notes relatives à Linux pour les distributions binaires 101 Manuel MySQL 4.1.x ? Version Française Le binaire Linux?Intel et les RPM de MySQL sont configurés pour la vitesse la plus grande possible. Nous essayons toujours d'utiliser le compilateur le plus rapide support Perl de MySQL requière la version 5.004_03 de Perl ou plus récent. Sur quelques version de Linux 2.2, vous pouvez obtenir l'erreur Resource temporarily unavailable quand vous faites beaucoup de nouvelles connexions à un serveur mysqld en utilisant TCP/IP. Le problème est que Linux possède un délai entre votre fermeture de la socket TCP/IP et sa libération par le système. Vu qu'il y'a un nombre fini de places pour les branchements TCP/IP, vous obtiendrez l'erreur précédente si vous essayez de faire beaucoup de connexions TCP/IP en peu de temps, comme quand vous exécutez le benchmark MySQL test?connect via TCP/IP. Nous avons envoyé des questions plusieurs fois à propos de ce problème à différentes listes de diffusions Linux mais n'avons jamais réussi à résoudre ce problème proprement. Le seul 'correctif' connu pour ce problème est d'utiliser des connexions persistantes dans vos clients ou d'utiliser les sockets, si vous utilisez le serveur de bases de données et le client sur la même machine. Nous espérons que le noyau de Linux 2.4 corrigera ce problème bientôt. 2.6.1.2 Notes relatives à Linux x86 MySQL requière la version 5.4.12 de libc ou plus récent. Il est connu pour fonctionner avec libc 5.4.46. La version 2.0.6 de glibc ou plus récente devrait aussi fonctionner. Il y'a eu quelques problèmes avec les RPM de glibc de RedHat, et donc, si vous avez des problèmes, vérifiez s'il existe des mises à jour ! Les RPM de glibc 2.0.7?19 et 2.0.7?29 snot connus pour fonctionner. Si vous utilisez gcc 3.0 ou plus récent pour compiler MySQL, vous devez installer la librairie libstdc++v3 avant de compiler MySQL; si vous ne le faites pas vous obtiendrez une erreur à propos d'un symbole __cxa_pure_virtual manquant durant la liaison ! Sur quelques vieilles distributions de Linux, configure peut produire une erreur comme celle qui suit : Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file. See the Installation chapter in the Reference Manual. Faites ce que le message d'erreur dit et ajoutez un _ à la macro _P qui n'en a qu'un, puis essayez à pouvez obtenir quelques avertissements en compilant; celles qui suivent peuvent être ignorées : ?o objs?thread/mysqld.o : In function `void init_signals()': :315: warning: assignment of negative value `?1' to `long unsigned int' : In function `void * signal_hand(void *)': :346: warning: assignment of negative value `?1' to `long unsigned int' Sur Debian GNU/Linux, si vous voulez que MySQL démarre automatiquement lors du démarrage de votre système, faites ce qui suit : shell> cp support?files/mysql.server /etc/init.d/mysql.server shell> /usr/sbin/update?rc.d mysql.server defaults 99 mysql.server peut être trouvé dans le dossier share/mysql dans le dossier d'installation de MySQL ou dans le dossier support?files de l'arborescence des sources de MySQL. Si mysqld provoque toujours un core dump au démarrage, le problème peut être que vous avez un vieux /lib/libc.a . Renommez le, puis supprimez sql/mysqld et faites à nouveau un make 2.6.1.2 Notes relatives à Linux x86 102 Manuel MySQL 4.1.x ? Version Française install puis réassayez. Ce problème a été reporté sur quelques installations de Slackware. Si vous obtenez l'erreur suivante en liant mysqld , cela signifie que votre libg++.a n'est pas installé correctement : /usr/lib/libc.a(putc.o): In function `_IO_putc': putc.o(.text+0x0): multiple definition of `_IO_putc' Vous pouvez éviter d'utiliser libg++.a en exécutant configure comme suit : shell> CXX=gcc ./configure 2.6.1.3 Notes relatives à Linux SPARC Sur quelques implémentations, readdir_r() est cassé. Le symptome est que SHOW DATABASES retourne toujours un résultat vide. Cela peut être corrigé en supprimant HAVE_READDIR_R de config.h après avoir configuré et avant de commencer à compiler. Quelques problèmes demanderont le patchage de votre installation Linux. Le patch peut être trouvé distribution sparclinux? de Linux qui est disponible sur (une version de Linux qui n'a jamais été mélangée avec la 2.0.30 officielle). Vous devez aussi installer la version 0.6 des LinuxThreads ou une version plus récente. 2.6.1.4 Notes relatives à Linux Alpha La version 3.23.12 de MySQL est la première version de MySQL à être testée sur Linux?Alpha. Si vous voulez utiliser MySQL sur Linux?Alpha, vous devez vous assurer d'avoir cette version ou une version plus récente. Nous avons testé MySQL sur Alpha avec nos benchmarks et notre suite de tests, et cela semble fonctionner correctement. Nous construisons actuellement les packages binaires de MySQL sur SuSE Linux 7.0 pour AXP, kernel 2.4.4?SMP, Compaq C compiler (V6.2?505) et Compaq C++ compiler (V6.3?006) sur une machine Compaq DS20 avec un processeur Alpha pouvez trouver les précédents lieu de gcc, nous obtenons à peu près 9?14% de meilleures performances avec MySQL.Notez que jusqu'au version 3.23.52 et 4.0.2 de MySQL nous avons optimisé le binaire pour le CPU courant seulement (en utilisant l'option de compilation ?fast ); cela signifiait que vous ne pouviez utiliser nos binaires si vous n'aviez pas un processeur Alpha EV6. Avec les realeases suivantes nous avons ajouté l'option ?arch generic à nos options de compilation, ce qui assure que le binaire fonctionne sur tout les processeurs Alpha. Nous compilons aussi statiquement pour éviter les problèmes de librairies. CC=ccc CFLAGS="?fast ?arch generic" CXX=cxx \ CXXFLAGS="?fast ?arch generic ?noexceptions ?nortti" \ ./configure ??prefix=/usr/local/mysql ??disable?shared \ ??with?extra?charsets=complex ??enable?thread?safe?client \ ??with?mysqld?ldflags=?non_shared ??with?client?ldflags=?non_shared Si vous voulez utiliser egcs la ligne de configuration suivante a fonctionné pour nous : CFLAGS="?O3 ?fomit?frame?pointer" CXX=gcc \ CXXFLAGS="?O3 ?fomit?frame?pointer ?felide?constructors \ ?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql \ 2.6.1.3 Notes relatives à Linux SPARC 103 Manuel MySQL 4.1.x ? Version Française ??disable?shared Quelques problèmes connus lors de l'utilisation de MySQL sur Linux?Alpha: Le débogage d'applications thréadées comme MySQL ne fonctionnera pas avec • gdb 4.18 . Vous devez télécharger et utiliser gdb 5.1 à la place ! Si vous essayez de lier statiquement • mysqld en utilisant gcc , l'image résultante videra son noyau (core dump) au démarrage. En d'autres termes, n' utilisez pas ??with?mysqld?ldflags=?all?static avec gcc . 2.6.1.5 Note relative à Linux PowerPC MySQL devrait fonctionner sur MkLinux avec le dernier package glibc (testé avec glibc 2.0.7). 2.6.1.6 Notes relatives à Linux MIPS Pour faire fonctionner MySQL sur Qube2, (Linux Mips), vous aurez besoin de la librairie glibc la plus récente ( glibc?2.0.7?29C2 est connue pour marcher). Vous devez aussi utiliser le compilateur egcs C++ ( egcs?1.0.2?9 , gcc 2.95.2 ou plus récent). 2.6.1.7 Notes relatives à Linux IA64 Pour pouvoir compiler MySQL sous Linux IA64, nous utilisons les lignes de compilation suivante : En utilisant gcc?2.96 : CC=gcc CFLAGS="?O3 ?fno?omit?frame?pointer" CXX=gcc \ CXXFLAGS="?O3 ?fno?omit?frame?pointer ?felide?constructors \ ?fno?exceptions ?fno?rtti" ./configure ??prefix=/usr/local/mysql \ "??with?comment=Official MySQL binary" ??with?extra?charsets=complex Sur IA64 les binaires des clients MySQL utilisent des librairies partagées. Cela signifie que si vous installez notre distribution binaire à un autre endroit que /usr/local/mysql vous devez modifier le fichier ou ajouter le chemin vers le répertoire où vous avez à la variable d'environnement LD_LIBRARY_PATH . Problèmes en reliant avec la librairie du client MySQL . 2.6.2 Notes relatives à Windows Cette section décrit l'utilisation de MySQL sur Windows. Ces informations sont aussi fournies dans le fichier README disponible avec la distribution Windows de MySQL. 2.6.2.1 Démarrer MySQL sous Windows 95, 98 ou Me MySQL utilise TCP/IP pour connecter le client au serveur (cela permet à une machine distante de se connecter à votre serveur MySQL). A cause de cela, vous devez installer TCP/IP sur votre machine avant de démarrer MySQL. Vous pouvez trouver TCP/IP sur votre CDRom Windows.Notez que si vous utilisez une vieille version de Windows 95 (par exemple, OSR2), il est probable que vous ayez une vieille version du Winsock; MySQL requiert Winsock 2! Vous pouvez librairie Winsock 2, et ce paragraphe ne s'applique démarrer le serveur mysqld , vous 2.6.1.5 Note relative à Linux PowerPC 104 Manuel MySQL 4.1.x ? Version Française devez utiliser une fenêtre MS?DOS et y taper : C:\> C:\mysql\bin\mysqld Cela va démarrer mysqld en tâche de fond, sans fenê pouvez arrêter MySQL avec la commande : C:\> C:\mysql\bin\mysqladmin ?u root shutdown Ce script appelle l'utilitaire d'administration MySQL sous le nom de `root', qui est l'administrateur par défaut. Notez bien que les noms d'utilisateurs de MySQL sont totalement indépendants des utilisateurs Windows.Notez que Windows 95/98/Me ne supporte pas la création des pipes nommés. Sur ces plate?formes, vous ne pouvez utiliser que des pipes pour vous connecter à un serveur MySQL distant, qui tournerait sur un hôte Windows NT/2000/XP (le serveur MySQL soit aussi supporter les pipes nommés, bien sur. Par exemple, utiliser mysqld?opt sous NT/2000/XP ne permettra pas d'utiliser les pipes nommés. Vous devez utiliser soit mysqld?nt , soit mysqld?max?nt ). Si mysqld ne démarre pas, vérifiez le fichier \mysql\data\ pour voir si le serveur n'a pas placé un message d'erreur indiquant la cause du problème. Vous pouvez aussi essayer de démarrer le serveur avec la commande mysqld ??standalone ; dans ce cas, vous pourriez voir apparaître des informations sur l'écran qui vous aideront à résoudre le problème. La dernière option est de démarrer mysqld avec l'option ??standalone ??debug . Dans ce cas, mysqld va écrire le fichier de log C:\mysqld.trace qui devrait contenir l'explication du problème. Créer des fichiers de traçage . Utilisez mysqld ??help pour afficher toutes les options que mysqld comprend! 2.6.2.2 Démarrer MySQL sur Windows NT, 2000 ou XP Pour faire fonctionner MySQL avec TCP/IP sous Windows NT 4, vous devez installer le service pack 3 (ou plus récent)! Normalement, vous devez installer MySQL comme un service Windows NT/2000/XP. Dans le cas où le serveur fonctionnerait déjà, commencez par le stopper, en utilisant cette commande : C:\mysql\bin> mysqladmin ?u root shutdown Cela appelle l'utilitaire d'administation MySQL, avec l'utilisateur ` root ', qui est par défaut un Administrateur de MySQL. Notez bien que le système de droits de MySQL est totalement indépendant du système d'utilisateur de Windows.Maintenant, l'installation du serveur en tant que service : C:\mysql\bin> mysqld?max?nt ??install Si des options sont nécessaires, vous devez les spécifier comme `` Start parameters '' dans l'utilitaire Windows Services avant de démarrer le service MySQL.L'utilitaire Services ( Windows Service Control Manager ) est disponible dans le Windows Control Panel (sous les Outils d'administration de Windows 2000). Il est recommandé de fermer les utilitaires de services durant l'installation ??install ou la suppression ??remove , pour éviter des erreurs étranges. sous Windows . Notez bien que depuis MySQL version 3.23.44, vous avez le choix de configurer le serveur en 2.6.2.2 Démarrer MySQL sur Windows NT, 2000 ou XP 105 Manuel MySQL 4.1.x ? Version Française Manual au lieu d'automatique (si vous ne voulez pas que le service démarre en même temps que le serveur) : C:\mysql\bin> mysqld?max?nt ??install?manual Le service est installé avec le nom MySQL . Une fois installé, il peut être immédiatement démarré depuis l'utilitaire Services , ou avec la commande en ligne NET START MySQL .Une fois qu'il fonctionne, mysqld?max?nt peut être arrété avec mysqladmin , depuis l'utilitaire de services, ou en utilisant la commande en ligne NET STOP MySQL . Lorsqu'il fonctionne comme service, le système d'exploitation va automatiquement arréter MySQL au moment de l'exticntion. Avec MySQL versions inférieures à 3.23.47, Windows attendait simplement quelques secondes l'extinction, puis si cela durait trop, il tuait le processus, ce qui causait parfois des problèmes. Par exemple, au démarrage suivant, le gestionnaire de table InnoDB devait faire une restauration après crash. Depuis MySQL version 3.23.48, Windows attend plus longtemps que MySQL s'arrête. Si vous notez que ce temps n'est pas suffisant pour votre installation, il est recommandé de ne pas utiliser MySQL sous forme de service, mais à partir de la ligne de commande, et de l'éteindre manuellement avec mysqladmin shutdown . Il y a ce problème avec Windows NT (mais pas Windows 2000/XP), qui, par défaut, attend 20 secondes l'extinction d'un service, puis tue le processus. Vous pouvez augmenter ce délai en ouvrant l'éditeur de base de registre \winnt\system32\ et en modifiant la valeur de WaitToKillServiceTimeout dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control . Spécifiez une nouvelle valeur en millisecondes, par exemple 120000 pour que Windows NT attende désormais jusqu'à 120 secondes. Notez que lorsqu'il fonctionne comme un service, mysqld?max?nt n'a pas d'accès à la console, et ainsi, aucun mesasge n'est disponible. Les erreurs sont alors stockées dans le fichier c:\mysql\data\ . Si vous avez des problèmes à installer mysqld?max?nt comme service, essayer de le démarrer en utilisant le chemin complet : C:\> C:\mysql\bin\mysqld?max?nt ??install Si cela ne fonctionne pas, vous pouvez faire démarrer proprement mysqld?max?nt en modifiant le chemin dans la base de vous ne voulez pas démarrer mysqld?max?nt comme service, vous pouvez le démarrer comme ceci : C:\> C:\mysql\bin\mysqld?max?nt ??standalone ou C:\> C:\mysql\bin\mysqld ??standalone ??debug Cette dernière méthode vous donnera une trace de débogage dans le fichier C:\mysqld.trace . Créer des fichiers de traçage . 2.6.2.3 Faire fonctionner MySQL sous Windows MySQL supporte TCP/IP sur toutes les plate?formes Windows et les tunnels nommés sur NT/2000/XP. Par défaut, les tunnels nommés sont utilisés sur NT/2000/XP pour les connexions locales et TCP/IP pour tout les autres cas si le client à TCP/IP d'installé. Le nom d'hôte spécifie le protocole à utiliser : Nom d'hôte Protocole NULL Sur NT/2000/XP, essayer les tunnels nommés avant; si cela ne fonctionne pas, (aucun) utiliser TCP/IP. Sur 9x/Me, TCP/IP est utilisé. 2.6.2.3 Faire fonctionner MySQL sous Windows 106 Manuel MySQL 4.1.x ? Version Française . Tunnels nommés localhost TCP/IP vers l'hôte courant hostname TCP/IP Vous pouvez forcer un client MySQL à utiliser les tunnels nommés en spécifiant l'option ??pipe ou en spécifiant le nom d'hôte . en tant que nom d'hôte. Utilisez l'option ??socket pour spécifier le nom du tunnel. Notez qu'à partir de la version 3.23.50, les tunnels nommés ne sont activés que si mysqld est démarré avec ??enable?named?pipe . Il en est ainsi car certains utilisateurs ont rencontré des problèmes en coupant le serveur MySQL lorsque celui?ci utilise des tunnels nommés. Vous pouvez vérifier si MySQL fonctionne en exécutant les commandes suivantes : C:\> C:\mysql\bin\mysqlshow C:\> C:\mysql\bin\mysqlshow ?u root mysql C:\> C:\mysql\bin\mysqladmin version status proc C:\> C:\mysql\bin\mysql test Si mysqld est lent à répondre aux connexions sur Windows 9x/Me, il y'a probablement un problème avec vos DNS. Dans ce cas, démarrez mysqld avec ??skip?name?resolve et utilisez localhost et les adresses IP dans les tables de droits MySQL. Vous pouvez aussi éviter les DNS lors de la connexion à un serveur mysqld?nt MySQL tournant sur NT/2000/XP en utilisant l'argument ??pipe pour spécifier l'utilisation des tunnels nommés. Cela fonctionne pour la plupart des clients y'a deux versions de l'outil en ligne de commande MySQL : Binaire Description Compilé nativement sur Windows, ce qui fournit des possiblités très limitées d'édition de mysql texte. mysqlc Compilé avec le compilateur Cygnus GNU et librairies, ce qui fournit l'édition readline . Si vous voulez utiliser , vous devez copier C:\mysql\lib\ dans le répertoire système de Windows ( \windows\system ou un endroit similaire). Les privilèges par défaut sur Windows donnent un accès à tous les utilisateurs locaux pour toutes les bases de données sans spécifier de mot de passe. Pour rendre MySQL un peu plus sécurisé, vous devez définir un mot de passe pour tout les utilisateurs et supprimer la ligne dans la table qui contient Host='localhost' et User='' . Vous devez aussi ajouter un mot de passe pour le nouvel utilisateur root . L'example suivant commence par supprimer l'utilisateur anonyme qui possède tous les privilèges, puis configure un mot de passe pour l'utilisateur root : C:\> C:\mysql\bin\mysql mysql mysql> DELETE FROM user WHERE Host='localhost' AND User=''; mysql> QUIT C:\> C:\mysql\bin\mysqladmin reload C:\> C:\mysql\bin\mysqladmin ?u root password votre_mot_de_passe Après avoir changé le mot de passe, si vous voulez couper le serveur mysqld , vous pouvez le faire en utilisant la commande : C:\> mysqladmin ??user=root ??password=votre_mot_de_passe shutdown Si vous utilisez la vielle version 3.21 de MySQL sous Windows, la commande précédente échouera avec l'erreur : parse error near 'SET password' . La solution est de mettre à jour à la dernière version de MySQL qui est maintenant disponible. 2.6.2.3 Faire fonctionner MySQL sous Windows 107 Manuel MySQL 4.1.x ? Version Française Avec les versions courantes de MySQL vous pouvez facilement ajouter des utilisateurs et changer les privilèges avec les commandes GRANT et REVOKE . Syntaxe de GRANT et REVOKE . 2.6.2.4 Connexion à un serveur MySQL distants, sous Windows avec SSH Voici une note pour connecter un serveur MySQL avec une connexion sécurisée grâce à SSH (de David Carlson ) : Installez un client SSH pour votre machine Windows. En tant qu'utilisateur, le meilleur que je • connaisse est celui de SecureCRTf?secureavec Google à . Démarrez votre client SSH Windows. Spécifiez • Host_Name = yourmysqlserver_URL_or_IP . Spécifiez userid=your_userid pour vous loger dans votre serveur (probablement avec un mot de passe et un nom d'utilisateur différent). Configurez le forward de port. Faites soit un forward distant (spécifiez • local_port: 3306 , remote_host: yourmysqlservername_or_ip , remote_port: 3306 ) soit un forward local (spécifiez port: 3306 , host: localhost , remote port: 3306 ). Sauvez le tout, sinon vous devrez le refaire la prochaine fois. • Connectez vous à votre serveur avec la session SSH que vous venez de créer. • Sous votre machine Windows, démarrez une application ODBC (comme Access). • Créez un nouveau fichier dans Windows et reliez le avec MySQL en utilisant le pilote ODBC • de la même façon que vous le feriez habituellement, hormis le fait que vous devrez taper localhost comme hôte serveur au lieu de yourmysqlservername . Vous avez maintenant une connexion ODBC avec un serveur MySQL distant, et sécurisée avec SSH. 2.6.2.5 Paratger les données entre plusieurs disque sous Windows A partir de la version 3.23.16 de MySQL, les serveurs mysqld?max et mysql?max?nt dans les distributions MySQL sont compilés avec l'option ?DUSE_SYMDIR . Cela vous permet de placer une base de données sur un disque différent en lui ajoutant un lien symbolique (c'est d'une certaine manière similaire au fonctionnement des liens symboliques sous Unix). Sous Windows, vous créez un lien symbolique vers la base de données en créant un fichier qui contient le cheminvers le répertoire de destination et en le sauvant dans le répertoire mysql_data sous le nom . Notez que le lien symbolique ne sera utilisé que si le répertoire mysql_data_dir\database n'existe pas. Par exemple, si le répertoire des données de MySQL est C:\mysql\data et que vous voulez avoir une base de données foo située dans D:\data\foo , vous devez créer le fichier C:\mysql\data\ qui contient le texte D:\data\foo\ . Après cela, toutes les tables crées dans foo le seront dans D:\data\foo . Notez qu'à cause de la pénalité sur la vitesse que vous obtenez en ouvrant toutes les tables, nous n'avons pas activé cela par défaut, même si vous avez compilé MySQL avec le support des liens symboliques. Pour les activer, vous devez placer dans votre fichier ou l'entrée suivante : 2.6.2.4 Connexion à un serveur MySQL distants, sous Windows avec SSH 108 Manuel MySQL 4.1.x ? Version Française [mysqld] use?symbolic?links En MySQL 4.0 nous activerons les liens symboliques par défaut. Vous devrez alors utiliser l'option skip?symlink pour les désactiver. 2.6.2.6 Compiler les clients MySQL sous Windows Dans vos fichiers sources, vous devez inclure windows.h avant mysql.h : #if defined(_WIN32) || defined(_WIN64) #include <windows.h> #endif #include <mysql.h> Vous pouvez soit lier votre code avec la librairie dynamique , qui est juste une interface pour charger à la demande, soit lier avec la librairie statique . Notez que puisque les librairies mysqlclient sont compilées en tant que librairies threadées, vous devez aussi compiler votre code pour qu'il soit multi?thréadé ! 2.6.2.7 MySQL pour Windows face à MySQL pour Unix MySQL pour Windows a prouvé qu'il était très stable. Cette version de MySQL a les mêmes fonctionnalités que la version Unix, a quelques exceptions : Windows 95 et les threads Windows 95 perf environs 200 octets de mémoire central lors de la création de chaque thread. Chaque connexion MySQL crée un nouveau thread, ce qui fait qu'il n'est pas recommandé d'exécuter mysqld pour des durées longues sur Windows 95 si votre serveur gère de nombreuses connexions. Les autres versions de Windows ne souffrent pas du même problème. Lectures concurrentes MySQL dépends des fonctions pread() et pwrite() pour être capable de mêler des INSERT et des SELECT . Actuellement, nous utilise mutexes pour émuler les fonctions pread() / pwrite() . Nous allons, à long terme, remplacer ce niveau d'interface par une interface virtuelle de façon à ce que nous puissions utiliser l'interface readfile() / writefile() de Windows NT/2000/XP pour gagner de la vitesse. L'implémentation courante limite le nombre de fichiers ouverts par MySQL à 1024, ce qui signifie que vous ne pouvez pas utiliser d'aussi nombreux threads concurrents sur NT/2000/XP que sur Unix. Blocking read MySQL utilise une lecture bloquée pour chaque connexion. Cela signifie que : Une connexion ne sera pas déconnectée automatiquement après 8 heures d'inactivité, comme c'est le cas sous Unix. Si une connexion se bloque, il est impossible de la détruire sans tuer MySQL. mysqladmin kill ne fonctionne pas sur une connexion endormie. mysqladmin shutdown ne peut pas s'exécuter tant qu'il y a des connexions qui dorment. Nous envisageons de corriger ce problème, lorsque les développeurs Windows auront fourni un palliatif. DROP DATABASE 2.6.2.6 Compiler les clients MySQL sous Windows 109 Manuel MySQL 4.1.x ? Version Française Vous ne pouvez pas détruire une base qui est utilisée par un autre thread. Killing MySQL from the task manager Vous ne pouvez pas tuer MySQL depuis le gestionnaire de tâche ou avec un utilitaire d'extinction de Windows 95. Vous devez l'éteindre avec mysqladmin shutdown . Noms sensibles à la casse Les noms de fichiers sont insensibles à la casse sous Windows, ce qui fait que les noms de tables et de bases ne sont pas sensibles à la casse pour MySQL sur Windows. La seule restriction est que les noms de tables et de bases doivent être donnés avec même casse dans le nom (tout en majuscules, ou en minuscules). Sensibilité à la casse pour les noms . Le caractère '\' Les composants d'un chemin sont séparés par le caractère '\' sous Windows, qui est aussi le caractère de protection de MySQL. Si vous utilisez la commande LOAD DATA INFILE ou SELECT ... INTO OUTFILE , vous devez doubler le caractère '\' : mysql> LOAD DATA INFILE "C:\\tmp\\" INTO TABLE skr; mysql> SELECT * INTO OUTFILE 'C:\\tmp\\' FROM skr; Alternativement, vous pouvez utiliser les noms de fichiers au format Unix, avec le caractère '/' : mysql> LOAD DATA INFILE "" INTO TABLE skr; mysql> SELECT * INTO OUTFILE '' FROM skr; Can't open named pipe erreur Si vous utilisez MySQL 3.22 sous NT avec les derniers clients mysql, vous allez obtenir cette erreur : error 2017: can't open named pipe to host: . pipe... Ceci est dû au fait que les versions modernes de MySQL utilisent des pipes nommés sous NT, par défaut. Pour éviter cette erreur, vous devez utiliser l'option ??host=localhost sur les nouveaux clients, ou bien créer le fichier d'options C:\ , qui contiendra les informations suivantes : [client] host = localhost Depuis la version 3.23.50, les pipes nommés sont les seuls activés si mysqld est démarré avec ??enable?named?pipe . Erreur Access denied for user Si vous rencontrez l'erreur Access denied for user: '[email protected]' to database 'mysql' lors de l'accès au serveur MySQL sur la même machine, cela signifie que MySQL ne peut résoudre proprement votre nom d'hô corriger cela, vous devriez créer un fichier \windows\hosts dans l'information suivante : 127.0.0.1 localhost ALTER TABLE Lorsque vous exécutez la commande ALTER TABLE , la table est verrouillé, empêchant les autres threads d'y accéder. Cela est lié au fait que sous Windows, vous ne pouvez pas effacer un fichier qui est en cours d'utilisation par d'autres threads : à l'avenir, vous pourrions trouver un moyen de contourner ce problème. La commande DROP TABLE sur une table qui est utilisée dans le cadre d'un MERGE ne fonctionne pas sous Windows, car le gestionnaire de MERGE garde la carte des tables cachée de la couche supérieure de MySQL. Comme Windows ne vous autorise pas à effacer des fichiers qui sont ouverts, vous devez d'abord vider de la mémoire toutes les tables du MERGE (avec la commande FLUSH TABLES ) puis effacer la table MERGE avant d'effacer les tables. Nous allons corriger cela lorsque nous introduirons la notion de VIEW s. Les directives DATA DIRECTORY et INDEX DIRECTORY de CREATE TABLE sont ignorées sous Windows, car Windows ne supporte pas les liens symboliques. 2.6.2.6 Compiler les clients MySQL sous Windows 110 Manuel MySQL 4.1.x ? Version Française Voici quelques problèmes connus et pas encore corrigés, si jamais quelqu'un souhaite nous aider sur la version Windows : Mettre en place une librairie pour un utilisateur simple • . Elle inclurait toutes les caractéristiques d'un serveur MySQL standard, hormis la création de threads. Cela permettra d'inclure facilement MySQL dans des applications qui n'ont pas vraiment besoin du support client, ou qui n'ont pas besoin d'accéder à un serveur distant. Ajouter des icônes sympas pour le démarrage et l'arrêt de MysQL, dans l'installateur. • Lorsque • mysqld est enregistré comme service avec ??install (sous NT) il serait bien de pouvoir ajouter les options par défaut de la ligne de commande. Pour le moment, le palliatif consiste à lister les paramètres dans le fichier C:\ . Il serait vraiment pratique de pouvoir arrêter le processus • mysqld depuis le gestionnaire de tâches. Pour le moment, il faut passer par mysqladmin shutdown . Le port de • readline sur Windows pour pouvoir l'utiliser avec l'outil de ligne de commande mysql . Des versions graphiques des clients standards MySQL ( • mysql , mysqlshow , mysqladmin et mysqldump ) seraient bien. Il serait bien si les fonctions de lecture et d'écriture sur les sockets de • net.c pouvaient être interrompues. Cela rendrait possible l'arrêt des threads en court avec mysqladmin kill sous Windows. mysqld • se lance toujours avec la locale "C" et non pas avec la locale par défaut. Nous voulons que mysqld utilise la configuration de localisation pour l'ordre de tri. Ajouter des macros pour utiliser les méthodes rapides d'incrément/décrément compatibles • avec les threads, fourni par Windows. D'autres spécificités de Windows sont décrites dans le fichier README qui est livré avec la distribution Windows de MySQL. 2.6.3 Remarques pour Solaris Sous Solaris, vous pouvez renontrer des problèmes avant même d'avoir désarchivé la distribution MySQL! Le programme tar de Solaris ne peut pas manipuler de noms de fichiers longs, provoquant les messages suivants quand vous décompressez MySQL : x mysql?3.22.12?beta/bench/Results/ATIS?mysql_odbc?NT_4.0?cmp?db2,\ informix,ms?sql,mysql,oracle,solid,sybase, 0 bytes, 0 tape blocks tar: directory checksum error Dans ce cas, vous devez utiliser GNU tar ( gtar ) pour désarchiver la distribution. Vous pouvez native des threads Sun fonctionne uniquement depuis Solaris 2.5. Pour les versions 2.4 et antérieures, MySQL utilisera automatiquement les MIT?pthreads. Remarques sur MIT?pthreads . Vous pouvez rencontrer les erreurs suivantes lors du configure: checking for restartable system calls... configure: error can not run test programs while cross compiling Cela signifie que l'installation de votre compilateur est défectueuse! Dans ce cas, vous devez mettre à jour votre compilateur en faveur d'une version plus récente. Vous pouvez aussi résoudre le problème en inérant la ligne suivante dans le fichier config.cache : ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'} Si vous utilisez Solaris sur une architecture SPARC, nous recommandons gcc 2.95.2 comme compilateur. Vous pouvez le trouver sur . Notez que egcs 1.1.1 et gcc 2.8.1 ne 2.6.3 Remarques pour Solaris 111 Manuel MySQL 4.1.x ? Version Française fonctionnent pas correctement sur SPARC!La ligne configure recommandée dans le cas de l'utilisation de gcc 2.95.2 est: CC=gcc CFLAGS="?O3" \ CXX=gcc CXXFLAGS="?O3 ?felide?constructors ?fno?exceptions ?fno?rtti" \ ./configure ??prefix=/usr/local/mysql ??with?low?memory ??enable?assembler Si vous avez une machine UltraSPARC, vous pouvez gagner 4% de performances supplémentaires en ajoutant "?mcpu=v8 ?Wa,?xarch=v8plusa" à CFLAGS et vous utilisez le compilateur Forte 5.0 (et supérieur) de Sun, vous pouvez lancer configure de la façon suivante : CC=cc CFLAGS="?Xa ?fast ?native ?xstrconst ?mt" \ CXX=CC CXXFLAGS="?noex ?mt" \ ./configure ??prefix=/usr/local/mysql ??enable?assembler Vous pouvez créer un binaire 64 bits avec : CC=cc CFLAGS="?Xa ?fast ?native ?xstrconst ?mt ?xarch=v9" \ CXX=CC CXXFLAGS="?noex ?mt ?xarch=v9" \ ./configure ??prefix=/usr/local/mysql ??enable?assembler Lors de bancs de tests MySQL, nous avons gagné 4% en vitesse sur une UltraSPARC en utilisant Forte 5.0 en mode 32 bits plutôt que gcc 3.2 avec les marqueurs ?mcpu. Si vous créez un binaire 64 bits, il est de 4% plus lent que le binaire 32 bits, mais en contrepartie vous pouvez gérer davantage de treads et de mémoire. Si vous rencontrez des problèmes avec fdatasync ou sched_yield , vous pouvez les résoudre en ajoutant LIBS=?lrt à la ligne configure. Le paragraphe suivant ne s'applique qu'aux compilateurs plus anciens que WorkShop 5.3 : Vous pouvez avoir à modifier le script configure et changer la ligne : #if !defined(__STDC__) || __STDC__ != 1 en : #if !defined(__STDC__) Si vous activez __STDC__ avec l'option ?Xc , le compilateur Sun ne peut pas compiler avec le fichier d'entêtes pthread.h de Solaris. C'est un bogue de Sun (compilateur ou fichier d'inclusion défectueux). Si mysqld génère les messages d'erreur suivants lorsque vous le lancez, cela est du au fait que vous avez compilé MySQL avec le compilateur de Sun sans activer l'option multi?threads ( ?mt ): libc internal error: _rmutex_unlock: rmutex not held Ajoutez ?mt à CFLAGS et CXXFLAGS puis réessayez. Si vous utilisez la version SFW de gcc (fournie avec Solaris 8), vous devez ajouter /opt/sfw/lib à la variable d'environnement LD_LIBRARY_PATH avant de lancer le configure. Si vous utilisez le gcc disponible sur , vous pouvez rencontrer de nombreux problèmes. Vous devriez recompiler gcc et les GNU binutils sur la machine à partir de laquel vous les utiliserez, afin d'éviter tout souci. Si vous obtenez l'erreur suivante lorsque vous compilez MySQL avec gcc , cela signifie que votre gcc n'est pas configuré pour votre version de Solaris : shell> gcc ?O3 ?g ?O2 ?DDBUG_OFF ?o thr_alarm ... ./thr_alarm.c: In function `signal_hand': ./thr_alarm.c:556: too many arguments to function `sigwait' 2.6.3 Remarques pour Solaris 112 Manuel MySQL 4.1.x ? Version Française La meilleure chose à faire dans ce cas est d'obtenir la version la plus récente de gcc et de compiler avec votre gcc actuel! Au moins pour Solaris 2.5, la plupart des versions binaires de gcc ont d'anciens fichiers d'inclusion inutilisables qui planteront les programmes qui utilisent les threads (ainsi probablement d'autres programmes)! Solaris ne fournit pas de versions statiques de toutes les librairies système ( libpthreads et libdl ), vous ne pouvez donc pas compiler MySQL avec ??static . Si vous tentez de le faire, vous obtiendrez l'erreur : ld: fatal: library ?ldl: not found ou undefined reference to `dlopen' ou cannot find ?lrt Si de nombreux processus essaient de se connecter très rapidement à mysqld , vous verrez cette erreur dans le journal MySQL : Error in accept: Protocol error Pour éviter cela, vous pouvez lancer le serveur avec l'option ??set?variable back_log=50 . Veuillez noter que ??set?variable est déprécié depuis MySQL 4.0, utilisez uniquement ??back_log=50 . Options en ligne de commande de mysqld .Si vous liez votre propre client MySQL, vous pouvez avoir l'erreur suivante quand vous le lancez : .1: ./my: fatal: .#: open failed: No such file or directory Le problème peut être évité avec l'une des méthodes suivantes : Liez le client avec le marqueur suivant (à la place de • ?Lpath ) : ?Wl,r/full?path?to? . Copiez • dans /usr/lib . Ajoutez le chemin du répertoire où • est installé à la variable d'environnement LD_RUN_PATH avant de lancer votre client. Si vous avez des soucis avec configure qui essaie de lier avec ?lz et que vous n'avez pas installé zlib , vous avez deux solutions : Si vous voulez utiliser le protocole compresseé de communication, vous devrez vous • procurer et installer zlib sur . Configurez avec • ??with?named?z?libs=no . Si vous utilisez gcc et rencontrez des problèmes en chargeant la fonction UDF dans MySQL, essayez d'ajouter ?lgcc à la ligne de liaison de la fonction UDF . Si vous voulez que MySQL se lance automatiquement, vous pouvez copier support?files/mysql.server dans /etc/init.d et créer un lien symbolique pointant dessus et s'appelant /etc/rc3.d/S99mysql.server . Comme Solaris ne supporte pas les fichiers core pour les applications setuid() , vous ne pouvez pas obtenir un fichier core de mysqld si vous utilisez l'option ??user . 2.6.3 Remarques pour Solaris 113 Manuel MySQL 4.1.x ? Version Française 2.6.3.1 Notes relatives à Solaris 2.7/2.8 Vous pouvez normalement utiliser les binaires Solaris 2.6 sur Solaris 2.7 et 2.8. La plupart des fonctionnalitées de Solaris 2.6 s'appliquent aussi à Solaris 2.7 et 2.8. Notez que la version 3.23.4 de MySQL et plus doivent être capables de détecter automatiquement les nouvelles versions de Solaris et d'activer les parades pour résoudre les problèmes suivants ! Solaris 2.7 / 2.8 ont quelques bogues dans les fichiers inclus. Vous verrez peut?être l'erreur suivante en utilisant gcc : /usr/include/widec.h:42: warning: `getwc' redefined /usr/include/wchar.h:326: warning: this is the location of the previous definition Si cela arrive, vous pouvez faire ce qui suit pour résoudre ce problème :Copiez /usr/include/widec.h vers .../lib/gcc?lib/os/gcc?version/include et changez la ligne 41 de : #if !defined(lint) && !defined(__lint) en #if !defined(lint) && !defined(__lint) && !defined(getwc) Alternativement, vous pouvez éditer directement le fichier /usr/include/widec.h . De toutes façons, après avoir apporté la correction, vous devez effacer config.cache et exécuter configure à nouveau !Si vous obtenez des erreurs comme celles qui suivent quand vous exécutez make , c'est parce que configure n'a pas détecté le fichier curses.h (probablement à cause de l'erreur dans /usr/include/widec.h ) : In file included from :50: /usr/include/term.h:1060: syntax error before `,' /usr/include/term.h:1081: syntax error before `;' La solution est de faire l'une des choses qui suit : Configurez avec • CFLAGS=?DHAVE_CURSES_H CXXFLAGS=?DHAVE_CURSES_H ./configure . Editez • /usr/include/widec.h comme indiqué plus haut et ré?exécutez configure. Effacez la ligne • #define HAVE_TERM di fichier config.h et exécutez make à nouveau. Si vous obtenez une erreur disant que votre programme de liaison ne peut trouver ?lz lors de la liaison du programme de votre client, le problème est probablement que votre fichier est installé dans /usr/local/lib . Vous pouvez corriger ceci en utilisant l'une des méthodes suivantes : Ajoutez • /usr/local/lib à LD_LIBRARY_PATH . Ajoutez un lien vers • à partir de /lib . Si vous utilisez Solaris 8, vous pouvez installer la zlib optionnelle à partir de votre CD Solaris • 8. Configurez MySQL avec l'option • ??with?named?z?libs=no . 2.6.3.2 Remarques pour Solaris x86 Sous Solaris 2.8 sur x86, mysqld va crasher (core dump) si vous l'exécutez 'strip'. Si vous utilisez gcc ou egcs sous Solaris x86 et que vous rencontrez des problèmes avec des coredumps, lorsqu'il y a de la charge, il est recommandé d'utiliser la commande de configure suivante : 2.6.3.1 Notes relatives à Solaris 2.7/2.8 114 Manuel MySQL 4.1.x ? Version Française CC=gcc CFLAGS="?O3 ?fomit?frame?pointer ?DHAVE_CURSES_H" \ CXX=gcc \ CXXFLAGS="?O3 ?fomit?frame?pointer ?felide?constructors ?fno?exceptions \ ?fno?rtti ?DHAVE_CURSES_H" \ ./configure ??prefix=/usr/local/mysql Cela va éviter les problèmes avec la librairie libstdc++ et avec les exceptions C++. Si cela ne vous aide pas, il est recommandé de compiler une version de débogage, et de l'exécuter avec un fichier de trace sous gdb . Déboguer mysqld sous gdb . 2.6.4 Notes relatives à BSD Cette section fournit des informations pour les différentes variétés de BSD, ainsi que les versions spécifiques de celles?ci. 2.6.4.1 Notes relatives à FreeBSD FreeBSD 3.x est recommandé pour exécuter MySQL vu que le package des threads est plus intégré.La façon la plus facile et la plus conseillée d'installer est d'utiliser les ports du serveur et du client MySQL disponibles sur .Les utiliser vous donnera : Un MySQL fonctionnant avec toutes les optimisations connues pour votre version active de • FreeBSD. Configuration et construction automatique. • Scripts de démarrage installés dans /usr/local/etc/rc.d. • La possibilité de voir tous les fichiers installés avec pkg_info ?L. Et la possibilité de les • effacer tous avec pkg_delete si vous ne voulez plus de MySQL sur cette machine. Il est recommandé d'utiliser les MIT?pthreads sur FreeBSD 2.x et les threads natifs sur les versions 3 et plus. Il est possible de faire fonctionner le tout avec les threads natifs sur les dernières versions 2.2.x mais vous rencontrerez probablement des problèmes en coupant mysqld .Le Makefile de MySQL requière GNU make ( gmake ) pour fonctionner. Si vous voulez compiler MySQL vous devez d'abord installer GNU make . Assurez?vous que votre configuration de la résolution des noms est bonne. Sinon, vous airez peut?être quelques problèmes lors de la connexion à mysqld . Assurez vous que l'entrée localhost dans le fichier /etc/hosts est correcte (sinon, vous aurez des problèmes pour vous connecter à la base de données). Le fichier /etc/hosts doit commencer par : 127.0.0.1 localhost localhost.votre.domaine La manière recommandée de compiler et d'installer MySQL sur FreeBSD avec gcc (2.95.2 et plus) est : CC=gcc CFLAGS="?O2 ?fno?strength?reduce" \ CXX=gcc CXXFLAGS="?O2 ?fno?rtti ?fno?exceptions ?felide?constructors \ ?fno?strength?reduce" \ ./configure ??prefix=/usr/local/mysql ??enable?assembler gmake gmake install ./scripts/mysql_install_db cd /usr/local/mysql ./bin/mysqld_safe & 2.6.4 Notes relatives à BSD 115 Manuel MySQL 4.1.x ? Version Française Si vous vous apercevez que configure utilisera les MIT?pthreads, vous devriez lire les notes relatives aux MIT?pthreads. Remarques sur MIT?pthreads . Si vous obtenez une erreur de make install disant qu'il ne peut trouver /usr/include/pthreads , configure n'a pas détecté que vous avez besoin des MIT?pthreads. Cela est corrigé en exécutant ces commandes : shell> rm config.cache shell> ./configure ??with?mit?threads l'utilisateur mysqld dans (et regénérez le avec cap_mkdb). Assurez?vous aussi de définir la classe appropriée pour cet utilisateur dans le fichier des mots de passe si vous n'utilisez mysqld . Si vous avez beaucoup de mémoire, vous devriez penser à recompiler le noyau pour permettre à MySQL d'utiliser plus de 512M de RAM. Regardez l' option MAXDSIZ dans le fichier de configuration de LINT pour plus d'informations. Si vous avez des problèmes avec la date courante dans MySQL, configurer la variable d'environnement TZ aidera sûrement. Variables d'environnement MySQL . Pour obtenir un système sécurisé et stable, vous ne devez utiliser que les noyaux FreeBSD marqués ?RELEASE . 2.6.4.2 Notes concernant NetBSD Pour compiler sur NetBSD vous aurez besoin de GNU make . Sinon, la compilation stoppera lorsque make essayera d'exécuter lint sur les fichiers C++. 2.6.4.3 Notes relatives à OpenBSD 2.5 Dans la version 2.5 de OpenBSD, vous pouvez compiler MySQL avec les threads natifs avec les options suivantes : CFLAGS=?pthread CXXFLAGS=?pthread ./configure ??with?mit?threads=no 2.6.4.4 Notes relatives à OpenBSD 2.8 Nos utilisateurs nous ont informé que OpenBSD 2.8 comporte un bogue des threads qui pose quelques problèmes avec MySQL. Les développeurs d'OpenBSD ont résolu ce problème, mais depuis le 25 janvier 2001 ce n'est disponible que dans la branche ``?current''. Les symptômes de ce bogue sont : réponses lentes, beaucoup de charge, grande utilisation du CPU, et crashes. Si vous obtenez une erreur comme Error in accept:: Bad file descriptor ou erreur 9 en essayant d'ouvrir les tables ou les dossiers, le problème est probablement que vous n'avez pas alloué assez de descripteurs de fichiers à MySQL. Dans ce cas, essayez de démarrer safe_mysqld en tant que root avec les options suivantes : 2.6.4.2 Notes concernant NetBSD 116 Manuel MySQL 4.1.x ? Version Française ??user=mysql ??open?files?limit=2048 2.6.4.5 Notes relatives aux versions 2.x de BSD/OS Si vous obtenez l'erreur suivante lors de la compilation de MySQL, votre valeur de ulimit pour la mémoire vortuelle est trop petite : item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)': item_func.h:28: virtual memory exhausted make[2]: *** [item_func.o] Error 1 Essayez d'utiliser ulimit ?v 80000 et exécutez make à nouveau. Si cela ne fonctionne pas et que vous utilisez bash , essayez de passer à csh ou sh ; quelques utilisateurs de BSDI ont reporté des problèmes avec bash et ulimit . Si vous utilisez gcc , vous aurez peut?être aussi à utiliser l'option ??with?low?memory de configure pour pouvoir compiler . Si vous avez des problèmes avec la date courante dans MySQL, configurer la variable TZ vous aidera probablement. Variables d'environnement MySQL . 2.6.4.6 Notes relatives aux versions 3.x de BSD/OS Mettez à jour à la version 3.1 de BSD/OS. Si cela n'est pas possible, installez le patch BSDIpatch M300?038. Utilisez la commande suivante lors de la configuration de MySQL : shell> env CXX=shlicc++ CC=shlicc2 \ ./configure \ ??prefix=/usr/local/mysql \ ??localstatedir=/var/mysql \ ??without?perl \ ??with?unix?socket? Ce qui suit fonctionne aussi : shell> env CC=gcc CXX=gcc CXXFLAGS=?O3 \ ./configure \ ??prefix=/usr/local/mysql \ ??with?unix?socket? Vous pouvez changer les répertoires si vous voulez, ou utiliser les valeurs par défaut en ne spécifiant pas de vous avez des problèmes de performances alors que la charge est petite, essayez d'utiliser l'option ??skip?thread?priority de mysqld ! Cela exécutera tous les threads avec la même priorité; Sur la version 3.1 de BSDI, cela donne de meilleures performances (en attendant que BSDI corrige sont gestionnaire de threads). Si vous obtenez l'erreur virtual memory exhausted durant la compilation, vous devez essayer en utilisant ulimit ?v 80000 et exécutant make à nouveau. Si cela ne fonctionne pas et que vous utilisez bash , essayez de passer à csh ou sh ; quelques utilisateurs de BSDI ont reporté des problèmes avec bash et ulimit . 2.6.4.5 Notes relatives aux versions 2.x de BSD/OS 117 Manuel MySQL 4.1.x ? Version Française 2.6.4.7 Notes relatives aux versions 4.x de BSD/OS Les versions 4.x de BSDI ont quelques bogues relatifs aux threads. Si vous voulez utiliser MySQL sur ce système, vous devez installer tous les patches liés aux threads. vous devez au moins installer M400?023. Sur quelques systèmes avec une version 4.x de BSDI, vous pouvez rencontrer des problèmes avec les librairies partagées. Le symptôme est que vous ne pouvez utiliser aucun programme client, comme par exemple, mysqladmin . Dans ce cas, vous devez le reonfigurer pour qu'il n'utilise pas les librairies paratgées avec l'option ??disable?shared de configure. Quelques utilisateurs ont eu avec BSDI 4.0.1 un problème faisant qu'après un bout de temps, le binaire mysqld ne peut plus ouvrir de tables. Cela est du au fait qu'un bogue relatif au système ou à la librairie fait changer de répertoire à mysqld sans qu'on ne l'ait demandé ! La solution est soit de mettre à jour vers la version 3.23.34 ou de supprimer la ligne #define HAVE_REALPATH de config.h après avoir exécuté configure et avant d'exécuter make . Notez que ce qui précède signifie que vous ne pouvez pas créer de lien symbolique sur un dossier de bases de données vers un autre dossier de bases de données ou lier une table symboliquement vers une autre base de données sur BSDI ! (Créer un lien symbolique vers un autre disque fonctionne). 2.6.5 Notes relatives à Mac OS X 2.6.5.1 Bêta publique Mac OS X MySQL devrait fonctionner sans problèmes sur la bête publique de Mac OS X (Darwin). Vous n'avez pas besoin du patch pthread pour cet OS ! 2.6.5.2 Mac OS X Server Avant d'essayer d'installer MySQL sur Mac OS X server vous devez d'abord installer le package pthread à partir de . Notre binaire pour Mac OS X est compilé sur Rhapsody 5.5 avec la ligne de configuration suivante : CC=gcc CFLAGS="?O2 ?fomit?frame?pointer" CXX=gcc CXXFLAGS="?O2 \ ?fomit?frame?pointer" ./configure ??prefix=/usr/local/mysql \ "??with?comment=Official MySQL binary" ??with?extra?charsets=complex \ ??disable?shared Vous voudrez peut?être ajouter des alias dans vos fichiers de ressources shell pour accéder à mysql et mysqladmin à partir de la ligne de commande : alias mysql '/usr/local/mysql/bin/mysql' alias mysqladmin '/usr/local/mysql/bin/mysqladmin' 2.6.6 Notes sur les autres Unix 2.6.4.7 Notes relatives aux versions 4.x de BSD/OS 118 Manuel MySQL 4.1.x ? Version Française 2.6.6.1 Notes relatives à HP?UX pour les distributions binaires Quelques distributions binaires de MySQL pour HP?UX sont distribués en tant que fichier depot HP et archive tar. Pour utiliser le fichier depot, vous devez avoir au moins HP?UX 10.x pour avoir accès aux outils depot de HP. La version HP de MySQL a été compilée sur un serveur HP 9000/8xx sous HP?UX 10.20, et utilise les MIT?pthreads. Elle est connue pour bien fonctionner sous cette configuration. A partir de la version 3.22.26 de MySQL vous pouvez aussi compiler avec le package de threads natifs HP. Autres configurations pouvant fonctionner : HP 9000/7xx avec HP?UX 10.20+ • HP 9000/8xx avec HP?UX 10.30 • Les configurations suivantes semblent ne jamais vouloir fonctionner : HP 9000/7xx ou 8xx avec HP?UX 10.x où x < 2 • HP 9000/7xx ou 8xx avec HP?UX 9.x • Pour installer la distribution, utilisez l'une des commandes suivantes, où /chemin/vers/depot est le chemin complet vers le fichier dépôt : Pour tout installer, serveur, client et outils de développement : • shell> /usr/sbin/swinstall ?s /chemin/vers/depot Pour n'installer que le serveur : • shell> /usr/sbin/swinstall ?s /chemin/vers/depot mysql.server Pour n'installer que le package client : • shell> /usr/sbin/swinstall ?s /chemin/vers/depot mysql.client Pour n'installer que les outils de développement : • shell> /usr/sbin/swinstall ?s /chemin/vers/depot mysql.developer Le depot place les binaires et les librairies dans /opt/mysql et les données dans /var/opt/mysql .Le depot crée aussi les entrées appropriées dans /etc/init.d et /etc/rc2.d pour démarrer le serveur automatiquement lors du boot. Evidemment, il faut être root pour installer. Pour installer la distribution HP?UX , vous devez avoir une copie de GNU tar . 2.6.6.2 Notes relatives à la version 10.20 de HP?UX Il y'a quelques petits problèmes que vous pourrez rencontrer lors de la compilation de MySQL sur HP?UX. Nous recommandons l'utilisation de gcc au lieu du compilateur natif de HP?UX, car gcc produit un meilleur code ! Nous recommandons l'utilisation de gcc 2.95 sur HP?UX. N'utilisez pas les options de haute optimisation (comme ?O6) car cela pourrait ne pas être sûr sur HP?UX. La ligne de configuration suivante devrait fonctionner avec gcc 2.95 : CFLAGS="?I/opt/dce/include ?fpic" \ CXXFLAGS="?I/opt/dce/include ?felide?constructors ?fno?exceptions \ ?fno?rtti" CXX=gcc ./configure ??with?pthread \ ??with?named?thread?libs='?ldce' ??prefix=/usr/local/mysql ??disable?shared 2.6.6.1 Notes relatives à HP?UX pour les distributions binaires 119 Manuel MySQL 4.1.x ? Version Française La ligne de configuration suivante devrait fonctionner avec gcc 3.1 : CFLAGS="?DHPUX ?I/opt/dce/include ?O3 ?fPIC" CXX=gcc \ CXXFLAGS="?DHPUX ?I/opt/dce/include ?felide?constructors ?fno?exceptions \ ?fno?rtti ?O3 ?fPIC" ./configure ??prefix=/usr/local/mysql \ ??with?extra?charsets=complex ??enable?thread?safe?client \ ??enable?local?infile ??with?pthread \ ??with?named?thread?libs=?ldce ??with?lib?ccflags=?fPIC ??disable?shared 2.6.6.3 HP?UX Version 11.x Notes Pour les version 11.x de HP?UX nous recommandons MySQL 3.23.15 ou plus récent. A cause de quelques bogues critiques dans les librairies standard de HP?UX, vous devez installer les patches suivants avant d'essayer de faire fonctionner MySQL sous HP?UX 11.0 : PHKL_22840 Streams cumulative PHNE_22397 ARPA cumulative Cela résoudra le problème de l'obtention de EWOULDBLOCK à partir de recv() et EBADF à partir de accept() dans les applications threadées. Si vous utilisez gcc 2.95.1 sur un système HP?UX 11.x non?patché, vous obtiendrez l'erreur : In file included from /usr/include/unistd.h:11, from ../include/global.h:125, from mysql_priv.h:15, from :19: /usr/include/sys/unistd.h:184: declaration of C function ... /usr/include/sys/pthread.h:440: previous declaration ... In file included from item.h:306, from mysql_priv.h:158, from :19: Le problème est que HP?UX ne définit pas pthreads_atfork() avec consistence. Il possède des prototypes en conflit dans /usr/include/sys/unistd.h :184 et /usr/include/sys/pthread.h :440 (détails ci?dessous). Une solution est de copier /usr/include/sys/unistd.h dans mysql/include et éditer unistd.h en le changeant pour qu'il corresponde à la définition dans pthread.h . Voici les modifications : 183,184c183,184 < extern int pthread_atfork(void (*prepare)(), void (*parent)(), < void (*child)()); ??? > extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), > void (*child)(void)); Après cela, la ligne de configuration suivante devrait fonctionner : CFLAGS="?fomit?frame?pointer ?O3 ?fpic" CXX=gcc \ CXXFLAGS="?felide?constructors ?fno?exceptions ?fno?rtti ?O3" \ ./configure ??prefix=/usr/local/mysql ??disable?shared Si vous utilisez MySQL 4.0.5 avec le compilateur HP?UX, vous pouvez utiliser : (testé avec cc B.11.11.04): CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure ??with?extra?character?set=complex 2.6.6.3 HP?UX Version 11.x Notes 120 Manuel MySQL 4.1.x ? Version Française Vous pouvez ignorer toutes les erreurs de ce type : aCC: warning 901: unknown option: `?3': use +help for online documentation Si vous obtenez l'erreur suivante de configure : checking for cc option to accept ANSI C... no configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the Installation chapter in the Reference Manual. Vérifiez que le chemin vers le compilateur KRne précède pas le chemin vers le compilateur C et C++ HP?UX. Une autre raison qui pourrait vous empêcher de compiler, et le fait de n'avoir pas définit l'option +DD64 ci?dessus. 2.6.6.4 Notes relatives à IBM?AIX La détection automatique de xlC est absente de Autoconf, ce qui fait qu'un commande configure comme celle qui suit est requise lors de la compilation de MySQL (Cet exemple utilise le compilateur IBM) : export CC="xlc_r ?ma ?O3 ?qstrict ?qoptimize=3 ?qmaxmem=8192 " export CXX="xlC_r ?ma ?O3 ?qstrict ?qoptimize=3 ?qmaxmem=8192" export CFLAGS="?I /usr/local/include" export LDFLAGS="?L /usr/local/lib" export CPPFLAGS=$CFLAGS export CXXFLAGS=$CFLAGS ./configure ??prefix=/usr/local \ ??localstatedir=/var/mysql \ ??sysconfdir=/etc/mysql \ ??sbindir='/usr/local/bin' \ ??libexecdir='/usr/local/bin' \ ??enable?thread?safe?client \ ??enable?large?files Ce sont les options utilisées pour compiler la distribution de MySQL qui peut être trouvée sur http://www? .Si vous changez le ?O3 en ?O2 dans la ligne précédente, vous devez aussi enlever l'option ?qstrict (c'est une limitation du compilateur IBM C). Si vous utilisez gcc ou egcs pour compiler MySQL, vous devez utiliser l'option ?fno?exceptions , vu que la gestion des exceptions de gcc / egcs n'est pas sûre pour les threads ! (Cela est testé avec egcs 1.1.) Il y'a aussi quelques problèmes connus avec l'assembleur d'IBM, qui peuvent lui faire générer du mauvais code lors de son utilisation avec gcc. Nous recommandons la ligne de configure suivante avec egcs et gcc 2.95 sur AIX : CC="gcc ?pipe ?mcpu=power ?Wa,?many" \ CXX="gcc ?pipe ?mcpu=power ?Wa,?many" \ CXXFLAGS="?felide?constructors ?fno?exceptions ?fno?rtti" \ ./configure ??prefix=/usr/local/mysql ??with?low?memory Le ?Wa,?many est nécessaire pour que la compilation se passe sans problèmes. IBM est au courant de ce problème mais n'est pas pressé de le corriger à cause de l'existence du palliatif. Nous ne savons pas si ?fno?exceptions est requise avec gcc 2.95 , mais comme MySQL n'utilise pas les exeptions et que l'option en question génère un code plus rapide, nous vous recommandons de toujours utiliser cette option avec egcs / gcc .Si vous obtenez un problème avec le code de l'assembleur essayez en changeant l'option ?mcpu=xxx pour l'adapter à votre processeur. Le plus souvent, on a besoin de power2, power, ou powerpc, et sinon 604 ou 604e. Je ne suis pas positif mais je pense que l'utilisation de "power" sera sûre la plupart du temps, même sur une machine vous ne savez pas quel est votre processeur, exécutez "uname ?m", cela vous renverra une chaîne comme "000514676700", avec un format xxyyyyyymmss où xx et ss 2.6.6.4 Notes relatives à IBM?AIX 121 Manuel MySQL 4.1.x ? Version Française sont toujours des zéros, yyyyyy est un identifiant unique du système et mm est l'identifiant du CPU Planar. Une liste de ces valeurs peut être trouvée sur donnera un type et un modèle de machine que vous pouvez utiliser pour déterminer quel type de processeur vous vous avez des problèmes avec les signaux (MySQL se termine de manière imprévue lors des montées en charge) vous avez peut?être trouvé un bogue du système avec les threads et les signaux. Dans ce cas, vous pouvez demander à MySQL de ne pas utiliser les signaux en configuration avec : shell> CFLAGS=?DDONT_USE_THR_ALARM CXX=gcc \ CXXFLAGS="?felide?constructors ?fno?exceptions ?fno?rtti \ ?DDONT_USE_THR_ALARM" \ ./configure ??prefix=/usr/local/mysql ??with?debug ??with?low?memory Cela n'affecte pas les performances de MySQL, mais comporte un effet secondaire faisant en sorte que vous ne pourrez tuer les clients en état ``sleeping'' sur une connexion avec mysqladmin kill ou mysqladmin shutdown . A la place, le client se terminera lorsqu'il émmetra sa prochaine quelques versions de AIX, lier avec libbind.a fait vider son noyau à getservbyname (core dump). Il s'agit d'un bogue AIX et doit être remonté à IBM. Pour AIX 4.2.1 et gcc vous devez apporter les modifications suivantes : Après la configuration, éditez config.h et include/my_config.h et changez la ligne qui comporte #define HAVE_SNPRINTF 1 en #undef HAVE_SNPRINTF Et finalement, dans vous devez ajouter un prototype pour initgoups. #ifdef _AIX41 extern "C" int initgroups(const char *,int); #endif 2.6.6.5 Notes relatives à SunOS 4 Avec SunOS 4, les MIT?pthreads sont requis pour compiler MySQL, ce qui signifie que vous aurez besoin de GNU make . Quelques systèmes SunOS 4 ont des problèmes avec les librairies dynamiques et libtool . Vous pouvez utiliser la ligne suivante de configure pour éviter ce problème : shell> ./configure ??disable?shared ??with?mysqld?ldflags=?all?static Lors de la compilation de readline , vous pouvez obtenir des avertissements à propos de définitions dupliquées. Vous pouvez les de la compilation de mysqld , il y'aura quelques avertissements implicit declaration of function . Vous pouvez les ignorer. 2.6.6.6 Notes pour Alpha?DEC?UNIX (Tru64) Si vous utilisez egcs 1.1.2 sur Digital Unix, vous devez passer à gcc 2.95.2, car egcs connait de sérieux bugs sur DEC! Lorsque vous compilez des programmes threadés sous Digital Unix, la documentation recommande l'utilisation de l'option ?pthread avec cc et cxx et les librairies ?lmach ?lexc (en plus de ?lpthread ). Vous devriez exécuter le script configure comme ceci : CC="cc ?pthread" CXX="cxx ?pthread ?O" \ ./configure ??with?named?thread?libs="?lpthread ?lmach ?lexc ?lc" 2.6.6.5 Notes relatives à SunOS 4 122 Manuel MySQL 4.1.x ? Version Française Lorsque vous compilez mysqld , vous pouvez voir apparaître des alertes comme celles?ci : : In function void handle_connections()': :626: passing long unsigned int *' as argument 3 of accept(int,sockadddr *, int *)' Vous pouvez les ignorer tranquillement. Elles apparaissent car configure ne peut détecter que des erreurs, et pas des vous démarrez le serveur directement en ligne de commande, vous pouvez rencontrer des problèmes d'interruption si vous vous déconnectez. Lorsque vous vous déconnectez, les processus en cours recoivent le signal SIGHUP . Si c'est le cas, essayez de démarrer le serveur comme ceci : shell> nohup mysqld [options] & nohup fait que la commande suivante va ignorer les signaux SIGHUP envoyés par le terminal. Alternativement, vous pouvez démarrer le serveur avec le script safe_mysqld , qui appelle le démon mysqld avec l'option nohup pour vous. safe_mysqld , le script père de mysqld .SI vous avez des problèmes pour compiler mysys/get_opt.c , vous pouvez simplement supprimer la ligne #define _NO_PROTO au début du fichier! Si vous utilisez le compilateur cc de Compaq, la ligne de configuration suivante devrait fonctionner : CC="cc ?pthread" CFLAGS="?O4 ?ansi_alias ?ansi_args ?fast ?inline speed all ?arch host" CXX="cxx ?pthread" CXXFLAGS="?O4 ?ansi_alias ?ansi_args ?fast ?inline speed all ?arch host \ ?noexceptions ?nortti" export CC CFLAGS CXX CXXFLAGS ./configure \ ??prefix=/usr/local/mysql \ ??with?low?memory \ ??enable?large?files \ ??enable?shared=yes \ ??with?named?thread?libs="?lpthread ?lmach ?lexc ?lc" gnumake Si vous avez un problème avec libtool , lorsque vous compilez les librairies partagées, ou lorsque vous linkez mysql , vous devriez pouvoir résoudre ce problème avec : cd mysql /bin/sh ../libtool ??mode=link cxx ?pthread ?O3 ?DDBUG_OFF \ ?O4 ?ansi_alias ?ansi_args ?fast ?inline speed \ ?speculate all \ ?arch host ?DUNDEF_HAVE_GETHOSTBYNAME_R \ ?o mysql mysql.o readline.o sql_string.o completion_hash.o \ ../readline/libreadline.a ?lcurses \ ?lm cd .. gnumake gnumake install scripts/mysql_install_db 2.6.6.7 Notes pour Alpha?DEC?OSF/1 Si vous avez des problèmes de compilation et que le CC de DEC et gcc sont installés, essayez d'utiliser le script configure comme ceci : CC=cc CFLAGS=?O CXX=gcc CXXFLAGS=?O3 \ ./configure ??prefix=/usr/local/mysql Si vous avez des problèmes avec le fichier c_asm.h , vous pouvez créer un fichier inerte c_asm.h avec : 2.6.6.7 Notes pour Alpha?DEC?OSF/1 123 Manuel MySQL 4.1.x ? Version Française touch include/c_asm.h CC=gcc CFLAGS=?I./include \ CXX=gcc CXXFLAGS=?O3 \ ./configure ??prefix=/usr/local/mysql Notez que les problèmes suivants avec le programme ld peuvent être corrigés en téléchargeant le V4.0D et avec le compilateur "DEC C V5.6?071 on Digital Unix V4.0 (Rev. 878)" le compilateur présente un comportement étrange (undefined asm symbols). /bin/ld apparaît aussi comme incorrect (problèmes avec des erreurs _exit undefined survenant lors du link de mysqld ). Sur ce système, nous avons réussi à compiler MySQL avec le script configure suivant, après avoir remplacé /bin/ld par la version de OSF 4.0C: CC=gcc CXX=gcc CXXFLAGS=?O3 ./configure ??prefix=/usr/local/mysql Avec le compilateur Digital "C++ V6.1?029", la ligne suivante doit fonctionner : CC=cc ?pthread CFLAGS=?O4 ?ansi_alias ?ansi_args ?fast ?inline speed ?speculate all \ ?arch host CXX=cxx ?pthread CXXFLAGS=?O4 ?ansi_alias ?ansi_args ?fast ?inline speed ?speculate all \ ?arch host ?noexceptions ?nortti export CC CFLAGS CXX CXXFLAGS ./configure ??prefix=/usr/mysql/mysql ??with?mysqld?ldflags=?all?static \ ??disable?shared ??with?named?thread?libs="?lmach ?lexc ?lc" Avec certaines versions de OSF/1, la fonction alloca() est boguée. Corrigez cela en supprimant la ligne du fichier config.h qui définit 'HAVE_ALLOCA' . La fonction alloca() a aussi un prototype incorrect dans /usr/include/alloca.h . L'alerte en résultant peut être ignorée. Le script configure va utiliser automatiquemt les librairies de threads suivantes : code{??with?named?thread?libs="?lpthread ?lmach ?lexc ?lc"}. En utilisant gcc , vous pouvez aussi essayer le script configure avec ceci : shell> CFLAGS=?D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=?O3 ./configure ... Si vous avez des problèmes avec les signaux (MySQL s'arrête inopinéments sous forte charge), vous pouvez avoir rencontré un bogue de l'OS avec les threads, et les signaux. Dans ce cas, vous pouvez indiquer à MySQL de ne pas utiliser les signaux avec la configuration suivante : shell> CFLAGS=?DDONT_USE_THR_ALARM \ CXXFLAGS=?DDONT_USE_THR_ALARM \ ./configure ... Cela ne modifie pas les performances de MySQL, mais vous ne pourrez plus terminer les clients qui sont en mode ``sleeping'' sur une connexion avec la commande mysqladmin kill ou mysqladmin shutdown . Au lieu de cela, le client sera terimné lorsqu'il émettra la prochaine gcc 2.95.2, vous aurez probablement les problèmes de compilation suivants : :1456: Internal compiler error in `scan_region', at except.c:2566 Please submit a full bug report. Pour corriger cela, vous devez aller dans le dossier sql et faire un ``copier coller'' de la dernière ligne gcc , tout en remplaçant le code ?O3 par le code ?O0 ou ajouter le code ?O0 immédiatement après gcc si vous n'avez aucune option ?O sur votre ligne de compilation). Après cela, vous pouvez retourner au niveau de la racine de MySQL, et tenter à nouveau un make . 2.6.6.7 Notes pour Alpha?DEC?OSF/1 124 Manuel MySQL 4.1.x ? Version Française 2.6.6.8 Notes relatives à SGI Irix Si vous utilisez la version 6.5.3 d'Irix ou plus récente, mysqld ne pourra créer de threads que si vous l'exécutez en tant qu'utilisateur possédant le privilège CAP_SCHED_MGT (comme root ) ou que vous donnez au serveur mysqld ce privilège avec la commande suivante : shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld Vous devrez peut?être supprimer quelques définitions dans config.h après avoir exécuté configure et avant de compiler. Sur quelques implémentations d'Irix, la fonction alloca() ne marche pas. Si le serveur mysqld se stoppe sur quelques requêtes SELECT , supprimez les lignes de config.h qui définissent HAVE_ALLOC et HAVE_ALLOCA_H . Si mysqladmin create ne fonctionne pas, supprimez la ligne qui définit HAVE_READDIR_R dans config.h . Vous devrez peut?être supprimer la ligne de HAVE_TERM_H aussi. SGI recommande que vous installiez tous les patches de cette page : Vous devrez, au moins, installer la dernière version du noyau, de rld et de libc . Vous avez besoin de tous les patches POSIX sur cette page, pour le support des pthreads : rapprochant de la suivante lors de la compilation de : "/usr/include/curses.h", line 82: error(1084): invalid combination of type Tapez ce qui suit dans le répertoire racine de votre source MySQL : shell> extra/replace bool curses_bool < /usr/include/curses.h \ > include/curses.h shell> make Un problème de planification a aussi été signalé. Si seul un thread est en cours, les choses ralentissent. Evitez cela en démarrant un autre client. Cela pourra accélérer l'exécution de l'autre thread de 2 à 10 fois. Ceci est un problème pas encore très clair avec les threads Irix; vous devrez improviser pour trouver des solutions en attendant que cela soit corrigé. Si vous compilez avec gcc , vous pouvez utiliser la commande configure suivante : CC=gcc CXX=gcc CXXFLAGS=?O3 \ ./configure ??prefix=/usr/local/mysql ??enable?thread?safe?client \ ??with?named?thread?libs=?lpthread Sous Irix 6.5.11 avec les compilateurs natifs Irix C et C++ versions 7.3.1.2, ce qui suit est connu pour fonctionner : CC=cc CXX=CC CFLAGS='?O3 ?n32 ?TARG:platform=IP22 ?I/usr/local/include \ ?L/usr/local/lib' CXXFLAGS='?O3 ?n32 ?TARG:platform=IP22 \ ?I/usr/local/include ?L/usr/local/lib' ./configure \ ??prefix=/usr/local/mysql ??with?innodb ??with?berkeley?db \ ??with?libwrap=/usr/local \ ??with?named?curses?libs=/usr/local/lib/libncurses.a 2.6.6.9 Notes pour Caldera (SCO) Le port courant a été testé avec les systèmes ``sco3.2v5.0.4'' et ``sco3.2v5.0.5''. Il y a eu aussi beaucoup de progrès sur le port de ``sco 3.2v4.2''. 2.6.6.8 Notes relatives à SGI Irix 125 Manuel MySQL 4.1.x ? Version Française Pour le moment, le compilateur recommandé sur OpenServer est gcc 2.95.2. Avec lui, vous devriez pouvoir compiler MySQL simplement avec : CC=gcc CXX=gcc ./configure ... (options) Pour OpenServer 5.0.X, vous devez utiliser • gcc?2.95.2p1 ou plus récent, de Skunkware. Vous avez besoin du port • GCC 2.5.x pour ce produit, et du système de développement. Ils sont nécessaires sur cette version de Caldera (SCO) Unix. Vous ne pouvez pas juste utiliser le système gcc dev. Vous devez obtenir le package FSU Pthreads et l'installer en premier. Il est disponible à • obtenir un package précompilé à FSU Pthreads peut être compilé sur Caldera (SCO) Unix 4.2 avec tcpip. Ou OpenServer 3.0 • ou Open Desktop 3.0 (OS 3.0 ODT 3.0), avec le Caldera (SCO) Development System installé, utilisant le bon port de GCC 2.5.x ODT ou OS 3.0, vous aurez besoin du bon port de GCC 2.5.x Il y a beaucoup de problèmes sans un bon port. Le port de ce produit requiert le système SCO Unix Development. Sans cela, vous manquerez des librairies et des linkeurs nécessaires. Pour compiler FSU Pthreads sur votre système, faites ceci : • Exécutez ? ./configure dans le dossier threads/src et sélectionnez l'option SCO OpenServer. Cette commande copie Makefile.SCO5 dans Makefile . Exécutez ? make . Pour faire l'installation dans le dossier par défaut ? /usr/include , connectez vous en root , puis utilisez cd vers le dossier thread/src , et exécutez la commande make install . N'oubliez pas d'utiliser GNU • make pour compiler MySQL. Si vous ne démmarez pas • safe_mysqld en tant que root , vous aurez probablement la limite de 110 fichiers ouverts par processus. mysqld va écrire une note à ce propos de le fichier de log. Avec SCO 3.2V5.0.5, vous devez utiliser FSU Pthreads version 3.5c ou plus récent. Vous • devez aussi utiliser gcc 2.95.2 ou plus récent!La commande configure suivante doit fonctionner : shell> ./configure ??prefix=/usr/local/mysql ??disable?shared Avec SCO 3.2V4.2, vous devez utiliser FSU Pthreads version 3.5c ou plus récent. La • commande configure suivante doit fonctionner : shell> CFLAGS="?D_XOPEN_XPG4" CXX=gcc CXXFLAGS="?D_XOPEN_XPG4" \ ./configure \ ??prefix=/usr/local/mysql \ ??with?named?thread?libs="?lgthreads ?lsocket ?lgen ?lgthreads" \ ??with?named?curses?libs="?lcurses" Vous pouvez avoir des problèmes avec certains fichiers d'inclusion. Dans ce cas, vous pouvez trouver un nouveau fichier d'inclus spécifique à SCO à décompresser de fichier dans le dossier include de votre dossier source MySQL. Notes de développement Caldera (SCO): MySQL devrait détecter automatiquement les FSU Pthreads et compiler • mysqld avec ?lgthreads ?lsocket ?lgthreads . Les librairies de développement Caldera (SCO) development sont ré?entrantes avec les • FSU Pthreads. Caldera dit que ses librairies de fonctions sont ré?entrantes, et donc, que FSU Pthreads aussi. FSU Pthreads sur OpenServer essaie d'utiliser le schéma SCO pour 2.6.6.8 Notes relatives à SGI Irix 126 Manuel MySQL 4.1.x ? Version Française en faire des librairies ré?entrantes. Les FSU Pthreads (tout au moins la version de ) est livré compilé • avec GNU malloc . Si vous avez des problèmes d'utilisation de mémoire, assurez vous que gmalloc.o est inclus dans libgthreads.a et . Avec les FSU Pthreads, les appels systèmes suivant sont compatibles avec pthreads : • read() , write() , getmsg() , connect() , accept() , select() et wait() . Le CSSA?2001?SCO.35.2 (le patch est indiqué comme un patch de sécurité dans • erg711905?dscr_remap (version 2.0.0)) rend bogué les FSU threads et MySQL instable. Vous devez supprimer ce patch si vous voulez exécuter mysqld sur un serveur OpenServer 5.0.6. Si vous voulez installer DBI sur Caldera (SCO), vous devez éditer le fichier Makefile dans DBI?xxx et chaque sous?dossier. Notez que les lignes suivantes présupposent que gcc 2.95.2 ou plus récent est installé : Ancien : Nouveau : CC = cc CC = gcc CCCDLFLAGS = ?KPIC ?W1,?Bexport CCCDLFLAGS = ?fpic CCDLFLAGS = ?wl,?Bexport CCDLFLAGS = LD = ld LD = gcc ?G ?fpic LDDLFLAGS = ?G ?L/usr/local/lib LDDLFLAGS = ?L/usr/local/lib LDFLAGS = ?belf ?L/usr/local/lib LDFLAGS = ?L/usr/local/lib LD = ld LD = gcc ?G ?fpic OPTIMISE = ?Od OPTIMISE = ?O1 Ancien : CCCFLAGS = ?belf ?dy ?w0 ?U M_XENIX ?DPERL_SCO5 ?I/usr/local/include Nouveau : CCFLAGS = ?U M_XENIX ?DPERL_SCO5 ?I/usr/local/include Ceci est dû au fait que le Perl dynaloader ne va pas charger les modules DBI si ils ont été compilés avec icc ou cc . Perl fonctionne au mieux avec cc . 2.6.6.10 Notes relatives à la version 7.0 fr Caldera (SCO) Unixware Vous devez utiliser une version de MySQL supérieure ou égale à la 3.22.13 car cette version corrige quelques problèmes de port vers Unixware. Nous avons réussi à compiler MySQL avec la ligne suivante de configure sur la version 7.0.1 de Unixware : CC=cc CXX=CC ./configure ??prefix=/usr/local/mysql Si vous voulez utiliser gcc , vous devez utiliser la version 2.95.2 de gcc ou plus récente.Caldera de sécurité pre?OSR506. Le correctif de telnetd est aussi disponible sur .1 avec des instructions pour installer sur les systèmes pre?OSR506. Il est bon d'installer les patches précédents avant d'essayer de compiler/utiliser MySQL. 2.6.6.10 Notes relatives à la version 7.0 fr Caldera (SCO) Unixware 127 Manuel MySQL 4.1.x ? Version Française 2.6.7 Notes relatives à OS/2 MySQL utilise un certain nombre de fichiers ouverts. A cause de cela, vous devez ajouter un ligne se rapprochant de la suivante dans votre fichier : SET EMXOPT=?c ?n ?h1024 Si vous ne le faites pas, vous obtiendrez probablement l'erreur : File 'xxxx' not found (Errcode: 24) Lors de l'utilisation de MySQL avec OS/2 Warp 3, FixPack 29 ou plus est requis. Avec OS/2 Warp 4, FixPack 4 ou plus est requis. C'est un besoin de la librairie des Pthreads. MySQL doit être installé sur une partition qui supporte les noms de fichiers longs, tel que HPFS, FAT32, script doit être exécuté à partir du d'OS/2 et ne fonctionnera probablement pas avec des substitus tel que . Le script scripts/mysql?install?db a été renommé. Il est maintenant nommé et est un script REXX, qui mettra en place les configurations de sécurité par défaut de MySQL et créera les icônes WorkPlace Shell pour MySQL. Le support des module dynamiques est compilé, mais n'est pas assez testé. Les modules dynamiques doivent être compilés en utilisant la librairie run?time Pthreads. gcc ?Zdll ?Zmt ?Zcrtdll=pthrdrtl ?I../include ?I../regex ?I.. \ ?o exemple ?L../lib ?lmysqlclient mv Note : A cause des limitations de OS/2, les noms des modules UDF ne doivent pas dépasser 8 caractères. Les modules sont stockés dans le répertoire /mysql2/udf ; le script safe? placera ce répertoire dans la variable d'environnement BEGINLIBPATH . Lors de l'utilisation des modules UDF, les extensions spécifiées sont ignorées. Elle est supposée être .udf . Par exemple, sous Unix, le module partagé peut se nommer et vous chargeriez une de ses fonctions de la façon suivante : mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME ""; Sous OS/2, me module s'appelera , mais vous n'aurez pas à spécifier son extension : mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "exemple"; 2.6.8 Notes relatives à BeOS Nous sommes vraiment intéressés par le port de MySQL sur BeOS, mais malheureusement, nous n'avons personne qui s'y connaisse en BeOS ou qui ait le temps de s'en occuper. Nous sommes intéressés par quelqu'un qui serait prêt à faire le port, et nous l'aiderions pour toutes les questions techniques qu'il pourrait se poser durant le processus. Nous avons déjà eu des contacts avec des développeurs BeOS qui ont dit que MySQL était porté à 80% sur BeOS, mais nous n'avons plus entendu parler d'eux depuis. 2.6.9 Notes relatives à Novell NetWare Nous sommes vraiment intéressés par le port de MySQL sur NetWare, mais malheureusement, nous n'avons personne qui s'y connaisse en NetWare ou qui ait le temps de s'en occuper. 2.6.7 Notes relatives à OS/2 128 Manuel MySQL 4.1.x ? Version Française Nous sommes intéressés par quelqu'un qui serait prêt à faire le port, et nous l'aiderions pour toutes les questions techniques qu'il pourrait se poser durant le processus. 2.7 Commentaires sur l'installation de Perl 2.7.1 Installer Perl sur Unix Le support Perl pour MySQL est fournit par les interfaces clientes DBI / DBD. Le code client des modules DBD / DBI de Perl, requière une version de celui?ci supérieure ou égale à la version 5.004. L'interface ne fonctionnera pas si vous avez une ancienne version de Perl. Le support Perl de MySQL requière aussi que vous ayez installé le support de programmation de clients pour MySQL. Si vous avez installé MySQL à partir de fichiers RPM, les programmes clients sont dans le RPM client, mais le support de la programmation de clients est dans le RPM des développeurs. Assurez?vous d'avoir installé le dernier RPM. Depuis la version 3.22.8, le support Perl est distribué séparément du reste de la distribution MySQL. Si vous voulez installer le support Perl, les fichiers dont vous aurez besoin peuvent être trouvés sur . Les distributions de Perl sont fournies en tant qu'archives compréssées tar et ont des noms comme MODULE? , où MODULE est le nom du module et VERSION est le numéro de version. Vous devez obtenir les distributions Data?Dumper , DBI , et Msql?Mysql?modules et les installer dans cet ordre. La procédure d'installation est décrite ici. L'exemple montré ici concerne le module Data?Dumper , mais la procédure est la même pour les trois distributions : Décompressez la distribution dans le dossier courant : • shell> gunzip < Data?Dumper? | tar xvf ? Cette commande crée un dossier appelé Data?Dumper?VERSION . Mettez vous dans le répertoire racine de la distribution décompressée : • shell> cd Data?Dumper?VERSION Construisez la distribution et compilez tout : • shell> perl shell> make shell> make test shell> make install La commande make test est importante car elle vérifie que le module fonctionne. Notez que quand vous exécutez cette commande durant l'installation de Msql?Mysql?modules pour tester le code de l'interface, le serveur MySQL doit être en marche sinon le test échouera. Il est bon de reconstruire et réinstaller la distribution Msql?Mysql?modules à chaque fois que vous réinstallez une nouvelle version de MySQL, particulièrement si vous avez des problèmes avec vos scripts DBI après avoir avoir mis à jour MySQL. Si vous n'avez pas le droit d'installer des modules Perl dans le dossier système ou que vous voulez installer des modules locaux de Perl, la référence suivante pourra vous aider : Regardez le paragraphe Installing New Modules that Require Locally Installed Modules . 2.7 Commentaires sur l'installation de Perl 129 Manuel MySQL 4.1.x ? Version Française 2.7.2 Installer ActiveState Perl sur Windows Pour installer le module DBD MySQL avec ActiveState Perl sous Windows, vous devez faire ce qui suit : Obtenez ActiveState Perl à partir de et • installez le. Ouvrez un terminal DOS. • Si requis, définissez la variable HTTP_proxy. Par exemple, vous pouvez faire : • set :3128 Démarrez le programme PPM : • C:\> c:\perl\bin\ Installez • DBI , si ce n'est pas déjà fait : ppm> install DBI Si cela fonctionne, exécutez la commande suivante : • install \ ?mysql? Ce qui suit devrait fonctionner avec la version 5.6 d'ActiveState ce qui précède ne veut pas fonctionner, vous devez à la place installer le pilote MyODBC et vous connecter au serveur MySQL via ODBC : use DBI; $dbh= DBI?>connect("DBI:ODBC:$dsn","$utilisateur","$motdepasse") || die "Obtenu l'erreur $DBI::errstr lors de la connexion à $dsn\n"; 2.7.3 Installer la distribution Perl de MySQL sous Windows Cette distribution Perl de MySQL contient DBI , DBD:MySQL et DBD:ODBC . Obtenez la distribution Perl pour Windows à partir de • Décompressez la distribution dans • C: pour obtenir le dossier C:\PERL . Ajoutez le répertoire • C:\PERL\BIN à votre path. Ajoutez le répertoire • C:\PERL\BIN\MSWIN32?x86?thread ou C:\PERL\BIN\MSWIN32?x86 à votre path. Vérifiez que • perl fonctionne en exécutant perl ?v dans un terminal DOS. 2.7.4 Problèmes lors de l'utilisation des interfaces Perl DBI et DBD Si Perl vous informe qu'il ne peut trouver le module , il se trouve probablement que Perl n'arrive pas à trouver la librairie partagée . Vous pouvez corriger cela en suivant l'une des méthodes suivantes : Compilez la distribution • Msql?Mysql?modules avec perl ?static ?config au lieu de perl . Copiez • dans le dossier où se situent vos autres librairies partagées (souvent /usr/lib ou /lib ). Sous Linux vous pouvez ajouter le chemin vers le dossier dans lequel se trouve • au fichier . Ajoutez le chemin complet vers le dossier où se situe • à la variable d'environnement LD_RUN_PATH . 2.7.2 Installer ActiveState Perl sur Windows 130 Manuel MySQL 4.1.x ? Version Française Si vous obtenez l'erreur suivante de DBD?mysql , vous utilisez probablement gcc (ou un vieux binaire compilé avec gcc ) : /usr/bin/perl: can't resolve symbol '__moddi3' /usr/bin/perl: can't resolve symbol '__divdi3' Ajoutez ?L/usr/lib/gcc?lib/... ?lgcc à la commande de liaison lorsque la librairie est construite (vérifiez l'affichage de make concernant quand vous compilez le client Perl). L'option ?L doit spécifier le chemin vers le dossier où se situe libgcc.a sur votre systè autre cause du problème peut être que Perl et MySQL ne sont pas tous deux compilés avec gcc . Dans ce cas là, vous devrez faire en sorte qu'ils le soient. Si vous obtenez les erreurs suivantes de la part de Msql?Mysql?modules quand vous exécutez ces tests : t/00base............install_driver(mysql) failed: Can't load '' for module DBD::mysql: : undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586? line 169. cela signifie que vous avez besoin d'inclure la librairie dynamique, ?lz, dans la ligne de liaison. Cela peut se faire en changeant ce qui suit dans : $sysliblist .= " ?lm"; en $sysliblist .= " ?lm ?lz"; Après cela, vous devez exécuter 'make realclean' et reprendre l'installation dès le dé vous voulez utiliser le module de Perl sur un système qui ne supporte pas les liaisons dynamiques (comme Caldera/SCO) vous pouvez générer une version statique de Perl incluant DBI et DBD?mysql . L'approche est de générer une version de Perl avec le code de DBI lié et de l'installer au dessus de votre Perl courant. Puis vous utilisez cette version pour en créer à nouveau une autre qui comporte le code de DBD lié et d'installer cette version ci. Sur Caldera (SCO), vous devez définir les variables d'environnement suivantes : shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib ou shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/lib shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\ /usr/progressive/lib:/usr/skunk/lib shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:\ /usr/skunk/man: D'abord, créez un Perl incluant un DBI lié statiquement en exécutant des commandes dans le dossier où se situe votre distribution DBI : shell> perl ?static ?config shell> make shell> make install shell> make perl Ensuite, vous devez installer le nouveau Perl. Les affichages de make perl vous indiqueront les commandes make exactes que vous aurez besoin d'exécuter pour faire l'installation. Sur Caldera (SCO), il s'agit de make ?f Makefile.aperl inst_perl MAP_TARGET=perl .Puis, utilisé le Perl qui vient d'être créé pour en créer un nouveau qui inclut un DBD::mysql lié statiquement en exécutant ces commandes dans le dossier où votre distribution de Msql?Mysql?modules se situe : 2.7.2 Installer ActiveState Perl sur Windows 131 Manuel MySQL 4.1.x ? Version Française shell> perl ?static ?config shell> make shell> make install shell> make perl Finalement, vous devez installer ce nouveau Perl. Une fois de plus, l'affichage de make perl vous indiquera la commande à utiliser. 2.7.2 Installer ActiveState Perl sur Windows 132 3 Tutoriels d'introduction Ce chapitre fournit un tutoriel d'introduction à MySQL en montrant comment utiliser le client mysql pour créer et utiliser une simple base de données. mysql (quelques fois nommé ``moniteur terminal'' ou juste ``moniteur'') est un programme interactif qui vous permet de vous connecter à un serveur MySQL, exécuter des requêtes et voir les résultats. mysql peut aussi être utilisé en mode batch : vous placez vos requêtes dans un fichier, puis vous faites exécuter à mysql le contenu de ce fichier. Les deux manières d'utiliser mysql sont expliquées ici. Pour voir une liste d'options fournies par mysql , invoquez?le avec l'option ??help : shell> mysql ??help Ce chapitre assume que mysql est installé sur votre machine et qu'un serveur MySQL est disponible pour que vous vous y connectiez. Si ce n'est pas le cas, contactez votre administrateur MySQL. (Si vous êtes l'administrateur, vous aurez besoin de consulter d'autres sections de ce manuel.)Ce chapitre décrit le processus d'installation et d'utilisation d'une base de données en entier. Si vous n'êtes intéressés que par l'accès à une base de données existante, vous pouvez sauter les sections décrivant la création de la base et des tables. Ce chapitre n'est qu'un tutoriel, beaucoup de détails ne sont pas approfondis. Consultez les sections appropriées du manuel pour plus d'informations sur les sujets abordés. 3.1 Connexion et déconnexion au serveur Pour vous connecter au serveur, vous aurez dans la plupart des cas à fournir un nom d'utilisateur à MySQL, et, sûrement, un mot de passe. Si le serveur fonctionne sur une autre machine que la vôtre, vous devrez spécifier son adresse. Contactez votre administrateur pour connaître les paramètres à utiliser lors de la connexion (hôte, nom d'utilisateur, mot de passe à utiliser...). Une fois que vous aurez les bons paramètres, vous pourrez vous connecter de la façon suivante : shell> mysql ?h hote ?u utilisateur ?p Enter password: ******** ******** représente votre mot de passe, entrez?le lorsque mysql affiche Enter password: .Si tout fonctionne, vous devrez voir quelques informations d'introduction suivies d'une invite de commande mysql> : shell> mysql ?h host ?u user ?p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 459 to server version: 3.22.20a?log Type 'help' for help. mysql> L'invite vous dit que mysql attend que vous entriez des commandes.Quelques installations de MySQL autorisent les connexions anonymes au serveur tournant sur l'hôte local. Si c'est la cas sur votre machine, vous devriez arriver à vous connecter à ce serveur en invoquant la commande mysql sans aucune option : shell> mysql Après vous être connecté avec succès, vous pouvez vous déconnecter à tout moment en entrant QUIT dans l'invite mysql> : mysql> QUIT Bye Vous pouvez aussi le faire en appuyant sur Ctrl?D. 3 Tutoriels d'introduction 133 Manuel MySQL 4.1.x ? Version Française La plupart des exemples dans les sections suivantes supposent que vous êtes connecté au serveur. Cela se voit à l'invite mysql> . 3.2 Entrer des requêtes Assurez?vous d'être connecté au serveur, comme expliqué précédemment dans cette section. Faire ceci ne sélectionnera pas une base par lui même, mais c'est normal. A ce stade, il est important de découvrir la façon dont sont publiées les requêtes, pour ensuite pouvoir créer des tables, y insérer et rechercher des données. Cette section décrit les principes de base pour entrer une commande, en utilisant plusieurs requêtes que vous pouvez essayer pour vous familiariser avec la façon dont mysql fonctionne. Voilà une commande simple qui demande au serveur de vous donner son numéro de version et la date courante. Entrez?la comme suit, juste après l'invite mysql> puis pressez Enter : mysql> SELECT VERSION(), CURRENT_DATE; +??????????????+??????????????+ | VERSION() | CURRENT_DATE | +??????????????+??????????????+ | 3.22.20a?log | 1999?03?19 | +??????????????+??????????????+ 1 row in set (0.01 sec) mysql> La requête révèle plusieurs choses à propos de mysql : Une commande consiste normalement en une commande SQL suivie d'un point?virgule. (Il • y'a quelques cas ou le point?virgule n'est pas requis. QUIT , mentionnée plus tôt, en fait partie. Nous verrons les autres plus tard.) Lorsque vous entrez une commande, • mysql l'envoi au serveur pour l'exécution et affiche le résultat, puis affiche un autre mysql> pour indiquer qu'il attend une autre commande. mysql • affiche le résultat des requêtes dans une table (lignes et colonnes). La première ligne contient le nom des colonnes. Les lignes suivantes constituent le résultat de la requête. Normalement, les titres des colonnes sont les noms des champs des tables de la base de données que vous avez récupérés. Si vous récupérez la valeur d'une expression au lieu d'une colonne (comme dans l'exemple précédent), mysql nomme la colonne en utilisant l'expression elle?même. mysql • vous indique combien de lignes ont été retournées et combien de temps d'exécution la requête a pris, ce qui vous donnera une approximation des performances du serveur. Ces valeurs sont imprécises car elles représentent le temps soft (et non le temps CPU ou hard), et qu'elles sont affectées par des facteurs tels que la charge du serveur ou l'accessibilité du réseau. (Dans un soucis de brièveté, la ligne contenant ``rows in set'' n'est plus montrée dans les exemples suivants de ce chapitre.) Les mots?clefs peuvent être entrés sous n'importe quelle forme de casse. Les requêtes suivantes sont équivalentes : mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql> SeLeCt vErSiOn(), current_DATE; Voilà une autre requête. Elle montre que vous pouvez utiliser mysql en tant que simple calculatrice : mysql> SELECT SIN(PI()/4), (4+1)*5; +?????????????+?????????+ | SIN(PI()/4) | (4+1)*5 | 3.2 Entrer des requêtes 134 Manuel MySQL 4.1.x ? Version Française +?????????????+?????????+ | 0.707107 | 25 | +?????????????+?????????+ Les commandes vues jusqu'à présent ont été relativement courtes, et tenaient sur une seule ligne. Vous pouvez même entrer plusieurs requêtes sur une seule ligne. Il suffit de terminer chacune d'elle par un point?virgule : mysql> SELECT VERSION(); SELECT NOW(); +??????????????+ | VERSION() | +??????????????+ | 3.22.20a?log | +??????????????+ +?????????????????????+ | NOW() | +?????????????????????+ | 1999?03?19 00:15:33 | +?????????????????????+ Une commande ne doit pas être obligatoirement sur une seule ligne ; les commandes qui exigent plusieurs lignes ne sont pas un problème. mysql détermine où se situe la fin de votre commande en recherchant le point?virgule de terminaison, et pas l'extrémité de la commande entrée. (Dans d'autres termes, mysql accepte des formats libres d'entrée : il collecte les lignes entrées mais ne les exécute qu'une fois le point?virgule trouvé.) Voilà une seule requête sur plusieurs lignes : mysql> SELECT ?> USER() ?> , ?> CURRENT_DATE; +????????????????????+??????????????+ | USER() | CURRENT_DATE | +????????????????????+??????????????+ | joesmith@localhost | 1999?03?18 | +????????????????????+??????????????+ Dans cet exemple, notez comment l'invite change de mysql> à ?> après avoir entré la première ligne d'une requête multi?lignes. C'est la façon dont mysql indique qu'il n'a pas vu de requête complète et qu'il attend la fin de celle?ci. L'invite est votre ami en vous fournissant la rétroactivité. Si vous utilisez cette rétroactivité, vous vous rendrez toujours compte de ce que mysql attend. Si vous décidez d'annuler une commande que vous êtes en train de taper, faites?le en entrant \c : mysql> SELECT ?> USER() ?> \c mysql> Ici aussi, portez votre attention sur l'invite. Elle se transforme à nouveau en mysql> après que vous ayez entré \c , vous informant que mysql est prêt pour une nouvelle requê tableau suivant montre les différentes invites que vous pourrez voir et résume leur signification quand à l'état dans lequel se trouve mysql : Invite Signification mysql> Prêt pour une nouvelle commande. ?> En attente de la ou des lignes terminant la commande. En attente de la prochaine ligne collectant une chaîne commencée par un guillemet '> simple ( ''' ). En attente de la prochaine ligne collectant une chaîne commencée par un guillemet "> double ( '"' ). Les commandes sur plusieurs lignes sont la plupart du temps des accidents, lorsque vous voulez faire une commande sur une seule ligne et que vous oubliez le point?virgule de fin. Dans ce cas, mysql attend la suite de votre saisie : mysql> SELECT USER() ?> 3.2 Entrer des requêtes 135 Manuel MySQL 4.1.x ? Version Française Si cela vous arrive (vous pensez que votre requête est complète mais la seule réponse est l'invite ?> ), il est fort probable que mysql attende le point?virgule. Si vous ne notez pas ce que l'invite vous indique, vous pourriez patienter pendant longtemps avant de réaliser ce que vous devez faire. Entrez un point?virgule pour compléter la requête, et mysql devrait l'exécuter : mysql> SELECT USER() ?> ; +????????????????????+ | USER() | +????????????????????+ | joesmith@localhost | +????????????????????+ L'invite '> ainsi que "> apparaissent durant l'entrée de chaîne. Dans MySQL, vous pouvez écrire une chaîne entourée du caractère ''' ou bien '"' (par exemple, 'Bonjour' or "Au Revoir" ), et mysql vous laisse entrer une chaîne qui peut être sur plusieurs lignes. Lorsque vous voyez une invite comme '> ou "> , cela signifie que vous avez entré une ligne contenant le caractère ''' ou '"' , mais vous n'avez pas encore entré le caractère correspondant qui termine votre chaîne. C'est pratique si vous entrez réellement une chaîne à lignes multiples, mais est?ce probable ? Pas vraiment. Plus souvent, les invites '> et "> indiquent que vous avez, par inadvertance, oublié un caractère de fermeture. Par exemple : mysql> SELECT * FROM ma_table WHERE nom = "Smith AND age < 30; "> Si vous entrez cette requête SELECT , puis appuyez sur Enter et attendez le résultat, rien ne se passera. Au lieu de vous demander pourquoi la requête met si longtemps à s'exécuter, remarquez que l'invite de commande s'est transformée en "> . Cela indique que mysql attend de voir la fin d'une chaîne de caractères non?terminée. (Voyez?vous l'erreur dans cette requête ? Il manque le second guillemet à la suite de "Smith .) Que faire ? Le plus simple est d'annuler la commande. Toutefois, vous ne pouvez vous contenter de taper \c dans ce cas?là, car mysql l'interprète comme une partie de la chaîne qu'il est en train de collecter ! A la place, entrez le second guillemet (pour que mysql sache que vous avez fini la chaîne), puis entrez \c : mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30; "> "\c mysql> L'invite se change à nouveau en mysql> , indiquant que mysql est prêt pour une nouvelle requê est important de savoir ce que les invites '> et "> signifient, car si vous avez entré par erreur une chaîne non terminée, toutes les lignes suivantes que vous entrerez seront ignorées par mysql , même une ligne contenant QUIT ! Cela peut prêter à confusion, spécialement si vous ne savez pas que vous devez fournir le guillemet fermant avant de pouvoir annuler la commande courante. 3.3 Création et utilisation d'une base de données Maintenant que vous savez entrer des commandes, il est temps d'accéder à une base. Supposons que vous avec plusieurs animaux chez vous (dans votre ménagerie) et que vous voulez garder diverses informations les concernant. Vous pouvez le faire en créant des tables pour stocker vos données et y charger vos informations. Vous pourrez alors répondre à différentes sortes de questions à propos de vos animaux en récupérant les données à partir des tables. Cette section vous montre comment : Créer une base de données • Créer une table • Charger des données dans vos tables • Récupérer des donneées à partir des tables de différentes façons • Utiliser plusieurs tables • 3.3 Création et utilisation d'une base de données 136 Manuel MySQL 4.1.x ? Version Française La base de données de la ménagerie va être simple (délibérément), mais il n'est pas difficile de penser à des situations courantes de la vie où vous aurez à utiliser un tel type de base de données. Par exemple, une telle base pourrait être utilisée par un éleveur pour gérer sa boutique, ou par un vétérinaire pour garder des traces de ses patients. Une distribution de la ménagerie contenant quelques requêtes et des exemples de données utilisées dans la section suivante peuvent être trouvés sur le site web de MySQL. Ils sont disponibles au format compressé tar ( ).Utilisez la commande SHOW pour trouver quelles bases existent déjà sur le serveur : mysql> SHOW DATABASES; +??????????+ | Database | +??????????+ | mysql | | test | | tmp | +??????????+ La liste des bases de données est probablement différente sur votre machine, mais les bases mysql et test y figurent sûrement. La base mysql est requise car elle gère les accès et les privilèges. La base test est souvent fournie pour que les utilisateurs y effectuent leurs tests.Notez que vous ne pourrez voir toutes les bases de données si vous n'avez pas le privilège SHOW DATABASES . Syntaxe de GRANT et REVOKE . Si la base de données test existe, essayez d'y accéder : mysql> USE test Database changed Notez que USE , comme QUIT , ne requiert pas de point?virgule. (Vous pouvez terminer ces commandes avec un point?virgule ; cela ne posera pas de problèmes.) La commande USE est spéciale d'un autre point de vue : elle doit être donnée sur une seule ligne. Vous pouvez utiliser la base de données test (si vous y avez accès) pour les exemples qui suivent, mais tout ce que vous créerez dans cette base pourra être éffacé par quiconque y a accès. Pour cette raison, vous feriez mieux de demander à votre administrateur MySQL la permission d'utiliser une base de données rien que pour vous. Supposez que vous voulez nommer la votre menagerie . L'administrateur a besoin d'exécuter une commande telle que : mysql> GRANT ALL ON menagerie.* TO votre_nom_mysql; où votre_nom_mysql est le nom d'utilisateur MySQL qui vous est assigné. 3.3.1 Créer et sélectionner une base de données Si l'administrateur vous a créé une base de données lors du paramétrage de vos droits, vous pouvez commencer à l'utiliser. Sinon, vous aurez besoin de la créer par vous?même : mysql> CREATE DATABASE menagerie; Sous Unix, les noms des bases de données sont sensibles à la casse (ce qui diffère des mots réservés de SQL), ce qui fait que vous devez tuojours vous référer à votre base de données avec menagerie , non avec Menagerie , MENAGERIE , ou d'autres variantes. Cela est aussi valable pour les noms de tables. (Sous Windows, cette restriction n'est pas appliquée, même si vous devez vous référer à une table ou une base de la même façon dans une même requête). 3.3.1 Créer et sélectionner une base de données 137 Manuel MySQL 4.1.x ? Version Française La création d'une base de données ne la sélectionne pas pour l'utilisation ; vous devez le faire explicitement. Pour rendre menagerie la base courante, utilisez cette commande : mysql> USE menagerie Database changed Votre base a besoin d'être créée juste une fois, mais vous devez la sélectionner pour l'utiliser, chaque fois que vous débutez une session mysql . Vous pouvez le faire en publiant une requête USE comme ci?dessus. Sinon, vous pouvez sélectionner la base directement dans la ligne de commande lorsque vous invoquez mysql . Vous devez juste spécifier son nom après les paramètres de connexion dont vous avez besoin. Par exemple : shell> mysql ?h hote ?u utilisateur ?p menagerie Enter password: ******** Notez que menagerie n'est pas votre mot de passe dans la commande que nous venons de montrer. Si vous voulez le fournir dans la ligne de commande après l'option ?p , vous devez le faire sans espace entre les deux (par exemple, tapez ?pmonmotdepasse , et non ?p monmotdepasse ). Toutefois, mettre le mot de passe en ligne de commande n'est pas recommandé, car le faire permettrait à d'autres utilisateurs connectés sur votre machine de l'obtenir. 3.3.2 Création d'une table Créer la base de données est la partie facile, mais jusque?là elle est vide, comme vous le montre SHOW TABLES : mysql> SHOW TABLES; Empty set (0.00 sec) La partie la plus difficile est le choix de la structure de la base de données : de quelles tables aurez vous besoin et quelles colonnes devront figurer dans chacune d' voudrez une table qui contient un enregistrement pour chaque animal. On peut l'appeler la table animal , et elle devra contenir, au minimum, le nom de chaque animal. Puisque le nom tout seul n'est pas intéressant, la table devra contenir d'autres informations. Par exemple, si plus d'une personne de votre famille possède un animal, vous voudrez lister le nom du maître de chaque animal. Vous voudrez peut?être aussi enregistrer une description basique comme l'espèce ou le sexe. Et pour l'âge ? C'est intéressant, mais n'est pas bon pour un stockage en base de données. L'âge change chaque jour, vous devrez donc mettre à jour vos enregistrements assez souvent. Il est préférable de stocker une valeur fixe, comme la date de naissance. Dans ce cas?là, à chaque fois que vous aurez besoin de l'âge, vous pourrez l'obtenir en faisant la différence entre la date courante et la date enregistrée. MySQL fournit des fonctions de calcul sur les dates, cela ne sera donc pas difficile. Enregistrer la date de naissance, au lieu de l'âge a d'autres avantages : Vous pouvez utiliser la base de données pour des tâches, comme la génération d'un rappel • pour les prochains anniversaires d'animaux. (Si vous trouvez que ce type de requêtes est quelque peu idiot, notez que c'est la même question que vous vous poseriez dans le contexte d'une base de données d'affaires pour identifier les clients à qui vous aurez besoin d'envoyer un message de voeux, pour cette touche informatiquement assistée d'humanisme.) Vous pouvez calculer l'âge à partir d'autres dates que la date du jour. Par exemple, si vous • stockez la date de la mort dans la base de données, vous pourrez facilement calculer l'âge qu'avait un animal à sa mort. Vous trouverez probablement d'autres informations qui pourront être utiles dans la table animal , mais celles identifiés jusqu'à maintenant sont largement suffisantes pour l'instant : nom, maitre, 3.3.2 Création d'une table 138 Manuel MySQL 4.1.x ? Version Française espece, sexe, naissance, et mort.Utilisez une requête CREATE TABLE pour spécifier la structure de votre table : mysql> CREATE TABLE animal (nom VARCHAR(20), maitre VARCHAR(20), ?> espece VARCHAR(20), sexe CHAR(1), naissance DATE, mort DATE); VARCHAR est un bon choix pour les colonnes nom , maitre , et espece car leurs valeurs varient en longueur. La longueur de ces colonnes ne doit pas nécessairement être la même, et n'a pas besoin d'être forcement 20 . Vous pouvez choisir une taille entre 1 et 255 , celle qui vous semblera la plus raisonnable. (Si vous faites un mauvais choix et que vous vous apercevez plus tard que vous avez besoin d'un champ plus long, MySQL fournit la commande ALTER TABLE .)Le sexe des animaux peut être représenté de plusieurs façons, par exemple, "m" et "f" , ou bien "male" and "femelle" . Il est plus simple d'utiliser les caractères simples "m" et "f" . L'utilisation du type de données DATE pour les colonnes naissance et mort est un choix plutôt judicieux. Maintenant que vous avez créé une table, SHOW TABLES devrait produire de l'affichage : mysql> SHOW TABLES; +?????????????????????+ | Tables in menagerie | +?????????????????????+ | animal | +?????????????????????+ Pour vérifier que la table a été créée de la façon que vous vouliez , utilisez la commande DESCRIBE : mysql> DESCRIBE animal; +???????????+?????????????+??????+?????+?????????+???????+ | Field | Type | Null | Key | Default | Extra | +???????????+?????????????+??????+?????+?????????+???????+ | nom | varchar(20) | YES | | NULL | | | maitre | varchar(20) | YES | | NULL | | | espece | varchar(20) | YES | | NULL | | | sexe | char(1) | YES | | NULL | | | naissance | date | YES | | NULL | | | mort | date | YES | | NULL | | +???????????+?????????????+??????+?????+?????????+???????+ Vous pouvez utiliser DESCRIBE quand vous voulez, par exemple, si vous avez oublié les noms des colonnes dans votre table ou leurs types. 3.3.3 Charger des données dans une table Après la création de votre table, vous aurez besoin de la remplir. Les commandes LOAD DATA et INSERT sont utiles pour cela. Supposons que les enregistrements de vos animaux peuvent être décrits comme suit. (Observez que MySQL attend les dates au format YYYY?MM?DD ; cela peut différer de ce à quoi vous êtes habitué.) nom maitre especes sexe naissance mort Fluffy Harold chat f 1993?02?04 Claws Gwen chat m 1994?03?17 Buffy Harold chien f 1989?05?13 Fang Benny chien m 1990?08?27 Bowser Diane chien m 1998?08?31 1995?07?29 3.3.3 Charger des données dans une table 139 Manuel MySQL 4.1.x ? Version Française Chirpy Gwen oiseau f 1998?09?11 Whistler Gwen oiseau 1997?12?09 Slim Benny serpent m 1996?04?29 Puisque vous commencez avec une table vide, il est facile de la remplir en créant un fichier texte contenant une ligne pour chaque animal que vous avez, puis charger son contenu à l'aide d'une seule commande. Vous pouvez créer un fichier contenant un enregistrement par ligne, avec les valeurs séparés par des tabulations, et ordonnées comme les champs l'étaient dans la requête CREATE TABLE . Pour les données manquantes (comme un sexe inconnu ou la date de mort d'un animal toujours en vie), vous pouvez utiliser les valeurs NULL . Pour les représenter dans votre fichier texte, utilisez \N . Par exemple, l'enregistrement de Whistler l'oiseau ressemblera à ça (l'espace entre les valeurs est une tabulation) : nom maitre especes sexe naissance mort Whistler Gwen bird \N 1997?12?09 \N Pour charger le fichier dans la table pet , utilisez cette commande : mysql> LOAD DATA LOCAL INFILE "" INTO TABLE pet; Vous pouvez spécifier la valeur du séparateur de colonnes et le marqueur de fin de lignes explicitement dans la commande LOAD DATA si vous le voulez, mais les valeurs par défaut sont la tabulation et le retour à la ligne. Ceux?là sont suffisants pour que la commande lise le fichier correctement. Lorsque vous voulez ajouter des enregistrements un par un, la commande INSERT est utile. Dans sa forme la plus simple, où vous spécifiez une valeur pour chaque colonne, dans l'ordre où les colonnes sont listées dans la requête CREATE TABLE . Supposons que Diane achète un nouvel hamster nommé Puffball. Vous pourriez ajouter ce nouvel enregistrement en utilisant un INSERT de la façon suivante : mysql> INSERT INTO pet ?> VALUES ('Puffball','Diane','hamster','f','1999?03?30',NULL); Notez que les chaînes de caractères et les valeurs de dates sont spécifiées en tant que chaînes protégées par des guillemets. De plus, avec INSERT vous pouvez insérer la valeur NULL directement pour représenter une valeur manquante. Vous n'utilisez pas \N comme vous le faites avec LOAD DATA . A partir de cet exemple, vous devriez être capable de voir qu'il y'a beaucoup plus de commandes à taper lorsque vous utilisez la commande INSERT au lieu de LOAD DATA . 3.3.4 Récupérer des informations à partir d'une table La commande SELECT est utilisée pour récupérer des informations à partir d'une table. La forme usuelle est : SELECT quoi_selectionner FROM quel_table WHERE conditions_a_satisfaire quoi_selectionner indique ce que vous voulez voir. Cela peut être une liste de colonnes, ou * pour indiquer ``toutes les colonnes''. quel_table indique la table à partir de laquelle récupérer les 3.3.4 Récupérer des informations à partir d'une table 140 Manuel MySQL 4.1.x ? Version Française données. La clause WHERE est optionnelle. Si elle est présente, conditions_a_satisfaire spécifie les conditions que les lignes doivent satisfaire pour être séléctionnées. 3.3.4.1 Sélectionner toutes les données La plus simple forme de SELECT récupère toutes les données d'une table : mysql> SELECT * FROM animal; +??????????+????????+?????????+??????+????????????+????????????+ | nom | maitre | espece | sexe | naissance | mort | +??????????+????????+?????????+??????+????????????+????????????+ | Fluffy | Harold | chat | f | 1993?02?04 | NULL | | Claws | Gwen | chat | m | 1994?03?17 | NULL | | Buffy | Harold | chien | f | 1989?05?13 | NULL | | Fang | Benny | chien | m | 1990?08?27 | NULL | | Bowser | Diane | chien | m | 1998?08?31 | 1995?07?29 | | Chirpy | Gwen | oiseau | f | 1998?09?11 | NULL | | Whistler | Gwen | oiseau | NULL | 1997?12?09 | NULL | | Slim | Benny | serpent | m | 1996?04?29 | NULL | | Puffball | Diane | hamster | f | 1999?03?30 | NULL | +??????????+????????+?????????+??????+????????????+????????????+ Cette forme de SELECT est utile si vous voulez récupérer la table entière. par exemple, après l'avoir juste remplie avec vos données d'origine. Il apparaît alors qu'une erreur s'était glissée dans votre fichier de données : Bowser a l'air d'être né après sa mort ! En consultant le papier original de son pedigree, vous trouvez que la date correcte est 1989 et non pas 1998. Il y'a au moins deux façons de corriger cela : Corriger le fichier • pour corriger l'erreur, puis vider et recharger à nouveau la table en utilisant DELETE et LOAD DATA : mysql> SET AUTOCOMMIT=1; # Utilisé pour une recréation rapide de la table mysql> DELETE FROM animal; mysql> LOAD DATA LOCAL INFILE "" INTO TABLE animal; Toutefois, si vous choisissez cette méthode, vous devrez aussi rentrer à nouveau l'enregistrement de Puffball. Corriger uniquement l'enregistrement erroné avec une requête • UPDATE : mysql> UPDATE animal SET naissance = "1989?08?31" WHERE nom = "Bowser"; Comme nous l'avons montré, il est facile de récupérer toutes les données d'une table. Toutefois, vous ne voudrez sûrement pas le faire, surtout si la table devient imposante. A la place, vous serez plus intéressé par répondre à une question particulière, dans ce cas?là, vous spécifiez quelques contraintes pour les informations que vous voulez. Regardons quelques requêtes de sélection qui répondent à des questions à propos de vos animaux. 3.3.4.2 Sélectionner des lignes particuliéres Vous pouvez sélectionner des lignes particulières de votre table. Par exemple, si vous voulez vérifier la modification que vous avez effectuée sur la date de naissance de Bowser, sélectionnez son enregistrement comme suit : mysql> SELECT * FROM animal WHERE nom = "Bowser"; +????????+????????+????????+??????+????????????+????????????+ | nom | maitre | espece | sexe | naissance | mort | +????????+????????+????????+??????+????????????+????????????+ | Bowser | Diane | chien | m | 1989?08?31 | 1995?07?29 | 3.3.4.1 Sélectionner toutes les données 141 Manuel MySQL 4.1.x ? Version Française +????????+????????+????????+??????+????????????+????????????+ L'affichage confirme que la date est correcte maintenant : 1989, et non comparaison des chaînes de caractères se fait normalement avec sensibilité à la casse, vous pouvez donc spécifier le nom "bowser" , "BOWSER" , etc. Le résultat de la requête sera le même. Vous pouvez spécifier des conditions sur toutes les colonnes, pas seulement nom . Par exemple, si vous voulez savoir quels animaux sont nés après 1998, testez la colonne naissance : mysql> SELECT * FROM animal WHERE naissance >= "1998?1?1"; +??????????+????????+?????????+??????+????????????+???????+ | nom | maitre | espece | sexe | naissance | mort | +??????????+????????+?????????+??????+????????????+???????+ | Chirpy | Gwen | oiseau | f | 1998?09?11 | NULL | | Puffball | Diane | hamster | f | 1999?03?30 | NULL | +??????????+????????+?????????+??????+????????????+???????+ Vous pouvez combiner plusieurs conditions, par exemple, pour trouver les chiennes : mysql> SELECT * FROM animal WHERE espece = "chien" AND sexe = "f"; +???????+????????+????????+??????+????????????+???????+ | nom | maitre | espece | sexe | naissance | mort | +???????+????????+????????+??????+????????????+???????+ | Buffy | Harold | chien | f | 1989?05?13 | NULL | +???????+????????+????????+??????+????????????+???????+ La requête précédente utilise l'opérateur logique AND . L'opérateur OR existe aussi : mysql> SELECT * FROM animal WHERE espece = "serpent" OR espece = "oiseau"; +??????????+????????+?????????+??????+????????????+???????+ | nom | maitre | espece | sexe | naissance | mort | +??????????+????????+?????????+??????+????????????+???????+ | Chirpy | Gwen | oiseau | f | 1998?09?11 | NULL | | Whistler | Gwen | oiseau | NULL | 1997?12?09 | NULL | | Slim | Benny | serpent | m | 1996?04?29 | NULL | +??????????+????????+?????????+??????+????????????+???????+ AND et OR peuvent être utilisés ensemble. Si vous le faites, une bonne idée est d'utiliser les parenthèses pour indiquer comment les conditions doivent être regroupées : mysql> SELECT * FROM animal WHERE (espece = "chat" AND sexe = "m") ?> OR (espece = "chien" AND sexe = "f"); +???????+????????+????????+??????+????????????+???????+ | nom | maitre | espece | sexe | naissance | mort | +???????+????????+????????+??????+????????????+???????+ | Claws | Gwen | chat | m | 1994?03?17 | NULL | | Buffy | Harold | chien | f | 1989?05?13 | NULL | +???????+????????+????????+??????+????????????+???????+ 3.3.4.3 Sélectionner des colonnes particulières Si vous ne voulez pas voir les lignes entières de votre table, nommez les colonnes qui vous intéressent, en les séparant par des virgules. Par exemple, si vous voulez savoir quand vos animaux sont nés, sélectionnez les colonnes nom et naissance : mysql> SELECT nom, naissance FROM animal; +??????????+????????????+ | nom | naissance | +??????????+????????????+ | Fluffy | 1993?02?04 | | Claws | 1994?03?17 | | Buffy | 1989?05?13 | | Fang | 1990?08?27 | | Bowser | 1989?08?31 | | Chirpy | 1998?09?11 | | Whistler | 1997?12?09 | 3.3.4.3 Sélectionner des colonnes particulières 142 Manuel MySQL 4.1.x ? Version Française | Slim | 1996?04?29 | | Puffball | 1999?03?30 | +??????????+????????????+ Pour trouver qui possède les animaux, utilisez cette requête : mysql> SELECT maitre FROM animal; +????????+ | maitre | +????????+ | Harold | | Gwen | | Harold | | Benny | | Diane | | Gwen | | Gwen | | Benny | | Diane | +????????+ Toutefois, remarquez que la requête récupère le champ maitre de chaque enregistrement, et certains apparaissent plus d'une fois. Pour minimiser l'affichage, récupérez chaque résultat unique une seule fois en ajoutant le mot?clef DISTINCT : mysql> SELECT DISTINCT maitre FROM animal; +????????+ | maitre | +????????+ | Benny | | Diane | | Gwen | | Harold | +????????+ Vous pouvez utiliser une clause WHERE pour combiner la sélection des lignes avec celle des colonnes. Par exemple, pour obtenir les dates de naissance des chiens et chats uniquement, utilisez cette requête : mysql> SELECT nom, espece, naissance FROM animal ?> WHERE espece = "chien" OR espece = "chat"; +????????+????????+????????????+ | nom | espece | naissance | +????????+????????+????????????+ | Fluffy | chat | 1993?02?04 | | Claws | chat | 1994?03?17 | | Buffy | chien | 1989?05?13 | | Fang | chien | 1990?08?27 | | Bowser | chien | 1989?08?31 | +????????+????????+????????????+ 3.3.4.4 Trier les enregistrements Vous avez sûrement noté dans les exemples précédents que les lignes de résultat sont affichées sans ordre particulier. Cependant, il est souvent plus facile d'examiner les résultats lorsqu'ils sont triés d'une manière significative. Pour trier un résultat, vous devez utiliser une clause ORDER BY . L'exemple suivant présente les dates d'anniversaire des animaux, triées par date : mysql> SELECT nom, naissance FROM animaux ORDER BY naissance; +??????????+????????????+ | nom | naissance | +??????????+????????????+ | Buffy | 1989?05?13 | | Bowser | 1989?08?31 | | Fang | 1990?08?27 | | Fluffy | 1993?02?04 | | Claws | 1994?03?17 | 3.3.4.4 Trier les enregistrements 143 Manuel MySQL 4.1.x ? Version Française | Slim | 1996?04?29 | | Whistler | 1997?12?09 | | Chirpy | 1998?09?11 | | Puffball | 1999?03?30 | +??????????+????????????+ Sur les noms de colonnes, le tri ? comme toutes les opérations de comparaison ? est normalement exécuté sans tenir compte de la casse. Cela signifie que l'ordre sera indéfini pour les colonnes qui sont identiques, excepté leur casse. Vous pouvez forcer le tri sensible à la casse en utilisant la clause BINARY : ORDER BY BINARY(champ) . Pour trier dans l'ordre inverse, ajoutez le mot?clé DESC (décroissant) au nom de la colonne à trier : mysql> SELECT nom, naissance FROM animaux ORDER BY naissance DESC; +??????????+????????????+ | nom | naissance | +??????????+????????????+ | Puffball | 1999?03?30 | | Chirpy | 1998?09?11 | | Whistler | 1997?12?09 | | Slim | 1996?04?29 | | Claws | 1994?03?17 | | Fluffy | 1993?02?04 | | Fang | 1990?08?27 | | Bowser | 1989?08?31 | | Buffy | 1989?05?13 | +??????????+????????????+ Vous pouvez effectuer un tri sur plusieurs colonnes. Par exemple, pour trier par types d'animaux, puis par la date d'anniversaire des animaux, en plaçant les plus jeunes en premier, utilisez la requête suivante : mysql> SELECT nom, espece, naissance FROM animaux ORDER BY type, naissance DESC; +??????????+?????????+????????????+ | nom | espece | naissance | +??????????+?????????+????????????+ | Chirpy | oiseau | 1998?09?11 | | Whistler | oiseau | 1997?12?09 | | Claws | chat | 1994?03?17 | | Fluffy | chat | 1993?02?04 | | Fang | chien | 1990?08?27 | | Bowser | chien | 1989?08?31 | | Buffy | chien | 1989?05?13 | | Puffball | hamster | 1999?03?30 | | Slim | serpent | 1996?04?29 | +??????????+?????????+????????????+ Notez que le mot?clé DESC est appliqué uniquement au nom de la colonne qui le précède ( naissance ) ; les valeurs espece continuent à être triées dans l'ordre croissant. 3.3.4.5 Calcul sur les Dates MySQL fournit plusieurs fonctions que vous pouvez utiliser pour effectuer des calculs sur les dates, par exemple, pour calculer l'âge ou pour extraire des parties de date. Pour déterminer quel âge a chacun de vos animaux, vous devez calculer la différence entre l'année en cours et l'année de naissance, puis soustraire à la date courante si la date du jour se produit plus tôt dans l'année civile que la date de naissance. La requête suivante montre, pour chaque animal, la date de naissance, la date courante, ainsi que l'âge en années. mysql> SELECT nom, naissance, CURRENT_DATE, ?> (YEAR(CURRENT_DATE)?YEAR(naissance)) ?> ? (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5)) ?> AS age ?> FROM animaux; +??????????+????????????+??????????????+??????+ 3.3.4.5 Calcul sur les Dates 144 Manuel MySQL 4.1.x ? Version Française | nom |naissance | CURRENT_DATE | age | +??????????+????????????+??????????????+??????+ | Fluffy | 1993?02?04 | 2001?08?29 | 8 | | Claws | 1994?03?17 | 2001?08?29 | 7 | | Buffy | 1989?05?13 | 2001?08?29 | 12 | | Fang | 1990?08?27 | 2001?08?29 | 11 | | Bowser | 1989?08?31 | 2001?08?29 | 11 | | Chirpy | 1998?09?11 | 2001?08?29 | 2 | | Whistler | 1997?12?09 | 2001?08?29 | 3 | | Slim | 1996?04?29 | 2001?08?29 | 5 | | Puffball | 1999?03?30 | 2001?08?29 | 2 | +??????????+????????????+??????????????+??????+ Ici, YEAR() extrait l'année de la date et RIGHT() extrait les 5 caractères les plus à droite de la date qui représentent MM?DD (année civile). La partie de l'expression qui compare les valeurs de MM?DD évalue à 1 ou à 0, qui ajustent la différence d'année à la baisse, si CURRENT_DATE se produit plus au début de l'année que la naissance . L'expression complète est un peu plus fine en utilisant un alias ( age ) pour produire un nom de colonne un peu plus requête fonctionne, mais le résultat pourrait être lu plus facilement si les lignes étaient présentées dans le même ordre. Cela peut être obtenu en ajoutant une clause ORDER BY nom pour trier le résultat par nom : mysql> SELECT nom, naissance, CURRENT_DATE, ?> (YEAR(CURRENT_DATE)?YEAR(naissance)) ?> ? (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5)) ?> AS age ?> FROM animaux ORDER BY nom; +??????????+????????????+??????????????+??????+ | nom |naissance | CURRENT_DATE | age | +??????????+????????????+??????????????+??????+ | Bowser | 1989?08?31 | 2001?08?29 | 11 | | Buffy | 1989?05?13 | 2001?08?29 | 12 | | Chirpy | 1998?09?11 | 2001?08?29 | 2 | | Claws | 1994?03?17 | 2001?08?29 | 7 | | Fang | 1990?08?27 | 2001?08?29 | 11 | | Fluffy | 1993?02?04 | 2001?08?29 | 8 | | Puffball | 1999?03?30 | 2001?08?29 | 2 | | Slim | 1996?04?29 | 2001?08?29 | 5 | | Whistler | 1997?12?09 | 2001?08?29 | 3 | +??????????+????????????+??????????????+??????+ Pour trier le résultat par l' age plutôt que par le nom , utilisez simplement une clause ORDER BY différente : mysql> SELECT nom, naissance, CURRENT_DATE, ?> (YEAR(CURRENT_DATE)?YEAR(naissance)) ?> ? (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5)) ?> AS age ?> FROM animaux ORDER BY age; +??????????+????????????+??????????????+??????+ | nom |naissance | CURRENT_DATE | age | +??????????+????????????+??????????????+??????+ | Chirpy | 1998?09?11 | 2001?08?29 | 2 | | Puffball | 1999?03?30 | 2001?08?29 | 2 | | Whistler | 1997?12?09 | 2001?08?29 | 3 | | Slim | 1996?04?29 | 2001?08?29 | 5 | | Claws | 1994?03?17 | 2001?08?29 | 7 | | Fluffy | 1993?02?04 | 2001?08?29 | 8 | | Fang | 1990?08?27 | 2001?08?29 | 11 | | Bowser | 1989?08?31 | 2001?08?29 | 11 | | Buffy | 1989?05?13 | 2001?08?29 | 12 | +??????????+????????????+??????????????+??????+ Une requête similaire peut être utilisée pour déterminer l'âge qu'avait un animal à sa mort. Vous determinez les animaux qui le sont en regardant les valeurs mort qui ne valent pas NULL . Alors, pour ceux dont la valeur est non NULL , calculez la différence entre la mort et la naissance : mysql> SELECT nom, naissance, mort, ?> (YEAR(death)?YEAR(naissance)) ? (RIGHT(mort,5)<RIGHT(naissance,5)) ?> AS age 3.3.4.5 Calcul sur les Dates 145 Manuel MySQL 4.1.x ? Version Française ?> FROM animaux WHERE mort IS NOT NULL ORDER BY age; +????????+????????????+????????????+??????+ | nom |naissance | mort | age | +????????+????????????+????????????+??????+ | Bowser | 1989?08?31 | 1995?07?29 | 5 | +????????+????????????+????????????+??????+ Cette requête utilise mort IS NOT NULL plutôt que mort <> NULL parce que NULL est une quels sont les animaux qui ont leur anniversaire le mois prochain ? Pour effectuer ce type de calculs, l'année et le jour ne sont pas utiles ; vous voulez simplement extraire le mois de la colonne naissance . MySQL fournit plusieurs fonctions d'extraction de parties de dates, comme YEAR() , MONTH() , et DAYOFMONTH() . MONTH() est la fonction appropriée dans notre cas. Pour voir comment cette fonction travaille, exécutez une requête simple qui retourne l' naissance et le MONTH(naissance) : mysql> SELECT nom, naissance, MONTH(naissance) FROM animaux; +??????????+????????????+??????????????????+ | nom | naissance | MONTH(naissance) | +??????????+????????????+??????????????????+ | Fluffy | 1993?02?04 | 2 | | Claws | 1994?03?17 | 3 | | Buffy | 1989?05?13 | 5 | | Fang | 1990?08?27 | 8 | | Bowser | 1989?08?31 | 8 | | Chirpy | 1998?09?11 | 9 | | Whistler | 1997?12?09 | 12 | | Slim | 1996?04?29 | 4 | | Puffball | 1999?03?30 | 3 | +??????????+????????????+??????????????????+ Trouver les animaux qui ont leur anniversaire dans le mois suivant est aisé. Supposez que le mois courant est Avril. Donc, la valeur du mois est 4 et vous cherchez les animaux nés en Mai (mois 5) comme ceci : mysql> SELECT nom, naissance FROM animaux WHERE MONTH(naissance) = 5; +???????+????????????+ | nom |naissance | +???????+????????????+ | Buffy | 1989?05?13 | +???????+????????????+ Il y a une petite complication si le mois courant est Décembre, bien sûr. Vous ne pouvez pas uniquement ajouter 1 au numéro du mois courant ( 12 ) et chercher les animaux qui sont nés le mois numéro 13, parce qu'il n'existe pas. A la place, vous cherchez les animaux nés en Janvier (mois numéro 1). Vous pouvez toujours écrire une requête qui fonctionne quelque soit le mois courant. Comme cela, vous n'avez pas à utiliser un numéro de mois particulier dans votre requête. DATE_ADD() vous permet d'ajouter un intervalle de temps à une date donnée. Si vous ajoutez un mois à la valeur de NOW() , et que vous extrayez le mois à l'aide de MONTH() , le résultat produit le mois dans lequel vous devez chercher un anniversaire : mysql> SELECT nom, naissance FROM animaux ?> WHERE MONTH(naissance) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH)); Une manière différente d'arriver au même résultat est d'ajouter 1 pour trouver le mois prochain après le mois courant (après l'usage de la fonction ( MOD ) pour ajouter à la valeur du mois la valeur 0 si il est de 12 ) : mysql> SELECT nom, naissance FROM animaux ?> WHERE MONTH(naissance) = MOD(MONTH(NOW()), 12) + 1; Notez que MONTH retourne un nombre entre 1 et 12. MOD(quelquechose,12) retourne un nombre entre 0 et 11. Donc, l'addition doit être faite après l'utilisation de la fonction MOD() , sinon, 3.3.4.5 Calcul sur les Dates 146 Manuel MySQL 4.1.x ? Version Française nous aurions un intervalle entre Novembre (11) et Janvier (1). 3.3.4.6 Travailler avec la valeur NULL La valeur NULL peut être surprenante jusqu'à ce que vous vous y habituiez. Conceptuellement, NULL représente une valeur qui manque, ou une valeur inconnue, et elle est traitée différemment des autres valeurs. Pour tester la présence de la valeur NULL , vous ne pouvez pas utiliser les opérateurs arithmétiques habituels comme = , < , ou <> . Pour le voir, il suffit d'essayer ceci : mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; +??????????+???????????+??????????+??????????+ | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | +??????????+???????????+??????????+??????????+ | NULL | NULL | NULL | NULL | +??????????+???????????+??????????+??????????+ Clairement, vous n'obtiendrez aucun résultat valable pour ces comparaisons. Utilisez les opérateurs IS NULL et IS NOT NULL à la place : mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +???????????+???????????????+ | 1 IS NULL | 1 IS NOT NULL | +???????????+???????????????+ | 0 | 1 | +???????????+???????????????+ Notez que deux NULL sont considérés comme égaux lors que vous utilisez la clause GROUP BY . Avec MySQL, 0 et NULL représentent le booléen faux, et tout le reste représente le booléen vrai. La valeur par défaut du booléen vrai issue d'une comparaison est 1. Lorsque vous utilisez la clause ORDER BY , les valeurs NULL sont toujours triées en premier, même si vous utilisez l'attribut DESC . Ce traitement particulier de NULL explique pourquoi, dans la section précédente, il était nécessaire de déterminer quel animal ne vivait plus en utilisant la fonction mort IS NOT NULL au lieu de mort <> NULL . 3.3.4.7 Recherche de modèles MySQL fournit le standard SQL des recherches de modèles, basé sur une extension des expressions régulières similaires à celles utilisées par les utilitaires Unix comme vi , grep , et sed . La recherche de modèles SQL vous permet d'utiliser le caractère '_' pour trouver n'importe quel caractère et le caractère '%' pour trouver un nombre arbitraire de caractères (y compris aucun caractère). Dans MySQL, la recherche de modèles est sensible à la casse par défaut. Quelques exemples vous sont présentés ici. Notez que vous n'utilisez ni = ni <> lorsque vous utilisez la recherche de modèles SQL ; utilisez les opérateurs de comparaison LIKE ou NOT LIKE à la place. Pour trouver les noms commençant par la lettre 'b' : mysql> SELECT * FROM animaux WHERE nom LIKE "b%"; +????????+????????+????????+??????+????????????+????????????+ | nom | maitre | espece | sexe | naissance | mort | +????????+????????+????????+??????+????????????+????????????+ | Buffy | Harold | chien | f | 1989?05?13 | NULL | | Bowser | Diane | chien | m | 1989?08?31 | 1995?07?29 | 3.3.4.6 Travailler avec la valeur NULL 147 Manuel MySQL 4.1.x ? Version Française +????????+????????+????????+??????+????????????+????????????+ Pour trouver les noms finissant par 'fy' : mysql> SELECT * FROM animaux WHERE nom LIKE "%fy"; +????????+????????+?????????+??????+????????????+???????+ | nom | maitre | espece | sexe | naissance | mort | +????????+????????+?????????+??????+????????????+???????+ | Fluffy | Harold | chat | f | 1993?02?04 | NULL | | Buffy | Harold | chien | f | 1989?05?13 | NULL | +????????+????????+?????????+??????+????????????+???????+ Pour trouver les noms contenant le caractères 'w' : mysql> SELECT * FROM animaux WHERE nom LIKE "%w%"; +??????????+????????+?????????+??????+????????????+????????????+ | nom | maitre | espece | sexe | naissance | mort | +??????????+????????+?????????+??????+????????????+????????????+ | Claws | Gwen | chat | m | 1994?03?17 | NULL | | Bowser | Diane | chien | m | 1989?08?31 | 1995?07?29 | | Whistler | Gwen | oiseaux | NULL | 1997?12?09 | NULL | +??????????+????????+?????????+??????+????????????+????????????+ Pour trouver les noms contenant exactement 5 caractères, utilisez le caractère de recherche '_' : mysql> SELECT * FROM animaux WHERE nom LIKE "_____"; +???????+????????+????????+??????+????????????+??????+ | nom | maitre | espece | sexe | naissance | mort | +???????+????????+????????+??????+????????????+??????+ | Claws | Gwen | chat | m | 1994?03?17 | NULL | | Buffy | Harold | chien | f | 1989?05?13 | NULL | +???????+????????+????????+??????+????????????+??????+ L'autre type de recherche de modèles fourni par MySQL utilise les expressions régulières étendues. Lorsque vous testez une recherche avec ce type de modèle, utilisez les opérateurs REGEXP et NOT REGEXP (ou RLIKE et NOT RLIKE qui sont des synonymes). Quelques caractéristiques des expressions régulières étendues sont : Le caractère • '.' trouve n'importe quel caractère. Une classe de caractères • '[...]' trouve n'importe quel caractère contenu entre les crochets. Par exemple, la classe de caractères '[abc]' trouve le caractère 'a' , 'b' , ou 'c' . Pour définir un intervalle de caractères, utilisez un trait d'union. La classe de caractères '[a?z]' trouvera n'importe quel caractère minuscule, tout comme la classe '[0?9]' trouvera n'importe quel nombre. Le caractère • '*' trouvera aucune ou plus d'instances du caractère qui le précède. Par exemple, 'x*' trouvera n'importe quel nombre de fois le caractère 'x' , '[0?9]*' trouvera n'importe quel nombre, et '.*' trouvera n'importe quel nombre de fois n'importe quel caractère. Le modèle est trouvé s'il se produit n'importe où dans la valeur testée. (Les modèles SQL ne • sont trouvés que s'ils sont présents en valeur entière.) Pour ancrer un modèle de sorte qu'il soit trouvé au début ou à la fin de valeur testée, utilisez • '^' au début ou bien '$' à la fin du modèle. Pour démontrer comment les expressions régulières fonctionnent, les requêtes LIKE vues précédemment ont été réécrites pour utiliser REGEXP . Pour trouver les noms qui commencent par la lettre 'b' , utilisez '^' pour trouver le début du nom : mysql> SELECT * FROM animaux WHERE nom REGEXP "^b"; +????????+????????+????????+??????+????????????+????????????+ | nom | maitre | espece | sexe | naissance | mort | +????????+????????+????????+??????+????????????+????????????+ | Buffy | Harold | chien | f | 1989?05?13 | NULL | | Bowser | Diane | chien | m | 1989?08?31 | 1995?07?29 | 3.3.4.6 Travailler avec la valeur NULL 148 Manuel MySQL 4.1.x ? Version Française +????????+????????+????????+??????+????????????+????????????+ Avant la version 3.23.4 de MySQL, REGEXP était sensible à la casse, et la requête précédente ne retournait aucune ligne. Pour trouver la lettre 'b' minuscule ou majuscule, utilisez cette requête à la place : mysql> SELECT * FROM animaux WHERE nom REGEXP "^[bB]"; Depuis MySQL 3.23.4, pour forcer REGEXP à être sensible à la casse, utilisez le mot?clé BINARY pour faire de la chaîne, une chaîne binaire. Cette requête trouvera uniquement la lettre minuscule 'b' au début du nom : mysql> SELECT * FROM animaux WHERE nom REGEXP BINARY "^b"; Pour trouver les noms finissant par 'fy' , utilisez '$' pour trouver la fin du nom : mysql> SELECT * FROM animaux WHERE nom REGEXP "fy$"; +?????????+????????+????????+???????+????????????+??????+ | nom | maitre | espece | sexe | naissance | mort | +?????????+????????+????????+???????+????????????+??????+ | Fluffy | Harold | chat | f | 1993?02?04 | NULL | | Buffy | Harold | chien | f | 1989?05?13 | NULL | +?????????+????????+????????+???????+????????????+??????+ Pour trouver les noms contenant la lettre 'w' minuscule ou majuscule, utilisez la requête suivante : mysql> SELECT * FROM animaux WHERE nom REGEXP "w"; +??????????+????????+?????????+??????+????????????+????????????+ | nom | maitre | espece | sexe | naissance | mort | +??????????+????????+?????????+??????+????????????+????????????+ | Claws | Gwen | chat | m | 1994?03?17 | NULL | | Bowser | Diane | chien | m | 1989?08?31 | 1995?07?29 | | Whistler | Gwen | oiseaux | NULL | 1997?12?09 | NULL | +??????????+????????+?????????+??????+????????????+????????????+ Parce qu'une expression régulière est trouvée si le modèle se trouve n'importe où dans la valeur, il n'est pas nécessaire dans la requête précédente de mettre un joker de chaque côté du modèle recherché pour trouver la valeur entière comme cela aurait été le cas en utilisant les modèles de recherche SQL. Pour trouver les noms contenant exactement 5 caractères, utilisez '^' et '$' pour trouver le début et la fin du nom, et 5 instances de '.' au milieu : mysql> SELECT * FROM animaux WHERE nom REGEXP "^.....$"; +???????+????????+????????+??????+????????????+??????+ | nom | maitre | espece | sexe | naissance | mort | +???????+????????+????????+??????+????????????+??????+ | Claws | Gwen | chat | m | 1994?03?17 | NULL | | Buffy | Harold | chien | f | 1989?05?13 | NULL | +???????+????????+????????+??????+????????????+??????+ Vous pouvez aussi écrire la requête suivante en utilisant l'opérateur '{n' } ``répéter? n ?fois'' : mysql> SELECT * FROM animaux WHERE nom REGEXP "^.{5}$"; +???????+????????+????????+??????+????????????+??????+ | nom | maitre | espece | sexe | naissance | mort | +???????+????????+????????+??????+????????????+??????+ | Claws | Gwen | chat | m | 1994?03?17 | NULL | | Buffy | Harold | chien | f | 1989?05?13 | NULL | +???????+????????+????????+??????+????????????+??????+ 3.3.4.8 Compter les lignes Les bases de données sont souvent employées pour répondre à la question : ``Combien de fois un certain type de données se trouve dans la table ?'' Par exemple, vous aimeriez savoir combien d'animaux vous avez, ou bien combien d'animaux chaque propriétaire possède, ou encore savoir 3.3.4.8 Compter les lignes 149 Manuel MySQL 4.1.x ? Version Française différentes choses concernant vos animaux. Savoir combien vous avez d'animaux revient à se poser la question : ``Combien de lignes y a?t?il dans la table animaux ?'' parcequ'il y a un enregistrement par animaux. La fonction COUNT() compte le nombre de résultats non NULL , donc, la requête pour compter les animaux ressemble à ceci : mysql> SELECT COUNT(*) FROM animaux; +??????????+ | COUNT(*) | +??????????+ | 9 | +??????????+ Vous pouvez trouver également les noms des propriétaires des animaux. Vous pouvez utiliser COUNT() si vous voulez trouver combien d'animaux possède chaque propriétaire : mysql> SELECT maitre, COUNT(*) FROM animaux GROUP BY maitre; +????????+??????????+ | maitre | COUNT(*) | +????????+??????????+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +????????+??????????+ Notez l'utilisation de la clause GROUP BY pour grouper tous les enregistrements par propriétaire. Sans cela, vous auriez le message d'erreur suivant : mysql> SELECT maitre, COUNT(maitre) FROM animaux; ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause COUNT() et GROUP BY sont utiles pour caractériser vos données de diverses façons. Les exemples suivants montrent différentes manières pour obtenir des statistiques sur les animaux. Nombre d'animaux par espèce : mysql> SELECT espece, COUNT(*) FROM animaux GROUP BY espece; +?????????+??????????+ | espece | COUNT(*) | +?????????+??????????+ | oiseau | 2 | | chat | 2 | | chien | 3 | | hamster | 1 | | serpent | 1 | +?????????+??????????+ Nombre d'animaux par sexe : mysql> SELECT sexe, COUNT(*) FROM animaux GROUP BY sexe; +??????+??????????+ | sexe | COUNT(*) | +??????+??????????+ | NULL | 1 | | f | 4 | | m | 4 | +??????+??????????+ (Dans ce résultat, NULL indique les sexes inconnus.)Nombre d'animaux par espèce et sexe : mysql> SELECT espece, sexe, COUNT(*) FROM animaux GROUP BY espece, sexe; +?????????+??????+??????????+ 3.3.4.8 Compter les lignes 150 Manuel MySQL 4.1.x ? Version Française | espece | sexe | COUNT(*) | +?????????+??????+??????????+ | oiseau | NULL | 1 | | oiseau | f | 1 | | chat | f | 1 | | chat | m | 1 | | chien | f | 1 | | chien | m | 2 | | hamster | f | 1 | | serpent | m | 1 | +?????????+??????+??????????+ Vous n'avez pas besoin de rechercher une table entière quand vous employez COUNT() . Par exemple, la requête précédente, si vous voulez trouver uniquement les chiens et les chats, ressemble à cela : mysql> SELECT espece, sexe, COUNT(*) FROM animaux ?> WHERE espece = "chien" OR espece = "chat" ?> GROUP BY espece, sexe; +?????????+??????+??????????+ | espece | sexe | COUNT(*) | +?????????+??????+??????????+ | chat | f | 1 | | chat | m | 1 | | chien | f | 1 | | chien | m | 2 | +?????????+??????+??????????+ Ou bien, si vous voulez trouver le nombre d'animaux par sexe, uniquement pour les animaux dont le sexe est connu : mysql> SELECT espece, sexe, COUNT(*) FROM animaux ?> WHERE sexe IS NOT NULL ?> GROUP BY espece, sexe; +?????????+??????+??????????+ | espece | sexe | COUNT(*) | +?????????+??????+??????????+ | oiseau | f | 1 | | chat | f | 1 | | chat | m | 1 | | chien | f | 1 | | chien | m | 2 | | hamster | f | 1 | | serpent | m | 1 | +?????????+??????+??????????+ 3.3.4.9 Utiliser plus d'une table La table animal garde les enregistrements de vos animaux. Si vous voulez enregistrer d'autres informations concernant vos animaux, comme les événements de leurs vies, les visites chez le vétérinaire, ou encore lorsqu'ils ont mis bas, vous avez besoin d'une autre table. De quoi a besoin cette table ? Elle doit : Contenir le nom de l'animal pour savoir à quel animal cet événement se rattache. • Une date pour savoir quand a eu lieu l'événement. • Un champ qui décrit l'événement. • Un champ de type événement, si vous voulez être capable de cataloguer les événements. • En prenant cela en considération, le code CREATE TABLE pour la table evenement doit ressembler à ceci : mysql> CREATE TABLE evenement (nom VARCHAR(20), date DATE, ?> type VARCHAR(15), remarque VARCHAR(255)); Tout comme la table animal , il est facile d'enregistrer les enregistrements initiaux en créant un fichier texte délimité par des tabulations, contenant l'information : 3.3.4.9 Utiliser plus d'une table 151 Manuel MySQL 4.1.x ? Version Française nom date type remarque Fluffy 1995?05?15 mise bas 4 chattons, 3 femelles, 1 mâles Buffy 1993?06?23 mise bas 5 chiots, 2 femelles, 3 mâles Buffy 1994?06?19 mise bas 3 chiots, 3 femelles Chirpy 1999?03?21 vétérinaire needed beak straightened Slim 1997?08?03 vétérinaire broken rib Bowser 1991?10?12 chenil Fang 1991?10?12 chenil Fang 1998?08?28 anniversaire Don d'un nouvel objet de mastication Claws 1998?03?17 anniversaire Don d'un nouveau collier anti?puces Whistler 1998?12?09 anniversaire Premier anniversaire Chargez ces enregistrements comme cela : mysql> LOAD DATA LOCAL INFILE "" INTO TABLE evenement; En se basant sur ce que vous avez appris des requêtes effectuées sur la table animal , vous devriez être capable de faire des recherches sur les enregistrements de la table evenement ; le principe est le même. Quand devez?vous vous demander si la table evenement est seule suffisante pour répondre à votre question ? Supposez que vous voulez trouver l'âge de chaque animal lorsqu'il a mis bas. La table evenement indique quand cela s'est produit, mais pour le calcul de l'âge de la mère, vous avez besoin de sa date de naissance. Parce que ces informations sont stockées dans la table animal , vous avez besoin des deux tables pour cette requête : mysql> SELECT , ?> (TO_DAYS(date) ? TO_DAYS(naissance))/365 AS age, ?> remarque ?> FROM animal, evenement ?> WHERE = AND type = "mise bas"; +????????+??????+????????????????????????????????+ | nom | age | remarque | +????????+??????+????????????????????????????????+ | Fluffy | 2.27 | 4 chattons, 3 femelles, 1 mâle | | Buffy | 4.12 | 5 chiots, 2 femelles, 3 mâles | | Buffy | 5.10 | 3 chiots, 3 femelles | +????????+??????+????????????????????????????????+ Il y a plusieurs choses à noter concernant cette requête : La clause • FROM liste les deux tables parce que la requête a besoin d'informations contenues dans ces deux tables. Lorsque vous combinez (joignez) des informations provenant de plusieurs tables, vous • devez spécifier quels enregistrements d'une table peuvent être associés à quels enregistrements des autres tables. C'est aisé parce qu'elles ont toutes les deux une colonne nom . La requête utilise la clause WHERE pour faire correspondre les enregistrements des deux tables sur les valeurs de la colonne nom . Parce que la colonne • nom apparaît dans les deux tables, vous devez être explicite concernant la table que vous utilisez lorsque vous vous référez à cette colonne. C'est fait en faisant précéder le nom de la colonne par le nom de la table. Vous n'avez pas besoin de deux tables différentes pour effectuer une jointure. Quelques fois, c'est plus facile de joindre une table sur elle?même, si vous voulez comparer des enregistrements dans une table avec d'autres enregistrements de la même table. Par exemple, pour trouver des paires 3.3.4.9 Utiliser plus d'une table 152 Manuel MySQL 4.1.x ? Version Française multiples parmi vos animaux, vous pouvez joindre la table animal sur elle?même pour trouver les paires mâles / femelles par rapport à l'espèce : mysql> SELECT , , , , p1.espece ?> FROM animal AS p1, animal AS p2 ?> WHERE p1.espece = p2.espece AND = "f" AND = "m"; +????????+??????+????????+??????+?????????+ | nom | sexe | nom | sexe | espece | +????????+??????+????????+??????+?????????+ | Fluffy | f | Claws | m | chat | | Buffy | f | Fang | m | chien | | Buffy | f | Bowser | m | chien | +????????+??????+????????+??????+?????????+ Dans cette requête, nous avons spécifié des alias pour les noms de tables dans l'ordre de référence des colonnes et ainsi maintenir directement à quelle instance de la table chaque colonne est associée. 3.4 Obtenir des informations à propos des bases de données et des tables Que faire si vous oubliez le nom d'une base de données ou d'une table, ou bien encore la structure d'une table donnée (par exemple, comment se nomment ses colonnes) ? MySQL répond à ce problème en fournissant plusieurs commandes qui renvoient des informations à propos des tables et des bases de données les contenant. Vous avez déjà vu SHOW DATABASES qui liste les bases de données gérées par le serveur. Pour trouver quelle base de données est actuellement sélectionnée, utilisez la fonction DATABASE() : mysql> SELECT DATABASE(); +????????????+ | DATABASE() | +????????????+ | menagerie | +????????????+ Si vous n'avez encore sélectionné aucune base de données, le résultat est vide. Pour trouver quelles sont les tables que la base contient (par exemple, quand vous n'êtes pas sûr du nom d'une table), utilisez cette commande : mysql> SHOW TABLES; +?????????????????????+ | Tables in menagerie | +?????????????????????+ | evenement | | animal | +?????????????????????+ Si vous voulez en savoir d'avantage sur la structure d'une table, la commande DESCRIBE est utile ; elle fournit des informations sur chaque colonne de la table : mysql> DESCRIBE animal; +???????????+?????????????+??????+?????+?????????+???????+ | Field | Type | Null | Key | Default | Extra | +???????????+?????????????+??????+?????+?????????+???????+ | nom | varchar(20) | YES | | NULL | | 3.4 Obtenir des informations à propos des bases de données et des tables 153 Manuel MySQL 4.1.x ? Version Française | maitre | varchar(20) | YES | | NULL | | | espece | varchar(20) | YES | | NULL | | | sexe | char(1) | YES | | NULL | | | naissance | date | YES | | NULL | | | mort | date | YES | | NULL | | +???????????+?????????????+??????+?????+?????????+???????+ Field indique le nom de la colonne, Type est son type de données, NULL indique si la colonne peut contenir des valeurs NULL , Key indique si la colonne est indexée et Default spécifie la valeur par défaut de la vous avez des index sur une table, SHOW INDEX FROM nom_de_table vous fournira des informations sur elles. 3.5 Exemples de requêtes usuelles Voilà des exemples qui vous serviront à résoudre les problèmes communs avec MySQL. Certains exemples utilisent la table shop pour sauvegarder le prix de chaque article (numéro de l'élément) pour certains vendeurs (dealers). En supposant que chaque vendeur à un prix fixe pour chaque article, le couple ( article , dealer ) est une clef primaire pour les enregistrements. Démarrez le client en ligne de commande mysql et sélectionnez une base de données : mysql nom?base?données (Dans la plupart des installations de MySQL, vous pouvez utiliser la base de données 'test'). Vous pouvez créer la table d'exemple de la façon suivante : CREATE TABLE shop ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, dealer CHAR(20) DEFAULT '' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00' NOT NULL, PRIMARY KEY(article, dealer)); INSERT INTO shop VALUES (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69), (3,'D',1.25),(4,'D',19.95); Ok, les données d'exemple sont : mysql> SELECT * FROM shop; +?????????+????????+???????+ | article | dealer | price | +?????????+????????+???????+ | 0001 | A | 3.45 | | 0001 | B | 3.99 | | 0002 | A | 10.99 | | 0003 | B | 1.45 | | 0003 | C | 1.69 | | 0003 | D | 1.25 | | 0004 | D | 19.95 | +?????????+????????+???????+ 3.5.1 La valeur maximale d'une colonne ``Quel est le numéro du plus grand élément ?'' 3.5 Exemples de requêtes usuelles 154 Manuel MySQL 4.1.x ? Version Française SELECT MAX(article) AS article FROM shop +?????????+ | article | +?????????+ | 4 | +?????????+ 3.5.2 La ligne contenant le maximum d'une certaine colonne ``Trouvez le numéro, vendeur et prix de l'article le plus cher.'' En ANSI SQL cela est facilement fait avec une sous?requête : SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop) En MySQL (qui ne gère pas encore les sous?requêtes), vous devez le faire en deux temps : Obtenir le plus grand prix de la table avec une requête • SELECT . Utiliser cette valeur avec cette requête : • SELECT article, dealer, price FROM shop WHERE price=19.95 Une autre solution est de trier toutes les lignes en ordre décroissant des prix et ne choisir que la première ligne avec la clause LIMIT qui est spécifique à MySQL : SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1 NOTE : s'il y'a beaucoup d'articles chers (par exemple, chaque 19.95) la solution avec LIMIT n'en montre qu'un !. 3.5.3 Maximum d'une colonne par groupe ``Quel est le plus grand prix par article ?'' SELECT article, MAX(price) AS price FROM shop GROUP BY article +?????????+???????+ | article | price | +?????????+???????+ | 0001 | 3.99 | | 0002 | 10.99 | | 0003 | 1.69 | | 0004 | 19.95 | +?????????+???????+ 3.5.2 La ligne contenant le maximum d'une certaine colonne 155 Manuel MySQL 4.1.x ? Version Française 3.5.4 La ligne contenant la plus grande valeur d'un certain champ par rapport à un groupe ``Pour chaque article, trouvez le ou les vendeurs avec le plus haut prix.'' En ANSI SQL, je l'aurais fait de cette façon avec une sous?requête : SELECT article, dealer, price FROM shop s1 WHERE price=(SELECT MAX(s2.price) FROM shop s2 WHERE s1.article = s2.article); En MySQL il vaut mieux le faire en plusieurs étapes : Récupérer la liste de (article, plusgrandprix). • Pour chaque article, récupérer la ligne qui a le plus grand prix stocké. • Cela se fait facilement avec une table temporaire : CREATE TEMPORARY TABLE tmp ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00' NOT NULL); LOCK TABLES shop read; INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article; SELECT shop.article, dealer, shop.price FROM shop, tmp WHERE shop.article=tmp.article AND shop.price=tmp.price; UNLOCK TABLES; DROP TABLE tmp; Si vous n'utilisez pas une table TEMPORARY , vous devez aussi verrouiller celle?ci.``Peut?on le faire avec une seule requête ?'' Oui, mais en utilisant une astuce inefficace que j'appelle ``astuce du MAX?CONCAT'': SELECT article, SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer, 0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price FROM shop GROUP BY article; +?????????+????????+???????+ | article | dealer | price | +?????????+????????+???????+ | 0001 | B | 3.99 | | 0002 | A | 10.99 | | 0003 | C | 1.69 | | 0004 | D | 19.95 | +?????????+????????+???????+ Le dernier exemple peut, bien sûr, être amélioré en découpant les colonnes concaténées dans le client. 3.5.4 La ligne contenant la plus grande valeur d'un certain champ par rapport à un groupe 156 Manuel MySQL 4.1.x ? Version Française 3.5.5 Utiliser les variables utilisateur Vous pouvez utiliser les variables utilisateur de MySQL pour garder des résultats en mémoire sans avoir à les enregistrer dans des variables temporaires du client. Variables définies par l'utilisateur . Par exemple, pour trouver l'article avec le plus haut et le plus bas prix, vous pouvez faire : mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop; mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price; +?????????+????????+???????+ | article | dealer | price | +?????????+????????+???????+ | 0003 | D | 1.25 | | 0004 | D | 19.95 | +?????????+????????+???????+ 3.5.6 Utiliser les clefs étrangères Depuis la version 3.23.44 de MySQL, les tables InnoDB supportent les contraintes des clefs étrangères. Tables InnoDB . Consultez aussi Clés étrangères . Actuellement, vous n'avez pas besoin de clefs étrangères pour réaliser des jointures entre les tables. La seule chose que MySQL ne fait pas encore (avec les types autres que InnoDB ), est CHECK pour s'assurer que que la clef que vous utilisez existe bien dans la ou les tables que vous référencez et il n'efface pas automatiquement les lignes d'une table avec une définition de clef étrangère. Si vous utilisez vos clefs comme une clef normale, tout marchera parfaitement : CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(60) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE shirt ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM('t?shirt', 'polo', 'dress') NOT NULL, color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id), PRIMARY KEY (id) ); INSERT INTO person VALUES (NULL, 'Antonio Paz'); INSERT INTO shirt VALUES (NULL, 'polo', 'blue', LAST_INSERT_ID()), (NULL, 'dress', 'white', LAST_INSERT_ID()), (NULL, 't?shirt', 'blue', LAST_INSERT_ID()); <P> INSERT INTO person VALUES (NULL, 'Lilliana Angelovska'); INSERT INTO shirt VALUES (NULL, 'dress', 'orange', LAST_INSERT_ID()), (NULL, 'polo', 'red', LAST_INSERT_ID()), (NULL, 'dress', 'blue', LAST_INSERT_ID()), (NULL, 't?shirt', 'white', LAST_INSERT_ID()); </P> SELECT * FROM person; 3.5.5 Utiliser les variables utilisateur 157 Manuel MySQL 4.1.x ? Version Française +????+?????????????????????+ | id | name | +????+?????????????????????+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +????+?????????????????????+ SELECT * FROM shirt; +????+?????????+????????+???????+ | id | style | color | owner | +????+?????????+????????+???????+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t?shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | | 7 | t?shirt | white | 2 | +????+?????????+????????+???????+ SELECT s.* FROM person p, shirt s WHERE p.name LIKE 'Lilliana%' AND s.owner = p.id AND s.color <> 'white'; +????+???????+????????+???????+ | id | style | color | owner | +????+???????+????????+???????+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +????+???????+????????+???????+ 3.5.7 Recherche sur deux clefs MySQL n'optimise pas encore quand vous effectuez des recherches sur deux clefs différentes combinées avec OR (la recherche sur une clef avec différentes parties OR est elle pas mal optimisée) : SELECT champ1_index, champ2_index FROM test_table WHERE champ1_index = '1' OR champ2_index = '1' La raison est que nous n'avons pas trouvé le temps suffisant pour parvenir à un moyen efficace de gérer cela dans un cas général. (En comparaison, la gestion de AND est maintenant complètement générale et fonctionne très bien.) Pour le moment, vous pouvez résoudre ce problème efficacement en utilisant une table temporaire ( TEMPORARY ). Ce type d'optimisation est très utile si vous utilisez des requêtes très complexes et que le serveur SQL fait une optimisation dans le mauvais ordre. CREATE TEMPORARY TABLE tmp SELECT champ1_index, champ2_index FROM test_table WHERE champ1_index = '1'; INSERT INTO tmp SELECT champ1_index, champ2_index FROM test_table WHERE champ2_index = '1'; SELECT * from tmp; DROP TABLE tmp; La méthode ci?dessus pour résoudre cette requête est en effet une UNION de deux requêtes. Syntaxe de UNION . 3.5.8 Calculer les visites par jour Ce qui suit donne une idée d'une utilisation des fonctions de bits pour calculer le nombre de jours par mois où un utilisateur a visité une page web. 3.5.7 Recherche sur deux clefs 158 Manuel MySQL 4.1.x ? Version Française CREATE TABLE t1 (annee YEAR(4), mois INT(2) UNSIGNED ZEROFILL, jour INT(2) UNSIGNED ZEROFILL); INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2), (2000,2,23),(2000,2,23); SELECT annee,mois,BIT_COUNT(BIT_OR(1<<jour)) AS jours FROM t1 GROUP BY annee,mois; Qui retourne : +???????+???????+???????+ | annee | mois | jours | +???????+???????+???????+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | +???????+???????+???????+ Ce qui précède calcule le nombre de jours différents qui a été utilisé pour une combinaison année/mois, avec suppression automatique des doublons. 3.5.9 Utiliser AUTO_INCREMENT L'attribut AUTO_INCREMENT peut être utilisé pour générer un identifiant unique pour les nouvelles lignes : CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) ); INSERT INTO animals (name) VALUES ("dog"),("cat"),("penguin"), ("lax"),("whale"); SELECT * FROM animals; Qui retourne : +????+?????????+ | id | name | +????+?????????+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | +????+?????????+ Vous pouvez obtenir la valeur utilisée de la clef AUTO_INCREMENT avec la fonction SQL LAST_INSERT_ID() ou la fonction d'API mysql_insert_id() . Note : Pour une insertion multi?lignes, LAST_INSERT_ID() / mysql_insert_id() retourneront la clef AUTO_INCREMENT de la première ligne insérée. Cela permet de reproduire les insertions multi?lignes sur d'autres services. Pour les tables MyISAM et BDB vous pouvez spécifier AUTO_INCREMENT sur une colonne secondaire d'une clef multi?colonnes. Dans ce cas, la valeur générée pour la colonne auto?incrementée est calculée de la façon suivante : MAX(auto_increment_column)+1) WHERE prefix=given?prefix . C'est utile lorsque vous voulez placer des données dans des groupes ordonnés. CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, 3.5.9 Utiliser AUTO_INCREMENT 159 Manuel MySQL 4.1.x ? Version Française name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ); INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"), ("bird","penguin"),("fish","lax"),("mammal","whale"); SELECT * FROM animals ORDER BY grp,id; Qui retourne : +????????+????+?????????+ | grp | id | name | +????????+????+?????????+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | +????????+????+?????????+ Notez que dans ce cas, la valeur d' AUTO_INCREMENT sera réutilisée si vous effacez la ligne avec la plus grande valeur d' AUTO_INCREMENT tous groupes confondus. 3.6 Utilisation de mysql en mode batch Dans les sections précédentes, vous avez utilisé mysql inter activement pour entrer vos requêtes et voir les résultats. Vous pouvez aussi utiliser mysql en mode batch. Pour ce faire, placez les commandes que vous voulez exécuter dans un fichier, puis dites à mysql de lire les entrées à partir de celui?ci : shell> mysql < fichier?batch Si vous utilisez mysql sous windows et que vous avez des caractères spéciaux dans le fichier qui posent problèmes, vous pouvez faire : dos> mysql ?e "source fichier?batch" Si vous devez spécifier les paramètres de connexion en ligne de commande, la commande ressemblera à ca : shell> mysql ?h hôte ?u utilisateur ?p < fichier?batch Enter password: ******** Lorsque vous utilisez mysql de cette façon, vous créez un fichier de script, puis vous l'exé vous voulez que le script continue, même si il y'a des erreurs, vous devez utiliser l'option ??force de la ligne de commande. Pourquoi utilisez un script ? Voici quelques raisons : Si vous utilisez une requête de façon répétitive (c'est à dire, chaque jour, ou chaque • semaine), en faire un script vous évitera de la réécrire chaque fois. Vous pouvez générer de nouvelles requêtes à partir de requêtes existantes et similaires en • copiant et éditant des fichiers de scripts. Ce mode peut aussi être utile lors du développement d'une requête, particulièrement pour • les commandes sur plusieurs lignes ou plusieurs séquences de commandes. Si vous commetez une erreur, vous n'avez pas à tout récrire. Editez juste votre script pour corriger l'erreur et dites à mysql de l'exécuter à nouveau. Si vous avez une requête qui produit beaucoup d'affichage, vous pouvez le rediriger vers un • visionneur plutôt que de le regarder défiler sur votre écran : shell> mysql < fichier?batch | more Vous pouvez capturer l'affichage dans un fichier pour un traitement ultérieur : • shell> mysql < fichier_batch > Vous pouvez distribuer votre script à d'autres personnes pour qu'elles l'exécutent. • 3.6 Utilisation de mysql en mode batch 160 Manuel MySQL 4.1.x ? Version Française Quelques situations ne permettent pas une utilisation interactive, par exemple, quand vous • exécutez une requête à partir d'une tâche cron . Dans ce cas, vous devez utiliser le mode batch. Le format d'affichage par défaut est différent (plus concis) lorsque vous exécutez mysql en mode batch de celui utilisé inter activement. Par exemple, le résultat de SELECT DISTINCT espece FROM animal ressemble à ça inter activement : +?????????+ | espece | +?????????+ | oiseau | | chat | | chien | | hamster | | serpent | +?????????+ Mais à ça en mode batch : espece oiseau chat chien hamster serpent Si vous voulez le format d'affichage interactif en mode batch, utilisez mysql ?t . Pour écrire les commandes exécutez dans la sortie, utilisez mysql ?vvv . Vous pouvez aussi utiliser un script à partir de l'invite mysql en utilisant la commande source : mysql> source nom_fichier; 3.7 Requêtes du projet Twin A Analytikerna et Lentus, nous avons eu à mettre en place le partie système et base de données d'un grand projet de recherche. Ce projet est une collaboration entre l'institut de médecine environnementale de l'institut de Karolinska Stockholm et la section de recherche clinique d'âge et de psychologie à l'université de la Californie du sud. Le projet nécessite une partie de récolte d'informations où tous les jumeaux en Suède de plus de 65 ans sont contactés par téléphone. Ceux qui répondent à certains critères sont admis à la seconde étape. Dans celle?ci, les jumeaux qui veulent participer rencontrent une équipe de médecins/infirmiers. Les examens incluent des examens physiques et neuropsychologiques, des tests en laboratoire, de la neuro?imagerie, des études psychologiques et de la collecte d'informations relatives à la famille. En plus de tout cela, les données à propos des facteurs de risques médicaux et environnementaux sont collectées. Plus d'informations à propos de l'étude Twin peuvent être trouvées sur : La dernière partie de ce projet est administrée avec une interface web écrite en utilisant Perl et MySQL. Chaque nuit, toutes les informations des interviews sont stockées dans une base de données MySQL. 3.7 Requêtes du projet Twin 161 Manuel MySQL 4.1.x ? Version Française 3.7.1 Trouver tous les jumeaux répondant aux critères La requête suivante a été utilisée pour déterminer qui participerait à la seconde partie du projet : SELECT CONCAT(, ) + 0 AS tvid, CONCAT(p1.christian_name, " ", p1.surname) AS Name, p1.postal_code AS Code, AS City, pg.abrev AS Area, IF(td.participation = "Aborted", "A", " ") AS A, AS dead1, l.event AS event1, td.suspect AS tsuspect1, id.suspect AS isuspect1, td.severe AS tsevere1, id.severe AS isevere1, AS dead2, l2.event AS event2, h2.nurse AS nurse2, h2.doctor AS doctor2, td2.suspect AS tsuspect2, id2.suspect AS isuspect2, td2.severe AS tsevere2, id2.severe AS isevere2, l.finish_date FROM twin_project AS tp /* For Twin 1 */ LEFT JOIN twin_data AS td ON = AND = LEFT JOIN informant_data AS id ON = AND = LEFT JOIN harmony AS h ON = h.id AND = h.tvab LEFT JOIN lentus AS l ON = l.id AND = l.tvab /* For Twin 2 */ LEFT JOIN twin_data AS td2 ON = AND = LEFT JOIN informant_data AS id2 ON = AND = LEFT JOIN harmony AS h2 ON = AND = LEFT JOIN lentus AS l2 ON = AND = , person_data AS p1, person_data AS p2, postal_groups AS pg WHERE /* p1 gets main twin and p2 gets his/her twin. */ /* ptvab is a field inverted from tvab */ = AND = AND = AND p2.ptvab = AND /* Just the sceening survey */ tp.survey_no = 5 AND /* Skip if partner died before 65 but allow emigration (dead=9) */ ( = 0 OR = 9 OR ( = 1 AND (p2.death_date = 0 OR (((TO_DAYS(p2.death_date) ? TO_DAYS(p2.birthday)) / 365) >= 65)))) AND ( /* Twin is suspect */ 3.7.1 Trouver tous les jumeaux répondant aux critères 162 Manuel MySQL 4.1.x ? Version Française (td.future_contact = 'Yes' AND td.suspect = 2) OR /* Twin is suspect ? Informant is Blessed */ (td.future_contact = 'Yes' AND td.suspect = 1 AND id.suspect = 1) OR /* No twin ? Informant is Blessed */ (ISNULL(td.suspect) AND id.suspect = 1 AND id.future_contact = 'Yes') OR /* Twin broken off ? Informant is Blessed */ (td.participation = 'Aborted' AND id.suspect = 1 AND id.future_contact = 'Yes') OR /* Twin broken off ? No inform ? Have partner */ (td.participation = 'Aborted' AND ISNULL(id.suspect) AND = 0)) AND l.event = 'Finished' /* Get at area code */ AND SUBSTRING(p1.postal_code, 1, 2) = /* Not already distributed */ AND (h.nurse IS NULL OR h.nurse=00 OR h.doctor=00) /* Has not refused or been aborted */ AND NOT (h.status = 'Refused' OR h.status = 'Aborted' OR h.status = 'Died' OR h.status = 'Other') ORDER BY tvid; Quelques explications : CONCAT(, ) + 0 AS tvid Nous voulons trier la concaténation de id et tvab dans un ordre numérique. Ajouter 0 au résultat force MySQL à le considérer comme un nombre. colonne id Identifie une paire de jumeaux. C'est un clef dans toutes les tables. colonne tvab Identifie un jumeau dans une paire. Valeur 1 ou 2 . colonne ptvab Inverse de tvab . Si tvab est 1 c'est égal à 2 , et vice?versa. Elle existe pour diminuer la frappe et faciliter la tâche à MySQL lors de l'optimisation de la requête. Cette requête montre, entre autres, comment faire pour consulter une table depuis cette même table en utilisant une jointure ( p1 et p2 ). Dans cet exemple, est utilisé pour chercher quel partenaire du projet est décédé avant l'âge de 65 ans. Si c'est le cas, la ligne n'est pas retournée.Tout ce qui précède existe dans toutes les tables avec des informations relatives aux jumeaux. Nous avons une clé sur les champs id,tvab (toutes les tables), et sur les champs id,ptvab ( person_data ) pour accélérer les requêtes. Sur notre machine de production (un 200MHz UltraSPARC), cette requête retourne près de 150?200 lignes et prend moins d'une seconde. Le nombre d'enregistrements dans les tables utilisées plus haut : Table Lignes person_data 71074 lentus 5291 twin_project 5286 twin_data 2012 informant_data 663 harmony 381 3.7.1 Trouver tous les jumeaux répondant aux critères 163 Manuel MySQL 4.1.x ? Version Française postal_groups 100 3.7.2 Afficher une table avec l'état des paires de jumeaux Chaque entrevue se finit avec un code d'état, appelé event . La requête ci?dessous montre comment afficher une table avec toutes les paires, rassemblées par code d'état. Elle indique combien de paires ont terminé, combien de paires ont à moitié terminé et combien on refusé, etc. SELECT t1.event, t2.event, COUNT(*) FROM lentus AS t1, lentus AS t2, twin_project AS tp WHERE /* We are looking at one pair at a time */ = AND AND = /* Just the sceening survey */ AND tp.survey_no = 5 /* This makes each pair only appear once */ AND ='1' AND ='2' GROUP BY t1.event, t2.event; 3.8 Utilisation de MySQL avec Apache Il existe des programmes vous permettant d'identifier vos utilisateurs à l'aide d'une base MySQL et qui vous permettent aussi de créer des journaux de log dans vos table MySQL. Portails MySQL . Vous pouvez changer le format d'archivage d'Apache pour le rendre plus facilement lisible par MySQL en mettant ce qui suit dans le fichier de configuration d'Apache : LogFormat \ "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content?Type}o\", \ \"%U\",\"%{Referer}i\",\"%{User?Agent}i\"" Avec MySQL, vous pouvez exécuter une requête de la sorte : LOAD DATA INFILE '/local/access_log' INTO TABLE table_name FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' 3.7.2 Afficher une table avec l'état des paires de jumeaux 164 4 Administration du serveur 4.1 Configuration de MySQL 4.1.1 Options de ligne de commande de mysqld Dans la plupart des cas, vous devrez modifier les options de mysqld dans le fichier d'options. Fichier d'options . mysqld et mysqld.server lisent les options des groupes mysqld et server . mysqld_safe lit les options des groupes mysqld , server , mysqld_safe et safe_mysqld . Un serveur MySQL intégré lit généralement les options dans les groupes server , embedded et xxxxx_SERVER , où xxxxx est le nom de l'application. mysqld accepte les options de ligne de commande suivantes : ??ansi ANSI . ?b, ??basedir=path Chemin jusqu'au dossier d'installation. Tous les chemins sont généralement relatifs à celui?ci. ??big?tables Autorise la sauvegarde de grands résultats dans des fichiers temporaires. Cela résout le problème des erreurs 'table full', mais ralentit les requêtes alors que des tables en mémoire suffirait. Depuis la version version 3.23.2, MySQL est capable de résoudre automatiquement ce problème en utilisant de la mémoire pour toutes les tables temporaires de petite taille, et en passant sur le disque au besoin. ??bind?address=IP L'adresse IP à utiliser. ??character?sets?dir=path données et le stockage . ??chroot=path Met le démon mysqld en environnement chroot au démarrage. Recommandé pour la sécurité. Cela limite les commandes LOAD DATA INFILE et SELECT ... INTO OUTFILE . ??core?file Ecrire le fichier core lorsque mysqld s'arrête inopinéement. Pour certains fichiers, vous devez aussi spécifier ??core?file?size à safe_mysqldn'aurez pas de fichier de core si vous avez aussi utilisé l'option ??user . ?h, ??datadir=path Chemin jusqu'au dossier des bases. ??debug[...]= Si MySQL est configuré avec ??with?debug , vous pouvez utiliser cette option pour obtenir un fichier de trace de ce que mysqld fait. Créer des fichiers de traçage . ??default?character?set=charset données et le stockage . ??default?table?type=type 4 Administration du serveur 165 Manuel MySQL 4.1.x ? Version Française Spécifie le type de table par défaut. Types de tables MySQL . ??delay?key?write[= OFF | ON | ALL] Comment l'option des tables MyISAM DELAYED KEYSparamètres du serveur . ??delay?key?write?for?all?tables; En MySQL 4.0.3 vous devez utiliser ??delay?key?write=ALL à la place. Ne vide pas les buffers de clés entre deux écritures pour les tables MyISAMdes paramètres du serveur . ??des?key?file=filename Lit les clés par défaut utilisées par DES_ENCRYPT() et DES_DECRYPT() dans ce fichier. ??enable?external?locking (was ??enable?locking) Active le verrouillage système. Notez que si vous utilisez cette option sur un système pour qui lockd ne fonctionne pas (comme Linux), vous allez bloquer rapidement mysqld avec les verrous. ??enable?named?pipe Active le support des tunnels nommés (seulement sur NT/Win2000/XP). ?T, ??exit?info Cette option est la combinaison d'options que vous pouvez utiliser pour le débogage du serveur mysqld; Si vous ne savez pas ce que ca fait exactement, ne les utilisez pas ! ??flush Ecrit toutes les données sur le disque après chaque requête SQL. Normalement, MySQL fait des écritures sur le disque après chaque requête, et laisse le système constamment . ??, ??help Affiche l'aide courte et termine le programme. ??init?file=file Lit les commandes SQL dans ce fichier au démarrage. ?L, ??language=... Spécifie la langue utilisée pour les messages d'erreur du client. Le chemin complet doit être utilisé. Messages d'erreurs non?anglophones . ?l, ??log[=file] . ??log?isam[=file] Enregistre toutes les modifications des tables ISAM/MyISAM dans ce fichier (uniquement nécessaire pour déboguer ISAM/MyISAM). ??log?slow?queries[=file] Enregistre toutes les requêtes qui ont pris plus de long_query_time secondes a s'exécute, dans ce fichier. Le log des requêtes lentes . ??log?update[=file] Enregistre les modifications dans le fichier file.# où # est un nombre unique si il n'est pas précisé. Le log des mises à jour . ??log?long?format Enregistre des informations supplémentaires dans le fichier d'historique. Si vous utilisez l'option ??log?slow?queries , alors les requêtes que vous qui n'utilisent pas les index sont enregistrées dans le log de requêtes longues. ??low?priority?updates Les opérations de modifications de table ( INSERT / DELETE / UPDATE ) auront une priorité inférieure aux sélections. Cela peut être aussi fait via l'attribut {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... pour baisser la priorité d'une requête, ou avec SET LOW_PRIORITY_UPDATES=1 pour changer la priorité 4 Administration du serveur 166 Manuel MySQL 4.1.x ? Version Française dans plus d'un thread. Problèmes avec le verrouillage de tables . ??memlock Verrouille le processus mysqld en mémoire. Cela fonctionne si votre système support la fonction mlockall() (comme Solaris). Ceci peut être utile si vous avez des problèmes avec le système d'exploitation qui force mysqld a utiliser le swap sur le disque. ??myisam?recover [=option[,option...]]] Cette option est la combinaison de DEFAULT , BACKUP , FORCE et QUICK . Vous pouvez aussi lui donner la valeur explicite de "" si vous voulez désactiver cette option. Si cette option est utilisée, mysqld va vérifier si la table est marquée comme corrompue à l'ouverture de chaque table (cette dernière option ne fonctionne que si vous utilisez l'option ??skip?external?locking ). Si c'est le cas, mysqld va essayer de vérifier la table. Si la table était corrompue, mysqld essaie alors de la réparer. L'option suivante va affecter la manière avec la quelle la réparation s'effectue. Option Description DEFAULT Identique à ne pas donner d'option à ??myisam?recover . Si la table a été modifiée durant la réparation, sauver une copie du BACKUP fichier , sous le nom de table_name? . Exécute une réparation même si nous allons perdre une ou plusieurs FORCE lignes dans le fichier .MYD. QUICK Ne vérifie pas les lignes dans la table si il n'y a pas eu d'effacement. Avant que la table ne soit automatiquement réparée, MySQL va ajouter une note dans le fichier de log d'erreurs. Si vous voulez être capable de restaurer la plupart des erreurs sans intervention de l'utilisateur, il vaut utiliser les options BACKUP,FORCE . Cela va forcer la réparation de la table, même si quelques lignes sont effacées, et conserve le vieux fichier de données comme sauvegarde, pour examen ultérieur. ??pid?file=path Le chemin jusqu'au fichier de pid utilisé par safe_mysqld . ?P, ??port=... Numéro de port utilisé pour attendre les connexion TCP/IP. ?o, ??old?protocol version 3.20 à la version 3.21 . ??one?thread MySQL . ?O, ??set?variable var=option Donne une valeur à une variable. ??help liste ces variables. Vous pouvez trouver une description complète des variables dans la section sur la commande SHOW VARIABLES de ce manuel. SHOW VARIABLES . La section de paramétrage inclut des informations sur comment exploiter ces variables. Notez que ??set?variable est obsolète depuis MySQL 4.0, utilisez simplement la syntaxe ??var=option . Choix des paramètres du serveur . En MySQL 4.0.2, il est possible de changer une variable directement avec la syntaxe ??variable?name=option et set?variable n'est plus nécessaire dans le fichier de configuration. 4 Administration du serveur 167 Manuel MySQL 4.1.x ? Version Française Si vous voulez restreindre la valeur maximale que peut prendre une option via la commande SET , vous pouvez définir une limite en utilisant l'option de ligne de commande ??maximum?variable?name . Syntaxe de SET . Notez que lorsque vous donnez une valeur à une variable, MySQL peut corriger automatiquement votre valeur pour rester dans un intervalle donné, et ajuster un peu la valeur pour qu'elle soit optimale. ??safe?mode Ignore certains étapes d'optimisation. ??safe?show?database Avec cette option, la commande SHOW DATABASES retourne uniquemnt les bases pour lesquelles l'utilisateur a des droits. Depuis la version 4.0.2, cette option est abandonnée, et ne fait plus rien (l'option est activée par défaut) car nous avons désormais le droit de SHOW DATABASES . Syntaxe de GRANT et REVOKE . ??safe?user?create Si cette option est activée, un utilisateur ne peut pas créer de nouveaux utilisateurs avec la commande GRANT si l'utilisateur n'a pas les droits de INSERT dans la table ou dans aucune colonne de cette table. ??skip?bdb Désactive l'utilisation des tables BDB. Cela va économiser de la mémoire et accélérer le serveur un peu. ??skip?concurrent?insert Désactive la possibilité de sélectionner et insérer en même temps dans les tables MyISAM (cela n'est utile que si vous pensez que vous avez trouvé un bug dans cette fonctionnalité). ??skip?delay?key?write; En MySQL 4.0.3, il est recommandé d'utiliser l'option ??delay?key?write=OFF à la place. Ignorez l'option DELAY_KEY_WRITE de toutes les tables. Choix des paramètres du serveur . ??skip?grant?tables Cette option force le serveur à ne pas utiliser le système de privilège du tout. Cela donne à tous l' accès complet à toutes les bases de données ! Vous pouvez demander à un serveur en exécution d'utiliser à nouveau les tables de droits en exécutant la commande mysqladmin flush?privileges ou mysqladmin reload ). ??skip?host?cache Ne pas utiliser le cache de nom de domaine pour une résolution des IP plus rapide, DNS . ??skip?innodb Désactive l'utilisation des tables Innodb. Cela va économiser de la mémoire et accélérer le serveur un peu. ??skip?external?locking (ancien ??skip?locking) Ne pas utiliser le verrouillage du système. Pour utiliser les utilitaires isamchk ou myisamchkNotez qu'en MySQL version 3.23 vous pouvez utiliser la commande REPAIR et CHECK pour réparer ou vérifier des tables MyISAM tables. ??skip?name?resolve Les noms d'hôtes ne sont pas résolus. Toutes les colonnes Host dans vos tables de droits doivent être des IP numériques ou le mot localhostutilise les DNS . ??skip?networking Ne pas attendre les connexions TCP/IP du tout. Toutes les interactions du serveur mysqld seront faites avec les sockets Unix. Cette option est particulièrement recommandée pour les systèmes qui utilisent des requêtes locales. Comment 4 Administration du serveur 168 Manuel MySQL 4.1.x ? Version Française MySQL utilise les DNS . ??skip?new Ne pas utiliser les nouvelles routines qui sont possiblement erronées. ??skip?symlink Ne pas effacer ou renommer les fichiers qui ont un lien symbolique dans le dossier de données. ??skip?safemalloc Si MySQL est configuré avec ??with?debug=full , tous les programmes vérifieront la mémoire pour rechercher les écrasment de zone lors des allocations et libérations de mémoire. Comme ce test est lent, vous pouvez l'éviter, si vous n'avez pas besoin de tester la mémoire, en utilisant cette option. ??skip?show?database Ne pas autoriser la commande SHOW DATABASES , a moins que l'utilisateur n'ait les droits de SHOW DATABASES . Depuis la version 4.0.2, vous n'avez plus besoin de cette option, car les droits pour ce faire sont distribués avec le droit de SHOW DATABASES . ??skip?stack?trace Ne pas écrire les piles de traces. Cette option est pratique lorsque vous utilisez mysqld avec un débogueur. Sur certains systèmes, vous devez aussi utiliser cette option pour obtenir un fichier de core. Déboguer un serveur MySQL . ??skip?thread?priority Désactive la priorisation des threads pour améliorer la vitesse de réponse. ??socket=path Le fichier de socket à utiliser pour les connexions locales, au lieu du fichier par défaut . ??sql?mode=option[,option[,option...]] Cette option peut être la combinaison de : REAL_AS_FLOAT , PIPES_AS_CONCAT , ANSI_QUOTES , IGNORE_SPACE , SERIALIZE et ONLY_FULL_GROUP_BY . Ellep peut aussi être vide ( "" ) si vous voulez remettre cette option à 0.En spécifiant toutes les options ci?dessus, vous obtiendrez le même effet qu'avec l'option ??ansi. Avec cette option, vous pouvez activer les modes SQL dont vous avez besoin. Exécuter MySQL en mode ANSI . ??temp?pool En utilisant cette option, vous allez réduire le jeu de noms qui sont utilisés lors de la création de fichier temporaires, plutôt qu'un nom unique à chaque fois. Ceci est un palliatif au noyau Linux qui crèe plusieurs fichiers nouveaux avec des noms différents. Avec l'ancien comportement, Linux semble 'perdre de la mémoire', car ils sont alloués au cache d'entrées du dossier au lieu de celui du disque. ??transaction?isolation= { READ?UNCOMMITTED | READ?COMMITTED | REPEATABLE?READ | SERIALIZABLE } Configure le niveau d'isolation des transactions. Syntaxe de SET TRANSACTION . ?t, ??tmpdir=path Chemin vers les fichiers temporaires. Il peut s'avérer pratique si votre dossier par défaut /tmp réside dans une partition qui est trop petite pour absorber les tables temporaires. ?u, ??user= [user_name | userid] Exécute le démon mysqld avec l'utilisateur user_name ou userid (numérique). Cette option est obligatoire lorsque vous démarrez mysqld en tant que root. ?V, ??version Affiche les informations de version. ?W, ??log?warnings (Was ??warnings) Enregistre les alertes comme Aborted connection... dans le fichier .err . Erreurs de communication / connexion annulée . 4 Administration du serveur 169 Manuel MySQL 4.1.x ? Version Française Il est possible de modifier la plupart des valeurs durant l'exécution, avec la commande SET command. Syntaxe de SET . 4.1.2 Fichier d'options MySQL peu, depuis la version 3.22, lire des options de démarrage par défaut pour le serveur en ligne de commande, et, par le client, dans un fichier. MySQL lit les options par défaut dans les fichiers suivants sous Unix : Fichier Objet Options globales Options spécifiques au serveur defaults?extra?file Le fichier spécifié par ??defaults?extra?file=# Options spécifiques à l'utilisateur DATADIR est le dossier de données de MySQL (typiquement /usr/local/mysql/data pour les installation binaires ou /usr/local/var pour une installation source). Notez que c'est ce dossier qui a été spécifié au moment de la configuration et non pas le dossier de l'option ??datadir lorsque mysqld démarre ! ( ??datadir n'a aucun effet sur le serveur, car le serveur recherche les données avant de traiter les options de ligne de commande). MySQL lit les fichiers d'options suivants sous Windows : Fichier Contenu windows?system?directory\ Options globales C:\ Options globales Notez que sous Windows, vous devez spécifier les chemins avec / plutôt que \ . Si vous utilisez \ , vous devez le spécifier deux fois, car \ est un caractère de protection pour MySQL. MySQL essaie de lire les fichiers d'options dans l'ordre dans lequel ils sont présentés ci?dessus. Si des options sont spécifiées plusieurs fois, la dernière occurrence utilisée prend la préséeance sur les options spécifiées avant. Les options de ligne de commande ont la priorité sur les options spécifiées dans les fichiers. Certaines options peuvent être spécifiées en utilisant des variables d'environnement. Les options spécifiées en ligne de commande ou en fichier ont la priorité sur les options qui le sont via une variable d'environnement. Variables d'environnement MySQL . Les programmes suivants utilisent les fichiers d'options : mysql , mysqladmin , mysqld , mysqld_safe , mysql.server , mysqldump , mysqlimport , mysqlshow , mysqlcheck , myisamchk et myisampack . Toute option longue qui doit être spécifiée en ligne de commande lorsque MySQL fonctionne, peut être aussi configurée dans le fichier d'options ( sans les doubles tirets). Exécutez le programme avec l'option ??help pour avoir une liste des options disponibles. Un fichier d'options contient des lignes ayant la forme suivante : #comment Les lignes de commentaires commencent avec '#' ou ';' . Les lignes vides sont ignorées. [group] 4.1.2 Fichier d'options 170 Manuel MySQL 4.1.x ? Version Française group est le nom du programme ou du groupe pour lequel vous souhaitez configurer des options. Après une ligne de groupe, toutes les option et set?variable s'appliqueront au groupe nommé, jusqu'à la fin du fichier d'option ou du démarrage d'un autre groupe. option Ceci est équivalent à ??option sur la ligne de commande. option=value Ceci est équivalent à ??option=value sur la ligne de commande. set?variable = variable=value Ceci est équivalent à ??set?variable variable=value sur la ligne de commande. Cette syntaxe doit être utilisée pour spécifier la valeur d'une variable mysqld . Notez que ??set?variable est obsolète depuis MySQL 4.0, utilisez simplement ??variable=value comme tel. Le groupe client vous permet de spécifier des options qui ne s'appliquent qu'aux clients MySQL et non pas au serveur mysqld . C'est le groupe idéal pour spécifier des mots de passe de connexion au serveur (mais assurez?vous que vous êtes le seul à accéder à ce fichier !!). Notez que pour les options et les valeurs, tous les caractères blancs de début et de fins seront automatiquement effacés. Vous pouvez utiliser les séquences d'échappement '\b' , '\t' , '\n' , '\r' , '\\' et '\s' dans votre chaîne à la place ( '\s' == espace). Voici un exemple typique de fichier d'options globales : [client] port=3306 [mysqld] port=3306 set?variable = key_buffer_size=16M set?variable = max_allowed_packet=1M [mysqldump] quick Voici un exemple typique de fichier d'options utilisateur : [client] # Le mot de passe suivant va être utilisé avec le serveur password=mon_mot_de_passe [mysql] no?auto?rehash set?variable = connect_timeout=2 [mysqlhotcopy] interactive?timeout Si vous avez une distribution source, vous trouverez des exemples de configuration dans les fichiers nommés my? dans le dossier support?files . Si vous avez une distribution binaire, regardez dans le dossier DIR/support?files , où DIR est le chemin de l'installation MySQL (typiquement /usr/local/mysql ). Actuellement, il y a des exemples de configuration pour des systèmes petits, moyens, grands et très grands. Vous pouvez copier l'un des fichiers my? dans votre dossier utilisateur (renommez le fichier en ) pour le tester. Tous les clients MySQL qui supportent les fichiers d'options, acceptent les options suivantes : Option Description 4.1.2 Fichier d'options 171 Manuel MySQL 4.1.x ? Version Française ??no?defaults Ne lire aucun fichier d'options. Affiche le nom du programme et toutes les options ??print?defaults qui s'y trouvent. Utilise uniquement le fichier de configuraiton ??defaults?file=full?path?to?default?file donné. Lit ce fichier de configuration après le fichier de ??defaults?extra?file=full?path?to?default?file configuration global, mais avant le fichier de configuration utilisateur. Notez ques les options ci?dessus doivent être en ligne de commande pour être utilisées ! ??print?defaults peut quand même être utilisé directement après la commande ??defaults?xxx?file . Note pour les développeurs : la gestion des fichiers d'options est implémentée simplement en traitant toutes les options qui correspondent (c'est?à?dire, toutes les options appropriées du groupe), avant les arguments de ligne de commande. Cela fonctionne bien pour les programmes qui utilisent la dernière occurrence comme valeur d'option, si elle est spécifiée plusieurs fois. Si vous avez un vieux programme qui traite les options multiples de cette façon mais ne lit pas les fichiers d'options, vous n'avez besoin que de deux lignes pour qu'il accepte cette fonctionnalité. Récupérez le code source de n'importe quel client MySQL standard pour voir comment le faire. En scripts shell, vous pouvez utiliser la commande my_print_defaults pour analyser les fichiers de configuration : shell> my_print_defaults client mysql ??port=3306 ?? ??no?auto?rehash La ligne ci?dessus affiche toutes les options pour les groupes 'client' et 'mysql'. 4.1.3 Installer plusieurs serveurs sur la même machine Dans certains cas, vous aurez besoin de plusieurs démons mysqld sur la même machine. Vous pouvez, par exemple, faire tourner une vieille version de MySQL pour la tester avec une nouvelle. Vous pouvez aussi donner des accès différents à des utilisateurs de différents serveurs mysqld , qu'il gèrent eux?mêmes. Une méthode pour avoir plusieurs serveurs différents sur la même machine est de le configurer avec différents sockets et ports comme suit : shell> MYSQL_UNIX_PORT=/tmp/mysqld? shell> MYSQL_TCP_PORT=3307 shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT shell> scripts/mysql_install_db shell> bin/safe_mysqld & L'annexe sur les variables d'environnement inclut une liste des variables d'environnement que vous pouvez utiliser pour paramétrer mysqldci?dessus est immédiate et peu propre pour ceux qui font des tests. Ce qui est bien avec cette méthode, c'est que les connexions que vous réalisez avec le shell ci?dessus seront automatiquement redirigées vers le serveur en fonctionnement. 4.1.3 Installer plusieurs serveurs sur la même machine 172 Manuel MySQL 4.1.x ? Version Française Si vous avez besoin d'une méthode plus permanente, il est recommandé de créer un fichier d'options pour chaque serveur. Fichier d'options . Dans votre script de démarrage du serveur, vous pourriez spécifier tous les serveurs : safe_mysqld ??defaults?file=path?to?option?file Enfin, les options suivantes doivent être différentes pour chaque serveur : port=# • socket=path • pid?file=path • Les options suivantes doivent être différentes, si elles sont utilisées : log=path • log?bin=path • log?update=path • log?isam=path • bdb?logdir=path • Si vous voulez plus de performances, vous pouvez aussi configurer différemment les options suivantes : tmpdir=path • bdb?tmpdir=path • Options en ligne de commande de mysqld . Si vous installez une version binaire de MySQL (fichiers .tar) et que vous les démarrez avec ./bin/safe_mysqld , alors dans la plupart des cas, la seule option que vous devez modifier est la socket socket et le port port dans le script safe_mysqld . Faire fonctionner plusieurs serveurs MySQL sur la même machine . 4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine Il y a des situations où vous souhaiterez avoir plusieurs serveurs MySQL sur la même machine. Par exemple, si vous voulez tester une nouvelle version du serveur avec votre configuration de production sans perturber votre installation de production. Ou bien, vous êtes un fournisseur de services Internet, et vous voulez fournir des installations distinctes pour des clients différents. Si vous voulez exécuter plusieurs serveurs MySQL, le plus simple et de compiler les serveurs avec différents ports TCP/IP et fichiers de sockets pour qu'ils ne soient pas tous à l'écoute du même port ou de la même socket. mysqld_multi , un programme pour gérer plusieurs serveurs MySQL . Supposons que votre serveur est configuré avec le numéro de port par défaut, et le numéro de socket par défaut. Alors vous pouvez configurer le nouveau serveur avec la commande configure suivante : shell> ./configure ??with?tcp?port=numero_port \ ??with?unix?socket?path=nom_fichier \ ??prefix=/usr/local/mysql?3.22.9 4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine 173 Manuel MySQL 4.1.x ? Version Française Ici, les options numero_port et nom_fichier doivent être différentes des valeurs par défaut, et avec l'option ??prefix vous allez spécifier un autre dossier d'installation que celui qui est déjà utilisé par la première installation. Vous pouvez vérifier le nom de la socket qui est utilisée par un serveur MySQL avec cette commande : shell> mysqladmin ?h hostname ??port=numero_port variables Notez que si vous spécifiez `` localhost '' comme nom d'hôte, mysqladmin va utiliser les sockets Unix plutôt que TCP/IP. Si vous avez un serveur MySQL qui utilise déjà le port, vous obtiendrez une liste des variables de configuration les plus importantes de MySQL, y compris le nom de la socket. Vous n'avez pas à recompiler un nouveau serveur MySQL juste pour le démarrer sous un autre port et une autre socket. Vous pouvez changer le port et la socket utilisée au moment du démarrage, avec safe_mysqld : shell> /path/to/safe_mysqld ??socket=nom_fichier ??port=numero_port mysqld_multi peut aussi prendre safe_mysqld (ou mysqld ) comme argument, et passer les options depuis un fichier de configuration à safe_mysqld , et ainsi, à mysqld .Si vous exécutez un nouveau serveur sur les mêmes données qu'un autre serveur, avec le log activé, vous devez spécifier le nom du fichier de log à safe_mysqld avec l'option ??log , ??log?update , ou ??log?slow?queries . Sinon, les deux serveurs risquent d'écrire dans le même fichier de log. Attention : normalement, vous ne devez pas avoir deux serveurs qui modifient en même temps les données dans les mêmes bases. Si votre OS ne supporte pas le verrouillage sans échec, cela peut vous mener à de déplaisantes surprises ! Si vous voulez utiliser un autre dossier de fichiers pour le second serveur, vous pouvez utiliser l'option ??datadir=path de safe_mysqld . Notez aussi que démarrer plusieurs serveurs MySQL ( mysqlds ) dans différentes machines, et les laisser accéder aux même données via NFS est généralement une mauvaise idée ! Le problème est que NFS va devenir un frein au niveau de la vitesse. Il n'est pas destiné à une telle utilisation. Et de plus, vous devrez trouver une solution pour vous assurer que deux des mysqld n'interfèrent pas entre eux. Actuellement, il n'y a pas de plate?forme qui soit 100% fiable pour le verrouillage de fichiers (le démon lockd ), dans toutes les situations. Pourtant, il va y avoir un risque supplémentaire avec NFS ; cela rendra le travail encore plus compliqué pour le démon lockd . Alors, simplifiez?vous la vie, et oubliez cela. La solution efficace est d'avoir un ordinateur avec un système d'exploitation, qui gère efficacement les threads et a plusieurs processeurs. Lorque vous voulez vous connecter au serveur MySQL qui fonctionne avec un autre port que le port qui est compilé par défaut dans votre client, vous pouvez utiliser l'une des méthodes suivantes : Lancez le client avec l'option • ??host 'hostname' ??port=numero_port pour vous connecter en TCP/IP, ou [??host localhost] ??socket=nom_fichier pour vous connecter via une socket Unix. Dans vos programmes C ou Perl, vous pouvez indiquer le port ou la socket lors de la • connexion au serveur MySQL. Si vous utilisez le code Perl avec le module • DBD::mysql , vous pouvez lire les options des fichiers d'options MySQL. Fichier d'options . $dsn = "DBI:mysql:test;mysql_read_default_group=client; " 4.1.4 Faire fonctionner plusieurs serveurs MySQL sur la même machine 174 Manuel MySQL 4.1.x ? Version Française $dbh = DBI?>connect($dsn, $user, $password); Modifiez les variables d'environnement • MYSQL_UNIX_PORT et MYSQL_TCP_PORT pour qu'elles pointent sur la socket Unix et le port TCP/IP voulu avant de démarrer vos clients. Si vous utilisez une socket ou un port spécifique, il est recommandé de modifier ces variables dans votre fichier .loginSpecifiez la socket et le port TCP/IP par défaut dans le fichier • de votre dossier personnel. Fichier d'options . 4.2 Règles de sécurité et droits d'accès au serveur MySQL MySQL est pourvu d'un système avancé mais non standard de droits. Cette section décrit son fonctionnement. 4.2.1 Instructions générales de sécurité Tous ceux qui utilisent MySQL avec un serveur connecté à l'internet doivent lire cette section, pour éviter les erreurs de sécurité les plus courantes. En parlant de sécurité, nous mettons l'accent sur la nécessité de protéger la totalité du serveur (et non pas seulement le serveur MySQL), contre tous les types d'attaques possibles : cheval de troye, virus, dénis de services, écoute électronique. Nous ne couvrirons pas la totalité des aspects et des pannes ici. MySQL utilise un système de sécurité basé sur les listes de contrôle d'accès (Access Control Lists; ACLs) pour toutes les connexions, requêtes et autres opérations qu'un utilisateur peut tenter d'exécuter. Il y a aussi le support des connexions chiffrées par mode SSL, entre le client et le serveur. De nombreux concepts sont présentés ici, et ne sont pas spécifiques à MySQL. Les mêmes concepts s'appliquent à de nombreuses applications. Lorsque vous faîtes fonctionner MySQL, suivez ces règles le plus souvent possible : Ne jamais donner à quiconque (hormis l'utilisateur mysql root) l'accès à la table • user dans la base mysql ! Cette table est primordiale. Le mot de passe chiffré stocké dans la table est le véritable mot de passe MySQL . Quiconque connaît le mot de passe stocké dans la table user et a accès à la liste des hôtes d'un compte peut facilement se connecter avec cet utilisateur . Connaissez à fond le système de droits de MySQL. Les commandes • GRANT et REVOKE sont utilisées pour contrôler les accès à MySQL. Ne donnez pas plus de droits que nécessaire. Ne donnez jamais des droits à tous les hôtes. Liste de points à vérifier : Essayez ? mysql ?u root . Si vous êtes capable de vous connecter avec succès au serveur sans qu'un mot de passe n'ai été demandé, vous avez un problème. Toute personne peut se connecter au serveur MySQL en tant qu'utilisateur root avec tous les droits ! Passez en revue votre installation MySQL, en faisant attention aux mots de passe root . Utilisez la commande ? SHOW GRANTS et vérifiez qui a accès à quoi. Supprimez les droits qui ne sont pas nécessaires avec la commande REVOKE . Ne gardez par de mot de passe en clair dans vos tables. Lorsque votre ordinateur est • infiltré, l'intrus pourra alors obtenir la liste complète des mots de passe, et les utiliser. Au lieu de cela, utilisez les fonctions MD5() , SHA1() ou une autre fonction de hash. Ne choisissez pas vos mots de passe dans un dictionnaire. Il y a des programmes spéciaux • qui sont capable de les casser. Même des mots de passe comme ``xfish98'' sont très faibles. Bien meilleur est ``duag98'' qui contient aussi le mot ``fish'' mais tapé avec une 4.2 Règles de sécurité et droits d'accès au serveur MySQL 175 Manuel MySQL 4.1.x ? Version Française touche à gauche sur le clavier standard QWERTY. Une autre méthode est d'utiliser ``Pfspeb'' qui est un mot créé à partir des premières lettres de la phrase ``Papa fume sa pipe en bois''. C'est un mot de passe facile à retenir, difficile à deviner pour une personne qui ne le connaît pas. Investissez dans un pare?feu. Cela vous protège de presque 50 % de tous les types de • trous de sécurité des logiciels. Placez MySQL derrière un pare?feu, ou dans une zone démilitarisée (DMZ).Liste de points à vérifier : Essayez de scanner vos ports depuis Internet, en utilisant des outils comme ? nmap . MySQL utilise le port 3306 par défaut. Ce port doit être inaccessible depuis des hôtes indus. Un autre moyen simple de tester si votre port MySQL est accessible ou pas, est d'essayer la commande suivante depuis une machine distante, où server_host est l'hôte de votre serveur MySQL : shell> telnet server_host 3306 Si vous obtenez une connexion et des caractères étranges, c'est que le port est ouvert, et qu'il devrait être fermé par votre routeur ou votre pare?feu, à moins que vous n'ayez une bonne raison de le garder ouvert. Si telnet attend ou que la connexion est refusée, c'est que tout est bon : le port est bloqué. Ne faites jamais aucune confiance aux données des utilisateurs. Ils peuvent essayer de • nombreux trucs pour vous envoyer du code spécial ou faire passer des séquences de caractères protégés via des formulaires web, ou n'importe quel outil que votre application utilise. Soyez certain que votre application reste sécurisée même si un utilisateur obtient du code comme `` ; DROP DATABASE mysql; ''. Ceci est un exemple extrême, mais de grosse fuites de données ou des pertes peuvent survenir si un pirate utilise des techniques similaires, et que vous n'êtes pas préparé pour. Vérifiez aussi toutes les données numériques. Une erreur commune est de protéger uniquement les chaînes. Certains pensent que si une base contient des données publiques, elle ne doit pas être protégée. C'est totalement faux. Au minimum, un attaque en dénis de service peut être pratiquée sur ces bases. Le plus simple moyen pour vous protéger contre ce type d'attaque est d'utiliser des apostrophes autour des constantes numériques : SELECT * FROM table WHERE ID='234' plutôt que SELECT * FROM table WHERE ID=234 . MySQL convertit automatiquement la chaîne en nombre et supprime tous les caractères non numériques avant insertion. Point à vérifier : Toutes les applications web : ? Essayez d'entrer des guillemets ? ''' et '"' dans tous vos formulaires web. Si vous obtenez une erreur MySQL, alors étudiez le problème immédiatement. Essayez de modifier toute URL dynamique en ajoutant les codes ? %22 ( '"' ), %23 ( '#' ) et %27 ( ''' ) dedans. Essayez de modifier les types de données des URL dynamiques, de ? numérique en chaîne, grâce aux exemples ci?dessus. Votre application doit être sécurisée contre ce type d'attaques. Essayez d'entrer des caractères comme des espaces ou des symboles ? spéciaux au lieu des nombres, dans les champs numériques. Votre application doit les supprimer avant de le passer à MySQL, ou votre application doit générer une erreur. Passer des valeurs non vérifiées à MySQL est très dangereux. Vérifiez la taille des données avant de les passer à MySQL. ? Donnez un autre nom d'utilisateur et un autre mot de passe à votre ? application que votre nom d'utilisateur d'administration. Ne donnez pas à votre application plus de droits que nécessaire. 4.2 Règles de sécurité et droits d'accès au serveur MySQL 176 Manuel MySQL 4.1.x ? Version Française Utilisateurs de PHP : ? Etudiez la fonction ? addslashes() . Depuis PHP 4.0.3, la fonction mysql_escape_string() est disponible avec la même fonctionnalité que son alter ego en API MySQL C. Utilisateurs de l'API MySQL C : ? Vérifiez les appels à ? mysql_real_escape_string() . Utilisateurs de MySQL++ : ? Vérifiez les options ? escape et quote des requêtes. Utilisateurs Perl DBI : ? Vérifiez la méthode ? quote() ou utilisez des variables liées. Utilisateurs de Java JDBC : ? Utilisez l'objet ? PreparedStatement et les variables liées. Ne transmettez aucunes données non chiffrées via Internet. Ces données peuvent être • accessibles à quiconque a le temps et la capacité d'intercepter des données et de les utiliser pour son propre usage. Au lieu de cela, utilisez un protocole chiffré tel que SSL ou SSH. MySQL supporte les connexions SSL en interne, depuis la version 4.0.0. Le forward de port de SSH peut être utilisé pour créer un tunnel chiffré et compressé pour les communications. Apprenez à utiliser les utilitaires • tcpdump et strings . Pour la plupart des cas, vous pouvez vérifier si les flux de données MySQL sont chiffrés en utilisant une commande telle que celle ci : shell> tcpdump ?l ?i eth0 ?w ? src or dst port 3306 | strings (Cela fonctionne sous Linux et devrait aussi fonctionner sous les autres systèmes avec de légères adaptations). Attention : si vous ne voyez pas de données, cela ne signifie pas que vous avez des données chiffrées. Si vous avez besoin de forte sécurité, vous devriez consulter un expert de la sécurité. 4.2.2 Comment protéger MySQL contre les pirates Lorsque vous vous connectez à MySQL, vous devriez avoir besoin d'un mot de passe. Ce mot de passe n'est pas transmis en texte clair sur le réseau, mais comme l'algorithme de chiffrement n'est pas très fort, quelques efforts permettront à un pirate d'obtenir votre mot de passe s'il est capable de surveiller le trafic entre le client et le serveur. Si la connexion entre le client et le serveur utilise des réseaux non fiables, il est alors recommandé d'utiliser un tunnel SSH.Toutes les autres informations sont transférées comme du texte clair, et quiconque surveille la connexion pourra les lire. Si vous souhaitez relever ce niveau de sécurité, il est recommandé d'utiliser le protocole compressé (avec les versions de MySQL 3.22 et plus récentes), pour compliquer considérablement le problème. Pour rendre la communication encore plus sûre, vous pouvez aussi utiliser ssh . Vous trouverez une version Open Source du client sshversion commerciale du client sshmettre en place une connexion TCP/IP chiffrée entre le serveur et le client vous utilisez sécurisées . Pour rendre le système MySQL encore plus sûr, nous vous recommandons de suivre les suggestions suivantes : Utilisez des mots de passe pour tous les utilisateurs MySQL. N'oubliez pas que tout le • monde peut se connecter avec un nom d'utilisateur quelconque, simplement avec l'option mysql ?u autre_utilisateur nom_de_base , si autre_utilisateur n'a pas de mot de passe. C'est un comportement classique pour les applications client/serveur que le client spécifie son nom d'utilisateur. Vous pouvez modifier les mots de passe de tous les utilisateurs en modifiant le script mysql_install_db avant de l'exécuter, ou vous pouvez modifier seulement le mot de passe du root MySQL comme ceci : 4.2.2 Comment protéger MySQL contre les pirates 177 Manuel MySQL 4.1.x ? Version Française shell> mysql ?u root mysql mysql> UPDATE user SET Password=PASSWORD('nouveau_mot_de_passe') ?> WHERE user='root'; mysql> FLUSH PRIVILEGES; N'exécutez jamais le démon MySQL avec l'utilisateur Unix • root . C'est très dangeureux, car tout personne ayant le droit de FILE pour créer des fichiers au nom du root (par exemple, ~root/.bashrc ). Pour éviter cela, mysqld refusera de s'exécuter au nom de root à moins que soit précisé l'option ??user=root . mysqld peut être exécuté avec un utilisateur ordinaire sans droits particuliers. Vous pouvez aussi créer un utilisateur Unix mysql pour rendre cela encore plus sûr. Si vous exécutez mysqld sous un autre utilisateur Unix, vous n'avez pas à changer le mot de passe root dans la table user , car les noms d'utilisateurs MySQL n'ont rien à voir avec les noms d'utilisateurs Unix. Pour démarrer mysqld sous un autre nom d'utilisateur Unix, ajoutez la ligne user , qui spécifie le nom de l'utilisateur, dans le fichier d'options de [mysqld] ou dans le fichier présent dans le dossier de données du serveur. Par exemple : [mysqld] user=mysql Cette ligne va forcer le serveur à démarrer en tant qu'utilisateur mysql , même si vous démarrez le serveur manuellement ou avec les scripts safe_mysqld , ou mysql.server . N'acceptez pas les liens symboliques pour les tables (cette fonctionnalité peut être • désactivée avec l'option ??skip?symlink option). Il est généralement important si vous exécutez mysqld en tant que root, car tout le monde aurait accès en écriture au dossier de Vérifiez que l'utilisateur Unix qui exécute • mysqld est le seul utilisateur avec les droits de lecture et écriture dans le dossier de base de données. Ne donnez pas le droit de • PROCESS à tous les utilisateurs. La liste fournie par mysqladmin processlist affiche le texte des requêtes actuellement exécutées, ce qui permet à toute personne pouvant exécuter cette commande de lire des valeurs qui seraient en clair, comme : UPDATE user SET password=PASSWORD('not_secure') . mysqld réserve une connexion supplémentaire pour les utilisateurs qui ont le droit de PROCESS , afin que le root MySQL puisse toujours se connecter et vérifier que tout fonctionne bien, même s'il ne reste plus de connexions libres pour les autres utilisateurs. Ne donnez pas le droit de • FILE à tous les utilisateurs. Tout utilisateur qui possède ce droit peut écrire un fichier n'importe où sur le serveur, avec les droits hérités du démon mysqld ! Pour rendre cela plus sécuritaire, tous les fichiers générés par SELECT ... INTO OUTFILE sont lisibles par tous, mais personne ne peut les modifier. Le droit de FILE peut aussi être utilisé pour lire n'importe quel fichier accessible en lecture au démon qui fait tourner MySQL. Il devient donc possible, suivant les configurations, d'utiliser la commande LOAD DATA sur le fichier /etc/passwd pour tout mettre en table, et ensuite le relire avec la commande SELECT . Si vous ne faites pas confiance à votre DNS, vos pouvez simplement utiliser des adresses • IP au lieu des noms d'hôtes. Dans ce cas, soyez très prudents lors de la création de droits qui utilisent des caractères joker. Si vous voulez restreindre le nombre de connexions d'un utilisateur, vous pouvez le faire en • utilisant la variable max_user_connections de mysqld . 4.2.3 Options de démarrage qui concernent la sécurité Les options suivantes de mysqld affectent la sécurité : 4.2.3 Options de démarrage qui concernent la sécurité 178 Manuel MySQL 4.1.x ? Version Française ??local?infile[=(0|1)] If one uses ??local?infile=0 then one can't use LOAD DATA LOCAL INFILE . ??safe?show?database Avec cette option, la commande SHOW DATABASES ne retourne que les bases pour lesquelles l'utilisateur courant a des droits. Depuis la verison 4.0.2, cette option est abandonnée, et ne sert plus à rien (elle est activée par défaut), car désormais, il y a le droit de SHOW DATABASES . Syntaxe de GRANT et REVOKE . ??safe?user?create Si cette option est activée, tout utilisateur ne peut créer d'autres utilisateurs avec les droits de GRANT , s'il ne dispose pas des droits d'insertion dans la table . Si vous voulez donner un accès à un utilisateur pour qu'il puisse créer des utilisateurs avec les droits dont il dispose, vous pouvez lui donner les droits suivants : mysql> GRANT INSERT(user) ON TO 'user'@'hostname'; Cela va s'assurer que l'utilisateur ne peut par modifier une colonne directement, mais qu'il peut exécuter la commande GRANT sur d'autres utilisateurs. ??skip?grant?tables Cette option force le serveur à ne pas utiliser les tables de droits. Cette option donne donc tous les droits à tout le monde sur le serveur ! Vous pouvez forcer un serveur en fonctionnement à reprendre les tables de droits en exécutant la commande mysqladmin flush?privileges ou mysqladmin reload .) ??skip?name?resolve Les noms d'hôtes ne sont pas résolus. Toutes les valeurs de la colonne Host dans les tables de droits doivent être des adresses IP, ou bien localhost . ??skip?networking Ne pas accepter les connexions TCP/IP venant du réseau. Toutes les connexions au serveur mysqld doivent être faîtes avec les sockets Unix. Cette option n'existe pas pour les versions antérieures à la 3.23.27, avec les MIT?pthread, car les sockets Unix n'étaient pas supportés par les MIT?pthreads à cette époque. ??skip?show?database Ne pas autoriser la commande SHOW DATABASES , à moins que l'utilisateur n'ait les droits de SHOW DATABASES . Depuis la version 4.0.2, vous n'avez plus besoin de cette option, car les accès sont désormais donnés spécifiquement avec le droit SHOW DATABASES . 4.2.4 Problèmes de sécurité avec LOAD DATA LOCAL Depuis MySQL 3.23.49 et MySQL 4.0.2, nous avons ajouté de nouvelles options pour traiter les problèmes de sécurité liés à LOAD DATA LOCAL . Il existe deux problèmes particuliers pour le support de cette commande : Comme la lecture du fichier est réalisée depuis le serveur, il est possible théoriquement de créer un serveur MySQL patché qui pourrait lire n'importe quel fichier sur la machine cliente, qui serait accessible à l'utilisateur. Dans un environnement web, où les clients se connectent depuis un serveur web, un utilisateur peut se servir de la commande LOAD DATA LOCAL pour lire les fichiers qui sont sur le serveur web, et auquel ce dernier a accès (en supposant qu'un utilisateur peut exécuter n'importe quelle commande sur le serveur). Il y a deux protections distinctes pour ces problèmes : 4.2.4 Problèmes de sécurité avec LOAD DATA LOCAL 179 Manuel MySQL 4.1.x ? Version Française Si vous ne configurez pas MySQL avec l'option ??enable?local?infile , alors LOAD DATA LOCAL sera désactivé par tous les clients, à moins que l'option mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0) soit activée dans le client. mysql_options() . Pour le client en ligne de commande mysql , LOAD DATA LOCAL peut être activé en spécifiant l'option ??local?infile[=1] , ou désactivé avec ??local?infile=0 . Par défaut, tous les clients MySQL et les librairies sont compilés avec ??enable?local?infile , pour être compatible avec MySQL 3.23.48 plus ancien. Vous pouvez désactiver toutes les commandes LOAD DATA LOCAL du serveur MySQL en démarrant mysqld avec ??local?infile=0 . Au cas où LOAD DATA LOCAL INFILE est désactivé sur le serveur ou le client, vous obtiendrez le message d'erreur (1148) : The used command is not allowed with this MySQL version 4.2.5 Rôle du système de privilèges La fonction première du système de privilèges de MySQL est d'authentifier les utilisateurs se connectant à partir d'un hôte donné, et de leur associer des privilèges sur une base de données comme SELECT , INSERT , UPDATE et DELETE . Les fonctionnalités additionnelles permettent d'avoir un utilisateur anonyme et de contrôler les privilèges pour les fonctions spécifiques à MySQL comme LOAD DATA INFILE et les opérations administratives. 4.2.6 Comment fonctionne le système de droits Le système de droits de MySQL s'assure que les utilisateurs font exactement ce qu'ils sont supposés pouvoir faire dans la base. Lorsque vous vous connectez au serveur, vous identité est déterminée par l'hôte d'où vous vous connectez et le nom d'utilisateur que vous spécifiez . Le système donne les droits en fonction de votre identité et de ce que vous voulez faire . MySQL considère votre nom d'hôte et d'utilisateur pour vous identifier, car il n'y pas que peu de raisons de supposer que le même nom d'utilisateur appartient à la même personne, quelque soit son point de connexion sur Internet. Par exemple, l'utilisateur joe qui se connecte depuis n'est pas forcément la même personne que joe qui se connecte depuis . MySQL gère cela en vous aidant à distinguer les différents utilisateurs et hôtes qui ont le même nom : vous pourriez donner des droits à joe lorsqu'il utilise sa connexion depuis , et un autre jeu de droits lorsqu'il se connecte depuis . Le contrôle d'accès de MySQL se fait en deux étapes : Etape 1 : Le serveur vérifie que vous êtes autorisé à vous connecter. • Etape 2 : En supposant que vous pouvez vous connecter, le serveur vérifie chaque requête • que vous soumettez, pour vérifier si vous avez les droits suffisants pour l'exécuter. Par exemple, si vous sélectionnez des droits dans une table, ou effacez une table, le serveur s'assure que vous avez les droits de SELECT pour cette table, ou les droits de DROP , respectivement. 4.2.5 Rôle du système de privilèges 180 Manuel MySQL 4.1.x ? Version Française Le serveur utilise les tables user , db et host dans la base mysql durant les deux étapes. Les champs de cette table sont les suivants : Nom de la table user db host Identifiant Host Host Host User Db Db Password User Champs de droits Select_priv Select_priv Select_priv Insert_priv Insert_priv Insert_priv Update_priv Update_priv Update_priv Delete_priv Delete_priv Delete_priv Index_priv Index_priv Index_priv Alter_priv Alter_priv Alter_priv Create_priv Create_priv Create_priv Drop_priv Drop_priv Drop_priv Grant_priv Grant_priv Grant_priv References_priv Reload_priv Shutdown_priv Process_priv File_priv Lors de la seconde étape du contrôle d'accès (vérification de la requête), le serveur peut, suivant la requête, consulter aussi les tables tables_priv et columns_priv . Les champs de ces tables sont : Nom de la table tables_priv columns_priv Identifiant Host Host Db Db User User Table_name Table_name Column_name Champs de droits Table_priv Column_priv Column_priv Autre champs Timestamp Timestamp Grantor Chaque table de droit contient des champs d'identification et des champs de droits. Les champs d'identification déterminent quels utilisateurs correspondent à cette ligne dans la table. Par exemple, une ligne dans la table user avec les valeurs dans les colonnes Host et User de '' et 'bob' servira à identifier les connexions qui sont faites par l'utilisateur bob depuis l'hôte . De même, une ligne dans la table db avec les valeurs des colonnes Host , User et Db de '' , 'bob' et 'reports' sera utilisée lorsque l'utilisateur bob se connecte depuis l'hôte pour accéder à la base reports . Les tables tables_priv et columns_priv contiennent en plus des champs indiquant les tables et combinaisons tables et colonnes auxquelles les lignes s'appliquent. Pour les contrôles d'accès, les comparaisons de nom d'hôte avec la colonne Host sont insensibles 4.2.5 Rôle du système de privilèges 181 Manuel MySQL 4.1.x ? Version Française à la casse. Les colonnes User , Password , Db et Table_name sont sensibles à la casse. Les valeurs de la colonne Column_name sont insensibles à la casse pour les versions de MySQL 3.22.12 et plus récent. Les champs de droits indiquent si le droit est donné, c'est à dire si l'opération indiquée peut être exécuté. Le serveur combine les informations dans différentes tables pour former une description vérification des requêtes . Les champs d'identification sont des chaînes, déclarées comme suit. La valeur par défaut de chacun des champs est la chaîne vide. Nom du champs Type Notes Host CHAR(60) User CHAR(16) Password CHAR(16) Db CHAR(64) ( CHAR(60) pour les tables tables_priv et columns_priv ) Table_name CHAR(60) Column_name CHAR(60) Dans les tables user , db et host , tous les champs de droits sont déclarés avec le type ENUM('N','Y') : il peuvent prendre tous les valeurs de 'N' (non) ou 'Y' (oui, YES), et la valeur par défaut est 'N' . Dans les tables tables_priv et columns_priv , les champs de droits sont déclarés comme des champs de type SET : Nom du Nom de la table Valeurs possibles champs 'Select', 'Insert', 'Update', 'Delete', tables_priv Table_priv 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter' tables_priv Column_priv 'Select', 'Insert', 'Update', 'References' columns_priv Column_priv 'Select', 'Insert', 'Update', 'References' En bref, le serveur utilise les tables de droits comme ceci : La table • user détermine si le serveur accepte ou rejette la connexion. Pour les connexions acceptées, tous les privilèges donnés dans la table user indiquent des privilèges globaux. Ces droits d'appliquent à toutes les bases du serveur. Les tables • db et host sont utilisées conjointement : Les champs d'identification de la table ? db déterminent quels utilisateurs peuvent accéder à quelles bases, depuis quel hôte. Les champs de droits indiquent alors les opérations permises. La table ? host est utilisée comme extension de la table db lorsque vous voulez qu'une ligne de la table db s'applique à plusieurs hôtes. Par exemple, si vous voulez qu'un utilisateur soit capable d'utiliser une base depuis plusieurs hôtes dans votre réseau, laissez la colonne Host vide dans la table db , Ce mécanisme est décrit en détails dans Contrôle d'accès, étape 2 : vérification des requêtes . Les tables • tables_priv et columns_priv sont similaires à la table db , mais sont plus atomiques : elle s'appliquent au niveau des tables et des colonnes, plutôt qu'au niveau des bases. 4.2.5 Rôle du système de privilèges 182 Manuel MySQL 4.1.x ? Version Française Notez que les droits d'administration tels que ( RELOAD , SHUTDOWN , etc...) ne sont spécifiés que dans la table user . En effet, ces opérations sont des opérations au niveau serveur, et ne sont pas liées à une base de données, ce qui fait qu'il n'y a pas de raison de les lier avec les autres tables. En fait user doit être consulté pour déterminer les autorisations d' droit de FILE est spécifié par la table user . Ce n'est pas un droit d'administration, mais votre capacité à lire ou écrire des fichiers sur le serveur hôte et dépendant de la base à laquelle vous accédez. Le serveur mysqld lit le contenu des tables de droits une fois, au démarrage. Lorsqu'il y a des privilèges prennent?ils effet ? . Lorsque vous modifiez le contenu des tables de droits, c'est une bonne idée que de s'assurer que vous avez bien configuré les droits qui vous intéressent. Pour vous aider dans votre diagnostique, voyez Causes possibles de l'erreur Access denied . Pour des conseils sur les aspects sécurité, voyez Comment protéger MySQL contre les pirates . Un outil de diagnostique pratique est le script mysqlaccess , que Yves Carlier a fourni à la distribution MySQL. Appelez mysqlaccess avec l'option the ??help pour comprendre comment il fonctionne. Notez que mysqlaccess ne vérifie les accès que pour les tables user , db et host . Il n'utilise pas les tables de droit de niveau table ou colonne. 4.2.7 Droits fournis par MySQL Les droits des utilisateurs sont stockés dans les tables user , db , host , tables_priv et columns_priv de la base mysql (c'est?à?dire, la base nommée mysql ). Le serveur MySQL lit changements de privilèges prennent?ils effet ? . Les noms utilisés dans ce manuel font référence aux droits fournis par MySQL version 4.0.2, tel que présentés dans la table ci?dessous, avec le nom de la colonne associée au droit, dans la table de droits, et dans le contexte d'application : Droit Colonne Contexte ALTER Alter_priv tables DELETE Delete_priv tables INDEX Index_priv tables INSERT Insert_priv tables SELECT Select_priv tables UPDATE Update_priv tables bases de données, tables CREATE Create_priv ou index bases de données ou DROP Drop_priv tables bases de données ou GRANT Grant_priv tables bases de données ou REFERENCES References_priv tables CREATE TEMPORARY TABLES Create_tmp_table_priv administration du serveur EXECUTE Execute_priv administration du serveur FILE File_priv accès aux fichiers du 4.2.7 Droits fournis par MySQL 183 Manuel MySQL 4.1.x ? Version Française serveur LOCK TABLES Lock_tables_priv administration du serveur PROCESS Process_priv administration du serveur RELOAD Reload_priv administration du serveur REPLICATION CLIENT Repl_client_priv administration du serveur REPLICATION SLAVE Repl_slave_priv administration du serveur SHOW DATABASES Show_db_priv administration du serveur SHUTDOWN Shutdown_priv administration du serveur SUPER Super_priv administration du serveur Les droits de SELECT , INSERT , UPDATE et DELETE vous permettent de faire des opérations sur les lignes qui existent, dans une table existante d'une base. La commande SELECT requiert le droit de SELECT uniquement si des lignes sont lues dans une une table. Vous pouvez exéctuer une commande SELECT même sans aucun droit d'accès à une base de données dans le serveur. Par exemple, vous pourriez utiliser le client mysql comme une simple calculatrice : mysql> SELECT 1+1; mysql> SELECT PI()*2; Le droit de INDEX vous donne le droit de créer et détruire des index de droit de ALTER vous donne le droit de modifier une table avec la commande ALTER TABLE . Les droits de CREATE et DROP vous permettent de créer de nouvelles tables et bases de données, et de les supprimer. Notez que si vous donnez le droit de DROP pour la base de données mysql à un utilisateur, cet utilisateur pourra détruire la base qui contient les droits d'accès du serveur ! Le droit de GRANT vous permet de donner les droits que vous possédez à d'autres utilisateurs. Le droit de FILE vous donne la possibilité de lire et écrire des fichiers sur le serveur avec les commandes LOAD DATA INFILE et SELECT ... INTO OUTFILE . Tout utilisateur qui possède ce droit peut donc lire ou écrire dans n'importe quel fichier à l'intérieur duquel le serveur MySQL peut lire ou écrire. Les autres droits sont utilisés pour les opérations administratives qui sont exécutées par l'utilitaire mysqladmin . La table ci?dessous montre quelle commande est associée à mysqladmin avec un de ces droits : Droit Commande autorisée reload , refresh , flush?privileges , flush?hosts , flush?logs RELOAD et flush?tables SHUTDOWN shutdown PROCESS processlist SUPER kill La commande reload indique au serveur de relire les tables de droits. La commande refresh vide les tables de la mémoire, écrit les données et ferme le fichier de log. flush?privileges est un synonyme de reload . Les autres commandes flush?* effectuent des fonctions similaires à la commande refresh mais sont plus limitées dans leur application, et sont préférables dans certains contextes. Par exemple, si vous souhaitez simplement vider les tampons dans le fichier de log, 4.2.7 Droits fournis par MySQL 184 Manuel MySQL 4.1.x ? Version Française utilisez flush?logs , qui est un meilleur choix que refresh . La commande shutdown éteint le serveur. La commande processlist affiche les informations sur les threads qui s'exécutent sur le serveur. La commande kill termine un des threads du serveur. Vous pouvez toujours afficher et terminer vos propres threads, mais vous aurez besoin des droits de PROCESS pour afficher les threads, et le droit de SUPER pour terminer ceux qui ont été démarrés par d'autres utilisateurs. Syntaxe de KILL . C'est une bonne idée en général, de ne donner les droits de Grant qu'aux utilisateurs qui en ont besoin, et vous devriez être particulièrement vigilant pour donner certains droits : Le droit de • GRANT permet aux utilisateurs de donner leurs droits à d'autres utilisateurs. Deux utilisateurs avec des droits différents et celui de GRANT pourront combiner leurs droits respectifs pour gagner un autre niveau d'utilisation du serveur. Le droit de • ALTER peut être utilisé pour tromper le système en renommant les tables. Le droit de • FILE peut servir à lire des fichiers accessibles à tous sur le serveur, et les placer dans une base de données. Le contenu pourra alors être lu et manipulé avec SELECT . Cela inclus le contenu de toutes les bases actuellement hébergées sur le serveur ! Le droit de • SHUTDOWN peut conduire au dénis de service, en arrêtant le serveur. Le droit de • PROCESS permet de voir en texte clair les commandes qui s'exécutent actuellement, et notamment les changements de mot de passe. Les droits sur la base de données • mysql peuvent être utilisés pour changer des mots de passe ou des droits dans la table des droits (Les mots de passe sont stockés chiffrés, ce qui évite que les intrus ne les lisent). S'ils accèdent à un mot de passe dans la table , ils pourront l'utiliser pour se connecter au serveur avec cet utilisateur (avec des droits suffisants, le même utilisateur pourra alors remplacer un mot de passe par un autre). Il y a des choses qui ne sont pas possibles avec le système de droits de MySQL : Vous ne pouvez pas explicitement interdire l'accès à un utilisateur spécifique. C'est à dire, • vous ne pouvez pas explicitement décrire un utilisateur et lui refuser la connexion. Vous ne pouvez pas spécifier qu'un utilisateur a les droits de créer et de supprimer des • tables dans une base, mais qu'il n'a pas les droits pour créer et supprimer cette base. 4.2.8 Se connecter au serveur MySQL Les clients MySQL requièrent généralement que vous spécifiez les paramètres de connexion pour vous connecter au serveur MySQL : l'hôte que vous voulez utiliser, votre nom d'utilisateur et votre mot de passe. Par exemple, le client mysql peut être démarré comme ceci (les arguments optionnels sont entre crochets '[' et ']' ) : shell> mysql [?h nom_d_hote] [?u nom_d_utilisateur] [?pvotre_mot_de_passe] Les formes alternatives des options ?h , ?u , and ?p sont ??host=host_name , ??user=user_name et ??password=your_pass . Notez qu'il n'y a aucun espace entre l'option ?p ou ??password= et le mot de passe qui le suit. Note : spécifier un mot de passe en ligne de commande n'est pas sécuritaire ! Tout utilisateur de votre serveur peut découvrir votre mot de passe en tapant la commande : ps auxwwd'options . 4.2.8 Se connecter au serveur MySQL 185 Manuel MySQL 4.1.x ? Version Française mysql utilise des valeurs par défaut pour chacun des paramètes qui manquent en ligne de commande : Le nom d'hôte par défaut est • localhost . Le nom d'utilisateur par défaut est votre nom d'utilisateur de système Unix. • Aucun mot de passe n'est transmis si • ?p manque. Par exemple, pour un utilisateur Unix joe , les commandes suivantes sont équivalentes : shell> mysql ?h localhost ?u joe shell> mysql ?h localhost shell> mysql ?u joe shell> mysql Les autres clients MySQL se comportent de manière similaire. Sous Unix, vous pouvez spécifier différentes valeurs par défaut qui seront utilisées lorsque vous établierez la connexion, de manière à ce que vous n'ayez pas à entrer ces informations en ligne de commande lorsque vous invoquez un programme client. Cela peut se faire de plusieurs façons : Vous pouvez spécifier les informations de connexion dans la section • [client] du fichier de configuration de votre dossier personnel. La section qui vous interesse ressemble à ceci : [client] host=nom_d_hote user=nom_d'utilisateur password=votre_mot_de_passe Fichier d'options . Vous pouvez spécifier les paramètres de connexion avec les variables d'environnement. • L'hôte peut être spécifié à mysql avec la variable MYSQL_HOST . L'utilisateur MySQL peut être spécifié avec la variable USER (uniquement pour Windows). Le mot de passe peut être spécifié avec MYSQL_PWDd'environnement MySQL . 4.2.9 Contrôle d'accès, étape 1 : Vérification de la connexion Lorsque vous tentez de vous connecter au serveur MySQL, le serveur accepte ou rejette la connexion en fonction de votre identité et du mot de passe que vous fournissez. Si le mot de passe ne correspond pas à celui qui est en base, le serveur vous interdit complètement l'accès. Sinon, le serveur accepte votre connexion et passe à l'étape 2, et la gestion de commandes. Votre identité est basée sur trois informations : L'hôte depuis lequel vous vous connectez • Votre nom d'utilisateur MySQL • Votre mot de passe • La vérification d'identité est réalisée avec les trois colonnes de la table user ( Host , User et Password ). Le serveur accepte la connexion uniquement si une entrée dans la table user correspond à votre hôte, et que vous fournissez le mot de passe qui valeurs de la table user peuvent être paramétrées comme ceci : Une valeur de la colonne • Host peut être un nom d'hôte, une adresse IP numérique, ou encore 'localhost' , qui représente l'hôte local. Vous pouvez utiliser les caractères jokers • '%' et '_' dans le champ Host . 4.2.9 Contrôle d'accès, étape 1 : Vérification de la connexion 186 Manuel MySQL 4.1.x ? Version Française Une valeur de • '%' dans la colonne Host remplace n'importe quelle autre valeur. Une valeur vide pour la colonne • Host indique que les droits doivent être gérés avec les entrées de la table host qui correspond à l'hôte se connectant. Vous trouverez plus d'informations à ce sujet dans le prochain chapitre. Depuis MySQL version 3.23, les valeurs de • Host spécifiées sous la forme d'IP numériques peuvent être complétées avec le masque de réseau qui indique combien de bits d'adresse sont utilisés. Par exemple : mysql> GRANT ALL PRIVILEGES ON db.* ?> TO david@'192.58.197.0/255.255.255.0'; Cela permet à toute personne se connectant depuis une adresse IP qui satisfait la contrainte suivante : user_ip & netmask = host_ip. Dans l'exemple ci?dessus, toutes les IP dans l'intervalle 192.58.197.0 ? 192.58.197.255 pourront se connecter au serveur MySQL. Les caractères joker ne sont pas autorisés dans le champ • User , mais vous pouvez spécifier une valeur vide qui remplacera tous les noms. Si l'entrée de la table user , qui correspond à une connexion entrante, a un nom d'utilisateur vide, l'utilisateur est alors considéré comme anonyme (c'est l'utilisateur sans nom) et non pas le nom d'utilisateur fourni. Cela signifie qu'un utilisateur fournissant un nom d'utilisateur vide sera utilisé pour identifier ses droits dans les prochaines étapes. Le champ • Password peut être vide. Cela ne signifie pas que n'importe quel mot de passe est valable, mais que l'utilisateur peut se connecter sans fournir de mot de passe. Les valeurs non vides du champ Password représentent des valeurs du mot de passe chiffrées. MySQL ne stocke pas les mots de passe en clair, à la vue de tous. Au contraire, le mot de passe fourni pas l'utilisateur qui tente de se connecter est chiffré (avec la fonction PASSWORD() ). Le mot de passe ainsi chiffré est alors utilisé entre le client et le serveur pour vérifier s'il est valable. Cela évite que des mots de passe en clair circulent entre le client et le serveur, sur la connexion. Notez que du point de vue de MySQL, le mot de passe chiffré est le vrai mot de passe, ce qui fait que vous ne devez en aucun cas le donner à un tiers. En particulier, ne donnez pas accès en lecture aux utilisateurs normaux aux tables d'administration dans la base mysql !Les exemples ci?dessous illustrent comment différentes variantes de Host et User dans la table user s'appliquent aux connexion entrantes : User Host value Connexions autorisées value '' 'fred' fred , se connectant depuis N'importe quel utilisateur, se connectant depuis '' '' '%' 'fred' fred , se connectant depuis n'importe quel hôte N'importe quel utilisateur, se connectant depuis '%' '' n'importe quel hôte fred , se connectant depuis n'importe quel hôte '' 'fred' dans le domaine fred , se connectant depuis , 'x.y.%' 'fred' , , etc. (Ceci n'est probablement pas très utilisé) fred , se connectant depuis l'hôte d'IP '144.155.166.177' 'fred' 144.155.166.177 fred , se connectant depuis un hôte d'IP dans '144.155.166.%' 'fred' la classe C 144.155.166 '144.155.166.0/255.255.255.0' 'fred' Identique à l'exemple précédent 4.2.9 Contrôle d'accès, étape 1 : Vérification de la connexion 187 Manuel MySQL 4.1.x ? Version Française Comme vous pouvez utiliser des caractères jokers dans les adresses IP de la colonne Host (par exemple, '144.155.166.%' pour identifier tout un sous?réseau), il est possible d'exploiter cette fonctionnalité en nommant un hôte . Pour contrer de telles tentatives, MySQL interdit les caractères jokers avec les noms d'hôtes qui commencent par des chiffres ou des points. Par exemple, si vous avez un nom d'hôte tel que , il ne sera jamais trouvé dans la colonne Host des tables de droits. Seule une adresse IP numérique peut être comparée avec un masque à caractère joker. Une connexion entrante peut être identifiée par plusieurs entrées dans la table user . Par exemple, une connexion depuis par fred sera identifiée de plusieurs façons différentes dans l'exemple ci?dessus. Comment le serveur va?t?il choisir si il y a plusieurs solutions ? Le serveur résoud cette question en triant les utilisateurs dans la colonne user après le démarrage, et il recherchera dans cette liste triée lorsqu'un utilisateur tente de se connecter. La première ligne qui satisfait les critères sera alors utilisée. Le tri de la table user suit les règles suivantes. Supposons que votre table user ressemble à ceci : +???????????+??????????+? | Host | User | ... +???????????+??????????+? | % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +???????????+??????????+? Lorsque le serveur lit cette table, il ordonne les lignes depuis les valeurs les plus spécialisées de la colonne Host jusqu'aux plus générales ( '%' dans la colonne Host signifie ``tous les hôtes'' et elle est la moins spécifique). Les entrées identiques dans la colonne Host sont ordonnées en fonction de la spécificité des valeurs de la colonne User (une entrée vide dans la colonne User signifie ``n'importe quel utilisateur'' et est spécifique). Le résultat de ce tri donne quelque chose comme ceci : +???????????+??????????+? | Host | User | ... +???????????+??????????+? | localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +???????????+??????????+? Lorsqu'une connexion est en cours de mise en place, le serveur regarde dans cette liste, et utilisera la première entrée trouvée. Pour une connexion depuis l'hôte localhost avec le nom d'utilisateur jeffrey , les entrées 'localhost' dans la colonne Host sont trouvées en premier. Parmi celles?la, la ligne avec un utilisateur vide satisfait les deux contraintes sur le nom et l'hôte. '%'/'jeffrey' pourrait avoir fonctionné, mais comme ce n'est pas le premier rencontré, il n'est pas utilisé. Voici un autre exemple. Supposons que la table user ressemble à ceci : +????????????????+??????????+? | Host | User | ... +????????????????+??????????+? | % | jeffrey | ... | | | ... +????????????????+??????????+? La table triée ressemble à ceci : +????????????????+??????????+? 4.2.9 Contrôle d'accès, étape 1 : Vérification de la connexion 188 Manuel MySQL 4.1.x ? Version Française | Host | User | ... +????????????????+??????????+? | | | ... | % | jeffrey | ... +????????????????+??????????+? Une connexion depuis l'hôte avec jeffrey satisfait les conditions de la première ligne, tandis qu'une connexion depuis avec jeffrey satisfait la seconde erreur commune est de penser que pour un utilisateur donné, toutes les entrées qui utilisent explicitement ce nom seront utilisées en premier lorsque la connexion est en cours d'établissement. Ceci est tout simplement faux. L'exemple précédent illustre cette situation, car la connexion depuis l'hôte avec jeffrey est la première ligne qui est trouvée, alors que la ligne contenant 'jeffrey' dans la colonne User est ignorée, car il n'y a pas de nom d' vous avez des problèmes lors de la connexion, listez le contenu de la table user et triez?la à la main pour savoir quel est la première ligne qui est trouvée et utilisée. 4.2.10 Contrôle d'accès, étape 2 : Vérification de la requête Une fois que vous avez établi la connexion, le serveur passe à l'étape 2. Pour chaque requête qui est fournie avec la connexion, le serveur vérifie si vous avez les droits suffisants pour exécuter une commande, en fonction du type de commande. C'est à ce moment que les colonnes de droits des tables d'administration entrent en scène. Ces droits peuvent provenir de la table user , db , host , tables_priv ou columns_priv . Les tables d'administration sont manipulées avec les commandes GRANT et REVOKE . Syntaxe de GRANT et REVOKE . (Vous pouvez aussi vous reporter table d'administration). La table d'administration user donne les droits aux utilisateurs au niveau global, c'est à dire que ces droits s'appliquent quelle que soit la base de données courante. Par exemple, si la table user vous donne le droit d'effacement , DELETE , vous pouvez effacer des données dans n'importe quelle base de ce serveur. En d'autres termes, les droits stockés dans la table user sont des droits de super utilisateur. Il est recommandé de ne donner des droits via la table user uniquement aux super utilisateurs, ou aux administrateurs de bases. Pour les autres utilisateurs, il vaut mieux laisser les droits dans la table user à 'N' et donner des droits au niveau des bases uniquement, avec les tables db et host . Les tables db et host donnent des droits au niveau des bases. Les droits peuvent être spécifiés dans ces tables comme ceci : Les caractères • '%' et '_' peuvent être utilisés dans la colonne Host et Db des deux tables. Si vous souhaitez utiliser le caractère '_' comme nom de base, utiliser la séquence '\_' dans la commande GRANT . La valeur • '%' dans la colonne Host de la table db signifie ``tous les hôtes''. Une valeur vide dans la colonne Host de la table db signifie ``consulte la table host pour plus de détails''. La valeur • '%' ou vide dans la colonne Host de la table host signifie ``tous les hôtes''. La valeur • '%' ou vide dans la colonne Db des deux tables signifie ``toutes les bases de données''. Un utilisateur vide dans la colonne • User de l'une des deux tables identifie l'utilisateur anonyme. Les tables db et host sont lues et triées par le serveur au démarrage (en même temps que la table user . La table db est triée suivant les valeurs des colonnes Host , Db et User , et la table host est triée en fonction des valeurs des colonnes Host et Db . Comme pour la table user , le tri place les entrées les plus spécifiques au début, et les plus générales à la fin. Lorsque le serveur recherche une ligne, il utilise la première qu'il trouve. Les tables tables_priv et columns_priv 4.2.10 Contrôle d'accès, étape 2 : Vérification de la requête 189 Manuel MySQL 4.1.x ? Version Française spécifient les droits au niveau des tables et des colonnes. Les valeurs des droits dans ces tables peuvent être spécifiés avec les caractères spéciaux suivants : Les caractères • '%' et '_' peuvent être utilisés dans la colonne Host et Db des deux tables. La valeur • '%' dans la colonne Host des deux tables signifie ``tous les hôtes''. Les colonnes • Db , Table_name et Column_name ne peuvent pas contenir de valeur vide ou de caractères jokers, dans les deux tables. Les tables tables_priv et columns_priv sont triées en fonction des colonnes Host , Db et User . Ce tri est similaire à celui du tri de la table db , même si le tri est bien plus simple, car seul le champ Host peut contenir des caractères processus de vérification est décrit ci?dessous. Si vous êtes familier avec le code source de contrôle d'accès, vous noterez que la description diffère légèrement de l'algorithme utilisé. La description est équivalente à ce que fait en réalité le code. La différence permet une meilleure approche pédagogique. Pour les requêtes d'administration comme SHUTDOWN , RELOAD , etc., le serveur vérifie uniquement l'entrée dans la table user , car c'est la seule table qui spécifie des droits d'administration. Le droit est donné si la ligne utilisée dans la connexion courante dans la table user donne le droit, et sinon, ce droit est interdit. Par exemple, si vous souhaitez exécuter la commande mysqladmin shutdown mais que votre ligne dans la table user ne vous en donne pas le droit ( SHUTDOWN ), vous n'aurez pas le droit sans même vérifier les tables db ou host : ces tables ne contiennent pas de colonne Shutdown_priv , ce qui évite qu'on en ait besoin. Pour les requêtes exploitant une base de données, comme INSERT , UPDATE , etc., le serveur vérifie d'abord les droits globaux de l'utilisateur (droits de super utilisateur), en regardant dans la table user . Si la ligne utilisée dans cette table donne droit à cette opération, le droit est donné. Si les droits globaux dans user sont insuffisants, le serveur déterminera les droits spécifiques à la base avec les tables db et host : Le serveur recherche dans la table • db des informations en se basant sur les colonnes Host , Db et User . Les champs Host et User sont comparés avec les valeurs de l'hôte et de l'utilisateur qui sont connectés. Le champ Db est comparé avec le nom de la base de données que l'utilisateur souhaite utiliser. S'il n'existe pas de ligne qui corresponde à Host et User , l'accès est interdit. S'il existe une ligne dans la table • db et que la valeur de la colonne Host n'est pas vide, cette ligne définit les droits de l'utilisateur. Si dans la ligne de la table • db , la colonne Host est vide, cela signifie que la table host spécifie quels hôtes doivent être autorisés dans la base. Dans ce cas, une autre recherche est faite dans la table host pour trouver une ligne avec les colonnes Host et Db . Si aucune ligne de la table host n'est trouvée, l'accès est interdit. S'il y a une ligne, les droits de l'utilisateur sont calculés comme l'intersection ( NON PAS l'union !) des droits dans les tables db et host , c'est?à?dire que les droits doivent être marqués 'Y' dans les deux tables (de cette façon, vous pouvez donner des droits généraux dans la table db puis les restreindre sélectivement en fonction des hôtes, en utilisant la table host . Après avoir déterminé les droits spécifiques à l'utilisateur pour une base grâce aux tables db et host , le serveur les ajoute aux droits globaux, donnés par la table user . Si le résultat autorise la commande demandée, l'accès est donné. Sinon, le serveur vérifie les droits au niveau de la table et de la colonne dans les tables tables_priv et columns_priv , et les ajoute aux droits déjà acquis. Les droits sont alors donnés ou révoqués en fonction de ces résultats. Exprimée en termes booléens, la description précédente du calcul des droits peut être résumé comme ceci : 4.2.10 Contrôle d'accès, étape 2 : Vérification de la requête 190 Manuel MySQL 4.1.x ? Version Française droits globaux OR (droits de base AND droits d'hôte) OR droits de table OR droits de colonne Il n'est peut?être pas évident pourquoi, si les droits globaux issus de la table user sont initialement insuffisants pour l'opération demandée, le serveur ajoute ces droits à ceux de base, table ou colonne ? La raison est que la requête peut demander l'application de plusieurs droits. Par exemple, si vous exécutez une commande INSERT ... SELECT , vous aurez besoin des droits de INSERT et de SELECT . Vos droits peuvent être tels que la table user donne un droit, mais que la table db en donne un autre. Dans ce cas, vous aurez les droits nécessaires pour faire une opération, mais le serveur ne peut le déduire d'une seule table : les droits de plusieurs tables doivent être combinés pour arriver à la bonne conclusion. La table host sert à gérer une liste d'hôtes reconnus et sécuritaires. Chez TcX, la table host contient une liste de toutes les machines du réseau local. Ces machines reçoivent tous les droits. Vous pouvez aussi utiliser la table host pour spécifier les hôtes qui ne sont pas sécuritaires. Supposons que la machine public.votre.domaine t est placée dans une zone publique que vous considérez comme peu sûre. Vous pouvez autoriser l'accès de toutes les machines, hormis celle?ci, grâce à la table host configurée comme ceci : +????????????????????+????+? | Host | Db | ... +????????????????????+????+? | .domain | % | ... (tous les droits à 'N') | %.your.domain | % | ... (tous les droits à 'Y') +????????????????????+????+? Naturellement, vous devriez toujours tester vos requêtes dans la table de droits, en utilisant l'utilitaire mysqlaccess pour vous assurer que vous disposez des droits nécessaires pour réaliser cette opération. 4.2.11 Causes des erreurs Access denied Si vous rencontrez des erreurs Access denied quand vous essayez de vous connecter au serveur MySQL, la liste suivante indique quelques actions à entreprendre pour corriger le problème : Après l'installation de MySQL, avez vous exécuté le script • mysql_install_db pour suivante : shell> mysql ?u root test Le serveur devrait vous laisser vous connecter sans erreurs. Vous devez aussi vous assurer que vous avez un fichier dans le dossier des bases de données MySQL. Ordinairement, il s'agit de , où CHEMIN est le chemin vers le dossier racine de l'installation MySQL. Après une installation toute fraîche, vous devez vous connecter au serveur et créer les • utilisateurs en réglant leurs permissions d'accès : shell> mysql ?u root mysql Le serveur devrait vous laisser vous connecter car l'utilisateur root de MySQL n'a pas de mot de passe initial. Ceci est aussi une faille de sécurité, et donc, vous devez choisir un mot de passe pour l'utilisateur root en même tant que les autres utilisateurs MySQL. 4.2.11 Causes des erreurs Access denied 191 Manuel MySQL 4.1.x ? Version Française Si vous essayez de vous connecter en root et que vous rencontrez cette erreur : Access denied for user: '@unknown' to database mysql cela signifie que vous n'avez pas d'entrée dans la table user avec une valeur 'root' de la colonne User et que mysqld cne peut trouver de nom d'hôte à votre client. Dans ce cas, vous devez redémarrer le serveur avec l'option ??skip?grant?tables et éditer le fichier /etc/hosts ou \windows\hosts pour ajouter une entrée pour votre hôte. Si vous obtenez une erreur qui ressemble à celle?ci : • shell> mysqladmin ?u root ?pxxxx ver Access denied for user: 'root@localhost' (Using password: YES) Cela signifie que vous utilisez un mot de passe erroné. Mise en place d'un mot de passe . Si vous avez oublié le mot de passe root, vous pouvez redémarrer mysqld avec ??skip?grant?tablespasse Root oublié . Si vous obtenez l'erreur suivante même sans spécifier de mot de passe, cela signifie que vous avez un mauvais mot de passe dans un fichier my.iniVous pouvez ne pas utiliser les fichiers d'options en utilisant l'option ??no?defaults , comme suit : shell> mysqladmin ??no?defaults ?u root ver Si vous mettez à jour une installation MySQL existante à partir d'une version plus ancienne • que 3.22.11 vers la version 3.22.11 ou plus à jour, avez?vous exécuté le script mysql_fix_privilege_tables ? Si ce n'est pas le cas, faites le. La structure des tables de droits a changé avec la version 3.22.11 de MySQL lorsque la commande GRANT est devenue fonctionnelle. Si vos droits semblent avoir changé au milieu d'une session, il se peut qu'un • super?utilisateur les ait changé. Recharger les tables de droits affecte les nouvelles Si vous n'arrivez pas à faire fonctionner votre mot de passe, souvenez?vous que vous • devez utiliser la fonction PASSWORD() si vous le changez avec les commandes INSERT , UPDATE , ou SET PASSWORD . L'utilisation de la fonction PASSWORD() n'est pas nécessaire si vous spécifiez le mot de passe en utilisant la commande GRANT ... INDENTIFIED BY ou la commande mysqladmin passwordlocalhost • est un synonyme de votre nom d'hôte local, et est aussi l'hôte par défaut auquel le client essaye de se connecter si vous n'en spécifiez pas un explicitement. Toutefois, les connexions à localhost ne fonctionnent pas si vous utilisez une version antérieure à la 3.23.27 qui utilise les MIT?pthreads (les connexions à localhost sont réalisées en utilisant les sockets Unix, qui n'étaient pas supportés par les MIT?pthreads à ce moment). Pour contourner ce problème sur de tels systèmes, vous devez utiliser l'option ??host pour nommer l'hôte du serveur explicitement. Cela créera une connexion TCP/IP vers le serveur mysqld . Dans ce cas, vous devez avoir votre vrai nom d'hôte dans les entrées de la table user du serveur hôte. (Cela est vrai même si vous utilisez un programme client sur la même machine que le serveur.) Si vous obtenez une erreur • Access denied lorsque vous essayez de vous connecter à la base de données avec mysql ?u nom_utilisateur nom_base , vous pouvez avoir un problème dans la table user . Vérifiez le en vous exécutant mysql ?u root mysql et entrant la commande SQL suivante : mysql> SELECT * FROM user; Le résultat devrait comprendre une entrée avec les colonnes Host et User correspondate au nom d'hôte de votre ordinateur et votre nom d'utilisateur MySQL. 4.2.11 Causes des erreurs Access denied 192 Manuel MySQL 4.1.x ? Version Française Le message d'erreur • Access denied vous dira en tant que qui vous essayez de vous identifier, l'hôte à partir duquel vous voulez le faire, et si vous utilisez ou pas un mot de passe. Normalement, vous devez avoir une entrée dans la table user qui correspondent au nom d'hôte et nom d'utilisateur donnés dans le message d'erreur. Par exemple, si vous obtenez une erreur qui contient Using password: NO , cela signifie que vous avez essayé de vous connecter sans mot de passe. Si vous obtenez l'erreur suivante en essayant de vous connecter à partir d'un hôte différenet • de celui sur lequel est placé le serveur, c'est qu'il n'y a pas d'enregistrement dans la table user qui correspond à cet hôte : Host ... is not allowed to connect to this MySQL server Vous pouvez contourner le problème en utilisant l'outil en ligne de commande mysql (sur l'hôte du serveur !) pour ajouter un enregistrement aux tables user , db , ou host pour la combinaison utilisateur / nom d'hôte avec laquelle vous essayez de vous connecter puis exécuter mysqladmin flush?privileges . Si vous n'avez pas la version 3.22 de MySQL et que vous ne connaissez ni l'IP ni le nom d'hôte à partir duquel vous essayez de vous connecter, vous devez créer une entrée avec '%' dans la colonne Host dans la table user et redémarrer mysqld avec l'option ??log sur la machine serveur. Après avoir essayé à nouveau de vous connecter à partir de la machine cliente, les informations contenues dans le log de MySQL vous apprendront comment vous vous êtes vraiment connectés. (Remplacez alors l'entrée de la table user contenant '%' avec le nom d'hôte qui apparait dans le log. Sinon, vous aurez un système non?sécurisé.)Une autre raison pour cette erreur sous Linux est que vous utilisez une version binaire de MySQL qui est compilée avec une version de glibc différente de celle que vous utilisez. Dans ce cas, vous devez soit mettre à jour votre système d'exploitation/glibc, soit télécharger les sources de MySQL et les compiler vous?même. Un RPM de sources est normalement facile à compiler et installer, cela ne devrait donc pas vous poser de gros problèmes. Si vous obtenez une erreur où le nom d'hôte est absent ou que celui?ci est une adresse IP • alors que vous avez bien entré le nom d'hôte : shell> mysqladmin ?u root ?pxxxx ?h some?hostname ver Access denied for user: 'root@' (Using password: YES) Cela signifie que MySQL a rencontré des erreurs lors de la résolution de l'IP du nom d'hôte. Dans ce cas, vous pouvez exécuter mysqladmin flush?hosts pour vider le cache interne des DNS. Comment MySQL utilise les DNS . Les autres solutions sont : Essayez de trouver le problème avec votre serveur DNS et corrigez le. ? Spécifiez les IP à la place des noms d'hôtes dans les tables de droits de MySQL. ? Démarrez ? mysqld avec ??skip?name?resolve . Démarrez ? mysqld avec ??skip?host?cache . Connectez vous à ? localhost si vous utilisez le serveur et le client sur la même machine. Placez le nom de la machine cliente dans ? /etc/hosts . Si • mysql ?u root test fonctionne mais que mysql ?h votre_hote ?u root test provoque une erreur Access denied , il se peut que vous ayez entré de mauvaises informations pour votre nom d'hôte dans la table user . Un problème commun ici est que la valeur Host dans la table user spécifie un nom d'hôte non?qualifié, mais que vos routines système de résolution de noms retournent un nom de domaine pleinement qualifié (ou vice?versa). Par exemple, si vous avez une entrée avec l'hôte 'tcx' dans la table user , mais que vos DNS disent à MySQL que votre nom d'hôte est '' , l'entrée ne fonctionnera pas. Essayez d'ajouter une entrée dans la table user qui contient votre adresse IP en tant que valeur de la colonne Host . (Une alternative est d'ajouter une entrée dans la table user avec une valeur de Host qui contient un caractère spécial, par exemple, 'tcx.%' . Toutefois, l'utilisation des noms d'hôtes se terminant par '%' est non?sécurisé et n 'est pas recommendé !) 4.2.11 Causes des erreurs Access denied 193 Manuel MySQL 4.1.x ? Version Française Si • mysql ?u utilisateur test fonctionne mais que mysql ?u utilisateur autre_base ne fonctionne pas, vous n'avez pas d'entrée pour autre_base listée dans la table db . Si • mysql ?u utilisateur nom_base fonctionne à partir du serveur, mais que mysql ?h nom_hote ?u utilisateur nom_base ne fonctionne pas à partir d'une autre machine, cette machine n'est pas listée dans la table user ou db . Si vous n'arrivez pas à trouver pourquoi vous obtenez l'erreur • Access denied , effacez toutes les entrées de la table user dont la valeur du champ Host contiennent des caractères spéciaux (entrées contenant '%' ou '_' ). Une erreur commune est d'insérer une nouvelle entrée avec Host = '%' et User = 'un utilisateur' , en pensant que cela vous permettra de spécifier localhost pour vous connecter à partir de la même machine. La raison pour laquelle cela ne fonctionnera pas est que les droits par défaut incluent une entrée avec Host = 'localhost' et User = '' . Puisque cette entrée possède une valeur de Host égale à 'localhost' , qui est plus spécifique que '%' , elle est utilisée de préférence à la nouvelle entrée lors de la connexion à partir de localhost ! La procédure correcte est d'insérer une seconde entrée avec Host = 'localhost' et User = 'un_utilisateur' , ou de supprimer l'entrée avec Host = 'localhost' et User = '' . Si vous avez l'erreur suivante, vous avez peut?être un problème avec la table • db ou host : Access to database denied Si l'entrée sélectionnée dans la table db possède un champ Host vide, assurez?vous qu'il y'a au moins une entrée correspondante dans la table host spécifiant les hôtes auxquels l'entrée dans la table db s'applique. Si vous obtenez l'erreur lors de l'utilisation des commandes SQL SELECT ... INTO OUTFILE ou LOAD DATA INFILE , votre entrée dans la table user ne possède probablement pas le privilège FILE . Souvenez?vous que le programme client utilise les paramètres de connexion spécifiés dans • connexion par défaut lorsque vous ne les spécifiez pas en ligne de commande, vérifiez votre environnement et le fichier dans votre répertoire personnel. Vous devrez aussi vérifier les fichiers système de configuration de MySQL, bien qu'il est fort peu probable que obtenez une erreur Access denied quand vous démarrer un client sans aucune option, assurez?vous de ne pas avoir spécifié un vieux mot de passe dans l'un de vos fichiers d'options ! Fichier d'options . Si vous apportez des modifications au tables de droits directement (en utilisant une requête • INSERT ou UPDATE ) et que vos changements semblent ignorés, souvenez vous que vous devez exécuter une requête FLUSH PRIVILEGES ou la commande mysqladmin flush?privileges pour demander au serveur de lire à nouveau les tables de droits. Sinon, vos changements ne seront pris en compte qu'au prochain démarrage du serveur. Souvenez?vous qu'après avoir choisi le mot de passe root avec une commande UPDATE , vous n'aurez pas à le spécifier avant de recharger les privilèges, car le serveur ne sait pas que vous l'avez modifié ! Si vous avez des problèmes d'accès avec un programme Perl, PHP, Python, ou ODBC, • essayez de vous connecter au serveur avec mysql ?u utilisateur nom_base ou mysql ?u utilisateur ?pvotre_passe nom_base . Si vous pouvez vous connecter en utilisant le client mysql , c'est que le problème vient de votre programme et non des droits MySQL. (Notez qu'il n'y a pas d'espace entre ?p et le mot de passe; vous pouvez aussi utiliser la syntaxe ??password=votre_passe pour spécifier le mot de passe. Si vous utilisez l'option ?p toute seule, MySQL vous demandera le mot de passe.) Pour les tests, démarrez le démon • mysqld avec l'option ??skip?grant?tables . Vous pourrez alors changer les tables de droits MySQL puis utiliser le script mysqlaccess pour 4.2.11 Causes des erreurs Access denied 194 Manuel MySQL 4.1.x ? Version Française vérifier si vos changements ont l'effet désiré. Lorsque vous êtes satisfait de vos modifications, exécutez mysqladmin flush?privileges pour dire au serveur mysqld de commencer à utiliser les nouvelles tables de droits. Note : Recharger les tables de droits écrase l'option ??skip?grant?tables . Cela vous permet de dire au serveur de commencer à prendre en considération les droits sans avoir à le couper et le redémarrer. Si rien ne fonctionne, démarrez le démon • mysqld avec l'option de débogage (par exemple, ??debug=d,general,query ). Cela affichera l'hôte et les informations de l'utilisateur pour chaque tentative de connexion. Les informations à propos de chaque commande exécutée Si vous avez d'autres problèmes avec les tables de droits de MySQL et que vous sentez • que vous devez envoyer le problème à la liste de diffusion, fournissez toujours le contenu de vos tables de droits. Vous pouvez obtenir les données avec la commande mysqldump mysql . Comme toujours, postez votre problème à l'aide du script mysqlbugmysqld avec ??skip?grant?tables pour pouvoir exécuter mysqldump . 4.3 Gestion des comptes utilisateurs de MySQL 4.3.1 Syntaxe de GRANT et REVOKE GRANT priv_type [(liste_colonnes)] [, priv_type [(liste_colonnes)] ...] ON {nom_de_table | * | *.* | nom_base.*} TO nom_utilisateur [IDENTIFIED BY [PASSWORD] 'password'] [, nom_utilisateur [IDENTIFIED BY 'password'] ...] [REQUIRE NONE | [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] REVOKE priv_type [(liste_colonnes)] [, priv_type [(liste_colonnes)] ...] ON {nom_de_table | * | *.* | nom_base.*} FROM nom_utilisateur [, nom_utilisateur ...] GRANT est disponible depuis MySQL version 3.22.11. Pour les versions plus anciennes de MySQL, la commande GRANT ne fait commandes GRANT et REVOKE permettent aux administrateurs système de créer des utilisateurs, de leur donner ou de leur retirer des droits, sur 4 niveaux : Niveau global Les droits globaux s'appliquent à toutes les bases de données d'un serveur. Ces droits sont stockés dans la table . Niveau base de données Les droits de niveau de base de données s'appliquent à toutes les tables d'une base de données. Ces droits sont stockés dans les tables et . Niveau table Les droits de table s'appliquent à toutes les colonnes d'une table. Ces droits sont stockés dans la table mysql.tables_priv . Niveua de colonne Les droits de niveau de colonnes s'appliquent à des colonnes dans une table. Ces droits sont stockés dans la table mysql.columns_priv . 4.3 Gestion des comptes utilisateurs de MySQL 195 Manuel MySQL 4.1.x ? Version Française Si vous donnez des droits à un utilisateur qui n'existe pas, vous créerez cet utilisateur. Pour voir des illustrations du fonctionnement de la commande GRANTMySQL .Pour les commandes GRANT et REVOKE , la clause priv_type peut être spécifiée par les constantes suivantes : ALL [PRIVILEGES] Tous les droits sauf WITH GRANT OPTION . ALTER Autorise l'utilisation de ALTER TABLE . CREATE Autorise l'utilisation de CREATE TABLE . CREATE TEMPORARY Autorise l'utilisation de CREATE TEMPORARY TABLE . TABLES DELETE Autorise l'utilisation de DELETE . DROP Autorise l'utilisation de DROP TABLE . EXECUTE Autorise l'utilisateur à exécuter des procédures stockées (pour MySQL 5.0). Autorise l'utilisation de SELECT ... INTO OUTFILE et LOAD DATA FILE INFILE . INDEX Autorise l'utilisation de CREATE INDEX et DROP INDEX . INSERT Autorise l'utilisation de INSERT . Autorise l'utilisation de LOCK TABLES sur les tables pour lesquelles LOCK TABLES l'utilisateur a les droits de SELECT . PROCESS Autorise l'utilisation de SHOW FULL PROCESSLIST . REFERENCES Réservé pour le futur. RELOAD Autorise l'utilisation de FLUSH . REPLICATION Donne le droit à l'utilisateur de savoir où sont les maîtres et esclaves. CLIENT REPLICATION Nécessaire pour les esclaves de réplication (pour lire les historiques SLAVE binaires du maître). SELECT Autorise l'utilisation de SELECT . SHOW DATABASES SHOW DATABASES affiche toutes les bases de données. SHUTDOWN Autorise l'utilisation de mysqladmin shutdown . Autorise une connexion unique même si max_connections est atteind, et SUPER l'exécution des commandes CHANGE MASTER , KILL thread , mysqladmin debug , PURGE MASTER LOGS et SET GLOBAL . UPDATE Autorise l'utilisation de UPDATE . USAGE Synonyme de ``pas de droits''. USAGE peut être utilisé lorsque vous voulez créer un utilisateur sans aucun droit. Les droits de CREATE TEMPORARY TABLES , EXECUTE , LOCK TABLES , REPLICATION ... , SHOW DATABASES et SUPER sont nouveaux en version 4.0.2. Pour utiliser ces droits après mise à jour en 4.0.2, vous devez exécuter le script mysql_fix_privilege_tables . Dans les anciennes versions de MySQL, le droit de PROCESS donnait les mêmes droits que le nouveau droit SUPER . Pour retirer le droit de GRANT à un utilisateur, utilisez les mêmes valeurs de priv_type avec GRANT OPTION : mysql> REVOKE GRANT OPTION ON ... FROM ...; Les valeurs de priv_type que vous pouvez spécifier pour une table sont SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , GRANT , INDEX et ALTER . 4.3 Gestion des comptes utilisateurs de MySQL 196 Manuel MySQL 4.1.x ? Version Française Les seules valeurs de priv_type que vous pouvez spécifier pour une colonne, lorsque vous utilisez la clause liste_colonnes ), sont SELECT , INSERT et UPDATE . Vous pouvez donner des droits globaux en utilisant la syntaxe ON *.* . Vous pouvez donner des droits de base en utilisant la syntaxe ON nom_base.* . Si vous spécifiez ON * et que vous avez une base de données qui est déjà sélectionnée, vous allez donner des droits pour la base de données courante. Attention : si vous spécifiez ON * et que vous n'avez pas de base courante, vous allez affecter les droits au niveau du serveur ! Notez bien : les caractères joker '_' and '%' sont autorisés lors de la spécification de noms dans la commande GRANT . Cela signifie que si vous voulez utiliser par exemple le caractère littéral '_' comme nom de base, vous devez le spécifier sous la forme '\_' dans la commande GRANT , pour éviter à l'utilisateur d'accéder à d'autres bases, dont le nom pourrait correspondre au masque d'expression régulière ainsi créé. Utilisez plutôt GRANT ... ON `foo\_bar`.* TO ... . Afin de permettre l'identification des utilisateurs depuis des hôtes arbitraires, MySQL supporte la spécification du nom d'utilisateur nom_utilisateur sous la forme [email protected] . Si vous voulez spécifier un nom d'utilisateur user qui contient des caractères spéciaux tels que '?' , ou une chaîne d'hôte host qui contient des caractères joker (comme '%' ), vous pouvez placer le nom de l'utilisateur ou de l'hôte entre guillemets (par exemple, 'test?utilisateur'@'test?nomdhote' ). Vous pouvez spécifier des caractères jokers dans le nom d'hôte. Par exemple, [email protected]'' fait correspondre l'utilisateur user de n'importe quel hôte du domaine , et [email protected]'144.155.166.%' fait correspondre l'utilisateur user à n'importe quelle adresse de la classe C 144.155.166 . La forme simple de user est synonyme de [email protected]"%" . MySQL ne supporte pas de caractères joker dans les noms d'utilisateur. Les utilisateurs anonymes sont définis par l'insertion de ligne avec User='' dans la table , ou en créant un utilisateur avec un nom vide, grâce à la commande GRANT . Note : si vous autorisez des utilisateurs anonymes à se connecter à votre serveur, vous devriez aussi donner ces droits à tous les utilisateurs locaux [email protected] car sinon, la ligne dans la table sera utilisée lorsque l'utilisateur se connectera au serveur MySQL depuis la machine locale ! Vous pouvez vérifier si cela s'applique à vous en exécutant la requête suivante : mysql> SELECT Host,User FROM WHERE User=''; Actuellement, la commande GRANT supporte uniquement les noms d'hôte, colonne, table et bases de données d'au plus 60 caractères. Un nom d'utilisateur peut être d'au plus 16 caractères. Les droits pour les tables et colonnes sont combinés par OU logique, avec les quatre niveaux de droits. Par exemple, si la table spécifie qu'un utilisateur a un droit global de SELECT , ce droit ne pourra pas être annulé au niveau base, table ou colonne. Les droits d'une colonne sont calculés comme ceci : droit global OR (droit de base de données ET droit d'hôte) OR droit de table OR droit de colonne 4.3 Gestion des comptes utilisateurs de MySQL 197 Manuel MySQL 4.1.x ? Version Française Dans la plupart des cas, vous donnez des droits à un utilisateur en utilisant un seul des niveaux de droits ci?dessus, ce qui fait que la vie n'est pas aussi compliquée. Le détails de la procédure de droits à une paire utilisateur/hôte qui n'existe pas dans la table , une ligne sera créée et restera disponible jusqu'à son effacement avec la commande DELETE . En d'autre termes, GRANT crée une ligne dans la table user , mais REVOKE ne la supprime pas. Vous devez le faire explicitement avec la commande DELETE . Avec MySQL version 3.22.12 ou plus récent, si un nouvel utilisateur est créé, ou si vous avez les droits de GRANT globaux, le mot de passe sera configuré avec le mot de passe spécifié avec la clause IDENTIFIED BY , si elle est fournie. Si l'utilisateur a déjà un mot de passe, il sera remplacé par ce nouveau. Si vous ne voulez pas faire passer le mot de passe en texte clair, vous pouvez immédiatement utiliser l'option PASSWORD suivi du mot de passe déjà chiffré avec la fonction PASSWORD() ou l'API C make_scrambled_password(char *to, const char *password) . Attention : si vous créez un nouvel utilisateur, mais que vous ne spécifiez pas la clause IDENTIFIED BY , l'utilisateur n'aura pas de mot de passe. Ce n'est pas sûr. Les mots de passe peuvent aussi être modifiés par la commande SET PASSWORD. Si vous donnez les droits de base, une ligne sera ajoutée dans la table . Lorsque les droits sur cette base seront supprimés avec la commande REVOKE , cette ligne disparaîtra. Si un utilisateur n'a pas de droits sur une table, elle ne sera pas affichée lorsqu'il requiert la liste des tables avec la commande SHOW TABLES . La clause WITH GRANT OPTION donne à l'utilisateur le droit de donner les droits qu'il possède à d'autres utilisateurs. La plus grande prudence est recommandée pour cette commande, car il permettra à terme à deux utilisateurs de combiner les droits dont ils disposent. MAX_QUERIES_PER_HOUR # , MAX_UPDATES_PER_HOUR # et MAX_CONNECTIONS_PER_HOUR # sont nouveaux en MySQL 4.0.2. Ces deux options limitent le nombre de requêtes et de modifications qu'un utilisateur peut réclamer dans une heure. Si # vaut 0 (valeur par défaut), alors cela signifie qu'il n'y a pas de limitations pour cet utilisateur. Limiter les ressources utilisateur . Vous ne pouvez pas donner à un autre utilisateur un droit que vous ne possédez pas vous?même. Le droit de GRANT vous donne le droit de diffuser les droits dont vous disposez déjà. Soyez bien conscient que lorsque vous donnerez le droit de GRANT à un niveau particulier, tous les droits qu'un utilisateur possède déjà (où qui lui seront donnés dans le futur) seront alors diffusables à d'autres individus. Supposons que vous donnez les droits de INSERT à un utilisateur, pour une table. Si vous ajoutez le droit de WITH GRANT OPTION , cet utilisateur peut donner le droit de SELECT mais aussi celui d' INSERT . Si vous donnez aussi le droit de UPDATE , il pourra alors diffuser les droits de INSERT , SELECT et UPDATE . Il est recommandé de ne pas donner les droits de ALTER à un utilisateur normal. Si vous le faites, les utilisateurs pourront alors contourner le système de droits en renommant des tables ! Notez que si vous utilisez des droits de niveau table ou colonne même pour un utilisateur, le serveur vérifiera alors ces droits pour tous les utilisateurs, et cela ralentira MySQL un peu. 4.3 Gestion des comptes utilisateurs de MySQL 198 Manuel MySQL 4.1.x ? Version Française Lorsque mysqld démarre, tous les droits sont stockés en mémoire. Les droits de bases, tables et colonnes prennent aussitôt effet, et les droits des utilisateurs prendront effet dès leur prochaine configuration. Les modifications sur les tables de droits que vous effectuez avec les commandes GRANT et REVOKE sont prises en compte immédiatement par le serveur. Si vous modifiez manuellement les tables (avec INSERT , UPDATE , etc...), vous devez exécuter la commande FLUSH PRIVILEGES , ou la commande en ligne mysqladmin flush?privileges pour indiquer au serveur qu'il doit recharger les droits. Quand les changements de privilèges prennent?ils effet ? . Les différences notables entre l'ANSI SQL et MySQL pour la commande GRANT sont : Les droits MySQL sont donnés pour une combinaison nom d'utilisateur + nom d'hôte, et non • pas pour un nom d'hôte seulement. L'ANSI SQL n'a pas de droits globaux ou de niveau base de données, et l'ANSI SQL ne • supporte pas tous les types de droits que MySQL supporte. MySQL ne supporte pas le droit ANSI SQL de TRIGGER ou UNDER . Les droits ANSI SQL sont structurés de manière hiérarchique. Si vous supprimez un • utilisateur, tous les droits donnés à cet utilisateur seront supprimés. Avec MySQL, les droits ne sont pas automatiquement supprimés, et vous devez les supprimer manuellement, si besoin. Avec MySQL, si vous avez le droit de • INSERT sur uniquement quelques colonnes de la table, vous pourrez exécuter des insertions. Les colonnes pour lesquelles vous n'avez pas de droit prendront alors leur valeur par défaut. L'ANSI SQL vous impose d'avoir les droits d' INSERT sur toutes les colonnes. Lorsque vous détruisez une table avec ANSI SQL, tous les droits liés à la table sont • supprimés. Si vous supprimez un droit en ANSI SQL, tous les droits qui étaient basés sur ce droit sont supprimés. Avec MySQL, les droits peuvent être abandonnés explicitement avec la commande REVOKE , ou en manipulant les tables de droits de MySQL. Pour une description de l'utilisation de REQUIRE , voyez Utilisation des connexions sécurisées . 4.3.2 Nom d'utilisateurs MySQL et mots de passe Il y a de nombreuses différences entre les utilisations des noms et mots de passe sous MySQL, et celles qui sont faites sous Unix ou Windows : Les noms d'utilisateurs, tels qu'utilisés pour le processus d'identification sous MySQL, n'ont • rien à voir avec les noms d'utilisateurs Unix ou Windows. La plupart des clients utilisent par défaut leur mot de passe Unix, mais c'est surtout parce que c'est pratique. Les programmes clients permettent d'utiliser des noms d'utilisateurs différents avec les options ?u et ??user . Cela signifie que vous ne pouvez pas rendre une base de données sécuritaire sans donner de mots de passe à tous les clients. Tout le monde peut essayer de se connecter au serveur sous n'importe quel nom, et il sera possible de se connecter si un nom d'utilisateur n'a pas de mot de passe. Les noms d'utilisateurs MySQL peuvent avoir jusqu'à 16 caractères ; les noms d'utilisateurs • Unix sont généralement limités à 8 caractères. Les mots de passe MySQL n'ont aucun rapport avec le passeport Unix. Il n'y a pas • nécessairement de connexion entre le mot de passe que vous utilisez pour vous connecter sur la machine Unix et celui que vous utilisez pour accéder au serveur MySQL. MySQL chiffre les mots de passe avec un algorithme différent de celui qui est utilisé par • Unix. Reportez?vous aux descriptions des fonctions PASSWORD() et ENCRYPT() dans votre mot de passe 'brouillé' est suffisant pour se connecter au serveur MySQL. 4.3.2 Nom d'utilisateurs MySQL et mots de passe 199 Manuel MySQL 4.1.x ? Version Française Les utilisateurs MySQL et leurs droits sont généralement créés par la commande GRANTde GRANT et REVOKE . Lorsque vous vous connectez à un serveur MySQL avec un client en ligne de commande, vous devez spécifier le mot de passe avec l'option ??password=mot?de?passeserveur MySQL . mysql ??user=monty ??password=devine nom_base Si vous voulez que le client vous demande le mot de passe à la volée, vous devriez utiliser l'option ??password sans argument : mysql ??user=monty ??password nom_base ou la version courte : mysql ?u monty ?p nom_base Notez que dans le dernier exemple, le mot de passe n'est pas 'nom_base'. Si vous voulez utiliser l'option ?p pour fournir un mot de passe, vous pouvez aussi essayer ceci : mysql ?u monty ?pdevine nom_base Sur certains systèmes, l'appel système que MySQL utiliser pour demander un mot de passe va automatiquement couper le mot de passe à 8 caractères. En interne, MySQL n'a pas de limite à la taille du mot de passe. 4.3.3 Quand les modifications de privilèges prennent?ils effets ? Lorsque mysqld est lancé, toutes les tables de droits sont lues, et sont utilisées. Les modifications aux tables de droits que vous faites avec GRANT , REVOKE et SET PASSWORD sont immédiatement prises en compte par le serveur. Si vous modifiez les tables de droits manuellement (avec INSERT , UPDATE , etc...), vous devez exécuter la commande FLUSH PRIVILEGES ou la commande mysqladmin flush?privileges , ou encore mysqladmin reload pour dire au serveur de relire les tables de droits. Sinon, vos modifications n'auront aucun effet jusqu'au redémarrge du serveur. Si vous modifiez les tables de droits manuellement, mais que vous oubliez de recharger les droits, vous vous demanderez sûrement pourquoi vos modifications n'ont pas d'effet. Lorsque le serveur remarque que les tables de droits ont été modifiées, les connexions existantes avec les clients sont modifiées comme ceci : Les droits de table et colonnes prennent effet à la prochaine requête du client. • Les droits de bases prennent effet à la prochaine commande • USE nom_de_base . Les droits globaux et les modifications de droits prennent effets lors de la prochaine • connexion. 4.3.4 Création des premiers droits MySQL Après avoir installé MySQL, vous devez configurer les premiers droits du serveur en exécutant le script scripts/mysql_install_dbmysql_install_db démarre le serveur mysqld et initialise les tables de droits, avec les 4.3.3 Quand les modifications de privilèges prennent?ils effets ? 200 Manuel MySQL 4.1.x ? Version Française paramètres suivants : L'utilisateur MySQL • root est créé en tant qu'administrateur avec tous les droits. Les connexions doivent se faire depuis l'hôte local. Note : Le mot de passe de l'utilisateur initial root est vide, ce qui permet à n'importe qui de se connecter en tant que root sans mot de passe , pour profiter de tous les droits. Un utilisateur anonyme est créé, qui peut faire ce qu'il veut avec toutes les tables dans la • base de données 'test' ou commençant par 'test_' . Les connexions doivent être faites depuis l'hôte local. Cela signifie qu'un utilisateur local peu se connecter sans mot de passe et être traité comme un utilisateur anonyme. Les autres droits sont réservés. Par exemple, un utilisateur normal ne peut pas utiliser les • commandes mysqladmin shutdown ou mysqladmin processlist . Note.Comme votre installation de base n'est pas du tout sécurisée, la première action que vous devez prendre est de spécifier un mot de passe à votre utilisateur root . Vous pouvez faire cela comme ceci (notez que vous aurez à spécifier le mot de passe en utilisant la fonction PASSWORD() ) : shell> mysql ?u root mysql mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password'); Si vous savez ce que vous faites, vous pouvez aussi directement manipuler les tables de droits : shell> mysql ?u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') ?> WHERE user='root'; mysql> FLUSH PRIVILEGES; Une autre méthode pour modifier de mot de passe est d'utiliser la commande en ligne mysqladmin : shell> mysqladmin ?u root password new_password Seuls les utilisateurs ayant des droits d'accès en lecture et écriture dans la base de données mysql peuvent modifier les mots de passe des autres utilisateurs. Tous les utilisateurs normaux, à l'exception des anonymes, peuvent uniquement modifier leur mot de passe personnel, avec l'une des commandes ci?dessus ou avec la commande SET PASSWORD=PASSWORD('new password') .Notez que si vous modifiez le mot de passe dans la table user en utilisant la première méthode, vous devez indiquer au serveur qu'il doit relire les droits avec la commande FLUSH PRIVILEGES ), sinon ces modifications ne seront pas prises en compte. Une fois que le mot de passe root a été modifié, vous devrez le fournir pour vous connecter au serveur en tant que root . Vous pouvez aussi laisser le mot de passe du root vide, afin de faire des connexions facilement lors de la configuration initiale du serveur. Mais n'oubliez pas de le spécifier lors de la mise en production. Voyez le script scripts/mysql_install_db pour savoir comment il configure les droits par défaut. Vous pouvez l'utiliser comme base pour ajouter des droits à d'autres utilisateurs. Si vous voulez que les droits initiaux soient différents, vous pouvez aussi modifier le script mysql_install_db avant de l'exécuter. Pour recréer complètement les tables de droits, effacez tous les fichiers .frm , .MYI et .MYD dans le dossier contenant les tables de la base mysql . (C'est le dossier mysql dans le dossier de données, qui est indiqué par la commande mysqld ??help .) Puis, exécutez le script mysql_install_db , après l'avoir éventuellement modifié avec les droits que vous souhaitez. 4.3.3 Quand les modifications de privilèges prennent?ils effets ? 201 Manuel MySQL 4.1.x ? Version Française Note : pour les versions de MySQL antérieures à la version 3.22.10, il ne faut pas effacer les fichiers .frm . Si vous le fait accidentellement, vous devez les copier depuis la distribution MySQL avant d'exécuter le script mysql_install_db . 4.3.5 Ajouter de nouveaux utilisateurs à MySQL Vous pouvez ajouter des utilisateurs de deux façons différentes : en utilisant la commande GRANT ou en manipulant la table des droits de MySQL directement. La méthode préférée consiste à utiliser la commande GRANTGRANT et REVOKE . Il y'a aussi beaucoup de programmes contribués comme phpmyadmin qui peuvent être utilisés pour créer et administrer les utilisateurs. Portails MySQL . Les exemples suivants montrent comment utiliser le client mysql pour créer de nouveaux utilisateurs. Ces exemples supposent que les privilèges sont attribués en accord avec les valeurs par défaut discutées dans la section précédente. Cela signifie que pour effectuer des changements, vous devez être sur la même machine où mysqld tourne, vous devez vous connecter en tant qu'utilisateur MySQL root , et l'utilisateur root doit avoir le droit INSERT sur la base mysql et le droit d'administration RELOAD . Si vous avez changé le mot de passe de l'utilisateur root , vous devez le spécifier dans les commandes mysql ci?dessous. Vous pouvez ajouter de nouveaux utilisateurs en utilisant des commandes GRANT : shell> mysql ??user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost ?> IDENTIFIED BY 'un_mot_de_passe' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" ?> IDENTIFIED BY 'un_mot_de_passe' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost; Ces commandes GRANT ajoutent trois nouveaux utilisateurs : monty Un super?utilisateur qui peut se connecter au serveur d'où il veut, mais qui doit utiliser le mot de passe 'un_mot_de_passe' pour le faire. Notez que nous devons exécuter une commande GRANT pour [email protected] et [email protected]"%" . Si nous n'ajoutons pas l'entrée avec localhost , l'entrée concernant l'utilisateur anonyme pour localhost qui est créée par mysql_install_db prendra précédence lors de la connexion à partir de l'hôte local, car elle a une entrée plus spécifique pour la valeur du champ Host et de plus, elle vient en premier dans l'ordre de tri de la table user . admin Un utilisateur qui peut se connecter depuis localhost sans mot de passe et qui a les droits administratifs RELOAD et PROCESS . Cela permet à cet utilisateur d'exécuter les commandes mysqladmin reload , mysqladmin refresh , et mysqladmin flush?* , ainsi que mysqladmin processlist . Aucun droit lié aux bases de données n'est donné. (Ils peuvent l'êetre plus tard en utilisant d'autres instructions GRANT .) dummy Un utilisateur qui peut se connecter sans mot de passe, mais seulement à partir de l'hôte local. Les droits globaux sont tous à 'N' ?le type de droit USAGE vous permet de créer un utilisateur démuni de privilèges. Il est supposé que vous lui assignerez 4.3.5 Ajouter de nouveaux utilisateurs à MySQL 202 Manuel MySQL 4.1.x ? Version Française les droits spécifiques aux bases de données plus tard. Vous pouvez ajouter les mêmes droits d'accès aux utilisateurs en utilisant directement des requêtes INSERT puis en demandant au serveur de recharger les tables de droits : shell> mysql ??user=root mysql mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('un_mot_de_passe'), ?> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user VALUES('%','monty',PASSWORD('un_mot_de_passe'), ?> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user SET Host='localhost',User='admin', ?> Reload_priv='Y', Process_priv='Y'; mysql> INSERT INTO user (Host,User,Password) ?> VALUES('localhost','dummy',''); mysql> FLUSH PRIVILEGES; Selon votre version de MySQL, vous pouvez avoir un nombre différent de valeurs 'Y' plus haut (les versions antérieures à la 3.22.11 possèdent moins de colonnes de privilèges). Pour l'utilisateur admin , la syntaxe d' INSERT étendue la plus lisible disponible depuis la version 3.22.11 est utilisée.Notez que pour ajouter un super?utilisateur, vous avez juste besoin de créer une entrée dans la table user avec tous les champs de droits à 'Y' . Aucune entrée n'est requise dans les tables db et host . Les colonnes de privilèges de la table user n'étaient pas renseignées explicitement dans la dernière requête INSERT (pour l'utilisateur dummy ), ses colonnes prennent donc la valeur par défaut, 'N' . C'est la même chose que ce que fait GRANT USAGE . L'exemple suivant ajoute un utilisateur custom qui peut se connecter à partir des hôtes localhost , server.domain , et . Il ne pourra accéder à la base de données bankaccount qu'à partir de localhost , à la base expenses qu'à partir de , et à la base customer à partir des trois hôtes. Il utilisera le mot de passe stupid pour les trois hôtes. Pour configurer les privilèges de cet utilisateur en utilisant des commandes GRANT , exécutez ce qui suit : shell> mysql ??user=root mysql mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ?> ON bankaccount.* ?> TO custom@localhost ?> IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ?> ON expenses.* ?> TO custom@ ?> IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ?> ON customer.* ?> TO custom@'%' ?> IDENTIFIED BY 'stupid'; La raison pour laquelle nous faisons deux insertions pour l'utilisateur 'custom' est que nous voulons lui donner accès à MySQL à partir de la machine locale avec les sockets Unix et à partir de la machine distante '' via TCP/IP. Pour régler les permissions d'accès en modifiant directement les tables de droits, exécutez ces commandes (notez l'appel à FLUSH PRIVILEGES à la fin) : shell> mysql ??user=root mysql mysql> INSERT INTO user (Host,User,Password) ?> VALUES('localhost','custom',PASSWORD('stupid')); 4.3.5 Ajouter de nouveaux utilisateurs à MySQL 203 Manuel MySQL 4.1.x ? Version Française mysql> INSERT INTO user (Host,User,Password) ?> VALUES('server.domain','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) ?> VALUES('','custom',PASSWORD('stupid')); mysql> INSERT INTO db ?> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, ?> Create_priv,Drop_priv) ?> VALUES ?> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db ?> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, ?> Create_priv,Drop_priv) ?> VALUES ?> ('','expenses','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db ?> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, ?> Create_priv,Drop_priv) ?> VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y'); mysql> FLUSH PRIVILEGES; Les trois premières requêtes INSERT ajoute les entrées dans la table user qui permettent l'iutilisateur custom à se connecter à partir de plusieurs hôtes avec le mot de passe donné, mais ne lui donnent aucun droit (tous les droits sont mis à la valeur par défaut qui est 'N' ). Les trois requêtes INSERT suivantes ajoutent des entrées dans la table db qui autorisent custom à utiliser les bases de données bankaccount , expenses , et customer , mais seulement s'il y accède à partir de l'hôte spécifié. Comme d'habitude, lorsqueles tables de droits sont modifiées directement, on doit demander au serveur des les recharger (avec FLUSH PRIVILEGES ) pour que les changements soient pris en compte. Si vous voulez donner un accès spécifique à un utilisateur à partir de n'importe quelle machine d'un domaine donné, vous pouvez utiliser la commande GRANT qui suit : mysql> GRANT ... ?> ON *.* ?> TO monutilisateur@"" ?> IDENTIFIED BY 'monmotdepasse'; Pour faire la même chose en modifiant directement la table de droits, faites : mysql> INSERT INTO user VALUES ('', 'monutilisateur', ?> PASSWORD('monmotdepasse'),...); mysql> FLUSH PRIVILEGES; Vous pouvez aussi utiliser xmysqladmin , mysql_webadmin , et même xmysql pour insérer, changer et mettre à jour les valeurs dans les tables de droits. Vous pouvez trouver ces utilitaires dans le dossier des contributions du site web de MySQL ( ). 4.3.6 Limiter les ressources utilisateurs Depuis MySQL 4.0.2, il est possible de limiter certaines ressources accessibles à un utilisateur possible. Jusqu'à présent, la seule méthode possible pour limiter l'utilisation des ressources serveurs MySQL était de configurer la variable de démarrage max_user_connections avec une valeur non nulle. Mais cette méthode est strictement globale, et ne permet pas de faire des aménagements personnalisés, comme cela pourrait arriver aux fournisseurs de services internet. 4.3.6 Limiter les ressources utilisateurs 204 Manuel MySQL 4.1.x ? Version Française Par conséquent, un système de gestion des ressources a été introduit, au niveau des utilisateurs : Nombre de requête par heure : Toutes les commandes qu'un utilisateur peut exécuter. • Nombre de modifications par heure : Toute commande qui implique la modification d'une • table ou d'une base. Nombre de connexion réalisées par heure : Le nombre de nouvelles connexions par heure. • Un utilisateur dans le contexte ci?dessus est une ligne dans la table user , qui est identifié de manière unique par les colonnes user et host . Par défaut, les utilisateurs ne sont pas limités dans l'utilisation des ressources ci?dessus, à moins que des limites ne leur soient imposées. Ces limites peuvent être configurées uniquement via la commande GRANT (*.*) , avec cette syntaxe : GRANT ... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3; Il est possible de spécifier toute combinaison de clauses ci?dessus. N1, N2 et N3 sont des entiers et représentent le compte par heure. Si l'utilisateur atteint l'une des limites ci?dessus dans une heure, sa connexion sera interrompue ou refusée, et un message d'erreur approprié sera émis. Les valeurs courantes d'utilisation d'un utilisateur peuvent être remises à zéro avec la commande GRANT , et n'importe laquelle des clauses ci?dessus, y compris une commande GRANT avec les valeurs courantes. De plus, les valeurs courantes de tous les utilisateurs peuvent être remises à zéro si les droits sont rechargés (dans le serveur, ou avec la commande mysqladmin reload ) ou si la commande SQL FLUSH USER_RESOURCES est exécutée. Cette fonctionnalité est activée aussitôt qu'une limite est donnée à un utilisateur, avec la commande GRANT . Comme pré?requis à l'activation de cette fonctionnalité, la table user de la base mysql doit contenir les colonnes additionnelles, définies dans le script de création mysql_install_db et , du dossier scripts . 4.3.7 Configurer les mots de passe Dans la plupart des cas, vous devez utiliser la commande GRANT pour configurer les utilisateurs et de GRANT et REVOKE . Les exemples des sections précédentes illustrent un principe important : lorsque vous stockez un mot de passe important avec les commandes INSERT ou UPDATE , vous devez utiliser la fonction PASSWORD() pour le chiffrer. Ceci est dû au fait que la table user stocke les mots de passe sous une forme chiffrée, et non pas en texte clair. Si vous oubliez cela, vous risquez de configurer vos mots de passe comme ceci : shell> mysql ?u root mysql mysql> INSERT INTO user (Host,User,Password) ?> VALUES('%','jeffrey','biscuit'); 4.3.7 Configurer les mots de passe 205 Manuel MySQL 4.1.x ? Version Française mysql> FLUSH PRIVILEGES; Le résultat est que la valeur 'biscuit' est stockée dans la colonne de mot de passe de la table user . Lorsque l'utilisateur jeffrey tente de se connecter au serveur avec ce mot de passe, le client mysql chiffre ce mot de passe avec la fonction PASSWORD() , génère un vecteur d'identification basé sur la version chiffrée du mot de passe et un nombre aléatoire, obtenu du serveur, puis envoie le tout au serveur. Le serveur utilise la valeur du mot de passe password dans la table user (ce qui n'est pas la valeur chiffrée de 'biscuit' ) pour effectuer la recherche et comparer les résultats. La comparaison échoue et le serveur rejette la connexion : shell> mysql ?u jeffrey ?pbiscuit test Access denied Les mots de passe doivent donc être chiffrés lors de leur insertion dans la table user . Aussi les commandes INSERT doivent être spécifiées comme ceci : mysql> INSERT INTO user (Host,User,Password) ?> VALUES('%','jeffrey',PASSWORD('biscuit')); Vous devez aussi utiliser la fonction PASSWORD() lorsque vous utilisez la commande SET PASSWORD : mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit'); Si vous modifiez les mots de passe en utilisant la commande GRANT ... IDENTIFIED BY ou la commande mysqladmin password , la fonction PASSWORD() n'est pas nécessaire. Ces commandes assureront le chiffrement de votre mot de passe pour vous, ce qui vous permet de spécifier le mot de passe de 'biscuit' comme ceci : mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; or shell> mysqladmin ?u jeffrey password biscuit Note : PASSWORD() n'effectue pas le chiffrement du mot de passe de la même façon qu'Unix. Il ne faut pas supposer que si vos mots de passe Unix et MySQL sont les mêmes, la fonction PASSWORD() retournera la même valeur que celle qui est stockée dans le fichier de mots de passe d'UNIX. Noms d'utilisateurs MySQL et mots de passe . 4.3.8 Garder vos mots de passe en lieu sûr Il est recommandé de ne pas placer votre mot de passe là où il risque d'être découvert par d'autres personnes. Les méthode que vous utiliserez pour spécifier votre mot de passe lors de la connexion avec le client sont listées ici, avec les risques liés à chaque méthode : Ne donnez jamais l'accès à un utilisateur normal, à la table • . En connaissant le mot de passe chiffré d'un utilisateur lui permettrait de se connecter sous cet utilisateur. Les mots de passe sont chiffrés pour que personne ne puisse lire le mot de passe en clair (ce qui arriverait si vous utilisiez le même mot de passe dans une autre application). Utilisez l'option • ?pyour_pass ou ??password=your_pass en ligne de commande. C'est très pratique mais très peu sûr, car votre mot de passe devient visible aux programmes qui effectuent des bilans de l'état du serveur, comme la commande ps , qui peut être invoquée par d'autres utilisateurs pour lister les commandes qui sont exécutées : les clients MySQL remplacent la valeur de cet argument par une série de zéro durant l'initialisation, mais il reste tout de même une courte période où ce mot de passe est lisible en clair. Utilisez l'option • ?p ou ??password (sans la valeur du mot de passe ). Dans ce cas, le programme client va solliciter la saisie du mot de passe depuis le terminal : shell> mysql ?u user_name ?p Enter password: ******** Les caractères '*' représentent votre mot de passe. Cette méthode est bien plus sûre pour saisir votre mot de passe qu'en le spécifiant directement en ligne de commande, car il n'est pas visible des autres utilisateurs. Cependant, cette méthode n'est possible qu'avec les programmes que vous utilisez en 4.3.8 Garder vos mots de passe en lieu sûr 206 Manuel MySQL 4.1.x ? Version Française mode interactif. Si vous voulez invoquer le client depuis un script qui s'exécute de manière non interactive, il n'y aura pas d'opportunité pour saisir ce mot de passe dans le terminal. Sur certains systèmes, vous pourriez même voir la première ligne de votre script lue et interprétée comme votre mot de passe, incorrectement. Stockez votre mot de passe dans le fichier de configuration. Par exemple, vous pouvez lister • votre mot de passe dans la section [client] du fichier dans votre dossier personnel : [client] password=mot_de_passe Si vous stockez ce mot de passe dans le fichier , le fichier ne doit pas être lisible par le groupe ou par les autres utilisateurs, ou encore accessible en écriture : seul le propriétaire de ce fichier doit avoir ces droits. Assurez?vous les droits d'accès au fichiers sont 400 ou 600 . Fichier d'options . Vous pouvez stocker votre mot de passe dans la variable d'environnement • MYSQL_PWD , mais cette méthode doit être considérée comme extrêmement peu sûre, et doit être évitée autant que possible. Certaines versions de la commande en ligne ps incluent une option pour afficher les variables d'environnement des processus : votre mot de passe sera alors facilement accessible, et en texte clair, si vous configurez la commande MYSQL_PWD . Même sur les systèmes sans une telle version de la commande ps , il est peu recommandé de supposer que les variables d'environnement sont inaccessibles par une méthode quelconque. Variables d'environnement MySQL . En conclusion, la méthode la plus sûre est encore de laisser le client vous demander le mot de passe, ou de le spécifier dans le fichier de configuration . 4.3.9 Utilisation des connexions sécurisées 4.3.9.1 Introduction aux connexions sécurisées Disponible depuis la version 4.0.0, MySQL supporte les connexions sécurisées. Pour comprendre comment MySQL utilise SSL, il est nécessaire de comprendre les concepts SSL et X509 de base. Ceux qui les connaissent, peuvent aisément sauter ce chapitre. Par défaut, MySQL utilise une connexion en clair entre le client et le serveur. Cela signifie qu'une personne peut surveiller votre trafic, et lire les données échangées. Cette personne pourrait aussi modifier les données qui transitent entre le client et le serveur. Parfois, vous aurez besoin d'échanger des informations sur un réseau public, mais en sécurisant ces informations. Dans ce cas, utiliser une connexion sans protection est inacceptable. SSL est un protocole qui utilise différents algorithmes de chiffrement pour s'assurer que les données qui transitent par un réseau public peuvent être considérées comme fiables. Ce protocole dispose de méthodes pour s'assurer que les données n'ont pas été modifiées, ce que soit par une altération, une perte ou une répétition des données. SSL inclut aussi des algorithmes pour reconnaître et fournit des outils de vérifications d'identitée, pris en charge par le standard X509. Le chiffrement est une méthode pour rendre des données illisibles. En fait, les pratiques actuelles requièrent d'autres éléments de sécurité issus des algorithmes de chiffrement. Ils doivent savoir résister à de nombreux types d'attaque, comme la modification de l'ordre des messages ou les répétitions inopinées. X509 est un standard qui rend possible l'identification d'une personne sur l'internet. Il est particulièrement utilisé pour les applications e?commerce. En termes simples, il doit y avoir une 4.3.9 Utilisation des connexions sécurisées 207 Manuel MySQL 4.1.x ? Version Française entreprise (appelée l'``autorité de certification'') qui assigne un certificat électronique à toute personne qui en a besoin. Ces certificats utilisent un chiffrement assymétrique qui exploitent deux clés de chiffrement, une clé publique et une clé privée. Le propriétaire d'un certificat peut prouver son identité en montrant son certificat à l'autre partie. Un certificat est constitué de la clé publique du propriétaire. Toute donnée qui est chiffrée avec cette clé publique doit être déchiffrée avec la clé secrète correspondante, qui est détenue par le propriétaire du certificat. MySQL n'utilise pas les connexions chiffrées par défaut, car cela ralentit considérablement le protocole de communication. Toute fonctionnalité supplémentaire requiert du travail supplémentaire de la part du serveur, et chiffrer des données est une tâche particulièrement coûteuse, qui peut ralentir considérablement les tâches principales de MySQL. Par défaut, MySQL est paramétré pour être aussi rapide que possible. Si vous avez besoin de plus d'informations sur SSL, X509 ou le chiffrement, utilisez votre moteur de recherche préféré sur Internet, et utilisez ces mots clés pour avoir plus de détails. 4.3.9.2 Pré requis aux connexions sécurisées Pour faire fonctionner les connexions sécurisées avec MySQL, vous devez disposer de ceci : Installation de la librairie d'OpenSSL. Nous avons testé MySQL avec OpenSSL 0.9.6. • Configuration de MySQL avec les options • ??with?vio ??with?openssl . Si vous utilisez une ancienne version de MySQL, vous devez modifier votre table • , en lui ajoutant les colonnes reliées aux notions SSL. Vous pouvez faire cela en exécutant le script . Ceci est nécessaire si vos tables de droits proviennent d'un version de MySQL antérieure à la version 4.0.0. Vous pouvez vérifier que vous posséder un serveur • mysqld qui supporte OpenSSL en examinant le résultat de la commande SHOW VARIABLES LIKE 'have_openssl' : elle doit retourner YES . 4.3.9.3 Options de GRANT MySQL peut vérifier les certificats X509 en plus de la combinaisons habituelle de nom d'utilisateur et mot de passe. Toutes les options habituelles sont toujours nécessaires (nom d'utilisateur, masque d'adresse IP, nom de base de données, nom de table). Voici différentes possibilités pour limiter les connexions : Sans aucune option SSL ou X509, toutes les connexions chiffrées ou non chiffrées sont • autorisées si le nom d'utilisateur et le mot de passe sont valides. L'option • REQUIRE SSL requiert que les connexions soient chiffrées avec SSL. Notez que cette option peut être omise si il n'y a pas de ligne ACL qui autorise une connexion sans SSL. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost ?> IDENTIFIED BY "goodsecret" REQUIRE SSL; REQUIRE X509 • impose au client d'avoir un certificat valide, mais le certificat lui même est de peu d'importance. La seule restriction est qu'il doit être possible de vérifier la signature avec une des autorités de certification. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost ?> IDENTIFIED BY "goodsecret" REQUIRE X509; REQUIRE ISSUER "issuer" • restreint les tentatives de connexion : le client doit se présenter avec un certificat X509 valide, émis par l' autorité de certification "issuer" . 4.3.9.2 Pré requis aux connexions sécurisées 208 Manuel MySQL 4.1.x ? Version Française Utiliser un certificat X509 implique obligatoirement des chiffrements, donc l'option SSL est sous entendue. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost ?> IDENTIFIED BY "goodsecret" ?> REQUIRE ISSUER "C=FI, ST=Some?State, L=Helsinki, "> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@"; REQUIRE SUBJECT "subject" • impose au client d'avoir un certificat X509 valide, avec le sujet "subject" . Si le client présente un certificat valide, mais que le "subject" est différent, la connexion est refusée. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost ?> IDENTIFIED BY "goodsecret" ?> REQUIRE SUBJECT "C=EE, ST=Some?State, L=Tallinn, "> O=MySQL demo client certificate, "> CN=Tonu Samuel/Email=tonu@"; REQUIRE CIPHER "cipher" • est utilisé pour s'assurer que les chiffrements sont suffisamment robuste, et que la bonne longueur de clé est utilisée. SSL lui même peut être faible si des algorithmes sont utilisés avec des clés courtes. En utilisant cette option, il est possible d'imposer la méthode de chiffrement avec la connexion. mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost ?> IDENTIFIED BY "goodsecret" ?> REQUIRE CIPHER "EDH?RSA?DES?CBC3?SHA"; Les options SUBJECT , ISSUER et CIPHER peuvent être combinées avec la clause REQUIRE comme ceci : mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost ?> IDENTIFIED BY "goodsecret" ?> REQUIRE SUBJECT "C=EE, ST=Some?State, L=Tallinn, "> O=MySQL demo client certificate, "> CN=Tonu Samuel/Email=tonu@" ?> AND ISSUER "C=FI, ST=Some?State, L=Helsinki, "> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@" ?> AND CIPHER "EDH?RSA?DES?CBC3?SHA"; Depuis MySQL 4.0.4, le mot clé AND est optionnel, entre les options REQUIRE .L'ordre de ces options n'a pas d'importance, mais aucune option ne peut être spécifiée deux fois. 4.4 Prévention des désastres et restauration 4.4.1 Sauvegardes de base de données Comme les tables MySQL sont stockées sous forme de fichiers, il est facile d'en faire une sauvegarde. Pour avoir une sauvegarde consistante, faites un LOCK TABLES sur les tables concernées suivi d'un FLUSH TABLESTABLES . Syntaxe de autre threads de continuer à effectuer des requêtes sur les tables dont vous faites la copie des fichiers dans le dossier des bases de données. FLUSH TABLE est requise pour s'assurer que toutes les pages d'index actifs soient écrits sur le disque avant de commencer la sauvegarde. Si vous voulez faire une sauvegarde d'une table avec SQL, vous pouvez utiliser SELECT INTO OUTFILE ou BACKUP TABLE . Syntaxe des SELECT . Syntaxe de BACKUP TABLE . Une autre façon de sauvegarder une base de données est d'utiliser l'utilitaire mysqldump ou le script mysqlhotcopy . mysqlhotcopy , copier les bases et tables MySQL . Effectuez une sauvegarde complète de votre base de données : • 4.4 Prévention des désastres et restauration 209 Manuel MySQL 4.1.x ? Version Française shell> mysqldump ??tab=/chemin/vers/un/dossier ??opt ??all ou shell> mysqlhotcopy base /chemin/vers/un/dossier Vous pouvez aussi copier tout simplement tous les fichiers de tables (les fichiers *.frm , *.MYD , et *.MYI ) du moment que le serveur ne met rien à jour. Le script mysqlhotcopy utilise cette méthode. Arrêtez • mysqld si il est en marche, puis démarrez le avec l'option ??log?update[=nom_fichier]fournissent les informations dont vous avez besoin pour répliquer les modifications de la base de données qui sont subséquents au moment où vous avez exécuté mysqldump . Si vous avez besoin de restaurer quelque chose, essayez d'abord de recouvrer vos tables avec REPAIR TABLE ou myisamchk ?r en premier. Cela devrait fonctionner dans 99.9% des cas. Si myisamchk ne réussi pas, essayez la procédure suivante (cela ne fonctionnera que si vous avez démarré MySQL avec ??log?update , Le log des mises à jour ) : Restorez le backup original de • mysqldump . Exécutez la commande suivante pour remettre en marche les mises à jours dans le log • binaire : shell> mysqlbinlog hostname?bin.[0?9]* | mysql Si vous utilisez le journal des mises à jour vous pouvez utiliser : shell> ls ?1 ?t ?r hostname.[0?9]* | xargs cat | mysql ls est utilisée pour avoir tous les fichiers de mise à jour dans le bon ordre. Vous pouvez aussi faire des sauvegardes sélectives avec SELECT * INTO OUTFILE 'nom_fichier' FROM nom_de_table et restaurez avec LOAD DATA INFILE 'nom_fichier' REPLACE ... Pour éviter les lignes dupliquées, vous aurez besoin d'une PRIMARY KEY ou une clef UNIQUE dans la table. Le mot clef REPLACE fait que les anciens enregistrements sont remplacés par les nouveaux lorsque l'un d'eux duplique un ancien sur une valeur de clef unique. Si vous obtenez des problèmes de performances sur votre système, vous pouvez les contourner en mettant en place une réplication et faisant les copies sur l'esclave au lieu du maître. Introduction . Si vous utilisez un système de fichiers Veritas , vous pourrez faire : A partir d'un client (ou de Perl), exécutez : • FLUSH TABLES WITH READ LOCK . A partir d'un autre shell, exécutez : • mount vxfs snapshot . Depuis le premier client, exécutez : • UNLOCK TABLES . Copiez les fichiers à partir de snapshot. • Démontez snapshot. • 4.4.2 Syntaxe de BACKUP TABLE BACKUP TABLE nom_de_table[,nom_de_table...] TO '/chemin/vers/le/dossier/de/sauvegardes' Cette commande copie le nombre minimal de fichiers de table dont en a besoin pour la restaurer vers le dossier de sauvegardes après avoir rafraîchit les changements dans le disque. Cela ne fonctione actuellement que pour les tables au format MyISAM . Pour les tables MyISAM , elle ne copie que les fichiers .frm (définition) et .MYD (données), le fichier d'indes pouvant, lui, être reconstruit à partir des deux autres. 4.4.2 Syntaxe de BACKUP TABLE 210 Manuel MySQL 4.1.x ? Version Française Avant d'utiliser cette commande, merci de lire Sauvegardes de base de données . Pendant la sauvegarde, un verrou de lecture est posé sur chaque table, une par une, lors de leur copie. Si vous voulez sauvegarder une image instantanée de plusieurs table, vous devez d'abord exécuter un LOCK TABLES obtenant un verrou de lecture pour chaque table concernée. La commande retourne une table avec les colonnes suivantes : Colonne Valeur Table Nom de la table Op Toujours ``backup'' Msg_type status , error , info ou encore warning . Msg_text Le message. Notez que BACKUP TABLE n'est disponible en MySQL que depuis la version 3.23.25. 4.4.3 Syntaxe de RESTORE TABLE RESTORE TABLE nom_de_table[,nom_de_table...] FROM '/chemin/vers/le/dossier/de/sauvegardes' Restaure la ou les tables à partir d'une sauvegarde effectuée avec BACKUP TABLE . Les tables existantes ne seront pas écrasées et dans ce cas là, vous obtiendrez une erreur. La restauration prendra plus de temps que la sauvegarde à cause de la reconstruction du fichier d'index. Plus vous avez de clefs, plus la restauration sera longue. Just as BACKUP TABLE , RESTORE TABLE currently works only for MyISAM tables. Cette commande retourne un tableau avec les colonnes suivantes : Colonne Valeur Table Nom de la table Op Toujours ``restore'' Msg_type status , error , info ou encore warning . Msg_text Le message. 4.4.4 Syntaxe de CHECK TABLE CHECK TABLE tbl_name[,tbl_name...] [option [option...]] option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED CHECK TABLE ne fonctionne qu'avec les tables MyISAM et InnoDB . Avec les tables MyISAM , c'est l'équivalent de la commande myisamchk ?m table_name sur la défaut, l'option MEDIUM est utilisée. Cette commande vérifie l'intégrité des tables. Pour les tables MyISAM , des statistiques importantes sont mises à jour. La commande retourne les infomrations suivantes sur la table dans les colonnes suivantes : Colonne Valeur Table Nom de la table. 4.4.3 Syntaxe de RESTORE TABLE 211 Manuel MySQL 4.1.x ? Version Française Op Toujours ``check''. Msg_type Un des statut status , error , info ou warning . Msg_text Le message. Notez que vous pouvez obtenir de nombreuses lignes d'informations pour chaque table. La dernière ligne sera du type Msg_type status et doit être normalement OK . Si vous n'obtenez pas de statut OK ou Not checkedmyisamchk pour maintenir les tables et recouvrir les données . Not checked signifie que la table a indiqué qu'il n'y a pas de vérification à faire. Les différents types de vérifications sont les suivants : Type Signification QUICK N'analyse pas les lignes pour vérifier les liens erronés. FAST Ne vérifie que les tables qui n'ont pas été correctement fermées. Ne vérifie que les tables qui ont changées depuis la dernière vérification, ou bien qui CHANGED n'ont pas été correctement fermées. Analyse les lignes pour s'assurer que les liens effacés sont corrects. Cette option MEDIUM calcule aussi la somme de contrôle des lignes, et la vérifie avec la somme de contrôle des clés. Fait une vérification complète des liens pour chaque ligne. Cela vérifie que la table est EXTENDED totalement cohérente, mais cela peut prendre beaucoup de temps. Pour les tables à format de dynamique de type MyISAM , une vérifiation de table sera toujours démarrée avec une option de niveau MEDIUM . Pour les tables à format de ligne statique, nous évitons les niveaux de QUICK et FAST car les lignes sont rarement corrompues. Vous pouvez combiner les options de vérification comme ceci : CHECK TABLE test_table FAST QUICK; L'exemple ci?dessus va simplement faire une vérification de la table, pour s'assurer qu'elle a été correctement fermée. Note : dans certains cas, CHECK TABLE va modifier la table! Cela arrive si la table a été marquée comme 'corrupted' et 'not closed properly' mais CHECK TABLE n'a trouvé aucun problème dans la table. Dans ce cas, CHECK TABLE va marquer la table comme correcte. Si une table est corrompue, il est probable que les problèmes sont dans les fichiers d'index et non pas dans les données. Tous les types de vérifications présentés ci?dessus vérifient les index soigneusement, et ils devraient trouver la plupart des erreurs. Si vous voulez simplement vérifier une table que vous supposez correcte, vous pouvez n'utiliser aucune option, ou l'option QUICK . Cette dernière peut aussi être utilisée si vous êtes pressé, et que vous pouvez prendre le risque minime que QUICK ne trouve pas d'erreur dans votre fichier. Dans la plupart des cas, MySQL doit trouver toutes les erreurs de données, pour un usage normal. Si cela arrive, alors la table est marquée comme 'corrupted', auquel cas, la table ne pourra pas être utilisée tant qu'elle n'a pas été réparée). FAST et CHANGED sont surtout destinées à être utilisées depuis un script : par exemple, il peut être exécuté depuis une tâche cron , si vous voulez vérifier la table de temps en temps. Dans la plupart des cas, l'option FAST doit être préférée à CHANGED : le seul cas ou vous pourriez préferez CHANGED est lorsque vous soupsonnez avoir trouvé un bogue dans les tables MyISAM . 4.4.3 Syntaxe de RESTORE TABLE 212 Manuel MySQL 4.1.x ? Version Française EXTENDED ne doit être utilisé qu'après une vérification normale, et que vous obtenez toujours des erreurs étranges lorsque MySQL essaie de modifier une ligne ou trouve une ligne avec clé (ce qui est très rare, si une vérification a réussie). Certains problèmes rapportés par la commande CHECK TABLE , ne peuvent être corrigés automatiquement : Found row where the auto_increment column has the value 0 • .Cela signifie que vous avez dans votre table une ligne qui contient la valeur 0 alors qu'elle est de type AUTO_INCREMENT . (Il est possible de créer une ligne où la colonne AUTO_INCREMENT vaut 0 en spécifiant explicitement la valeur 0 dans la colonne avec la commande UPDATE . Ce n'est pas une erreur en soit, mais cela peut poser des problèmes si vous décidez de sauver cette table dans un fichier texte, et de la restaurer, ou encore d'appliquer la commande ALTER TABLE sur la table. Dans ce cas, la colonne AUTO_INCREMENT va changer automatiquement de valeur, en suivant les règles des colonnes de type AUTO_INCREMENT , qui vont causer un problème de clé doublon. Pour se débarasser de cette alerte, vous devez utiliser une commande UPDATE surla table, pour mettre une valeur différente de 0 dans cette colonne. 4.4.5 Syntaxe de REPAIR TABLE REPAIR TABLE tbl_name[,tbl_name...] [QUICK] [EXTENDED] [USE_FRM] REPAIR TABLE ne fonctionne que les tables de type MyISAM , et c'est l'équivalent de la commande en ligne myisamchk ?r table_name .Normalement, vous n'avez pas à exécuter cette commande, mais si une catastrophe vous frappe, vous êtes presque assurés de retrouver vos données dans les tables MyISAM, avec la commande REPAIR TABLE . Si vos tables sont souvent constamment . Problèmes avec les tables MyISAM . REPAIR TABLE répare autant que possible les tables corrompues. La commande retourne la table suivante : Colonne Valeur Table Nom de la table Op Toujours ``repair'' Msg_type Un des statut status , error , info ou warning . Msg_text Le message. Notez que vous pourriez obtenir de nombreux messages pour chaque table. La dernière ligne doit être du format Msg_type status et doit être normalement OK . Si vous n'obtenez pas OK , vous devez essayer de réparer votre table avec la commande myisamchk ?o , car REPAIR TABLE de supporte pas encore toutes les options de myisamchk . Dans un futur proche, nous allons rendre cette commande encore plus souple. Si l'option QUICK est fournie, alors MySQL va essayer de ne réparer que le fichier d'index. Si vous utilisez l'option EXTENDED , alors MySQL va essayer de créer l'index ligne par ligne, au lieu de créer un index à la fois, par tri. C'est une méthode qui peut s'avérer plus efficace que de trier sur des clés de taille fixe, si vous avez des clés CHAR longues qui se compressent bien. Ce type de 4.4.5 Syntaxe de REPAIR TABLE 213 Manuel MySQL 4.1.x ? Version Française réparation est l'équivalent de myisamchk ??safe?recover . Depuis MySQL 4.0.2, il existe le mode USE_FRM pour REPAIR . Utilisez?le si le fichier .MYI manque, ou si son entête est corrompu. Avec ce mode, MySQL va recréer la table, en utilisant les informations dans le fichier .frm . Ce type de réparation ne peut pas être fait avec myisamchk . 4.4.6 Utilisation de myisamchk pour la maintenance des tables et leur recouvrement A partir de la version 3.23.13 de MySQL, vous pouvez vérifier vos tables MyISAM avec la commande CHECK TABLEcommande REPAIR TABLE . Syntaxe de REPAIR TABLE . Pour vérifier/réparer les tables MyISAM ( .MYI et .MYD ) vous devez utiliser l'utilitaire myisamchk . Pour vérifier/réparer les tables ISAM ( .ISM et .ISD ) vous devez utiliser l'utilitaire isamchk . Types de tables MySQL . Dans ce qui suit, nous allons parler de myisamchk , mais tout s'applique aussi à l'ancien isamchk . Vous pouvez utiliser l'utilitaire myisamchk pour obtenir des informations à propos des tables de la base de données, les vérifier et réparer, ou les optimiser. La section suivante décrit comment invoquer myisamchk (incluant une description de ses options), comment mettre en place un planificateur de maintenance, et comment utiliser les différentes fonctionnalités de myisamchk . Vous pouvez, dans la plupart des cas, utiliser la commande OPTIMIZE TABLES pour optimiser et réparer les tables, mais ce n'est ni aussi rapide, ni aussi sûr (en cas d'erreurs fatales réelles) que myisamchk . D'un autre côté, OPTIMIZE TABLE est plus facile à utiliser et vous n'avez pas besoin de vous occuper de libérer les tables. Syntaxe de OPTIMIZE TABLE . Même si la réparation de myisamchk est assez sécurisée, il est toujours bon de créer une sauvegarde avant d'effectuer les réparations (ou quoi que ce soit qui puisse entraîner de grosses modifications sur la table) 4.4.6.1 Syntaxe de l'utilitaire myisamchk myisamchk s'exécute avec une commande de la forme : shell> myisamchk [options] tbl_name Les options spécifient ce que vous voulez que myisamchk fasse. Elles sont décrites dans ce chapitre. Vous pouvez aussi obtenir une liste d'options en invoquant le programme avec myisamchk ??help . Sans option, myisamchk va simplement vérifier les tables. Pour obtenir plus d'information ou pour demander à myisamchk de prendre des mesures correctives, il faut ajouter l'une des options listées ici. tbl_name est la table que vous voulez réparer ou vérifier. Si vous exécutez myisamchk autre part que dans le dossier de données, vous devez spécifier le chemin jusqu'au fichier, car sinon, myisamchk n'aura aucune idée d'où chercher les données dans votre base. En fait, myisamchk ne se préoccupe pas du fait que le fichier que vous utilisez est dans le dossier de base ou pas : vous pouvez copier le fichier à réparer dans un autre dossier, et y faire les opérations d'entretien. 4.4.6 Utilisation de myisamchk pour la maintenance des tables et leur recouvrement 214 Manuel MySQL 4.1.x ? Version Française Vous pouvez spécifier plusieurs noms de tables à myisamchk si vous le voulez. Vous pouvez aussi spécifier un nom sous la forme d'un fichier d'index (avec l'option .MYI ), qui vous permettra de spécifier toutes les tables dans un dossier en utilisant le schéma *.MYI . Par exemple, si vous êtes dans le dossier de données, vous pouvez spécifier toutes les tables dans le dossier comme ceci : shell> myisamchk *.MYI Si vous n'êtes pas dans le dossier de données, et que vous souhaitez vérifier toutes les tables, vous devez ajouter le chemin jusqu'au dossier : shell> myisamchk /path/to/database_dir/*.MYI Vous pouvez même vérifier toutes les tables de toutes les bases avec le chemin suivant : shell> myisamchk /path/to/datadir/*/*.MYI La méthode recommandée pour vérifier rapidement toutes les tables est : myisamchk ??silent ??fast /path/to/datadir/*/*.MYI isamchk ??silent /path/to/datadir/*/*.ISM Si vous voulez vérifier toutes les tables et réparer celles qui sont corrompues, vous pouvez utiliser la ligne suivante : myisamchk ??silent ??force ??fast ??update?state ?O key_buffer=64M \ ?O sort_buffer=64M ?O read_buffer=1M ?O write_buffer=1M \ /path/to/datadir/*/*.MYI isamchk ??silent ??force ?O key_buffer=64M ?O sort_buffer=64M \ ?O read_buffer=1M ?O write_buffer=1M /path/to/datadir/*/*.ISM La commande ci?dessus suppose que vous avez plus de 64 Mo de libres. Notez que si vous obtenez une erreur comme celle?ci : myisamchk: warning: 1 clients is using or hasn't closed the table properly Cela signifie que vous essayez de vérifier une table qui a été modifiée par un autre programme (comme le serveur mysqld ) qui n'a pas encore refermé le fichier de table, ou que le fichier n'a pas été correctement refermé. Si mysqld fonctionne, vous devez forcer la fermeture correcte des fichiers de tables avec la commande FLUSH TABLES , et vous assurer que personne n'utilise les tables durant vos opérations avec myisamchk . En MySQL version 3.23, la meilleure méthode pour éviter ce problème est d'utiliser la commande CHECK TABLE au lieu de myisamchk pour vérifier les tables. 4.4.6.2 Options générales de myisamchk myisamchk supporte les options suivantes : ?# or ??debug=debug_options Affiche le log de débogage. La chaîne debug_options vaut souvent : 'd:t:o,filename' . ?? or ??help Affiche le message d'aide, et termine le programme. ?O var=option, ??set?variable var=option Spécifie la valeur d'une variable. Notez bien que ??set?variable est obsolète depuis MySQL 4.0, il suffit désormais d'utiliser ??var=option . Les variables disponibles et leur valeurs par défaut sont accessibles avec la commande myisamchk ??help : Variable Valeur key_buffer_size 523264 4.4.6.2 Options générales de myisamchk 215 Manuel MySQL 4.1.x ? Version Française read_buffer_size 262136 write_buffer_size 262136 sort_buffer_size 2097144 sort_key_blocks 16 decode_bits 9 sort_buffer_size est utilisée pour la réparation de clés, en les triant, ce qui est le cas par défaut avec l'option ??recover . key_buffer_size est utilisée lorsque vous vérifiez une table avec l'option ??extended?check ou lorsque les clés sont réparées par insertion des clés ligne par ligne (comme lors des insertions normales). La réparation via le buffer de clé est utilisée dans les situations suivantes : Si vous utilisez l'option ??safe?recover . Si les fichiers temporaires où il faut trier les clés, seront deux fois plus grands que lors de la création direct du fichier de clé. C'est souvent le cas lorsque vous avez de grandes colonnes de type CHAR , VARCHAR ou TEXT car le tri doit stocker la valeur totale de la colonne durant l'opération. Si vous avez beaucoup d'espace disque temporaire, et que vous pouvez forcer myisamchk à réparer avec la méthode de tri, vous pouvez utiliser l'option ??sort?recover . La réparation avec la méthode du buffer de clé prend bien moins d'espace disque que d'utiliser le tri, mais c'est aussi bien plus lent. Si vous voulez une réparation plus rapide, donnez à la variable ci?dessus la valeur du quart de votre mémoire disponible. Vous pouvez donner de grandes valeurs aux deux variables, car seul un des deux tampons décrits sera utilisé. ?s or ??silent Mode silencieux. N'affiche que les erreurs. Vous pouvez utiliser deux fois cette option ( ?ss ) pour rendre myisamchk très silencieux. ?v or ??verbose Mode détaillé. Affiche beaucoup de détails sur les opérations en cours. Vous pouvez l'utiliser avec les options ?d et ?e . Utilisez ?v plusieurs fois pour avoir encore plus d'informations ( ?vv , ?vvv )! ?V or ??version Affiche la version de myisamchk et s'arrête. ?w or, ??wait Au lieu d'afficher une erreur si la table est verrouillée, attend jusqu'à ce que la table soit libre avant de continuer. Notez que si vous utilisez mysqld avec l'option ??skip?external?locking , la table ne pourra être verrouillée que par une autre commande myisamchk . 4.4.6.3 Options de vérifications pour myisamchk ?c ou ??check Vérifie les erreurs d'une table. Ceci est l'opération par défaut de myisamchk si vous ne lui donnez aucune autre option. ?e ou ??extend?check Vérifie la table minutieusement (ce qui est un peu lent si vous avez des index). Cette option ne doit être utilisée que pour les cas extrèmes. Normalement, myisamchk ou myisamchk ??medium?check devrait, dans la plupart des cas, être capable de trouver s'il y'a des erreurs dans la table. 4.4.6.3 Options de vérifications pour myisamchk 216 Manuel MySQL 4.1.x ? Version Française Si vous utilisez ??extended?check et que vous avez beaucoup de mémoire, vous devez augmenter de beaucoup la valeur de key_buffer_size ! ?F ou ??fast Ne vérifie que les tables qui n'ont pas été fermées proprement. ?C ou ??check?only?changed Ne vérifie que les tables qui ont changé depuis la dernière vérification. ?f ou ??force Redémarrez myisamchk avec ?r (répare) sur la table, si myisamchk trouve une erreur dans la table. ?i ou ??information Affiche des statistiques à propos de la table vérifiée. ?m ou ??medium?check Plus rapide que extended?check, mais ne trouve que 99.99% des erreurs. Devrait, cependant, être bon pour la plupart des cas. ?U ou ??update?state Enregistre dans le fichier .MYI lorsque la table à été vérifiée ou a crashé. Cela devrait être utilisé pour tirer tous les avantages de l'option ??check?only?changed , mais vous ne devez pas utiliser cette option si le serveur mysqld utilise cette table et que vous utilisez mysqld avec ??skip?external?locking . ?T ou ??read?only Ne marque pas la table comme vérifiée. C'est pratique si vous utilisez myisamchk pour vérifier une table issue d'une autre application qui n'utilise pas les verrous. (comme mysqld ??skip?external?locking ). 4.4.6.4 Options de réparation de myisamchk Les options suivantes sont utilisées avec myisamchk et l'option de réparation ?r ou ?o : ?D # ou ??data?file?length=# Taille maximale du fichier de données (lors de la recréation du fichier de données, et qu'il est 'complet'). ?e ou ??extend?check Essaie de retrouver toutes les lignes possibles du fichier de données. Normalement, cette option va aussi découvrir beaucoup de ligne erronées. N'utilisez pas cette option si vous n'êtes pas totalement desespéré. ?f ou ??force Ecrase les anciens fichiers temporaires ( ) au lieu d'annuler. ?k # ou keys?used=# Si vous utilisez les tables ISAM, indique au gestionnaire de table ISAM qu'il doit uniquement modifier les # premiers index. Si vous utilisez le gestionnaire de table MyISAM , cette option indique quelles clés utiliser, et chaque bit binaire représente une clé (la première clé est le bit 0). Cela permet de réaliser des insertions plus rapides. Les index désactivés pourront être réactivés avec l'option myisamchk ?r . ?l ou ??no?symlinks Ne pas suivre les lignes symboliques. Normalement, myisamchk répare les tables qu'un lien symbolique représente. Cette option n'existe pas en MySQL 4.0, car MySQL 4.0 ne va pas supprimer les liens symboliques durant la réparation. ?r ou ??recover Peut réparer presque tout, sauf les clés uniques qui ne le sont plus (ce qui est extrêmement rare avec les tables ISAM/MyISAM). Si vous voulez restaurer un table, c'est l'option à utiliser en premier. Si myisamchk indique que la table ne peut pas être corrigée avec l'option ?r , vous pouvez alors passer à l'option ?o . Notez que dans le 4.4.6.4 Options de réparation de myisamchk 217 Manuel MySQL 4.1.x ? Version Française cas rarissime où ?r , le fichier de données est toujours intact. Si vous avez beaucoup de mémoire, vous pouvez augmenter la taille du buffer sort_buffer_size ! ?o ou ??safe?recover Utilise une ancienne méthode de restauration (lit toutes les lignes dans l'ordre, et modifie l'arbre d'index conformément pour les lignes trouvées). C'est une méthode qui est beaucoup plus lente que l'option ?r , mais elle est capable de traiter certaines situations exceptionnelles que ?r ne pourrait pas traiter. Cette méthode utilise aussi moins d'espace disque que ?r . Normalement, vous devriez commencer à réparer avec l'option ?r , et uniquement sur l'échec de cette option, passer à ?o .Si vous avez beaucoup de mémoire, vous devriez augmenter la taille du buffer de clé ! key_buffer_size ! ?n ou ??sort?recover Force myisamchk à utiliser le tri pour résoudre les clés, même si le fichier temporaire doit être énorme. ??character?sets?dir=... Dossier qui contient les jeux de caractères. ??set?character?set=name Change le jeu de caractères utilisé par l'index. ?t ou ??tmpdir=path Chemin pour stocker les fichiers temporaires. Si cette option n'est pas fournie, myisamchk va utiliser la variable d'environnement TMPDIR pour cela. ?q ou ??quick Réparation rapide, sans modifier le fichier de données. Il est possible d'ajouter l'option ?q pour forcer myisamchk à modifier le fichier original en cas de clés doublons. ?u ou ??unpack Décompresse des données compressées avec myisampack. 4.4.6.5 Autres options de myisamchk Les autres actions que myisamchk peut réaliser, en dehors de vérifier et réparer une table sont : ?a or ??analyze Analyser la distribution des clés. Cela améliore les performances des jointures en permettant à l'optimiseur de jointure de mieux choisir l'ordre d'utilisation des clés. myisamchk ??describe ??verbose table_name' ou SHOW KEYS dans MySQL. ?d or ??description Affiche des informations sur la table. ?A or ??set?auto?increment[=value] Force AUTO_INCREMENT à commencer avec une valeur supérieure. Si aucune valeur n'est fournie, la prochaien valeur de la colonne AUTO_INCREMENT sera la plus grande valeur de la colonne +1. ?S or ??sort?index Trie les blocs de l'arbre d'index dans l'ordre haut?bas. Cela va optimiser les recherches, et les scans de tables par clés. ?R or ??sort?records=# Trie les lignes en fonction de l'index. Cela rassemble vos données, et peut accélérer les lectures de lignes par intervalle avec SELECT et ORDER BY sur cet index (ce tri peut être TRES lent la première fois). Pour connaitre les numéros d'index de tables, utilisez la commande SHOW INDEX , qui affiche les index dans le même ordre que myisamchk ne les voit. Les index sont numérotés à partir de 1. 4.4.6.5 Autres options de myisamchk 218 Manuel MySQL 4.1.x ? Version Française 4.4.6.6 Utilisation de la mémoire par myisamchk L'espace mémoire est très important quand vous utilisez myisamchk . myisamchk n'utilise pas plus de mémoire que ce que vous spécifiez avec les options ?O . Si vous pensez utiliser myisamchk sur des fichiers très grands, vous devez d'abord décider la quantité de mémoire que vous souhaitez utiliser. Avec des valeurs plus grandes, vous pouvez accélérer myisamchk . Par exemple, si vous avez plus de 32 Mo de RAM, vous pourriez utiliser les options suivantes (en plus des autres options que vous pourriez spécifier) : shell> myisamchk ?O sort=16M ?O key=16M ?O read=1M ?O write=1M ... Utiliser ?O sort=16M sera probablement suffisant pour la plupart des cas.Soyez conscient que myisamchk utilise des fichiers temporaires dans le dossier TMPDIR . Si TMPDIR est un fichier en mémoire, vous pourriez facilement rencontrer des erreurs de mémoire. Si cela arrive, choisissez une autre valeur pour TMPDIR , avec plus d'espace disque, et redémarrez myisamchk . Lors de la réparation, myisamchk va aussi avoir besoin d'espace disque : Doublez la taille du fichier de données (l'original plus une copie). Cet espace n'est pas • nécessaire si vous faites des réparations de type ??quick , car dans ce cas, seul le fichier d'index sera recréé. Cet espace est nécessaire sur le même disque que l'original ! De l'espace pour le nouveau fichier d'index qui remplacera l'ancien. L'ancien fichier d'index • est réduit dès le démarrage, ce qui vous permet généralement d'ignorer cet espace. Cet espace est nécessaire sur le même disque que l'original ! Lorsque vous utilisez les options • ??recover ou ??sort?recover (mais pas lorsque vous utilisez ??safe?recover ), vous aurez besoin d'espace pour le buffer de tri : (plus_grande_cle + taille_du_pointeur_de_ligne)*nombre_de_lignes * 2 . Vous pouvez vérifier la taille des clés et la taille du pointeur de ligne avec la commande myisamchk ?dv table . Cet espace est alloué sur le disque temporaire (spécifié par TMPDIR par ??tmpdir=# ). Si vous avez des problèmes avec l'espace disque durant la réparation, vous pouvez utiliser l'option ??safe?recover au lieu de ??recover . 4.4.6.7 Utiliser myisamchk pour restaurer une table Si vous utilisez mysqld avec l'option ??skip?external?locking (qui est la configuration par défaut pour certains systèmes, comme Linux), vous ne pouvez pas utiliser myisamchk pour vérifier une table, lorsque mysqld utilise aussi la table. Si vous pouvez être sûr que personne n'utilise cette table via mysqld lorsque vous utilisez myisamchk , vous n'aurez qu'à utiliser la commande mysqladmin flush?tables avant de commencer à vérifier les tables. Si vous ne pouvez pas garantir cette condition, vous devez alors éteindre le serveur mysqld pour vérifier les tables. Si vous exécutez myisamchk alors que mysqld modifie la table, vous pourriez obtenir un diagnostic de corruption de la table, alors que ce n'est pas le cas. Si vous n'utilisez pas l'option ??skip?external?locking , vous pouvez vous servir de myisamchk pour vérifier les tables à tout moment. Pendant que vous le faites, les autres clients qui tentent de modifier la table devront attendre que myisamchk ait fini. Si vous utilisez myisamchk pour réparer ou optimiser les tables, vous devez toujours vous assurer que mysqld n'utilise pas cette table (ce qui s'applique aussi si vous utilisez ??skip?external?locking ). Si vous n'éteignez pas le serveur mysqld , vous devez au moins utiliser mysqladmin flush?tables avant de lancer myisamchk . Vos tables peuvent être corrompues si le serveur et myisamchk travaillent dans une même table simultanément. 4.4.6.6 Utilisation de la mémoire par myisamchk 219 Manuel MySQL 4.1.x ? Version Française Ce chapitre décrit comment vérifier et gérer les corruptions de données dans les bases MySQL. Si vos tables sont fréquemment corrompues, vous devriez commencer par en rechercher la raison ! Que faire si MySQL crashe constamment . La section sur les tables MyISAM contient différentes raisons pour lesquelles une table peut être corrompue. Problèmes avec les tables MyISAM . Lorsque vous effectuez une restauration de table, il est important que chaque table tbl_name dans une base corresponde aux trois fichiers dans le dossier de base, du dossier de données : Fichier Utilisation Définition de la table Fichier de données Fichier d'index Chacun de ces trois fichiers est sujet à des corruptions diverses, mais les problèmes surviennent généralement dans les fichiers de données ou d'index. myisamchk fonctionne en créant une copie du fichier .MYD (les données), ligne par ligne. Il termine sa réparation en supprimant l'ancien fichier .MYD et en renommant le nouveau à la place de l'ancien. Si vous utilisez l'option ??quick , myisamchk ne crée pas de fichier temporaire mais suppose plutôt que le fichier .MYD est correct et il génère simplement un nouveau fichier d'index sans toucher au fichier .MYD . C'est une méthode sécuritaire, car myisamchk va automatiquement détecter si le fichier .MYD est corrompu, et annulera alors la réparation si c'est le cas. Vous pouvez aussi ajouter deux options ??quick à myisamchk . Dans ce cas, myisamchk ne s'interrompt pas sur certaines erreurs (comme des clés doublons), et essaie de résoudre ce problème en modifiant le fichier .MYD . Normalement, l'utilisation de deux options ??quick n'est utile que si vous n'avez pas trop d'espace disque pour réaliser la réparation. Dans ce cas, vous devez au moins faire une copie de sauvegarde avant d'utiliser myisamchk . 4.4.6.8 Comment vérifier la cohérence d'une table Pour vérifier les tables de type MyISAM, utilisez les commandes suivantes : myisamchk nom_de_table Cette commande trouvera 99.99% de toutes les erreurs. Ce qu'elle ne peut pas découvrir comme erreurs, sont celles qui impliquent uniquement le fichier de données (ce qui est très inhabituel). Si vous voulez vérifier une table, vous devriez utiliser l'utilitaire myisamchk sans les options ou avec les options ?s ou ??silent . myisamchk ?m nom_de_table Cette commande trouvera 99.999% de toutes les erreurs. Elle vérifie toutes les entrées dans le fichier d'index, puis lit toutes les lignes. Elle calcule une somme de contrôle pour toutes les clés et les lignes, et vérifie que les deux se correspondent dans l'arbre d'index. myisamchk ?e nom_de_table Cette commande fait une vérification complète et exhaustive de toutes les données ( ?e signifie ``extended check''). Elle fait une lecture de contrôle de chaque ligne, pour vérifier qu'elle correspond bien aux index. Cette commande va prendre un long moment sur les grosses tables. myisamchk va normalement s'arrêter dès qu'il trouve une erreur. Si vous voulez obtenir plus d'information sur cette erreur, vous pouvez utiliser l'option ??verbose (ou ?v ). Cela fera que myisamchk va continuer à travailler et accumuler jusqu'à 20 erreurs. En utilisation normale, l'utilisation de cet utilitaire sans options est suffisante. myisamchk ?e ?i nom_de_table 4.4.6.8 Comment vérifier la cohérence d'une table 220 Manuel MySQL 4.1.x ? Version Française Comme les commandes précédentes, mais l'option ?i indique à myisamchk qu'il doit afficher des informations statistiques. 4.4.6.9 Comment réparer des tables Dans la section présente, nous allons uniquement parler de l'utilitaire myisamchk sur les tables MyISAM (extensions .MYI et .MYD ). Si vous utilisez les tables ISAM (extensions .ISM et .ISD ), vous devriez vous servir de isamchk à la place. Depuis MySQL version 3.23.14, vous pouvez réparer les tables MyISAM avec la commande SQL REPAIR TABLE . Syntaxe de REPAIR TABLE . Les symptômes de corruption de tables sont des requêtes qui s'interrompent inopinément : • locked against change : est verrouillée en écriture Can't find file • (Errcode: ###) : Impossible de trouver le fichier (Errcode: ###) Unexpected end of file : Fin de fichier inattendue • Record file is crashed : Fichier de données crashé • Got error ### from table handler : Reception de l'erreur ### de la part du gestionnaire de • tablePour obtenir plus d'informations sur l'erreur, vous pouvez exécuter la commande perror ### . Voici les erreurs les plus courantes : shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format : le fichier d'index est corrompu / le format du fichier est incorrect. 127 = Record?file is crashed : le fichier de données est corrompu. 132 = Old database file / ce fichier provient d'une vieille base de données. 134 = Record was already deleted (or record file crashed) / La ligne était déjà effacée. 135 = No more room in record file / Plus de place dans le fichier de données. 136 = No more room in index file / Plus de place dans le fichier d'index. 141 = Duplicate unique key or constraint on write or update / Doublon pour une clé unique trouvé durant la lecture ou l'écriture. 144 = Table is crashed and last repair failed / la table est corrompue et la dernière réparation a échoué. 145 = Table was marked as crashed and should be repaired / La table a été marquée comme corrompue et doit être réparée. Notez que l'erreur 135, "no more room in record file", n'est pas une erreur qui sera facile à corriger. Dans ce cas, vous devez utiliser la commande suivante : ALTER TABLE table MAX_ROWS=xxx AVG_ROW_LENGTH=yyy; Dans d'autres cas, vous devrez réparer vos tables. myisamchk peut généralement détecter et corriger la plupart des erreurs. Le processus de réparation se déroule en 4 étapes décrites ici. Avant de vous lancer, vous devriez vous placer dans le dossier de données et vérifier les permissions des fichiers de données. Assurez?vous qu'ils sont bien lisibles par l'utilisateur Unix que MySQL utilise (et à vous aussi, car vous aurez besoin d'accéder à ces fichiers durant la vérification. Si vous devez corriger ces fichiers, vous aurez aussi besoin des droits d'écriture. Si vous utilisez MySQL version 3.23.16 et plus récent, vous pouvez (et vous devriez) utiliser les commandes CHECK et REPAIR pour réparer vos tables MyISAMSyntaxe de REPAIR TABLE . La section du manuel sur l'entretien des tables inclut la présentation des options des utilitaires isamchk / myisamchkdonnées . La section suivante est destinée aux cas où les commandes ci?dessus ont échoué ou que vous voulez exploiter les fonctionnalités avancées que isamchk / myisamchk proposent. 4.4.6.9 Comment réparer des tables 221 Manuel MySQL 4.1.x ? Version Française Si vous allez réparer une table en ligne de commande, il est recommandé d'arrêter le serveur mysqld . Notez que lorque vous exécutez une commande mysqladmin shutdown sur un serveur distant, le serveur mysqld sera encore opérationnel pendant un instant après que mysqladmin ait terminé, jusqu'à ce que toutes les requêtes et toutes les clés aient été écrites sur le disque. Etape 1 : Vérifier vos tables Exécutez la commande myisamchk *.MYI ou myisamchk ?e *.MYI si vous avez plus de temps. Utilisez ?s (silencieux) pour supprimer les informations peu pertinentes. Si le serveur mysqld a terminé, vous devriez utiliser l'option ??update pour indiquer à myisamchk d'enregistrer la vérification des tables ('checked'). Vous n'aurez à réparer que les tables pour lesquelles myisamchk vous annonce une erreur. Pour de telles tables, passez à l'étape 2. Si vous obtenez des erreurs étranges lors de la vérification, (comme, l'erreur out of memory ), ou si myisamchk crashe, passez à l'étape 3. Etape 2 : réparation simple et facile Note : Si vous voulez réparer très rapidement, vous devriez ajouter ?O sort_buffer=# ?O key_buffer=# (où # vaut environ le quart de la mémoire du serveur), à toutes les commandes isamchk/myisamchk . Premièrement, essayez myisamchk ?r ?q tbl_name ( ?r ?q signifie ``mode de réparation rapide''). Cette commande va tenter de réparer le fichier d'index sans toucher au fichier de données. Si le fichier de données contient toutess les données qu'il est sensé contenir, et que les points d'ancrage pour les effacements sont corrects, cette commande doit réussir, et la table sera alors réparée. Passez alors à la table suivante. Sinon, suivez la procédure suivante : Faites une copie de sauvegarde de votre fichier de données. • Utilisez la commande • myisamchk ?r tbl_name ( ?r signifie ``mode de réparation''). Cette commande va supprimer les lignes invalides et effacer ces lignes du fichier de données, puis reconstruire le fichier d'index. Si l'instruction précédente a échoué, utilisez • myisamchk ??safe?recover tbl_name . Le mode restauration sécuritaire utilise une vieille méthode de réparation qui peut gérer certains cas rares, mais elle est bien plus lente. Si vous obtenez des erreurs étranges lors de la répaaration (comme des erreurs de type out of memory ), ou si myisamchk crashe, passez à l'étape 3. Etape 3 : Réparations difficiles Nous ne devriez atteindre cette étape que si les 16 premiers ko du fichier d'index sont détruits, ou qu'il contient des données erronées, ou si le fichier d'index manque. Dans ce cas, il est nécessaire de créer un nouveau fichier d'index. Faites ceci : Déplacez le fichier de données dans une archive sûre. • Utilisez le fichier description de la table pour créer de nouveaux fichiers de données et • d'index vides. shell> mysql db_name mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLE table_name; mysql> quit 4.4.6.9 Comment réparer des tables 222 Manuel MySQL 4.1.x ? Version Française Si votre version SQL ne dispose pas de TRUNCATE TABLE , utilisez la commande DELETE FROM table_name . Copiez l'ancien fichier de données à la place du nouveau fichier de données (ne faites pas • un simple déplacement de fichier. Utilisez une copie, au cas où un problème surviendrait). Retournez à l'étape 2. myisamchk ?r ?q doit alors fonctionner (et ceci ne doit pas être une boucle infinie). Depuis MySQL 4.0.2, vous pouvez aussi utiliser REPAIR ... USE_FRM qui effectue toute cette opération automatiquement. Etape 4 : Réparation très difficiles Vous ne devriez atteindre cette étape que si votre fichier de description a aussi crashé. Cela ne devrait jamais arriver, car le fichier de description n'est jamais modifié une fois que la table est créée. Restaurez le fichier de description avec une sauvegarde, et retournez à l'étape 3. Vous • pouvez aussi restaurer le fichier d'index et retourner à l'étape 2. Dans ce dernier cas, vous pouvez démarrer avec l'option myisamchk ?r . Si vous n'avez pas de sauvegarde, mais que vous savez exactement comment la table a été • créée, vous pouvez créer une telle table dans une autre base. Supprimez alors le nouveau fichier de données, puis déplacez les fichiers de description et d'index dans votre base de données crashée. Cela vous donnera un nouveau fichier d'index et de description. Retournez à l'étape 2 et essayez de reconstruire le fichier d'index. 4.4.6.10 Optimisation de tables Pour réorganiser les lignes fragmentées et éliminer l'espace perdu par les effacements et les modifications de lignes, vous pouvez exécuter l'utilitaire myisamchk en mode de restauration : shell> myisamchk ?r tbl_name Vous pouvez optimiser une table de la même façon que vous le faîtes avec la commande SQL OPTIMIZE TABLE . OPTIMIZE TABLE effectue une réparation de la table, et une analyse des index, puis trie l'arbre d'index pour accélérer les recherches de clés. L'utilisation de la commande réduit aussi les interférences entre le serveur et l'utilitaire car c'est le serveur lui?même qui fait le travail. Syntaxe de OPTIMIZE TABLE . myisamchk dispose aussi d'un grand nombre d'options que vous pouvez utiliser pour améliorer les performances de la table : ?S • , ??sort?index ?R index_num • , ??sort?records=index_num ?a • , ??analyze Pour une description complète de ces options, Syntaxe d'invocation de myisamchk . 4.4.7 Mettre en place un régime d'entretien de MySQL Depuis MySQL version 3.23.13, vous pouvez vérifier les tables de type MyISAM avec la commande CHECK TABLE . Syntaxe de CHECK TABLE . Vous pouvez aussi réparer les tables avec la 4.4.6.10 Optimisation de tables 223 Manuel MySQL 4.1.x ? Version Française commande REPAIR TABLE . Syntaxe de REPAIR TABLE . C'est une bonne idée que d'effectuer des vérifications des tables régulièrement, plutôt que d'attendre qu'un problème survienne. Pour faire ces vérifications, vous pouvez utiliser la commande myisamchk ?s . L'option ?s (raccourci pour ??silent ) fait que myisamchk s'exécute en mode silencieux, et n'affiche que les messages d'erreurs. C'est aussi une bonne idée que de vérifier les tables lorsque le serveur démarre. Par exemple, à chaque fois qu'une machine redémarre au milieu d'une modification de table, vous devrez faire une vérification de toutes les tables qui pourraient être affectées : c'est une ``table supposéement corrompue''. Vous pouvez ajouter un test à safe_mysqld pour qu'il exécute myisamchk , afin de vérifier toutes les tables qui ont été modifiées dans les 24 dernières heures, si il reste un vieux fichier .pid (identifiant de processus) après un redémarrage : le fichier .pid est créé par le serveur mysqld lorsqu'il démarre, et il est supprimé lorsque le serveur s'arrête dans des conditions normales. La présence d'un fichier .pid au démarrage indique que le serveur s'est arrêté anormalement. Un test encore meilleur serait de vérifier toutes les tables dont la date de modification est plus récente que celle du fichier .pid . Vous devriez aussi vérifiez vos tables régulièrement durant les opérations normales. Chez MySQL AB, nous utilisons une tâche en cron pour vérifier toutes nos tables importantes au moins une fois par semaine, avec une ligne comme celle?ci dans le fichier crontab : 35 0 * * 0 /path/to/myisamchk ??fast ??silent /path/to/datadir/*/*.MYI Cela nous affiche les informations sur les tables qui ont été corrompues, de façon à ce que nous puissions les examiner et les réparer. Comme nous n'avons jamais eu de table qui se soit corrompue inopinément (des tables qui se corrompent pour d'autres raisons que des problèmes matériels) depuis quelques années (ce qui est véridique), une fois par semaine est un bon rythme pour nous. Nous recommandons que vous commenciez par exécuter la commande myisamchk ?s chaque nuit, sur toutes les tables qui ont été modifiées dans les 24 dernières heures, jusqu'à ce que vous preniez confiance en MySQL. Normalement, vous n'avez pas à maintenir autant les tables MySQL. Si vous changez les tables avec un format de ligne dynamique (les tables avec des colonnes VARCHAR , BLOB ou TEXT ) ou que vous avez des tables avec de nombreuses lignes effacées, vous pouvez envisager de faire des défragmentations du fichier, pour récupérer cet espace. Une fois par mois est un bon rythme. Vous pouvez faire cela avec la commande SQL OPTIMIZE TABLE sur les tables en question, ou bien, si vous avez éteint le serveur mysqld , faites : isamchk ?r ??silent ??sort?index ?O sort_buffer_size=16M */*.ISM myisamchk ?r ??silent ??sort?index ?O sort_buffer_size=16M */*.MYI 4.4.8 Obtenir des informations sur une table Pour obtenir la description d'une table ou des statistiques à son sujet, utiliser les commandes affichées ici. Nous allons expliquer certains de leurs détails ultérieurement. myisamchk ?d nom_de_table Exécute • myisamchk en ``mode description'' pour produire 4.4.8 Obtenir des informations sur une table 224 Manuel MySQL 4.1.x ? Version Française une description de votre table. Si vous démarrez le serveur MySQL en utilisant l'option ??skip?external?locking , myisamchk va rapporter une erreur si la table est modifiée durant l'exécution de la commande. Cependant, comme myisamchk ne modifie pas les tables, durant le mode description, il n'y a pas de risque de perte de données. myisamchk ?d ?v nom_de_table Pour produire plus d'informations durant l'exécution de • myisamchk , ajoutez l'option ?v pour indiquer qu'elle doit fonctionner en mode détaillé. myisamchk ?eis nom_de_table Affiche les informations les plus importantes pour une table. • C'est une commande lente, car elle doit lire toute la table. myisamchk ?eiv nom_de_table C'est l'équivalent de • ?eis , mais qui vous indique ce qui se passe. Exemple d'affichage résultant de myisamchk ?d : MyISAM file: Record format: Fixed length Data records: 1403698 Deleted blocks: 0 Recordlength: 226 table description: Key Start Len Index Type 1 2 8 unique double 2 15 10 multip. text packed stripped 3 219 8 multip. double 4 63 10 multip. text packed stripped 5 167 2 multip. unsigned short 6 177 4 multip. unsigned long 7 155 4 multip. text 8 138 4 multip. unsigned long 9 177 4 multip. unsigned long 193 1 text Exemple d'affichage résultant de myisamchk ?d ?v : MyISAM file: company Record format: Fixed length File?version: 1 Creation time: 1999?10?30 12:12:51 Recover time: 1999?10?31 19:13:01 Status: checked Data records: 1403698 Deleted blocks: 0 Datafile parts: 1403698 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3 Max datafile length: 3791650815 Max keyfile length: 4294967294 Recordlength: 226 table description: Key Start Len Index Type Rec/key Root Blocksize 1 2 8 unique double 1 15845376 1024 2 15 10 multip. text packed stripped 2 25062400 1024 3 219 8 multip. double 73 40907776 1024 4 63 10 multip. text packed stripped 5 48097280 1024 5 167 2 multip. unsigned short 4840 55200768 1024 6 177 4 multip. unsigned long 1346 65145856 1024 7 155 4 multip. text 4995 75090944 1024 8 138 4 multip. unsigned long 87 85036032 1024 9 177 4 multip. unsigned long 178 96481280 1024 193 1 text Exemple d'affichage résultant de myisamchk ?eis : Checking MyISAM file: company Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 4.4.8 Obtenir des informations sur une table 225 Manuel MySQL 4.1.x ? Version Française Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 Total: Keyblocks used: 98% Packed: 17% Records: 1403698 M.recordlength: 226 Packed: 0% Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 Record blocks: 1403698 Delete blocks: 0 Recorddata: 317235748 Deleted data: 0 Lost space: 0 Linkdata: 0 User time 1626.51, System time 232.36 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 627, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 639, Involuntary context switches 28966 Exemple d'affichage résultant de myisamchk ?eiv : Checking MyISAM file: company Data records: 1403698 Deleted blocks: 0 ? check file?size ? check delete?chain block_size 1024: index 1: index 2: index 3: index 4: index 5: index 6: index 7: index 8: index 9: No recordlinks ? check index reference ? check data record references index: 1 Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 ? check data record references index: 2 Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 ? check data record references index: 3 Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 ? check data record references index: 4 Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 ? check data record references index: 5 Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 ? check data record references index: 6 Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 ? check data record references index: 7 Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 ? check data record references index: 8 Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 ? check data record references index: 9 Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 Total: Keyblocks used: 9% Packed: 17% ? check records and index references [LOTS OF ROW NUMBERS DELETED] Records: 1403698 M.recordlength: 226 Packed: 0% Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 Record blocks: 1403698 Delete blocks: 0 Recorddata: 317235748 Deleted data: 0 Lost space: 0 Linkdata: 0 User time 1639.63, System time 251.61 Maximum resident set size 0, Integral resident set size 0 4.4.8 Obtenir des informations sur une table 226 Manuel MySQL 4.1.x ? Version Française Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0 Blocks in 4 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 10604, Involuntary context switches 122798 Voici les tailles des fichiers de données et d'index utilisés dans les tables précédentes : ?rw?rw?r?? 1 monty tcx 317235748 Jan 12 17:30 ?rw?rw?r?? 1 davida tcx 96482304 Jan 12 18:35 Des détails sur les types d'informations retournés par myisamchk sont listés ici. Le ``keyfile'' est le fichier d'index. ``Record'' et ``row'' sont synonymes de ligne : ISAM file Nom du fichier d'index ISAM. • Isam?version Version du format ISAM. Actuellement, c'est toujours 2. • Creation time Date de création du fichier de données. • Recover time Date de dernière reconstruction du fichier de données ou d'index. • Data records Combien de lignes sont stockées dans la table. • Deleted blocks Combien de blocs effacés occupent toujours de l'espace. Vous pouvez • Data file: Parts Pour les tables au format de ligne dynamique, ceci indique combien de blocs • de données sont présents. Pour une table optimisée sans lignes fragmentées, la valeur doit être égale à Data records . Deleted data Combien d'octets de données effacées et non réutilisées sont présents dans la • Data file pointer La taille du pointeur de fichier de données, en octets. C'est généralement 2, • 3, 4, ou 5 octets. La plupart des tables peuvent se gérer avec 2 octets, mais ceci ne peut être contrôlé par MySQL actuellement. Pour les tables à format de ligne fixe, c'est une adresse de ligne. Pour les tables dynamiques, c'est une adresse d'octet. Keyfile pointer La taille du pointeur de fichier d'index, en octets. C'est généralement 1, 2 ou • 3 octets. La plupart des tables supportent 2 octets, mais cela est calculé automatiquement par MySQL. C'est toujours une adresse de bloc. Max datafile length Taille maximale du fichier de données ( • .MYD file), en octets. Max keyfile length Taille maximale du fichier d'index ( • .MYI file), en octets. Recordlength Taille occupée par chaque ligne, en octets. • Record format Le format utilisé pour stocker les lignes de la table. Les exemples ci?dessus • utilisaient Fixed length . Les autres valeurs possibles sont Compressed et Packed . table description Une liste de toutes les clés de la table. Pour chaque clé, des informations • de bas niveau sont présentées : Key Le numéro d'index. ? Start Où, dans la ligne, l'index débute. ? Len Taille de cette partie d'index. Pour les nombres compactés, c'est toujours la taille ? maximale de la colonne. Pour les chaînes, c'est plus petit que la taille maximale de la colonne index, car vous pouvez indexer un préfixe de la chaîne. Index ? unique et multip. (multiple). Indique si une valeur peut exister plusieurs fois dans cet index. Type De quel type de données cet index est. C'est un type de données ISAM avec ? les options packed , stripped ou empty . Root Adresse du premier bloc d'index. ? Blocksize La taille de chaque bloc d'index. Par défaut, c'est 1024, mais cette valeur ? peut être modifiée lors de la compilation. Rec/key C'est une valeur statistique, utilisée par l'optimisateur. Il indique combien de ? lignes sont disponibles par valeur de cette clé. Une clé unique aura toujours une valeur de 1. Cela peut être modifié une fois que la table est chargée (ou modifiée de façon majeure), avec la commande myisamchk ?a . Si ce n'est pas mis à jour, une valeur par défaut de 30 est utilisée. Dans le premier exemple ci?dessus, la neuvième clé est une clé multi?partie, avec deux • parties. 4.4.8 Obtenir des informations sur une table 227 Manuel MySQL 4.1.x ? Version Française Keyblocks used Quel pourcentage des blocs de clé est utilisé. Comme les tables utilisées • dans les exemples ont tout juste été réorganisées avec myisamchk , ces valeurs sont très grandes (très proches du maximum théorique). Packed MySQL essaie de compacter les clés ayant un préfixe commun. Cela ne peut être • utilisé que pour les colonnes de type CHAR / VARCHAR / DECIMAL . Pour les longues chaînes comme des noms, cette technique va significativement réduire l'espace utilisé. Dans le troisième exemple ci?dessus, la quatrième clé fait 10 caractères de long et a une réduction de 60 % dans l'espace utilisé effectivement. Max levels La profondeur du B?tree. Les grandes tables avec de longues clés peuvent • obtenir de grandes valeurs. Records Combien de lignes sont enregistrées dans la table. • M.recordlength La taille moyenne d'une ligne. Pour les tables avec un format de ligne • statique, c'est la taille de chaque ligne. Packed MySQL efface les espaces à la fin des chaînes. • Packed indique le pourcentage d'économie d'espace réalisé. Recordspace used Quel est le pourcentage d'utilisation du fichier de données. • Empty space Quel est le pourcentage d'utilisation du fichier d'index. • Blocks/Record Le nombre moyen de blocs par enregistrements (c'est à dire, de combien de • liens une ligne fragmentées est constituée). C'est toujours 1.0 pour les tables à format de ligne statique. Cette valeur doit être aussi proche que possible de 1.0. Si elle grossit trop, vous pouvez réorganiser la table avec myisamchkRecordblocks Combien de blocs sont utilisés. Pour les tables à format de ligne fixe, c'est le • même nombre que le nombre de lignes. Deleteblocks Combien de blocs (liens) sont effacés. • Recorddata Combien d'octets sont utilisés dans le fichier. • Deleted data Combien d'octets dans le fichier de données sont effacés (inutilisés). • Lost space Si une ligne est modifiée, et réduite en taille, de l'espace est perdu. Ce chiffre est • la somme de ces espaces perdus, en octets. Linkdata Lorsque le format de ligne dynamique est utilisé, les fragments de lignes sont liés • avec des pointeurs de (4 à 7 octets chacun). Linkdata est la somme du stockage utilisé par ces pointeurs. Si une table a été compressée avec myisampack , myisamchk ?d affiche des informations signification. 4.5 Référence de langage d'administration de la base de données 4.5.1 Syntaxe de OPTIMIZE TABLE OPTIMIZE TABLE tbl_name[,tbl_name]... OPTIMIZE TABLE doit être utilisée si une grande partie de la base a été effacée, ou si vous avez fait de nombreuses modificaitons dans une table à format de ligne dynamique (des tables qui ont des colonnes de type VARCHAR , BLOB et TEXT ). Les lignes effacées sont conservées dans une liste, et les prochaines opérations d' INSERT réutilisent les vieilles positions de lignes. Vous pouvez vous servir de la commande OPTIMIZE TABLE pour récupérer l'espace utilisé et défragmenter le fichier de donné le moment, OPTIMIZE TABLE fonctionne uniquement avec les tables de type MyISAM et BDB . Pour les tables BDB , OPTIMIZE TABLE est actuellement l'équivalent de 4.5 Référence de langage d'administration de la base de données 228 Manuel MySQL 4.1.x ? Version Française ANALYZE TABLE . Syntaxe de ANALYZE TABLE . Vous pouvez vous arranger pour que OPTIMIZE TABLE fonctionne sur d'autres types de tables, en démarrant mysqld avec ??skip?new ou ??safe?mode , mais dans ce cas, OPTIMIZE TABLE est simplement l'équivalent de ALTER TABLE . OPTIMIZE TABLE fonctionne comme ceci : Si la table contient des lignes effacées ou des lignes fragmentées, la table est compactée. • Si les pages d'index ne sont pas triées, • OPTIMIZE TABLE les trie. Si les statistiques ne sont pas à jour (et que la table n'a pas pu effectuer de réparation en triant l'index), elles sont mises à jour. OPTIMIZE TABLE pour les tables MyISAM est l'équivalent de la commande myisamchk ??quick ??check?only?changed ??sort?index ??analyze sur la table. Notez que la table est verrouilée durant la commande OPTIMIZE TABLE . 4.5.2 Syntaxe de ANALYZE TABLE ANALYZE TABLE nom_de_table[,nom_de_table...] Cette commande analyse et stocke la clé de distribution de la table. Durant l'analyse, la table est verrouilée en lecture. Cette commande fonctionne avec les tables MyISAM et BDB . C'est l'équivalent de la commande en ligne myisamchk ?a . MySQL utilise les clés de distribution pour décider dans quel ordre les tables doivent être rassemblées lors des jointures qui ne s'effectuent pas sur une constante. La commande retourne une table avec les colonnes suivantes : Colonne Valeur Table Nom de la table Op ``analyze'' (toujours) Msg_type Un des status , error , info ou warning . Msg_text Le message. Vous pouvez vérifier la clé de distribution stockée avec la commande SHOW INDEXinformations sur les bases, colonnes, tables ou index . Si la table n'a pas changé depuis la dernière commande ANALYZE TABLE , elle ne sera pas analysée à nouveau. 4.5.3 Syntaxe de FLUSH FLUSH flush_option [,flush_option] ... Vous devez utiliser la commande FLUSH si vous voulez effacer certains caches internes de MySQL. Pour exécuter FLUSH , vous devez avoir le droit RELOAD . 4.5.2 Syntaxe de ANALYZE TABLE 229 Manuel MySQL 4.1.x ? Version Française flush_option peut être l'une des suivantes : Option Description Vide le cache des hôtes. Vous devez vider ce cache si certaines des adresses IP de vos clients changent, ou si vous obtenez des erreurs du type Host ... is blocked . Lorsque plus de max_connect_errors erreurs successives surviennent pour un HOSTS hôte, lors des connexions au serveur MySQL, MySQL suppose qu'il y blocked . Vous pouvez démarrer mysqld avec ?O max_connect_errors=999999999 pour éviter ce message. Recharge les clés DES depuis le fichier de stockage spécifié par DES_KEY_FILE ??des?key?file lors du démarrage du serveur. Ferme et réouvre tous les fichiers de log. Si vous avez spécifié un fichier de log de mise à jour, ou un fichier de log binaire sans extension, le numéro d'extension du fichier de log sera incrémenté LOGS d'une unité. Si vous avez utilisé une extension dans le nom du fichier, Ceci est la même chose que d'envoyer le signal SIGHUP au serveur mysqld . PRIVILEGES Recharge les privilèges des tables de droits dans la base mysql . Défragmente le cache des requêtes pour mieux en utiliser la QUERY CACHE mémoire. Cette commande n'effacera aucune requête du cache, à la différence de RESET QUERY CACHE . Ferme toutes les tables ouvertes, et force les tables utilisées à se TABLES refermer. Cela vide aussi le cache de requêtes. [TABLE | TABLES] nom_de_table Vide du cache uniquement les tables nommées. [,nom_de_table...] Ferme toutes les tables ouvertes, et verrouille en lecture toute les tables et bases, jusqu'à ce que vous exécutiez une commande TABLES WITH READ LOCK UNLOCK TABLES . C'est très pratique pour générer des sauvegardes, si vous avez un système de fichiers comme Veritas, qui peut prendre des photos du système. Remet la plupart des variables de statut à zéro. A n'utiliser que pour STATUS corriger une requête. Remet toutes les ressources à zéro. Cela va autoriser de nouveau les USER_RESOURCES utilisateurs qui ont été bloqués. Limiter les ressources utilisateur. Vous pouvez aussi accéder à toutes les commandes décrites plus haut en les donnant en arguments à mysqladmin (exemple : flush?hosts , flush?logs , reload , ou encore flush?tables ). Reportez?vous aussi à la commande RESET avec la réplication. Syntaxe de RESET . 4.5.4 Syntaxe de la commande RESET RESET reset_option [,reset_option] ... La commande RESET sert à remettre à zéro des données. C'est aussi une version plus puissante de la commande FLUSH . Syntaxe de FLUSH . 4.5.4 Syntaxe de la commande RESET 230 Manuel MySQL 4.1.x ? Version Française Pour exécuter la commande RESET , vous devez avoir les droits RELOAD . Option Description Efface tous les logs binaires listés dans le fichier d'index, et l'index binlog est vidé. MASTER Dans les version antérieures à la version 3.23.26, cette commande s'appelait FLUSH MASTER (Master) Annule la position de réplication de l'esclave dans les historiques du maître. Dans les SLAVE version antérieures à la version 3.23.26, cette commande s'appelait FLUSH SLAVE (Slave) QUERY Supprime tous les résultats de requêtes du cache de requête. CACHE 4.5.5 Syntaxe de KILL KILL thread_id Chaque connexion à mysqld utilise un thread unique. Vous pouvez voir les threads en cours d'exécution en utilisant la commande SHOW PROCESSLIST et en terminer un avec la commande KILL thread_id .Si vous avez le droit PROCESS , vous pouvez voir tous les threads. Si vous avez le droit SUPER , vous pouvez terminer tout les threads. Sinon, vous ne pouvez terminer que vos propres threads. Vous pouvez aussi utiliser les commandes mysqladmin processlist et mysqladmin kill pour examiner et terminer les threads. Quand vous exécutez un KILL , un thread spécifique est crée pour ce thread. Dans la plupart des cas, la terminaison du thread pourra prendre un certain temps vu que le thread de terminaison est invoqué à intervalles spécifiques. Pour les boucles de • SELECT , ORDER BY et GROUP BY , le thread de terminaison est vérifié après avoir lu un enregistrement. S'il est activé la requête est abandonnée. Lors d'un • ALTER TABLE le thread de terminaison est vérifié avant la lecture de chacune des colonnes de la table d'origine. S'il est activé, la commande est abandonnée et la table temporaire effacée. Lors d'un • UPDATE TABLE ou d'un DELETE TABLE , le thread de terminaison est vérifié après chaque lecture de bloc et chaque mise à jour ou suppression de ligne. S'il est activé, la requête est abandonnée. Notez que si vous utilisez les transactions, les modifications ne seront pas perdues ! GET_LOCK() • stoppera avec NULL . Un thread • INSERT DELAYED videra rapidement toutes les lignes en mémoire et se terminera. Si le thread est dans le gestionnaire des verrous de tables (état : • Locked ), le verrou sur la table sera vite enlevé. Si le thread est en attente de libération d'espace disque lors d'un appel à • write , l'opération est avortée avec un message d'erreur indiquant que le disque est plein. 4.5.6 Syntaxe de SHOW SHOW DATABASES [LIKE wild] ou SHOW [OPEN] TABLES [FROM nom_base] [LIKE wild] ou SHOW [FULL] COLUMNS FROM nom_de_table [FROM nom_base] [LIKE wild] 4.5.5 Syntaxe de KILL 231 Manuel MySQL 4.1.x ? Version Française ou SHOW INDEX FROM nom_de_table [FROM nom_base] ou SHOW TABLE STATUS [FROM nom_base] [LIKE wild] ou SHOW STATUS [LIKE wild] ou SHOW VARIABLES [LIKE wild] ou SHOW LOGS ou SHOW [FULL] PROCESSLIST ou SHOW GRANTS FOR user ou SHOW CREATE TABLE table_name ou SHOW MASTER STATUS ou SHOW MASTER LOGS ou SHOW SLAVE STATUS SHOW fournit des informations sur les bases de données, les colonnes, les tables, ou l'état du serveur. Si la clause LIKE wild est utilisée, la chaîne wild peut être une chaîne qui utilise les caractères SQL joker '%' et '_' . 4.5.6.1 Obtenir des informations sur les bases, tables, colonnes et index Vous pouvez utiliser la syntaxe alternative db_name.tbl_name à la syntaxe tbl_name FROM db_name . Ces deux commandes sont équivalentes : mysql> SHOW INDEX FROM mytable FROM mydb; mysql> SHOW INDEX FROM mydb.mytable; SHOW DATABASES liste les bases que le serveur MySQL héberge. Vous pouvez aussi obtenir cette liste en utilisant la commande mysqlshow . Depuis la version 4.0.2, vous ne verrez que les bases pour lesquelles vous avez des droits, à moins que vous n'ayez le droit global de SHOW DATABASES . SHOW TABLES liste les tables d'une base de données. Vous pouvez aussi accéder à cette liste avec la commande mysqlshow db_name . Note : si un utilisateur n'a aucun droit sur une table, la table ne sera pas affichée dans le résultat de SHOW TABLES et mysqlshow db_name . SHOW OPEN TABLES liste les tables qui sont actuellement ouvertes dans le cache de table. Comment MySQL ouvre et ferme les tables . Le champs Comment indique combien de fois la table a été mise en cache ( cached ) et utilisée ( in_use ). SHOW COLUMNS liste les colonnes d'une table données. Si vous spécifiez l'option FULL , vous obtiendrez aussi les droits dont vous disposez sur chaque colonne. Si les types de colonnes sont différents de ce à quoi vous vous attendiez après votre requête CREATE TABLE , notez que MySQL change parfois les types de colonnes. Silent column changes . La requête DESCRIBE fournit des informations similaires à SHOW COLUMNS(Obtenir des informations sur les colonnes) . SHOW FIELDS est un synonyme de SHOW COLUMNS , et SHOW KEYS est un synonyme de SHOW INDEX . Vous pouvez aussi lister les colonnes d'une table ou ses index avec les commandes en ligne mysqlshow db_name tbl_name et mysqlshow ?k db_name tbl_name . SHOW INDEX retourne le détails sur les index, dans un format qui ressemble vaguement à l'affichage obtenu par la commande SQLStatistics de ODBC. Les colonnes suivantes sont disponibles : 4.5.6.1 Obtenir des informations sur les bases, tables, colonnes et index 232 Manuel MySQL 4.1.x ? Version Française Colonne Signification Table Nom de la table. Non_unique 0 si l'index ne peut pas contenir de doublons. Key_name Nom de l'index. Seq_in_index Numéro de séquence de la colonne dans l'index, commençant à 1. Column_name Nom de la colonne. Comment la colonne est placée dans l'index. Avec MySQL, les valeurs peuvent Collation être 'A' (Ascending) ou NULL (Non trié). Nombre de valeurs uniques dans l'index. Ceci est mis à jour en exécutant la Cardinality commande isamchk ?a . Numbre de caractères indexés si la colonne est partiellement indexée. NULL Sub_part siginifie que la clée entière est indexée. Null Contient 'YES' si la colonne peut contenir la valeur NULL . Index_type La méthode d'indexation utilisée. Différentes remarques. Actuellement, il indique si l'index est FULLTEXT ou non Comment (MySQL < 4.0.2). Notez que la cardinalité ( Cardinality ) est comptée grâce à des statistiques stockées sous forme d'entier. Ce n'est peut être pas très précis pour les petites tables. Les colonnes Null et Index_type ont été ajoutées en MySQL 4.0.2. 4.5.6.2 SHOW TABLE STATUS SHOW TABLE STATUS [FROM db_name] [LIKE wild] SHOW TABLE STATUS (nouveau en version 3.23) fonctionne comme SHOW STATUS , mais fournit des informations sur les tables. Vous pouvez aussi obtenir ces informations en utilisant la commande en ligne mysqlshow ??status db_name . Les données suivantes sont retournées : Colonne Signification Name Nom de la table. Type Type de table. Types de tables MySQL. Row_format Le format de stockage de ligne (Fixed, Dynamic ou Compressed). Rows Nombre de lignes. Avg_row_length Taille moyenne d'une ligne. Data_length Taille du fichier de données. Max_data_length Taille maximale du fichier de données. Index_length Taille du fichier d'index. Data_free Nombre d'octets alloués mais non utilisés. Auto_increment Prochaine valeur d'autoincrement. Create_time Date de création de la table. Update_time Date de dernière modification de la table. Check_time Date de dernier entretien de la table. Create_options Options supplémentaires utilisées avec CREATE TABLE . Le commentaire utilisé lors de la création de la table (ou des informations sur Comment pourquoi MySQL n'a pu accéder aux informations de la table). 4.5.6.2 SHOW TABLE STATUS 233 Manuel MySQL 4.1.x ? Version Française Les tables InnoDB indiqueront l'espace disque libre dans le commentaire de table. 4.5.6.3 Syntaxe de SHOW STATUS SHOW STATUS affiche des informations sur le statut du serveur (comme par exemple, mysqladmin extended?status ). L'affichage ressemble à ce qui est affiché ci?dessous, mais les valeurs différeront sûrement de votre propre serveur. +??????????????????????????+????????????+ | Variable_name | Value | +??????????????????????????+????????????+ | Aborted_clients | 0 | | Aborted_connects | 0 | | Bytes_received | 155372598 | | Bytes_sent | 1176560426 | | Connections | 30023 | | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 8340 | | Created_tmp_files | 60 | | Delayed_insert_threads | 0 | | Delayed_writes | 0 | | Delayed_errors | 0 | | Flush_commands | 1 | | Handler_delete | 462604 | | Handler_read_first | 105881 | | Handler_read_key | 27820558 | | Handler_read_next | 390681754 | | Handler_read_prev | 6022500 | | Handler_read_rnd | 30546748 | | Handler_read_rnd_next | 246216530 | | Handler_update | 16945404 | | Handler_write | 60356676 | | Key_blocks_used | 14955 | | Key_read_requests | 96854827 | | Key_reads | 162040 | | Key_write_requests | 7589728 | | Key_writes | 3813196 | | Max_used_connections | 0 | | Not_flushed_key_blocks | 0 | | Not_flushed_delayed_rows | 0 | | Open_tables | 1 | | Open_files | 2 | | Open_streams | 0 | | Opened_tables | 44600 | | Questions | 2026873 | | Select_full_join | 0 | | Select_full_range_join | 0 | | Select_range | 99646 | | Select_range_check | 0 | | Select_scan | 30802 | | Slave_running | OFF | | Slave_open_temp_tables | 0 | | Slow_launch_threads | 0 | | Slow_queries | 0 | | Sort_merge_passes | 30 | | Sort_range | 500 | | Sort_rows | 30296250 | | Sort_scan | 4650 | | Table_locks_immediate | 1920382 | | Table_locks_waited | 0 | | Threads_cached | 0 | | Threads_created | 30022 | | Threads_connected | 1 | | Threads_running | 1 | 4.5.6.3 Syntaxe de SHOW STATUS 234 Manuel MySQL 4.1.x ? Version Française | Uptime | 80380 | +??????????????????????????+????????????+ Les variables de statut listées ci?dessus ont la signification suivante : Variable Signification Nombre de connexions annulées parce que le client est mort Aborted_clients connexion annulée. Nombre de tentatives de connexions au serveur MySQL qui ont Aborted_connects échouées. Erreurs de communication / connexion annulée. Bytes_received Nombre d'octets reçu de tous les clients. Bytes_sent Nombre d'octets envoyés à tous les clients. Com_xxx Nombre d'exécution de chaque commande. Connections Nombre de tentatives de connexions au serveur MySQL. Nombre de tables temporaires implicites créées sur le disque lors Created_tmp_disk_tables d'exécutions de commandes. Nombre de tables temporaires implicites créées en mémoire lors Created_tmp_tables d'exécutions de commandes. Created_tmp_files Combien de fichiers temporaires mysqld a créé. Nombre de gestionnaires d'insertion retardées sont en cours Delayed_insert_threads d'utilisation. Delayed_writes Nombre de lignes écrites avec INSERT DELAYED . Nombre de lignes écrites avec INSERT DELAYED pour lesquelles Delayed_errors des erreurs sont survenues (probablement une erreur de doublons ( duplicate key )). Flush_commands Nombre de commandes FLUSH . Handler_commit Nombre de commandes internes COMMIT . Handler_delete Nombre de fois qu'une ligne a été effacées dans une table. Nombre de fois que la première ligne a été lue dans un index. Si ce chiffre est haut, c'est que le serveur fait de nombreuses Handler_read_first recherches par analyse complète de la table, par exemple SELECT col1 FROM foo , en supposant que col1 est indexé. Nombre de requête de lecture de ligne basées sur une clé. Si ce Handler_read_key chiffre est grand, c'est une bonne indication de l'indexation correcte de vos tables. Nombre de requête de lecture de la ligne suivante en ordre. Cela sera augmenté si vous listez une colonne avec une contrainte Handler_read_next d'intervalle. Cette valeur sera aussi incrémentée si vous effectuez un scan d'index. Nombre de requête de lecture de la clé précédente, dans l'ordre. Handler_read_prev C'est souvent utilisé pour optimiser les clauses ORDER BY ... DESC . Nombre de lecture d'une ligne basée sur une position fixe. Ce Handler_read_rnd chiffre sera grand si vous effectuez de nombreuses requêtes qui réclament le tri du résultat. Handler_read_rnd_next Nombre de requêtes de lecture de la prochaine ligne dans le fichier de données. Ce chiffre sera grand si vous faîtes de nombreux scans de tables. Généralement, cela indique que vos requêtes ne sont pas écrites pour profiter des index que vous 4.5.6.3 Syntaxe de SHOW STATUS 235 Manuel MySQL 4.1.x ? Version Française avez mis en place. Handler_rollback Nombre de commandes internes ROLLBACK . Handler_update Nombre de requête de modification d'une ligne dans une table. Handler_write Nombre de requête pour insérer une ligne dans une table. Key_blocks_used The Nombre de blocs utilisés dans un cache de clé. The Nombre de requêtes de lecture d'un bloc de clé dans le Key_read_requests cache. Key_reads Nombre de lecture physique d'un bloc de clé sur le disque. Key_write_requests Nombre de requêtes d'écriture d'un bloc de clé dans le cache. Key_writes Nombre d'écriture physiques de bloc de clé sur le disque. Max_used_connections Nombre maximum de connexions utilisées simultanément. Nombre de blocs de clés dans le cache de clés, qui ont été Not_flushed_key_blocks modifiées, mais pas encore écrites sur le disque. Nombre de lignes en attente d'écriture dans les listes INSERT Not_flushed_delayed_rows DELAY . Open_tables Nombre de tables ouvertes. Open_files Nombre de fichiers ouverts. Open_streams Nombre de flôts ouverts (utilisés généralement pour les logs). Opened_tables Nombre de tables qui ont été ouvertes. Statut de la réplication sans erreur (réservé pour utilisation Rpl_status ultérieure). Nombre de jointures sans clé (si cette variable vaut 0, vous Select_full_join devriez vérifier soigneusement les index de vos tables). Select_full_range_join Nombre de jointures où une recherche d'intervalle a été utilisée. Nombre de jointures où une rercherche d'intervalle a été utilisée Select_range sur la première table. (Ce n'est généralement pas important, même si cette valeur est importante). Nombre de jointures où la première table a été totalement Select_scan scannée. Nombre de jointures sans clé, où l'utilisation de clé a été vérifiée Select_range_check après chaque ligne (si cette variable vaut 0, vous devriez vérifier soigneusement les index de vos tables). Questions Nombre de requêtes envoyées au serveur. Nombre de tables temporaires actuellement utilisée par le thread Slave_open_temp_tables esclave. Cette variable vaut ON si ce serveur est un esclave connecté au Slave_running maître. Nombre de threads qui ont pris plus de slow_launch_time Slow_launch_threads secondes pour être créés. Nombre de requêtes qui ont pris plus de long_query_time Slow_queries pour s'exécuter. Le log des requêtes lentes. Nombre de passes que l'algorithme de tri a du faire. Si cette Sort_merge_passes valeur est grande, vous devriez vérifier la taille de sort_buffer . Sort_range Nombre de tris qui ont été fait sur des intervalles. Sort_rows Nombre de lignes triées. Sort_scan Nombre de tris qui ont été fait en scannant la table. ssl_xxx Variables utilisées par SSL; Réservée pour utilisation ultérieure. 4.5.6.3 Syntaxe de SHOW STATUS 236 Manuel MySQL 4.1.x ? Version Française Nombre de fois que la table a reçu immédiatement un verrou. Table_locks_immediate Disponible depuis 3.23.33. Nombre de fois qu'une table n'a pu recevoir de verrou immédiatement, et qu'il a fallu attendre. Si ce chiffre est haut, Table_locks_waited vous avez des problèmes de performance, et vous devriez optimiser vos requêtes, couper vos tables en deux, ou utiliser la réplication. Disponible depuis la version 3.23.33. Threads_cached Nombre de threads dans le cache de thread. Threads_connected Nombre de connexions actuellement ouvertes. Threads_created Nombre de threads créés pour gérer les connexions. Threads_running Nombre de threads qui ne dorment pas. Uptime Durée de vie du serveur, en secondes depuis le redémarrage. Quelques commentaires sur les variables ci?dessus : Si • Opened_tables est grand, alors votre table_cache est probablement trop petit. Si • Key_reads est grand, alors key_buffer_size est probablement trop petit. Le taux d'utilisation du cache peut être calculé avec le ratio Key_reads / Key_read_requests . Si • Handler_read_rnd est grand, vous avez probablement trop de requêtes qui analysent toute la table, ou vous avez des jointures qui n'exploitent pas d'index. Si • Threads_created est grand, vous devriez augmenter la valeur de la variable thread_cache_size . Le taux d'utilisation du cache peut être calculé avec Threads_created / Connections . Si • Created_tmp_disk_tables est grand, vous devriez augmenter la valeur de la variable tmp_table_size pour obtenir des tables temporaires en mémoire, et non plus sur le disque. 4.5.6.4 Syntaxe de SHOW VARIABLES SHOW [GLOBAL | SESSION] VARIABLES [LIKE wild] SHOW VARIABLES affiche les valeurs des variables systèmes de MySQL. Vous pouvez aussi obtenir ces informations avec la commande mysqladmin variables . Si les valeurs par défaut ne vous conviennent pas, vous pouvez modifier la plupart de ces variables, en ligne de commande, lorsque mysqld est lancé. Options en ligne de commande de mysqld .Les options GLOBAL et SESSION sont nouvelles depuis MySQL 4.0.3. Avec GLOBAL vous allez lister les variables qui sont utilisées pour les nouvelles connexions à MySQL. Avec SESSION , vous allez lister les valeurs qui ont actuellement cours pour la connexion courante. Si vous n'utilisez ni l'une, ni l'autre des options, SESSION sera utilisée. Vous pouvez changer la plupart des options avec la commande SET . Syntaxe de SET . Le résultat de cette commande ressemble à la table ci?dessous, même si les nombres et formats diffèrent un peu : +?????????????????????????????????+??????????????????????????????+ | Variable_name | Value | +?????????????????????????????????+??????????????????????????????| | back_log | 50 | | basedir | /usr/local/mysql | | bdb_cache_size | 8388572 | | bdb_log_buffer_size | 32768 | | bdb_home | /usr/local/mysql | | bdb_max_lock | 10000 | | bdb_logdir | | 4.5.6.4 Syntaxe de SHOW VARIABLES 237 Manuel MySQL 4.1.x ? Version Française | bdb_shared_data | OFF | | bdb_tmpdir | /tmp/ | | bdb_version | Sleepycat Software: ... | | binlog_cache_size | 32768 | | bulk_insert_buffer_size | 8388608 | | character_set | latin1 | | character_sets | latin1 big5 czech euc_kr | | concurrent_insert | ON | | connect_timeout | 5 | | convert_character_set | | | datadir | /usr/local/mysql/data/ | | delay_key_write | ON | | delayed_insert_limit | 100 | | delayed_insert_timeout | 300 | | delayed_queue_size | 1000 | | flush | OFF | | flush_time | 0 | | ft_min_word_len | 4 | | ft_max_word_len | 254 | | ft_max_word_len_for_sort | 20 | | ft_boolean_syntax | + ?><()~*:""&| | | have_bdb | YES | | have_innodb | YES | | have_isam | YES | | have_raid | NO | | have_symlink | DISABLED | | have_openssl | YES | | have_query_cache | YES | | init_file | | | innodb_additional_mem_pool_size | 1048576 | | innodb_buffer_pool_size | 8388608 | | innodb_data_file_path | ibdata1:10M:autoextend | | innodb_data_home_dir | | | innodb_file_io_threads | 4 | | innodb_force_recovery | 0 | | innodb_thread_concurrency | 8 | | innodb_flush_log_at_trx_commit | 0 | | innodb_fast_shutdown | ON | | innodb_flush_method | | | innodb_lock_wait_timeout | 50 | | innodb_log_arch_dir | | | innodb_log_archive | OFF | | innodb_log_buffer_size | 1048576 | | innodb_log_file_size | 5242880 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_mirrored_log_groups | 1 | | interactive_timeout | 28800 | | join_buffer_size | 131072 | | key_buffer_size | 16773120 | | language | /usr/local/mysql/share/... | | large_files_support | ON | | local_infile | ON | | locked_in_memory | OFF | | log | OFF | | log_update | OFF | | log_bin | OFF | | log_slave_updates | OFF | | log_slow_queries | OFF | | log_warnings | OFF | | long_query_time | 10 | | low_priority_updates | OFF | | lower_case_table_names | OFF | | max_allowed_packet | 1047552 | | max_binlog_cache_size | 4294967295 | | max_binlog_size | 1073741824 | | max_connections | 100 | 4.5.6.4 Syntaxe de SHOW VARIABLES 238 Manuel MySQL 4.1.x ? Version Française | max_connect_errors | 10 | | max_delayed_threads | 20 | | max_heap_table_size | 16777216 | | max_join_size | 4294967295 | | max_sort_length | 1024 | | max_user_connections | 0 | | max_tmp_tables | 32 | | max_write_lock_count | 4294967295 | | myisam_max_extra_sort_file_size | 268435456 | | myisam_max_sort_file_size | 2147483647 | | myisam_recover_options | force | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | net_read_timeout | 30 | | net_retry_count | 10 | | net_write_timeout | 60 | | open_files_limit | 0 | | pid_file | | | port | 3306 | | protocol_version | 10 | | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | | rpl_recovery_rank | 0 | | query_cache_limit | 1048576 | | query_cache_size | 0 | | query_cache_type | ON | | safe_show_database | OFF | | server_id | 0 | | slave_net_timeout | 3600 | | skip_external_locking | ON | | skip_networking | OFF | | skip_show_database | OFF | | slow_launch_time | 2 | | socket | | | sort_buffer_size | 2097116 | | sql_mode | 0 | | table_cache | 64 | | table_type | MYISAM | | thread_cache_size | 3 | | thread_stack | 131072 | | tx_isolation | READ?COMMITTED | | timezone | EEST | | tmp_table_size | 33554432 | | tmpdir | /tmp/ | | version | 4.0.4?beta | | wait_timeout | 28800 | +?????????????????????????????????+??????????????????????????????+ Tous les options sont décrites ici. Les tailles de buffer, les longueurs et piles sont données en octets. Vous pouvez spécifier ces valeurs avec le suffixe 'K' ou 'M' pour indiquer respectivement kilo?octets ou méga?octets. Par 16M représente 16 mégaoctets. Le suffixe peut être en majuscule ou en minuscule. 16M et 16m sont équivalents : ansi_mode • . Vaut ON si mysqld a été démarré en mode ??ansi . Exécuter MySQL en back_log • Le nombre de connexions sortantes que MySQL peut supporter. Cette valeur entre en jeu lorsque le thread principal MySQL reçoit de très nombreuses requêtes de connexions en très peu de temps. MySQL prend un peu de temps (même si c'est très peu de temps), pour vérifier la connexion et démarrer un nouveau thread. La valeur de back_log indique combien de requête seront mises en attente durant ce temps. Vous devrez augmenter ce nombre si vous voulez mettre en attente plus de requêtes durant une courte période de d'autres termes, cette valeur est la taille de la queue d'attente pour les connexions TCP/IP entrantes. Votre système d'exploitation a ses propres limites pour ce type de queue. La page du manuel Unix listen(2) doit contenir plus de détails. 4.5.6.4 Syntaxe de SHOW VARIABLES 239 Manuel MySQL 4.1.x ? Version Française Vérifiez la documentation de votre OS pour connaître la valeur maximale de votre système. Si vous donne une valeur à back_log qui est plus grande que celle que votre système supporte, cela restera sans effet. basedir • La valeur de l'option ??basedir . bdb_cache_size • Le buffer qui est alloué pour mettre en cache des lignes et des index pour les tables BDB . Si vous n'utilisez pas la tables BDB , vous devriez démarrer mysqld avec l'option ??skip?bdb pour ne pas gaspiller de mémoire. bdb_log_buffer_size • Le buffer qui est alloué pour mettre en cache des lignes et des index pour les tables BDB . Si vous n'utilisez pas la tables BDB , vous devriez démarrer mysqld avec l'option ??skip?bdb pour ne pas gaspiller de mémoire. bdb_home • La valeur de l'option ??bdb?home . bdb_max_lock • Le nombre maximum de verrous (par défaut 10 000) que vous pouvez activer simultanément dans une table BDB . Vous devriez augmenter cette valeur si vous obtenez des erreurs du type bdb: Lock table is out of available locks ou Got error 12 from ... lorsque vous avez de longues transactions ou que mysqld doit examiner de nombreuses lignes pour calculer la requête. bdb_logdir • La valeur de l'option ??bdb?logdir . bdb_shared_data • Vaut ON si vous utilisez l'option ??bdb?shared?data . bdb_tmpdir • La valeur de l'option ??bdb?tmpdir . binlog_cache_size • . La taille du cache qui contient les requêtes SQL destinées au log binaire, durant une transaction. Si vous utilisez souvent de longues transactions multi?requêtes, vous devriez augmenter cette valeur pour améliorer les performances. Syntaxe des BEGIN/COMMIT/ROLLBACK . bulk_insert_buffer_size • (était myisam_bulk_insert_tree_size ) MyISAM utilise une cache hiérarchisé pour les insertions de masses (c'est à dire INSERT ... SELECT , INSERT ... VALUES (...), (...), ... , et LOAD DATA INFILE ). Cette variable limite la taille du cache en octets, par threads. Utiliser la valeur de 0 va désactiver cette optimisation. Note : ce cache est uniquement utilisé lorsque vous ajoutez des données dans une table non?vide. Par défaut, cette option vaut 8 Mo. character_set • Le jeu de caractères par défaut. character_sets • Les jeux de caractères supportés. concurrent_inserts • Si cette option vaut ON , MySQL va vous permettre de réaliser des commandes INSERT sur les tables MyISAM en même temps que d'autres commandes SELECT seront exécutées. Vous pouvez désactiver cette option en démarrant mysqld avec l'option ??safe or ??skip?new . connect_timeout • Le nombre de secondes d'attente d'un paquet de connexion avant de conclure avec une erreur Bad handshake . datadir • La valeur de l'option ??datadir . delay_key_write • Les options pour les tables MyISAM . Elles peuvent prendre l'une des valeurs suivantes : Toutes les commandes CREATE TABLE ... DELAYED_KEY_WRITES OFF sont ignorés. (par défaut) MySQL va honorer l'option DELAY_KEY_WRITE de CREATE ON TABLE . Toutes les nouvelles tables ouvertes sont traitées comme si elles étaient ALL créées avec l'option DELAY_KEY_WRITE . Si DELAY_KEY_WRITE est activé, cela signifie que le buffer de clé des tables ayant cette option ne seront pas écrit sur le disque dès la fin de la modification de la table, mais attendrons que la table soit écrite. Cela accélère notablement les écritures des modifications, mais il faut penser à ajouter une vérification automatique des tables au démarrage avec myisamchk ??fast ??force . delayed_insert_limit • Après avoir inséré delayed_insert_limit lignes, le gestionnaire de INSERT DELAYED va vérifiez si il n'y a pas de commande SELECT en attente. Si c'est le cas, il va autoriser ces commandes avant de continuer. 4.5.6.4 Syntaxe de SHOW VARIABLES 240 Manuel MySQL 4.1.x ? Version Française delayed_insert_timeout • Combien de temps le thread INSERT DELAYED doit attendre les commandes INSERT avant de s'achever. delayed_queue_size • Quelle taille de file (en lignes) doit être allouée pour gérer les commandes INSERT DELAYED . Si la file se remplit, tous les clients qui émettent des commandes INSERT DELAYED devront attendre un peu de place avant de pouvoir continuer. flush • Cette option vaut ON si vous avez démarré MySQL avec l'option ??flush . flush_time • Si cette option a une valeur non nulle, toutes les flush_time secondes, toutes les tables seront fermées (pour libérez des ressources et synchroniser les index sur le disque). Nous ne recommandons cette option que sur les systèmes Windows 9x/Me, ou les systèmes qui ont très peu de ressource. ft_min_word_len • La taille minimale d'un mot inclus dans un index FULLTEXT . Note : les index FULLTEXT doivent être reconstruit après avoir modifié cette variable. (Cette option est nouvelle en MySQL 4.0.) ft_max_word_len • La taille maximale d'un mot inclus dans un index FULLTEXT . Note : les index FULLTEXT doivent être reconstruit après avoir modifié cette variable. (Cette option est nouvelle en MySQL 4.0.) ft_max_word_len_for_sort • La taille maximale d'un mot dans un index FULLTEXT , pour qu'il soit inclus dans la méthode de recréation rapide de l'index, avec la commande REPAIR , CREATE INDEX , ou ALTER TABLE . Les mots longs sont insérés par une méthode plus lente. La règle idéale est la suivante : avec ft_max_word_len_for_sort qui croit, MySQL va créer des fichiers temporaires plus grand, et donc, ralentir le processus, à cause des accès disques, et cela va mettre moins de clés dans un bloc de tri (encore une fois, limitant la vitesse). Lorsque ft_max_word_len_for_sort est plus petit, MySQL va insérer un grand nombre de mot avec la méthode lente, mais les mots courts seront insérés très vite. ft_boolean_syntax • Liste des opérateurs supportés par MATCH ... AGAINST(... IN BOOLEAN MODE)have_innodb • YES si mysqld supporte les tables InnoDB. DISABLED si ??skip?innodb est utilisée. have_bdb • YES si mysqld supporte les tables Berkeley. DISABLED si ??skip?bdb est utilisée. have_raid • YES si mysqld supporte l'option RAID . have_openssl • YES si mysqld supporte le chiffrement SSL entre le client et le serveur. init_file • Le nom du fichier spécifié avec l'option ??init?file lorsque vous démarrez le serveur. C'est un fichier qui contient les requêtes SQL que vous voulez voir exécutées dès le démarrage. interactive_timeout • Le nombre de secondes durant lequel le serveur attend une activité de la part de la connexion avant de la fermée. Un client interactif est un client qui utilise l'option CLIENT_INTERACTIVE avec mysql_real_connect() . Voir aussi wait_timeout . join_buffer_size • La taille du buffer qui est utilisée pour les jointures complètes (les jointures qui n'utilisent pas d'index). Ce buffer est alloué une fois pour chaque jointure entre deux tables. Augmentez cette valeur si vous voulez obtenir des jointures plus rapides, lorsque l'ajout d'index n'est pas possible. Normalement, le mieux est d'ajouter de bons index. key_buffer_size • Les blocs d'index sont mis en buffer et partagés par tous les threads. key_buffer_size est la taille du buffer utilisé. Augmentez cette valeur pour obtenir une meilleure gestion des index (pour les lectures et écritures multiples), autant que vous le pouvez : 64Mo sur une machine de 256Mo est une valeur répandue. Toutefois, si vous utilisez une valeur trop grande (par exemple, plus de 50% de votre mémoire totale), votre système risque de commencer à utiliser sa mémoire swap, et devenir très lent. N'oubliez pas que MySQL ne met pas en cache les données lues, 4.5.6.4 Syntaxe de SHOW VARIABLES 241 Manuel MySQL 4.1.x ? Version Française et il faut laisser le système d'exploitation respirer. Vous pouvez vérifier les performances du buffer de clés avec la commande show status et en examinant les variables Key_read_requests , Key_reads , Key_write_requests et Key_writes . Le ratio Key_reads/Key_read_request doit être normalement < 0.01. Le ratio Key_write/Key_write_requests est généralement proche de 1 si vous utilisez principalement des modifications et effacement, mais il peut être bien plus petit si vous faites des modifications qui affectent de nombreuses lignes en même temps, ou si vous utilisez l'option DELAY_KEY_WRITE . Syntaxe de SHOW . Pour obtenir encore plus de vitesse lors de l'écriture de plusieurs lignes en même temps, utilisez LOCK TABLES . Syntaxe des LOCK TABLES/UNLOCK TABLES . language • La langue utilisée pour les message d'erreurs. large_file_support • Si mysqld a été compilé avec le support des grands fichiers. locked_in_memory • Si mysqld a été verrouillé en mémoire avec ??memlock log • Si le log de toutes les requêtes est désactivé. log_update • Si le log de modification est activé. log_bin • Si le log binaire est activé. log_slave_updates • Si les modifications des esclaves doivent être enregistrées. long_query_time • Si une requête prend plus de long_query_time • secondes, le compteur de requêtes lentes Slow_queries sera incrémenté. Si vous utilisez l'option ??log?slow?queries , ces requêtes seront enregistrées dans un historique de requêtes lentes. Cette durée est mesurée en temps réel, et non pas en temps processus, ce qui fait que les requêtes qui seraient juste sous la limite avec un système légèrement chargé, pourrait être au dessus avec le même système, mais lower_case_table_names • Si cette option vaut 1, les noms de tables sont stockées en minuscules sur le disque, et les comparaisons de nom de tables seront insensibles à la max_allowed_packet • La taille maximale d'un paquet. Le buffer de message est initialisé avec net_buffer_length octets, mais peut grandir jusqu'à max_allowed_packet octets lorsque nécessaire. Cette valeur est par défaut petit, pour intercepter les gros paquets, probablement erronés. Vous devez augmenter cette valeur si vous utilisez de grandes colonnes BLOB . Cette valeur doit être aussi grande que le plus grand BLOB que vous utiliserez. Le protocole limite actuellement max_allowed_packet à 16Mo en MySQL 3.23 et 1Go en MySQL 4.0. max_binlog_cache_size • Si une transaction multi?requête requiert plus que cette quantité de mémoire, vous obtiendrez une erreur "Multi?statement transaction required more than 'max_binlog_cache_size' bytes of storage" . max_binlog_size • Disponible depuis la version 3.23.33. Si vous écrivez dans le log binaire (de réplication) et que cela dépasse la taille de max_binlog_size , une erreur sera indiquée. Vous ne pouvez pas donner à max_binlog_size une valeur inférieure à 1024 octets, ou plus grande que 1 Go. max_connections • Le nombre maximal de clients simultanés accepté. En augmentant cette valeur, vous augmentez le nombre de pointeur de fichier que requiert mysqld . Voyez max_connect_errors • Si il y a plus que max_connect_errors connexion interrompues depuis un même hôte, cet hôte sera bloqué dans ses prochaines tentatives de connexions. Vous pouvez débloquer un hôte avec la commande FLUSH HOSTS . max_delayed_threads • Ne pas lancer plus que max_delayed_threads threads pour gérer les insertions INSERT DELAYED . Si vous essayez d'insérer des données dans une nouvelle table alors que tous les gestionnaires INSERT DELAYED sont utilisés, la ligne sera insérée comme si l'option DELAYED n'avait pas été spécifiée. 4.5.6.4 Syntaxe de SHOW VARIABLES 242 Manuel MySQL 4.1.x ? Version Française max_heap_table_size • Ne pas autoriser la création de tables de type HEAP plus grande que max_heap_table_size . max_join_size • Les jointures qui liront probablement plus de max_join_size lignes, retourneront une erreur. Utilisez cette valeur si vos utilisateurs font des jointures avec de mauvaises clauses WHERE , qui prennent trop de temps, et retournent des millions de lignes. max_sort_length • Le nombre d'octets à utiliser lors du tri des colonnes de type BLOB et TEXT . Seuls les max_sort_length octets de chaque valeur seront utilisés pour le tri. Le reste est ignoré. max_user_connections • Le nombre maximum de connexions actives pour un utilisateur particulier (0 = pas de limite). max_tmp_tables • (Cette option ne fait actuellement rien du tout). Le nombre maximum de tables temporaires qu'un client peut garder ouvertes en même temps. max_write_lock_count • Après max_write_lock_count pose de verrou en écriture, autorise quelques verrous en lecture. myisam_recover_options • La valeur de l'option ??myisam?recover . myisam_sort_buffer_size • Le buffer qui est alloués lors du tri d'index avec la commande REPAIR ou lors de la création d'index avec CREATE INDEX ou ALTER TABLE . myisam_max_extra_sort_file_size • . Si un fichier temporaire utilisé pour la création rapide d'index devient plus grand que le cache de clé spécifié ici, la méthode utilisant le cache de clé sera utilisé. C'est principalement utilisé pour forcer les index longs de grandes tables à utiliser une méthode plus lente pour écrire l'index. Notez que ce paramètre est spécifié en mégaoctets avant la version 4.0.3 et en octets depuis cette version. myisam_max_sort_file_size • La taille maximale du fichier temporaire que MySQL est autorisé à utiliser durant la recréation des fichiers d'index (avec REPAIR , ALTER TABLE ou LOAD DATA INFILE ). Si la taille du fichier dépasse myisam_max_sort_file_size , l'index sera créé avec un cache de clé (plus lent). Notez que ce paramètre est spécifié en mégaoctets avant la version 4.0.3 et en octets depuis. net_buffer_length • Le buffer de communication est remis à zéro entre deux requêtes. Cela ne devrait pas être modifié, mais si vous avez très peu de mémoire, vous pouvez le remettre à la taille présumée de la requête (c'est à dire, la taille de requête envoyé par le client. Si la requête dépasse cette taille, le buffer est automatiquement agrandi jusqu'à max_allowed_packet octets). net_read_timeout • Nombre de secondes d'attente des dernières données, avant d'annuler la lecture. Notez que lorsque nous n'attendons pas de données d'une connexion, le délai d'expiration est donné par write_timeout . Voir aussi slave_net_timeout . net_retry_count • Si une lecture sur une port de communication est interrompu, net_retry_count tentatives sont faites avant d'abandonner. Cette valeur doit être particulièrement grande pour FreeBSD car les interruptions internes sont envoyés à tous les threads. net_write_timeout • Nombre de secondes d'attente pour qu'un bloc soit envoyé à une connexion, avant d'annuler l'écriture. open_files_limit • Si open_files_limit ne vaut pas 0, alors mysqld va utiliser cette valeur pour réserver des pointeurs de fichiers à utiliser avec setrlimit() . Si cette valeur est 0, alors mysqld va réserver max_connections*5 ou max_connections + table_cache*2 (le plus grand des deux) pointeurs de fichiers. Vous devriez augmenter cette valeur si mysqld vous donne des erreurs du type 'Too many open files' . pid_file • La valeur de l'option ??pid?file . port • La valeur de l'option ??port . protocol_version • La version du protocole utilisé par le serveur MySQL. read_buffer_size • (was record_buffer ) Chaque thread qui doit faire une recherche séquentielle alloue une buffer de cette taille pour chaque table qu'il scanne. Si vous faîtes de nombreuses recherches séquentielles, vous devriez augmenter cette valeur. record_rnd_buffer_size • Lors de la lecture de lignes qui sont placées dans un ordre trié, les lignes sont lues via ce buffer pour éviter les recherches sur le disque. 4.5.6.4 Syntaxe de SHOW VARIABLES 243 Manuel MySQL 4.1.x ? Version Française record_rnd_buffer_size peut améliorer grandement les performances de la clause ORDER BY si cette valeur est grande. Comme c'est une variable qui est spécifique pour les threads, il ne faut pas trop l'augmenter, mais simplement la modifier lorsque de grandes requêtes sont exécutées. query_cache_limit • Ne met pas en cache les résultats qui sont plus grands que query_cache_limit . Par défaut, 1 Mo. query_cache_size • La mémoire allouée pour stocker les résultats des vieilles requêtes. Si query_cache_size vaut 0, le cache de requête est désactivé (par défaut). • query_cache_type query_cache_type peut prendre les valeurs numériques suivantes : Valeur Alias Commentaire 0 OFF Ne met pas en cache les résultats. Met en cache tous les résultats exceptés les requêtes SELECT 1 ON , SQL_NO_CACHE ... . 2 DEMAND Met en cache uniquement les requêtes SELECT SQL_CACHE ... . safe_show_database • Ne montre pas les bases pour lesquelles un utilisateur n'a pas des droits de bases ou de tables. Cela peut améliorer considérablement la sécurité si vous craignez de voir les utilisateurs découvrir ce que les autres ont mis en place. Voir aussi skip_show_database . server_id • La valeur de l'option ??server?id . skip_locking • skip_locking vaut OFF si mysqld utilise le verrouillage externe. skip_networking • skip_networking vaut ON si seules les connexions locales (via socket) sont autorisées. • skip_show_database skip_show_database empêche les utilisateurs d'exécuter des commandes SHOW DATABASES si ils n'ont pas les droits de PROCESS . Cela peut améliorer la sécurité si vous craignez de voir les utilisateurs découvrir ce que les autres ont mis en place. Voir aussi safe_show_database . slave_net_timeout • Nombre de secondes d'attente de données en lecture ou écriture sur une connexion maître / esclave avant d'annuler. slow_launch_time • Si la création du thread prend plus de slow_launch_time secondes, le compteur de threads lents Slow_launch_threads sera incrémenté. socket • La socket Unix utilisé par le serveur. sort_buffer • Chaque thread qui doit faire un tri alloue un buffer de cette taille. Augmentez cette taille pour accélérer les clauses ORDER BY ou GROUP BYtable_cache • Le nombre de tables ouvertes pour tous les threads réunis. En augmentant cette valeur, vous augmentez le nombre de pointeurs de fichiers que mysqld utilise. Vous pouvez vérifier si vous avez besoin de plus de cache de tables en étudiant la valeur de la variable Opened_tables . Syntaxe de SHOW . Si cette variable est grande, est que vous ne faites pas souvent de commande FLUSH TABLES (qui force les tables à se recharger), vous devrez alors augmenter cette plus d'informations sur le cache de table, voyez table_type • Le type de table par défaut. thread_cache_size • Combien de threads nous allons conserver en cache pour réutilisation. Lorsqu'un client se déconnecte, les threads du client sont mis en cache s'il n'y en a pas déjà thread_cache_size de conservé. Tous les nouveaux threads sont d'abord prélevé dans le cache, et uniquement lorsque le cache est vide, un nouveau thread est créé. Cette variable peut vous permettre d'améliorer les performances si vous avez de nombreuses connexions. Normalement, thread_cache_size ne donne pas d'amélioration notable si vous avez une bonne implémentation des threads. En examinant la différence entre les variables de statut Connections et Threads_created vous pouvez voir comment votre système de cache de threads est efficace. thread_concurrency • Sous Solaris, mysqld va appeler thr_setconcurrency() avec cette valeur. thr_setconcurrency() permet à l'application de donner au système de 4.5.6.4 Syntaxe de SHOW VARIABLES 244 Manuel MySQL 4.1.x ? Version Française threads une indication sur le nombre de threads qui seront exécutés en même temps. thread_stack • La taille de la pile pour chaque thread. De nombreuses limites détectées par crash?me sont dépendantes de cette valeur. La valeur par défaut est suffisamment timezone • Le fuseau horaire du serveur. tmp_table_size • Si une table temporaire en mémoire excède cette taille, MySQL va automatiquement la convertir en une table MyISAM sur le disque. Augmentez la valeur de tmp_table_size si vous faites un usage intensif de la clause GROUP BY et que vous avez beaucoup de mémoire. tmpdir • Le dossier utilisé pour les fichiers temporaires et les tables temporaires. version • Le numéro de version du serveur. wait_timeout • Le nombre de secondes d'attente du serveur sur une connexion non interactive avant de la du démarrage du thread, SESSION.WAIT_TIMEOUT est initialisé avec GLOBAL.WAIT_TIMEOUT ou GLOBAL.INTERACTIVE_TIMEOUT , suivant le type de client (tel que défini par l'option de connexion CLIENT_INTERACTIVE ). Voir aussi interactive_timeout . La section du manuel qui est consacrée à l'optimisation de MySQL contient des informations sur l'utilisation des variables ci?dessus. Choix des paramètres du serveur . 4.5.6.5 Syntaxe de SHOW LOGS La commande SHOW LOGS affiche les informations d'état de vos fichiers de logs. Actuellement, elle n'affiche que les informations pour les fichiers de log des tables Berkeley DB. File • affiche le chemin complet jusqu'au fichier de log. Type • affiche le type de fichier de log ( BDB pour les tables de types Berkeley DB) Status • affiche le status du fichier de log ( FREE si le fichier peut être supprimé, ou IN USE si le fichier est utilisé par une transaction en cours) 4.5.6.6 Syntaxe de SHOW PROCESSLIST SHOW [FULL] PROCESSLIST affiche la liste de processus qui sont en cours d'exécution. Vous pouvez aussi obtenir ces informations avec la commande en ligne mysqladmin processlist . Si vous avez les droits de SUPER , vous pourrez aussi voir les autres threads. Sinon, vous ne pourrez voir que les votre. Syntaxe de KILL . Si vous n'utilisez pas l'option FULL , seuls les 100 premiers caractères de chaque requête seront affichés. Cette commande est très pratique si vous obtenez trop d'erreurs 'too many connections' et que vous voulez savoir ce qui se passe. MySQL réserve une connexion supplémentaire pour un client ayant les droits de SUPER , de façon à ce qu'il y ait toujours la possibilité de se connecter et de vérifier le système (en supposant que vous ne donnez pas ce droit à tous vos utilisateurs). Certains états sont souvent disponible dans le résultat de mysqladmin processlist Checking table • Le thread fait une vérification (automatique) de la table. Closing tables • Le thread est en train d'écrire les données modifiées sur le disque, et il va fermer les tables. Cela doit être une opération très rapide. Si ce n'est pas le cas, vous devriez vérifier si vous n'avez pas un disque plein, ou que le disque est sous haute charge. Connect Out • Connexion d'un esclave sur le maître. Copying to tmp table on disk • Le résultat temporaire était plus grand que tmp_table_size et le thread passe d'une table en mémoire à une table sur disque. 4.5.6.5 Syntaxe de SHOW LOGS 245 Manuel MySQL 4.1.x ? Version Française Creating tmp table • Le thread est en train de créer une table temporaire pour contenir le résultat d'une requête. deleting from main table • Lors de l'exécution de la première partie d'une requête d'effacement multi?table, et que MySQL n'a commencé à effacer que dans la première table. deleting from reference tables • Lors de l'exécution de la deuxième partie d'une requête d'effacement multi?table, et que MySQL a commencé à effacer dans les autres tables. Flushing tables • Le thread exécute la commande FLUSH TABLES et il attend que tous les threads ferme leur tables. Killed • Quelqu'un a envoyé une commande KILL et le thread s'annuler la prochaine fois qu'il vérifie l'option de kill. Cette option est vérifiée dans chaque boucle majeure de MySQL, mais dans certains cas, il peut lui prendre un court instant avant de s'arrêter. Si le thread est verrouillé par un autre thread, l'arrêt va prendre effet aussitôt que l'autre thread lève son verrou. Sending data • Le thread traite des lignes pour une commande SELECT et il envoie les données au client. Sorting for group • Le thread est en train de faire un tri pour satisfaire une clause GROUP BY . Sorting for order • Le thread est en train de faire un tri pour satisfaire une clause ORDER BY . Opening tables • Cela signifie simplement que le thread essaie d'ouvrir une table. Ce doit être une opération très rapide, à moins que quelque chose ne retarde l'ouverture. Par exemple, une commande ALTER TABLE ou LOCK TABLE peut empêcher l'ouverture de table, jusqu'à l'achèvement de la commande. Removing duplicates • La requête utilisait SELECT DISTINCT de telle manière que MySQL ne pouvait pas optimiser les lignes distinctes au début du traitement. A cause de cela, MySQL doit effectuer une opération de plus pour supprimer toutes les lignes en doubles, avant d'envoyer les lignes au client. Reopen table • Le thread a reçu un verrou pour une table, mais a noté après l'avoir reçu que la structure de la table a changé. Il a libéré le verrou, fermé la table, et maintenant il essaie de la réouvrir. Repair by sorting • Le thread répare la table en utilisant la méthode de tri pour créer l'index. Repair with keycache • Le thread répare la table en utilisant la méthode de création des clés à partir du cache de clé. C'est bien plus lent que la réparation par tri . Searching rows for update • Le thread effectue une première phase pour trouver toutes les lignes qui satisfont les critères avant de les modifier. Cela doit être fait si UPDATE modifie l'index qui sera utilisé pour trouver les lignes. Sleeping • Le thread attend que le client envoie une nouvelle commande. System lock • Le thread attend le verrou externe pour la table. Si vous n'utilisez pas de serveurs MySQL multiples qui exploitent les mêmes tables, vous pouvez désactiver les verrous systèmes avec l'option ??skip?external?locking . Upgrading lock • Le gestionnaire de INSERT DELAYED essaie d'obtenir un verrou pour insérer des lignes. Updating • Le thread recherche des lignes pour les modifier. User Lock • Le thread attend un GET_LOCK() . Waiting for tables • Le thread a reçu l'annonce que la structure de table a été modifiée, et il doit réouvrir la table pour obtenir une nouvelle structure. Pour être capable de réouvrir la table, il doit attendre que les autres threads aient fermé la table en question.Cette annonce survient lorsqu'un autre autre thread a été utilisé avec la commande FLUSH TABLES ou une des commandes suivantes, appliquées à la table en question : FLUSH TABLES table_name , ALTER TABLE , RENAME TABLE , REPAIR TABLE , ANALYZE TABLE ou OPTIMIZE TABLE . 4.5.6.5 Syntaxe de SHOW LOGS 246 Manuel MySQL 4.1.x ? Version Française waiting for handler insert • Le gestionnaire de INSERT DELAYED a traité toutes insertions, et en attend de nouvelles. La plupart des états sont des opérations très rapides. Si le thread s'attarde dans un de ces états pour plusieurs secondes, il doit y avoir un problème qui mérite d'être étudié.Il existe encore d'autres états qui ne sont pas mentionné ci?dessus, mais la majorité sont utilisés pour trouver des bogues dans mysqld . 4.5.6.7 SHOW GRANTS SHOW GRANTS FOR user affiche la commande nécessaire pour donner les même droits qu'un utilisateur existant. mysql> SHOW GRANTS FOR root@localhost; +?????????????????????????????????????????????????????????????????????+ | Grants for root@localhost | +?????????????????????????????????????????????????????????????????????+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | +?????????????????????????????????????????????????????????????????????+ 4.5.6.8 Syntaxe de SHOW CREATE TABLE Affiche la commande CREATE TABLE nécessaire pour créer une table donnée. mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE t ( id int(11) default NULL auto_increment, s char(60) default NULL, PRIMARY KEY (id) ) TYPE=MyISAM SHOW CREATE TABLE va protéger le nom de la table et des colonnes selon l'option SQL_QUOTE_SHOW_CREATE . Syntaxe de SET . 4.6 Localisation de MySQL et utilisation internationale 4.6.1 Le jeu de caractères utilisé pour les données et le stockage Par défaut, MySQL utilise le jeu de caractères ISO?8859?1 (Latin1) avec tri en accord au Suédois/Finnois. C'est le jeu de caractère le mieux adapté pour les USA et l'Europe de l'ouest. Tous les binaires standards MySQL sont compilés avec ??with?extra?charsets=complex . Cela ajoutera du code à tous les programmes standards pour qu'ils puissent gérer latin1 et tous les jeux de caractères multi?octets compris dans le binaire. Les autres jeux de caractères seront chargés à partir d'un fichier de définition de jeu si besoin. Le jeu de caractères détermine quels caractères sont autorisés dans les noms et comment s'effectuent les tris dans les clauses ORDER BY et GROUP BY de la commande SELECT . 4.5.6.7 SHOW GRANTS 247 Manuel MySQL 4.1.x ? Version Française Vous pouvez changer le jeu de caractères avec l'option de démarrage du serveur ??default?character?set . Les jeux de caractères disponibles dépendent des options ??with?charset=charset et ??with?extra?charsets= list?of?charset | complex | all de configure , et des fichiers de configuration de jeux de caractères situés dans SHAREDIR/charsets/Index . Les options habituelles de configure . Si vous changez le jeu de caractères lors de l'utilisation de MySQL (ce qui pourra aussi changer l'ordre de tri), vous devez exécuter myisamchk ?r ?q ??set?character?set=charset sur toutes les tables. Sinon, vos index pourront ne pas être ordonnés correctement. Lorsqu'un client se connecte à un serveur MySQL, le serveur envoie le jeu de caractères utilisé par défaut au client. Le client changera de jeu de caractères pour cette connexion. Vous devez utiliser mysql_real_escape_string() pour protéger les chaînes pour une requête SQL. mysql_real_escape_string() est identique à l'ancienne fonction mysql_escape_string() , excepté qu'elle prend le gestionnaire de connexion MYSQL en tant que premier paramètre. Si le client est compilé avec d'autres chemins que ceux où le serveur est installé et que la personne qui a configuré MySQL n'a pas inclut tous les jeux de caractères dans le binaire MySQL, vous devez indiquer au client où il peut trouver les jeux de caractères additionnels dont il aura besoin si le serveur utilise un autre jeu de caractères que le client. On peut le spécifier en plaçant dans un fichier d'options MySQL : [client] character?sets?dir=/usr/local/mysql/share/mysql/charsets où le chemin pointe vers le répertoire où les jeux de caractères dynamiques de MySQL sont stockés. On peut forcer le client à utiliser un jeu de caractères spécifique en précisant : [client] default?character?set=character?set?name mais on n'en a normalement jamais besoin. b 4.6.1.1 Jeu de caractères allemand Pour obtenir l'ordre de tri Allemand, vous devez démarrer mysqld avec ??default?character?set=latin1_de . Cela vous donnera les caractéristiques différentes. Lors du tri et de la comparaison des chaînes, les remplacements suivants sont faits dans la chaîne avant d'effectuer la comparaison : ä ?> ae ö ?> oe ü ?> ue ß ?> ss Tous les caractères accentués sont convertis en leur majuscule non?accentuée. Toutes les lettres sont transformées en majuscules. 4.6.1.1 Jeu de caractères allemand 248 Manuel MySQL 4.1.x ? Version Française Lors de la comparaison des chaînes de caractères avec LIKE le conversion un ?> deux caractères n'est pas effectuée. Toutes les lettres sont transformées en majuscules. Les accents sont supprimés de toutes les lettres, à l'exception de : Ü , ü , Ö , ö , Ä et ä . 4.6.2 Langue des messages d'erreurs mysqld peut émettre des messages d'erreurs dans les langues suivantes : Tchèque, Danois, Néerlandais, Anglais (par défaut), Estonien, Français, Allemand, Grec, Hongrois, Italien, Japonais, Coréen, Norvégien, Norwegian?ny, Polonais, Portugais, Roumain, Russe, Slovaque, Espagnol et Suédois. Pour démarrer mysqld avec une langue particulière, utilisez soit l'option ??language=lang , soit ?L lang . Par exemple : shell> mysqld ??language=french ou : shell> mysqld ??language=/usr/local/share/french Notez que tout les noms de langue sont spécifiés en fichiers de langue sont situés (par défaut) dans Array . Pour modifier le fichier de messages d'erreurs, vous devez éditer le fichier et exécuter la commande suivante pour générer le fichier : shell> comp_err Si vous changez de version de MySQL, pensez à modifier le nouveau fichier . 4.6.3 Ajouter un nouveau jeu de caractères Pour ajouter un autre jeu de caractères à MySQL, utilisez la procédure suivante. Décidez s'il s'agit d'un jeu simple ou complexe. Si le jeu de caractères n'a pas besoin d'utiliser des routines d'assemblage de chaînes spéciales pour le tri et n'a pas besoin du support des jeux de caractères multi?octets, il est simple. S'il a besoin de l'une de ces deux fonctionnalités, il est complexe. Par exemple, latin1 et danish sont des jeux de caractères simples tandis que big5 et czech sont complexes. Dans la section suivante, nous supposons que vous nommez votre jeu de caractères MONJEU . Pour un jeu de caractères simple, effectuez ce qui suit : Ajoutez MONJEU à la fin du fichier • sql/share/charsets/Index Assignez?lui un nombre unique. Créez le fichier • . (Vous pouvez vous inspirer de .)La syntaxe pour le fichier est très simple : Les commentaires commencent avec le caractère '#' et se terminent à la fin de la ? ligne. Les mots sont séparés par un nombre changeant d'espaces blancs. ? 4.6.2 Langue des messages d'erreurs 249 Manuel MySQL 4.1.x ? Version Française Lors de la définition d'un jeu de caractères, chaque mot doit être un nombre au ? format hexadécimal. Le tableau ? ctype prends les 257 premiers mots. Les tableaux to_lower[] , to_upper[] et sort_order[] prennent chacun 256 mots après cela. Ajoutez le nom du jeu de caractères aux listes • CHARSETS_AVAILABLE et COMPILED_CHARSETS dans . Reconfigurez, recompilez et testez. • Pour un jeu de caractères complexe faites ce qui suit : Créez le fichier • strings/ctype?MONJEU.c dans la distribution des sources MySQL. Ajoutez MONJEU à la fin du fichier • sql/share/charsets/Index . Assignez?lui un nombre unique. Regardez un des fichiers • ctype?*.c existant pour voir ce qui doit être défini, par exemple, strings/ctype?big5.c . Notez que les tableaux dans votre fichier doivent avoir des noms tels que ctype_MONJEU , to_lower_MONJEU , etc. Cela correspond aux tableaux de caractère complexe Au début du fichier, placez un commentaire spécial comme celui?ci : • /* * This comment is parsed by configure to create ctype.c, * so don't change it unless you know what you are doing. * * .configure. number_MONJEU=MYNUMBER * .configure. strxfrm_multiply_MONJEU=N * .configure. mbmaxlen_MONJEU=N */ Le programme configure utilise ce commentaire pour inclure automatiquement le jeu de caractères dans la librairie MySQL. Les lignes strxfrm_multiply et mbmaxlen seront expliquées dans les sections suivantes. Ne les incluez que si vous avez besoin des fonctions d'assemblage des chaînes ou des fonctions de jeu de caractères multi?octets, respectivement. Vous devez alors créer les fonctions suivantes : • my_strncoll_MONJEU() ? my_strcoll_MONJEU() ? my_strxfrm_MONJEU() ? my_like_range_MONJEU() ? Ajoutez le nom du jeu de caractères aux listes • CHARSETS_AVAILABLE et COMPILED_CHARSETS dans . Reconfigurez, recompilez et testez. • Le fichier sql/share/charsets/README fournit plus d' vous voulez qu'un jeu de caractères soit ajouté dans la distribution MySQL, envoyez un patch à . 4.6.4 Le tableau de définition des caractères to_lower[] et to_upper[] sont de simples tableaux qui contiennent les caractères minuscules et majuscules correspondant à chaque membre du jeu de caractère. Par exemple : to_lower['A'] doit contenir 'a' to_upper['a'] doit contenir 'A' 4.6.4 Le tableau de définition des caractères 250 Manuel MySQL 4.1.x ? Version Française sort_order[] est une carte indiquant comment les caractères doivent être ordonnés pour les comparaisons et les tris. Pour beaucoup de jeux de caractères, c'est la même chose que to_upper[] (ce qui signifie que le tri sera insensible à la casse). MySQL triera les caractères en se basant sur la valeur de sort_order[caractère] . Pour des règles de tri plus compliquées, voyez la discussion suivante sur l'assemblage des chaînes. Support d'assemblage de chaînes . ctype[] est un tableau de valeurs de bit, avec un élément par caractère. (Notez que to_lower[] , to_upper[] , et sort_order[] sont indexés par la valeur du caractère, mais que ctype[] est indexé par la valeur du caractère + 1. C'est une vielle habitude pour pouvoir gérer EOF .) Vous pouvez trouver les définitions de bitmask suivantes dans m_ctype.h : #define _U 01 /* Majuscule */ #define _L 02 /* Minuscule */ #define _N 04 /* Numérique (nombre) */ #define _S 010 /* Caractère d'espacement */ #define _P 020 /* Ponctuation */ #define _C 040 /* Caractère de contrôle */ #define _B 0100 /* Blanc */ #define _X 0200 /* nombre hexadecimal */ L'entrée ctype[] de chaque caractère doit être l'union des valeurs de masque de bits qui décrivent le caractère. Par exemple, 'A' est un caractère majuscule ( _U ) autant qu'une valeur hexadécimale ( _X ), et donc ctype['A'+1] doit contenir la valeur : _U + _X = 01 + 0200 = 0201 4.6.5 Support d'assemblage des chaînes Si les règles de tri de votre langue sont trop complexes pour être gérées par le simple tableau sort_order[] , vous devez utiliser les fonctions d'assemblage de chaînes. Jusqu'à présent, la meilleure documentation traitant de ce sujet est présente dans les jeux de caractères implémentés eux?mêmes. Regardez les jeux de caractères big5 , czech , gbk , sjis , et tis160 pour des exemples. Vous devez spécifier la valeur de strxfrm_multiply_MYSET=N dans le commentaire spécial au début du fichier. N doit être le rationnel maximal vers lequel la chaîne pourra croître durant my_strxfrm_MYSET (cela doit être un entier positif). 4.6.6 Support des caractères multi?octets Si vous voulez ajouter le support de jeu de caractères incluant des caractères multi?octets, vous devez utiliser les fonctions de caractères multi?octets. Jusqu'à présent, la meilleure documentation traitant de ce sujet est présente dans les jeux de caractères implémentés eux?mêmes. Regardez les jeux de caractères euc_kr , gb2312 , gbk , sjis , et ujis pour des exemples. Ils sont implémentés dans les fichiers ctype?'charset'.c dans le dossier strings . Vous devez spécifier la valeur de mbmaxlen_MYSET=N dans le commentaire spécial en haut du fichier source. N doit être la taille en octet du caractère le plus large dans le jeu. 4.6.5 Support d'assemblage des chaînes 251 Manuel MySQL 4.1.x ? Version Française 4.6.7 Problèmes avec les jeux de caractères Si vous essayez d'utiliser un jeu de caractères qui n'est pas compilé dans votre exécutable, vous pouvez rencontrer différents problèmes : Votre programme a un chemin faux en ce qui concerne l'endroit où sont stockés les jeux de • caractères. (Par défaut /usr/local/mysql/share/mysql/charsets ). Cela peut être réparé en utilisant l'option ??character?sets?dir du programme en question. Le jeu de caractères est un jeu de caractères multi?octets qui ne peut être chargé • dynamiquement. Dans ce cas, vous devez recompiler le programme en incluant le support du jeu de caractère. Le jeu de caractères est un jeu de caractères dynamique, mais vous n'avez pas de fichier de • configuration lui étant associé. Dans ce cas, vous devez installer le fichier de configuration du jeu de caractères à partir d'une nouvelle distribution MySQL. Votre fichier • Index ne contient pas le nom du jeu de caractères. ERROR 1105: File '' not found (Errcode: 2) Dans ce cas, vous devez soit obtenir un nouveau fichier Index ou ajouter à la main le nom du jeu de caractères manquant. Pour les tables MyISAM , vous pouvez vérifier le nom du jeu de caractères et son nombre associé d'une table avec myisamchk ?dvv nom_de_table . 4.7 Scripts serveur MySQL et utilitaires 4.7.1 Présentation des scripts serveurs et des utilitaires Tous les programmes MySQL prennent des options différentes. Toutefois, tous les programmes MySQL disposent de l'option ??help qui vous aidera a connaitre la liste complète des différentes options. Essayez par exemple mysql ??help . Vous pouvez modifier toutes les valeurs par défaut des programmes en les plaçant dans le fichier de configuration. Fichier d'options . Voici la liste des programmes coté serveur de MySQL : myisamchk Un utilitaire pour décrire, vérifier, optimiser et réparer les tables MySQL. Comme myisamchk a de très nombreuses fonctions, ce programme dispose de son propre chapitre dans la documentation. Administration de la base . make_binary_distribution Prépare une version exécutable d'un MySQL compilé. Il doivent être envoyés par FTP à /pub/mysql/Incoming sur pour en faire profiter les autres utilisateurs MySQL. mysqlbug Le script de rapport de bogue. Ce script doit toujours être utilisé lorsque vous devez envoyez un rapport de bogues aux listes de diffusion de MySQL. mysqld Le démon SQL. Il doit toujours être en fonctionnement. mysql_install_db Crée les tables de droits MySQL, avec les droits par défaut. Il est généralement exécuté une fois, lors de la première installation de MySQL. 4.6.7 Problèmes avec les jeux de caractères 252 Manuel MySQL 4.1.x ? Version Française 4.7.2 safe_mysqld , le script père de mysqld safe_mysqld est la méthode recommandée pour démarrer un démon mysqld sous Unix. safe_mysqld ajoute des fonctionnalités de sécurité telles que le redémarrage automatique lorsqu'une erreur survient et l'enregistrement d'informations d'exécution dans un fichier de log. Si vous n'utilisez pas ??mysqld=# ou ??mysqld?version=# safe_mysqld va utiliser un programme appelé mysqld?max s'il existe. Sinon, safe_mysqld va démarrer le démon mysqld . Cela rend très facile le test de mysqld?max au lieu de mysqld ; copiez simplement mysqld?max à coté de mysqld et il sera utilisé. Normalement, vous ne devriez jamais éditer le script safe_mysqld , mais plutôt utiliser les options de safe_mysqld dans la section [safe_mysqld] du fichier . safe_mysqld va lire toutes les options des sections [mysqld] , [server] et [safe_mysqld] , dans le fichier d'options. Fichier d'options . Notez que toutes les options de ligne de commande passées à safe_mysqld sont transmises à mysqld . Si vous voulez utiliser une option de safe_mysqld que mysqld ne supporte pas, vous devez la spécifier dans le fichier d'options. La plupart des options de safe_mysqld sont les mêmes que celles de mysqldde commande de mysqld . safe_mysqld supporte les options suivantes : ??basedir=path ??core?file?size=# Taille du fichier core que mysqld doit être capable de créer. Il est passé à ulimit ?c . ??datadir=path ??defaults?extra?file=path ??defaults?file=path ??err?log=path ??ledir=path Chemin de mysqld ??log=path ??mysqld=mysqld?version Nom de la version de mysqld dans le dossier ledir que vous voulez démarrer. ??mysqld?version=version Similaire à ??mysqld= mais vous ne donnez que le suffixe de mysqld . Par exemple, si vous utilisez ??mysqld?version=max , safe_mysqld va démarrer la version ledir/mysqld?max . Si l'argument de ??mysqld?version est vide, ledir/mysqld sera utilisé. ??no?defaults ??open?files?limit=# Nombre de fichiers que mysqld doit être capable d'ouvrir. Passé à ulimit ?n . Notez que vous devez démarrer safe_mysqld en tant que root pour que cette option fonctionne correctement ! ??pid?file=path ??port=# ??socket=path ??timezone=# Configure le fuseau horaire (le TZ ). ??user=# 4.7.2 safe_mysqld , le script père de mysqld 253 Manuel MySQL 4.1.x ? Version Française Le script safe_mysqld a été écrit pour qu'il soit capable de démarrer le serveur qui a été installé à partir des sources ou de la version binaire, même si l'installation de MySQL est légèrement exotique. safe_mysqld suppose que les conditions suivantes sont remplies : Le serveur et les bases de données sont placées dans un dossier relativement au dossier • d'où safe_mysqld est appelé. safe_mysqld cherche dans les sous dossiers bin et data (pour les distributions binaires) et, libexec et var (pour les distributions sources). Cette condition doit être remplie si vous exécutez safe_mysqld depuis votre dossier d'installation MySQL (par exemple, /usr/local/mysql pour une distribution binaire). Si le serveur et les bases de données ne peuvent être trouvées dans le dossier de travail, • safe_mysqld essaie de les trouver en utilisant leurs chemins absolus. Les chemin typiquement étudiés sont /usr/local/libexec et /usr/local/var . Les chemins réels sont déterminés lorsque la distribution est compilée, et safe_mysqld a alors aussi été généré. Ils doivent être corrects si MySQL a été installé dans un dossier standard. Comme safe_mysqld essaie de trouver le serveur et les bases dans un dossier situé dans le dossier de travail, vous pouvez installer la version binaire de MySQL n'importe où, du moment que vous démarrez le script safe_mysqld dans le dossier d'installation de MySQL : shell> cd mysql_installation_directory shell> bin/safe_mysqld & Si safe_mysqld échoue, même si il est appelé depuis le dossier d'installation, vous pouvez le modifier pour qu'il reconnaisse le chemin que vous utilisez jusqu'à mysqld . Notez que si vous faites évoluer votre installation de MySQL, votre version de safe_mysqld sera écrasée, et vous devrez la rééditer. 4.7.3 mysqld_multi , un programme pour gérer plusieurs serveurs MySQL mysqld_multi sert à gérer plusieurs serveurs mysqld qui utilisent différentes sockets Unix et ports TCP/IP. Le programme va rechercher les groupes nommés [mysqld#] dans le fichier (ou le fichier appelé ??config?file=... ), où # peut être n'importe quel nombre positif, supérieur ou égal à 1. Ce nombre est appelé le numéro de groupe d'options. Les numéros de groupe permettent de distinguer un groupe d'options d'un autre, et sont utilisés comme argument du script mysqld_multi pour spécifier quel serveur vous voulez démarrer, arrêter ou examiner. Les options listées dans ces groupes doivent être les mêmes que celle que vous utiliseriez dans une section dédiée au démon [mysqld]Cependant, pour mysqld_multi , vous devez vous assurer que chaque groupe contient des valeurs pour les options telles que port, socket, etc., qui seront utilisées par chaque processus mysqld . mysqld_multi est utilisé ave la syntaxe suivante : Usage: mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...] or mysqld_multi [OPTIONS] {start|stop|report} [GNR?GNR,GNR,GNR?GNR,...] Chaque GNR représente un numéro de groupe d'options. Vous pouvez démarrer, arrêter ou examiner n'importe quel numéro de groupe d'options, ou même plusieurs d'entre eux en même temps. Pour un exemple de comment configurer le fichier d'options, utilisez cette commande : shell> mysqld_multi ??example Les valeurs de numéro de groupe d'options peuvent être une liste de valeurs séparées par une virgule ou un tiret. Dans ce dernier cas, toutes les numéro de groupe d'options situés entre les deux 4.7.3 mysqld_multi , un programme pour gérer plusieurs serveurs MySQL 254 Manuel MySQL 4.1.x ? Version Française numéros seront alors affectés. Sans numéro de groupe d'options spécifié, tous les numéros de groupes du fichier d'options sont affectés. Notez que vous ne devez pas avoir d'espace dans la liste des numéros de groupe d'options. Tout ce qui est placé au?delà de l'espace sera ignoré. mysqld_multi supporte les options suivantes : ??config?file=... Un fichier de configuration alternatif. Note : cela ne va pas modifier les options de ce programme ( [mysqld_multi] ), mais uniquement les groupes [mysqld#] . Sans cette option, tout sera lu dans le fichier d'options traditionnel . ??example Affiche un exemple de fichier de configuration. ??help Affiche l'aide et quitte. ??log=... Fichier de log. Le chemin complet et le nom du fichier sont nécessaires. Note : si le fichier existe déjà, les prochaines données seront ajoutées au fichier. ??mysqladmin=... L'exécutable mysqladmin à utiliser lors de l'arrêt du serveur. ??mysqld=... L'exécutable mysqld à utiliser. Notez que vous pouvez donner cette option à safe_mysqld . Ces options sont passées à mysqld . Assurez?vous que vous avez bien mysqld dans votre variable d'environnement PATH ou corrigez safe_mysqld . ??no?log Affiche les données d'historique à l'écran plutôt que dans le fichier de log. Par défaut, le fichier de log est activé. ??password=... Le mot de passe de l'utilisateur mysqladmin . ??tcp?ip Connexion au serveur MySQL via le port TCP/IP au lieu de la socket Unix. Cela affecte l'arrêt et le rapport. Si le fichier de socket manque, le serveur peut continuer de tourner, mais il n'est plus accessible que par port TCP/IP. Par défaut, les connexions sont faites avec les sockets Unix. ??user=... L'utilisateur MySQL pour mysqladmin . ??version Affiche le numéro de version et quitte. Quelques notes pour mysqld_multi : Assurez?vous que l'utilisateur MySQL, qui stoppe les services • mysqld (e.g en utilisant la commande mysqladmin ), a les mêmes nom d'utilisateur et mot de passe pour tous les dossiers de données utilisés. Et assurez?vous que cet utilisateur a bien les droits de SHUTDOWN ! Si vous avez de nombreux dossiers de données et de nombreuses bases mysql avec différents mots de passe pour le serveur root MySQL, vous souhaiterez peut être créer un utilisateur commun multi_admin à chaque base, avec le même mot de passe (voir ci?dessous). Voici comment faire : shell> mysql ?u root ?S ?proot_password ?e "GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'multipass'" chaque serveur mysqld qui fonctionne : changez simplement la socket, ?S=... ). pid?file • est très important, si vous utilisez safe_mysqld pour démarrer mysqld (e.g., ??mysqld=safe_mysqld ). Chaque mysqld doit avoir son propre fichier pid?file . L'avantage d'utiliser safe_mysqld au lieu de mysqld est que safe_mysqld ``surveille'' tous les processus mysqld et les redémarrera si un processus mysqld s'arrête suite à la 4.7.3 mysqld_multi , un programme pour gérer plusieurs serveurs MySQL 255 Manuel MySQL 4.1.x ? Version Française reception d'un signal kill ?9 , ou pour toute autre raison comme une erreur de segmentation (que MySQL ne devrait jamais faire, bien sûr !). Notez bien que le script safe_mysqld vous imposera peut être d'être démarré depuis un dossier spécial. Cela signifie que vous devrez probablement utiliser la commande shell cd jusqu'à un certain dossier avant de pouvoir exécuter mysqld_multi . Si vous avez des problèmes pour démarrer, voyez le script safe_mysqld . Vérifiez notamment ces lignes : ?????????????????????????????????????????????????????????????????????????? MY_PWD=`pwd` Check if we are starting this relative (for the binary release) if test ?d /data/mysql ?a ?f ?a ?x ./bin/mysqld ?????????????????????????????????????????????????????????????????????????? vous rencontrerez probablement des problèmes. N'oubliez jamais les problèmes que peut soulever le démarrage de plusieurs démons • mysqld avec le même dossier de données. Utilisez des dossiers de données séparés, à moins que vous ne sachiez bien ce que vous faites. Le fichier de socket et le port TCP/IP doivent être différents pour chaque • mysqld . Le premier et le cinquième groupe • mysqld on été intentionnellement ignorés dans le groupe d'exemple. Vous pouvez laisser des trous dans le fichier de configuration. Cela vous donnera plus de souplesse. L'ordre dans lequel les démons mysqlds sont démarrés ou arrétés dépend de l'ordre dans lequel ils apparaissent dans le fichier de configuration. Lorsque vous voulez faire référence à un groupe en utilisant le numéro de groupe d'options, • utilisez simplement le numéro du groupe à la fin du nom du groupe. Par exemple, le numéro de groupe de [mysqld17] est le 17. Vous pouvez vouloir utiliser l'option • ??user pour mysqld , mais afin de faire cela, vous devez exécuter le script mysqld_multi en tant que root Unix. Placer cette option dans le fichier de configuration ne changera rien : vous obtiendrez une alerte, si vous n'êtes pas le super utilisateur, et les démons mysqld seront démarrés avec vos droits Unix. Important : assurez?vous bien que le fichier de données et le fichier de pid?file sont accessibles en lecture et écriture (et exécution pour le dernier) à l'utilisateur Unix qui lance les processus mysqld . N'utilisez pas le compte root Unix pour cela, à moins que vous ne sachiez ce que vous faîtes. Très important • : assurez?vous de bien comprendre la signification des options que vous passez à mysqld s et pourquoi vous avez besoin de plusieurs processus mysqld . Démarrer plusieurs serveurs mysqld s dans le même dossier ne vous donnera aucun gain de performance dans un système threadé. configuration fourni par mysqld_multi . # This file should probably be in your home dir () or # Version 2.1 by Jani Tolonen [mysqld_multi] mysqld = /usr/local/bin/safe_mysqld mysqladmin = /usr/local/bin/mysqladmin user = multi_admin password = multipass [mysqld2] socket = /tmp/mysql.sock2 port = 3307 pid?file = /usr/local/mysql/var2/hostname.pid2 datadir = /usr/local/mysql/var2 language = /usr/local/share/mysql/english user = john [mysqld3] socket = /tmp/mysql.sock3 4.7.3 mysqld_multi , un programme pour gérer plusieurs serveurs MySQL 256 Manuel MySQL 4.1.x ? Version Française port = 3308 pid?file = /usr/local/mysql/var3/hostname.pid3 datadir = /usr/local/mysql/var3 language = /usr/local/share/mysql/swedish user = monty [mysqld4] socket = /tmp/mysql.sock4 port = 3309 pid?file = /usr/local/mysql/var4/hostname.pid4 datadir = /usr/local/mysql/var4 language = /usr/local/share/mysql/estonia user = tonu [mysqld6] socket = /tmp/mysql.sock6 port = 3311 pid?file = /usr/local/mysql/var6/hostname.pid6 datadir = /usr/local/mysql/var6 language = /usr/local/share/mysql/japanese user = jani Fichier d'options . 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule myisampack sert à compresser des tables MyISAM et pack_isam sert à compresser les tables ISAM. Comme les tables ISAM sont obsolètes, nous ne traiterons que de myisampack , mais tout ce qui est dit au sujet de myisampack est aussi vrai pour pack_isam . myisampack fonctionne en compressant séparément chaque colonne de la table. Les informations nécessaires à la décompression sont lues en mémoire lorsque la table est ouverte. Cela donne de bien meilleures performances lors de l'accès à des lignes individuelles, car nous n'avez qu'à décompresser exactement une des lignes, et non pas un bloc de disque entier. Généralement, myisampack compresse le fichier avec un gain de 40 à 70 %. MySQL utilise la carte mémoire ( mmap() ) sur les tables compressées et utilise les outils classiques de lecture et écriture si mmap() ne fonctionne pas.Notez bien ceci : Après avoir compressé la table, celle?ci n'est plus accessible qu'en lecture. C'est souvent • un état voulu (par exemple, pour être gravée sur un CD). De plus, autoriser les écritures dans une table compressée fait partie de notre liste de tâche, mais avec une très faible priorité. myisampack • peut aussi compresser des colonnes BLOB ou TEXT . L'ancien pack_isam (pour les tables ISAM ) ne peut le faire. myisampack est invoqué comme ceci : shell> myisampack [options] filename ... Chaque nom de fichier doit être le nom d'un fichier d'index ( .MYI ). Si vous n'êtes pas dans le dossier de données, vous devez spécifier le chemin complet jusqu'au fichier. Il est toléré que vous omettiez l'extension du fichier .MYI . myisampack supporte les options suivantes : ?b, ??backup Fait une sauvegarde de la table sous le nom de . 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule 257 Manuel MySQL 4.1.x ? Version Française ?#, ??debug=debug_options Affiche le log de débogage. La chaîne debug_options vaut souvent 'd:t:o,filename' . ?f, ??force Force la compression de la table, même si elle grossit ou si le fichier temporaire existe déjà. myisampack crée un fichier temporaire appelé lors de la compression. Si vous tuez myisampack , le fichier .TMD peut ne pas être effacé. Normalement, myisampack se termine avec une erreur s'il découvre que le fichier existe. Avec ??force , myisampack reprendra le travail. ??, ??help Affiche le message d'aide et quitte. ?j big_tbl_name, ??join=big_tbl_name Rassemble toutes les tables indiquées dans la ligne de commande dans une seule table appelée big_tbl_name . Toutes les tables qui seront combinées doivent être identiques (mêmes noms de colonnes, mêmes types, mêmes index, etc.) ?p #, ??packlength=# Spécifie la taille de stockage de la longueur de ligne, en octets. Cette valeur doit être 1, 2, ou 3. ( myisampack stocke toutes les lignes avec des pointeurs de lignes de 1, 2 ou 3 octets. Dans les cas normaux, myisampack peut déterminer la taille correcte avant de compresser le fichier, mais il peut aussi se rendre compte durant le processus qu'une autre taille aurait été plus appropriée, ou plus courte. Dans ce cas, myisampack va imprimer une note pour que vous le sachiez lors de la prochaine compression du même fichier. ?s, ??silent Mode silencieux. Seules les erreurs seront affichées. ?t, ??test Ne compresse pas la table, mais teste juste la compression. ?T dir_name, ??tmp_dir=dir_name Utilise le dossier indiqué comme dossier pour les fichiers temporaires. ?v, ??verbose Mode détaillé. Toutes les informations sur la progression de la compression seront affichées. ?V, ??version Affiche la version et quitte. ?w, ??wait Attend et reessaie, si la table était déjà en cours d'utilisation. Si le serveur mysqld a été démarré avec l'option ??skip?external?locking , ce n'est pas une bonne idée d'appeler myisampack , car la table risque d'être modifiée durant la compression. La séquence de commande illustre la session de compression : shell> ls ?l station.* ?rw?rw?r?? 1 monty my 994128 Apr 17 19:00 ?rw?rw?r?? 1 monty my 53248 Apr 17 19:00 ?rw?rw?r?? 1 monty my 5767 Apr 17 19:00 shell> myisamchk ?dvv station MyISAM file: station Isam?version: 2 Creation time: 1996?03?13 10:08:58 Recover time: 1997?02?02 3:06:43 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 Max datafile length: 54657023 Max keyfile length: 33554431 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule 258 Manuel MySQL 4.1.x ? Version Française Recordlength: 834 Record format: Fixed length table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 1024 1024 1 2 32 30 multip. text 10240 1024 1 Field Start Length Type 1 1 1 2 2 4 3 6 4 4 10 1 5 11 20 6 31 1 7 32 30 8 62 35 9 97 35 10 132 35 11 167 4 12 171 16 13 187 35 14 222 4 15 226 16 16 242 20 17 262 20 18 282 20 19 302 30 20 332 4 21 336 4 22 340 1 23 341 8 24 349 8 25 357 8 26 365 2 27 367 2 28 369 4 29 373 4 30 377 1 31 378 2 32 380 8 33 388 4 34 392 4 35 396 4 36 400 4 37 404 1 38 405 4 39 409 4 40 413 4 41 417 4 42 421 4 43 425 4 44 429 20 45 449 30 46 479 1 47 480 1 48 481 79 49 560 79 50 639 79 51 718 79 52 797 8 53 805 1 54 806 1 55 807 20 56 827 4 57 831 4 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule 259 Manuel MySQL 4.1.x ? Version Française shell> myisampack Compressing : (1192 records) ? Calculating statistics normal: 20 empty?space: 16 empty?zero: 12 empty?fill: 11 pre?space: 0 end?space: 12 table?lookups: 5 zero: 7 Original trees: 57 After join: 17 ? Compressing file 87.14% shell> ls ?l station.* ?rw?rw?r?? 1 monty my 127874 Apr 17 19:00 ?rw?rw?r?? 1 monty my 55296 Apr 17 19:04 ?rw?rw?r?? 1 monty my 5767 Apr 17 19:00 shell> myisamchk ?dvv station MyISAM file: station Isam?version: 2 Creation time: 1996?03?13 10:08:58 Recover time: 1997?04?17 19:04:26 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1 Max datafile length: 16777215 Max keyfile length: 131071 Recordlength: 834 Record format: Compressed table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 10240 1024 1 2 32 30 multip. text 54272 1024 1 Field Start Length Type Huff tree Bits 1 1 1 constant 1 0 2 2 4 zerofill(1) 2 9 3 6 4 no zeros, zerofill(1) 2 9 4 10 1 3 9 5 11 20 table?lookup 4 0 6 31 1 3 9 7 32 30 no endspace, not_always 5 9 8 62 35 no endspace, not_always, no empty 6 9 9 97 35 no empty 7 9 10 132 35 no endspace, not_always, no empty 6 9 11 167 4 zerofill(1) 2 9 12 171 16 no endspace, not_always, no empty 5 9 13 187 35 no endspace, not_always, no empty 6 9 14 222 4 zerofill(1) 2 9 15 226 16 no endspace, not_always, no empty 5 9 16 242 20 no endspace, not_always 8 9 17 262 20 no endspace, no empty 8 9 18 282 20 no endspace, no empty 5 9 19 302 30 no endspace, no empty 6 9 20 332 4 always zero 2 9 21 336 4 always zero 2 9 22 340 1 3 9 23 341 8 table?lookup 9 0 24 349 8 table?lookup 10 0 25 357 8 always zero 2 9 26 365 2 2 9 27 367 2 no zeros, zerofill(1) 2 9 28 369 4 no zeros, zerofill(1) 2 9 29 373 4 table?lookup 11 0 30 377 1 3 9 31 378 2 no zeros, zerofill(1) 2 9 32 380 8 no zeros 2 9 33 388 4 always zero 2 9 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule 260 Manuel MySQL 4.1.x ? Version Française 34 392 4 table?lookup 12 0 35 396 4 no zeros, zerofill(1) 13 9 36 400 4 no zeros, zerofill(1) 2 9 37 404 1 2 9 38 405 4 no zeros 2 9 39 409 4 always zero 2 9 40 413 4 no zeros 2 9 41 417 4 always zero 2 9 42 421 4 no zeros 2 9 43 425 4 always zero 2 9 44 429 20 no empty 3 9 45 449 30 no empty 3 9 46 479 1 14 4 47 480 1 14 4 48 481 79 no endspace, no empty 15 9 49 560 79 no empty 2 9 50 639 79 no empty 2 9 51 718 79 no endspace 16 9 52 797 8 no empty 2 9 53 805 1 17 1 54 806 1 3 9 55 807 20 no empty 3 9 56 827 4 no zeros, zerofill(2) 2 9 57 831 4 no zeros, zerofill(1) 2 9 Les informations affichées par myisampack sont décrites ici : normal Le nombre de colonnes pour lesquelles aucune compression n'est utilisée. empty?space Le nombre de colonnes dont les valeurs ne contiennent que des octets : elles n'occuperont plus qu'un octet. empty?zero Le nombre de colonnes dont les valeurs ne contiennent que des zéros : elles n'occuperont plus qu'un octet. empty?fill Le nombre de colonnes de type entier qui n'occupent pas la totalité de l'espace de leur type. Elles seront réduites en taille (par exemple, une colonne de type INTEGER sera transformée en MEDIUMINT ). pre?space Le nombre de colonnes de nombres à virgule flottante qui ont des valeurs stockées avec des espaces initiaux. Dans ce cas, chaque valeur va contenir le nombre d'espace initiaux. end?space Le nombre de colonnes qui ont de nombreux espaces terminaux. Dans ce cas, chaque valeur va contenir un compte du nombre d'espaces terminaux. table?lookup La colonne n'a que quelques valeurs différentes, qui seront converties en une colonne de type ENUM avant une compression de type Huffman. zero Le nombre de colonnes pour lesquelles toutes les valeurs sont zéro. Original trees Le nombre initial d'arbres Huffman. After join Le nombre d'arbres Huffman distincts obtenus après avoir joint les arbres pour économiser de l'espace d'entête. Après la compression d'une table, myisamchk ?dvv affiche des informations supplémentaires pour chaque champ : 4.7.4 myisampack , le générateur de tables MySQL compressées en lecture seule 261 Manuel MySQL 4.1.x ? Version Française Type Le type de fichier peut contenir les informations suivantes : constant Toutes les lignes ont la même valeur. no endspace Ne stocke pas les espaces finaux. no endspace, not_always Ne stocke pas les espaces finaux et ne compresse pas les espaces finaux pour toutes les valeurs. no endspace, no empty Ne stocke pas les espaces finaux. Ne stocke pas les valeurs vides. table?lookup La colonne a été convertie en ENUM . zerofill(n) Les n chiffres significatifs sont toujours 0, et n'ont pas été stockés. no zeros Ne stocke pas les zéros. always zero Les valeurs 0 sont stockées sur un octet. Huff tree L'arbre Huffman associé au champ. Bits Le nombre de bits utilisés par l'arbre Huffman. Après la compression de pack_isam / myisampack vous devez exécuter la commande isamchk / myisamchk pour recréer l'index. A ce moment, vous pouvez aussi trier les blocs d'index et créer des statistiques nécessaires pour l'optimisateur MySQL : myisamchk ?rq ??analyze ??sort?index isamchk ?rq ??analyze ??sort?index Après avoir installé la table compressée dans un dossier de données MysQL, vous devez exécutez la commande mysqladmin flush?tables pour forcer mysqld à utiliser cette nouvelle table. Si vous voulez décompresser une table compressée, vous pouvez le faire avec l'option ??unpack de la commande isamchk ou myisamchk . 4.7.5 mysqld?max , la version étendue du serveur mysqld mysqld?max est le serveur MySQL ( mysqld ) configuré avec les options suivantes : Option Comment ??with?server?suffix=?max Ajoute un suffixe à la chaîne de version de mysqld ??with?innodb Supporte les tables InnoDB. ??with?bdb Supporte les tables Berkeley DB (BDB) CFLAGS=?DUSE_SYMDIR Support des liens symboliques sous Windows. Vous pouvez obtenir les exécutables MySQL?max à les deux programmes standard et mysqld? . tables InnoDB et Berkeley DB ne sont pas disponibles sur toutes les plate?formes, et que certaines versions Max ne supportent pas les deux. Vous pouvez vérifier quelles tables sont supportées avec la requête suivante : 4.7.5 mysqld?max , la version étendue du serveur mysqld 262 Manuel MySQL 4.1.x ? Version Française mysql> SHOW VARIABLES LIKE "have_%"; +???????????????+???????+ | Variable_name | Value | +???????????????+???????+ | have_bdb | YES | | have_innodb | NO | | have_isam | YES | | have_raid | NO | | have_openssl | NO | +???????????????+???????+ La signification des valeurs est : Valeur Signification YES L'option est activatée et utilisable. NO MySQL n'a pas été compilé avec le support pour cette option. L'option xxxx est désactivée car mysqld a été lancé avec ??skip?xxxx ou parce que DISABLED mysqld n'a pas été lancé avec les bonnes options. Dans ce cas, le fichier devrait contenir la raison pour laquelle l'option est désactivée. Note : pour être capable de créer des tables InnoDB, vous devez éditer vos options de démarrage et inclure au moins l'option innodb_data_file_path . Options de démarrage InnoDB . Pour avoir de meilleures performances avec les tables BDB, vous devriez aussi ajouter certaines options de configuration. Options de démarrage BDB . safe_mysqld va automatiquement lancer tout programme mysqld avec le suffixe ?max . Cela rend très facile les tests de mysqld , dans le cadre d'un installation existante. Il suffit d'exécuter le programme configure avec les options que vous souhaitez, et d'installer un nouveau programme mysqld sous le nom de mysqld?max dans le même dossier que votre ancien mysqld . safe_mysqld , le script père de mysqld . Les paquets RPM mysqld?max utilisent la fonctionnalité de safe_mysqld mentionnée plus tôt. Il suffit d'installer le programme mysqld?max et safe_mysqld va automatiquement utiliser cet exécutable lorsque safe_mysqld sera redémarré. La table suivante illustre les types de tables que MySQL?Max inclut : Système BDB InnoDB AIX 4.3 Non Oui HP?UX 11.0 Non Oui Linux?Alpha Non Oui Linux?Intel Oui Oui Linux?IA64 Non Oui Solaris?Intel Non Oui Solaris?SPARC Oui Oui Caldera (SCO) OSR5 Oui Oui UnixWare Oui Oui Windows/NT Oui Oui 4.8 MySQL Scripts clients et utilitaires 4.8 MySQL Scripts clients et utilitaires 263 Manuel MySQL 4.1.x ? Version Française 4.8.1 Présentation des scripts serveurs et utilitaires Tous les clients MySQL qui communiquent avec le serveur via la librairie mysqlclient utilisent les variables d'environnement suivantes : Nom Description MYSQL_UNIX_PORT La socket par défaut; utilisé pour les connexions à localhost MYSQL_TCP_PORT Le port TCP/IP par défaut MYSQL_PWD Le mot de passe par défaut MYSQL_DEBUG Des options de débogage et de traçage TMPDIR Le dossier où les fichiers et tables temporaires sont écrits L'utilisation de MYSQL_PWD n'est pas une technique sûre. Connexion au serveur MySQL . Le client mysql utilise le fichier indiqué dans la variable d'environnement MYSQL_HISTFILE pour sauver l'historique de la ligne de commande. La valeur par défaut pour la situation du fichier d'historique est $HOME/.mysql_history , où $HOME est la valeur de la variable d'environnement HOME . Variables d'environnement MySQL . Tous les programmes MySQL utilisent différentes options. Toutefois, tous les programmes MySQL disposent de l'option ??help pour vous donner une description complète de toutes les options du programme. Par exemple, essayez d'utiliser mysql ??help . Vous pouvez remplacer les valeurs par défaut des options de tous les clients standard en mettant d'autres valeurs dans le fichier de configuration. Fichier d'options . Voici un bref aperçu des programmes clients MySQL : msql2mysql Un script shell qui convertit les programmes mSQL vers MySQL. Il ne gère pas toutes les situations, mais c'est une très bonne base de travail. mysqlaccess Un script qui vérifie les droits d'accès du trio hôte, utilisateur et base de données. mysqladmin Un utilitaire pour réaliser des opérations d'administration de la base, telles que les créations de bases, le rafraîchissement des tables de droits, l'écriture des tables sur le disque et la réouverture des fichiers de log. à mysqladmin permet aussi de lire la version, les processus et les informations de statut du serveur. administrer un serveur MySQL . mysqldump Exporte une base de données MySQL dans un fichier sous la forme de requêtes SQL, ou de fichiers texte, avec la tabulation comme séparateur. Un freeware amélioré, d'après une idée originale de Igor Romanenko. structures de tables et les données . mysqlimport Importe les fichiers textes dans les tables, en utilisant la commande LOAD DATA INFILE . mysqlimport , importer des données depuis des fichiers texte . mysqlshow Affiche des informations sur les bases, tables, colonnes et index. replace Un utilitaire qui est utilisé par msql2mysql , qui a d'autres applications générales. replace modifie des chaînes dans des fichiers, ou sur l'entrée standard. Utilise une machine d'états pour rechercher les plus grands chaînes en premier. Sert à 4.8.1 Présentation des scripts serveurs et utilitaires 264 Manuel MySQL 4.1.x ? Version Française échanger des chaînes. Par exemple, cette commande échange les chaînes a et b dans les fichiers spécifiés : shell> replace a b b a ?? file1 file2 ... 4.8.2 mysql , The Command?line Tool mysql est un simple script SQL (qui exploite GNU readline ). Il supporte une utilisation interactive et non?interactive. Lorsqu'il est utilisé interactivement, les résultats des requêtes sont présentés sous la forme d'une table au format ASCII. Lorsqu'il est utilisé non?interactivement, par exemple, comme filtre, le résultat est fourni au format de liste avec séparation par tabulation (le format d'affichage peut être modifié en utilisant les options de ligne de commande). Vous pouvez exécuter le script comme ceci : shell> mysql database < > Si vous avez des problèmes liés à des insuffisances de mémoire avec le client, utilisez l'option ??quick ! Cela force mysql à utiliser mysql_use_result() plutôt que mysql_store_result() pour lire les résultats.Utiliser mysql est très simple. Il suffit de le démarrer comme ceci : mysql database ou mysql ??user=user_name ??password=your_password database . Tapez une commande SQL, puis terminez?la avec ';' , '\g' ou '\G' , et finissez avec Entrée. mysql supports the following options: ??, ??help Affiche cette aide et quitte. ?A, ??no?auto?rehash Pas de rehachage automatique. Il faut utiliser la commande 'rehash' pour obtenir la complétion des noms de tables et champs. Cela accélère le démarrage du client. ??prompt=... Modifie l'invite de commande de MySQL. ?b, ??no?beep Eteind le son d'erreur. ?B, ??batch Affiche les résultats avec une tabulation comme résultat, et chaque ligne avec une nouvelle ligne. N'utilise pas l'historique. ??character?sets?dir=... Le dossier où les jeux de caractères sont créés. ?C, ??compress Utilise la compression avec le protocole client?serveur. ?#, ??debug[=...] Démarre le log de débogage. Par défaut, il vaut 'd:t:o,/tmp/mysql.trace'. ?D, ??database=... La base de données à utiliser. C'est particulièrement pratique dans le fichier d'options . ??default?character?set=... Configure le jeu de caractères par défaut. ?e, ??execute=... Exécute une commande et quitte. Le résultat est au format de l'option ??batch ?E, ??vertical Affiche le résultat d'une requête verticalement. Sans cette option, vous pouvez aussi obtenir ce format en terminant votre requête avec \G . ?f, ??force Continue même si vous obtenez une erreur SQL. 4.8.2 mysql , The Command?line Tool 265 Manuel MySQL 4.1.x ? Version Française ?g, ??no?named?commands Les commandes nommées sont désactivées. Utilisez la forme \* uniquement, ou utilisez les commandes nommées au début d'une ligne se terminant par un point?virgule ( ';' ). Depuis la version 10.9, le client démarre avec cette option activée par défaut. Avec l'option ?g, le format long des commandes va continuer à fonctionner. ?G, ??enable?named?commands Les commandes nommées sont activées . Le format long est autorisé, ainsi que les commandes courtes \*. ?i, ??ignore?space Ignore les espaces après les noms de fonctions. ?h, ??host=... Connexion avec l'hôte indiqué. ?H, ??html Produit un résultat au format HTML. ?X, ??xml Produit un résultat au format XML. ?L, ??skip?line?numbers N'écrit pas les numéros de lignes dans les erreurs. Très pratique lorsque vous voulez comparer des résultats qui incluent des messages d'erreurs. ??no?pager Désactive le système de page, et affiche directement dans la sortie standard. Voyez l'aide interactive (\h). ??no?tee Désactive le outfile. Voyez l'aide interactive (\h). ?n, ??unbuffered Vide le buffer de requête après chaque requête. ?N, ??skip?column?names N'écrit pas les noms de colonnes dans les résultats. ?O, ??set?variable var=option Spécifie la valeur d'une variable. ??help liste toutes ces variables. Notez bien que ??set?variable est obsolète depuis MySQL 4.0, et qu'il suffit désormais d'utiliser ??var=option . ?o, ??one?database Ne modifie que la base par défaut. C'est pratique pour éviter les modifications dans les autres bases dans le fichier de log. ??pager[=...] Type d'affichage. Par défaut, la variable d'environnement ENV vaut PAGER . Les paginateurs valides sont less, more, cat [> filename], etc. Voyez l'aide interactive (\h). Cette option n'est pas effective en mode batch. Les paginateurs ne fonctionnent qu'avec Unix. ?p[password], ??password[=...] Le mot de passe utilisé lors de la connexion sur le serveur. S'il n'est pas donné en ligne de commande, il sera demandé interactivement. Notez que si vous utilisez la forme courte ?p , vous ne devez pas laisser d'espace entre l'option et le mot de passe. ?P ??port=... Le numéro de port TCP/IP pour la connexion. ?q, ??quick Ne met pas en cache le résultat, et l'affiche ligne par ligne. C'est plus lent pour le serveur, si le résultat est interrompu. N'utilise pas le fichier d'historique. ?r, ??raw Ecrit les valeurs des colonnes sans les conversions de protections. Utilisé en mode ??batch 4.8.2 mysql , The Command?line Tool 266 Manuel MySQL 4.1.x ? Version Française ?s, ??silent Mode très silencieux. ?S ??socket=... Le fichier de socket à utiliser pour la connexion. ?t ??table Affichage au format de table. C'est le mode par défaut pour le mode non?batch. ?T, ??debug?info Affiche des informations de débogage au moment de la fin du programme. ??tee=... Ajoute tout dans le fichier de sortie. Voyez l'aide interactive (\h). Ne fonctionne pas en mode batch. ?u, ??user=# Nom d'utilisateur pour la connexion, si ce n'est pas l'utilisateur Unix courant. ?U, ??safe?updates[=#], ??i?am?a?dummy[=#] N'autorise que les commandes UPDATE et DELETE qui utilisent des clés. Voir plus bas pour des informations sur cette option. Vous pouvez annuler cette option si vous l'avez dans le fichier d'option en utilisant la syntaxe ??safe?updates=0 . ?v, ??verbose Affichage plus détaillé (?v ?v ?v indique le format d'affichage de table). ?V, ??version Affiche la version et quitte. ?w, ??wait Attend et retente si la connexion s'interrompt, au lieu de quitter. Vous pouvez aussi spécifier les variables suivantes avec l'option ?O ou ??set?variable ; notez bien que ??set?variable est obsolète depuis MySQL 4.0, utilisez la nouvelle syntaxe ??var=option : Nom de variable Par défaut Description connect_timeout 0 Nombre de secondes avant que la connexion n'expire. max_allowed_packet 16777216 Taille maximale du paquet de communication avec le serveur. net_buffer_length 16384 Buffer pour les communications TCP/IP et socket. Limite automatique pour les commandes SELECT avec l'option select_limit 1000 ??i?am?a?dummy Limite automatique pour les commandes de jointure avec max_join_size 1000000 l'option ??i?am?a?dummy. Si vous tapez 'help' en ligne de commande, mysql va afficher les commandes qu'il supporte : mysql> help MySQL commands: help (\h) Display this text. ? (\h) Synonym for `help'. clear (\c) Clear command. connect (\r) Reconnect to the server. Optional arguments are db and host. edit (\e) Edit command with $EDITOR. ego (\G) Send command to mysql server, display result vertically. exit (\q) Exit mysql. Same as quit. go (\g) Send command to mysql server. nopager (\n) Disable pager, print to stdout. notee (\t) Don't write into outfile. pager (\P) Set PAGER [to_pager]. Print the query results via PAGER. print (\p) Print current command. prompt (\R) Change your mysql prompt. 4.8.2 mysql , The Command?line Tool 267 Manuel MySQL 4.1.x ? Version Française quit (\q) Quit mysql. rehash (\#) Rebuild completion hash. source (\.) Execute a SQL script file. Takes a file name as an argument. status (\s) Get status information from the server. tee (\T) Set outfile [to_outfile]. Append everything into given outfile. use (\u) Use another database. Takes database name as argument. La commande pager ne fonctionne que sous Unix. La commande status donne des détails sur la connexion et le serveur utilisés. Si vous fonctionnez en mode ??safe?updates , status va aussi afficher les valeurs des variables de mysql qui affectent vos requêtes. Une option de démarrage utile pour les débutants (introduit en MySQL version 3.23.11) est ??safe?updates (ou ??i?am?a?dummy pour les utilisateurs qui ont déjà utilisé une commande DELETE FROM table_name mais on oublié la clause WHERE . Lorsque vous utilisez cette option, mysql envoie la commande suivante au serveur MySQL lors de l'ouverture de la connexion : SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#, SQL_MAX_JOIN_SIZE=#max_join_size#" où #select_limit# et #max_join_size# sont des variables qui peuvent être configurées depuis mysql . Syntaxe de SET .L'effet de la commande ci?dessus est : Vous n'êtes pas autorisé à faire une commande • UPDATE ou DELETE si vous n'avez pas de contrainte de clé dans la clause WHERE . Il est possible toutefois de forcer la commande UPDATE/DELETE en utilisant LIMIT : UPDATE table_name SET not_key_column=# WHERE not_key_column=# LIMIT 1; Tous les grands résultats sont automatiquement limités à • #select_limit# lignes. Les commandes • SELECT qui vont probablement devoir examiner plus de #max_join_size lignes seront annulées. Quelques conseils pratiques sur le client mysql :Certaines données seront plus faciles à lire lorsqu'affichées verticalement, au lieu d'horizontalement. Par exemple, des textes longs qui incluent des nouvelles lignes. Il sera alors plus facile de les lire verticalement. mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 lIMIT 300,1\G *************************** 1. row *************************** msg_nro: 3068 date: 2000?03?01 23:29:50 time_zone: +0200 mail_from: Monty reply: monty@ mail_to: "Thimble Smith" <tim@> sbj: UTF?8 txt: >>>>> "Thimble" == Thimble Smith writes: Thimble> Hi. I think this is a good idea. Is anyone familiar with UTF?8 Thimble> or Unicode? Otherwise, I'll put this on my TODO list and see what Thimble> happens. Yes, please do that. Regards, Monty file: inbox?jani?1 hash: 190402944 1 row in set (0.09 sec) 4.8.2 mysql , The Command?line Tool 268 Manuel MySQL 4.1.x ? Version Française Pour les logs, vous pouvez utiliser l'option tee . Le tee peut être démarré avec l'option ??tee=... , ou depuis la ligne de commande interactive avec la commande tee . Toutes les données affichées sur l'écran seront enregistrées dans un fichier spécifié. Cela peut être très utile pour pouvoir déboguer. Le tee peut être désactivé avec la commande en ligne notee . Exécuter tee plusieurs fois va redémarrer l'enregistrement. Sans paramètre, la commande va ouvrir le dernier fichier utilisé. Notez que tee va écrire les données après chaque requête, avant que l'invite apparaisse, pour attendre la prochaine commande.Afficher les résultats en mode interactif avec les programmes Unix tels que less, more ou tout autre programme similaire est actuellement possible avec l'option ??pager[=...] . Sans argument, le client mysql va rechercher la variable d'environnement PAGER et l'utiliser pour pager . pager peut être démarré en ligne de commande avec pager et désactivée avec nopager . La commande prend un argument optionnel et pager prendra alors cette valeur. La commande pager peut être appelée sans argument, mais cela impose que l'option ??pager ait été utilisée, ou que le mode pager sera par défaut la sortie standard. pager fonctionne uniquement sous Unix, car il utilise la fonction popen(), qui n'existe pas sous Windows. Sous Windows, l'option tee peut être utilisée à la place, même si elle n'est pas aussi pratique que pager dans certaines situations.Quelques conseils sur pager : Vous pouvez l'utiliser pour écrire dans un fichier : • mysql> pager cat > et les résultats iront directement dans le fichier. Vous pouvez aussi passer des options pour le programme que vous voulez utiliser comme pager : mysql> pager less ?n ?i ?S Dans la présentation ci?dessus, notez bien l'option '?S'. Vous pourriez la trouver très • pratique lorsque vous étudiez des résultats : essayer l'option d'affichage horizontal (validez vos commandes avec '\g' ou ';') et vertical (terminez vos commandes avec '\G'). Parfois, un résultat très large est difficile à lire et avec l'option ?S dirigée vers less, vous pouvez naviguer dans le résultat interactivement de droite à gauche, ce qui évite que les lignes les plus longues soient coupées. Cela rend la lecture du texte bien plus facile. Vous pouvez passer d'un mode à l'autre depuis la ligne de commande. Voyez l'aide pour plus de détails sur less. Vous pouvez combiner des méthodes très complexes pour gérer les résultats, comme, la • possibilité d'envoyer les résultats vers deux fichiers dans deux dossiers différents, ou deux disques différents, tout en affichant les résultats à l'écran avec less : mysql> pager cat | tee | \ tee | less ?n ?i ?S Vous pouvez aussi combiner les deux fonctions ci?dessus : activer le tee , spécifier le pager 'less' et vous serez capable de naviguer dans les résultats avec le less Unix, tout en enregistrant tous les résultats dans un fichier. La différence entre le tee d'Unix utilisé avec le pager et le tee intégré du client mysql , est que le tee intégré fonctionne même si vous n'avez pas de tee Unix disponible. Le tee enregistre tout ce qui est affiché à l'écran, alors que le tee Unix utilisé avec pager n'en note pas autant. Enfin, le tee interactif est plus facile à activer et désactiver, lorsque vous souhaitez enregistrer un résultat dans un fichier, mais que vous voulez désactiver cette fonctionnalité à d'autres moments. Depuis MySQL version 4.0.2, il est possible de modifier l'invite de commande de mysql . Vous pouvez utiliser les options de prompt suivantes : Option Description \v version de mysqld \d database en cours \h hôte MySQL 4.8.2 mysql , The Command?line Tool 269 Manuel MySQL 4.1.x ? Version Française \p port de connexion \u nom d'utilisateur \U Identifiant complet [email protected] \\ '\' \n nouvelle ligne \t tabulation \ espace \_ espace \R heure 24h (0?23) \r heure 12h (1?12) \m minutes \y année sur deux chiffres \Y année sur quatre chiffres \D format de date complet \s secondes \w jour de la semaine en trois lettres (Mon, Tue, ...) \P am/pm \o mois au format numérique \O mois en trois lettres (Jan, Feb, ...) \c compteur du nombre de commande '\' suivi de n'importe quelle lettre représente la lettre littéralement. Vous pouvez modifier l'invite de commande comme ceci : Environment Variable Vous pouvez utiliser la variable d'environnement MYSQL_PS1 , en lui donnant la chaîne d'invite. Par exemple : shell> export MYSQL_PS1="(\u@\h) [\d]> " Vous pouvez configurer l'invite de commandes dans le fichier d'options MySQL. dans le groupe mysql . Par exemple : [mysql] prompt=(\u@\h) [\d]>\_ Command Line Vous pouvez utiliser l'option de démarrage ??prompt en ligne de commande avec mysql . Par exemple : shell> mysql ??prompt="(\u@\h) [\d]> " (user@host) [database]> Interactively Vous pouvez aussi utiliser la commande prompt (ou \R ) depuis le client pour modifier interactivement l'invite de commande. Par exemple : mysql> prompt (\u@\h) [\d]>\_ PROMPT set to '(\u@\h) [\d]>\_' (user@host) [database]> (user@host) [database]> prompt Returning to default PROMPT of mysql> mysql> 4.8.2 mysql , The Command?line Tool 270 Manuel MySQL 4.1.x ? Version Française 4.8.3 mysqladmin , administrer un serveur MySQL Un utilitaire pour exécuter des commandes d'administration. La syntaxe est : shell> mysqladmin [OPTIONS] command [command?option] command ... Vous pouvez obtenir une liste des options supportées par votre version de mysqladmin avec la commande mysqladmin ??help .Le mysqladmin actuel supporte les commandes suivantes : create databasename Crée une nouvelle base. drop databasename Efface une base et toutes ces tables. extended?status Affiche un message de statut du serveur très complet. flush?hosts Vide tous les hôtes mis en cache. flush?logs Vide de la mémoire tous les logs. flush?tables Vide de la mémoire toutes les tables. flush?privileges Recharger les tables de droits (identique à la commande reload). kill id,id,... Termine un thread MySQL. password Spécifie un nouveau mot de passe. Modifie l'ancien mot de passe en un nouveau. ping Vérifie si mysqld fonctionne ou pas. processlist Affiche la liste des processus du serveur. reload Recharge les tables de droits. refresh Vide de la mémoire toutes les tables, puis ferme et réouvre les fichiers de logs. shutdown Eteind le serveur. slave?start Démarre l'esclave de réplication. slave?stop Eteind l'esclave de réplication. status Affiche le message de statut court du serveur. variables Affiche les variable disponibles. version Affiche la version du serveur. Toutes les commandes peuvent être réduites à leur préfixe simple. Par exemple : shell> mysqladmin proc stat +????+???????+???????????+????+?????????????+??????+???????+??????+ | Id | User | Host | db | Command | Time | State | Info | +????+???????+???????????+????+?????????????+??????+???????+??????+ | 6 | monty | localhost | | Processlist | 0 | | | +????+???????+???????????+????+?????????????+??????+???????+??????+ 4.8.3 mysqladmin , administrer un serveur MySQL 271 Manuel MySQL 4.1.x ? Version Française Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K La commande mysqladmin status liste les colonnes suivantes : Colonne Description Uptime Nombre de secondes de vie du serveur MySQL. Threads Nombre de threads actifs (clients). Questions Nombre de questions reçu des clients depuis le démarrage de mysqld . Nombre de requêtes qui ont pris plus de long_query_time secondse. Le log des Slow queries requêtes lentes. Opens Combien de tables sont ouvertes par mysqld . Flush tables Nombre de commandes flush ... , refresh et reload . Open tables Nombre de tables qui sont ouvertes actuellement. Mémoire allouée directement par mysqld (uniquement disponible si MySQL a été Memory in use compilé avec l'option ??with?debug=full). Max memory Maximum de mémoire allouée directement par mysqld (uniquement disponible si used MySQL a été compilé avec l'option ??with?debug=full). Si vous exécutez une commande mysqladmin shutdown sur une socket (en d'autres termes, sur un serveur où mysqld fonctionne ), mysqladmin va attendre que le fichier pid?file de MySQL soit effacé pour s'assurer que le serveur mysqld a été correctement stoppé. 4.8.4 Utiliser mysqlcheck pour l'entretien et la réparation Depuis MySQL version 3.23.38, vous pouvez utiliser un nouvel outil d'entretien et de réparation pour les tables MyISAM . La différence avec myisamchk est que mysqlcheck doit être utilisé lorsque le serveur mysqld fonctionne, alors que myisamchk doit être utilisé lorsque le serveur ne fonctionne pas. L'intérêt st que vous n'avez plus besoin d'interrompre le serveur pour vérifier ou réparer vos tables. mysqlcheck utilise les commandes du serveur MySQL CHECK , REPAIR , ANALYZE et OPTIMIZE , d'une manière pratique pour l'utilisateur. Il y a trois façons différentes d'utiliser mysqlcheck : shell> mysqlcheck [OPTIONS] database [tables] shell> mysqlcheck [OPTIONS] ??databases DB1 [DB2 DB3...] shell> mysqlcheck [OPTIONS] ??all?databases Il peut aussi être utilisé comme mysqldump lorsqu'il faut choisir les bases et tables à traiter. mysqlcheck dispose d'une fonctionnalité spéciale, comparé aux autres clients : le comportement par défaut, c'est à dire la vérification des tables, peut être modifiée en renommant le fichier binaire. Si vous voulez avoir un fichier qui réparer les tables par défaut, il suffit de copier mysqlcheck sur votre disque, et de l'appeler mysqlrepair , ou bien, de faire un lien symbolique sur l'exécutable et de l'appeler mysqlrepair . SI vous appelez mysqlrepair , il va réparer les tables par défaut. Les noms que vous pouvez utiliser pour que mysqlcheck réparer automatiquement les tables sont : mysqlrepair: L'option par défaut est ?r mysqlanalyze: L'option par défaut est ?a mysqloptimize: L'option par défaut est ?o 4.8.4 Utiliser mysqlcheck pour l'entretien et la réparation 272 Manuel MySQL 4.1.x ? Version Française Les options disponibles pour mysqlcheck sont listées ici. Vérifiez que votre version les supporte avec la commande mysqlcheck ??help . ?A, ??all?databases Vérifie toutes les bases. C'est la même chose que ??databases dans toutes les bases sélectionnées. ?1, ??all?in?1 Au lieu de faire une requête par table, exécute toutes les requêtes dans une requête, séparément pour chaque base. Les noms de tables seront séparés par une virgule. ?a, ??analyze Analyse les tables indiquées. ??auto?repair Si une table vérifiées est corrompue, la corrige automatiquement. La réparation sera faite après la vérification de toutes les tables, si des tables corrompues ont été découvertes. ?#, ??debug=... Affiche le log de debug. Souvent, c'est dans 'd:t:o,filename' ??character?sets?dir=... Dossier contenant le jeu de caractères ?c, ??check Vérifie les tables en erreur ?C, ??check?only?changed Vérifie uniquement les tables qui ont été modifiées depuis la dernière modification, ou qui n'ont pas été correctement fermées. ??compress Utiliser la compression du protocole client/serveur. ??, ??help Affiche ce message d'aide, et termine. ?B, ??databases Pour tester plusieurs bases de données. Notez que la différence d'utilisation : dans ce cas, aucune table n'est précisé. Tous les arguments de noms sont considérés comme des noms de base. ??default?character?set=... Spécifie le jeu de caractères par défaut. ?F, ??fast Ne vérifie que les tables qui n'ont pas été correctement fermées. ?f, ??force Continue même si on rencontre une erreur SQL. ?e, ??extended Si vous utilisez cette option avec CHECK TABLE, elle va s'assurer que la table est totalement cohérente, mais prendre un très long temps. Si vous utilisez cette option avec REPAIR TABLE, elle va réaliser une réparation exhaustive de la table, qui peut non seulement prendre un temps très long, mais produire de nombreuses lignes erronées. ?h, ??host=... Connexion à l'hôte. ?m, ??medium?check Plus rapide que la vérification complète, mais ne trouvera que 99.99 % de toutes les erreurs. Cela devrait être la bonne option pour la plupart des situations. ?o, ??optimize Optimise la table ?p, ??password[=...] Le mot de passe à utiliser lors de la connexion au serveur. Si aucun mot de passe 4.8.4 Utiliser mysqlcheck pour l'entretien et la réparation 273 Manuel MySQL 4.1.x ? Version Française n'est fourni, il sera demandé en ligne de commande. ?P, ??port=... Le numéro de port de la connexion. ?q, ??quick Si vous utilisez cette option avec CHECK TABLE, elle va éviter que l'analyse ne scanne les lignes pour vérifier les mauvais liens. C'est la méthode d'analyse la plus vous utilisez cette option avec REPAIR TABLE, elle va essayer de ne réparer que le fichier d'index. C'est la méthode la plus rapide pour la réparation. ?r, ??repair Peut corriger presque tout, sauf les problèmes de doublons pour les clés uniques. ?s, ??silent Affiche moins de messages d'erreurs. ?S, ??socket=... Nom du fichier de socket à utiliser pour la connexion. ??tables Remplace l'option ??databases (?B). ?u, ??user=# Nom d'utilisateur pour la connexion, si ce n'est pas l'utilisateur courant. ?v, ??verbose Afficher des informations sur les différentes étapes. ?V, ??version Affiche les informations de version, et termine. 4.8.5 mysqldump , exporter les structures de tables et les données Utilitaire qui permet d'exporter une base ou un groupe de bases vers un fichier texte, pour la sauvegarde ou le transfert entre deux serveurs (pas nécessairement entre serveurs MySQL). L'export contiendra les requêtes SQL nécessaires pour créer la table et la remplir. Si vous faîtes une sauvegarde du serveur, vous devriez aussi utiliser la commande mysqlhotcopy . mysqlhotcopy , copier les bases et tables MySQL . shell> mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] ??databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] ??all?databases [OPTIONS] Si vous ne spécifiez pas de table, ou si vous utilisez l'option ??databases ou ??all?databases , la base de données complète sera exportée.Vous pouvez obtenir une liste des options valides pour votre version de mysqldump avec la commande mysqldump ??help . Notez que si vous exécutez mysqldump sans l'option ??quick ou ??opt , mysqldump va charger la totalité du résultat en mémoire, avant de l'écrire. Cette option peut résoudre des problèmes de mémoire si vous exportez de grosses tables. Notez que si vous utilisez une nouvelles copie du programme mysqldump , et que vous allez faire un export qui sera lu dans une vieille version de MySQL, vous ne devriez pas utiliser les options ??opt et ?e . mysqldump supporte les options suivantes : ??add?locks Ajoute une commande LOCK TABLES avant l'export de table et une commande UNLOCK TABLE après(Pour accélérer les inserionts dans MySQL). ??add?drop?table Ajoute une commande drop table avant chaque requête de création de table. 4.8.5 mysqldump , exporter les structures de tables et les données 274 Manuel MySQL 4.1.x ? Version Française ?A, ??all?databases Exporte toutes les tables. C'est l'équivalent de l'option ??databases avec toutes les bases de données sélectionnées. ?a, ??all Inclut toutes les options de créations de table spécifiques à MySQL. ??allow?keywords Permet la création de colonnes ayant des noms de mots réservés. Cela fonctionne en préfixant chaque nom de colonne avec le nom de la table. ?c, ??complete?insert Utilise une commande complète d'insertion (avec les noms des colonnes). ?C, ??compress Compresse toutes les informations entre le client et le serveur, les deux supporte la compression. ?B, ??databases Pour exporter plusieurs bases de données. Notez la différence d'utilisation. Dans ce cas, aucune table n'est spécifié. Tous les arguments de noms sont considérés comme des noms de base. Une ligne USE db_name; sera ajoutée dans l'export avant chaque base de données. ??delayed Les insertions se font avec la commande INSERT DELAYED . ?e, ??extended?insert Utilise la nouvelle syntaxe multi?ligne INSERT . (Cela donne des insertions plus courtes et plus efficaces). ?#, ??debug[=option_string] Trace l'utilisation du programme (pour le débogage). ??help Affiche le message d'aide et quitte. ??fields?terminated?by=... ??fields?enclosed?by=... ??fields?optionally?enclosed?by=... ??fields?escaped?by=... ??lines?terminated?by=... Ces options sont utilisées avec l'option ?T et ont la même signification que les clauses correspondantes de la commande LOAD DATA INFILEDATA INFILE . ?F, ??flush?logs ƒcrit tout le fichier de log du serveur avant de commencer l'export. ?f, ??force, Continue même si une erreur SQL survient durant l'export. ?h, ??host=.. Exporte les données depuis le serveur MySQL vers l'hôte indiqué. L'hôte par défaut est localhost . ?l, ??lock?tables. Verrouille toutes les tables avant de commencer l'export. Les tables sont verrouillées avec READ LOCAL pour permettre des insertions concurentes sur les tables MyISAM . Notez que lorsque vous exportes des tables de bases différentes, l'option ??lock?tables va verrouiller chaque base séparément. Cette option ne vous garantira pas que vos tables seront logiquement cohérente entre les bases. Des tables de différentes bases pourraient être exportées dans des états très différents. ?K, ??disable?keys /*!40000 ALTER TABLE tb_name DISABLE KEYS */; et /*!40000 ALTER TABLE tb_name ENABLE KEYS */; seront ajoutés dans le résultat. Cela rendra 4.8.5 mysqldump , exporter les structures de tables et les données 275 Manuel MySQL 4.1.x ? Version Française les chargements de données plus rapides sur les serveurs MySQL 4.0 car les index sont alors créés après l'insertion de toutes les données. ?n, ??no?create?db CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name; ne sera pas ajouté dans l'export. Sinon, la ligne ci?dessus sera ajoutée, si l'une des options ??databases ou ??all?databases ont été activée. ?t, ??no?create?info N'écrit pas les informations de création de table (la requête CREATE TABLE ). ?d, ??no?data N'écrit aucune ligne d'informations sur la atble. C'est très pratique si vous voulez simplement exporter la structure de la table. ??opt Identique à ??quick ??add?drop?table ??add?locks ??extended?insert ??lock?tables . Vous obtiendrez l'export le plus rapide à importer dans un serveur MySQL. ?pyour_pass, ??password[=your_pass] Le mot de passe à utiliser lors de la connexion au serveur. Si vous spécifiez en omettant la partie '=your_pass' , mysqldump vous demandera le mot de passe en ligne de commande. ?P port_num, ??port=port_num Le port TCP/IP à utiliser avec l'hôte. Ceci sert pour les connexions d'hôte à hôte, autre que localhost , pour lequel les sockets Unix seront utilisées). ?q, ??quick Ne garde pas en buffer les requêtes, mais écrit immédiatement dans la sortie. Utilise mysql_use_result() pour cela. ?Q, ??quote?names Protège les noms des tables et colonnes avec le caractère '`' . ?r, ??result?file=... Ecrit directemetn dans le fichier indiqué. Cette option doit être utilisé sur MSDOS, car cela évite que la nouvelle ligne '\n' soient converties en '\n\r' (nouvelle ligne et retour chariot). ??single?transaction Cette option ajoute la commande SQL BEGIN avant d'exporter les données vers le serveur. C'est généralement pratique pour les tables InnoDB et le niveau d'isolation de transaction READ_COMMITTED , car ce mode va exporter l'état de la base au moment de la commande BEGIN sans bloquer les autres applications. Lorsque vous utilisez cette option, pensez bien que seules les tables transactionnelles seront exportées dans un état cohérent, c'est à dire que les tables MyISAM ou HEAP qui seront exportées avec cette option, pourront changer d'état. L'option ??single?transaction a été ajoutée en version 4.0.2. Cette option est mutuellement exclusive avec l'option ??lock?tables car LOCK TABLES va valider une transaction interne précédente. ?S /path/to/socket, ??socket=/path/to/socket Le fichier de socket à utiliser lors de la connexion à localhost (qui est l'hôte par défaut). ??tables Remplace l'option ??databases (?B). ?T, ??tab=path?to?some?directory Crée un fichier , qui contient les commandes SQL CREATE, et un fichier , qui contient les données, pour chaque table. Le format du fichier .txt est celui qui est spécifié par les options ??fields?xxx et ??lines??xxx . Note : cette option ne fonctionne qui si mysqldump est exécuté 4.8.5 mysqldump , exporter les structures de tables et les données 276 Manuel MySQL 4.1.x ? Version Française sur la même machine que le démon mysqld , et que le nom d'utilisateur et le groupe de mysqld (normalement l'utilisateur mysql , et le groupe mysql ) doivent avoir des permission pour créer et écrire un fichier dans le dossier que vous spécifiez. ?u user_name, ??user=user_name Le nom d'utilisateur MySQL lors de la connexion à un serveur distant. La valeur par défaut est votre nom d'utilisateur Unix. ?O var=option, ??set?variable var=option Spécifie la valeur d'une variable. Les noms possibles des variables sont spécifiés ci?dessous. Notez bien que ??set?variable est obsolète depuis MySQL 4.0, il vous suffit alors d'utiliser la syntaxe ??var=option . ?v, ??verbose Mode détaillé. Affiche plus d'informations sur les faits et gestes du programme. ?V, ??version Affiche la version du programme et quitte. ?w, ??where='where?condition' Exporte uniquement les lignes sélectionnées. Notez que les guillemets sont obligatoires. ?X, ??xml Exporte la base au format XML. ?x, ??first?slave Verrouille toutes les tables dans les bases. "??where=user='jimf'" "?wuserid>1" "?wuserid<1" ?O net_buffer_length=#, where # < 16M Lors de la création de commandes d'insertions multilignes, (comme avec l'option ??extended?insert ou ??opt ), mysqldump va créer des lignes jusqu'à la taille de net_buffer_length . Si vous augmentez cette valeur, vous devriez aussi vous assurer que la variable MySQL max_allowed_packet est plus grande que net_buffer_length . L'usage normal de mysqldumpde base de données . mysqldump ??opt database > backup? Vous pouvez importer les données dans la base MySQL avec : mysql database < backup? ou mysql ?e "source /patch?to?backup/backup?" database Cependant, il est très pratique pour remplir un autre serveur MySQL avec des informations depuis une base : mysqldump ??opt database | mysql ???host=remote?host ?C database Il est possible d'exporter plusieurs bases de données en une seule commande : mysqldump ??databases database1 [database2 ...] > Si vous souhaitez exporter toutes les bases, vous pouvez utiliser : mysqldump ??all?databases > 4.8.6 mysqlhotcopy , copier les bases et tables MySQL mysqlhotcopy est un script Perl qui utilise LOCK TABLES , FLUSH TABLES et cp ou scp pour faire rapidement des sauvegardes de bases. C'est la méthode la plus rapide pour faire une sauvegarde de bas. C'est aussi le moyen le plus sûr pour copier des tables et bases, mais il ne peut fonctionner que sur la machine qui contient les fichiers de données. mysqlhotcopy db_name [/path/to/new_directory] 4.8.6 mysqlhotcopy , copier les bases et tables MySQL 277 Manuel MySQL 4.1.x ? Version Française mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory mysqlhotcopy db_name./regex/ mysqlhotcopy supporte les options suivantes : ??, ??help Affiche un écran d'aide et quitte. ?u, ??user=# Nom d'utilisateur pour la connexion au serveur. ?p, ??password=# Mot de passe utilisé pour la connexion au serveur. ?P, ??port=# Port utilisé pour la connexion au serveur. ?S, ??socket=# Socket utilisé pour la connexion au serveur. ??allowold Ne pas annuler si la sauvegarde existe déjà (renomme la simplement en _old) ??keepold Ne pas effacer une sauvegarde précédente (celle qui a été renommée) lorsque c'est terminé. ??noindices Ne pas inclure les fichiers d'index complet dans la copie, pour faire des fichiers de sauvegarde plus petit et plus rapide. Les index peuvent toujours être reconstruits plus tard avec myisamchk ?rq. . ??method=# Méthode de copie ( cp ou scp ). ?q, ??quiet Mode silencieux. N'affiche que les erreurs. ??debug Active le débogage. ?n, ??dryrun Rapporte les actions réalisées sans les faire. ??regexp=# Copie toutes les bases dont le nom vérifie un masque d'expression régulière. ??suffix=# Suffixe des noms des bases copiées. ??checkpoint=# Insère un point de contrôle dans la table spécifiée (base.table) ??flushlog Vide les logs sur le disque une fois que toutes les tables sont verrouillées. ??tmpdir=# Dossier temporaire (au lieu de /tmp). Vous pouvez essayer perldoc mysqlhotcopy pour avoir plus de documentation sur mysqlhotcopy . mysqlhotcopy lit les options du groupe [client] et [mysqlhotcopy] dans le fichier d'options. Pour être capable d'exécuter mysqlhotcopy , vous avez besoin des droits d'écriture dans le dossier de sauvegarde, et le droit de SELECT dans les tables que vous souhaitez copier, ainsi que les droits MySQL de RELOAD (pour utiliser la commande FLUSH TABLES ). 4.8.6 mysqlhotcopy , copier les bases et tables MySQL 278 Manuel MySQL 4.1.x ? Version Française 4.8.7 mysqlimport , importer des données depuis des fichiers texte mysqlimport fournit une interface en ligne de commande à la commande SQL LOAD DATA INFILE . La plupart des options de mysqlimport correspondent directement aux mêmes options de LOAD DATA INFILE . Syntaxe des LOAD DATA INFILE . mysqlimport est appelé comme ceci : shell> mysqlimport [options] database textfile1 [textfile2 ...] Pour chaque fichier texte indiqué dans la ligne de commande, mysqlimport supprime toute extension du nom du fichier, et utilise le résultat pour déterminer le nom de la table qui va recevoir le contenu du fichier. Par exemple, pour des fichiers appelés , et patient seront tous importés dans la table patient . mysqlimport supporte les options suivantes : ?c, ??columns=... Cette option prend une liste de noms de colonnes, séparés par des virgules. Ce champs est utilisé pour créer une commande LOAD DATA INFILE correcte, qui sera alors passée à MySQL. Syntaxe des LOAD DATA INFILE . ?C, ??compress Compresse toutes les informations entre le client et le serveur, si c'est possible. ?#, ??debug[=option_string] Trace l'utilisation du programme (pour le débogage). ?d, ??delete Vide la table avant d'importer le fichier texte. ??fields?terminated?by=... ??fields?enclosed?by=... ??fields?optionally?enclosed?by=... ??fields?escaped?by=... ??lines?terminated?by=... Ces options ont la même signification que les clauses correspondantes de LOAD DATA INFILE . Syntaxe des LOAD DATA INFILE . ?f, ??force Ignore les erreurs. Par exemple, si une table n'existe pas pour un fichier texte, mysqlimport va continuer de traiter les autres fichiers. Sans ??force , mysqlimport se termine dès qu'une erreur survient. ??help Affiche le message d'aide et quitte. ?h host_name, ??host=host_name Importe les données sur le serveur MySQL, avec l'hôte spécifié. La valeur par défaut est localhost . ?i, ??ignore Voir la description de ??replace . ?l, ??lock?tables Verrouille toutes les tables en écriture avant de ne traiter les fichiers textes. Cela assure que toutes les tables sont synchronisée sur le serveur. ?L, ??local Lit le fichier d'entrée dans le client. Par défaut, les fichiers textes sont supposés être lus par le serveur, si vous vous connectez à localhost (qui l'hôte par défaut). ?pyour_pass, ??password[=your_pass] Le mot de passe à utiliser lors de la connexion au serveur. Si vous ne spécifiez pas la partie '=your_pass' , mysqlimport va vous demander le mot de passe en ligne. ?P port_num, ??port=port_num 4.8.7 mysqlimport , importer des données depuis des fichiers texte 279 Manuel MySQL 4.1.x ? Version Française Le port TCP/IP utilisé avec l'hôte. Cela sert pour les connexions à des hôtes qui ne sont pas localhost , pour lequel la socket Unix est utilisée. ?r, ??replace Les options ??replace et ??ignore contrôles la gestion des lignes lues envers les lignes qui existent déjà sur le serveur. Si vous spécifiez l'option ??replace , les nouvelles lignes remplaceront les lignes existantes. Si vous spécifiez ??ignore , les lignes qui sont en double dans une table qui dispose d'une colonne de type unique. Si vous ne spécifiez pas ces options, une erreur surviendra lorsqu'une clé en double sera trouvée, et la lecture du reste du fichier sera annulé. ?s, ??silent Mode silencieux. N'affiche que les erreurs qui surviennent. ?S /path/to/socket, ??socket=/path/to/socket Le fichier de socket à utiliser lors de la connexion à localhost (qui est l'hôte par défaut). ?u user_name, ??user=user_name Le nom de l'utilisateur MySQL à utiliser lors de la connexion au serveur MySQL. La valeur par défaut est celui de votre utilisateur Unix. ?v, ??verbose Mode détaillé. Affiche bien plus d'informations sur les actions du programme. ?V, ??version Affiche la version et quitte. Voici un exemple d'utilisation de mysqlimport : $ mysql ??version mysql Ver 9.33 Distrib 3.22.25, for pc?linux?gnu (i686) $ uname ?a Linux 2.2.5?15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown $ mysql ?e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test $ ed a 100 Max Sydow 101 Count Dracula . w 32 q $ od ?c 0000000 1 0 0 \t M a x S y d o w \n 1 0 0000020 1 \t C o u n t D r a c u l a \n 0000040 $ mysqlimport ??local test test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 $ mysql ?e 'SELECT * FROM imptest' test +??????+???????????????+ | id | n | +??????+???????????????+ | 100 | Max Sydow | | 101 | Count Dracula | +??????+???????????????+ 4.8.8 Afficher les bases, tables et colonnes mysqlshow peut être utilisé pour lister les bases qui existent, leurs tables et leurs colonnes. Avec le programme mysql vous pouvez obtenir des informations avec la commande SHOW . Syntaxe de SHOW . mysqlshow est utilisé comme ceci : 4.8.8 Afficher les bases, tables et colonnes 280 Manuel MySQL 4.1.x ? Version Française shell> mysqlshow [OPTIONS] [database [table [column]]] Si aucune base n'est indiquée, toutes les bases de données sont listées. • Si aucune table n'est nommée, toutes les tables de la base sont affichées. • Si aucune colonne n'est nommée, toutes les colonnees et leur type sont affichés. • Notez que dans les nouvelles versions de MySQL, vous ne verrez que les bases de données, tables et colonnes pour lesquelles vous avez des le dernier argument contient un caractère joker shell ou SQL ( * , ? , % ou _ ) alors seules les entités qui valident ce masque sont affichées. Si une base contient des caractères soulignés, ils doivent être protégés avec un anti?slash (certains shell Unix en demande même deux), afin de lister correctement les tables et les colonnes. Les '*' sont convertis en SQL '%' et '?' en SQL '_'. Cela peut causer des confusions lorsque vous essayez d'afficher des colonnes qui contiennent un souligné _ , comme c'est le cas avec mysqlshow qui ne vous affiche que les colonnes qui vérifient le masque. Ceci est facilement corrigé en ajoutant un caractère % en plus dans la ligne de commande (comme argument séparé). 4.8.9 perror , expliquer les codes d'erreurs Pour la plupart des erreurs système, MySQL va, en plus d'un message interne, aussi afficher un code d'erreur, dans l'un des styles suivants : message ... (errno: #) or message ... (Errcode: #) . Vous pouvez découvrir ce que ce code d'erreur signifie soit en examinant la documentation de votre système, soit en utilisant l'utilitaire perror . perror affiche une description pour le code d'erreur, ou, pour une erreur du gestionnaire de tables MyISAM/ISAM. perror est appelé comme ceci : shell> perror [OPTIONS] [ERRORCODE [ERRORCODE...]] Example: shell> perror 13 64 Error code 13: Permission denied Error code 64: Machine is not on the network Notez que les messages d'erreurs sont dépendants du système. 4.8.10 Comment exécuter des commandes SQL depuis un fichier texte Le client mysql peut être utilisé en mode interactif comme ceci : shell> mysql database Toutefois, il est aussi possible de rassembler les commandes SQL dans un fichier, et d'indiquer à mysql de lire les commandes dans ce fichier. Pour faire cela, créez un fichier texte fichier_texte qui contient les commandes SQL que vous souhaitez exécuter. Puis, exécutez ce fichier avec mysql comme ceci : shell> mysql database < fichier_texte 4.8.9 perror , expliquer les codes d'erreurs 281 Manuel MySQL 4.1.x ? Version Française Vous pouvez aussi démarrer votre fichier texte avec la commande USE nom_base . Dans ce cas, il n'est pas néeccaire de spécifier le nom de la base de données dans la ligne de commande : shell> mysql < fichier_texte Si vous avez déjà démarré le client mysql , vous pouvez exécuter un script SQL en utilisant la commande source : mysql> source nom_fichier; Pour plus d'informations sur le mode batch, consultez Utiliser mysql en mode batch . 4.9 Les fichiers de log de MySQL MySQL a plusieurs fichiers de log qui peuvent vous aider à savoir ce qui se passe à l'intérieur de mysqld : Fichier Description Problèmes rencontrés lors du démarrage, de l'exécution ou du stoppage de Le log d'erreurs mysqld . Garde une trace des changements liés au tables ISAM. Utilisé uniquement Le log isam pour déboguer le code isam. Le log de requêtes Connexions établies et requêtes exécutées. Le log de mises à Désapprouvé : Enregistre toutes les commandes qui changent les données. jour Enregistre toutes les commandes qui changent quelque chose. Utilisé pour la Le log binaire replication. Le log des requêtes Enregistre toutes les requêtes qui ont pris plus de long_query_time à lentes s'exécuter ou celles qui n'ont pas utilisé d'index. Tous les fichiers de log peuvent être trouvés dans le dossier de données de mysqld . Vous pouvez forcer mysqld à réouvrir les fichiers de log (ou dans quelques cas à passer à un nouveau log) en exécutant FLUSH LOGS . Syntaxe de FLUSH . 4.9.1 Le log d'erreurs mysqld affiche toutes les erreurs dans stderr, le script safe_mysqld les redirige vers un fichier nommé 'hostname'.err . (Sur Windows, mysqld les écrit directement dans \mysql\data\ .) Ce fichier contient des informations indiquant quand mysqld a été démarré et stoppé pour cause d'erreurs critiques rencontré lors de son fonctionnement. Si mysqld se termine inopinément et que safe_mysqld a besoin de redémarrer mysqld , safe_mysqld ajoutera une ligne restarted mysqld dans ce fichier. Ce log contient aussi un avertissement si mysqld trouve une table qui a besoin d'être automatiquement vérifiée ou réparée. Sur quelques systèmes d'exploitation, le log d'erreurs contiendra un traçage de la pile mémoire relatif à l'endroit où mysqld s'est terminé. Il peut être utilisé pour trouver les raisons du crash de mysqld . Utilisation d'un traçage de la pile . 4.9 Les fichiers de log de MySQL 282 Manuel MySQL 4.1.x ? Version Française 4.9.2 Le log général de requêtes Si vous voulez savoir ce qui se passe à l'intérieur de mysqld , vous devez le démarrer avec ??log[=fichier] . Cela aura pour effet d'écrire toutes les connexions et les requêtes dans le fichier de log (pas défaut nommé 'hostname'.log ). Ce log peut être très utile quand vous suspectez une erreur dans un client et voulez savoir exactement ce que mysqld pense que le client lui a envoyé. Les anciennes versions du script mysql.server (de MySQL 3.23.4 à 3.23.8) passent à safe_mysqld une option ??log (active le log général de requêtes). Si vous avez besoin de meilleurs performances lorsque vous démarrez MySQL dans un environnement de production, vous pouvez supprimer l'option ??log de mysql.server ou la changer en ??log?bindes mises à jour . Les entrées dans ce log sont écrites en même temps que mysqld reçoit une question. Cela peut être différent de l'ordre dans lequel les commandes sont exécutées. Cela est contraire au log des mises à jour et du log binaire qui sont écrits après l'exécution de la requête, mais avant les verrouillages. 4.9.3 Le log de modification NoteAvec ce nouveau log, vous pouvez faire tout ce que vous faisiez avec le log de modifications. Lors l'option ??log?update[=file_name] est utilisée au démarrage, mysqld écrit un fichier de log contenant toutes les commandes SQL qui modifie les données. Si aucun fichier n'est spécifié, il prendra la valeur par défaut du nom de l'hôte. Si un fichier est spécifié mais qu'aucun chemin n'est indiqué, le fichier sera écrit dans le dossier de données. Si le fichier file_name n'a pas d'extension, mysqld va créer un fichier de log avec ce nom : file_name.### , où ### est un nombre qui s'incrémente à chaque vois que vous exécutez la commande mysqladmin refresh , mysqladmin flush?logs , FLUSH LOGS ou que vous redémarrez le serveur. Note : pour que la technique ci?dessus fonctionne, vous ne devez pas créer de fichiers avec le nom du fichier de log + une extension, qui pourrait être considérée comme un nombre, dans le dossier qui contient les log de modifications. Si vous utilisez les options ??log ou ?l , mysqld écrit un log général avec le nom de , et les redémarrage ou les rafraîchissements de fichiers de logs ne généreront pas de nouveaux fichiers (même si le fichier lui même est bien refermé, puis ouvert). Dans ce cas, vous pouvez le copier sous Unix avec : mv hostname? mysqladmin flush?logs cp hostname? to?backup?directory rm hostname? Le fichier de log de modification est très utile, car il n'enregistre que les commandes qui modifient les données. Ce qui fait qu'une commande UPDATE ou DELETE avec une requête WHERE qui ne trouve pas de lignes ne seront pas écrites dans ce fichier. Il va même ignorer les requêtes UPDATE qui modifie une colonne avec la valeur déjà présente. L'enregistrement dans le log de modification est fait juste après l'achèvement de la requête, mais avant la levée des verrous, et les validations. Cela garantit que la requête sera enregistrée. 4.9.2 Le log général de requêtes 283 Manuel MySQL 4.1.x ? Version Française Si vous voulez modifier une base grâce aux fichier de log de modification, vous pouvez utiliser la commande suivante (en supposant que vos fichiers de log de modification porte le nom de file_name.### ) : shell> ls ?1 ?t ?r file_name.[0?9]* | xargs cat | mysql ls est utilisé pour obtenir toute la liste des fichiers de logs du peut être utile si vous devez repartir d'un fichier de sauvegarde après un crash, et que vous souhaitez réexécuter les modifications qui ont eu lieu depuis la sauvegarde. 4.9.4 Le log binaire de modifications Notre objectif est de remplacer l'utilisation du log de modifications par le log binaire de modifications. Nous vous recommandons donc de changer de format de log le plus tôt possible. Le log binaire contient toutes les informations qui sont disponibles dans le log de modifications, dans un format bien plus efficace. Il contient aussi des informations sur le temps d'exécution de la requête. Il ne contient pas les requêtes qui n'ont pas modifié les données. Si vous voulez requêtes . MySQL . Lorsque l'option de démarrage ??log?bin[=file_name] est utilisée, mysqld écrit un fichier de log contenant toutes les commandes SQL qui modifient les données. Si aucun nom de fichier n'est donné, le nom de la machine hôte est utilisé, suivi de ?bin . Si un nom est donné, mais qu'il ne contient pas de chemin, le fichier sera écrit dans le dossier de données. Si vous fournissez une extension à ??log?bin=filename.extension , l'extension sera automatiquement supprimée. Au nom du fichier de log binaire, mysqld va ajouter une extension qui est un nombre automatiquement incrémenté chaque fois que vous exécutez mysqladmin refresh , mysqladmin flush?logs , FLUSH LOGS ou redémarrez le serveur. Un nouveau fichier de log sera automatiquement créé lorsque le fichier en cours atteint la taille de max_binlog_size . Vous pouvez effacer tous les fichiers de log inactifs avec la commande RESET MASTERRESET . Vous pouvez utiliser les options suivantes avec mysqld pour modifier ce qui est enregistré dans le fichier de log : Option Description Indique au maître qu'il doit enregistrer les modifications binlog?do?db=database_name des bases spécifiées, et ignorer les autres. (Example: binlog?do?db=some_database ) Indique autre maître que les modifications des bases binlog?ignore?db=database_name spécifiées ne doit pas être enregistrées. (Exemple : binlog?ignore?db=some_database ) Pour être capable de connaître les différents fichiers de logs qui ont été utilisés, mysqld va aussi créer un fichier d'index qui contient les noms des fichiers de log utilisé. Par défaut, ils ont le même nom que le fichier de log, avec l'extension '.index' . Vous pouvez modifier le nom du fichier d'index avec l'option ??log?bin?index=[filename] . 4.9.4 Le log binaire de modifications 284 Manuel MySQL 4.1.x ? Version Française Si vous utilisez la réplication, vous ne devez pas effacer les anciens log binaires jusqu'à ce que vous soyez sûrs que les esclaves n'en auront plus besoin. Une façon de faire cela est d'utiliser la commande mysqladmin flush?logs une fois par jour, et d'effacer les fichiers de log qui ont plus de trois jours. Vous pouvez examiner le fichier de log binaire avec la commande mysqlbinlog . Par exemple, vous pouvez mettre à jour le serveur MySQL depuis la ligne de commande comme ceci : shell> mysqlbinlog log?file | mysql ?h server_name Vous pouvez aussi utiliser le programme mysqlbinlog pour lire le fichier de log binaire directement dans le serveur MySQL. mysqlbinlog ??help vous donnera plus d'informations sur comment utiliser ce programme. Si vous utilisez BEGIN [WORK] ou SET AUTOCOMMIT=0 , vous devez utiliser le fichier de log binaire pour les sauvegardes, plutôt que le vieux fichier de log de modifications. L'enregistrement dans le fichier de log binaire est fait immédiatement après l'achèvement de la requête, mais avant la libération des verrous ou la validation de la requête. Cela garantit que les requêtes seront enregistrées dans l'ordre d'exécution. Les modifications dans les tables non transactionnelles sont enregistrées dans le fichier de log binaire immédiatement après exécution. Pour les tables transactionnelles comme BDB ou InnoDB , toutes les modifications ( UPDATE , DELETE ou INSERT ) qui modifient les tables sont mises en cache jusqu'à ce qu'une commande COMMIT ne les envoie au serveur. A ce moment, mysqld écrit la totalité de la transaction dans le log binaire, avant d'appliquer la commande COMMIT . Tous les threads vont, au démarrage, allouer un buffer de la taille de binlog_cache_size octets pour enregistrer les requêtes. Si la requête est plus grande que ce buffer, le thread va ouvrir un fichier temporaire pour écrire la transaction. Le fichier temporaire sera supprimé dès que le thread se termine. L'option max_binlog_cache_size (par défaut 4Go) peut être utilisé pour limiter la taille utilisée pour mettre en cache une transaction multi?requête. Si la transaction est plus grande que que cette taille, elle sera annulée. Si vous utilisez les log de modification ou binaire, les insertions concurrentes seront converties en insertions normales lors de l'utilisation de CREATE ... SELECT ou INSERT ... SELECT . Cela garantit que vous pourrez recréer une copie exacte de la table en appliquant les même commandes sauvegardées. 4.9.5 Le log des requêtes lentes Lorsqu'il est démarré avec l'option ??log?slow?queries[=file_name] , mysqld va écrire dans un fichier les requêtes SQL qui vont mettre plus de long_query_time secondes à s'exécuter. Le temps d'acquisition d'un verrou n'est pas compté. Les requêtes lentes sont enregistrées après l'achèvement de l'exécution de la requête, et libération du verrou. Cela peut être différent de l'ordre dans lequel les commandes sont exécutées. Si aucun nom de fichier n'est donné, le fichier de log prendra par défaut le nom de la machine, suffixé avec ? . Si un nom de fichier est donné, mais qu'il manque le chemin, le fichier sera écrit dans le dossier de données. 4.9.5 Le log des requêtes lentes 285 Manuel MySQL 4.1.x ? Version Française Le log de requêtes lentes peut être utilisé pour repérer les requêtes qui prennent longtemps à s'exécuter, et donc, qui sont candidates à l'optimisation. Avec un grand fichier de log, cela peut devenir difficile. Vous pouvez alors passer le fichier de log à mysqldumpslow pour obtenir un sommaire des requêtes dans ce fichier. Si vous utilisez l'option ??log?long?format alors les requêtes qui n'utilisent pas d'index sont aussi enregistrées. Options en ligne de commande de mysqld . 4.9.6 Entretien des fichiers de log Le serveur MySQL peut créer un grand nombre de fichiers de logs différents, qui permettent de pour être sûr que les logs ne prennent pas tout le disque de la machine. Lorsque vous utilisez MySQL avec des fichiers de log, vous voudrez, de temps en temps, supprimer base de données . Sous une installation Linux ( Redhat ), vous pouvez utiliser le script mysql?log?rotate pour cela. Si vous avez installé MySQL depuis une distribution RPM, le script doit avoir été installé automatiquement. Notez que vous devez être prudent avec cette commande si vous utilisez les logs pour la réplication. Sur d'autres systèmes, vous devez installer un court script par vous même, qui sera exécuté via le démon cron . Vous pouvez forcer MySQL à utiliser de nouveaux fichiers de log en utilisant la commande mysqladmin flush?logs ou avec la commande SQL FLUSH LOGS . Si vous utilisez MySQL version 3.21, vous devez utiliser mysqladmin refresh . Les commandes ci?dessus effectue les tâche suivantes : Si le log standard ( • ??log ) ou le log de requêtes lentes ( ??log?slow?queries ) est utilisé, la commande ferme et réouvre le fichier de log ( et `hostname`? par défaut). Si le log de modifications est utilisé ( • ??log?update ), la commande ferme le log de modification et ouvre un nouveau fichier, avec un nouveau numéro de séquence plus grand. Si vous utilisez uniquement le log de modification, vous pour simplement vider les logs sur le disque, et sauver l'ancien fichier de modification dans une sauvegarde. Si vous utilisez le log normal, vous pouvez faire ceci : shell> cd mysql?data?directory shell> mv shell> mysqladmin flush?logs puis faire une sauvegarde du fichier, et le supprimer ( ). 4.10 Réplication de MySQL Cette section décrit les différentes fonctionnalités de la réplication MySQL. Elle sert de référence pour les options disponibles avec la réplication. Vous y trouverez une introduction à la réplication. Vers la fin, vous y trouverez les questions et problèmes les plus fréquents, avec leur 4.9.6 Entretien des fichiers de log 286 Manuel MySQL 4.1.x ? Version Française de cette section. La réplication est constamment améliorée, et nous modifions souvent le manuel. 4.10.1 Introduction à la réplication La réplication monodirectionnelle est à améliorer la solidité et la vitesse de votre application. Pour la solidité, vous pouvez avoir une copie sur un serveur de sauvegarde, qui prend le relais immédiatement si le maître rencontre des problèmes. L'amélioration de la rapidité est obtenue en envoyant les requêtes sans modification sur un serveur qui ne fait que de la lecture. Bien sur, cela ne fonctionnera que si les lectures dominent, mais c'est le cas le plus répandu. Depuis la version 3.23.15, MySQL supporte la réplication mono directionnelle, en interne. Un serveur sert de maître, et les autres serveurs d'esclaves. Notez qu'un serveur peut servir de maître pour certains, et d'esclaves pour d'autres serveurs. Le maître va conserver un log binaire des compte. L'esclave, au moment de la connexion, informe le maître où il s'est arrêté, rattrape les modifications qui ont eu lieux depuis, puis se bloque en attente des prochaines modifications. Notez que si vous faites de la réplication de base, toutes les modifications de cette base devraient être faites sur le maître ! Un autre avantage de la réplication est que vous pouvez entretenir des sauvegardes immédiates de vos données, depuis le maître vers l'esclave. Sauvegardes de base de données . 4.10.2 Présentation de l'implémentation de la réplication La réplication MySQL est basée sur le fait que le serveur va garder la trace de toutes les évolutions pouvoir exécuter les mêmes requêtes sur leurs copies. Il est très important de comprendre que le fichier de log binaire est simplement un enregistrement des modifications depuis un point fixe dans le temps (le moment où vous activez le log binaire). Tous les esclaves que vous activez auront besoin de la copie des données qui existaient au moment du démarrage du log. Si vous démarrez vos esclaves sur sans qu'ils ne disposent des données identiques à celles du maître au moment du démarrage du log binaire , votre réplication va échouer. Voyez dans la table suivante les indications de compatibilité entre les maîtres et les esclaves, suivant les versions. Depuis la version 4.0, nous recommandons d'utiliser la même version pour les maîtres et esclaves. Maître Maître Maître Maître 3.23.33 et + 4.0.0 4.0.1 4.0.3 et + Esclave 3.23.33 et + oui non non non Esclave 4.0.0 non oui non non Esclave 4.0.1 oui non oui non Esclave 4.0.3 et + oui non non oui Note : MySQL version 4.0.2 n'est pas recommandé pour la réplication. 4.10.1 Introduction à la réplication 287 Manuel MySQL 4.1.x ? Version Française Depuis la version 4.0.0, vous pouvez utiliser la commande LOAD DATA FROM MASTER pour configurer un esclave. Soyez bien conscient qu'actuellement, LOAD DATA FROM MASTER ne fonctionne que si toutes les tables du maître sont du type MyISAM , et qu'il est possible d'obtenir un verrou de lecture global, pour qu'aucune lecture ne se fasse durant le transfert des tables depuis le maître. Cette limitation est de nature temporaire, et elle est dûe au fait que nous n'avons pas encore programmé un système de sauvegarde des tables sans verrou. La limitation sera supprimée dans la future version 4.0 une fois que nous aurons programmé le système de sauvegarde, qui permettra à LOAD DATA FROM MASTER de fonctionner sans bloquer le maître. Etant donné la limitation ci?dessus, nous vous recommandons actuellement d'utiliser la commande LOAD DATA FROM MASTER uniquement si le jeu de données du maître est petit, ou si un verrou prolongé sur le maître est acceptable. Suivant la vitesse de lecture de LOAD DATA FROM MASTER en fonction des systèmes, une règle de base indique que le transfert se fera au rythme de 1 Mo par seconde. Vous pourrez ainsi obtenir une estimation du temps qu'il vous faudra pour transférer les données, si le maître et l'esclave sont connectés sur un réseau de 100 MBit/s, avec des configurations à base de Pentium 700 MHz. Bien sur, votre cas particulier pourra varier en fonction de votre système : la règle ci?dessus vous donnera une première évaluation du temps à attendre. Une fois que l'esclave est correctement configuré, et qu'il fonctionne, il va simplement se connecter au maître et attendre des requêtes de modifications. Si le maître est indisponible ou que l'esclave perd la connexion avec le maître, il va essayer de se reconnecter toutes les master?connect?retry secondes jusqu'à ce qu'il soit capable d'établir la communication, et de recommencer à appliquer les modifications. Chaque esclave garde la trace du point où il en était rendu. Le serveur maître n'a pas de notions du nombre d'esclave qui se connectent, ou qui sont à jour à un moment donné. La prochaine section explique le processus de réplication en détails. 4.10.3 Comment mettre en place la réplication Voici les instructions pour mettre en place la réplication sur votre serveur MySQL. Nous supposons que vous voulez répliquer toutes vos bases, et que vous ne l'avez jamais configuré auparavant. Vous aurez besoin d'éteindre brièvement le serveur principal pour suivre toutes les instructions. Si cette méthode n'est pas la plus simple pour configurer un esclave, ce n'est pas la seule. Par exemple, si vous avez déjà une sauvegarde des données du maître, et que le maître a déjà un identifiant de serveur, et le log binaire activé, vous pouvez configurer l'esclave sans éteindre le serveur et sans bloquer les mises à jours. Pour plus de détails, voyez FAQ de la réplication . Si vous voulez devenir un véritable gourou de la réplication MySQL, nous vous suggérons de commencer par étudier, tester et expérimenter toutes les commandes mentionnées dans le chapitre démarrage de , Options de réplication dans le fichier . Assurez vous que vous avez une version récente de MySQL installée comme maître et • comme esclave.Utilisez les versions 3.23.29 et plus récente. Les anciennes versions utilisaient un autre format de log binaire, et avaient des bogues qui ont été corrigés dans les nouvelles versions. Ne nous rapportez pas de bogues avant d'avoir vérifié si le problème est encore présent dans la dernière version de MySQL. Créez un utilisateur MySQL spécial pour la réplication sur le maître, avec les droits de • FILE (dans les versions plus anciennes que la versions 4.0.2) ou le droit de REPLICATION SLAVE pour les nouvelles versions. Vous devez aussi lui donner les droits de connexion 4.10.3 Comment mettre en place la réplication 288 Manuel MySQL 4.1.x ? Version Française depuis tous les esclaves. Si l'utilisateur ne fait que de la réplication (ce qui est recommandé), vous n'avez pas à lui donner d'autres exemple, pour créer un utilisateur appelé repl qui peut accéder au maître, vous pourriez utiliser une commande comme : mysql> GRANT FILE ON *.* TO repl@"%" IDENTIFIED BY '<password>'; Eteignez le serveur MySQL maître. • mysqladmin ?u root ?p<password> shutdown Sauvegardez toutes les données de votre serveur maître. • Le plus simple pour cela (sous Unix) et d'utiliser la commande tar pour produire une archive de votre dossier de données total. Le dossier de données dépend de votre installation. tar ?cvf /tmp/mysql? /path/to/data?dir Les utilisateurs Windows peuvent utiliser le programme WinZIP ou un logiciel similaire pour créer une archive du dossier de données. Dans le fichier • du maître, ajouter les options log?bin et server?id=unique number à la section [mysqld] et redémarrez le serveur. Il est très important que l'identifiant des esclaves soient différents de celui du maître. Pensez à server?id comme à une valeur comparable à une adresse IP : elle identifie de manière unique un serveur dans la communauté des réplicateurs. [mysqld] log?bin server?id=1 Redémarrez le serveur maître MySQL. • Ajoutez les lignes de configuration suivantes dans le fichier • des esclaves : master?host=<nom d'hôte du maître> master?user=<nom d'utilisateur de réplication> master?password=<mot de passe de l'utilisateur de réplication> master?port=<port TCP/IP du maître> server?id=<un identifiant unique, entre 2 et 2^32?1> Remplacez les valeurs entre <> avec ce qui correspond à votre système. server?id doit être différent pour chaque serveur qui participe à la réplication. Si vous spécifiez pas d'identifiant server?id, il sera mis à 1 si vous n'avez pas défini de master?host , et sinon, il vaudra 2. Notez que dans le cas où vous omettez le server?id , le maître va refuser les connexion des esclaves, et les esclaves vont refuser de se connecter au maître. Par conséquent, omettre server?id n'est bon que pour faire des sauvegarde du log binaire. Copiez la sauvegarde des données dans vos esclaves. Assurez vous que les droits sur ces • données sont corrects. L'utilisateur qui fait fonctionner MySQL doit avoir les droits d'écriture et de lecture sur ces fichiers, tout comme le maître l'avait. Redémarrez les esclaves • Après avoir suivi les instructions ci?dessus, les esclaves doivent se connecter au maître, et rattraper les modifications qui ont eu lieu depuis la sauvegarde des données. Si vous avez oublié de spécifier un server?id pour un esclave, vous allez obtenir l'erreur suivante dans le fichier d'erreur : Warning: one should set server_id to a non?0 value if master_host is set. The server will not act as a slave. Si vous avez oublié de le faire pour le maître, les esclaves ne pourront pas se connecter avec le maî un esclave n'est pas capable de faire la réplication pour une raison quelconque, vous allez trouvez le message d'erreur dans le fichier de log d'erreurs de l'esclave. 4.10.3 Comment mettre en place la réplication 289 Manuel MySQL 4.1.x ? Version Française Une fois qu'un esclave fonctionne, vous allez trouver un fichier appelé dans le même dossier que vos fichiers de logs. Le fichier est utilisé par l'esclave pour savoir où il en est rendu dans le log binaire du maître. Ne le supprimez pas et ne l'éditez pas, à moins que vous ne sachiez vraiment ce que vous faites. Même dans ce cas, il est préférable d'utiliser la commande CHANGE MASTER TO . 4.10.4 Fonctionnalités de la réplication et problèmes connus Voici une liste des fonctionnalités supportées par la réplication de MySQL : La réplication s'effectue correctement sur les valeurs • AUTO_INCREMENT , LAST_INSERT_ID() et TIMESTAMP . RAND() • dans les commandes UPDATE ne se réplique par correctement. Utilisez RAND(some_non_rand_expr) si vous répliquez des UPDATE avec RAND() . Vous pourriez, par exemple, utiliser UNIX_TIMESTAMP() comme argument de RAND() . Vous devez utiliser le même jeu de caractères ( • ??default?character?set ) sur le maître et l'esclave. Si ce n'est pas le cas, vous obtiendrez des erreurs de clés doublons dans l'esclave, car une clé qui est indiquée comme unique sur le maître peut se révéler un doublon pour l'esclave. En version 3.23, • LOAD DATA INFILE sera géré proprement, tant que le fichier réside toujours sur le maître au moment de la propagation de la réplication. Sinon, LOAD LOCAL DATA INFILE sera ignoré. En version 4.0, cette limitation a été levée (toutes les formes de LOAD DATA INFILE sont correctement répliquées). Les requêtes d' • UPDATE qui utilisent des variables utilisateurs ne sont pas correctement répliquées (pour le moment). Les commandes • FLUSH ne sont pas enregistrées dans le fichier de log car elle ne sont pas répliquées aux esclaves. Ce n'est pas normalement un problème, car FLUSH ne modifie pas les tables. Cela peut signifier que vous avez modifié des droits dans les tables MySQL directement sans la commande GRANT et que vous avez répliqué les droits de mysql sans pouvoir faire de commande FLUSH PRIVILEGES sur vos esclaves pour les prendre en compte. Les tables temporaires sont répliquées depuis la version 3.23.29, à l'exception des cas où • vous éteignez le serveur esclave (et pas juste le thread esclave), que vous avez des tables temporaires ouvertes et qu'elles sont utilisées dans des modifications ultérieures. Pour régler ce problème, utilisez la commande SLAVE STOP , vérifiez la variable de statut Slave_open_temp_tables pour vérifier si elle vaut bien 0, puis exécutez mysqladmin shutdown . Si le nombre n'est pas 0, redémarrez l'esclave avec la commande SLAVE START et voyez si vous avez plus de chance la prochaine fois. Il y aura une solution plus élégante, mais il doit attendre la version 4.0. Dans les anciennes versions, les tables temporaires n'étaient pas répliquée : nous vous suggérons de mettre à jour votre version ou d'exécuter la commande SET SQL_LOG_BIN=0 sur vos clients avant toute requête qui utiliserait les tables temporaires. MySQL ne supporte qu'un seul maître, et plusieurs esclaves. En version 4.x, nous allons • ajouter un algorithme de sélection pour que le maître soit modifié si le maître initial flanche. Nous allons aussi introduire une notion d'agent dans les processus, pour aider la répartition de charge en répartissant les requêtes sur les esclaves. Depuis la version 3.23.26, il est possible de connecter les serveurs MySQL en chaîne • bouclée (chaque serveur est le maître du précédent et l'esclave du suivant, en boucle), avec l'activation de l'option log?slave?updates . Notez que de nombreuses requêtes ne vont pas fonctionner dans ce type de configuration à moins que votre code client ne soit écrit avec beaucoup de soin, pour qu'il se charge des problèmes qui pourraient arriver dans différentes séquences de modifications sur différents signifie que vous pouvez réaliser une configuration comme ceci : 4.10.4 Fonctionnalités de la réplication et problèmes connus 290 Manuel MySQL 4.1.x ? Version Française A ?> B ?> C ?> A Cette configuration va fonctionner si vous ne faites que des modifications non exclusives sur les tables. En d'entre terme, si vous insérez des données dans les serveurs A et C, vous ne devez pas insérer une valeur dans le serveur A qui pourrait être en conflit avec une ligne insérée dans le serveur C. Vous ne devez pas non plus modifier de ligne sur deux serveurs en même temps, pour éviter les conflits de valeurs.Notez que le format de log a été modifié en version 3.23.26 de façon à ce que les esclaves pre?3.23.26 ne soient pas capable de les lire. Si la requête sur l'esclave génère une erreur, le thread esclave s'arrête, et un message sera • ajouté dans le fichier d'erreurs .err . Vous devriez vous connecter pour corriger manuellement les données de l'esclave, puis relancer l'esclave avec la commande SLAVE START (disponible depuis la version 3.23.16. En version 3.23.15, vous devrez redémarrer le serveur. Si la connexion au maître est perdue, l'esclave tente de se reconnecter immédiatement, et • en cas d'échec, il va retenter toutes les master?connect?retry (par défaut, 60) secondes. A cause de cela, il est sage d'éteindre le serveur maître et de le redémarrer réguliérement. L'esclave sera capable de gérer les problèmes réseau. Eteindre l'esclave proprement est sûr, car il garde la trace du point où il en est rendu. Les • extinctions sauvages vont produire des problèmes, surtout si le cache disque n'a pas été écrit sur le disque avant que le système ne s'arrête. Votre niveau de tolérance aux pannes sera grandement amélioré si vous avez de bons onduleurs. Si le maître écoute sur un port non?standard, vous devez aussi le spécifier dans le • paramètre master?port du fichier . En version 3.23.15, toutes les tables et bases seront répliquées. Depuis la version 3.23.16, • vous pouvez limiter la réplication à certaines bases, grâce à l'option replicate?do?db du fichier ou simplement d'exclure des bases avec replicate?ignore?db . Notez que jusqu'à la version 3.23.23, il y avait un bogue qui ne traitait correctement les commandes LOAD DATA INFILE si vous les utilisiez dans une base qui étaient exclue de la réplication. Depuis la version 3.23.16, • SET SQL_LOG_BIN = 0 va désactiver l'enregistrement des données de réplication (binaire) sur le maître, et SET SQL_LOG_BIN = 1 la réactivera. Vous aurez besoin des droits de SUPER (en MySQL 4.0.2 et plus récent), ou PROCESS (dans les anciens droits MySQL) pour faire cela. Depuis la version 3.23.19, vous pouvez nettoyer les restes de la réplication lorqu'un • problème est survenu avec les commandes FLUSH MASTER et FLUSH SLAVE . En version 3.23.26, nous avons renommé cette commande en RESET MASTER et RESET SLAVE respectivement, pour clarifier leur action. Les anciennes variantes de FLUSH fonctionnent encore, pour la compatibilité. Depuis la version 3.23.23, vous pouvez modifier les maîtres et ajuster la position de log • avec la commande CHANGE MASTER TO . Depuis la version 3.23.23, vous pouvez dire au maître que les modifications de certaines • bases ne doivent pas être enregistrées dans le fichier de log binaire, avec l'option binlog?ignore?db . Depuis la version 3.23.26, vous pouvez utiliser l'option • replicate?rewrite?db pour dire à l'esclave d'appliquer les modifications d'une base dans une autre. Depuis la version 3.23.28, vous pouvez utiliser la commande • PURGE MASTER LOGS TO 'log?name' pour vous débarasser des anciens logs sur l'esclave. Cela va supprimer les vieux logs, maisp as le log appelé 'log?name' . Etant donné la nature non transactionnelle des tables MySQL, il est possible qui va ne faire • qu'une partie de la modification, et retourner une erreur. Cela peut arriver, par exemple, dans une insertion multiple dont une des lignes viole une contrainte d'unicité, ou si un très long UPDATE est interrompu au milieu du stock de ligne. Si cela arrive sur le maître, l'esclave va s'arrêter et attendre que l'administrateur décide quoi faire, à moins que l'erreur soit légitime, et que la requête arrive à la même conclusion. Si le code d'erreur n'est pas 4.10.4 Fonctionnalités de la réplication et problèmes connus 291 Manuel MySQL 4.1.x ? Version Française désirable, certaines erreurs (voire même toutes), peuvent être masquées avec l'option slave?skip?errors , depuis la version 3.23.47. Alors que des tables particulières peuvent être exclues de la réplication avec les options • replicate?do?table / replicate?ignore?table ou replicate?wild?do?table / replicate?wild?ignore?table , il y a actuellement des problèmes de conception, qui provoque des résultats inattendus dans certains cas très rares. Le protocole de réplication n'informe pas explicitement l'esclave quelles tables vont être modifiées par la requête : l'esclave doit donc analyser lui?même la requête pour le savoir. Pour éviter une analyse répétitive des requêtes qui seront finalement exécutées, l'exclusion de table est actuellement implémentées en envoyant la requête à l'analyseur MySQL, qui va court circuiter la requête, et qui indiquera la réussite si une table utilisée doit être ignorée. En plus de plusieurs sources de ralentissement, cette approche va fatalement engendrer des bogues, et il en existe dux depuis la version 3.23.49 ?? car l'analyseur ouvre automatiquement la table lors de l'analyse de la requête, la table qui doit être ignorée doit donc exister sur l'esclave. L'autre bogue est que si le thread esclave modifie partiellement la table à ignorer, le thread ne va pas réaliser que la table aurait du être ignorée, et va suspendre la réplication. Alors que le premier bogue est conceptuellement simple à corriger, nous n'avons pas encore trouvé de moyen pour corriger le second sans intervenir massivement dans le code, et donc, en compromettre la stabilité. Il existe un palliatif pour les deux, dans les cas rares ou cela arrive à votre application : utilisez slave?skip?errors . 4.10.5 Options de réplication dans le fichier Si vos utilisez la réplication, nous vous recommandons d'utiliser MySQL version 3.23.30 ou plus récent. Les vieilles versions fonctionneront, mais elles présentent des bogues et manquent les nouvelles fonctionnalités. Certaines des options qui seront présentées ici ne seront pas forcément disponibles dans votre version de MySQL, si vous n'utilisez pas la version la plus récente. Pour toutes les options spécifiques à la version 4.0, il y a une note qui l'indique. Sinon, si vous découvrez une option qui vous interesse mais qui n'est pas disponible dans votre version 3.23, et que vous en avez vraiment besoin, mettez à jour votre installation. Notez bien que la version 4.0 est toujours en phase alpha, et que certaines fonctionnalités ne fonctionneront peut être pas aussi bien que prévu. Si vous voulez vraiment essayer de nouvelles fonctionnalités de la version 4.0, nous vous recommandons de le faire de façon à ce que cela ne perturbe pas vos applications critiques. Sur le maître et l'esclave, vous devez utiliser l'option server?id . Elle doit représenter un identifiant unique de réplication. Vous devriez choisir une valeur unique entre 1 et 2^32?1 pour chaque maître et esclave. Example: server?id=3 La table suivante décrit les options que vous pouvez utiliser avec MASTER : Option Description log?bin=filename Ecrit le fichier de log binaire à la position indiquée. Notez que vis vous donner un paramètre avec une extension (par exemple, log? ), les versions jusqu'en 3.23.24 ne fonctionneront pas correctement avec la réplication, si vous utilisez la commande FLUSH LOGS . Le problème a été corrigé avec la version 3.23.25. Si vous utilisez ce type de nom de fichier de log, FLUSH LOGS sera 4.10.5 Options de réplication dans le fichier 292 Manuel MySQL 4.1.x ? Version Française ignoré sur les logs binaires. Pour nettoyer le log, exécutez la commande FLUSH MASTER , et n'oubliez pas la commande FLUSH SLAVE sur chacun des esclaves. En version 3.23.26 et plus récent, vous devriez utiliser RESET MASTER et RESET SLAVE . Comme l'utilisateur peut exécuter une commande FLUSH LOGS , nous devons savoir quel fichier de log est actuellement actif, lequels ont été déjà utilisés, et dans quel ordre. Cette information est log?bin?index=filename stockée dans le fichier d'index de log. Par défaut, ce fichier s'appelle `hostname`.index . Nous n'avez pas à le modifier.Example: log?bin?index=db.index Si cette option est activée, en donnant une valeur à sql?bin?update?same SQL_LOG_BIN vous donnerez automatiquement la même valeur à SQL_LOG_UPDATE et vice?versa. Indique au maître qu'il doit mettre les modifications dans le fichier de log binaire, si la base courante est la base database_name . Toutes les autres bases sont ignorées. Notez que vous si vous utilisez cette binlog?do?db=database_name option, vous devez vous assurer que vous ne faites des modifications que dans la base courante. Example: binlog?do?db=sales Indique au maître que les modifications dont la base courante est database_name ne doivent pas être stockées dans le log binaire. Notez que vous si vous binlog?ignore?db=database_name utilisez cette option, vous devez vous assurer que vous ne faites des modifications que dans la base courante.Example: binlog?ignore?db=accounting La table suivante décrit les options que vous pouvez utiliser avec SLAVE : Option Description Le nom d'hôte du maître, ou l'adresse IP de réplication. Si cette valeur n'est pas spécifiée, l'esclave ne démarrera pas. Notez que la configuration de master?host sera ignorée si il existe un fichier valide. Il est probable qu'un nom mieux choisi pour master?host=host cette option aurait été bootstrap?master?host , mais il est trop tard aujourd'hui. Example: master?host=db? Le nom d'utilisateur que l'esclave va utiliser pour s'identifier lors de la connexion au maître. Cet utilisateur doit avoir les droits de FILE . S'utilisateur maître n'est pas configuré, l'utilisateur test est master?user=username utilisé. La valeur dans aura priorité, si elle peut être lue. Example: master?user=scott master?password=password Le mot de passe que l'esclave va utiliser automatiquement avec le maître. Si il n'est pas configuré, le mot de passe vide sera utilisé. La valeur dans aura priorité, si elle peut être lue. 4.10.5 Options de réplication dans le fichier 293 Manuel MySQL 4.1.x ? Version Française Example: master?password=tiger Le port sur lequel le maître écoute. Si cette valeur n'est pas configurée, la valeur compilée de MYSQL_PORT est utilisée. Si vous n'avez pas joué avec les options du script configure , ce devrait master?port=portnumber être le port 3306. La valeur dans aura priorité, si elle peut être lue. Example: master?port=3306 Le nombre de secondes que le thread esclave va attendre avant de tenter à nouveau de se connecter au maître, dans le cas où le master?connect?retry=seconds maître n'est plus joignable. Par défaut, c'est 60. Example: master?connect?retry=60 Disponible après la version 4.0.0. Active le mode SSL pour la réplication. Soyez prévenu que c'est une fonctionnalité très récente. master?ssl Example: master?ssl Disponible après la version 4.0.0. Le nom du fichier de clé maître SSL. Uniquement valable si l'option master?ssl est active. master?ssl?key Example: master?ssl?key=SSL/master? Disponible après la version 4.0.0. Le nom du fichier de certificat master?ssl?cert SSL. Uniquement valable si l'option master?ssl est active.Example: master?ssl?key=SSL/master? La position du fichier qui enregistre la dernière opération faite avec le maître, durant la réplication. Le fichier par défaut est master?info?file=filename dans le dossier de données. Vous n'avez pas besoin de modifier cela.Example: master?info? Disponible après la version 4.0.0. Le nom d'hôte ou l'adresse IP de l'esclave, qui doit être enregistrée lors de l'identification. Cette valeur apparaîtra dans le résultat de la commande SHOW SLAVE HOSTS . Laissez la vide si vous ne souhaitez pas que l'esclave report?host s'enregistre lui?même. Notez qu'il n'est pas suffisant pour le maître de simplement lire l'IP de l'esclave dans la socket de connexion. A cause du NAT et d'autres problèmes de routage, cette IP peut ne pas êtra valable pour la connexion du maître sur l'esclave.Example: report? Disponible après la version 4.0.0. Port de connexion à l'esclave indiqué au maître durant l'enregistrement. Utilisez cette option report?port uniquement si l'esclave doit écouter sur un port non standard, ou si vous avez un tunnel particulier pour le maître. En cas de doute, laissez le vide. Restreint la réplication à certaines tables. Pour spécifier plus d'une table, vous pouvez utiliser cette directive plusieurs fois, une pour chaque table. Cette option va fonctionner pour les modifications replicate?do?table=db_name.table_name inter?bases, contrairement à replicate?do?db . Example: replicate?do?table=some_db.some_table replicate?ignore?table=db_name.table_name Indique à l'esclave d'ignorer les commandes qui modifie les tables spécifiées (même si d'autres tables de la même commande sont aussi modifiées). Pour spécifier plus d'une table, vous pouvez 4.10.5 Options de réplication dans le fichier 294 Manuel MySQL 4.1.x ? Version Française utiliser cette directive plusieurs fois, une pour chaque table. Cette option va fonctionner pour les modifications inter?bases, contrairement à replicate?ignore?db . Example: replicate?ignore?table=db_name.some_table Restreint la réplication à certaines tables qui vérifient le masque d'expression régulière indiqué. Pour spécifier plus d'une table, vous pouvez utiliser cette directive plusieurs fois, une pour chaque table. Cette option va fonctionner pour les modifications inter?bases. replicate?wild?do?table=db_name.table_name Example: replicate?wild?do?% va répliquer uniquement les modifications qui utilisent une table dont le nom de base commence par foo , et le nom de table commence par bar . Interdit la réplication à certaines tables qui vérifient le masque d'expression régulière indiqué. Pour spécifier plus d'une table, vous pouvez utiliser cette directive plusieurs fois, une pour chaque table. Cette option va fonctionner pour les modifications inter?bases. replicate?wild?ignore?table=db_name.table_name Example: replicate?wild?ignore?% va ignorer la réplication des modifications qui utilisent une table dont le nom de base commence par foo , et le nom de table commence par bar . Restreint la réplication aux bases de données indiquées. Pour spécifier plus d'une base, vous pouvez utiliser cette directive plusieurs fois, une pour chaque base. Vous ne devez pas utiliser cette option si vous faites des modifications inter?bases et que vous ne voulez pas que ces modifications soient prises en compte. La principale raison de ce comportement est qu'il est difficile d'utiliser uniquemnt la ligne de commande pour savoir si une requête doit être répliquée ou pas. Par exemple, si vous utilisez replicate?ignore?db=database_name une commande d'effacement multi?table en MySQL 4.x, qui utilise plusieurs bases. Il est aussi très facile de vérifier la base courante, car cela ne s'applique qu'une fois au moment de la connexion, ou d'un changement de base. Si vous voulez que des modifications inter?bases fonctionnent, assurez vous que vous avez la version 3.23.28 ou plus récente, et utilisez replicate?wild?ignore?table=db_name.% . Example: replicate?ignore?db=some_db Restreint la réplication aux commandes dont le nom de base courante est database_name . Pour spécifier plus d'une base, vous pouvez utiliser cette directive plusieurs fois, une pour chaque base. Notez que cette option ne va pas autoriser la réplication de requêtes inter?bases telles que UPDATE some_db.some_table SET foo='bar' lorsque vous avez sélectionné une autre base replicate?do?db=database_name (ou qu'aucune base n'est sélectionnée). Si vous avez besoin de faire des modifications inter?bases, assurez vous que vous avez la version 3.23.28 ou plus récente, et utilisez replicate?wild?do?table=db_name.% . Example: replicate?do?db=some_db 4.10.5 Options de réplication dans le fichier 295 Manuel MySQL 4.1.x ? Version Française Indique à l'esclave d'enregistrer les modifications du thread esclave dans le log binaire. Par défaut, cette option est inactive (off). Vous log?slave?updates aurez besoin de cette fonctionnalité si vous installez les esclaves en cascade. Reporte les modifications qui ont lieu dans une base, dans une replicate?rewrite?db=from_name?>to_name autre.Example: replicate?rewrite?db=master_db_name?>slave_db_name Disponible depuis la version 3.23.47 et plus récent. Indique au thread esclave de continuer la réplication si une requête génère une erreur issue de la liste fournie. Normalement, la réplication va s'arrêter dès qu'une erreur survient, pour que l'utilisateur puisse corriger les incohérence manuellement. N'utilisez pas cette option si nous ne comprenez pas complètement les raisons qui génèrent ces erreurs. Si il y n'a pas de bogues dans vos configurations de réplication, et pas de bogues dans MySQL, vous ne devriez jamais interrompre la réplication. Utiliser cette option à tort et à travers va désynchroniser les esclaves et vous n'aurez aucune idée des problèmes qui sont les codes d'erreurs, vous devez utiliser les numéros d'erreurs qui sont fournis dans le log d'erreur de l'esclave, et dans le résultat de la commande SHOW SLAVE slave?skip?errors= [err_code1,err_code2,... | STATUS . La liste complète des message d'erreurs sont disponibles all] dans le fichier source . Vous pouvez (mais ne devriez pas) aussi utiliser la valeur hautement dangeureuse de all (tous), pour ignorer toutes les erreurs de réplication, et continuer comme si de rien n'était. Inutile de vous dire que si vous l'utilisez, nous ne pouvons rien garantir quand à l'intégrité de vos données. Ne venez pas vous plaindre que les données de vos esclaves sont très différentes des données du maître : vous aurez été prévenus. Exemple : slave?skip?errors=1062,1053 or slave?skip?errors=all Indique au serveur esclave de ne pas démarrer l'esclave au skip?slave?start démarrage. L'utilisateur le démarrera manuellement plus tard, avec SLAVE START . Si cette option vaut 1, alors le protocole compressé est utilisé entre slave_compressed_protocol=# le maître et l'esclave, si les deux le supporte. Le nombre de secondes d'attente de données depuis le maître, slave_net_timeout=# avant d'abandonner la lecture. 4.10.6 Commandes SQL liées à la réplication La réplication peut être contrôlée depuis l'interface SQL. Voici un résumé des commandes disponibles : Commande Description SLAVE START Démarre le thred esclave. Depuis MySQL 4.0.2, vous pouvez ajouter les options IO_THREAD ou SQL_THREAD à cette commande, pour démarrer le thread I/O ou le thread 4.10.6 Commandes SQL liées à la réplication 296 Manuel MySQL 4.1.x ? Version Française SQL. Le thread I/O lit les requêtes depuis le maître, et les stockent dans le log de relais. Le thread SQL lit le log de relais, et exécute les requêtes. (Esclave) Stoppe le thread esclave. Comme SLAVE START , cette SLAVE STOP commande peut être utilisée avec les options IO_THREAD et SQL_THREAD . (Esclave) Désactive le log binaire, si l'utilisateur a les droits de SUPER . SET SQL_LOG_BIN=0 Ignoré sinon. (Maître) Réactive le log binaire, si Re?enables update logging, si SET SQL_LOG_BIN=1 l'utilisateur a les droits de SUPER . Ignoré sinon. (Maître) Ignore les n prochains événements du maître. Uniquement SET GLOBAL valide lorsque le thread esclave ne fonctionne pas, sinon SQL_SLAVE_SKIP_COUNTER=n une erreur est affichée. Très pratique pour corriger des petits problèmes de réplications. Efface tous les logs binaires dans le fichier d'index, et vide le RESET MASTER fichier de log binaire. Dans les versions antérieures à la 3.23.26, utilisez FLUSH MASTER . (Maître) Efface la position de réplication de l'esclave dans les logs du maître. Makes the slave forget its replication position in the RESET SLAVE master logs. Dans les versions antérieures à la 3.23.26, cette commande s'appelait FLUSH SLAVE . (Esclave) Télécharge une copie des tables depuis le maître vers l'esclave. Implémentée principalement pour le débogage de LOAD TABLE tblname FROM LOAD DATA FROM MASTER , mais certains utilisateurs MASTER ``gourmets'' pourront la trouver pratique pour d'autres utilisations. Ne l'utilisez pas si vous vous considérez comme un utilisater ``non?hacker''. (Esclave) Disponible depuis 4.0.0. Prend une copie des données du maître et les transfère vers l'esclave. Met à jour les valeurs de MASTER_LOG_FILE et MASTER_LOG_POS de manière à ce que l'esclave démarre la réplication depuis la position correcte. Cette commande respecte les règles d'exclusion des tables et des bases spécifiées dans les options LOAD DATA FROM MASTER replicate?* . Actuellement fonctionne uniquement avec les tables MyISAM et pose un verrou global en lecture sur toutes les tables, pour faire la sauvegarde. Dans le futur, il est prévu de rendre cette commande compatible avec les tables InnoDB et de supprimer le besoin du verrou global pour faire une sauvegarde non bloquante. CHANGE MASTER TO Change les paramètres du maître avec les valeurs master_def_list spécifiées dans l'argument master_def_list et redémarre le thread esclave. master_def_list est une liste séparée par des virgules, avec les variables suivantes : MASTER_HOST , MASTER_USER , MASTER_PASSWORD , MASTER_PORT , MASTER_CONNECT_RETRY , MASTER_LOG_FILE et MASTER_LOG_POS . Par exemple : CHANGE MASTER TO MASTER_HOST='', MASTER_USER='replication', MASTER_PASSWORD='bigs3cret', MASTER_PORT=3306, MASTER_LOG_FILE='master2?bin.001', MASTER_LOG_POS=4; 4.10.6 Commandes SQL liées à la réplication 297 Manuel MySQL 4.1.x ? Version Française Vous n'avez pas besoin de spécifier les valeurs que vous ne souhaitez pas changer. Les valeurs omises conserveront leur valeur actuelle, même si vous modifiez l'hôte ou le port. Dans ce cas, l'esclave supposer que puisque vous vous connectez à un nouvel hôte ou un nouveau port, le maître est différent. Par conséquent, il les anciennes valeurs de log et position ne sont plus applicables, et il va automatiquement leur donner la valeur de la chaîne vide, et de 0, respectivement, qui sont les valeurs de démarrage. Notez qui si vous redémarrez l'esclave il va se souvenir de son ancien maître. Si vous ne le souhaitez pas, il suffit d'effacer le fichier avant de le redémarrer, et l'esclave va lire la valeur depuis le fichier ou la ligne de commande.Cette commande est pratique pour configurer un esclave lorsque vous avez une sauvegarde du maître, et que vous avez sauvé la valeur du log et de son offset chez le maître. Vous pouvez alors exécuter la commande CHANGE MASTER TO MASTER_LOG_FILE='log_name_on_master', MASTER_LOG_POS=log_offset_on_master sur l'esclave après avoir restauré la sauvegarde. (Esclave) Fournit les informations de statut sur le point de contrôle du SHOW MASTER STATUS fichier de log binaire du maître. (Maître) Disponible depuis la version 4.0.0. Cette commande liste les SHOW SLAVE HOSTS esclaves actuellement enregistré auprès du maître. (Maître) Fournit les informations essentielles sur le statut de SHOW SLAVE STATUS l'esclave. (Esclave) Uniquement disponible depuis la version 3.23.28. Liste les logs binaires sur le maître. Vous devriez utiliser cette SHOW MASTER LOGS commande avant d'utiliser la commande PURGE MASTER LOGS TO pour savoir lesquels vous voulez effacer. (Maître) Affiche les événements dans le log binaire. Initialement SHOW BINLOG EVENTS [ IN utilisé pour le test et le débogage dans le log binaire, mais il 'logname' ] [ FROM pos ] [ peut aussi être utilisé par les clients habituels qui, pour une LIMIT [offset,] rows ] raison ou une autre, ont besoin de lire le contenu du log binaire. (Maître) Cette commande est utilisée lorsque l'esclave d'un maître probablement mort ou indisponible doit être redirigé vers un autre maître qui fait la réplication du même maître. La SHOW NEW MASTER FOR SLAVE commande va retourner les nouvelles coordonnées de WITH réplication (le nom du point de contrôle dans le fichier de log MASTER_LOG_FILE='logfile' binaire et son offset). Le résultat de la commande peut être AND MASTER_LOG_POS=pos AND utilisé dans un appel à la commande CHANGE MASTER TO . MASTER_LOG_SEQ=log_seq AND Les utilisateurs normaux ne doivent jamais exécuter cette MASTER_SERVER_ID=server_id commande. Elle est réservée à l'utilisation interne par le code de réplication sans erreur. Nous risquons de changer cette syntaxe, si vous trouvons un autre moyen plus intuitif de faire cette opération. PURGE MASTER LOGS TO Disponible depuis la version 3.23.28. Efface tous les logs de 'logname' réplication qui sont listés dansle fichier d'index de réplication, comme étant des logs déjà utilisés. Le log qui est spécifié devient alors log courant. Exemple : PURGE MASTER LOGS TO 'mysql?bin.010' 4.10.6 Commandes SQL liées à la réplication 298 Manuel MySQL 4.1.x ? Version Française Cette commande ne fait rien et échoue avec une erreur si vous avez un esclave actif qui est actuellement en train de lire un des fichiers de logs que vous essayez d'effacer. Cependant, si vous avez un esclave qui dort, et que vous effacez un des logs qu'il voudra lire plus tard, l'esclave ne pourra pas effectuer la réplication lorsque son temps arrivera. La commande est sûre lorsque d'autres esclaves effectue la réplication : vous n'aurez pas à les arrêter. Vous devez d'abord vérifier tous les esclaves, avec la commande SHOW SLAVE STATUS pour voir quels logs ils utilisent, pour faire une liste des logs sur le maître avec la commande SHOW MASTER LOGS , trouver le plus vieux log de tous (si tous les esclaves sont mis à jours, cela doit être le dernier de la liste), effectuer une sauvegarde optionnelle de tous les logs, puis supprimer les logs du serveur. 4.10.7 FAQ de la réplication Q : Comment puis?je configurer un esclave si le maître fonctionne déjà, et que je ne veux pas le stopper? R : Il y a plusieurs solutions. Si vous avez effectué une sauvegarde du maître à un moment et enregistré le nom et l'offset du binlog (issu du résultat de la commande SHOW MASTER STATUS ) correspondant à la sauvegarde, faites ceci : Assurez vous qu'un identifiant unique est assigné à l'esclave. • Exécutez la commande • CHANGE MASTER TO MASTER_HOST='master?host?name', MASTER_USER='master?user?name', MASTER_PASSWORD='master?pass', MASTER_LOG_FILE='recorded?log?name', MASTER_LOG_POS=recorded_log_pos Exécutez la commande • SLAVE START Si vous n'avez pas de copie de sauvegarde, voici un moyen rapide d'en faire une : FLUSH TABLES WITH READ LOCK • gtar zcf /var/lib/mysql • ( ou toute variation de cette commande) SHOW MASTER STATUS • ? assurez vous de noter le résultat. Vous en aurez besoin ultérieurement. UNLOCK TABLES • Après cela, suivez les instructions comme pour le cas où vous avez déjà votre sauvegarde, et que vous avez enregistré le nom et l'offset du point de contrôle du log binaire. Tant que les logs binaires du serveur sont toujours là, vous allez pouvoir rattrapper tout ce qui se fait sur le serveur principal. Vous pourriez même attendre plusieurs jours ou mois avant de mettre en place votre esclave. En théorie, le temps d'attente peut être infini. En pratique, les limitations sont l'espace disque du maître, et le temps que cela prendra à l'esclave pour rattrapper le version 4.0.0 et plus récentes, vous pouvez aussi utiliser LOAD DATA FROM MASTER . C'est une commande pratique pour faire une copie de la base, l'envoyer à l'esclave, et ajutser le point de contrôle du log binaire, tout en une seule commande. Dans le future, LOAD DATA FROM MASTER sera la méthode recommandée pour configurer un esclave. Soyez prévenus, que le verrou de lecture posé par la commande sur le serveur peut rester en place un très long moment, si vous utilisez cette commande : elle n'est pas encore implémentée de manière efficace. Si vous avez de grandes 4.10.7 FAQ de la réplication 299 Manuel MySQL 4.1.x ? Version Française tables, préférez donc la méthode qui utilise la sauvegarde via l'utilitaire tar après avoir exécuté la commande FLUSH TABLES WITH READ LOCK . Q : Est ce que l'esclave doit être connecté en permanance au serveur? R : Non, il n'est pas obligé. Vous pouvez éteindre l'esclave et le laisser déconnecter plusieurs heures ou jours, puis le reconnecter pour le voir récupérer les modifications et rattrapper le temps. Puis, se déconnecter à nouveau. De cette façon, vous pouvez, par exemple, configurer un esclave via une connexion modem, qui n'utilise que de brève période de connexions. L'implication de cela est qu'il n'est jamais garantit que l'esclave soit synchronisé avec le maître, à moins que vous ne preniez des mesures pour cela. Dans le futur, nous allons avoir l'option de bloquer le maître jusqu'à ce que au moins un des esclaves soit synchronisé. Q : Comment puis?je forcer le maître à bloquer les modifications jusqu'à ce que l'esclave ait tout rattrappé? R : Exécutez les commandes suivantes : Master: • FLUSH TABLES WITH READ LOCK Master: • SHOW MASTER STATUS ? notez le nom du point de