Beruflich Dokumente
Kultur Dokumente
0 Reference Manual
iii
2.4.6. La distribution source Windows .......................................................................... 99 2.4.7. Compiler les clients MySQL sous Windows ....................................................... 102 2.5. Procdure de post-installation ..................................................................................... 102 2.5.1. Post-installation sous Windows ......................................................................... 103 2.5.2. Procdures de post-installation sous Unix ......................................................... 103 2.5.3. Cration des premiers droits MySQL ................................................................ 113 2.6. Changer de version de MySQL ................................................................................... 116 2.6.1. Passer en de version 4.1 en version 5.0 ........................................................... 117 2.6.2. Passer de la version 4.0 la version 4.1 .......................................................... 117 2.6.3. Passer de la version 3.23 la version 4.0 ........................................................ 120 2.6.4. Passer de la version 3.22 la version 3.23 ....................................................... 124 2.6.5. Passer de la version 3.21 la version 3.22 ....................................................... 125 2.6.6. Passer de la version 3.20 la version 3.21 ....................................................... 126 2.6.7. Mise jour des tables de droits ....................................................................... 127 2.6.8. Migrer depuis une autre architecture ................................................................. 127 2.7. Rduire de version de MySQL .................................................................................... 128 2.7.1. Revenir en version 4.1 ..................................................................................... 129 2.7.2. Revenir en version 4.0 ..................................................................................... 130 2.8. Notes spcifiques aux systmes d'exploitation ............................................................. 130 2.8.1. Notes relatives Linux (toutes versions) ........................................................... 130 2.8.2. Notes relatives Mac OS X ............................................................................. 137 2.8.3. Notes pour Solaris ........................................................................................... 138 2.8.4. Notes relatives BSD ..................................................................................... 141 2.8.5. Notes sur les autres Unix ................................................................................. 144 2.8.6. Notes relatives OS/2 ..................................................................................... 152 2.8.7. Notes relatives BeOS ................................................................................... 153 2.9. Commentaires sur l'installation de Perl ........................................................................ 153 2.9.1. Installer Perl sur Unix ...................................................................................... 154 2.9.2. Installer ActiveState Perl sur Windows .............................................................. 154 2.9.3. Problmes lors de l'utilisation des interfaces Perl DBI et DBD ............................. 155 3. Tutoriels d'introduction ........................................................................................................... 159 3.1. Connexion et dconnexion au serveur ......................................................................... 159 3.2. Entrer des requtes .................................................................................................... 160 3.3. Cration et utilisation d'une base de donnes .............................................................. 163 3.3.1. Crer et slectionner une base de donnes ...................................................... 164 3.3.2. Cration d'une table ......................................................................................... 164 3.3.3. Charger des donnes dans une table ............................................................... 166 3.3.4. Rcuprer des informations partir d'une table ................................................. 167 3.4. Obtenir des informations propos des bases de donnes et des tables ......................... 179 3.5. Utilisation de mysql en mode batch ............................................................................ 180 3.6. Exemples de requtes usuelles ................................................................................... 181 3.6.1. La valeur maximale d'une colonne .................................................................... 182 3.6.2. La ligne contenant le maximum d'une certaine colonne ...................................... 182 3.6.3. Maximum d'une colonne par groupe ................................................................. 182 3.6.4. La ligne contenant la plus grande valeur d'un certain champ par rapport un groupe ...................................................................................................................... 183 3.6.5. Utiliser les variables utilisateur ......................................................................... 184 3.6.6. Utiliser les clefs trangres .............................................................................. 184 3.6.7. Recherche sur deux clefs ................................................................................ 185 3.6.8. Calcul du nombre de visites par jour ................................................................ 185 3.6.9. Utiliser AUTO_INCREMENT ................................................................................ 186 3.7. Requtes du projet Twin ............................................................................................. 187 3.7.1. Trouver tous les jumeaux rpondant aux critres ............................................... 187 3.7.2. Afficher une table avec l'tat des paires de jumeaux .......................................... 189 3.8. Utilisation de MySQL avec Apache ............................................................................. 190 4. Utiliser les programmes MySQL ............................................................................................. 191 4.1. Prsentation des logiciels MySQL ............................................................................... 191 4.2. Appeler des programmes MySQL ................................................................................ 192
iv
4.3. Spcifier des options aux programmes ........................................................................ 192 4.3.1. Options de ligne de commande de mysqld ...................................................... 193 4.3.2. Fichier d'options my.cnf ................................................................................. 194 4.3.3. Utiliser les variables d'environnement pour spcifier des options ......................... 197 4.3.4. Utiliser les options pour configurer des variables de programme ......................... 198 5. Administration du serveur ...................................................................................................... 201 5.1. Scripts serveur MySQL et utilitaires ............................................................................. 202 5.1.1. Prsentation des scripts serveurs et des utilitaires ............................................. 202 5.1.2. mysqld-max, la version tendue du serveur mysqld ........................................ 203 5.1.3. safe_mysqld, le script pre de mysqld .......................................................... 205 5.1.4. Le script de dmarrage mysql.server ........................................................... 208 5.1.5. mysqld_multi, un programme pour grer plusieurs serveurs MySQL ............... 208 5.2. Configuration de MySQL ............................................................................................. 211 5.2.1. Options de ligne de commande de mysqld ...................................................... 211 5.2.2. Le mode SQL du serveur ................................................................................. 221 5.2.3. Variables serveur systme ............................................................................... 225 5.2.4. Variables de statut du serveur .......................................................................... 246 5.3. Le processus d'extinction de MySQL ........................................................................... 252 5.4. Scurit gnrale du serveur ...................................................................................... 254 5.4.1. Guide de scurit ............................................................................................ 254 5.4.2. Protger MySQL contre les attaques ................................................................ 256 5.4.3. Options de dmarrage qui concernent la scurit .............................................. 258 5.4.4. Problmes de scurit avec LOAD DATA LOCAL ............................................. 259 5.5. Rgles de scurit et droits d'accs au serveur MySQL ............................................... 259 5.5.1. Rle du systme de privilges ......................................................................... 259 5.5.2. Comment fonctionne le systme de droits ......................................................... 260 5.5.3. Droits fournis par MySQL ................................................................................. 263 5.5.4. Se connecter au serveur MySQL ...................................................................... 265 5.5.5. Contrle d'accs, tape 1 : Vrification de la connexion ..................................... 266 5.5.6. Contrle d'accs, tape 2 : Vrification de la requte ......................................... 270 5.5.7. Quand les modifications de privilges prennent-ils effets ? ................................. 272 5.5.8. Causes des erreurs Access denied .............................................................. 272 5.5.9. Hashage de mots de passe en MySQL 4.1 ....................................................... 277 5.6. Gestion des comptes utilisateurs de MySQL ................................................................ 281 5.6.1. Nom d'utilisateurs MySQL et mots de passe ..................................................... 281 5.6.2. Ajouter de nouveaux utilisateurs MySQL ........................................................ 282 5.6.3. Supprimer un compte utilisateur de MySQL ...................................................... 285 5.6.4. Limiter les ressources utilisateurs ..................................................................... 285 5.6.5. Configurer les mots de passe ........................................................................... 286 5.6.6. Garder vos mots de passe en lieu sr .............................................................. 287 5.6.7. Utilisation des connexions scurises ............................................................... 288 5.7. Prvention des dsastres et restauration ..................................................................... 295 5.7.1. Sauvegardes de base de donnes ................................................................... 295 5.7.2. Exemples de stratgie de sauvegarde et restauration ........................................ 296 5.7.3. Utilisation de myisamchk pour la maintenance des tables et leur recouvrement .. 300 5.7.4. Mettre en place un rgime d'entretien de MySQL .............................................. 311 5.7.5. Obtenir des informations sur une table ............................................................. 312 5.8. Localisation MySQL et utilisation internationale ............................................................ 316 5.8.1. Le jeu de caractres utilis pour les donnes et le stockage ............................... 316 5.8.2. Langue des messages d'erreurs ....................................................................... 317 5.8.3. Ajouter un nouveau jeu de caractres ............................................................... 317 5.8.4. Le tableau de dfinition des caractres ............................................................. 319 5.8.5. Support d'assemblage des chanes .................................................................. 319 5.8.6. Support des caractres multi-octets .................................................................. 320 5.8.7. Problmes avec les jeux de caractres ............................................................. 320 5.8.8. Support des fuseaux horaires avec MySQL ....................................................... 320 5.9. Les fichiers de log de MySQL ..................................................................................... 321 5.9.1. Le log d'erreurs ............................................................................................... 322
5.9.2. Le log gnral de requtes .............................................................................. 322 5.9.3. Le log de modification ...................................................................................... 323 5.9.4. Le log binaire .................................................................................................. 323 5.9.5. Le log des requtes lentes ............................................................................... 326 5.9.6. Entretien des fichiers de log ............................................................................. 326 5.10. Faire fonctionner plusieurs serveurs MySQL sur la mme machine .............................. 327 5.10.1. Utiliser plusieurs serveurs MySQL un serveur Windows ................................... 329 5.10.2. Utiliser plusieurs serveurs sous Unix ............................................................... 332 5.10.3. Utiliser les clients dans un environnement multi-serveur ................................... 333 5.11. Cache de requtes MySQL ....................................................................................... 333 5.11.1. Comment fonctionne le cache de requtes ...................................................... 334 5.11.2. Options relatives au cache de requtes dans un SELECT ................................. 335 5.11.3. Configuration du cache de requtes ............................................................... 335 5.11.4. Statut du cache de requtes et maintenance ................................................... 336 6. Rplication de MySQL ........................................................................................................... 339 6.1. Introduction la rplication ......................................................................................... 339 6.2. Prsentation de l'implmentation de la rplication ........................................................ 340 6.3. Dtails d'implmentation de la rplication .................................................................... 340 6.3.1. Etat de rplication du matre ............................................................................ 342 6.3.2. Etats du thread esclave d'E/S .......................................................................... 342 6.3.3. Etats des esclaves de rplication ..................................................................... 343 6.3.4. Fichiers de relais et de statut de la rplication ................................................... 344 6.4. Comment mettre en place la rplication ....................................................................... 345 6.5. Compatibilit de la rplication entre les versions de MySQL .......................................... 349 6.6. Changer de version de rplication ............................................................................... 350 6.6.1. Passer la rplication version 4.0 .................................................................... 350 6.6.2. Passer la rplication version 5.0 .................................................................... 350 6.7. Fonctionnalits de la rplication et problmes connus .................................................. 351 6.8. Options de dmarrage de la rplication ....................................................................... 353 6.9. FAQ de la rplication .................................................................................................. 362 6.10. Correction de problmes courants ............................................................................. 367 6.11. Rapporter des bugs de rplication ............................................................................. 367 7. Optimisation de MySQL ......................................................................................................... 369 7.1. Prsentation de l'optimisation ...................................................................................... 370 7.1.1. Limitations et inconvnients des choix conceptuels de MySQL ........................... 370 7.1.2. Portabilit ........................................................................................................ 370 7.1.3. Pour quoi avons nous utilis MySQL ? ............................................................. 371 7.1.4. La suite de tests MySQL ................................................................................. 372 7.1.5. Utiliser vos propres tests de performance ......................................................... 374 7.2. Optimisation des commandes SELECT et autres requtes ............................................ 374 7.2.1. Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT) ........................ 375 7.2.2. Mesurer les performances d'une requte .......................................................... 382 7.2.3. Vitesse des requtes SELECT .......................................................................... 383 7.2.4. Comment MySQL optimise les clauses WHERE .................................................. 383 7.2.5. Optimisation d'intervalle ................................................................................... 385 7.2.6. Optimisation de combinaison d'index ................................................................ 388 7.2.7. Comment MySQL optimise IS NULL ............................................................... 390 7.2.8. Comment MySQL optimise DISTINCT .............................................................. 391 7.2.9. Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN .................. 391 7.2.10. Comment MySQL optimise ORDER BY ........................................................... 392 7.2.11. Comment MySQL optimise les clauses GROUP BY .......................................... 393 7.2.12. Comment MySQL optimise LIMIT .................................................................. 395 7.2.13. Comment viter les analyses de tables ........................................................... 395 7.2.14. Vitesse des requtes INSERT ........................................................................ 396 7.2.15. Vitesses des commandes UPDATE .................................................................. 398 7.2.16. Rapidit des requtes DELETE ....................................................................... 398 7.2.17. Autres conseils d'optimisation ......................................................................... 398 7.3. Verrouillage de tables ................................................................................................. 401
vi
7.3.1. Mthodes de verrouillage ................................................................................. 401 7.3.2. Problme de verrouillage de tables ................................................................... 403 7.4. Optimiser la structure de la base de donnes .............................................................. 404 7.4.1. Conception ...................................................................................................... 404 7.4.2. Rendre vos tables aussi compactes que possible .............................................. 405 7.4.3. Index de colonnes ........................................................................................... 405 7.4.4. Index sur plusieurs colonnes ............................................................................ 406 7.4.5. Comment MySQL utilise les index .................................................................... 407 7.4.6. Le cache de cl des tables MyISAM ................................................................. 409 7.4.7. Comment MySQL compte les tables ouvertes ................................................... 413 7.4.8. Quand MySQL ouvre et ferme les tables .......................................................... 413 7.4.9. Inconvnients de la cration d'un grand nombre de tables dans la mme base de donnes ............................................................................................................... 415 7.5. Optimiser le serveur MySQL ....................................................................................... 415 7.5.1. Rglage du systme, au moment de la compilation, et paramtres du dmarrage ................................................................................................................ 415 7.5.2. Rglage des paramtres du serveur ................................................................. 415 7.5.3. Contrle des performances de l'optimisateur de requtes ................................... 418 7.5.4. Influences de la compilation et des liaisons sur la vitesse de MySQL .................. 418 7.5.5. Comment MySQL gre la mmoire ................................................................... 419 7.5.6. Comment MySQL utilise le DNS ....................................................................... 421 7.6. Problmes avec les disques ....................................................................................... 421 7.6.1. Utiliser des liens symboliques .......................................................................... 422 8. MySQL Scripts clients et utilitaires ......................................................................................... 427 8.1. Prsentation des scripts serveurs et utilitaires .............................................................. 427 8.2. myisampack, le gnrateur de tables MySQL compresses en lecture seule ................ 429 8.3. mysql, l'outil en ligne de commande ........................................................................... 434 8.3.1. Commandes mysql ......................................................................................... 439 8.3.2. Comment excuter des commandes SQL depuis un fichier texte ........................ 441 8.3.3. Conseils avec mysql ....................................................................................... 442 8.4. mysqladmin, administration d'un serveur MySQL ....................................................... 443 8.5. mysqlbinlog, Excuter des requtes dans le log binaire ............................................ 447 8.6. mysqlcc, MySQL Control Center ............................................................................... 450 8.7. Utiliser mysqlcheck pour l'entretien et la rparation .................................................... 452 8.8. mysqldump, sauvegarde des structures de tables et les donnes ................................. 455 8.9. mysqlhotcopy, copier les bases et tables MySQL ..................................................... 460 8.10. mysqlimport, importer des donnes depuis des fichiers texte ................................... 462 8.11. Afficher les bases, tables et colonnes ........................................................................ 464 8.12. perror, expliquer les codes d'erreurs ....................................................................... 466 8.13. L'utilitaire de remplacement de chanes replace ...................................................... 466 9. Structure du langage ............................................................................................................. 469 9.1. Littraux : comment crire les chanes et les nombres .................................................. 469 9.1.1. Chanes .......................................................................................................... 469 9.1.2. Nombres ......................................................................................................... 471 9.1.3. Valeurs hexadcimales .................................................................................... 471 9.1.4. Valeurs boolennes ......................................................................................... 472 9.1.5. Champs de bits ............................................................................................... 472 9.1.6. Valeurs NULL .................................................................................................. 472 9.2. Noms de bases, tables, index, colonnes et alias .......................................................... 472 9.2.1. Identifiants ....................................................................................................... 474 9.2.2. Sensibilit la casse pour les noms ................................................................. 474 9.3. Variables utilisateur .................................................................................................... 475 9.4. Variables systme ...................................................................................................... 476 9.4.1. Variables systme structures .......................................................................... 478 9.5. Syntaxe des commentaires ......................................................................................... 479 9.6. Cas des mots rservs MySQL ................................................................................... 480 10. Jeux de caractres et Unicode ............................................................................................ 485 10.1. Jeux de caractres et collation : gnralits ............................................................... 486
vii
10.2. Jeux de caractres et collation dans MySQL .............................................................. 486 10.3. Dterminer le jeu de caractres et la collation par dfaut ............................................ 487 10.3.1. Jeu de caractres et collation serveur ............................................................. 488 10.3.2. Jeu de caractres et collation de base de donnes .......................................... 488 10.3.3. Jeu de caractres de tables et collation .......................................................... 489 10.3.4. Jeu de caractres de colonne et collation ....................................................... 489 10.3.5. Exemples d'attribution de jeu de caractres et collation .................................... 490 10.3.6. Jeux de caractres et collations de connexion ................................................. 490 10.3.7. Jeu de caractres et collation des chanes littrales ......................................... 492 10.3.8. Clause COLLATE dans diffrentes parties d'une requte SQL ........................... 493 10.3.9. COLLATE clause de prcdence ..................................................................... 493 10.3.10. Oprateur BINARY ....................................................................................... 494 10.3.11. Quelques cas spciaux o la dtermination de la collation est difficile .............. 494 10.3.12. Les collation doivent correspondre au bon jeu de caractres .......................... 495 10.3.13. Un exemple de l'effet de collation ................................................................. 495 10.4. Oprations affectes par le support de jeux de caractres. ......................................... 496 10.4.1. Chanes rsultats ........................................................................................... 496 10.4.2. CONVERT() ................................................................................................... 497 10.4.3. CAST() ......................................................................................................... 497 10.4.4. Commande SHOW ........................................................................................... 497 10.5. Support de Unicode .................................................................................................. 498 10.6. UTF8 pour les meta-donnes .................................................................................... 499 10.7. Compatibilit avec d'autres bases de donnes ........................................................... 500 10.8. Nouveau format de fichier de configuration de jeux de caractres ................................ 500 10.9. Jeux de caractres national ...................................................................................... 500 10.10. Prparer le passage de version 4.0 en 4.1 ............................................................... 501 10.10.1. Jeux de caractres 4.0 et binmes de jeux de caractres/collations 4.1 correspondants .......................................................................................................... 501 10.10.2. Conversion de colonnes version 4.0 en version 4.1 ........................................ 502 10.11. Les jeux de caractres et collation supports par MySQL. ........................................ 503 10.11.1. Les jeux de caractre Unicode ..................................................................... 504 10.11.2. Les jeux de caractres d'Europe de l'Ouest. .................................................. 504 10.11.3. Les jeux de caractres d'Europe Centrale ..................................................... 505 10.11.4. Jeu de caractres pour l'Europe du Sud et le Moyen-Orient ............................ 506 10.11.5. Les jeux de caractres baltes ....................................................................... 507 10.11.6. Les jeux de caractre cyrilliques ................................................................... 507 10.11.7. Les jeux de caractres asiatiques ................................................................. 508 11. Types de colonnes .............................................................................................................. 509 11.1. Introduction aux types de colonnes ........................................................................... 509 11.1.1. Prsentation des types numriques of Numeric Types ..................................... 509 11.1.2. Prsentation des types de donnes temporels : dates et heures ....................... 512 11.1.3. Prsentation des types de chanes ................................................................. 513 11.2. Types numriques .................................................................................................... 515 11.3. Les types date et heure ............................................................................................ 516 11.3.1. Les types DATETIME, DATE, et TIMESTAMP .................................................... 517 11.3.2. Le type TIME ................................................................................................ 521 11.3.3. Le type YEAR ................................................................................................ 522 11.3.4. An 2000 et les types date .............................................................................. 522 11.4. Les types chanes .................................................................................................... 523 11.4.1. Les types CHAR et VARCHAR .......................................................................... 523 11.4.2. Les types BINARY and VARBINARY ................................................................ 524 11.4.3. Les types BLOB et TEXT ................................................................................ 524 11.4.4. Le type ENUM ................................................................................................ 525 11.4.5. Le type SET .................................................................................................. 526 11.5. Capacits des colonnes ............................................................................................ 528 11.6. Choisir le bon type de colonne .................................................................................. 529 11.7. Utilisation des types de donnes issues d'autres SGBDR ........................................... 529 12. Fonctions utiliser dans les clauses SELECT et WHERE ........................................................ 531
viii
12.1. Oprateurs et fonctions tous types ............................................................................ 532 12.1.1. Prcdence des oprateurs ............................................................................ 532 12.1.2. Parenthses .................................................................................................. 532 12.1.3. Oprateurs de comparaison ........................................................................... 532 12.1.4. Oprateurs logiques ....................................................................................... 536 12.2. Les fonctions de contrle .......................................................................................... 537 12.3. Fonctions de chanes de caractres .......................................................................... 539 12.3.1. Oprateurs de comparaison pour les chanes de caractres ............................. 547 12.4. Fonctions numriques ............................................................................................... 549 12.4.1. Oprations arithmtiques ................................................................................ 549 12.4.2. Fonctions mathmatiques ............................................................................... 550 12.5. Fonctions de dates et d'heures ................................................................................. 555 12.6. Recherche en texte intgral (Full-text) dans MySQL ............................................. 569 12.6.1. Boolens de recherches en texte intgral ........................................................ 571 12.6.2. Recherche en texte intgral avec extension de requte .................................... 573 12.6.3. Restrictions avec la recherche en texte intgral ............................................... 574 12.6.4. Paramtrage prcis de la recherche en text intgral de MySQL ........................ 574 12.6.5. A faire dans la recherche Full-text ............................................................ 575 12.7. Fonctions de transtypage .......................................................................................... 576 12.8. Autres fonctions ........................................................................................................ 578 12.8.1. Fonctions sur les bits ..................................................................................... 578 12.8.2. Fonctions de chiffrements .............................................................................. 579 12.8.3. Fonctions d'informations ................................................................................. 582 12.8.4. Fonctions diverses ......................................................................................... 586 12.9. Fonctions et options utiliser dans les clauses GROUP BY ......................................... 588 12.9.1. Fonctions avec GROUP BY ............................................................................. 588 12.9.2. Options de GROUP BY ................................................................................... 590 12.9.3. GROUP BY avec les champs cachs ............................................................... 593 13. Syntaxe des commandes SQL ............................................................................................. 595 13.1. Manipulation de donnes : SELECT, INSERT, UPDATE, DELETE .................................. 595 13.1.1. Syntaxe de DELETE ....................................................................................... 595 13.1.2. Syntaxe de DO ............................................................................................... 597 13.1.3. Syntaxe de HANDLER ..................................................................................... 598 13.1.4. Syntaxe de INSERT ....................................................................................... 599 13.1.5. Syntaxe de LOAD DATA INFILE .................................................................. 604 13.1.6. Syntaxe de REPLACE ..................................................................................... 610 13.1.7. Syntaxe de SELECT ....................................................................................... 610 13.1.8. Sous-slections (SubSELECT) ........................................................................ 618 13.1.9. Syntaxe de TRUNCATE ................................................................................... 626 13.1.10. Syntaxe de UPDATE ..................................................................................... 627 13.2. Dfinition de donnes : CREATE, DROP, ALTER .......................................................... 628 13.2.1. Syntaxe de ALTER DATABASE ....................................................................... 628 13.2.2. Syntaxe de ALTER TABLE ............................................................................ 628 13.2.3. Syntaxe de CREATE DATABASE ..................................................................... 632 13.2.4. Syntaxe de CREATE INDEX .......................................................................... 633 13.2.5. Syntaxe de CREATE TABLE .......................................................................... 634 13.2.6. Syntaxe de DROP DATABASE ........................................................................ 644 13.2.7. Syntaxe de DROP INDEX .............................................................................. 645 13.2.8. Syntaxe de DROP TABLE .............................................................................. 645 13.2.9. Syntaxe de RENAME TABLE .......................................................................... 645 13.3. Commandes de bases de l'utilisateur de MySQL ........................................................ 646 13.3.1. Syntaxe de DESCRIBE (obtenir des informations sur les colonnes) .................... 646 13.3.2. Syntaxe de USE ............................................................................................. 647 13.4. Commandes relatives aux verrous et aux transactions ................................................ 647 13.4.1. Syntaxes de START TRANSACTION, COMMIT et ROLLBACK ............................. 647 13.4.2. Commandes qui ne peuvent pas tre annules ............................................... 648 13.4.3. Commandes qui peuvent causer une validation implicite .................................. 648 13.4.4. Syntaxe de SAVEPOINT et ROLLBACK TO SAVEPOINT .................................. 648
ix
13.4.5. Syntaxe de LOCK TABLES/UNLOCK TABLES ................................................. 649 13.4.6. Syntaxe de SET TRANSACTION ..................................................................... 651 13.5. Rfrence de langage d'administration de la base de donnes .................................... 651 13.5.1. Commande de gestion des comptes utilisateurs .............................................. 651 13.5.2. Commandes d'entretien des tables ................................................................. 658 13.5.3. Syntaxe de SHOW ........................................................................................... 667 13.5.4. Autres commandes d'administration ................................................................ 680 13.6. Commandes de rplication ........................................................................................ 683 13.6.1. Requtes SQL pour contrler les matres de rplication ................................... 683 13.6.2. Commandes SQL de contrle des esclaves de rplication ................................ 685 13.7. Syntaxe SQL pour les commandes prpares ............................................................ 692 14. Moteurs de tables MySQL et types de table ......................................................................... 695 14.1. Le moteur de tables MyISAM .................................................................................... 697 14.1.1. Options de dmarrage MyISAM ...................................................................... 698 14.1.2. Espace ncessaire pour stocker les index ....................................................... 700 14.1.3. Formats de table MyISAM .............................................................................. 700 14.1.4. Problmes avec les tables MyISAM ................................................................ 702 14.2. Tables assembles MERGE ........................................................................................ 703 14.2.1. Problmes avec les tables MERGE .................................................................. 705 14.3. Le moteur de table MEMORY (HEAP) ........................................................................... 706 14.4. Tables BDB ou BerkeleyDB ..................................................................................... 708 14.4.1. Systmes d'exploitation supports par BDB ..................................................... 708 14.4.2. Installation de BDB ......................................................................................... 709 14.4.3. Options de dmarrage BDB ............................................................................ 709 14.4.4. Caractristiques des tables BDB ..................................................................... 710 14.4.5. Ce que nous devons corriger dans BDB dans un futur proche : ......................... 712 14.4.6. Restrictions avec les tables BDB ..................................................................... 712 14.4.7. Erreurs pouvant survenir lors de l'utilisation des tables BDB .............................. 712 14.5. Le moteur de table EXAMPLE .................................................................................... 713 14.6. Le moteur de table FEDERATED ................................................................................ 713 14.6.1. Installation du moteur de table FEDERATED ..................................................... 713 14.6.2. Description du moteur de stockage FEDERATED .............................................. 713 14.6.3. Comment utiliser les tables FEDERATED ......................................................... 714 14.6.4. Limitations du moteur de stockage FEDERATED ............................................... 715 14.7. Le moteur de table ARCHIVE .................................................................................... 716 14.8. Le moteur CSV ......................................................................................................... 716 14.9. Tables ISAM ............................................................................................................. 716 15. Le moteur de tables InnoDB ............................................................................................... 719 15.1. Prsentation des tables InnoDB ............................................................................... 720 15.2. Informations de contact InnoDB ................................................................................ 720 15.3. InnoDB avec MySQL version 3.23 ............................................................................ 720 15.4. Configuration InnoDB ............................................................................................... 721 15.5. Options de dmarrage InnoDB ................................................................................. 725 15.6. Crer des bases InnoDB .......................................................................................... 728 15.6.1. Si quelque chose se passe mal la cration de la base de donnes ................. 728 15.7. Crer des tables InnoDB .......................................................................................... 729 15.7.1. Comment utiliser les transactions de InnoDB avec diffrentes API ................... 729 15.7.2. Convertir des tables MyISAM vers InnoDB ...................................................... 730 15.7.3. Comment les colonnes AUTO_INCREMENT fonctionnent avec InnoDB .............. 731 15.7.4. Contraintes de cls trangres FOREIGN KEY ................................................ 731 15.7.5. InnoDB et la rplication MySQL ..................................................................... 734 15.7.6. Espaces de tables multiples : chaque table InnoDB a son fichier .ibd ............. 735 15.8. Ajouter et retirer des donnes et des logs InnoDB ..................................................... 737 15.9. Sauver et restaurer une base InnoDB ....................................................................... 738 15.9.1. Forcer la restauration ..................................................................................... 739 15.9.2. Points de contrle .......................................................................................... 740 15.10. Transfrer une base de donnes InnoDB vers une autre machine ............................ 740 15.11. Modle de transactions et verrouillage InnoDB ......................................................... 741
15.11.1. InnoDB et AUTOCOMMIT .............................................................................. 741 15.11.2. InnoDB et SET ... TRANSACTION ISOLATION LEVEL ... ..................... 741 15.11.3. Lecture cohrente non-bloquante .................................................................. 742 15.11.4. Verrous de lecture SELECT ... FOR UPDATE et SELECT ... LOCK IN SHARE MODE ............................................................................................................ 743 15.11.5. Verrou de cl suivante : viter le problme des lignes fantmes ...................... 743 15.11.6. Un exemple de lecture cohrente avec InnoDB ............................................ 744 15.11.7. Les verrous poss par diffrentes requtes SQL avec InnoDB ....................... 745 15.11.8. Quand est-ce que MySQL valide ou annule implicitement une transaction? ...... 746 15.11.9. Dtection des blocages et annulation ............................................................ 746 15.11.10. Comment grer les blocages de verrous? ................................................... 747 15.12. Conseils pour l'amlioration des performances InnoDB ............................................ 747 15.12.1. Le moniteur InnoDB .................................................................................... 749 15.13. Implmentation du multi-versionnage ....................................................................... 752 15.14. Structures de tables et d'index ................................................................................ 753 15.14.1. Structure physique d'un index ....................................................................... 754 15.14.2. Bufferisation des insertions ........................................................................... 754 15.14.3. Index hash adaptatifs ................................................................................... 754 15.14.4. Structure physique d'une ligne ...................................................................... 754 15.15. Gestion de l'espace fichiers et des entres/sorties disque ......................................... 755 15.15.1. Accs disques ............................................................................................. 755 15.15.2. Utiliser les raw devices pour l'espace de tables ............................................. 755 15.15.3. Gestion de l'espace fichier ........................................................................... 756 15.15.4. Dfragmentation des tables .......................................................................... 756 15.16. Gestion des erreurs InnoDB ................................................................................... 757 15.16.1. Codes d'erreurs InnoDB .............................................................................. 757 15.16.2. Codes d'erreur sytme ................................................................................. 758 15.17. Restrictions sur les tables InnoDB .......................................................................... 762 15.18. Rsolution de problmes avec InnoDB ................................................................... 764 15.18.1. Solutions pour le dictionnaire de donnes InnoDB ......................................... 764 16. Introduction MySQL Cluster .............................................................................................. 767 16.1. Prsentation de MySQL Cluster ................................................................................ 767 16.2. Concepts de base de MySQL Cluster ........................................................................ 768 16.3. Configuration simple multi-serveurs ........................................................................... 768 16.3.1. Matriel, logiciels et rseau ............................................................................ 770 16.3.2. Installation ..................................................................................................... 771 16.3.3. Configuration ................................................................................................. 772 16.3.4. Dmarrage initial ............................................................................................ 774 16.3.5. Charger les donnes d'exemple et excuter des requtes ................................ 775 16.3.6. Arrt et redmarrage du cluster ...................................................................... 778 16.4. Configuration de MySQL Cluster ............................................................................... 778 16.4.1. Compilation du cluster .................................................................................... 779 16.4.2. Installation du logiciel ..................................................................................... 779 16.4.3. Vrification rapide du fonctionnement du cluster .............................................. 779 16.4.4. Fichier de configuration .................................................................................. 781 16.5. Serveur de gestion du cluster MySQL ....................................................................... 801 16.5.1. Utilisation des processus serveurs MySQL par MySQL Cluster ..................... 801 16.5.2. ndbd, le processus de stockage du cluster ..................................................... 802 16.5.3. ndb_mgmd, le serveur de gestion ................................................................... 804 16.5.4. ndb_mgm, le client de gestion du cluster ......................................................... 804 16.5.5. Options des commandes pour le cluster MySQL .............................................. 804 16.6. Administration de MySQL Cluster .............................................................................. 807 16.6.1. Commandes du client de gestion du Cluster ................................................... 807 16.6.2. Rapport d'vnements gnrs par le cluster MySQL ...................................... 808 16.6.3. Utilisateur unique du cluster ........................................................................... 812 16.6.4. Sauvegarde en ligne de MySQL Cluster ......................................................... 813 16.7. Utilisation d'interconnexions haute vitesse avec MySQL Cluster .................................. 815 16.7.1. Configurer le cluster MySQL avec les sockets SCI ........................................... 815
xi
16.7.2. Mesures de vitesses pour comprendre les impacts sur le cluster ....................... 818 16.8. Cluster Limitations in MySQL 4.1 .............................................................................. 820 16.9. Cluster MySQL en 5.0 et 5.1 .................................................................................... 822 16.9.1. volutions de MySQL Cluster en MySQL 5.0 ............................................... 822 16.9.2. Plans de dveloppement de MySQL 5.1 pour le cluster MySQL ........................ 823 16.10. MySQL Cluster FAQ ............................................................................................... 823 16.11. MySQL Cluster Glossary ......................................................................................... 829 17. Introduction MaxDB .......................................................................................................... 833 17.1. Historique de MaxDB ................................................................................................ 833 17.2. Licence et support MaxDB ........................................................................................ 833 17.3. Liens traitant de MaxDB ............................................................................................ 833 17.4. Concepts de base de MaxDB .................................................................................... 833 17.5. Diffrences de fonctionnalits entre MaxDB et MySQL ............................................... 834 17.6. Interoprabilit entre MaxDB et MySQL ...................................................................... 834 17.7. Mots rservs de MaxDB .......................................................................................... 834 18. Donnes spatiales avec MySQL .......................................................................................... 839 18.1. Introduction GIS .................................................................................................... 840 18.2. Le modle gomtrique OpenGIS ............................................................................. 840 18.2.1. La hirarchie des classes gomtriques .......................................................... 840 18.2.2. Classe Geometry .......................................................................................... 841 18.2.3. Classe Point ................................................................................................ 842 18.2.4. Classe Curve ................................................................................................ 843 18.2.5. Classe LineString ...................................................................................... 843 18.2.6. Classe Surface ............................................................................................ 843 18.2.7. Classe Polygon ............................................................................................ 844 18.2.8. Classe GeometryCollection ...................................................................... 844 18.2.9. Classe MultiPoint ...................................................................................... 844 18.2.10. Classe MultiCurve .................................................................................... 845 18.2.11. Classe MultiLineString .......................................................................... 845 18.2.12. Classe MultiSurface ................................................................................ 845 18.2.13. Classe MultiPolygon ................................................................................ 845 18.3. Formats gomtriques supports .............................................................................. 846 18.3.1. Format Well-Known Text (WKT) ..................................................................... 846 18.3.2. Le format Well-Known Binary (WKB) .............................................................. 847 18.4. Crer une base de donnes avec les fonctionnalits gographiques ............................ 847 18.4.1. Types de donnes gographiques MySQL ...................................................... 847 18.4.2. Crer des objets gographiques ..................................................................... 848 18.4.3. Crer des colonnes gomtriques .................................................................. 851 18.4.4. Remplir des colonnes gomtriques ............................................................... 851 18.4.5. Lire des donnes gomtriques ...................................................................... 852 18.5. Analyser des donnes gographiques ....................................................................... 853 18.5.1. Fonctions pour convertir les formes de format ................................................. 853 18.5.2. Fonction d'analyse des proprits des formes Geometry ................................. 854 18.5.3. Fonctions qui gnrent des formes gomtriques partir d'autres formes .......... 860 18.5.4. Fonctions de tests des relations gomtriques entre les formes ........................ 860 18.5.5. Relations avec les Rectangles enveloppes (MBRs) .......................................... 860 18.5.6. Fonctions qui testent les relations gomtriques entre les formes ..................... 861 18.6. Optimiser l'analyse gographique .............................................................................. 863 18.6.1. Crer un index gomtrique ........................................................................... 863 18.6.2. Utiliser un index gomtrique ......................................................................... 864 18.7. MySQL compatibilit avec GIS .................................................................................. 865 18.7.1. Les fonctionnalits de GIS que nous n'avons pas encore implment ................ 865 19. Procdures stockes et fonctions ......................................................................................... 867 19.1. Procdures stockes et tables de droits .................................................................... 868 19.2. Syntaxe des procdures stockes ............................................................................. 868 19.2.1. CREATE PROCEDURE et CREATE FUNCTION .................................................. 868 19.2.2. ALTER PROCEDURE et ALTER FUNCTION ..................................................... 870 19.2.3. DROP PROCEDURE et DROP FUNCTION ......................................................... 870
xii
20.
21.
22.
23.
24.
19.2.4. SHOW CREATE PROCEDURE et SHOW CREATE FUNCTION .............................. 870 19.2.5. SHOW PROCEDURE STATUS et SHOW FUNCTION STATUS .............................. 871 19.2.6. CALL ............................................................................................................. 871 19.2.7. La commande compose BEGIN ... END .................................................... 871 19.2.8. La commande DECLARE ................................................................................ 871 19.2.9. Les variables dans les procdures stockes .................................................... 872 19.2.10. Conditions et gestionnaires ........................................................................... 872 19.2.11. Curseurs ...................................................................................................... 873 19.2.12. Instructions de contrle ................................................................................ 874 Dclencheurs ...................................................................................................................... 877 20.1. Syntaxe de CREATE TRIGGER ................................................................................. 877 20.2. Syntaxe de DROP TRIGGER ..................................................................................... 878 20.3. Utiliser les dclencheurs ........................................................................................... 878 Vues ................................................................................................................................... 881 21.1. Syntaxe ALTER VIEW .............................................................................................. 881 21.2. Syntaxe de CREATE VIEW ....................................................................................... 881 21.3. Syntaxe DROP VIEW ................................................................................................ 882 21.4. Syntaxe SHOW CREATE VIEW ................................................................................. 882 La base de donnes d'informations INFORMATION_SCHEMA ................................................. 883 22.1. Les tables INFORMATION_SCHEMA ........................................................................... 885 22.1.1. La table INFORMATION_SCHEMA SCHEMATA .................................................. 885 22.1.2. La table INFORMATION_SCHEMA TABLES ...................................................... 886 22.1.3. La table INFORMATION_SCHEMA COLUMNS .................................................... 887 22.1.4. La table INFORMATION_SCHEMA STATISTICS .............................................. 888 22.1.5. La table INFORMATION_SCHEMA USER_PRIVILEGES .................................... 889 22.1.6. La table INFORMATION_SCHEMA SCHEMA_PRIVILEGES ................................ 889 22.1.7. La table INFORMATION_SCHEMA TABLE_PRIVILEGES .................................. 890 22.1.8. La table INFORMATION_SCHEMA COLUMN_PRIVILEGES ................................ 890 22.1.9. La table INFORMATION_SCHEMA CHARACTER_SETS ...................................... 891 22.1.10. La table INFORMATION_SCHEMA COLLATIONS ............................................ 891 22.1.11. La table INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY ....................................................... 892 22.1.12. La table INFORMATION_SCHEMA TABLE_CONSTRAINTS .............................. 892 22.1.13. La table INFORMATION_SCHEMA KEY_COLUMN_USAGE ................................ 893 22.1.14. La table INFORMATION_SCHEMA ROUTINES ................................................ 893 22.1.15. La table INFORMATION_SCHEMA VIEWS ...................................................... 895 22.1.16. Autres tables INFORMATION_SCHEMA ........................................................... 895 22.2. Extensions la commande SHOW .............................................................................. 895 Mathmatiques de prcision ................................................................................................ 899 23.1. Types de valeurs numriques ................................................................................... 899 23.2. Changements de type de donnes avec DECIMAL ..................................................... 900 23.3. Gestion des expressions ........................................................................................... 901 23.4. Arrondissement de valeurs ........................................................................................ 903 23.5. Exemples de calculs de mathmatiques .................................................................... 904 API MySQL ......................................................................................................................... 909 24.1. Utilitaires de dveloppement des programmes MySQL ............................................... 909 24.1.1. msql2mysql, convertit des programmes mSQL vers MySQL ........................... 909 24.1.2. mysql_config lit les options de compilations du client MySQL ....................... 910 24.2. API MySQL C .......................................................................................................... 911 24.2.1. Types de donnes de l'API C ......................................................................... 911 24.2.2. Vue d'ensemble des fonctions de l'API C ........................................................ 914 24.2.3. Description des fonctions de l'API C ............................................................... 918 24.2.4. Fonctions C de commandes prpares ........................................................... 955 24.2.5. Types de donnes de l'API C ......................................................................... 955 24.2.6. Prsentation des fonctions de l'interface C ...................................................... 958 24.2.7. Description des fonctions C pour les requtes prpares ................................. 960 24.2.8. Problmes avec l'interface C des commandes prpares ................................. 980 24.2.9. Gestion des commandes multiples avec l'interface C ....................................... 980
xiii
24.2.10. Gestion des dates et horaires avec l'interface C ............................................ 980 24.2.11. Description des fonctions threades de C ..................................................... 981 24.2.12. Description des fonctions C du serveur embarqu ......................................... 982 24.2.13. Questions courantes sur la bibliothque C ..................................................... 984 24.2.14. Compiler les clients ...................................................................................... 985 24.2.15. Comment faire un client MySQL thread ....................................................... 986 24.2.16. libmysqld, la bibliothque du serveur embarqu MySQL ............................. 987 24.3. API PHP pour MySQL .............................................................................................. 991 24.3.1. Problmes frquents avec MySQL et PHP ...................................................... 991 24.4. API Perl pour MySQL ............................................................................................... 991 24.5. Interface MySQL C++ ............................................................................................... 992 24.5.1. Borland C++ .................................................................................................. 992 24.6. MySQL Python API .................................................................................................. 992 24.7. MySQL Tcl API ........................................................................................................ 992 24.8. Couche MySQL pour Eiffel ........................................................................................ 993 25. Pilotes MySQL .................................................................................................................... 995 25.1. Support ODBC de MySQL ........................................................................................ 995 25.1.1. Introduction to MyODBC ................................................................................ 995 25.1.2. General Information About ODBC and MyODBC ............................................. 998 25.1.3. Comment installer MyODBC ......................................................................... 1001 25.1.4. Installer MyODBC depuis une distribution binaire sur Windows ....................... 1002 25.1.5. Installing MyODBC from a Binary Distribution on Unix .................................... 1002 25.1.6. Installer MyODBC depuis la version source sur Windows ............................... 1003 25.1.7. Installing MyODBC from a Source Distribution on Unix ................................... 1004 25.1.8. Installer MyODBC depuis le serveur de versions BitKeeper ............................ 1009 25.1.9. MyODBC Configuration ................................................................................ 1010 25.1.10. Problmes avec les connexions MyODBC ................................................... 1027 25.1.11. MyODBC et Microsoft Access ..................................................................... 1027 25.1.12. MyODBC et Microsoft VBA et ASP ............................................................. 1032 25.1.13. MyODBC et les outils tierce partie .............................................................. 1033 25.1.14. Fonctionnalits gnrales de MyODBC ....................................................... 1034 25.1.15. Instructions de base pour utiliser MyODBC .................................................. 1038 25.1.16. Table de rfrence MyODBC ...................................................................... 1040 25.1.17. MyODBC Data Types ................................................................................. 1044 25.1.18. Codes d'erreurs MyODBC .......................................................................... 1045 25.1.19. MyODBC avec VB : ADO, DAO and RDO ................................................... 1046 25.1.20. MyODBC avec Microsoft .NET .................................................................... 1050 25.1.21. Crdits ....................................................................................................... 1053 25.2. MySQL et Java (JDBC) .......................................................................................... 1053 26. Gestion des erreurs avec MySQL ...................................................................................... 1055 27. Etendre MySQL ................................................................................................................. 1091 27.1. Rouages de MySQL ............................................................................................... 1091 27.1.1. Threads MySQL ........................................................................................... 1091 27.1.2. Suite de test de MySQL ............................................................................... 1092 27.2. Ajouter des fonctions MySQL ............................................................................... 1094 27.2.1. Fonctionnalits des fonctions utilisateur ......................................................... 1094 27.2.2. Syntaxe de CREATE FUNCTION/DROP FUNCTION ....................................... 1095 27.2.3. Ajouter une nouvelle fonction dfinie par l'utilisateur (UDF) .............................. 1095 27.2.4. Ajouter de nouvelles fonctions natives ........................................................... 1102 27.3. Ajouter une nouvelle procdure MySQL ................................................................ 1104 27.3.1. La procdure Analyse .................................................................................. 1104 27.3.2. Ecrire une procdure .................................................................................... 1104 A. Problmes et erreurs communes ......................................................................................... 1105 A.1. Comment dterminer ce qui pose problme .............................................................. 1106 A.2. Erreurs communes rencontres avec MySQL ............................................................ 1107 A.2.1. Erreur Access denied ................................................................................ 1107 A.2.2. Erreur Can't connect to [local] MySQL server ................................ 1107 A.2.3. Erreur Client does not support authentication protocol ............ 1108
xiv
A.2.4. Echec de saisie du mot de passe avec le client interactif ................................. 1109 A.2.5. Erreur Host '...' is blocked ............................................................... 1109 A.2.6. Erreur Too many connections ................................................................. 1110 A.2.7. Erreur Out of memory ............................................................................... 1110 A.2.8. Erreur MySQL server has gone away ..................................................... 1110 A.2.9. Erreur Packet too large ......................................................................... 1111 A.2.10. Erreurs de communication / Connexion annule ............................................ 1112 A.2.11. Erreur The table is full ..................................................................... 1113 A.2.12. Erreur Can't create/write to file ................................................... 1114 A.2.13. Erreur du client Commands out of sync .................................................. 1114 A.2.14. Erreur Ignoring user .............................................................................. 1114 A.2.15. Erreur Table 'xxx' doesn't exist ..................................................... 1115 A.2.16. Erreur Can't initialize character set xxx .................................... 1115 A.2.17. Fichier non trouv ........................................................................................ 1116 A.3. Notes relatives l'installation .................................................................................... 1116 A.3.1. Problmes lors de la liaison avec la bibliothque du client MySQL .................... 1116 A.3.2. Comment excuter MySQL comme un utilisateur normal ................................. 1117 A.3.3. Problmes avec les permissions sur fichiers ................................................... 1118 A.4. Notes relatives l'administration ............................................................................... 1119 A.4.1. Comment rinitialiser un mot de passe Root oubli ......................................... 1119 A.4.2. Que faire si MySQL plante constamment ? ..................................................... 1120 A.4.3. Comment MySQL gre un disque plein .......................................................... 1122 A.4.4. O MySQL stocke les fichiers temporaires ? ................................................... 1123 A.4.5. Comment protger ou changer le fichier socket /tmp/mysql.sock ................ 1124 A.4.6. Problmes de fuseaux horaires ...................................................................... 1124 A.5. Problmes relatifs aux requtes ................................................................................ 1124 A.5.1. Sensibilit la casse dans les recherches ...................................................... 1124 A.5.2. Problmes avec l'utilisation des colonnes DATE .............................................. 1125 A.5.3. Problmes avec les valeurs NULL .................................................................. 1126 A.5.4. Problmes avec les alias ............................................................................ 1127 A.5.5. Erreur Some non-transactional changed tables couldn't be rolled back ........................................................................................................ 1127 A.5.6. Effacer des lignes de tables relies ................................................................ 1128 A.5.7. Rsoudre les problmes des lignes non retournes ......................................... 1128 A.5.8. Problmes de comparaisons avec nombres virgule flottante .......................... 1129 A.6. Problmes lis l'optimiseur .................................................................................... 1130 A.7. Questions relatives aux dfinitions de tables .............................................................. 1131 A.7.1. Problmes avec ALTER TABLE. .................................................................... 1131 A.7.2. Comment changer l'ordre des colonnes dans une table ................................... 1131 A.7.3. Problmes avec les tables temporaires ........................................................... 1132 B. Crdits ................................................................................................................................ 1133 B.1. Dveloppeurs chez MySQL AB ................................................................................. 1133 B.2. Contributeurs MySQL ............................................................................................ 1137 B.3. Documenteurs et traducteurs .................................................................................... 1141 B.4. Bibliothques utilises et incluses dans MySQL ......................................................... 1142 B.5. Applications qui supportent MySQL ........................................................................... 1143 B.6. Outils utiliss pour crer MySQL ............................................................................... 1144 B.7. Supporters de MySQL .............................................................................................. 1144 B.8. Les volutions de MySQL (la liste des tches) ........................................................... 1145 B.8.1. Nouvelles fonctionnalits prvues pour la version 5.0 ...................................... 1145 B.8.2. Nouvelles fonctionnalits prvues pour 5.1 ..................................................... 1146 B.8.3. Ce qui doit tre fait dans un futur proche ........................................................ 1146 B.8.4. Ce qui est prvu moyen terme .................................................................... 1149 B.8.5. Ce qui n'est pas prvu .................................................................................. 1150 C. Historique des changements MySQL ................................................................................... 1151 C.1. Changements de la version 5.0.0 (Dveloppement) ................................................... 1156 C.1.1. Changements de la version 5.0.6 (pas encore publie) .................................... 1156 C.1.2. Changements de la version 5.0.5 (Bientt publie) .......................................... 1156
xv
C.1.3. Changements de la version 5.0.4 (16 avril 2005) ............................................ C.1.4. Changements de la version 5.0.3 (23 mars 2005 : Beta) .................................. C.1.5. Changements de la version 5.0.2 (1er Dcembre 2004) .................................. C.1.6. Changements de la version 5.0.1 (pas encore publie) .................................... C.1.7. Changements de la version 5.0.0 (22 dcembre 2003 : Alpha) ......................... C.2. Changements de la version 4.1.x (Alpha) .................................................................. C.2.1. Changements de la version 4.1.12 (Pas encore publie) ................................. C.2.2. Changements de la version 4.1.11 (1 avril 2005) ............................................ C.2.3. Changements de la version 4.1.10 (12 fvrier 2005) ........................................ C.2.4. Changements de la version 4.1.9 (11 Janvier 2005) ........................................ C.2.5. Changements de la version 4.1.8 (14 Dcembre 2004) ................................... C.2.6. Changements de la version 4.1.7 (bientt publie) .......................................... C.2.7. Changements de la version 4.1.6 (10 Octobre 2004) ....................................... C.2.8. Changements de la version 4.1.4 (16 Septembre 2004) ................................... C.2.9. Changements de la version 4.1.4 (26 Aot 2004) ............................................ C.2.10. Changements de la version 4.1.3 (pas encore publie) .................................. C.2.11. Changements de la version 4.1.2 ................................................................. C.2.12. Changements de la version 4.1.1 (01 dcembre 2003) .................................. C.2.13. Changements de la version 4.1.0 (03 Avril 2003 : alpha) ................................ C.3. Changements de la version 4.0.x (Production) ........................................................... C.3.1. Changements de la version 4.0.25 (pas encore publi) .................................... C.3.2. Changements de la version 4.0.24 (04 Mars 2005) ......................................... C.3.3. Changements de la version 4.0.23 (18 Dcembre 2004) .................................. C.3.4. Changements de la version 4.0.22 (27 Octobre 2004) ..................................... C.3.5. Changements de la version 4.0.21 ................................................................. C.3.6. Changements de la version 4.0.20 ................................................................. C.3.7. Changements de la version 4.0.19 (04 mai 2004) ........................................... C.3.8. Changements de la version 4.0.18 (pas encore publie) .................................. C.3.9. Changements de la version 4.0.17 (14 dcembre 2003) .................................. C.3.10. Changements de la version 4.0.16 (17 octobre 2003) .................................... C.3.11. Changements de la version 4.0.15 (03 septembre 2003) ................................ C.3.12. Changements de la version 4.0.14 (18 juillet 2003) ....................................... C.3.13. Changements de la version 4.0.13 (16 Mai 2003) .......................................... C.3.14. Changements de la version 4.0.12 (15 Mars 2003 : Production) ..................... C.3.15. Changements de la version 4.0.11 (20 Fvrier 2003) ..................................... C.3.16. Changements de la version 4.0.10 (29 janvier 2003) ..................................... C.3.17. Changements de la version 4.0.9 (09 janvier 2003) ....................................... C.3.18. Changements de la version 4.0.8 (07 janvier 2003) ....................................... C.3.19. Changements de la version 4.0.7 (20 Dcembre 2002) .................................. C.3.20. Changements de la version 4.0.6 (14 Dcembre 2002 : Gamma) ................... C.3.21. Changements de la version 4.0.5 (13 novembre 2002) .................................. C.3.22. Changements de la version 4.0.4 (29 septembre 2002) ................................. C.3.23. Changements de la version 4.0.3 (26 Aot 2002 : Beta) ................................ C.3.24. Changements de la version 4.0.2 (01 Juillet 2002) ........................................ C.3.25. Changements de la version 4.0.1 (23 dcembre 2001) .................................. C.3.26. Changements de la version 4.0.0 (Octobre 2001 : alpha) ............................... C.4. Changements de la version 3.23.x (Recent; still supported) ........................................ C.4.1. Changements de la version 3.23.59 (not released yet) .................................... C.4.2. Changements de la version 3.23.58 (11 septembre 2003) ................................ C.4.3. Changements de la version 3.23.57 (06 juin 2003) .......................................... C.4.4. Changements de la version 3.23.56 (13 mars 2003) ........................................ C.4.5. Changements de la version 3.23.55 (23 janvier 2003) ..................................... C.4.6. Changements de la version 3.23.54 (05 dcembre 2002) ................................ C.4.7. Changements de la version 3.23.53 (09 octobre 2002) .................................... C.4.8. Changements de la version 3.23.52 (14 aot 2002) ......................................... C.4.9. Changements de la version 3.23.51 (31 mai 2002) .......................................... C.4.10. Changements de la version 3.23.50 (21 avril 2002) ....................................... C.4.11. Changements de la version 3.23.49 .............................................................
1158 1161 1170 1171 1173 1174 1174 1176 1182 1186 1188 1188 1189 1190 1191 1193 1193 1201 1205 1208 1208 1209 1211 1213 1214 1214 1214 1218 1220 1222 1224 1228 1231 1235 1236 1237 1238 1239 1239 1240 1241 1243 1245 1246 1250 1251 1253 1253 1254 1254 1255 1256 1257 1258 1258 1259 1260 1261
xvi
C.4.12. Changements de la version 3.23.48 (07 fvrier 2002) .................................... C.4.13. Changements de la version 3.23.47 (27 dcembre 2001) ............................... C.4.14. Changements de la version 3.23.46 (29 novembre 2001) ............................... C.4.15. Changements de la version 3.23.45 (22 novembre 2001) ............................... C.4.16. Changements de la version 3.23.44 (31 octobre 2001) .................................. C.4.17. Changements de la version 3.23.43 (04 octobre 2001) .................................. C.4.18. Changements de la version 3.23.42 (08 septembre 2001) .............................. C.4.19. Changements de la version 3.23.41 (11 aot 2001) ....................................... C.4.20. Changements de la version 3.23.40 ............................................................. C.4.21. Changements de la version 3.23.39 (12 juin 2001) ........................................ C.4.22. Changements de la version 3.23.38 (09 mai 2001) ........................................ C.4.23. Changements de la version 3.23.37 (17 avril 2001) ....................................... C.4.24. Changements de la version 3.23.36 (27 mars 2001) ...................................... C.4.25. Changements de la version 3.23.35 (15 mars 2001) ...................................... C.4.26. Changements de la version 3.23.34a ........................................................... C.4.27. Changements de la version 3.23.34 (10 mars 2001) ...................................... C.4.28. Changements de la version 3.23.33 (09 fvrier 2001) .................................... C.4.29. Changements de la version 3.23.32 (22 Jan 2001: Production) ...................... C.4.30. Changements de la version 3.23.31 (17 janvier 2001) ................................... C.4.31. Changements de la version 3.23.30 (04 janvier 2001) ................................... C.4.32. Changements de la version 3.23.29 (16 dcembre 2000) ............................... C.4.33. Changements de la version 3.23.28 (22 Nov 2000: Gamma) .......................... C.4.34. Changements de la version 3.23.27 (24 octobre 2000) .................................. C.4.35. Changements de la version 3.23.26 (18 octobre 2000) .................................. C.4.36. Changements de la version 3.23.25 (29 septembre 2000) .............................. C.4.37. Changements de la version 3.23.24 (08 septembre 2000) .............................. C.4.38. Changements de la version 3.23.23 (01 septembre 2000) .............................. C.4.39. Changements de la version 3.23.22 (31 juillet 2000) ...................................... C.4.40. Changements de la version 3.23.21 ............................................................. C.4.41. Changements de la version 3.23.20 ............................................................. C.4.42. Changements de la version 3.23.19 ............................................................. C.4.43. Changements de la version 3.23.18 ............................................................. C.4.44. Changements de la version 3.23.17 ............................................................. C.4.45. Changements de la version 3.23.16 ............................................................. C.4.46. Changements de la version 3.23.15 (May 2000: Beta) ................................... C.4.47. Changements de la version 3.23.14 ............................................................. C.4.48. Changements de la version 3.23.13 ............................................................. C.4.49. Changements de la version 3.23.12 (07 mars 2000) ...................................... C.4.50. Changements de la version 3.23.11 ............................................................. C.4.51. Changements de la version 3.23.10 ............................................................. C.4.52. Changements de la version 3.23.9 ............................................................... C.4.53. Changements de la version 3.23.8 (02 janvier 2000) ..................................... C.4.54. Changements de la version 3.23.7 (10 dcembre 1999) ................................ C.4.55. Changements de la version 3.23.6 ............................................................... C.4.56. Changements de la version 3.23.5 (20 octobre 1999) .................................... C.4.57. Changements de la version 3.23.4 (28 septembre 1999) ................................ C.4.58. Changements de la version 3.23.3 ............................................................... C.4.59. Changements de la version 3.23.2 (09 aot 1999) ......................................... C.4.60. Changements de la version 3.23.1 ............................................................... C.4.61. Changements de la version 3.23.0 (05 Aug 1999: Alpha) ............................... C.5. Changements de la version 3.22.x (Old; discontinued) ............................................... C.5.1. Changements de la version 3.22.35 ............................................................... C.5.2. Changements de la version 3.22.34 ............................................................... C.5.3. Changements de la version 3.22.33 ............................................................... C.5.4. Changements de la version 3.22.32 (14 fvrier 2000) ...................................... C.5.5. Changements de la version 3.22.31 ............................................................... C.5.6. Changements de la version 3.22.30 ............................................................... C.5.7. Changements de la version 3.22.29 (02 janvier 2000) .....................................
1261 1262 1262 1262 1263 1264 1264 1265 1266 1266 1267 1268 1268 1269 1269 1269 1270 1271 1272 1273 1273 1275 1277 1277 1278 1279 1279 1281 1281 1282 1282 1282 1282 1283 1284 1285 1285 1286 1286 1287 1287 1288 1288 1289 1290 1291 1291 1292 1292 1293 1295 1295 1295 1295 1295 1295 1295 1296
xvii
C.5.8. Changements de la version 3.22.28 (20 octobre 1999) .................................... C.5.9. Changements de la version 3.22.27 ............................................................... C.5.10. Changements de la version 3.22.26 (16 septembre 1999) .............................. C.5.11. Changements de la version 3.22.25 ............................................................. C.5.12. Changements de la version 3.22.24 (05 juillet 1999) ...................................... C.5.13. Changements de la version 3.22.23 (08 juin 1999) ........................................ C.5.14. Changements de la version 3.22.22 (30 avril 1999) ....................................... C.5.15. Changements de la version 3.22.21 ............................................................. C.5.16. Changements de la version 3.22.20 (18 mars 1999) ...................................... C.5.17. Changements de la version 3.22.19 (Mar 1999: Production) ........................... C.5.18. Changements de la version 3.22.18 ............................................................. C.5.19. Changements de la version 3.22.17 ............................................................. C.5.20. Changements de la version 3.22.16 (Feb 1999: Gamma) ............................... C.5.21. Changements de la version 3.22.15 ............................................................. C.5.22. Changements de la version 3.22.14 ............................................................. C.5.23. Changements de la version 3.22.13 ............................................................. C.5.24. Changements de la version 3.22.12 ............................................................. C.5.25. Changements de la version 3.22.11 ............................................................. C.5.26. Changements de la version 3.22.10 ............................................................. C.5.27. Changements de la version 3.22.9 ............................................................... C.5.28. Changements de la version 3.22.8 ............................................................... C.5.29. Changements de la version 3.22.7 (Sep 1998: Beta) ..................................... C.5.30. Changements de la version 3.22.6 ............................................................... C.5.31. Changements de la version 3.22.5 ............................................................... C.5.32. Changements de la version 3.22.4 ............................................................... C.5.33. Changements de la version 3.22.3 ............................................................... C.5.34. Changements de la version 3.22.2 ............................................................... C.5.35. Changements de la version 3.22.1 (Jun 1998: Alpha) .................................... C.5.36. Changements de la version 3.22.0 ............................................................... C.6. Changements de la version 3.21.x ............................................................................ C.6.1. Changements de la version 3.21.33 ............................................................... C.6.2. Changements de la version 3.21.32 ............................................................... C.6.3. Changements de la version 3.21.31 ............................................................... C.6.4. Changements de la version 3.21.30 ............................................................... C.6.5. Changements de la version 3.21.29 ............................................................... C.6.6. Changements de la version 3.21.28 ............................................................... C.6.7. Changements de la version 3.21.27 ............................................................... C.6.8. Changements de la version 3.21.26 ............................................................... C.6.9. Changements de la version 3.21.25 ............................................................... C.6.10. Changements de la version 3.21.24 ............................................................. C.6.11. Changements de la version 3.21.23 ............................................................. C.6.12. Changements de la version 3.21.22 ............................................................. C.6.13. Changements de la version 3.21.21a ........................................................... C.6.14. Changements de la version 3.21.21 ............................................................. C.6.15. Changements de la version 3.21.20 ............................................................. C.6.16. Changements de la version 3.21.19 ............................................................. C.6.17. Changements de la version 3.21.18 ............................................................. C.6.18. Changements de la version 3.21.17 ............................................................. C.6.19. Changements de la version 3.21.16 ............................................................. C.6.20. Changements de la version 3.21.15 ............................................................. C.6.21. Changements de la version 3.21.14b ........................................................... C.6.22. Changements de la version 3.21.14a ........................................................... C.6.23. Changements de la version 3.21.13 ............................................................. C.6.24. Changements de la version 3.21.12 ............................................................. C.6.25. Changements de la version 3.21.11 ............................................................. C.6.26. Changements de la version 3.21.10 ............................................................. C.6.27. Changements de la version 3.21.9 ............................................................... C.6.28. Changements de la version 3.21.8 ...............................................................
1296 1296 1296 1297 1297 1297 1297 1297 1298 1298 1298 1298 1298 1299 1299 1299 1299 1300 1300 1301 1302 1302 1303 1303 1304 1305 1305 1305 1306 1307 1307 1308 1308 1308 1309 1309 1309 1309 1310 1310 1310 1311 1311 1311 1312 1312 1312 1312 1313 1313 1314 1314 1314 1315 1316 1316 1316 1316
xviii
C.6.29. Changements de la version 3.21.7 ............................................................... C.6.30. Changements de la version 3.21.6 ............................................................... C.6.31. Changements de la version 3.21.5 ............................................................... C.6.32. Changements de la version 3.21.4 ............................................................... C.6.33. Changements de la version 3.21.3 ............................................................... C.6.34. Changements de la version 3.21.2 ............................................................... C.6.35. Changements de la version 3.21.0 ............................................................... C.7. Changements de la version 3.20.x ............................................................................ C.7.1. Changements de la version 3.20.18 ............................................................... C.7.2. Changements de la version 3.20.17 ............................................................... C.7.3. Changements de la version 3.20.16 ............................................................... C.7.4. Changements de la version 3.20.15 ............................................................... C.7.5. Changements de la version 3.20.14 ............................................................... C.7.6. Changements de la version 3.20.13 ............................................................... C.7.7. Changements de la version 3.20.11 ............................................................... C.7.8. Changements de la version 3.20.10 ............................................................... C.7.9. Changements de la version 3.20.9 ................................................................. C.7.10. Changements de la version 3.20.8 ............................................................... C.7.11. Changements de la version 3.20.7 ............................................................... C.7.12. Changements de la version 3.20.6 ............................................................... C.7.13. Changements de la version 3.20.3 ............................................................... C.7.14. Changements de la version 3.20.0 ............................................................... C.8. Changements de la version 3.19.x ............................................................................ C.8.1. Changements de la version 3.19.5 ................................................................. C.8.2. Changements de la version 3.19.4 ................................................................. C.8.3. Changements de la version 3.19.3 ................................................................. C.9. Evolutions de InnoDB ............................................................................................... C.9.1. MySQL/InnoDB-4.0.21, pas publie ................................................................ C.9.2. MySQL/InnoDB-4.1.4, 31 Aot 2004 ............................................................... C.9.3. MySQL/InnoDB-4.1.3, 28 Juin 2004 ............................................................... C.9.4. MySQL/InnoDB-4.1.2, pas publie .................................................................. C.9.5. MySQL/InnoDB-4.0.20, 18 mai 2004 .............................................................. C.9.6. MySQL/InnoDB-4.0.19, 4 mai 2004 ................................................................ C.9.7. MySQL/InnoDB-4.0.18, 13 fvrier 2004 .......................................................... C.9.8. MySQL/InnoDB-5.0.0, 24 dcembre 2003 ....................................................... C.9.9. MySQL/InnoDB-4.0.17, 17 dcembre 2003 ..................................................... C.9.10. MySQL/InnoDB-4.1.1, 4 dcembre 2003 ....................................................... C.9.11. MySQL/InnoDB-4.0.16, 22 octobre 2003 ....................................................... C.9.12. MySQL/InnoDB-3.23.58, 15 septembre 2003 ................................................ C.9.13. MySQL/InnoDB-4.0.15, 10 septembre 2003 .................................................. C.9.14. MySQL/InnoDB-4.0.14, 22 juillet 2003 .......................................................... C.9.15. MySQL/InnoDB-3.23.57, 20 juin 2003 ........................................................... C.9.16. MySQL/InnoDB-4.0.13, 20 mai 2003 ............................................................ C.9.17. MySQL/InnoDB-4.1.0, 3 avril 2003 ............................................................... C.9.18. MySQL/InnoDB-3.23.56, 17 mars 2003 ......................................................... C.9.19. MySQL/InnoDB-4.0.12, 18 mars 2003 .......................................................... C.9.20. MySQL/InnoDB-4.0.11, 25 fvrier 2003 ......................................................... C.9.21. MySQL/InnoDB-4.0.10, 4 fvrier 2003 .......................................................... C.9.22. MySQL/InnoDB-3.23.55, 24 janvier 2003 ...................................................... C.9.23. MySQL/InnoDB-4.0.9, 14 janvier 2003 .......................................................... C.9.24. MySQL/InnoDB-4.0.8, 7 janvier 2003 ............................................................ C.9.25. MySQL/InnoDB-4.0.7, 26 dcembre 2002 ..................................................... C.9.26. MySQL/InnoDB-4.0.6, 19 dcembre 2002 ..................................................... C.9.27. MySQL/InnoDB-3.23.54, 12 d#cembre 2003 ................................................. C.9.28. MySQL/InnoDB-4.0.5, 18 novembre 2002 ..................................................... C.9.29. MySQL/InnoDB-3.23.53, 9 octobre 2002 ....................................................... C.9.30. MySQL/InnoDB-4.0.4, 2 octobre 2002 .......................................................... C.9.31. MySQL/InnoDB-4.0.3, 28 aot 2002 .............................................................
1317 1317 1317 1318 1318 1319 1319 1320 1320 1321 1322 1322 1322 1323 1323 1324 1324 1324 1324 1325 1326 1326 1327 1327 1327 1328 1328 1328 1328 1329 1330 1330 1331 1331 1332 1332 1333 1333 1333 1333 1334 1335 1335 1336 1336 1336 1337 1337 1337 1338 1338 1338 1338 1339 1339 1340 1340 1341
xix
C.9.32. MySQL/InnoDB-3.23.52, 16 aot 2002 ......................................................... 1341 C.9.33. MySQL/InnoDB-4.0.2, 10 juillet 2002 ............................................................ 1343 C.9.34. MySQL/InnoDB-3.23.51, 12 juin 2002 ........................................................... 1343 C.9.35. MySQL/InnoDB-3.23.50, 23 avril 2002 .......................................................... 1343 C.9.36. MySQL/InnoDB-3.23.49, 17 fvrier 2002 ....................................................... 1344 C.9.37. MySQL/InnoDB-3.23.48, 9 fvrier 2002 ......................................................... 1344 C.9.38. MySQL/InnoDB-3.23.47, 28 dcembre 2001 ................................................. 1345 C.9.39. MySQL/InnoDB-4.0.1, 3 dcembre 2001 ....................................................... 1345 C.9.40. MySQL/InnoDB-3.23.46, 30 novembre 2001 ................................................. 1345 C.9.41. MySQL/InnoDB-3.23.45, 23 novembre 2001 ................................................. 1345 C.9.42. MySQL/InnoDB-3.23.44, 2 novembre 2001 ................................................... 1346 C.9.43. MySQL/InnoDB-3.23.43, 4 octobre 2001 ....................................................... 1347 C.9.44. MySQL/InnoDB-3.23.42, 9 septembre 2001 .................................................. 1347 C.9.45. MySQL/InnoDB-3.23.41, 13 aot 2001 ......................................................... 1347 C.9.46. MySQL/InnoDB-3.23.40, 16 juillet 2001 ........................................................ 1347 C.9.47. MySQL/InnoDB-3.23.39, 13 juin 2001 ........................................................... 1347 C.9.48. MySQL/InnoDB-3.23.38, 12 mai 2001 ........................................................... 1347 C.10. Historique de MySQL Cluster .............................................................................. 1347 C.10.1. MySQL Cluster-4.1.11 (01 Apr 2005) ............................................................ 1347 C.10.2. MySQL Cluster-4.1.10 (12 Feb 2005) ........................................................... 1348 C.10.3. MySQL Cluster-4.1.9 (13 Jan 2005) ............................................................. 1348 C.10.4. MySQL Cluster-4.1.8 (14 Dec 2004) ............................................................. 1349 C.10.5. MySQL Cluster-4.1.7, (23 Octobre 2004) ...................................................... 1351 C.10.6. MySQL Cluster-4.1.6, 10 octobre 2004 ......................................................... 1351 C.10.7. MySQL Cluster-4.1.5, 16 septembre 2004 .................................................... 1352 C.10.8. MySQL Cluster-4.1.4, 31 aot 2004 ............................................................. 1353 C.10.9. MySQL Cluster-5.0.1, 27 juillet 2004 ............................................................ 1353 C.10.10. MySQL Cluster-4.1.3, 28 juin 2004 ............................................................. 1354 C.11. Historique de MyODBC ............................................................................................ 1354 C.11.1. Changes in MyODBC 3.51.12 ...................................................................... 1354 C.11.2. Changes in MyODBC 3.51.11 ...................................................................... 1354 D. Port vers d'autres systmes ................................................................................................ 1355 D.1. Dboguer un serveur MySQL ................................................................................... 1356 D.1.1. Compiler MYSQL pour le dbogage ............................................................... 1356 D.1.2. Crer un fichier de traage ............................................................................. 1357 D.1.3. Dboguer mysqld sous gdb ......................................................................... 1358 D.1.4. Utilisation d'un traage de pile mmoire .......................................................... 1359 D.1.5. Utilisation des fichiers de log pour trouver d'o viennent les erreurs de mysqld . 1360 D.1.6. Faire une batterie de tests lorsque vous faites face un problme de table corrompue ............................................................................................................... 1360 D.2. Dbogage un client MySQL ...................................................................................... 1361 D.3. Le paquet DBUG ..................................................................................................... 1361 D.4. Commentaires propos des threads RTS ................................................................. 1363 D.5. Diffrences entre les diffrents paquets de threads .................................................... 1364 E. Variables d'environnement ................................................................................................... 1367 F. Expressions rgulires MySQL ............................................................................................ 1369 G. Licence Publique Gnrale GNU ......................................................................................... 1373 H. Exception de licence MySQL FLOSS ................................................................................... 1379 Index ....................................................................................................................................... 1381
xx
Preface
Ceci est le manuel de rfrence du systme de base de donnes MySQL. Cette version fait rfrence la version 5.0.6-beta du serveur MySQL mais elle est aussi valable pour toute version plus ancienne, l o c'est indiqu.
xxi
xxii
A propos du manuel
Pour des informations sur la mise jour vers la version 3.22, voyez Section 2.6.4, Passer de la version 3.22 la version 3.23 . Pour une introduction au serveur de base de donnes MySQL, voyez Chapitre 3, Tutoriels d'introduction. Pour des exemples de SQL et des tests de performances, voyez le dossier de tests (sql-bench de la distribution. Pour connatre l'historique des fonctionnalits et bogues, voyez Annexe C, Historique des changements MySQL. Pour une liste des bogues connus et des limitations, voyez Section 1.5.7, Erreurs connues, et limitations de MySQL . Pour les plans de dveloppement, voyez Section B.8, Les volutions de MySQL (la liste des tches) . Pour une liste de tous les contributeurs ce projet, voyez Annexe B, Crdits. Important : Les rapports d'erreurs (aussi appels bogues), ainsi que les questions et commentaires, doivent tre envoys la liste de diffusion gnrale. See Section 1.4.1.1, Les listes de diffusion de MySQL . See Section 1.4.1.3, Comment rapporter un bogue ou un problme . Le script mysqlbug doit tre utilis pour gnrer le rapport de bogues. (Les distributions Windows contiennent un fichier mysqlbug.txt dans le dossier racine qui peut tre utilis comme formulaire pour un rapport de bug). Pour les distributions sources, le script mysqlbug est accessible dans le dossier scripts. Pour les distributions binaires, mysqlbug est install dans le dossier bin (/usr/bin pour le paquet RPM du serveur MySQL). Si vous avez trouv un problme de scurit critique dans le code du serveur MySQL, vous devez envoyez un email <security@mysql.com>.
La traduction de ce manuel a t faite sous la direction de Damien Sguy. Mehdi Achour, Patrick Haond, David Manusset, Sylvain Maugiron, Guillaume Plessis et Yannick Torres ont contribu largement cette traduction. Le copyright (2002-2006) de ce manuel est la proprit de la socit sudoise MySQL AB.
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 installe dans le dossier /usr/local/.'' c La police largeur fixe avec des guillemets d'encadrement est aussi utilise pour indiquer des squences de caractres. Par exemple : ``Pour spcifier un caractre joker, utilisez le caractre %.'' italique Les polices en italique sont utilises pour attirer l'attention, comme ceci. gras Le gras est utilis pour les enttes de tables, et aussi pour attirer fortement votre attention. Lorsque les commandes qui sont affiches sont destines tre excutes par un programme particulier, le nom du programme est indiqu dans l'invite de la commande. Par exemple, shell> indique une commande que vous excutez depuis votre console Shell, et mysql> indique une commande que vous excutez depuis le client mysql :
shell> tapez une commande shell ici mysql> tapez une requte SQL ici
Le ``Shell'' est votre interprteur de ligne de commande. Sous Unix, c'est typiquement un programme comme sh ou csh. Sous Windows, le programme quivalent est command.com ou cmd.exe, typiquement utilise en console. Lorsque vous saisissez une commande dans un exemple, omettez simplement de saisir l'invite de commande affiche. Souvent, les noms de bases de donnes, tables ou colonnes doivent tre remplacs dans les commandes. Pour indiquer qu'une telle substitution est ncessaire, ce manuel utilise les noms de nom_de_base, nom_de_table et nom_colonne. Par exemple, vous pourriez avoir une requte comme ceci :
mysql> SELECT nom_colonne FROM nom_de_base.nom_de_table;
Cela signifie que si vous devez saisir une requte semblable, vous devriez utiliser votre propre nom de colonne, table et base de donnes, ce qui pourrait se traduire par ceci :
Les mot rservs SQL ne sont pas sensibles la casse, et peuvent tre crits en majuscules ou minuscules. Ce manuel utilise les majuscules. Dans les illustrations de syntaxe, les crochets ([ et ]) sont utiliss pour indiquer des clauses ou mots optionnels. Par exemple, dans la requte suivante, IF EXISTS est optionnel :
DROP TABLE [IF EXISTS] nom_de_table
Lorsqu'un lment de syntaxe est constitu d'un certain nombre d'alternatives, les alternatives sont spares par des barres verticales (|). Lorsqu'un membre d'un tel jeu de possibilits peut tre choisi, les alternatives sont listes entre crochets ([ et ]) :
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
Lorsqu'un lment d'un jeu de possibilits doit tre choisi, les alternatives sont places entre accolades ({ et }) :
{DESCRIBE | DESC} nom_de_table {nom_colonne | wild}
Des crochets peuvent aussi indiquer que l'lment syntaxique prcdent peut tre rpt. Dans l'exemple suivant, plusieurs valeurs reset_option peuvent tre donns, spares par des virgules :
RESET reset_option [,reset_option] ...
Les commandes d'assignation des variables de Shell sont prsentes avec la syntaxe Bourne Shell. Par exemple, la syntaxe suivante modifie une variable d'environnement :
shell> VARNAME=value some_command
Si vous utilisez csh ou tcsh, vous devez utiliser une syntaxe lgrement diffrente. Il faut crire :
shell> setenv VARNAME value shell> some_command
MySQL est un serveur de bases de donnes relationnelles. Un serveur de bases de donnes stocke les donnes dans des tables spares plutt que de tout rassembler dans une seule table. Cela amliore la rapidit et la souplesse de l'ensemble. Les tables sont relies par des relations dfinies, qui rendent possible la combinaison de donnes
Histoire de MySQL
entre plusieurs tables durant une requte. Le SQL dans ``MySQL'' signifie ``Structured Query Language'' : le langage standard pour les traitements de bases de donnes.
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 tlcharger MySQL sur Internet, et l'utiliser 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 License), http:// www.gnu.org/licenses/, pour dfinir ce que vous pouvez et ne pouvez pas faire avec ce logiciel, dans diffrentes situations. Si vous ne vous sentez pas confortable avec la licence GPL ou bien que vous devez intgrer MySQL dans une application commerciale, vous pouvez acheter une licence commerciale auprs de MySQL AB.
Le serveur de bases de donnes MySQL est trs rapide, fiable et facile utiliser Si c'est ce que vous recherchez, vous devriez faire un essai. Le serveur de bases de donnes MySQL dispose aussi de fonctionnalits pratiques, dveloppes en coopration avec nos utilisateurs. Vous pouvez trouver une comparaison des performances du serveur MySQL avec d'autres systmes de bases de donnes dans nos pages de tests de performances. See Section 7.1.4, La suite de tests MySQL . Le serveur MySQL a t dvelopp l'origine pour grer de grandes bases de donnes plus rapidement que les solutions existantes, et a t utilis avec succs dans des environnements de production trs contraintes et trs exigeants, depuis plusieurs annes. Bien que toujours en dveloppement, le Le serveur MySQL offre des fonctions nombreuses et puissantes. Ses possibilits de connexions, sa rapidit et sa scurit font du serveur MySQL une serveur hautement adapt Internet. MySQL Server fonctionne en mode client/serveur ou en systme embarqu. Le serveur MySQL est un systme client / serveur qui est constitu d'un serveur SQL multi-thread qui supporte diffrentes interfaces, clients, bibliothques et outils d'administration, ainsi qu'une large gamme de pilotes pour diffrents langages (API). Nous proposons aussi le serveur MySQL comme une bibliothque embarque, que vous pouvez intgrer dans vos applications pour en faire des produits plus petits, plus rapides et plus simples utiliser. Il existe un grand nombre de contributions MySQL. Il est trs probable que vous pourrez trouver votre diteur prfr ou que votre environnement de programmation supporte dj le serveur de base de donnes MySQL. La prononciation officielle de MySQL est ``My Ess Que Ell'' (en anglais), ce qui donne ``Maille Esse Cu Elle'' en phontique franaise. Evitez d'utiliser la prononciation ``my sequel'', mais nous ne nous formaliserons pas que vous utilisiez ``my sequel'' (ma squelle, en franais) ou une autre prononciation adapte.
conclusion que mSQL n'tait pas assez rapide et flexible pour nos besoins. Cela nous a conduit crer une nouvelle interface SQL pour notre base de donnes, mais en gardant la mme 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 bibliothques et outils taient prfixs par ``my'' depuis plus de 10 ans. Mais la fille de Monty, plus jeune que lui, tait aussi appele My. Lequel des deux a conduit au nom de MySQL est toujours un mystre, mme pour nous. Le nom du dauphin MySQL (notre logo) est Sakila, qui a t choisi par les fondateurs de MySQL AB partir d'une grande liste de noms suggrs par les utilisateurs dans le concours "Name the Dolphin" ("Nommez le dauphin"). Le nom a t suggr par Ambrose Twebaze, un dveloppeur de logiciels libres au Swaziland, en Afrique. D'aprs Ambrose, le nom Sakila puise ses origines du SiSwati, la langue locale du Swaziland. Sakila est aussi le nom d'une ville en Arusha, Tanzanie, prs du pays d'origine d'Ambrose, Uganda.
Nombreux types de colonnes : entiers signs ou non, de 1, 2, 3, 4, et 8 octets, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET et ENUM. See Chapitre 11, Types de colonnes. Enregistrements de taille fixe ou variable. Toutes les colonnes ont des valeurs par dfaut. Vous pouvez utiliser la commande INSERT pour insrer un sous ensemble de colonnes : les colonnes qui ne sont pas explicitement cits prennent alors leur valeur par dfaut. Commandes et fonctions Support complet des oprateurs 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 affectes. Il est possible d'obtenir le nombre de lignes trouves en modifiant une option lors de la connexion au serveur. La commande spcifique MySQL SHOW est utilise pour obtenir des informations sur les bases, tables et index. La commande EXPLAIN sert optimiser les requtes. Les noms de fonctions ne sont jamais 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 tolr entre le nom de la fonction et la parenthse ouvrante ( suivante. See Section 9.6, Cas des mots rservs MySQL . Vous pouvez utiliser simultanment des tables de diffrentes bases (depuis la version 3.22). Scurit Un systme de droits et de mots de passe trs souple et scuritaire, qui vrifie aussi les htes se connectant. Les mots de passe sont bien protgs, car tout les changes de mot de passe sont chiffrs, mme lors des connexions. Charges supportes et limites Gre les trs grandes bases de donnes. 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 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 prfixe issu d'un champs CHAR ou VARCHAR. Connexions Les clients peuvent se connecter au serveur MySQL en utilisant les sockets TCP/IP, les sockets Unix ou les pipes nomms sous NT.
Support de ODBC (Open-DataBase-Connectivity) pour Windows 32 bits (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. See Section 25.1.1.1, Qu'est-ce que ODBC? . L'interface Connector/JDBC fournit le support pour les clients Java qui utilisent JDBC. Ces clients peuvent tre utiliss sur Windows et Unix. Les sources de Connector/JDBC sont libres. See Chapitre 25, Pilotes MySQL. Traductions Le serveur fournit des messages d'erreurs au client dans de nombreuses langues, y compris le franais. See Section 5.8.2, Langue des messages d'erreurs . Support complet de plusieurs jeux de caractres, comprenant ISO-8859-1 (Latin1), german, big5, ujis, etc. Par exemple, les caractres nordiques , et sont autoriss dans les noms de tables et colonnes. Toutes les donnes sont sauves dans le jeu de caractres choisi. Les comparaisons normales de chanes sont insensibles la casse. Le tri est fait en fonction du jeu de caractres choisi (par dfaut, le jeu sudois). Il est possible de le changer lorsque le serveur MySQL est dmarr. Pour voir un exemple trs avanc de tri, voyez le code de tri pour le Tchque. Le serveur MySQL supporte de nombreux jeux de caractres qui peuvent tre spcifi la compilation et durant l'excution. Clients et utilitaires Inclut myisamchk, un utilitaire rapide pour vrifier les tables, les optimiser et les rparer. Toutes les fonctionnalits de myisamchk sont aussi disponibles via l'interface SQL. See Chapitre 5, Administration du serveur. Tous les programmes MySQL peuvent tre appels avec l'option --help ou -? pour obtenir de l'aide en ligne.
Rplication -- Gamma De grands serveurs en grappe utilisant la rplication sont en production, avec de bons rsultats. L'amlioration de la rplication continue avec MySQL 4.x. Tables InnoDB -- Stable (en 3.23 depuis 3.23.49) Le gestionnaire transactionnel de tables InnoDB a t dclar stable en MySQL version 3.23, partir de la version 3.23.49. InnoDB est utilis dans de grands systmes complexes, avec forte charge. Tables BDB -- Gamma Le code de Berkeley DB est trs stable, mais nous sommes encore en train d'amliorer 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 adopte. Des amliorations importantes sont prvues pour MySQL 4.0. Connector/ODBC 3.51 (Stable) Connector/ODBC 3.51 utilise le SDK ODBC SDK 3.51 et est en production. Certains problmes qui ont surgi sont lie aux applications, et indpendant du pilote ODBC ou le serveur sous-jacent. Tables restauration automatique MyISAM -- Gamma Ce statut ne concerne que le nouveau code du gestionnaire de tables MyISAM qui vrifie si la table a t correctement ferme lors de l'ouverture, et qui excute automatiquement la vrification et rparation ventuelles de la table. MySQL AB fournit un support de premire qualit pour les clients payant, mais les listes de diffusions de MySQL sont gnralement rapides donner des rponses aux questions les plus communes. Les bogues sont gnralement corrigs aussitt avec un patch. Pour les bogues srieux, il y a presque toujours une nouvelle version.
En Linux 2.2, vous pouvez avoir des tables plus grandes que 2Go en utilisant le patch LFS pour les systmes de fichiers ext2. En Linux 2.4, le patche existe aussi pour ReiserFS. La plupart des distribution Linux courantes sont bases sur un noyau 2.4, et supporte dj tous les patches pour
Compatibilit an 2000
les grands fichiers (LFS). Cependant, la taille maximale de fichier dpend de nombreux facteurs, notamment le systme de fichiers utilis pour stocker les pages MySQL. Pour une introduction dtaille LFS sur Linux, voyez la page d' Andreas Jaeger Large File Support in Linux http://www.suse.de/~aj/linux_lfs.html. Par dfaut, les tables MySQL peuvent atteindre une taille de 4Go. Vous pouvez vrifier la taille des tables avec la commande SHOW TABLE STATUS ou la commande en ligne myisamchk -dv nom_de_table. See Section 13.5.3, Syntaxe de SHOW . Si vous avez besoin de tables plus grandes que 4Go (et que votre systme d'exploitation le supporte, modifiez les paramtres AVG_ROW_LENGTH et MAX_ROWS lorsque vous crez votre table. See Section 13.2.5, Syntaxe de CREATE TABLE . Vous pouvez aussi modifier ces valeurs avec la commande ALTER TABLE. See Section 13.2.2, Syntaxe de ALTER TABLE . D'autres mthodes pour contourner les limitations des systmes de fichiers avec les tables MyISAM : Si votre table est en lecture seule, utilisez myisampack pour la compresser. myisampack compresse une table 50%, ce qui double environs la taille des tables. myisampack peut aussi combiner plusieurs tables en une seule. See Section 8.2, myisampack, le gnrateur de tables MySQL compresses en lecture seule . Une autre mthode pour contourner les limites du systme de fichiers pour les tables MyISAM est d'utiliser les options RAID. See Section 13.2.5, Syntaxe de CREATE TABLE . MySQL inclut une bibliothque MERGE qui permet de grer plusieurs tables identiques comme une seule. See Section 14.2, Tables assembles MERGE .
10
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)
Cet exemple montre que les types DATE et DATETIME ne poseront aucun problme avec les dates futures (ils grent 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 signe). Sur les machines 64 bits, il gre les dates jusqu'en 2106 (valeur non signe). Mme si le serveur MySQL est compatible an 2000, il est de votre responsabilit de fournir des donnes non ambigus. Voyez Section 11.3.4, An 2000 et les types date pour les rgles du serveur MySQL pour traiter les dates ambigus (les donnes contenant des annes exprimes sur deux chiffres).
11
Les plans de certains fonctionnalits sont rsums dans cette table. Fonctionnalit Unions Sous-requtes R-trees Procdures stockes Vues Curseurs Cls trangres Triggers Jointures externes Contraintes version MySQL 4.0 4.1 4.1 (pour les tables MyISAM) 5.0 5.0 ou 5.1 5.0 5.1 (dj implmentes en 3.23 par InnoDB) 5.1 5.1 5.1
12
applications avec MySQL Serveur. See Section 12.6, Recherche en texte intgral (Full-text) dans MySQL . Respect des standards, portabilit et migration Simplification de la migration depuis d'autres bases de donnes vers MySQL Serveur, et notamment TRUNCATE TABLE (comme sous Oracle) et IDENTITY comme synonyme pour les cls automatiquement incrmentes (comme sous Sybase). De nombreux utilisateurs seront heureux de savoir que le serveur MySQL supporte aussi les requtes UNION, une fonctionnalit SQL attendue avec impatience. MySQL peut s'excuter nativement sur les plates-formes NetWare 6.0. See Section 2.2.14, Installer MySQL sur NetWare . Internationalisation Nos utilisateurs allemands, autrichiens et suisses remarqueront que nous avons un nouveau jeu de caractres, latin1_de, qui corrige les problmes de tri des valeurs allemandes, en plaant les umlauts allemands dans le mme ordre que dans l'annuaire d'Allemagne. Amlioration de l'ergonomie Durant la mise en place de fonctionnalits pour de nouveaux utilisateurs, nous n'avons pas oubli notre communaut de loyaux utilisateurs. Une fonctionnalit pratique pour les administrateurs de base de donnes est que la plupart des paramtres de dmarrage de mysqld peuvent tre modifies sans redmarrer le serveur. See Section 13.5.2.8, Syntaxe de SET . Les commandes DELETE et UPDATE peuvent dsormais fonctionner sur plusieurs tables. En ajoutant le support des liens symboliques MyISAM au niveau des tables (et non plus au niveau des bases, comme auparavant), et en autorisant les liens symboliques sur Windows, nous esprons que nous avons pris au srieux vos demandes d'amlioration. Des fonctions comme SQL_CALC_FOUND_ROWS et FOUND_ROWS() rendent possible le comptages de lignes sans utiliser la clause LIMIT. La section sur les nouveauts du manuel rassemble toutes les nouveauts. See Section C.3, Changements de la version 4.0.x (Production) .
13
stockes SQL-99, qui seront disponibles pour la version 5.0. Ils reprsentent les fonctionnalits les plus demandes par de nombreux clients. Avec ces amliorations, les critiques du serveur de base de donnes MySQL devront tre plus imaginatifs que jamais pour identifier des manques dans le serveur MySQL. Dj connu depuis longtemps pour sa stabilit, sa rapidit et sa facilit d'emploi, le serveur MySQL va dsormais satisfaire la liste de tous les voeux des clients les plus exigeants.
14
Amliorations d'ergonomie En rponse la demande populaire, nous avons ajout une commande HELP command cot serveur, qui peut tre utilise en ligne de commande du client mysql et d'autres clients, pour obtenir de l'aide sur les commandes SQL. Avec ces informations sur le serveur, elles seront parfaitement adaptes la version et configuration du serveur. Avec le nouveau protocole client/serveur, les requtes multiples sont dsormais actives. Cela vous permet d'mettre plusieurs requtes en une seule commande, puis de lire tous les rsultats en une seule fois. See Section 24.2.9, Gestion des commandes multiples avec l'interface C . Le nouveau protocole client/serveur supporte aussi les jeux de rsultats multiples. Cela peut arriver aprs une commande multiple, par exemple. Voir le point prcdent. Nous avons implment une syntaxe pratique INSERT ... ON DUPLICATE KEY UPDATE .... Elle vous permet de modifier une ligne avec UPDATE, si l'insertion INSERT avait gnr un double dans la colonne PRIMARY ou UNIQUE. See Section 13.1.4, Syntaxe de INSERT . Nous avons ajout une fonction d'agrgation, GROUP_CONCAT(), qui permet de concatner des colonnes dans une seule chane de rsultat. See Section 12.9, Fonctions et options utiliser dans les clauses GROUP BY . La section sur les nouveauts du manuel rassemble toutes les nouveauts. See Section C.2, Changements de la version 4.1.x (Alpha) .
15
Les listes de diffusion MySQL suivantes existent : announce 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. mysql La liste de diffusion principale pour les discussions gnrales sur MySQL. Notez que certains sujets sont diriger sur les listes spcialises. Si vous postez sur la mauvaise liste, vous pourriez ne pas avoir avoir de rponse. mysql-digest La liste mysql en format journalier. Cela signifie que vous recevrez tous les messages de la journe en un seul gros email. bugs 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 systme d'exploitation et la version de MySQL). See Section 1.4.1.3, Comment rapporter un bogue ou un problme . bugs-digest La liste bugs en format journalier. internals Une liste pour ceux qui travaillent sur le code MySQL. Sur cette liste, vous pouvez discuter du dveloppement de MySQL et envoyer des correctifs. internals-digest La liste internals en format journalier. mysqldoc La liste des personnes qui travaillent sur la documentation MySQL : des employs de MySQL AB, des traducteurs et d'autres membres de la communaut. mysqldoc-digest La liste mysqldoc en format journalier. benchmarks Cette liste est pour tous ceux qui sont intress par les performances. Les discussions se concentrent sur les performances (mais pas seulement avec MySQL), mais abordent aussi des problmes de noyau, le systme de fichiers, les disques, etc. benchmarks-digest La liste benchmarks en format journalier. packagers Cette liste se concentre sur les paquets et les distributions MySQL. C'est l'un des forums utilis par les responsables pour changer des ides sur les paquets MySQL, pour s'assurer que MySQL est le mme sur toutes les plates-formes. packagers-digest
16
La liste packagers en format journalier. java Une liste pour ceux qui utilisent MySQL et java. Elle concerne majoritairement les pilotes JDBC. java-digest La liste java en format journalier. win32 Une liste pour ceux qui utilisent MySQL sur les systmes d'exploitation de Microsoft, tels que Windows 9x/Me/NT/2000/XP. win32-digest La liste win32 en format journalier. myodbc Une liste pour tout ce qui concerne la connexion MySQL avec le pilote ODBC. myodbc-digest La liste myodbc en format journalier. mysqlcc Une liste pour tout ce qui concerne le client graphique MySQL Control Center. mysqlcc-digest La liste mysqlcc en format journalier. plusplus Une liste pour tout ce qui concerne la programmation avec les API C++ de MySQL. plusplus-digest La liste plusplus en format journalier. msql-mysql-modules Une liste pour tout ce qui concerne Perl et le support du module msql / mysql. msql-mysql-modules-digest La liste msql-mysql-modules en format journalier. Vous pouvez vous inscrire ou vous dsinscrire de toutes les listes en mme temps de la mme faon que nous l'avons dcrit au dbut. Dans votre message d'inscription, utilisez simplement le nom de liste appropri. Par exemple, pour vous inscrire la liste myodbc. Si vous ne pouvez pas obtenir d'informations sur la liste de diffusion, une de vos options est de prendre un contrat de support auprs de MySQL AB, qui vous donnera un contact direct avec les dveloppeurs MySQL. Le tableau suivant prsente diverses autres listes de diffusions consacre MySQL, dans d'autres langues que l'anglais. Notez que ces ressources ne sont pas gres par MySQL AB, ce qui fait que nous ne pouvons pas garantir leur qualit. <mysql-france-subscribe@yahoogroups.com>
17
Une liste de diffusion franaise <list@tinc.net> Une liste de diffusion corenne Envoyez un message subscribe mysql your@email.address. <mysql-de-request@lists.4t2.com> Une liste de diffusion allemande Envoyez un message subscribe mysql-de your@email.address. Vous aurez plus d'informations sur cette liste http://www.4t2.com/mysql/. <mysql-br-request@listas.linkway.com.br> Une liste de diffusion portugaise Envoyez un message subscribe mysql-br your@email.address. <mysql-alta@elistas.net> Une liste de diffusion espagnole Envoyez un message subscribe mysql your@email.address.
18
Le script mysqlbug vous aide gnrer un rapport en dterminant 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 dcrites ici sont prsentes dans votre message. De prfrence, vous devriez tester le problme avec la dernire version de production ou de dveloppement de MySQL. Il doit tre facile de reproduire le test avec simplement la commande mysql test < script, applique au cas de test, ou en excutant le script Shell ou Perl inclus dans le rapport. Tous les bogues posts sur le site de rapports de bogues http://bugs.mysql.com/ seront corrigs ou documents dans la prochaine version de MySQL. Si seuls, de petits changements sont ncessaires, nous publierons aussi un patch. Si vous avez dcouvert un problme de scurit critiques avec MySQL, il faut envoyer un email <security@mysql.com>. Si vous avez un rapport de bogue reproductible, envoyez un rapport sur le site http://bugs.mysql.com/. Notez que mme dans ce cas, il est bon d'utiliser le script mysqlbug pour rassembler des informations sur votre systme. Tous les bogues que nous pourrons reproduire auront de bonnes chances d'tre corrigs lors de la prochaine version de MySQL. Pour signaler d'autres problmes, utilisez une des listes de diffusion MySQL. Sachez qu'il est toujours possible de rpondre un message qui contient trop d'informations, alors qu'il est impossible de rpondre un message qui contient trop peu d'informations. Souvent, il est facile d'omettre des faits parce que vous pensez connatre la cause du problme et supposez que ces dtails 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 plutt que d'tre oblig de demander une nouvelle fois et d'attendre une rponse parce que vous avez oubli une partie des informations la premire fois. L'erreur la plus commune est de ne pas indiquer le numro de la version de MySQL qui est utilis, ou de ne pas indiquer le systme d'exploitation que vous utilisez (y compris le numro de version de ce systme d'exploitation). Ce sont des informations de premire importance, et dans 99% des 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 apercevons que la fonctionnalits en question n'est mme pas programme dans la version de MySQL utilise, ou que le bogue dcrit est dj corrig dans une nouvelle version de MySQL. Parfois aussi, les erreurs sont dpendantes des plates-formes. Dans ce cas, il est presque impossible de les corriger sans savoir quel systme d'exploitation et quelle version exacte est utilise. Pensez aussi fournir des informations concernant votre compilateur, si c'est pertinent. Souvent, les dveloppeurs trouvent des bogues dans les compilateurs, et pensent que c'est lis MySQL. La plupart des compilateurs sont en constant dveloppement, et s'amliorent de version en version. Pour dterminer si votre problme dpend de votre compilateur, nous avons besoin de savoir quel compilateur est utilis. Notez que les problmes de compilations sont des bogues, et doivent tre traits avec un rapport de bogues. Il est particulirement 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 problme, ou une description prcise. Les meilleurs rapports sont ceux qui incluent un exemple complet permettant de reproduire le bogue. See Section D.1.6, Faire une batterie de tests lorsque vous faites face un problme de table corrompue . Si un programme produit un message d'erreur, il est trs important d'inclure ce message dans votre rapport. Il est prfrable que le message soit le message exact, car il est alors possible de le retrouver en utilisant les archives : mme la casse doit tre respecte. N'essayez jamais de vous rappeler d'un message d'erreur, mais faites plutt un copier/coller du message complet dans votre rapport.
19
Si vous avez un problme avec MyODBC, essayez de gnrer un fichier de trace MyODBC. See Section 25.1.1.9, Rapporter des problmes avec MYODBC . Pensez aussi que de nombreux personnes qui liront votre rapport utilisent un formatage de 80 colonnes. Lorsque vous gnrez 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 excdent une telle largeur (par exemple, avec la commande EXPLAIN SELECT; voyez l'exemple un peu plus tard dans cette section. Voici un pense-bte des informations fournir dans votre rapport : Le numro de version de la distribution de MySQL que vous utilisez (par exemple MySQL Version 3.22.22). Vous pouvez connatre cette version en excutant la commande mysqladmin version. mysqladmin est situ dans le dossier bin de votre distribution MySQL. Le fabricant et le modle de votre serveur. Le systme d'exploitation et la version que vous utilisez. Pour la plupart des systmes d'exploitation, vous pouvez obtenir cette information en utilisant la commande Unix uname -a. Parfois, la quantit de mmoire (physique et virtuelle) est important. Si vous hsitez, ajoutez la. Si vous utilisez une version de MySQL sous forme de source, le nom et le numro de version du compilateur sont ncessaires. Si vous utilisez une version excutable, le nom de la distribution est important. Si le problme 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 arrt, il est recommand d'inclure la requte qui a men cet arrt de mysqld. Vous pouvez gnralement la trouver en excutant mysqld en ayant activ les logs. See Section D.1.5, Utilisation des fichiers de log pour trouver d'o viennent les erreurs de mysqld . Si une table ou une base sont lis au problme ajoutez le rsultat de la commande mysqldump -no-data db_name tbl_name1 tbl_name2 .... C'est trs simple faire, et c'est un moyen efficace d'obtenir un descriptif de table, qui nous permettra de recrer une situation comparable la votre. Pour les problmes lis la vitesse, ou des problmes lis la commande SELECT, pensez inclure le rsultat de la commande EXPLAIN SELECT ..., et au moins le nombre de ligne que la commande SELECT doit produire. Vous devriez aussi inclure le rsultat de la commande SHOW CREATE TABLE table_name pour chaque table implique. 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 rdig en anglais) : Exemple ralis avec mysql en ligne de commande (notez l'utilisation de la fin de commande \G, pour les rsultats qui pourraient dpasser 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 problme survient lors de l'excution de mysqld, essayez de fournir un script qui reproduit l'anomalie. Ce script doit inclure tous les fichiers sources ncessaires. Plus votre script reproduira fidlement votre situation, mieux ce sera. Si vous pouvez raliser un cas de test postez-le sur le site http://bugs.mysql.com/ pour un traitement prioritaire!
20
Si vous ne pouvez pas fournir de script, fournissez tout au moins le rsultat de la commande mysqladmin variables extended-status processlist dans votre mail pour fournir des informations sur les performances de votre systme. Si vous ne pouvez pas reproduire votre situation en quelques lignes, ou si une table de test est trop grosse tre envoye par mail (plus de 10 lignes), exportez vos tables sous forme de fichier avec la commande mysqldump et crez un fichier README qui dcrit votre problme. Crez une archive compresse de votre fichier en utilisant tar et gzip ou zip, et placez le via ftp sur le site de ftp://support.mysql.com/pub/mysql/secret/. Puis, entrez la description de l'anomalie sur le site http://bugs.mysql.com/. Si vous pensez que le serveur MySQL fournit des rsultats tranges pour une requte, incluez non seulement le rsultat, mais aussi votre propre explication sur ce que le rsultat devrait tre, et un diagnostic de la situation. Lorsque vous donnez un exemple du problme, il est mieux d'utiliser des noms de variables et de tables qui existent dans votre situation, plutt que d'inventer de nouveaux noms. Le problme peut tre li au noms des variables ou tables que vous utilisez! Ces cas sont rares, mais il vaut mieux viter les ambiguts. Aprs tout, il est plus facile pour vous de fournir un exemple qui utilise votre situation relle, et c'est bien mieux pour nous aussi. Si vous avez des donnes que vous ne souhaitez pas divulguer, vous pouvez utiliser le site ftp pour les transfrer dans le dossier secret ftp://support.mysql.com/pub/mysql/secret/. Si les donnes sont vraiment ultra secrtes et que vous ne souhaitez mme pas nous les montrer, alors utilisez d'autres noms et donnes pour votre rapport, mais considrez cela comme un dernier recours. Incluez toutes les options utilises, si possible. Par exemple, indiquez les options que vous utilisez lors du dmarrage 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 ide 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 systme de droits, incluez le rsultat 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 systme de droits, il faut commencer par utiliser la commande mysqladmin reload version et de vous connecter avec le programme qui vous pose problme. 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 mme que nous allons l'utiliser, si vous ne fournissez pas les informations ncessaires pour le tester. Nous pourrions trouver des problmes gnrs par votre patch, ou bien nous pourrions ne pas le comprendre du tout. Si tel est le cas, nous ne l'utiliserons pas. Si nous ne pouvons pas vrifier 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 gnrer toutes les situations qui pourraient arriver. Si nous trouvons un cas limite dans lequel votre patche ne fonctionne pas, mme si il est rare, il risque d'tre inutile. Les diagnostics sur la nature du bogue, la raison de son dclenchement ou les effets de bords sont gnralement faux. Mme l'quipe MySQL ne peut diagnostiquer sans commencer par utiliser un dbogueur pour dterminer la cause vritable. Indiquez dans votre mail que vous avez vrifi le manuel de rfrence et les archives de courrier, de faon avoir puiser les solutions que d'autres avant vous auraient pu trouver. Si vous obtenez un message parse error, vrifiez votre syntaxe avec attention. Si vous ne pouvez rien y trouvez redire, il est trs probable que votre version de MySQL ne supporte pas encore cette fonctionnalit que vous essayez d'utiliser. Si vous utilisez la version courante de mySQL et que le manuel http://www.mysql.com/doc/ ne couvre pas la syntaxe que vous
21
utilisez, c'est que MySQL ne supporte pas votre syntaxe. Dans ce cas, vos seules options sont d'implmenter vous mme la syntaxe ou d'envoyez un message <licensing@mysql.com> pour proposer de l'implmenter. Si le manuel prsente la syntaxe que vous utilisez, mais que vous avez une ancienne version du serveur MySQL, il est recommand de vrifier l'historique d'volution de MySQL pour savoir quand la syntaxe a t supporte. Dans ce cas, vous avez l'option de mettre jour votre MySQL avec une version plus rcente. See Annexe C, Historique des changements MySQL. Si vous avez un problme tel que vos donnes semblent corrompues, ou que vous recevez constamment des erreurs lors d'accs une table, vous devriez commencer par essayer de rparer votre table avec l'utilitaire de ligne de commande myisamchk ou les syntaxes SQL CHECK TABLE et REPAIR TABLE. See Chapitre 5, Administration du serveur. Si 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. See Section 5.9.1, Le log d'erreurs . Normalement, mysqld ne doit jamais corrompre une table si il a t interrompu au milieu d'une mise jour. Si vous pouvez trouvez la cause de l'arrt de mysqld, il est bien plus facile pour nous de fournir un correctif. See Section A.1, Comment dterminer ce qui pose problme . Si possible, tlchargez et installez la version la plus rcente du serveur MySQL, et vrifiez si cela rsout votre problme. Toutes les versions de MySQL sont testes fond, et doivent fonctionner sans problme. Nous croyons la compatibilit ascendante, et vous devriez pouvoir passer d'une version l'autre facilement. See Section 2.1.2, Choisir votre version de MySQL . Si vous disposez de l'accs au support client, contactez aussi le support client <mysql-support@mysql.com>, en plus de la liste de rapport de bogues, pour un traitement prioritaire. Pour des informations sur les rapports de bogues avec MyODBC, voyez Section 25.1.1.9, Rapporter des problmes avec MYODBC . Pour des solutions aux problmes les plus courants, voyez Annexe A, Problmes et erreurs communes. Lorsque des solutions vous sont envoyes individuellement et non pas la liste, il est considr comme bien vu de rassembler ces rponses et d'en envoyer un rsum sur le liste, de manire ce que les autres en profitent aussi.
22
freenode (voyez http://www.freenode.net/ pour les serveurs) #mysql Principalement, des questions sur MySQL, mais les autres bases de donnes et le langage SQL sont aussi accepts. EFnet (voyez http://www.efnet.org/ pour les serveurs) #mysql Questions sur MySQL. Si vous recherchez un client IRC pour vous connecter un rseau IRC, voyez donc X-Chat (http:// www.xchat.org/). X-Chat est disponible sous Unix et sous Windows.
23
Nous ne croyons pas au support natif du XML en base, mais nous allons faire en sorte d'ajouter le support XML que rclame nos clients du cot client. Nous pensons qu'il est prfrable de conserver le serveur central aussi ``simple et efficace'' que possible, et dvelopper les bibliothques qui grent la complexit du cot client. Cela fait partie de la stratgie que nous avons mentionn plus tt, pour ne sacrifier ni la vitesse, ni la robustesse du serveur.
En MySQL version 4.1, vous pouvez arriver la mme configuration avec ces deux options (spcifiez la valeur de --sql_mode sur une seule ligne) :
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET GLOBAL sql_mode = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GROUP_BY';
See Section 1.5.2, Slectionner les modes SQL . En MySQL version 4.1.1, les options sql_mode prsente ci-dessus peuvent tre configure avec :
SET GLOBAL sql_mode='ansi';
Dans ce cas, la valeur de la variable sql_mode prendre toute les options du mode ANSI. Vous pouvez vrifier le rsultat comme ceci :
mysql> SET GLOBAL sql_mode='ansi'; mysql> SELECT @@global.sql_mode; -> 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI';
24
Si vous ajoutez le numro de version aprs le point d'exclamation !, la syntaxe sera excute uniquement si la version du serveur MySQL est gale ou plus rcente que le numro de version utilis.
CREATE /*!32302 TEMPORARY */ TABLE t (a int);
Cela signifie que si vous avez la version 3.23.02 ou plus rcente, le serveur MySQL va utiliser le mot rserv TEMPORARY. Voici une liste des apports spcifiques de MySQL : Organisation des donnes sur le disque MySQL fait correspondre chaque base un dossier dans le dossier de donnes MySQL, et chaque table des fichiers portant le mme nom. Ceci a plusieurs implications : Les noms des bases de donnes et des tables sont sensibles la casse sur les systmes d'exploitation qui ont des systmes de fichiers sensibles la casse (comme la plupart des systmes Unix). See Section 9.2.2, Sensibilit la casse pour les noms .
Vous pouvez utiliser les commandes systmes standard pour sauver, renommer, dplacer, 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. Les noms de bases, tables, index, colonnes ou alias peuvent commencer par des chiffres, mais ne peuvent pas tre constitus uniquement de noms. Syntaxe gnrale du langage Les chanes de caractres peuvent tre soit dlimites par ", soit par '. Pas seulement par '. L'utilisation du caractre de protection \. Dans une requte SQL, vous pouvez accder des tables situes dans diffrentes bases de donnes, avec la syntaxe db_name.tbl_name. Certains serveurs SQL fournissent la mme fonctionnalit, mais l'appellent un User space. Le serveur MySQL ne supporte par les espaces de nom de tables, comme dans : create table ralph.my_table...IN my_tablespace. Syntaxe de commande SQL Les commandes ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE et REPAIR TABLE. Les commandes CREATE DATABASE et DROP DATABASE. See Section 13.2.3, Syntaxe de CREATE DATABASE . La commande DO. La commande EXPLAIN SELECT pour avoir le dtail des jointures de tables. Les commandes FLUSH et RESET. La commande SET. See Section 13.5.2.8, Syntaxe de SET .
25
La commande SHOW. See Section 13.5.3, Syntaxe de SHOW . L'utilisation de la commande LOAD DATA INFILE. Dans de nombreuses situations, cette syntaxe est compatible avec la commande d'Oracle LOAD DATA INFILE. See Section 13.1.5, Syntaxe de LOAD DATA INFILE . L'utilisation de RENAME TABLE. See Section 13.2.9, Syntaxe de RENAME TABLE . L'utilisation de REPLACE au lieu de DELETE + INSERT. See Section 13.1.6, Syntaxe de REPLACE . L'utilisation de CHANGE col_name, DROP col_name ou DROP INDEX, IGNORE ou RENAME dans une commande ALTER TABLE. See Section 13.2.2, Syntaxe de ALTER TABLE . L'utilisation de noms d'index, de prfixes d'index, et l'utilisation des mots-cl INDEX or KEY dans une commande de cration de table CREATE TABLE. See Section 13.2.5, Syntaxe de CREATE TABLE . L'utilisation des clauses TEMPORARY et IF NOT EXISTS avec CREATE TABLE. L'utilisation de DROP TABLE avec les mots-cl IF EXISTS. Vous pouvez effacer plusieurs tables avec une seule commande DROP TABLE. La clause LIMIT de la commande DELETE. La syntaxe INSERT INTO ... SET col_name = .... La clause DELAYED des commandes INSERT et REPLACE. La clause LOW_PRIORITY des commandes INSERT, REPLACE, DELETE et UPDATE. L'utilisation de INTO OUTFILE et STRAIGHT_JOIN dans les requtes SELECT. See Section 13.1.7, Syntaxe de SELECT . L'option SQL_SMALL_RESULT de la commande SELECT. Vous n'tes pas oblig de nommer toutes les colonnes que vous slectionnez dans la clause GROUP BY. Cela donne de meilleures performances pour certaines situations spcifiques, mais classiques. See Section 12.9, Fonctions et options utiliser dans les clauses GROUP BY . Vous pouvez spcifier ASC ou DESC dans la clause GROUP BY. La possibilit de modifier les variables dans les commandes avec l'oprateur := :
SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
Types de colonnes Les types de colonnes MEDIUMINT, SET, ENUM et les types BLOB et TEXT. Les attributs de champs AUTO_INCREMENT, BINARY, NULL, UNSIGNED et ZEROFILL. Fonctions et oprateurs 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 chanes de caractres supportent simultanment les syntaxes ANSI SQL et ODBC. Le serveur MySQL comprend les oprateurs || et && comme oprateurs logiques OR et AND, comme en langage C. Pour le serveur MySQL, les oprateurs || et OR sont synonymes, ainsi que
26
&& et AND. En consquence, MySQL ne supporte pas l'oprateur de concatnation de chanes ANSI SQL ||. Utilisez plutt 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. L'utilisation de COUNT(DISTINCT list) o list contient plus d'un lment. Toutes les comparaisons de chanes sont insensibles la casse par dfaut, et l'ordre de tri est dtermin par le jeu de caractres courant (ISO-8859-1 Latin1 par dfaut). Si vous en souhaitez un autre, il faut dclarer les colonnes avec l'attribut BINARY ou utiliser l'oprateur BINARY pour forcer les comparaisons prendre en compte la casse, en fonction du jeu de caractres utilis sur l'hte du serveur MySQL. L'oprateur % 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 oprateurs =, <>, <= ,<, >=,>, <<, >>, <=>, AND, OR ou LIKE peuvent tre utiliss 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(), qui retourne la plus rcente valeur de colonne AUTO_INCREMENT. See Section 12.8.3, Fonctions d'informations . LIKE est possible avec des colonnes numriques. Les oprateurs d'expressions rgulires 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 rduire les chanes. L'ANSI SQL ne supporte que les suppressions de caractres uniques. Les fonctions de groupe de la clause GROUP BY STD(), BIT_OR(), BIT_AND(), BIT_XOR() et GROUP_CONCAT(). See Section 12.9, Fonctions et options utiliser dans les clauses GROUP BY . Pour une liste hirarchise des nouvelles extensions qui seront ajoutes MySQL, vous pouvez consulter la liste de tche en ligne sur http://dev.mysql.com/doc/mysql/en/TODO.html. C'est la dernire liste qui est utilise dans ce formulaire. See Section B.8, Les volutions de MySQL (la liste des tches) .
27
Les droits d'un utilisateur sur une table ne sont pas supprims si la table est dtruite. Vous devez explicitement utiliser la commande REVOKE pour supprimer les droits d'un utilisateur sur une table. See Section 13.5.1.3, Syntaxe de GRANT et REVOKE .
1.5.5.1. Sous-requtes
MySQL 4.1 supporte les sous-requtes et les tables drives (vues anonymes). Une ``sous-requte'' est une commande SELECT imbrique dans une autre commande. Une ``table drive'' (vues anonymes) est une sous-requte place dans une clause FROM d'une autre commande. See Section 13.1.8, Sous-slections (SubSELECT) . Pour les versions de MySQL antrieure la 4.1, la plupart des sous-requtes peuvent tre rcrites avec des jointures et d'autres mthodes. Voyez Section 13.1.8.11, Se passer des sous-requtes avec les premires versions de MySQL pour des exemples d'illustration.
Alternativement, vous pouvez utiliser SELECT INTO OUTFILE... et CREATE TABLE ... SELECT. Depuis la version 5.0, MySQL supporte SELECT ... INTO avec les variables serveur. La mme syntaxe peut aussi tre utilise dans les procdures stockes, en utilisant les curseurs et les variables locales. See Section 19.2.9.3, Syntaxe de SELECT ... INTO .
28
n'aurez jamais d'annulation automatique de la base, ce qui est un problme commun des bases transactionnelles. 3. Mme un systme transactionnel peut perdre des donnes si le serveur s'arrte. La diffrence entre les systmes repose alors dans ce petit laps de temps o ils peuvent perdre des donnes. Aucun systme n'est scuris 100%, mais simplement ``suffisamment scuris''. Mme Oracle, rput pour tre la plus sre des bases de donnes transactionnelles, est montr du doigt pour perdre des donnes dans ces situations. Pour 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 protger de toutes les situations que vous pourriez rencontrer avec d'autres bases de donnes transactionnelles. De toute manire, il est bon d'avoir des sauvegardes, indpendamment de la base que vous utilisez. La mthode transactionnelle a ses avantages et ses inconvnients. De nombreux utilisateurs et dveloppeurs d'applications dpendent de la facilit de pallier un problme lorsqu'une annulation semble ncessaire ou presque. Cependant, mme si vous tes nophyte des oprations atomiques, ou plus familier avec les transactions, prenez en considration 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 optimises. Dans des situations o l'intgrit est de la plus grande importance, le serveur MySQL assure une intgrit du niveau des transactions, ou encore mieux avec les tables non transactionnelles. Si vous verrouillez les tables avec LOCK TABLES, toutes les modifications seront bloques jusqu' ce que la vrification d'intgrit 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 levs, sans que le client n'attende cette leve de verrou. See Section 13.1.4.2, Syntaxe de 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 donnes dans une table, aucun autre utilisateur ne peut interfrer avec votre opration, 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 errones. Voici quelques techniques pour travailler avec des tables non transactionnelles : Les boucles qui requirent les transactions peuvent normalement tre implmentes avec la commande LOCK TABLES, et vous n'avez nul besoin de curseur lorsque vous modifiez des lignes la vole. Pour viter d'utiliser l'annulation ROLLBACK, vous pouvez adopter la stratgie suivante : 1. Utilisez la commande LOCK TABLES ... pour verrouiller toutes les tables que vous voulez utiliser. 2. Testez vos conditions. 3. Modifiez si tout est correct. 4. Utilisez UNLOCK TABLES pour librer vos tables. Ceci est probablement une mthode 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 levs, mais certaines modifications peuvent ne pas avoir t excutes. Vous pouvez aussi utiliser des fonctions pour modifier des lignes en une seule opration. Vous pouvez crer une application trs efficace en utilisant cette technique :
29
Modifiez les champs par rapport leur valeur actuelle. Modifiez uniquement les champs que vous avez rellement chang. Par exemple, lorsque nous modifions les donnes d'un client, nous ne modifions que les donnes du client qui ont chang et nous vrifions uniquement si les donnes modifies ou les donnes qui en dpendent ont chang comparativement aux donnes originales. Les tests sur les donnes modifies sont faits avec la clause WHERE dans la commande UPDATE. Si la ligne a t modifie, nous indiquons au client : "Some of the data you have changed has been changed by another user". En franais : "certaines donnes que vous voulez modifier ont t modifies par un autre utilisateur". Puis nous affichons l'ancienne ligne et la nouvelle ligne, pour laisser l'utilisateur dcider quelle version il veut utiliser. Cela nous conduit un rsultat 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 trs efficace, et fonctionne mme 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 grer des identifiant uniques pour certaines tables. Ils peuvent tre grs bien plus efficacement en utilisant une colonne de type AUTO_INCREMENT, en corrlation avec la fonction LAST_INSERT_ID() ou la fonction C mysql_insert_id(). See Section 12.8.3, Fonctions d'informations . See Section 24.2.3.33, mysql_insert_id() . Vous pouvez viter le verrouillage de ligne. Certaines situations le requirent vraiment, mais elles sont rares. Les tables InnoDB supportent le verrouillage de ligne. Avec les tables MyISAM, vous pouvez utiliser une colonne de type smaphore, et faire ceci :
UPDATE tbl_name SET row_flag=1 WHERE id=ID;
MySQL retournera 1 pour le nombre de lignes affectes si la ligne a t trouve, car row_flag ne vaut pas dj 1 dans la ligne originale. Vous pouvez comprendre la requte 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;
En MySQL version 3.23.44 et plus rcentes, les tables InnoDB supportent les vrifications d'intgrit rfrentielles. See Chapitre 15, Le moteur de tables InnoDB. Pour les autres types de tables, le serveur mySQL accepte la syntaxe FOREIGN KEY dans la commande CREATE TABLE, mais ne la prend pas en compte. Pour les autres moteurs de stockage que InnoDB, MySQL analyse la clause FOREIGN KEY de la commande CREATE TABLE, mais ne l'utilise pas et ne la stocke pas. Dans le futur, l'implmentation va stocker cette information dans le fichier de spcifications de tables, pour qu'elle puisse tre lue par mysqldump et ODBC. Ultrieurement, les contraintes de cl trangres seront incluses dans les tables MyISAM. Voici des avantages aux contraintes de cls trangres : En supposant que les relations soient proprement conues, les cls trangres rendent plus difficile pour un programmeur d'insrer des valeurs incohrentes dans la base. La vrification centralise de contraintes par le serveur de base de donnes rend inutiles l'application de ces vrifications du cot de l'application. Cela limine la possibilit que d'autres applications ne fassent pas les vrifications de la mme faon que les autres. L'utilisation des modifications et effacement en cascade simplifie le code du client. Les rgles de cls trangres proprement conues aident la documentation des relations entre les tables. Gardez bien en tte que ces avantages ont un cot suprieur pour le serveur de bases, qui doit effectuer les tests. Les vrifications supplmentaires affectent les performances, ce qui est parfois suffisamment rebutant pour des applications qui les viteront. Certaines applications commerciales ont plac la logique de vrification dans l'application, pour cette raison. MySQL donne aux dveloppeurs de bases de donnes le choix de leur approche. Si vous n'avez pas besoin des cls trangres, et que vous voulez viter leur surcot, vous pouvez choisir un autre type de table, comme MyISAM. Par exemple, les tables MyISAM sont extrmement rapides pour les applications qui font essentiellement des oprations INSERT et SELECT, car elles peuvent tre utilises simultanment. See Section 7.3.2, Problme de verrouillage de tables . Si vous dcidez de ne pas tirer avantage des contraintes d'intgrit, vous devez garder en tte ces conseils : En l'absence de vrification du cot du serveur, l'application doit se charger de ces vrifications. Par exemple, elle doit s'assurer que les lignes sont insres dans le bon ordre, et que les lignes ne sont pas orphelines. Il faut aussi pouvoir rattraper une erreur au milieu d'une opration multiple. Si la clause ON DELETE est la seule fonctionnalit ncessaire, notez que depuis MySQL version 4.0, vous pouvez utiliser des commandes DELETE multi-tables pour effacer les lignes dans plusieurs tables en une seule commande. See Section 13.1.1, Syntaxe de DELETE . Un palliatif au manque de ON DELETE est d'ajouter la commande DELETE approprie lorsque vous effacez des lignes dans une table qui dispose d'une cl trangre. En pratique, c'est souvent plus rapide que d'utiliser les cls trangres, et c'est plus portable. Soyez conscient que l'utilisation des cls trangres dans certaines circonstances peuvent conduire des problmes : Les cls trangres rglent des problmes de cohrence, mais il est ncessaire de concevoir les contraintes correctement, pour viter les contraintes circulaires, ou des cascades d'effacements incorrects. Il n'est pas exceptionnel pour un administrateur de crer une topologie de relations qui rende difficile la restauration de bases partir d'une sauvegarde. MySQL rsout ce problme en vous permettant de dsactiver temporairement les contraintes. See Section 15.7.4, Contraintes de cls trangres
31
FOREIGN KEY . Depuis MySQL 4.1.1, mysqldump gnre un fichier d'export qui exploite cette possibilit de dsactivation automatique l'import. Notez que les cls trangres SQL sont utilises pour assurer la cohrence des donnes, et non pas pour joindre des tables. Si vous voulez obtenir des rsultats de tables multiples dans une commande SELECT, vous devez le faire avec une jointure :
SELECT * FROM t1, t2 WHERE t1.id = t2.id;
See Section 13.1.7.1, Syntaxe de JOIN . See Section 3.6.6, Utiliser les clefs trangres . La syntaxe FOREIGN KEY sans ON DELETE ... est souvent utilise par les applications ODBC pour produire automatiquement des clauses WHERE.
credit--1 est une expression lgale en SQL mais -- est interprt comme un commentaire et la fin de l'expression est ignore. Le rsultat est que la commande prend une signification compltement diffrente :
UPDATE account SET credit=credit
La commande ne produit aucun changement! Cela montre que l'utilisation des commentaires de type '--' peuvent avoir des consquences graves. En utilisant notre implmentation des commentaires avec le serveur MySQL version 3.23.3 et plus rcent, 1-- ceci est un commentaire ne pose pas ce type de problme.
32
Une autre fonctionnalit supplmentaire est que le client en ligne de commande mysql supprime toutes les lignes qui commencent par '--'. Les informations suivantes sont destines aux utilisateurs de MySQL avec des versions antrieures 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 l'utilitaire replace pour assurer la conversion en caractres # :
shell> replace " --" " #" < text-file-with-funny-comments.sql \ | mysql database
au lieu du classique :
shell> mysql database < text-file-with-funny-comments.sql
Vous pouvez aussi diter le fichier de commande ``lui-mme'' pour remplacer les commentaires '--' par des commentaires # :
shell> replace " --" " #" -- text-file-with-funny-comments.sql
33
Si vous insrez une valeur ``invalide'' dans une colonne, comme NULL dans une colonne NOT NULL, ou une valeur numrique trop grand dans une colonne numrique, MySQL inscrit dans la colonne la ``meilleure valeur possible'', sans produire d'erreur : Si vous stockez un chiffre hors de l'intervalle de validit d'une colonne numrique, MySQL stocke la place zro, la plus petite valeur possible, ou bien la plus grande valeur possible. Pour les chanes, MySQL stocke la chane vide ou bien la plus grande chane qui peut tre stocke dans cette colonne. Si vous essayez de stocker une chane qui ne commence pas par un chiffre dans une colonne numrique, MySQL stocke 0. Si vous essayez de stocker NULL dans une colonne qui n'accepte pas la valeur NULL, MySQL stocke 0 ou '' (la chane vide). Ce dernier comportement peut, pour des insertions de ligne unique, tre modifi par l'option de compilation -DDONT_USE_DEFAULT_FIELDS. See Section 2.4.2, Options habituelles de configure . Cela fait que les commandes INSERT gnreront une erreur moins que vous ne spcifiez explicitement les valeurs pour toutes les colonnes qui requirent une valeur non-NULL. MySQL vous permet de stocker des dates incorrectes dans les colonnes de type DATE et DATETIME (comme '2000-02-31' ou '2000-02-00'). L'ide est que ce n'est pas le travail du serveur SQL de valider les dates. Si MySQL peut stocker une valeur et relire exactement la mme valeur, MySQL la stockera. Si la date est totalement errone (hors de l'intervalle de validit), la valeur spciale '0000-00-00' est stocke dans la colonne. La raison de cette rgle ci-dessus est que nous ne pouvons pas vrifier ces conditions avant que la requte ne soit excute. Si nous rencontrons un problme aprs la modification de quelques lignes, nous ne pourront pas annuler la modification, car la table ne le supporte peut-tre pas. L'alternative qui consiste s'arrter c'est pas envisageable non plus, car nous aurions alors fait la moiti du travail, ce qui sera alors le pire scnario. Dans ce cas, il vaut mieux faire "du mieux possible", et continuer comme si rien n'tait arriv. En MySQL 5.0, nous envisageons d'amliorer cela en fournissant des alertes de conversions automatique, ainsi qu'une option pour vous permettre d'annuler la commande si elle n'utilise que des tables transactionnelles. Ceci signifie qu'il ne faut pas compter sur MySQL pour vrifier le contenu des champs, mais de grer cela au niveau de l'application.
34
SELECT MAX(key_column) FROM t1,t2,t3... o l'une des tables est vide ne retourne pas NULL mais plutt le valeur maximale de la colonne. Corrig en 4.0.11. DELETE FROM heap_table sans clause WHERE ne fonctionne pas sur une table HEAP.
MySQL accepte les parenthses dans la clause FROM, mais les ignore silencieusement. La raison de l'absence d'erreur est que de nombreux clients qui gnrent des requtes, ajoutent les parenthses dans la clause FROM mme si elles sont inutiles. Concatner plusieurs RIGHT JOINS ou combiner des jointures LEFT et RIGHT dans la mme requte ne donnera pas de rsultat correct si MySQL ne gnre que des lignes NULL pour la table
35
prcdent le LEFT ou avant la jointure RIGHT. Cela sera corrig en 5.0, en mme temps que le support des parenthses pour la clause FROM. N'excutez pas de commande ALTER TABLE sur une table BDB sur laquelle vous avez excut des transactions plusieurs commandes, jusqu' ce que ces transactions soient acheves : la transaction sera probablement ignore. ANALYZE TABLE, OPTIMIZE TABLE et REPAIR TABLE peuvent causer des problmes 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 accder la base si vous n'utilisez pas l'option -A, ou si vous utilisez la commande rehash. C'est particulirement vrai si vous n'avez pas de cache de table important. La rplication utilise un log de niveau requte : le matre crit les requtes excutes dans le log binaire. C'est une mthode de log rapide, compacte et efficace, qui fonctionne la perfection dans la plupart des situations. Mme si nous n'avons jamais vu d'occurrence de ce problme, il est thoriquement possible pour les donnes du matre et de l'esclave de diffrer si une requte nondterministe est utilise pour modifier les donnes, c'est dire si elle est laiss au bon vouloir de l'optimiseur, ce qui n'est pas une bonne pratique mme sans la rplication. Par exemple : Des commandes CREATE ... SELECT ou INSERT ... SELECT qui insrent zro ou NULL valeurs dans la colonne AUTO_INCREMENT. DELETE si vous effacez des lignes dans une table qui a une proprit ON DELETE CASCADE. Les commandes REPLACE ... SELECT, INSERT IGNORE ... SELECT, si vous avez des cls en double, dans les donnes insres. IF et seulement si ces requtes n'ont pas de clause ORDER BY, qui garantisse un ordre dterministe. Effectivement, par exemple, pour les commandes INSERT ... SELECT sans clause ORDER BY, le SELECT peut retourner les lignes dans un ordre diffrent, ce qui aura pour rsultat de donner des rangs diffrents et donnera des numros d'identifiants diffrents aux colonnes auto_increment), en fonction des choix fait par les optimiseurs du matre et de l'esclave. Une requte sera optimise diffremment sur l'esclave et sur le matre si : Les fichiers utiliss par les deux requtes ne sont pas exactement les mmes. Par exemple, OPTIMIZE TABLE a t excut sur le matre et pas sur l'esclave (pour corriger cela, depuis MySQL 4.1.1, OPTIMIZE, ANALYZE et REPAIR sont aussi crits dans le log binaire). La table est stockes sur un moteur de stockage diffrent sur le matre et sur l'esclave : c'est possible d'utiliser des moteurs de tables diffrents. Par exemple, le matre utiliser InnoDB et l'esclave MyISAM, car l'esclave a moins d'espace disque. Les tailles de buffer MySQL (key_buffer_size, etc.) sont diffrentes sur le matre et sur l'esclave. Le matre et l'esclave utilisent des versions diffrentes de MySQL, et le code de l'optimiseur est diffrent entre ces versions. Ce problme peut aussi affecter la restauration de base, utilisant mysqlbinlog ou mysql. Le plus simple pour viter ces problmes dans tous les cas est d'ajouter toujours une clause ORDER BY aux requtes non-dterministe, pour s'assure que les lignes sont traites dans le mme ordre. Dans le futur, MySQL va ajouter automatiquement une clause ORDER BY si ncessaire.
36
Les problmes suivants sont connus et seront corrigs en leur temps : mysqlbinlog n'efface pas les fichiers temporaires laisss aprs une commande LOAD DATA INFILE. See Section 8.5, mysqlbinlog, Excuter des requtes dans le log binaire . Il n'est pas possible de renommer une table temporaire. Lors de l'utilisation de la fonction RPAD, ou de toute autre fonction de chane qui peut ajouter des espaces droite de la chane, dans une requte qui utilise une table temporaire pour la rsolution, alors toutes les chanes verront leurs espaces terminaux tre supprims. Voici un exemple d'une telle requte : SELECT RPAD(t1.field1, 50, ' ') AS f2, RPAD(t2.field2, 50, ' ') AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON t1.record=t2.joinID ORDER BY t2.record; Le rsultat final de ceci est que vous ne pourrez pas obtenir les espaces gauche dans ces chanes. Le comportement dcrit ci-dessus existe dans toutes les versions de MySQL. La raison cela est due au fait que les tables de type HEAP, qui sont utilises en premier comme table temporaires, ne sont pas capables de grer des colonnes de type VARCHAR. Ce comportement sera corrig dans l'une des versions de la srie des 4.1. A cause de la mthode de stockage des tables de dfinitions de fichiers, il n'est pas possible d'utiliser le caractre 255 (CHAR(255)) dans les noms des tables, colonnes ou numrations. Il est prvu de corriger de problme dans les versions version 5.1, lorsque nous aurons tabli un nouveau format de dfinition des fichiers. Lorsque vous utilisez la commande SET CHARACTER SET, il n'est pas possible d'utiliser les caractres 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 considrer ces valeurs comme diffrentes. 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 associes. Vous ne pouvez pas compiler le serveur dans un autre dossier lorsque vous utilisez les MITpthreads. Comme cela requiert une modification des MIT-pthreads, nous ne corrigerons pas ce problme. See Section 2.4.5, Notes relatives aux MIT-pthreads . Les valeurs de type BLOB ne peuvent pas tre utilises ``correctement'' dans les clauses GROUP BY ou ORDER BY ou DISTINCT. Seuls, les max_sort_length premiers octets (par dfaut, 1024) seront utiliss pour les comparaisons de BLOB. Ceci peut tre modifi avec l'option -O max_sort_length de mysqld. Un palliatif ce problme est d'utiliser une sous partie de chane : 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 prcision dpend alors de la fonction utilise. La rgle gnrale est que les fonctions de bits utilisent la prcision des BIGINT, IF et ELT() utilisent la prcision des BIGINT ou DOUBLE, et les autres utilisent la prcision des DOUBLE. Il faut donc viter d'utiliser les entiers non signs de grande taille, surtout s'ils dpassent la taille de 63 bits (9223372036854775807) pour toute autre fonction que les champs de bits ! La version 4.0 gre bien mieux les BIGINT que la 3.23. Toutes les colonnes de type chanes, hormis les BLOB et TEXT, voient automatiquement leurs caractres blancs finaux supprims. Pour le type CHAR c'est correct, et c'est considr comme
37
une fonctionnalit par la norme ANSI SQL92. Le hic est que pour le serveur MySQL les colonnes VARCHAR sont traites de la mme faon. Vous ne pouvez avoir que des colonnes de taille 255 pour les ENUM et SET. Avec les fonctions d'agrgation MIN(), MAX() et compagnie, MySQL compare actuellement les colonnes de type ENUM et SET par leur valeur de chane, plutt que par leur position relative dans l'ensemble. safe_mysqld redirige tous les messages de mysqld vers le log mysqld. Le problme est que si vous excutez mysqladmin refresh pour fermer et ouvrir nouveau l'historique, stdout et stderr sont toujours redirigs vers l'ancien log. Si vous utilisez --log, vous devriez diter safe_mysqld pour envoyer les messages vers 'hostname'.err au lieu de 'hostname'.log, de faon pouvoir facilement rcuprer la place de l'ancien log, en effaant les vieux, et en excutant mysqladmin refresh. Dans la commande UPDATE, les colonnes sont modifies de gauche droite. Si vous faite rfrence une colonne modifie, vous obtiendrez sa valeur modifie, plutt 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 mme requte. 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 utilises dans un rassemblement (MERGE). L'optimiseur peut grer la clause DISTINCT diffremment si vous utilisez des colonnes caches dans une jointure. Dans une jointure, les colonnes caches sont comptes comme une partie du rsultat (mme si elles ne sont pas montres), tandis que dans les requtes normales, les colonnes caches ne participent pas aux DISTINCT. Nous allons probablement modifier ceci dans le futur, pour ne jamais exploiter les colonnes caches 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_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC;
Dans le second cas, MySQL 3.23.x pourrait vous donner deux lignes identiques dans le rsultat (car les lignes caches id diffrent). Notez que cela n'arrive que pour les requtes o vous n'avez pas de colonnes de la clause ORDER BY dans le rsultat, 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 diffrents avec MySQL d'avec d'autres serveurs SQL. C'est ncessaire pour s'assurer que MySQL n'a jamais besoin d'annuler une commande SQL. Cela peut sembler un peu trange au moment o les colonnes doivent tre vrifies par l'application, mais cela vous fournit une acclration notable, cause d'optimisations qui ne pourraient pas avoir lieu ailleurs.
38
Si 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 numrique, MySQL va stocker la plus petite ou la plus grande valeur qu'il connaisse dans cette colonne. Si vous essayez de stocker une chane qui ne commence pas par un chiffre dans une colonne numrique, 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 '' (chane vide) la place : ce comportement peut tre modifi avec l'option de compilation -DDONT_USE_DEFAULT_FIELDS). MySQL vous autorise le stockage de dates errones dans les colonnes de type DATE et DATETIME (comme 2000-02-31 ou 2000-02-00). L'ide 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 spciale 0000-00-00 sera utilise. Si vous utilisez une valeur non supporte avec une colonne de type ENUM, la valeur stocke sera la chane vide, de valeur numrique 0. Si vous utilisez une valeur invalide dans une colonne de type SET, la valeur sera ignore. Si vous excutez une PROCEDURE sur une requte qui retourne un rsultat vide, dans certains cas, PROCEDURE ne transformera pas les colonnes. La cration de table de type MERGE ne vrifie 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 gnrera des problmes lorsque vous essayerez d'exporter et d'importer des donnes. Comme solution temporaire, vous pouvez remplacer NaN par NULL (si possible) et -Inf et Inf par les valeurs maximales possibles des colonnes double. Si vous utilisez la commande ALTER TABLE pour ajouter un index de type UNIQUE un table utilise dans un rassemblement de tables MERGE, puis que vous utilisez ALTER TABLE pour ajouter un index normal la table MERGE, l'ordre des cls sera diffrent pour les tables s'il y avait dj une ancienne cl qui n'tait pas unique. Ceci est d au fait que ALTER TABLE place les cls UNIQUE avant les cls normales, pour tre capable de dtecter les cls 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 verrouilles par LOCK TABLES. Dans les cas suivants, vous pouvez obtenir un crash : Le gestionnaire d'insertions retardes a dj 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 mme cl, pouvait chouer car la mme cl tait utilise pour rechercher les lignes et la mme ligne pouvait tre trouve plusieurs fois :
UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;
Un palliatif est :
39
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 numriques taient traits comme des champs virgule fixe. Cela signifie que vous deviez spcifier le nombre de dcimales que le champ devait avoir. Tous les rsultats taient retourns avec le nombre correct de dcimales. Pour les bogues spcifiques aux systmes d'exploitation, voyez la section sur la compilation et le port. See Section 2.4, Installation de MySQL avec une distribution source . See Annexe D, Port vers d'autres systmes.
40
41
2.8.6. Notes relatives OS/2 ............................................................................................. 2.8.7. Notes relatives BeOS ........................................................................................... 2.9. Commentaires sur l'installation de Perl ................................................................................ 2.9.1. Installer Perl sur Unix .............................................................................................. 2.9.2. Installer ActiveState Perl sur Windows ...................................................................... 2.9.3. Problmes lors de l'utilisation des interfaces Perl DBI et DBD ..................................... Ce chapitre dcrit comment obtenir et installer MySQL : 1. Dterminez si votre plate-forme est supporte. Notez que tous les systmes ne supportent pas MySQL de la mme faon. MySQL est plus robuste et efficace que sur d'autres. Voyez Section 2.1.1, Systmes d'exploitation supports par MySQL pour plus de dtails.
2. Choisissez une distribution installer. Plusieurs versions de MySQL sont disponibles, dans plusieurs formats. Vous pouvez choisir une version prepare avec des excutables pr-compils, ou bien une version source. En cas de doute, utilisez la version binaire. Nous fournissons aussi un accs public notre serveur de dveloppement pour tester le nouveau code. Pour dterminer quelle version et quel type utiliser, voyez Section 2.1.2, Choisir votre version de MySQL . 3. Tlchargez la distribution que vous souhaitez. Pour une liste de site sur lesquels vous pouvez tlcharger MySQL, voyez Section 2.1.3, Comment obtenir MySQL ? . Vous pouvez vrifier l'intgrit de votre tlchargement en utilisant les instructions de Section 2.1.4, Vrifier l'intgrit des paquets avec MD5 ou GnuPG . 4. Installez la distribution. Pour les distributions binaires, voyez Section 2.3, Installer MySQL sur d'autres systmes type Linux . Pour les distributions source, utilisez Section 2.4, Installation de MySQL avec une distribution source . Chaque jeu d'instruction inclut une section spcifique aux plate-formes. Note : si vous envisagez de changer la version d'une installation existante de MySQL vers une nouvelle version, plutt que d'installer MySQL pour la premire fois, voyez la section Section 2.6, Changer de version de MySQL pour des informations sur les mises jour, et sur les problmes que vous pourriez rencontrer. Si vous rencontrez les problmes d'installation, voyez la section Section 2.8, Notes spcifiques aux systmes d'exploitation pour des informations sur les solutions aux proiblmes spcifiques des plates-formes. 5. Pour la procdure post-installation, voyez Section 2.5, Procdure de post-installation . Ces procdures s'appliquent aussi bien la distribution binaire que la distribution source. Cette section dcrit aussi comment scuriser les comptes initiaux MySQL, qui n'ont pas de mot de passe jusqu' ce que vous leur assigniez un. 6. Si vous voulez excuter des scripts de tests MySQL, le support Perl de MySQL doit tre disponible. See Section 2.9, Commentaires sur l'installation de Perl .
Nous utilisons GNU Autoconf, alors il est possible de porter MySQL sur tous les systmes modernes qui utilisent les threads Posix et un compilateur C++. Pour compiler uniquement le client, un compilateur C++ est simplement ncessaire. Nous utilisons et dveloppons le logiciel nous-mmes, en commenant par Sun Solaris (Versions 2.5 - 2.7) et SuSE Linux version 7.x. Notez que pour de nombreux systmes d'exploitation, le support natif des threads ne fonctionne qu'avec les dernires versions. MySQL a t compil avec succs sur les combinaisons systme d'exploitation/paquet de threads suivants : AIX 4.x, 5.x avec les threads natifs. See Section 2.8.5.3, Notes relatives IBM-AIX . Amiga. BSDI 2.x avec le paquet MIT-pthreads. See Section 2.8.4.5, Notes relatives aux versions 2.x de BSD/OS . BSDI 3.0, 3.1 et 4.x avec les threads natifs. See Section 2.8.4.5, Notes relatives aux versions 2.x de BSD/OS . DEC Unix 4.x avec les threads natifs. See Section 2.8.5.5, Notes pour Alpha-DEC-UNIX (Tru64) . FreeBSD 2.x avec le paquet MIT-pthreads. See Section 2.8.4.1, Notes relatives FreeBSD . FreeBSD 3.x et 4.x avec les threads natifs. See Section 2.8.4.1, Notes relatives FreeBSD . FreeBSD 4.x avec LinuxThreads. See Section 2.8.4.1, Notes relatives FreeBSD . HP-UX 10.20 avec les threads DCE ou avec le paquet MIT-pthreads. See Section 2.8.5.1, Notes relatives la version 10.20 de HP-UX . HP-UX 11.x avec les threads natifs See Section 2.8.5.2, HP-UX Version 11.x Notes . Linux 2.0+ avec LinuxThreads 0.7.1+ ou glibc 2.0.7+. See Section 2.8.1, Notes relatives Linux (toutes versions) . Mac OS X. See Section 2.8.2, Notes relatives Mac OS X . NetBSD 1.3/1.4 Intel et NetBSD 1.3 Alpha (requiert GNU make). See Section 2.8.4.2, Notes concernant NetBSD . Novell NetWare 6.0. See Section 2.2.14, Installer MySQL sur NetWare . OpenBSD > 2.5 avec les threads natifs. OpenBSD < 2.5 avec le paquet MIT-pthreads. See Section 2.8.4.3, Notes relatives OpenBSD 2.5 . OS/2 Warp 3, FixPack 29 et OS/2 Warp 4, FixPack 4. See Section 2.8.6, Notes relatives OS/2 . SCO OpenServer avec un port rcent du paquet FSU Pthreads. See Section 2.8.5.8, Notes sur SCO . SCO UnixWare 7.1.x. See Section 2.8.5.9, Notes sur SCO UnixWare Version 7.1.x . SGI Irix 6.x avec les threads natifs. See Section 2.8.5.7, Notes relatives SGI Irix . Solaris 2.5 et plus rcent, avec les threads natifs sur SPARC et x86. See Section 2.8.3, Notes pour Solaris . SunOS 4.x avec le paquet MIT-pthreads. See Section 2.8.3, Notes pour Solaris . Tru64 Unix
43
Windows 9x, Me, NT, 2000 et XP. See Section 2.2.1, Installer MySQL sous Windows . Notez que toutes les plates-formes ne sont pas quipes de la mme faon pour faire fonctionner MySQL. Les capacits d'une plate-forme pour supporter de fortes charges avec MySQL est dtermin par ceci : Stabilit gnrale de la bibliothque de threads. Une plate-forme qui a une excellente rputation en gnral, mais une bibliothque de threads instable, dont le code est utilis par MySQL, mme si le reste est parfait, fera de MySQL une application instable. La capacit du noyau et/ou de la bibliothque de threads de profiter des capacits multiprocesseurs, symtrique ou pas. En d'autres termes, lorsqu'un processus cre un thread, il doit tre possible pour ce thread de s'excuter sur diffrents processeurs. La capacit du noyau et/ou de la bibliothque de threads de faire fonctionner de nombreux threads qui posent et lvent des verrous mutex en peut de temps, frquemment, sans changement de contexte excessif. En d'autres termes, si l'implmentation de pthread_mutex_lock() est trop soucieux du temps CPU, cela va ralentir srieusement MySQL. Si ce problme n'est pas rgl, ajouter des processeurs supplmentaires va finalement ralentir MySQL. Performance et stabilit gnrale du systme de fichiers. La capacit du systme d'exploitation de grer 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 plateforme, vous pourront introduire des optimisations et des corrections spcifiques la plate-forme, et activ lors de la compilation. Nous pouvons aussi fournir des conseils judicieux pour configurer votre systme 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 succs sur cette plate-forme, avec des configurations similaires. Si ce nombre est grand, les chances de rencontrer un problme spcifique sont faibles. En se basant sur les critres prcdents, les meilleures plates-formes pour MySQL sont x86 avec SuSE Linux 7.1, noyau 2.4, et ReiserFS (ou toute autre distribution Linux similaire) et SPARC avec Solaris 2.7 ou 2.8. FreeBSD vient en troisime, mais nous esprons bien le voir rejoindre le groupe de tte, une fois que la bibliothque de threads sera amliore. Nous esprons aussi tre bientt capables d'ajouter les autres plates-formes sur laquelle MySQL compile, et fonctionne correctement, mais pas toujours le bon niveau de stabilit et de performances. Cela rclame des efforts de notre part, en coopration avec les dveloppeurs de ces plates-formes. Si vous tes intresss par l'amlioration de ces composants, et que vous tes en position pour influencer le dveloppement, demandez des instructions dtailles MySQL en envoyant un email aux listes internes. See Section 1.4.1.1, Les listes de diffusion de MySQL . Notez bien que la comparaison prcdente ne signifie pas qu'un systme d'exploitation est meilleur que l'autre, en gnral. Nous avons class les systmes en fonction de leur capacit faire fonctionner un systme MySQL, et nous nous limitons cette comparaison. Avec cela en tte, le rsultat de cette comparaison serait diffrent si nous y ajoutions d'autres problmes. 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 dcider quelle plate-forme choisir pour votre serveur MySQL.
44
45
Pour chaque modification mineure, le dernier nombre de la version est incrment. Lorsque les nouvelles fonctionnalits sont majeures, ou que des incompatibilits mineures apparaissent avec les anciennes versions, le deuxime chiffre est incrment. Lorsque le format de fichier change, le premier chiffre est incrment. Les noms de versions inclut aussi un suffixe qui indique le niveau de stabilit de la version. Une srie progresse avec diffrents suffixes, qui indique sa stabilit. 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 tre documents dans la section nouveauts. See Annexe C, Historique des changements MySQL. Il existe aussi de nouvelles commandes et extensions dans la plupart des versions alpha. Du dveloppement 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 ajoute. 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 prvoyons pas de nouvelle fonctionnalit qui pourrait corrompre d'anciennes commandes. gamma est une version bta qui existe depuis un certain temps et qui semble fonctionner correctement. Seulement des changements mineurs sont effectus. 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 diffrents sites avec aucun rapport de bogue autre que des bogues spcifiques une plate-forme. Seuls des corrections critiques sont appliques la publication. C'est ce que l'on appelle une version stable. MySQL utilise un schma de nommage qui est lgrement diffrent des autres produits. En gnral, il est plutt sr d'utiliser une des versions qui est disponible depuis quelques semaines, sans avoir t remplace par une nouvelle version de la mme srie. Toutes les versions de MySQL passent par nos tests et bancs d'essais standards pour nous assurer qu'elles peuvent tre utilises sans danger. Les sries de tests s'amliorent en permanence car les tests standards sont tendus dans le temps pour traquer tous les bogues prcdemment trouves. Notez bien que toutes les versions de MySQL ont t testes au moins avec : Une batterie de tests internes Le dossier mysql-test contient de nombreux cas de tests. Nous utilisons ces tests pour virtuellement tous les systmes d'exploitation. Voyez Section 27.1.2, Suite de test de MySQL pour plus d'informations sur ces fichiers. Les bancs de tests MySQL Ils effectuent une srie de requtes communes. C'est aussi un test pour savoir si le dernier processus d'optimisation rend le code plus rapide. See Section 7.1.4, La suite de tests MySQL . Le test crash-me Il tente de dterminer de quelles fonctionnalits disposent les bases de donnes et quelles en sont les limites. See Section 7.1.4, La suite de tests MySQL . Un autre test provient du fait que nous avons la version la plus rcente de MySQL dans notre propre environnement de production interne, sur au moins une machine. Nous avons plus de 100 Go de donnes manipuler.
46
forme. Les distributions binaires sont disponibles en format natif pour de nombreuses plates-formes, comme les paquets RPM de Linux ou les paquets DMG pour Mac OS X. Les distributions ont aussi disponibles sous formes d'archives Zip ou tar compresses. Les raisons de choisir une distribution binaires sont : Les distributions binaires sont gnralement plus faciles installer que les distributions source. Pour satisfaire diffrents niveaux de besoin, nous fournissons deux versions binaires : une version compile avec des moteurs de stockage non-transactionnels (petits et rapides), et une version compile avec les extensions les plus importantes, comme les transactions. Les deux versions sont compiles partir des mmes sources. Tous les clients natifs MySQL peuvent se connecter aux serveurs MySQL, quelque soit leur version. La distribution MySQL maximale est suffixe avec -max et est configure avec les mmes options que mysqld-max. See Section 5.1.2, mysqld-max, la version tendue du serveur mysqld . Si vous voulez installer le RPM MySQL-Max, vous devez commencer par installer le RPM MySQLserver. Dans certaines circonstances, il est prfrable d'installer MySQL partir de la distribution source : Vous voulez installer MySQL dans un dossier spcial. Les distributions standards sont ``prtes excuter'' depuis n'importe quel dossier, mais vous voudrez peut tre avoir plus de liberts pour dispatcher les composants de MySQL. Vous voulez configurer mysqld avec certaines extensions qui ne font pas parties des distributions binaires. Voici les extensions les plus courantes, que vous souhaiterez utiliser : --with-innodb (par dfaut pour MySQL 4.0 et plus rcent) --with-berkeley-db (disponible pour quelques plates-formes) --with-raid --with-libwrap --with-named-z-libs (disponible pour certains binaires) --with-debug[=full] Vous devez configurez mysqld sans certaines fonctionnalits qui font partie de la configuration standard. Par exemple, les distributions sont normalement compiles avec le support de tous les jeux de caractres. Si vous voulez rendre le serveur MySQL plus compact, vous pouvez recompiler MySQL avec uniquement les jeux de caractres dont vous avez besoin. Si vous avez un compilateur spcial, comme pgcc, ou que vous voulez utiliser des options particulires de votre compilateur pour optimiser MySQL pour votre architecture. Les distributions binaires sont compiles avec les options qui doivent fonctionner sur une large gamme de processeurs. Vous voulez utiliser les toutes dernires versions de MySQL, issues du serveur BitKeeper, pour avoir accs toutes les corrections de bugs archives. Par exemple, si vous avez dcouvert un bug, le correctif sera archiv dans le serveur de sources, et vous pourrez y accder l. Le correctif n'apparatra pas avant la prochaine publication de MySQL. Vous voulez lire et modifier le code C et C++ de MySQL. Pour cela, obtenez une distribution source, car le code source est toujours le code ultime. Les distributions sources contiennent plus de tests et d'exemples que les distributions binaires.
47
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 fonctionnalits qui seront utiles d'autres. Nous essayons aussi d'aider les utilisateurs dont les requtes sont faciles programmer. Nous prenons en considration tout ce que nos clients nous demandent, et nous accordons une attention particulire nos clients qui ont pris une licence e-mail tendue. Personne n'est oblig de tlcharger une nouvelle version. La sections News vous indiquera si la nouvelle version contient une fonctionnalit que vous attendez. See Annexe C, Historique des changements MySQL. Nous utilisons la politique suivante, lors de la mise jour de MySQL : Pour chaque modification mineure, le dernier numro de la chane de version est incrment. Lorsqu'il y a des nouvelles fonctionnalits importantes ou des incompatibilit mineures avec la version prcdente, nous incrmentons le chiffre du milieu. Lorsque le format de fichier change, le premier numro est incrment. Des versions tables et testes sont publies une deux fois dans l'anne, mais si de petits bogues apparaissent, une version qui ne va corriger que ces bogues sera publie. Des versions fonctionnelles avec des corrections de bogues pour les vieilles versions sont publies toutes les 1 8 semaines. Les distributions binaires de certaines plates-formes seront compiles par nos soins pour les versions majeures. D'autres personnes font des versions binaires pour d'autres systmes, mais probablement moins frquemment. Nous rendons gnralement public les correctifs, une fois que nous avons dcouverts de petits bogues. Ils sont posts sur le serveur de versions BitKeeper et seront ajouts la prochaine version. Si il y a un bogue fatal dans une version, nous publierons une nouvelle version aussitt que possible. Nous apprcions que les autres diteurs fasse la mme chose.
48
Nous crons aussi des cas de tests pour toutes les nouvelles fonctionnalits que nous voulons ajouter MySQL. Avant de commencer compiler une nouvelle version de MySQL, nous nous assurons que tous les bugs reproductibles pour les versions anciennes (3.23.x, 4.0.x, etc...) sont corrigs. Si le bug ne peut tre corrig (pour des raisons de choix de conception), nous le documentons dans le manuel. See Section 1.5.7, Erreurs connues, et limitations de MySQL . Nous compilons MySQL sur toutes les plates-formes pour lesquelles nous distribuons des paquets binaires (plus de 15 plates-formes ce jour), et nous excutons notre suite de tests et notre suite de performances sur chacune d'entre elles. Nous ne publions pas un paquet binaire sur une plate-forme pour laquelle la suite de test ou de performances choue. Si c'est une erreur gnrale, nous la corrigeons, et nous recommenons les tests sur toutes les plates-formes, partir de zro. Si nous recevons, durant le temps de compilation et de tests qui peut prendre deux trois jours, un rapport de bugs concernant un bug fatal (par exemple, un bogue qui cre un coredump), nous le corrigeons, et nous recommenons le processus de tests. Aprs avoir publi les paquets binaires sur http://www.mysql.com/, nous envoyons une annonce par email aux listes de diffusion. See Section 1.4.1.1, Les listes de diffusion de MySQL . Le message d'annonce contient une liste de toutes les changements de la version, et de tous les bugs connus. La section des problmes connus, known problems, dans les notes de publications n'a t utilis que dans quelques versions. Pour donner rapidement accs aux dernires fonctionnalits de MySQL, nous ralisons une publication de MySQL toutes les 4 5 semaines. http://downloads.mysql.com/snapshots.php. Si, aprs une publication, nous recevons des rapports de bugs qui prouvent qu'il y a, malgr tout, un bug critique dans une version spcifique une plate-forme, nous le corrigeons rapidement, et nous annonons une version 'a' pour la plate-forme. Grce notre large communaut d'utilisateurs, les problmes sont trouvs rapidement. Nos rsultats de bonne publication sont excellents. Dans les dernires 150 versions, nous avons d reprendre la compilation moins de 10 fois (dans trois des cas, le bug tait d glibc sur l'une de nos machines de tests, qu'il a t difficile de trouver.
49
enable-assembler --disable-shared --with-client-ldflags=-all-static -with-mysqld-ldflags=-all-static Linux 2.4.xx Intel Itanium 2 avec ecc (Intel C++ Itanium Compiler 7.0) : CC=ecc CFLAGS="-O2 -tpp2 -ip -nolib_inline" CXX=ecc CXXFLAGS="-O2 -tpp2 -ip -nolib_inline" ./configure --prefix=/usr/local/mysql --with-extracharsets=complex --enable-thread-safe-client --enable-local-infile Linux 2.4.xx Intel Itanium avec ecc (Intel C++ Itanium Compiler 7.0) : CC=ecc CFLAGS=-tpp1 CXX=ecc CXXFLAGS=-tpp1 ./configure --prefix=/usr/ local/mysql --with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile Linux 2.4.xx alpha avec ccc (Compaq C V6.2-505 / Compaq C++ V6.3-006) : CC=ccc CFLAGS="-fast -arch generic" CXX=cxx CXXFLAGS="-fast -arch generic -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --with-extracharsets=complex --enable-thread-safe-client --enable-local-infile --withmysqld-ldflags=-non_shared --with-client-ldflags=-non_shared --disableshared Linux 2.x.xx ppc avec gcc 2.95.4 : CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fnoomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./ configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enablethread-safe-client --enable-local-infile --disable-shared --with-embeddedserver --with-innodb Linux 2.4.xx s390 avec gcc 2.95.3 : CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex --enable-threadsafe-client --enable-local-infile --disable-shared --with-client-ldflags=all-static --with-mysqld-ldflags=-all-static Linux 2.4.xx x86_64 (AMD64) avec gcc 3.2.1 : CXX=gcc ./configure --prefix=/usr/local/mysql --with-extracharsets=complex --enable-thread-safe-client --enable-local-infile -disable-shared Sun Solaris 8 x86 avec gcc 3.2.3 : CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fnoomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./ configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enablethread-safe-client --enable-local-infile --disable-shared --with-innodb Sun Solaris 8 SPARC avec gcc 3.2 : CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fnoomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./ configure --prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile --enable-assembler --withnamed-z-libs=no --with-named-curses-libs=-lcurses --disable-shared Sun Solaris 8 SPARC 64-bit avec gcc 3.2 :
50
CC=gcc CFLAGS="-O3 -m64 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 m64 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fnortti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-assembler -with-named-z-libs=no --with-named-curses-libs=-lcurses --disable-shared Sun Solaris 9 SPARC avec gcc 2.95.3 : CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fnoomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./ configure --prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile --enable-assembler --withnamed-curses-libs=-lcurses --disable-shared Sun Solaris 9 SPARC avec cc-5.0 (Sun Forte 5.0) : CC=cc-5.0 CXX=CC ASFLAGS="-xarch=v9" CFLAGS="-Xa -xstrconst -mt -D_FORTEC_ -xarch=v9" CXXFLAGS="-noex -mt -D_FORTEC_ -xarch=v9" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex --enable-threadsafe-client --enable-local-infile --enable-assembler --with-named-zlibs=no --enable-thread-safe-client --disable-shared IBM AIX 4.3.2 ppc avec gcc 3.2.3 : CFLAGS="-O2 -mcpu=powerpc -Wa,-many " CXX=gcc CXXFLAGS="-O2 -mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions -fno-rtti" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex --enable-threadsafe-client --enable-local-infile --with-named-z-libs=no --disable-shared IBM AIX 4.3.3 ppc avec xlC_r (IBM Visual Age C/C++ 6.0) : CC=xlc_r CFLAGS="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192" CXX=xlC_r CXXFLAGS ="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192" ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data -libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enablethread-safe-client --enable-local-infile --with-named-z-libs=no --disableshared --with-innodb IBM AIX 5.1.0 ppc avec gcc 3.3 : CFLAGS="-O2 -mcpu=powerpc -Wa,-many" CXX=gcc CXXFLAGS="-O2 -mcpu=powerpc -Wa,-many -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --with-serversuffix="-pro" --enable-thread-safe-client --enable-local-infile --withnamed-z-libs=no --disable-shared IBM AIX 5.2.0 ppc avec xlC_r (IBM Visual Age C/C++ 6.0) : CC=xlc_r CFLAGS="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192" CXX=xlC_r CXXFLAGS="-ma -O2 -qstrict -qoptimize=2 -qmaxmem=8192" ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data -libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enablethread-safe-client --enable-local-infile --with-named-z-libs=no --disableshared --with-embedded-server --with-innodb HP-UX 10.20 pa-risc1.1 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
51
--enable-thread-safe-client --enable-local-infile --with-pthread --withnamed-thread-libs=-ldce --with-lib-ccflags=-fPIC --disable-shared HP-UX 11.00 pa-risc avec aCC (HP ANSI C++ B3910B A.03.50) : CC=cc CXX=aCC CFLAGS=+DAportable CXXFLAGS=+DAportable ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data -libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enablethread-safe-client --enable-local-infile --disable-shared --with-embeddedserver --with-innodb HP-UX 11.11 pa-risc2.0 64bit avec aCC (HP ANSI C++ B3910B A.03.33) : CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure --prefix=/usr/local/ mysql --with-extra-charsets=complex --enable-thread-safe-client --enablelocal-infile --disable-shared HP-UX 11.11 pa-risc2.0 32bit avec aCC (HP ANSI C++ B3910B A.03.33) : CC=cc CXX=aCC CFLAGS="+DAportable" CXXFLAGS="+DAportable" ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data -libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enablethread-safe-client --enable-local-infile --disable-shared --with-innodb HP-UX 11.22 ia64 64bit avec aCC (HP aC++/ANSI C B3910B A.05.50) : CC=cc CXX=aCC CFLAGS="+DD64 +DSitanium2" CXXFLAGS="+DD64 +DSitanium2" ./ configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin --with-extra-charsets=complex --enablethread-safe-client --enable-local-infile --disable-shared --with-embeddedserver --with-innodb Apple Mac OS X 10.2 powerpc avec gcc 3.1 : CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fnoomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./ configure --prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile --disable-shared FreeBSD 4.7 i386 avec gcc 2.95.4 : CFLAGS=-DHAVE_BROKEN_REALPATH ./configure --prefix=/usr/local/mysql -with-extra-charsets=complex --enable-thread-safe-client --enable-localinfile --enable-assembler --with-named-z-libs=not-used --disable-shared FreeBSD 4.7 i386 avec LinuxThreads et gcc 2.95.4 : CFLAGS="-DHAVE_BROKEN_REALPATH -D__USE_UNIX98 -D_REENTRANT D_THREAD_SAFE -I/usr/local/include/pthread/linuxthreads" CXXFLAGS="DHAVE_BROKEN_REALPATH -D__USE_UNIX98 -D_REENTRANT -D_THREAD_SAFE -I/usr/ local/include/pthread/linuxthreads" ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin --enable-thread-safe-client --enable-local-infile --enable-assembler -with-named-thread-libs="-DHAVE_GLIBC2_STYLE_GETHOSTBYNAME_R -D_THREAD_SAFE -I /usr/local/include/pthread/linuxthreads -L/usr/local/lib -llthread llgcc_r" --disable-shared --with-embedded-server --with-innodb QNX Neutrino 6.2.1 i386 avec gcc 2.95.3qnx-nto 20010315 : CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fnoomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./
52
configure --prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile --disable-shared Les paquets binaires suivants sont compils sur des systmes que des tiers prtent gracieusement MySQL AB. Notez que ces paquets sont fournis gracieusement. Comme MySQL AB n'a pas le contrle complet sur ces systmes, nous ne pouvons proposer qu'un support limit. SCO Unix 3.2v5.0.6 i386 avec gcc 2.95.3 : CFLAGS="-O3 -mpentium" LDFLAGS=-static CXX=gcc CXXFLAGS="-O3 -mpentium felide-constructors" ./configure --prefix=/usr/local/mysql --with-extracharsets=complex --enable-thread-safe-client --enable-local-infile --withnamed-z-libs=no --enable-thread-safe-client --disable-shared SCO OpenUnix 8.0.0 i386 avec CC 3.2 : CC=cc CFLAGS="-O" CXX=CC ./configure --prefix=/usr/local/mysql --withextra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-named-z-libs=no --enable-thread-safe-client --disable-shared Compaq Tru64 OSF/1 V5.1 732 alpha avec cc/cxx (Compaq C V6.3-029i / DIGITAL C++ V6.1-027) : CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed speculate all" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -fast -inline speed -speculate all -noexceptions -nortti" ./configure --prefix=/usr/ local/mysql --with-extra-charsets=complex --enable-thread-safe-client -enable-local-infile --with-prefix=/usr/local/mysql --with-named-threadlibs="-lpthread -lmach -lexc -lc" --disable-shared --with-mysqld-ldflags=all-static SGI Irix 6.5 IP32 avec gcc 3.0.1 : CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3 -fno-omit-framepointer -felide-constructors -fno-exceptions -fno-rtti" ./configure -prefix=/usr/local/mysql --with-extra-charsets=complex --enable-threadsafe-client --enable-local-infile --disable-shared FreeBSD/sparc64 5.0 avec gcc 3.2.1 : CFLAGS=-DHAVE_BROKEN_REALPATH ./configure --prefix=/usr/local/mysql -localstatedir=/usr/local/mysql/data --libexecdir=/usr/local/mysql/bin -with-extra-charsets=complex --enable-thread-safe-client --enable-localinfile --disable-shared --with-innodb Les options suivantes de compilations ont t utilises pour les paquets binaires de MySQL, qui taient fournis auparavant. Ces paquets ne sont plus mis jours, mais les options de compilation sont conserves ici pour mmoire. Linux 2.2.xx SPARC avec egcs 1.1.2 : CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fnoomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./ configure --prefix=/usr/local/mysql --with-extra-charsets=complex -enable-thread-safe-client --enable-local-infile --enable-assembler -disable-shared Linux 2.2.x avec x686 avec gcc 2.95.2 : CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felideconstructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/
53
mysql --enable-assembler --with-mysqld-ldflags=-all-static --disableshared --with-extra-charsets=complex 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 --enableassembler SunOS 5.5.1 (et plus rcents) sun4u avec egcs 1.0.3a or 2.90.27 or gcc 2.95.2 et plus rcents : CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fnoexceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-lowmemory --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 --withlow-memory --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 --withextra-charsets=complex BSDI BSD/OS 2.1 i386 avec gcc 2.7.2 : CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --withextra-charsets=complex AIX 2 4 avec gcc 2.7.2.2 : CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --withextra-charsets=complex Si vous avez des options plus optimales pour l'une des configurations prcdemment listes, vous pouvez toujours nous en faire part sur la liste de distribution des dveloppeurs. See Section 1.4.1.1, Les listes de diffusion de MySQL . Les distributions RPM antrieures la version 3.22 de MySQL sont fournies par nos utilisateurs. A partir de la version 3.22, les RPM sont gnrs par nous chez MySQL AB. Si vous voulez compiler une version de dbogage de MySQL, vous devez ajouter --with-debug ou --with-debug=full aux lignes de configurations prcdentes et effacer les options -fomitframe-pointer.
54
Signatures MD5 Signatures chiffres avec GnuPG, GNU Privacy Guard Pour les paquets RPM, le mcanisme de vrification d'intgrit intgr. Les sections suivantes dcrivent comment utiliser ces mthodes. Dans le cas o vous vous apercevez que la somme de contrle MD5 checksum ou la signature GPG ne correspond pas, essayez de tlcharger nouveau le mme paquet, ventuellement depuis un autre miroir. Si vous chouez plusieurs fois vrifier l'intgrit du paquet, faites nous part de votre problme, en incluant le nom complet du paquet dsir, et les sites de tlchargement que vous avez utilis. Envoyez nous un courriel l'adresse <webmaster@mysql.com> ou <build@mysql.com>.
Exemple :
shell> md5sum mysql-standard-4.0.17-pc-linux-i686.tar.gz 60f5fe969d61c8f82e4f7f62657e1f06 mysql-standard-4.0.17-pc-linux-i686.tar.gz
Ainsi, vous devez vrifier si la somme de contrle rsultante correspond celle qui est imprime sur la page de tlchargement, en dessous du paquet tlcharg. Notez que tous les systmes d'exploitation ne supportent pas la commande md5sum : sur certains, elle s'appelle simplement md5, sur d'autre, elle n'est pas du tout disponible. Sur Linux, elle a fait partie des utilitaires texte GNU (GNU Text Utilities), qui sont disponibles pour toute une gamme de plates-formes. Vous pouvez tlcharger le code source sur le site http://www.gnu.org/software/ textutils/. Si vous avez install OpenSSL, vous pouvez utiliser la commande openssl md5 <paquet> la place. Une implmentation DOS/Windows de la commande md5 est disponible sur le site http:// www.fourmilab.ch/md5/.
55
mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3 RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3 BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q7TXlTUUwgUGFj a2FnZSBzaWduaW5nIGtleSAod3d3Lm15c3FsLmNvbSkgPGJ1aWxkQG15c3FsLmNv bT6IXQQTEQIAHQUCPj6jDAUJCWYBgAULBwoDBAMVAwIDFgIBAheAAAoJEIxxjTtQ cuH1cY4AnilUwTXn8MatQOiG0a/bPxrvK/gCAJ4oinSNZRYTnblChwFaazt7PF3q zIhMBBMRAgAMBQI+PqPRBYMJZgC7AAoJEElQ4SqycpHyJOEAn1mxHijft00bKXvu cSo/pECUmppiAJ41M9MRVj5VcdH/KN/KjRtW6tHFPYhMBBMRAgAMBQI+QoIDBYMJ YiKJAAoJELb1zU3GuiQ/lpEAoIhpp6BozKI8p6eaabzF5MlJH58pAKCu/ROofK8J Eg2aLos+5zEYrB/LsrkCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWsEN/l xaZoJYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLmRDRi Rjd1DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hkAWzE 7zaD5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkbf4fm Le11EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHbuE5p /1oIDznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+Lwqq a8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSaf anFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOW I39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42Lmu QT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt92 6s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZ Whe70YGNPw1yjWJT1IhMBBgRAgAMBQI+PqMdBQkJZgGAAAoJEIxxjTtQcuH17p4A n3r1QpVC9yhnW2cSAjq+kr72GX0eAJ4295kl6NxYEuFApmr1+0uUq/SlsQ== =YJkx -----END PGP PUBLIC KEY BLOCK-----
Vous pouvez importer cette cl dans votre trousseau de cls publiques GPG avec la commande gpg --import. Par exemple, si vous avez sauv la cl dans un fichier appel mysql_pubkey.asc, la commande d'importation est :
shell> gpg --import mysql_pubkey.asc
Voyez la documentation GPG pour plus de dtails sur comment travailler avec les cls publiques. Une fois que vous avez tlcharg et import la cl publique, vous pouvez tlcharger le paquet MySQL et la signature qui lui est associe, sur la mme page. Le fichier de signature a pour extension .asc. Par exemple : Fichier de distribution Linux Fichier de signature mysql-standard-4.0.17-pc-linux-i686.tar.gz mysql-standard-4.0.17-pc-linux-i686.tar.gz.asc
Assurez-vous que les deux fichiers sont stocks dans le mme dossier, puis excutez la commande suivante pour vrifier la signature du fichier :
shell> gpg --verify <package>.asc
Exemple :
shell> gpg --verify mysql-standard-4.0.17-pc-linux-i686.tar.gz.asc gpg: Warning: using insecure memory! gpg: Signature made Mon 03 Feb 2003 08:50:39 PM MET using DSA key ID 5072E1F5 gpg: Good signature from "MySQL Package signing key (www.mysql.com) <build@mysql.com>"
La mention "Good signature" (bonne signature) indique que le paquet est correct.
56
Dispositions d'installation
Exemple :
shell> rpm --checksig MySQL-server-4.0.10-0.i386.rpm MySQL-server-4.0.10-0.i386.rpm: md5 gpg OK
Note : si vous utilisez RPM 4.1 et qu'il se plaint que (GPG) NOT OK (MISSING KEYS: GPG#5072e1f5) (mme si vous l'avez import dans votre trousseau de cl), vous devez alors importer la cl dans votre trousseau RPM d'abord. RPM 4.1 n'utilise pas votre trousseau de cl GPG (ni GPG lui-mme), car il entretient son propre trousseau de cl (car c'est une application de niveau systme, et que le trousseau de cl est spcifique chaque utilisateur). Pour importer la cl publique mysql_pubkey.asc MySQL dans votre trousseau de cls RPM, utilisez la commande suivante :
shell> rpm --import mysql_pubkey.asc
Les installations cre sur les distributions Linux RPM placent les fichiers dans les sous-dossiers suivants : Dossier /usr/bin /usr/sbin /var/lib/mysql /usr/share/doc/packages include lib /usr/share/mysql sql-bench Contenu du dossier Programmes clients serveur mysqld Fichiers de log et bases de donnes Documentation Fichiers d'inclusion (enttes) Bibliothques Fichiers de messages d'erreurs et jeux de caractres Suites de tests
Sous Unix, une archive tar avec la distribution binaire s'installe en la dsarchivant dans le dossier d'installation que vous voulez (typiquement le dossier /usr/local/mysql) et cre les dossiers suivants au mme endroit : Dossier bin data docs include Contenu du dossier Clients et serveur mysqld Fichiers de log et bases de donnes Documentation, historique Fichiers d'inclusion (enttes)
57
Une distribution source est installe aprs compilation. Par dfaut, les tapes d'installation installent les fichiers dans /usr/local, dans les sous-dossiers suivants : Dossier bin include/mysql info lib/mysql libexec share/mysql sql-bench var Contenu du dossier Programmes clients et scripts Fichiers d'inclusion (enttes) Documentation Bibliothques The serveur mysqld Fichiers de messages d'erreur Suites de tests Fichiers de log et bases de donnes
Dans le rpertoire d'installation, les dispositions d'une installation des sources diffre d'une installation binaire des faons suivantes : Le serveur mysqld est install dans le rpertoire libexec plutt que dans le rpertoire bin. Le rpertoire des donnes est var plutt que data. mysql_install_db est install dans le rpertoire /usr/local/bin plutt que dans /usr/ local/mysql/scripts. Le rpertoire des fichier d'entte et les rpertoires des bibliothques sont include/mysql et lib/ mysql au lieu de include et lib. Vous pouvez crer votre propre installation binaire partir d'une distribution de sources compiles en excutant le script scripts/make_binary_distribution.
58
5. Assignez des mots de passe aux comptes MySQL initiaux. MySQL pour Windows est disponible en deux formats : La distribution binaire, qui contient un programme d'installation, qui se charge de placer tout ce qui est ncessaire. La distribution source, qui contient tout le code et les fichiers de support pour compiler les excutables avec VC++ 6.0. En gnral, vous devriez utiliser la distribution binaire. Elle est plus facile installer, et vous n'avez besoin d'aucun autre outil pour faire fonctionner MySQL. Cette section dcrit comment installer MySQL sur Windows en utilisant la distribution binaire. Pour installer une distribution source, voyez Section 2.4.6, La distribution source Windows .
59
configuration. Ce paquet n'inclut pas l'installeur automatique, et doit tre manuellement install et configur. Le paquet Essentials Package est recommand pour la plupart des utilisateurs. Votre choix de paquet d'installation affecte le processus d'installation. Si vous choisissez les paquets Essentials Package ou Complete Packages, voyez Section 2.2.3, Installer MySQL avec l'assistant automatique . Si vous choisissez l'installation de MySQL avec le paquet Noinstall Archive, voyez Section 2.2.6, Installer MySQL partir d'une archive ZIP sans assistant .
60
61
de l'installeur fournit un rsum de l'opration, et vous donne l'occasion de lancer l'assistant de configuration de MySQL, qui vous servira crer un fichier de configuration, installer un service MySQL et mettre en place les scurits.
62
Cette approche rend plus simple la gestion et l'entretien des applications MySQL sur un systme Windows.
63
Si vous choisissez l'option Remove Instance, vous passez une fentre de confirmation. Cliquez sur le bouton d'excution, et l'assistant de configuration MySQL va arrter et supprimer le serveur MySQL, puis effacer le fichier my.ini. L'installation du serveur et le dossier de donnes data ne sont pas touchs. Si vous choisissez l'option Re-configure Instance, vous passez au dialogue de Configuration du type o vous pouvez choisir le type d'installation configurer.
64
Transactional Database Only : cette option active les deux moteurs InnoDB et MyISAM mais consacre plus de ressource InnoDB. Cette option est recommande pour les utilisateurs qui emploient exclusivement InnoDB, et trs rarement MyISAM. Non-Transactional Database Only : cette option dsactive compltement InnoDB et consacre toutes les ressources du serveur MyISAM. Cette option est recommande pour les utilisateurs qui n'emploient pas InnoDB.
65
Best Support For Multilingualism : choisissez cette option si vous voulez utiliser UTF8 comme jeu de caractres par dfaut. UTF8 peut stocker les caractres de trs nombreuses langues dans un mme jeu. Manual Selected Default Character Set / Collation : choisissez cette option si vous voulez choisir le jeu de caractres par dfaut manuellement. Choisissez le jeu de caractres souhait dans la liste fournie.
66
Une fois que l'assistant de configuration MySQL a termin, un rsum est affich. Cliquez sur le bouton Finish pour terminer avec l'assistant de configuration MySQL.
67
3. Choisissez un dossier d'installation. Traditionnellement, le serveur MySQL est install dans le dossier C:\mysql, et le nouvel assistant d'installation MySQL installe MySQL dans C:\Program Files\MySQL. Si vous n'installez pas MySQL dans C:\mysql, vous devez spcifier le chemin jusqu'au dossier d'installation durant le dmarrage, ou bien dans un fichier d'options. See Section 2.2.8, Crer un fichier d'options . 4. Extrayez l'archive d'installation dans le dossier d'installation, en utilisant votre outil de Zip prfr. Certains outils vont extraire l'archive dans un dossier du dossier que vous aurez dsign. Si cela arrive, il faudra dplacer le contenu de ce sous-dossier dans le dossier que vous souhaitez.
MySQL recherche les options en premier dans le fichier my.ini, puis dans le fichier my.cnf. Cependant, pour viter les confusions, il est mieux de n'utiliser qu'un seul fichier. Si votre PC utilise un boot loader o le volume C: n'est pas le disque de dmarrage, votre seule issue est d'utiliser le fichier my.ini. Quelque soit l'option que vous utiliser, le fichier d'option est un simple fichier texte. Vous pouvez aussi utiliser les fichiers d'options d'exemple inclus dans votre distribution MySQL. Regardez dans le dossier d'installation et recherchez des fichiers tels que my-small.cnf, mymedium.cnf, my-large.cnf, etc., quie vous pouvez copier ou renommer, et placer dans le chemin appropri pour avoir un fichier de configuration de base. Un fichier d'options peut tre cr est modifi par n'importe quel diteur de texte, tels que Notepad. Par exemple, si MySQL est install dans le dossier E:\mysql et que le dossier de donnest est situ dans E:\mydata\data, vous pouvez crer un fichier d'options et configurer la section [mysqld] pour spcifier les valeurs de basedir et datadir :
[mysqld] # set basedir to your installation path basedir=E:/mysql # set datadir to the location of your data directory datadir=E:/mydata/data
Notez que les noms de chemin Windows sont spcifis dans les options avec des slash, et non pas des anti-slash. Si vous utilisez des anti-slash, il faut les doubler :
[mysqld] # set basedir to your installation path basedir=E:\\mysql # set datadir to the location of your data directory
68
datadir=E:\\mydata\\data
Sur Windows, l'installeur MySQL place les donnes directement dans le dossier o vous installez MySQL. Si vous voulez utiliser un dossier de donnes diffrent, il faut copier l'intgralit du dossier data dans le nouveau chemin. Par dfaut, l'installeur place MySQL dans C:\mysql et le dossier de donnes dans C:\mysql\data. Si vous voulez utiliser le dossier E:\mydata, vous devez faire ceci : Dplacer le dossier de donnes depuis C:\mysql\data vers E:\mydata. Utilisez l'option --datadir pour spcifier le nouveau dossier de donnes, chaque fois que vous lancez le serveur.
Tous les serveurs prcdents sont optimiss pour les processeurs Intel modernes, mais ils fonctionneront sur toutes les architectures Intel de classe i386 et plus rcent. MySQL supporte TCP/IP sur toutes les plates-formes Windows. Les serveurs mysqld-nt et mysqlmax-nt supportent les pipes nomms sur NT, 2000 et XP. Cependant, par dfaut, MySQL utilise TCP/ IP quelque soit la plate-forme. Les pipes nomms sont plus lents que TCP/IP. Les pipes nomms sont sujets aux limitations suivantes : Depuis MySQL 3.23.50, les pipes nomms sont activs uniquement si vous lancez le serveur avec l'option --enable-named-pipe. Il est ncessaire d'utiliser explicitement cette option, car des utilisateurs ont rencontr des problmes lors de l'extinction du serveur MySQL, avec les pipes nomms. Les connexions par pipe nomms ne sont permises qu'avec mysqld-nt et mysqld-max-nt, et uniquement si le serveur fonctionne sur une version de Windows qui supporte les pipes nomms (NT, 2000, XP). Ces serveurs peuvent fonctionner avec Windows 98 et Me, mais ils requirent la pile TCP/IP; le pipes nomms seront ignors. Sur Windows 95, ces serveurs ne peuvent tre utiliss. Note : La plupart des exemples dans les prochaines sections, utilisent mysqld comme nom de serveur. Si vous choisissez un autre nom de serveur, comme mysqld-opt, assurez vous de bien faire les bons remplacements dans les commandes des exemples. Une bonne raison de choisir un nom de serveur diffrent est que mysqld contient le support complet du dbogage, il utilise plus de mmoire et fonctionne plus lentement que les autres serveurs Windows.
69
assurez vous que le support TCP/IP est install avant de lancer MYSQL. Vous pouvez trouver TCP/IP dans votre CD d'installation Windows. Notez que si vous utilisez une vieille version Windows 95 (par exemple, OSR2), il est probable que vous ayez un vieux paquet Winsock; MySQL requiert Winsock 2! Vous pouvez tlcharger un nouveau paquet Winsock sur http://www.microsoft.com/. Windows 98 dispose de la bibliothque Winsock 2, et il est donc inutile de la mettre jour. Sur les systmes NT, comme Windows NT, 2000 ou XP, les clients ont deux options. Soit utiliser TCP/ IP, soit les pipes nomms, si le serveur les supporte. Pour des informations sur quel serveur choisir, voyez Section 2.2.8.1, Choisir un serveur MySQL sur Windows . Cette section donne un aperu gnral du lancement du serveur MySQL. La section suivante fournit des informations spcifiques pour une version particulire de Windows. Les exemples de ces sections supposent que MySQL est install dans son dossier par dfaut : C: \mysql. Adaptez les noms de chemins si vous avez install MySQL ailleurs. Testez 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 problme. Assurez-vous d'tre dans le rpertoire o se situe le serveur, puis entrez cette commande :
C:\mysql\bin> mysqld --console
Lorsque le serveur finit sa squence de dmarrage, vous devriez voir une ligne comme celle-ci, qui indique que le serveur est fonctionnel, et attend les connexions :
mysqld: ready for connections Version: '4.0.14-log' socket: '' port: 3306
Le serveur va continuer crire dans la console les logs. Vous pouvez ouvrir une autre console pour utiliser un client. Si vous omettez l'option --console, le serveur va crire les logs dans un fichier du dossier de donnes (C:\mysql\data par dfaut). Le fichier d'erreurs est celui dont l'extension est .err. Les comptes initiaux, qui sont dans les tables de droits de MySQL n'ont pas de mot de passe. Aprs le dmarrage du serveur, vous devriez modifier leurs mots de passe avec les instructions de Section 2.5, Procdure de post-installation . Note : Les comptes sont lists dans les tables de droits MySQL qui n'ont pas de mot de passe initialement. Aprs avoir dmarr le serveur, il est recommand de les modifi, comme indiqu dans la documentation Section 2.5, Procdure de post-installation .
70
Le chemin utilis dans l'exemple prcdent dpend de votre installation de MySQL. Sur les versions non NT de Windows, cette commande lance mysqld en tche de fond. C'est dire qu'aprs le dmarrage du serveur, vous devriez retrouver votre invite de commande. Si vous lancez le serveur de cette manire sur Windows NT, 2000, XP ou 2003, le serveur va fonctionner en tche principale jusqu' ce que le serveur se termine. A cause de cela, il faudra ouvrir une autre console pour excuter le client. Vous pouvez arrter le serveur MySQL en excutant cette commande :
C:\> C:\Program Files\MySQL\MySQL Server 4.1\bin\mysqladmin -u root shutdown
Cela appelle l'utilitaire MySQL mysqladmin qui se connecte au serveur et lui indique de s'arrter. L'utilitaire se connecte en tant que root MySQL, qui est le compte d'administration par dfaut dans le systme de droits MySQL. Notez que les utilisateurs MySQL sont totalement indpendants des utilisateurs Windows. Si mysqld ne se lance pas, vrifiez le log d'erreur pour fois si le serveur y a inscrit un message pour indiquer la nature du problme. Le fichier d'erreur est rang dans le dossier C:\mysql\data. C'est le fichier qui porte le suffixe .err. Vous pouvez aussi essayer de lancer le serveur avec la commande mysqld --console; dans ce cas, vous pourrez lire la totalit des informations d'erreur directement l'cran. La dernire option est de lancer mysqld avec l'option --standalone --debug. Dans ce cas, mysqld crit un fichier de log dans le fichier C:\mysqld.trace qui contiendra la raison qui fait que mysqld ne se lance pas. See Section D.1.2, Crer un fichier de traage . Utilisez mysqld --verbose --help pour afficher toutes les options que mysqld comprend (Avant MySQL 4.1, omettez l'option --verbose.)
Elle appelle l'utilitaire MySQL mysqladmin, qui se connecte au serveur et l'arrte. La commande se connecte en tant que root, qui est le compte d'administration par dfaut. Notez que les utilisateurs du systme de droits MySQL sont totalement indpendant de ceux de Windows.
71
Si vous avez des problmes d'installation de mysqld en tant que service en utilisant simplement le nom du serveur, essayez d'utiliser le chemin complet :
C:\> C:\mysql\bin\mysqld --install
Depuis MySQL 4.0.2, vous pouvez spcifier un nom de service personnalis avec l'option --install. Depuis MySQL 4.0.3, vous pouvez spcifier en plus l'option --defaults-file aprs le nom du service, pour indiquer o le serveur doit lire les options au dmarrage. Les rgles qui dtermine le nom du service et le fichier d'options utiliser sont les suivantes : Si vous ne spcifiez pas de nom de service, le serveur utilise le nom de service par dfaut de MySQL et le serveur lit les options du groupe [mysqld] dans le fichier d'options standard. Si vous spcifiez un nom de service aprs l'option --install, le serveur va ignorer le groupe d'options [mysqld] et lire les options dans le groupe du mme nom que le nom du service. Le serveur lit ces options dans le fichier d'options standard. Si vous spcifiez une option --defaults-file aprs le nom du service, le serveur va ignorer les fichiers d'options standard et ne lire les options que dans le groupe [mysqld]. Note : avant MySQL 4.0.17, un serveur install comme service Windows avait des problmes se lancer si le chemin ou le nom du service contenait des espaces. Pour cette raison, vitez d'installer MySQL dans un dossier tel que C:\Program Files ou avec un nom qui contient des espaces. Dans le cas gnral o vous installez le serveur avec l'option --install mais sans nom de service, le serveur est install sous le nom de MySQL. Un exemple plus complexe : voyez la commande suivante, qui peut tre saisie sur une seule ligne :
C:\> C:\mysql\bin\mysqld --install mysql --defaults-file=C:\my-opts.cnf
Ici, le nom du service est donn aprs l'option --install. Si aucune option --defaults-file n'est donne, cette commande aurait pour effet de faire lire au serveur le groupe [mysql] dans les fichiers d'options standard. Cela est une mauvaise ide, car ce groupe d'options est aussi celui du client mysql. Cependant, comme l'option --defaults-file est prsente, le serveur lit les options uniquement dans le fichier indiqu, et uniquement dans le groupe d'options [mysqld]. Vous pouvez aussi spcifier les options comme ``Start parameters'' dans l'utilitaire Windows Services avant de lancer le service. Une fois que le serveur MySQL est install, Windows va lancer automatiquement le service lorsque Windows se lance. Le service peut aussi tre lanc immdiatement depuis l'utilitaire Services, ou avec la commande en ligne NET START MySQL. La commande NET n'est pas sensible la casse. Lorsqu'il fonctionne comme un service, mysqld n'a pas accs la console Windows, et aucune message n'apparatra la. Si mysqld ne dmarre pas, vrifiez dans le fichier d'erreurs si le serveur a inscrit des messages qui indiquent la cause du problme. Le fichier d'erreurs est situ dans le dossier C:\mysql\data. Il porte le suffixe .err. Lorsque mysqld fonctionne comme un service, il peut tre stopp par l'utilitaire Services, la commande NET STOP MySQL, ou la commande mysqladmin shutdown. Si le service fonctionne lors de l'extinction de Windows, ce dernier va stopper automatiquement le serveur. Depuis MySQL 3.23.44, vous avez le choix d'installer le serveur comme un service Manuel, si vous ne voulez pas que le serveur soit lanc automatiquement au lancement du serveur Windows. Pour cela, utilisez l'option --install-manual plutt que --install :
C:\> C:\mysql\bin\mysqld --install-manual
72
Pour supprimer un serveur qui a t install comme service, commencez par l'arrter s'il fonctionnait. Puis, utilisez l'option --remove pour le supprimer :
C:\> C:\mysql\bin\mysqld --remove
Pour les versions MySQL antrieure la 3.23.49, un problme avec l'arrt automatique rside dans le fait que Windows n'attend que quelques secondes avant l'extinction complte, et tue les processus si cette limite est dpasse. C'est la cause de problme potentiels (par exemple, le moteur InnoDB devra faire une restauration de base au prochain redmarrage). Depuis MySQL 3.23.49, Windows attend suffisamment longtemps pour que le serveur s'arrte. Si vous remarquez que ce n'est pas suffisant pour votre installation, il est plus prudent de ne pas faire tourner MySQL comme un service. Au lieu de cela, lancez-le en ligne de commande, et stoppez-le avec mysqladmin shutdown. L'augmentation du dlai d'attente de Windows fonctionne avec Windows 2000 et XP. Elle ne fonctionne pas pour Windows NT, o Windows attend 20s l'extinction d'un service. Vous pouvez augmenter cette valeur par dfaut en ouvrant la base de registres : \winnt \system32\regedt32.exe, et en ditant la valeur de WaitToKillServiceTimeout HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control. Spcifiez une nouvelle valeur plus grande, exprime en millisecondes. Par exemple, la valeur de 120000 indique Windows NT d'attendre 2 minutes (120 secondes). Si vous ne voulez pas lancer mysqld comme un service, vous pouvez le lancer en ligne de commande, comme vous le faites sur les versions qui ne sont pas Windows NT. Pour des instructions, voyez Section 2.2.9, Dmarrer MySQL depuis la ligne de commande Windows . Voyez Section 2.2.10.1, Rsolution de problmes d'installation de MySQL sous Windows si vous rencontrez des difficults durant l'installation.
Si mysqld est lent rpondre sur les connexions TCP/IP depuis les clients sur Windows 9x/Me, c'est qu'il y a vraisemblablement un problme sur vos DNS. Dans ce cas, lancez mysqld avec l'option -skip-name-resolve et utilisez uniquement le serveur localhost et les IP au format numrique dans la colonne Host des tables de droits de MySQL. Vous pouvez forcer un client MySQL utiliser les connexions de pipes nomms la place de TCP/ IP en spcifiant l'option --pipe ou en spcifiant un point . comme nom d'hte. Utilisez l'option --socket pour spcifier le nom du pipe. Depuis MySQL 4.1, vous pouvez utiliser l'option -protocol=PIPE. Il y a deux version des utilitaires de ligne de commande MySQL sous Windows : Binary mysql mysqlc Description Compil nativement sur Windows, avec des capacits limites d'dition de texte. Compil avec le compilateur Cygnus GNU et les bibliothques associes, qui offre les fonctionnalits d'dition de readline. mysqlc a t originellement prvu pour tre le principal outil avec Windows 9x/Me. Il ne supporte pas le nouveau protocole d'identification de MySQL 4.1, et il n'est pas support partir de MySQL 4.1. Depuis MySQL 4.1.8, il n'est plus inclus dans les distributions Windows de MySQL.
Pour utiliser mysqlc, vous devez avoir une copie de la bibliothque cygwinb19.dll installe l o mysqlc peut la trouver. Si votre distribution ne dispose pas de cygwinb19.dll dans le dossier
73
bin sous le dossier racine de MySQL, recherchez-la dans le dossier lib et copiez la dans le dossier systme de Windows (\Windows\system ou quivalent).
Ce message survient lorsque le serveur ne peut pas trouver la table de droits mysql ou d'autres fichiers critiques. Cette erreur survient lorsque la base de mysql ou le dossier de donnes est install dans un autre dossier que le dossier par dfaut : C:\mysql et C:\mysql\data, respectivement. Si vous avez install MySQL dans un autre dossier que C:\mysql, vous devez vous assurer que le serveur MySQL le sait grce son fichier de configuration, my.ini. Le fichier my.ini a besoin d'tre situ dans le dossier Windows, typiquement C:\WinNT ou C:\WINDOWS. Vous pouvez dterminer sa localisation exacte partir de la valeur de la variable d'environnement WINDIR, grce la commande suivante :
C:\> echo %WINDIR%
Un fichier d'option peut tre cr et modifi avec n'importe quel editeur de texte, tel que Notepad. Par exemple, si MySQL est install dans le dossier E:\mysql et que les donnes sont situes dans D: \MySQLdata, vous pouvez crer un fichier d'options avec une section [mysqld] pour spcifier la valeur du dossier de donnes et ses paramtres :
[mysqld] # set basedir to your installation path basedir=E:/mysql # set datadir to the location of your data directory datadir=D:/MySQLdata
Notez que les noms de chemins Windows sont spcifis en utilisant des slashes, plutt que des antislash. Si vous utilisez des anti-slash, vous devez les doubler :
[mysqld] # set basedir to your installation path basedir=C:\\Program Files\\mysql # set datadir to the location of your data directory datadir=D:\\MySQLdata
74
2. Cherchez un horaire dans la journe o l'utilisation du serveur est faible, et o une interruption de service est acceptable. 3. Prvenez les utilisateurs que vous allez interrompre le serveur. 4. Stoppez le serveur MySQL (par exemple, avec la commande NET STOP MySQL ou avec l'utilitaire de Services si vous utilisez MySQL sous forme de service, ou encore avec mysqladmin shutdown). 5. Quittez le programme WinMySQLAdmin, s'il fonctionnait. 6. Excutez les scripts d'installation de la distribution Windows, en cliquant sur le bouton "Install" dans WinZip et en suivant les instructions d'installation. Note importante : Les premires versions des distributions Windows de MySQL 4.1 n contenaient pas de programme d'installation. Voyez "Windows binary installation" pour les instructions d'installation d'une telle distribution. 7. Vous pouvez craser votre prcdente installation (gnralement installe dans C:\mysql), ou l'installer dans un nouveau dossier, comme C:\mysql4. Supprimer l'ancienne version est recommande. 8. Relancez le serveur (par exemple, avec NET START MySQL si vous utilisez MySQL comme un service, ou directement avec la commande mysqld). 9. Mettez jour les tables de droits. La procdure est dcrite dans la section Section 2.6.7, Mise jour des tables de droits . Situations possibles :
A system error has occurred. System error 1067 has occurred. The process terminated unexpectedly.
Cette erreur signifie que votre fichier d'options, qui est par dfaut C:\my.cnf, contient une option qui n'est pas reconnue par MySQL. Vous pouvez vrifier que c'est le cas en renommant le fichier my.cnf en my_cnf.old, pour viter que le serveur l'utilise. S'il dmarre correctement, il vous faut alors identifier la partie du fichier d'options cause le problme. Crez un nouveau fichier my.cnf, puis dplacez progressivement toutes les parties de l'ancien fichier d'options, en redmarrant le serveur entre deux copies : vous allez identifier coup sur le problme.
Lectures concurrentes MySQL dpends des fonctions pread() et pwrite() pour tre capable de mler des INSERT et des SELECT. Actuellement, nous utilisons les mutexes pour muler les fonctions pread()/pwrite(). Nous allons, long terme, remplacer ce niveau d'interface par une interface virtuelle de faon ce que nous puissions utiliser l'interface readfile()/writefile() de Windows NT/2000/XP pour gagner de la vitesse. L'implmentation 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 Windows NT/2000/XP que sur Unix. Blocking read MySQL utilise une lecture bloque pour chaque connexion. Cela signifie que : Une connexion ne sera pas dconnecte automatiquement aprs 8 heures d'inactivit, comme c'est le cas sous Unix. Si une connexion se bloque, il est impossible de la dtruire sans tuer MySQL. mysqladmin kill ne fonctionne pas sur une connexion endormie. mysqladmin shutdown ne peut pas s'excuter tant qu'il y a des connexions qui dorment. Nous envisageons de corriger ce problme, lorsque les dveloppeurs Windows auront fourni un palliatif. DROP DATABASE Vous ne pouvez pas dtruire une base qui est utilise par un autre thread. Interrompre MySQL depuis le gestionnaire de tches Vous ne pouvez pas tuer MySQL depuis le gestionnaire de tche 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 donns avec mme casse dans le nom (tout en majuscules, ou en minuscules). See Section 9.2.2, Sensibilit la casse pour les noms . Le caractre \ Les composants d'un chemin sont spars par le caractre \ sous Windows, qui est aussi le caractre de protection de MySQL. Si vous utilisez la commande LOAD DATA INFILE ou SELECT ... INTO OUTFILE, vous devez doubler le caractre \ :
mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;
Alternativement, vous pouvez utiliser les noms de fichiers au format Unix, avec le caractre / :
mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr; mysql> SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
Problmes avec les pipes Les pipes ne fonctionnent pas de manire fiables depuis la ligne de commande Windows. Si le pipe reoit un caractre ^Z / CHAR(24), Windows va croire qu'il atteint la fin du fichier et arrte le programme. C'est un problme, notamment lorsque vous essayez d'utiliser le log binaire de cette manire :
76
Si vous rencontrez un problme lors de l'utilisation du log, et que vous pensez que c'est cause du caractre ^Z / CHAR(24), vous pouvez utiliser le palliatif suivant :
mysqlbinlog binary-log-file --result-file=/tmp/bin.sql mysql --user=root --execute "source /tmp/bin.sql"
Cette dernire commande peut aussi tre utilise pour lire fiablement tout fichier SQL qui contient des donnes binaires. L'erreur Can't open named pipe 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 nomms sous NT, par dfaut. Pour viter cette erreur, vous devez utiliser l'option --host=localhost sur les nouveaux clients, ou bien crer le fichier d'options C:\my.cnf, qui contiendra les informations suivantes :
[client] host = localhost
Depuis la version 3.23.50, les pipes nomms sont les seuls activs si mysqld est dmarr avec -enable-named-pipe. Erreur Access denied for user Si vous rencontrez l'erreur Access denied for user: 'utilisateur@unknown' to database 'mysql' lors de l'accs au serveur MySQL sur la mme machine, cela signifie que MySQL ne peut rsoudre proprement votre nom d'hte. Pour corriger cela, vous devriez crer un fichier \windows\hosts dans l'information suivante :
127.0.0.1 localhost
ALTER TABLE Lorsque vous excutez la commande ALTER TABLE, la table est verrouill, empchant les autres threads d'y accder. 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 problme. DROP TABLE La commande DROP TABLE sur une table qui est utilise dans le cadre d'un MERGE ne fonctionne pas sous Windows, car le gestionnaire de MERGE garde la carte des tables cache de la couche suprieure de MySQL. Comme Windows ne vous autorise pas effacer des fichiers qui sont ouverts, vous devez d'abord vider de la mmoire toutes les tables du MERGE (avec la commande FLUSH TABLES) puis effacer la table MERGEavant d'effacer les tables. Nous allons corriger cela lorsque nous introduirons la notion de VIEWs. DATA DIRECTORY et INDEX DIRECTORY Les directives DATA DIRECTORY et INDEX DIRECTORY de CREATE TABLE sont ignores sous Windows, car Windows ne supporte pas les liens symboliques. Voici quelques problmes connus et pas encore corrigs, si jamais quelqu'un souhaite nous aider sur la version Windows : Ajouter des icnes pour le dmarrage et l'arrt de MySQL, dans l'installateur.
77
Il serait vraiment pratique de pouvoir arrter le processus mysqld depuis le gestionnaire de tches. 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'arrt des threads en court avec mysqladmin kill sous Windows. Ajouter des macros pour utiliser les mthodes rapides d'incrment/dcrment compatibles avec les threads, fourni par Windows.
78
MySQL-Max-VERSION.i386.rpm Le serveur MySQL Max. Ce serveur a des capacits supplmentaires par rapport au serveur MySQL-server. Vous devez installer le RPM MySQL-server d'abord, parce que le RPM MySQL-Max dpend de lui. MySQL-client-VERSION.i386.rpm Les programmes clients MySQL standards. Vous avez certainement besoin d'installer ce paquet. MySQL-bench-VERSION.i386.rpm Tests et bancs d'essai. Ncessite Perl et les modules RPM msql et mysql. MySQL-devel-VERSION.i386.rpm Bibliothques et fichiers d'inclusions dont vous aurez besoin pour compiler d'autres clients MySQL, tels que les modules Perl. MySQL-shared-VERSION.i386.rpm Ce paquet contient les bibliothques partages (libmysqlclient.so*) que certains langages et applications recherchent pour les charger dynamiquement, afin d'utiliser MySQL. MySQL-shared-compat-VERSION.i386.rpm Ce paquet inclut la bibliothque partage pour MySQL 3.23 et MySQL 4.0. Installez ce paquet au lieu de MySQL-shared, si vous avec des applications installe qui utilisent dynamiquement MySQL 3.23 mais que vous voulez passez MySQL 4.0 sans briser les dpendances. Ce paquet est disponible depuis MySQL 4.0.13. MySQL-embedded-VERSION.i386.rpm La bibliothque intgre MySQL (depuis MySQL 4.0). MySQL-VERSION.src.rpm Celui-ci contient le code source de tous les paquets prcdents. 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 prsents dans un paquet RPM, lancez :
shell> rpm -qpl MySQL-VERSION.i386.rpm
Les RPM fournissent une fonctionnalit qui permet de vrifier l'authenticit du paquet avant de l'installer. Si vous voulez en savoir plus sur cette fonctionnalit, voyez Section 2.1.4, Vrifier l'intgrit des paquets avec MD5 ou GnuPG . Le fichier RPM place les donnes dans /var/lib/mysql. Le RPM cre aussi les entres appropries dans /etc/rc.d/ pour lancer le serveur automatiquement au dmarrage. (Cela signifie que, si vous avez dj effectu une installation auparavant, vous pouvez avoir besoin de faire une sauvegarde de vos fichiers de dmarrage prcdents si vous les changez, de faon ne pas les perdre.) Voyez Section 2.5.2.2, Lancer et arrter MySQL automatiquement pour plus d'informations sur comment dmarrer automatiquement MySQL au lancement du serveur. 79
Si vous voulez installer le RPM MySQL sur une ancienne distribution MySQL, qui ne supporte pas les scripts d'initialisation de /etc/init.d (directement ou via un lien symbolique), vous devez crer un lien symbolique qui pointe sur le dossier o les scripts d'initialisation sont installs. Par exemple, si ce dossier est /etc/rc.d/init.d, utilisez une de ces commandes avant d'installer le RPM, pour crer / etc/init.d sous forme de lien symbolique, qui pointe ici :
shell> cd /etc; ln -s rc.d/init.d .
Cependant, toutes les distributions Linux courantes doivent supporter le nouveau dossier /etc/ init.d, car c'est impos par la compatibilit LSB (Linux Standard Base). Si les fichiers RPM que vous installez incluent MySQL-server, le dmon mysqld devrait fonctionner aprs l'installation. Vous devriez tre capable d'utiliser MySQL immdiatement. Si quelque chose cloche, vous pouvez trouver plus d'information dans le chapitre d'installation binaire. See Section 2.3, Installer MySQL sur d'autres systmes type Linux . Note : Les comptes qui sont lists dans les tables de droits MySQL initiales n'ont pas de mot de passe. Aprs dmarrage du serveur, il est recommand de configurer ces mots de passe, en suivant les instructions de la section Section 2.5, Procdure de post-installation .
dans le dialogue de slection du disque de destination. Si cette erreur survient, cliquez sur le bouton de retour (Go Back) pour retourner l'cran prcdent. Puis, cliquez sur le bouton d'avance (Continue) pour passer nouveau la page de slection des disques. Nous avons indiqu ce bug Apple, qui travaille sur le sujet. Le paquet Mac OS X de MySQL va s'installer lui-mme dans le dossier /usr/local/mysqlVERSION et va aussi ajouter un lien symbolique /usr/local/mysql, qui pointe sur le nouveau dossier. Si un dossier appel /usr/local/mysql existe dj, il sera renomm en /usr/ local/mysql.bak. De plus, il va installer les tables de droits MySQL en excutant le script mysql_install_db aprs l'installation. Le schma d'installation est semblable celui de la distribution binaire, tous les programmes MySQL sont situs dans le dossier /usr/local/mysql/bin. Les sockets MySQL sont installes dans le fichier /etc/mysql.sock par dfaut. See Section 2.1.5, Dispositions d'installation . L'installation requiert un compte nomm mysql (qui existe par dfaut en Mac OS X 10.2 et plus rcent). Si vous utilisez Mac OS X Server, vous devez avoir dj une version de MySQL installe :
80
Cette section du manuel couvre l'installation du paquet binaire MySQL pour Mac OS X uniquement. Assurez vous de bien lire l'aide d'Apple concernant l'installation de MySQL (Lancer le visualiseur d'aide, slectionnez la rubrique "Serveur Mac OS X", et faites une recherche sur "MySQL", puis lisez l'entre appele "Installing MySQL"). Notez bien que la version pre-installe de MySQL sur Mac OS X Server peut tre lance avec la commande safe_mysqld au lieu de mysqld_safe! Si vous avez utilis auparavant les paquets MySQL de Marc Liyanage pour Mac OS X, depuis le site de http://www.entropy.ch, vous pouvez simplement suivre le processus de mise jour, en utilisant les conseils de ses pages. Si vous faites une mise jour depuis les versions de Marc, ou depuis une ancienne version de MySQL pour Mac OS X Server, avec le nouveau paquet officiel, vous devrez convertir les tables de droits. See Section 2.6.3, Passer de la version 3.23 la version 4.0 . Si vous voulez lancer automatiquement MySQL au dmarrage du systme, vous devez aussi installer le MySQL Startup Item. Depuis MySQL 4.0.15, il fait partie du disque d'installation MySQL pour Mac OS X dans un paquet spar. Il suffit de double-cliquer sur l'icne MySQLStartupItem.pkg et de suivre les instructions pour l'installer. Notez que le MySQL Startup Item ne doit tre install qu'une seule fois. Il n'y a pas besoin de me mettre jour avec les versions de MySQL. Le MySQL Startup Item est install dans le dossier /Library/StartupItems/MySQLCOM. (Avant MySQL 4.1.2, le dossier tait /Library/StartupItems/MySQL, mais cela crait un conflit avec le MySQL Startup Item du serveur Mac OS X Server.) Il ajoute la variable MYSQLCOM=YES- au fichier de configuration /etc/hostconfig. Si vous voulez dsactiver le dmarrage automatique de MySQL, modifiez simplement la variable avec MYSQLCOM=-NO-. Sur Mac OS X Server, l'installation par dfaut de MySQL utilise la variable MYSQL dans /etc/ hostconfig. Le MySQL Startup Item dsactive cette variable en lui donnant la valeur de MYSQL=-NO-. Cela vite que des conflit de dmarrage surviennent, si la variable MYSQLCOM est utilise par MySQL Startup Item. Cependant, cela n'teint pas un serveur MySQL en fonctionnement. Aprs cette installation, vous pouvez lancer le serveur MySQL avec ces commandes, excutes dans terminal. Notez bien que vous devez avoir des droits d'administrateur pour cela! Si vous avez install le MySQL Startup Item :
shell> sudo /Library/StartupItems/MySQL/MySQL start (Enter your password, if necessary) (Press Control-D or enter "exit" to exit the shell)
Vous devez alors tre capable de vous connecter au serveur MySQL, notamment en excutant la commande /usr/local/mysql/bin/mysql.
81
Note : cette procdure ne configure aucun mot de passe pour les comptes MySQL. Aprs avoir suivi cette procdure, lisez la section Section 2.5, Procdure de post-installation , pour les instructions de post-installation et les tests. Vous pouvez faire cela avec les commandes suivantes :
/usr/local/mysql/bin/mysqladmin -u root password <password> /usr/local/mysql/bin/mysqladmin -u root -h `hostname` password <password>
Vous pouvez aussi ajouter des alias votre fichier de ressource Shell, pour accder mysql et mysqladmin depuis la ligne de commande :
alias mysql '/usr/local/mysql/bin/mysql' alias mysqladmin '/usr/local/mysql/bin/mysqladmin'
Alternativement, vous pouvez simplement ajouter /usr/local/mysql/bin votre variable d'environnement PATH, par exemple, en ajoutant la ligne suivante dans votre fichier $HOME/.tcshrc :
setenv PATH ${PATH}:/usr/local/mysql/bin
Si aucun fichier .tcshrc n'existe dans votre dossier d'utilisateur, crez le avec un diteur texte. Notez que l'installation d'un nouveau paquet MySQL ne supprimer pas le dossier d'une vieille installation : l'installeur de Mac OS X n'offre pas encore les fonctionnalits ncessaires pour mettre jour proprement une vieille version. Aprs avoir copi les fichiers de bases depuis votre ancien dossier vers le nouveau, et que vous avez russi redmarrer MySQL avec la nouvelle version, vous devriez pensez supprimer les vieilles versions des fichiers, situes dans /Library/Receipts/mysql-<version>.pkg.
2. Connectez vous sur le serveur depuis une machine cliente, avec un accs l'endroit o vous voulez installer MySQL.
82
3. Dcompressez l'archive binaire zip sur le serveur. Assurez-vous d'autoriser les chemins utiliss dans l'archive zip. Il est scuritaire d'utiliser le dossier SYS:\. Si vous mettez jour une ancienne installation, vous pouvez copier le dossier de donnes (par exemple, SYS:MYSQL\DATA), ainsi que my.cnf si vous l'avez modifi. Vous pouvez alors effacer l'ancienne copie de MySQL. 4. Vous pouvez renommer le dossier avec un nom plus cohrent, et facile utiliser. Nous recommandons d'utiliser SYS:MYSQL; les exemples du manuel feront rfrences ce dossier d'installation. 5. Depuis la console du serveur, ajoutez un chemin de recherche pour le dossier contenant les NLM MySQL. Par exemple :
SERVER: SEARCH ADD SYS:MYSQL\BIN
6. Installez la base de donnes initiale, si ncessaire, en excutant le script mysql_install_db depuis la console. 7. Lancez le serveur MySQL en utilisant le script mysqld_safe depuis la console. 8. Pour finir l'installation, vous devriez aussi installer les commandes suivantes dans le fichier autoexec.ncf. Par exemple, si votre installation MySQL est dans le dossier SYS:MYSQL et que vous voulez que MySQL se lance automatiquement, vous pouvez ajouter ces lignes :
#Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE
Si vous utilisez MySQL sur NetWare 6.0, nous vous recommandons fortement d'ajouter l'option -skip-external-locking la ligne de commande :
#Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE --skip-external-locking
Il est aussi ncessaire d'utiliser CHECK TABLE et REPAIR TABLE au lieu de myisamchk, car myisamchk utilise un verrouillage externe. Le verrouillage externe est reconnu pour poser des problmes sur NetWare 6.0; ce problme a t supprim sur NetWare 6.5. mysqld_safe sur NetWare fournit un cran de prsence. Lorsque vous dchargez (extinction) le NLM mysqld_safe, l'cran ne se ferme pas par dfaut. Au lieu de cela, il demande une action de l'utilisateur :
*<NLM has terminated; Press any key to close the screen>*
Si vous voulez que NetWare ferme automatiquement cet crant, utilisez l'option --autoclose de mysqld_safe. Par exemple :
#Starts the MySQL 4.0.x database server SEARCH ADD SYS:MYSQL\BIN MYSQLD_SAFE --autoclose
Le comportement de mysqld_safe sur NetWare est dcrit plus en dtails dans Section 5.1.3, safe_mysqld, le script pre de mysqld . S'il y avait une installation MySQL sur le serveur, assurez-vous de vrifier les commandes de dmarrage de MySQL dans autoexec.ncf, et ditez ou effacez les autant que ncessaire. Note : Les comptes qui sont stocks dans les tables de droits n'ont pas de mot de passe initial. Aprs avoir lanc le serveur, il est recommand de leur donner des mots de passe en suivant les instructions de la section Section 2.5, Procdure de post-installation .
83
Cette section couvre l'installation des distributions binaires de MySQL, qui sont fournies pour diffrentes plate-formes au format d'archive tar (les fichiers avec l'extension .tar.gz). Voyez Section 2.1.2.5, Binaires compils par MySQL AB pour une liste dtaille. Pour tlcharger une distribution source de MySQL, voyez Section 2.1.3, Comment obtenir MySQL ? . En plus de ces paquets gnriques, nous offrons aussi des compilations spcifiques pour certaines plate-formes. Voyez Section 2.2, Installation standard rapide de MySQL pour plus d'information sur leur installation. Vous avez besoin des utilitaires suivants pour installer une archive tar MySQL : GNU gunzip pour dcompresser la distribution. Un utilitaire tar raisonnable pour ouvrir l'archive. GNU tar est reconnu pour cette tche. Certains systmes d'exploitation disposent d'une version pr-installe de tar qui posent des problmes. Par exemple, Sun tar et Mac OS X tar ont des soucis avec les noms de fichiers longs. Dans ce cas, installez GNU tar. Sur Mac OS X, vous pouvez installer le logiciel pr-install gnutar. Si vous rencontrez des problmes, utilisez toujours mysqlbug pour poser des questions la liste MySQL. Mme si le problme n'est pas un bogue, mysqlbug rassemble des informations sur le systme qui nous aiderons rsoudre votre problme. Si vous n'utilisez pas mysqlbug, vous rduisez les chances de rsolution de votre problme. Vous trouverez mysqlbug dans le dossier bin aprs avoir dcompress la distribution. See Section 1.4.1.3, Comment rapporter un bogue ou un problme . Les commandes de base que vous devez excuter pour installer MySQL partir des sources sont :
shell> shell> shell> shell> shell> shell> shell> shell> shell> shell> shell> groupadd mysql useradd -g mysql mysql cd /usr/local gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf ln -s full-path-to-mysql-VERSION-OS mysql cd mysql scripts/mysql_install_db chown -R root . chown -R mysql data chgrp -R mysql . bin/mysqld_safe --user=mysql &
Pour les versions de MySQL plus ancienne que la 4.0, remplacez bin/safe_mysqld par bin/ mysqld_safe dans la commande finale. Note : cette procdure ne configure aucun mot de passe pour les comptes MySQL. Aprs avoir suivi cette procdure, lisez la section Section 2.5, Procdure de post-installation , pour les instructions de post-installation et les tests. Plus de dtails suivent. Pour installer une distribution binaire, suivez les tapes suivantes, puis reportez vous Section 2.5, Procdure de post-installation , pour la configuration post-installation et les tests : 1. 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 faon 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. 2. Choisissez le dossier dans lequel vous voulez dcompresser la distribution, et placez vous-y. Dans l'exemple suivant, nous allons dcompresser la distribution dans le dossier /usr/local. Les
84
instructions suivantes supposeront que vous avez les droits pour crer des dossiers de des fichiers dans /usr/local. Si ce dossier est protg, vous aurez besoin des droits de root pour faire l'installation.
shell> cd /usr/local
3. Tlchargez la distribution sur l'un des sites list sur Section 2.1.3, Comment obtenir MySQL ? . Les archives MySQL tar ont des noms de la forme mysql-VERSION-OS.tar.gz, o VERSION est le numro de version (par exemple, 4.0.17), et OS indique le systme d'exploitation de la distribution (par exemple, pc-linux-gnu-i586). Pour une version donne, les distributions binaires pour toutes les plate-formes sont compiles sur les mmes sources MySQL. 4. Dcompressez la distribution dans le rpertoire courant :
shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf shell> ln -s full-path-to-mysql-VERSION-OS mysql
La commande tar cre un dossier appel mysql-VERSION-OS. La commande ln cre un lien symbolique dans ce dossier. Cela vous laisse le moyen de transfrer facilement votre installation dans le dossier /usr/local/mysql. Avec GNU tar, il n'est pas ncessaire d'utiliser sparement gunzip. Vous pouvez remplacer la premire ligne par celle-ci pour dcompresser et ouvrir l'archive dans le mme temps :
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
Vous trouverez plusieurs fichiers et sous dossiers dans le dossier mysql. Le plus important pour l'installation sont les dossiers bin et scripts. bin Ce dossier contient les programmes clients et le serveur. Vous devez ajouter le chemin complet de ce dossier votre variable PATH pour que votre shell trouve MySQL facilement. See Annexe E, Variables d'environnement. scripts Ce dossier contient le script mysql_install_db, utilis pour initialiser la base mysql, qui contient les tables de droits du serveur. 6. Si vous n'avez jamais install MySQL auparavant, vous devez crer les tables de droits :
shell> scripts/mysql_install_db
Notez que pour les versions de MySQL plus anciennes que la version 3.22.10, mysql_install_db laisse le serveur fonctionner aprs avoir crer les tables. Ce n'est plus vrai : vous devez redmarrer le serveur aprs avoir excut ce script. 7. Changez le propritaire du binaire pour root et le propritaire des donnes pour l'utilisateur qui va faire tourner mysqld. En supposant que vous avez install les donnes dans le dossier /usr/ local/mysql, la commande est :
shell> chown -R root . shell> chown -R mysql data shell> chgrp -R mysql .
La premire commande change l'attribut owner du fichier pour root. La seconde change l'attribut owner du dossier de donnes pour l'utilisateur mysql. La troisime change l'attribut group pour le groupe mysql.
85
8. Si vous voulez que MySQL dmarre automatiquement aprs le dmarrage de votre serveur, vous pouvez copier le fichier support-files/mysql.server l o votre serveur recherche les scripts de dmarrage. Plus d'informations sur support-files/mysql.server sont disponibles dans Section 2.5.2.2, Lancer et arrter MySQL automatiquement . 9. Vous pouvez configurer de nouveaux comptes en utilisant le script bin/ mysql_setpermission si vous installez les modules Perl DBI et DBD::mysql. Pour des instructions, voyez Section 2.9, Commentaires sur l'installation de Perl .
10. Si vous voulez utiliser mysqlaccess et avoir accs la distribution MySQL dans un dossier nonstandard, vous devez modifier le chemin o mysqlaccess va rechercher le client mysql. Editez le script bin/mysqlaccess la ligne 18, environs. Recherchez une ligne qui ressemble ceci :
$MYSQL = '/usr/local/bin/mysql'; # path to mysql executable
Changez le dossier pour qu'il prenne la valeur que du chemin o mysql est situ. Si vous le le faite pas, vous allez recevoir une erreur Broken pipe lorsque vous utilisez mysqlaccess. Aprs que tout ait t ouvert et install, il faut tester votre distribution : Lancez le serveur MySQL avec les commandes suivantes :
shell> bin/mysqld_safe --user=mysql &
Pour les versions de MySQL plus ancienne que 4.0, remplacez bin/safe_mysqld par bin/ mysqld_safe dans la commande. Puis, passez Section 5.1.3, safe_mysqld, le script pre de mysqld , et Section 2.5, Procdure de post-installation . Note : cette procdure ne configure aucun mot de passe pour les comptes MySQL. Aprs avoir suivi cette procdure, lisez la section Section 2.5, Procdure de post-installation , pour les instructions de post-installation et les tests.
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 problmes, nous vous recommandons d'essayer GNU make 3.75 ou suprieur. Si vous utilisez une version rcente de gcc, suffisamment rcente pour reconnatre l'option -fnoexceptions, il est trs important que vous l'utilisiez. Sinon, vous risquez de compiler un binaire qui crashe alatoirement. Nous recommandons donc l'utilisation de -felide-constructors et -fnortti en mme 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 systmes, il en rsultera un binaire rapide et stable. Si vous rencontrez des problmes, utilisez toujours mysqlbug pour poster des questions sur les listes internes. Mme si le problme n'est pas un bogue, mysqlbug rassemble des informations sur le systme qui aidera les autres rsoudre votre problme. En n'utilisant pas mysqlbug, vous amoindrissez vos chances d'obtenir une solution votre problme ! Vous trouverez mysqlbug dans le rpertoire scripts aprs avoir dsarchiv la distribution. See Section 1.4.1.3, Comment rapporter un bogue ou un problme .
Pour les versions de MySQL 4.0 ou plus rcentes, remplacez bin/safe_mysqld par bin/ mysqld_safe dans la commande finale. Si vous commencez avec un paquet RPM, commencez comme ceci :
shell> rpm --rebuild --clean MySQL-VERSION.src.rpm
Cela va compiler un paquet RPM binaire que vous pouvez installer. Note : cette procdure ne configure aucun mot de passe pour les comptes MySQL. Aprs avoir suivi la procdure, passez la section Section 2.5, Procdure de post-installation , pour les instructions de post-installation et de tests. Une description plus dtaille suit. 1. Ajoutez un utilisateur et un groupe pour mysqld comme ceci :
shell> groupadd mysql shell> useradd -g mysql mysql
87
Ces commandes ajoute le groupe mysql et l'utilisateur mysql. La syntaxe de useradd et groupadd peut diffrer lgrement suivant votre version d'Unix. Elles peuvent aussi s'appeler adduser et addgroup. Vous pouvez donner un autre nom l'utilisateur et au groupe, la place de mysql. Si vous le fates, adaptez les commandes dans les prochaines instructions. 2. Choisissez un dossier dans lequel vous allez dcompresser les sources de MySQL. Rendez vous dans ce dossier. 3. Tlchargez une distribution sur un des sites lists sur Section 2.1.3, Comment obtenir MySQL ? . 4. Dcompressez la distribution dans le dossier courant :
shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -
Cette commande cre un dossier appel mysql-VERSION. Avec GNU tar, il n'est pas besoin de faire un appel spar gunzip. Vous pouvez utilise cette commande alternative pour dcompresser et extraire la distribution :
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
Notez qu'actuellement, vous devez configurer et compiler MySQL depuis la racine de la distribution. Vous ne pouvez pas la compiler ailleurs. 6. Configurer votre version et compilez le tout :
shell> ./configure --prefix=/usr/local/mysql shell> make
Lorsque vous excutez le code configure, vous pouvez aussi ajouter des options. Utilisez la commande ./configure --help pour avoir une liste des options disponibles. Section 2.4.2, Options habituelles de configure , prsente certaines options pratiques. Si configure choue et que vous allez envoyer un courriel aux listes MySQL pour demander de l'aide, ajouter surtout le contenu du fichier config.log qui vous semblent pertinentes. Incluez aussi les dernires lignes affiches par configure. Postez votre rapport de bug avec le script mysqlbug. See Section 1.4.1.3, Comment rapporter un bogue ou un problme . Si la compilation choue, voyez la section Section 2.4.4, Problmes de compilation? , pour avoir de l'aide immdiate sur les problmes les plus courants. 7. Installez la distribution :
shell> make install
Si vous voulez crire un fichier d'option, utilisez un des fichiers prsents dans le dossier supportfiles comme exemple. Par exemple,
shell> cp support-files/my-medium.cnf /etc/my.cnf
Il est possible que vous ayez xcuter certaines commandes en tant que root. Si vous voulez ajouter le support des tables InnoDB, vous devez diter le fichier /etc/my.cnf, supprimer le caractre # dans les lignes d'options qui commencent par innodb_..., et donnez ces options la valeur que vous souhaitez. Voyez Section 4.3.2, Fichier d'options my.cnf et Section 15.4, Configuration InnoDB .
88
9. Si vous n'avez jamais install MySQL auparavant, vous devez crer les tables de droits :
shell> bin/mysql_install_db
Si vous utilisez la commande en tant que root, il est recommand d'utiliser l'option --user prsente. La valeurde l'option doit tre le nom de l'utilisateur cr dans les premires tapes pour faire fonctionner le serveur. Si vous excutez la commande aprs vous tre connect sous cet utilisateur, vous pouvez omettre l'utilisation de l'option --user. Notez que pour les versions de MySQL plus anciennes que la version 3.22.10, mysql_install_db laisse le serveur en fonctionnement aprs avoir cr les tables. Ce n'est plus vrai. Vous devez dmarrer le serveur vous-mme aprs avoir fait les dernires tapes d'installation. 10. Changez le propritaire des xcutables pour les donner root et le propritaire des donnes por les donner mysqld. En supposant que vous tes dans le dossier d'installation, /usr/local/ mysql, la commande ressemble ceci :
shell> chown -R root . shell> chown -R mysql var shell> chgrp -R mysql .
La premire commande modifie l'attribut owner des fichiers pour les donner root user. La seconde donner les fichiers de donnes mysql. La troisime commande change le groupe group pour les donner au groupe mysql. 11. Si vous voulez que MySQL se lance automatiquement au dmarrage de votre serveur, vous pouvez copier le fichier support-files/mysql.server l ou votre systme cherche les fichiers de dmarrage. Plus d'informations sont disponibles dans le script support-files/ mysql.server et dans la section Section 2.5.2.2, Lancer et arrter MySQL automatiquement . 12. Vous pouvez crer de nouveaux comptes en utilisant le script bin/mysql_setpermission si vous avez install les modules Perl DBI et DBD::mysql. Pour les instructions, voyez Section 2.9, Commentaires sur l'installation de Perl .
Aprs avoir install tout, il est recommand d'initialiser et tester votre installation avec cette commande :
shell> /usr/local/mysql/bin/mysqld_safe --user=mysql &
Pour les versions de MySQL plus ancienne que 4.0, remplacez bin/safe_mysqld par bin/ mysqld_safe dans la commande. Si la commande choue immdiatement avec le message mysqld ended, vous pouvez trouver certaines informations dans le fichier mysql-data-directory/'hostname'.err. Plus d'informations sur mysqld_safe sont disponibles dans Section 5.1.3, safe_mysqld, le script pre de mysqld . Note : les comptes qui sont lists dans les tables de droits MySQL n'ont pas de mot de passe initial. Aprs le dmarrage du serveur, il est recommand de configurer les mots de passe en utilisant les instructions de Section 2.5, Procdure de post-installation .
89
Les options de configure les plus utilises sont dcrites ici : Pour ne compiler que les bibliothques 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 require C++). Dans ce cas, vous pouvez supprimer la partie de code dans configure qui vrifie l'existence d'un compilateur C++, puis excuter ./configure avec l'option --without-server. La compilation essaiera encore de construire mysql, mais vous pouvez ignorer les messages d'erreurs concernant mysql.cc. (Si make stoppe, essayez make -k pour dire de continuer mme si on rencontre des erreurs.) Si vous voulez obtenir une bibliothque MySQL intgre (libmysqld.a) vous devez utiliser l'option --with-embedded-server. Si vous ne voulez pas que vos fichiers de log et bases de donnes 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 premire change le prfixe de l'installation pour que tout soit install dans /usr/local/mysql au lieu de /usr/local par dfaut. La seconde commande prserve le prfixe d'installation par dfaut mais change le rpertoire par dfaut pour les bases de donnes (normalement /usr/ local/var) en /usr/local/mysql/data. Aprs que vous ayez compil MySQL, vous pouvez changer ces options dans les fichiers d'options. See Section 4.3.2, Fichier d'options my.cnf . Si vous utilisez Unix et que vous voulez que la socket de MySQL soit un autre endroit que celui par dfaut (normalement /tmp ou /var/run) utilisez une commande configure comme celle-ci :
shell> ./configure \ --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
Notez que le fichier donn doit avoir un chemin absolu ! Vous pourrez aussi changer le chemin vers mysql.sock plus tard en utilisant les fichiers d'options de MySQL. See Section A.4.5, Comment protger ou changer le fichier socket /tmp/mysql.sock . Si vous voulez compiler des programmes lis statiquement (par exemple, pour crer une distribution binaire, pour obtenir plus de vitesse, ou pour rsoudre des problmes avec quelques distributions RedHat Linux), excutez configure de la manire 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'installs, 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 effectue. Il peut tre bon d'utiliser cette mthode mme si vous avez les bibliothques cites, car quelques versions de celles-ci ont caus des problmes des utilisateurs MySQL par le pass. Voici quelques variables d'environnement dfinir selon le compilateur que vous utilisez : gcc 2.7.2 : 90
egcs 1.0.3a :
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors \ -fno-exceptions -fno-rtti"
gcc 2.95.2 :
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro \ -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 prcdente 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 rcentes 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
Les binaires que nous fournissons sur le site de MySQL http://www.mysql.com/ sont tous compils avec une optimisation totale et devraient tre parfaits pour la plupart des utilisateurs. See Section 2.1.2.5, Binaires compils par MySQL AB . Il y a quelques choses que vous pouvez modifier pour rendre le binaire encore plus rapide, mais cela est rserv aux utilisateurs avancs. See Section 7.5.4, Influences de la compilation et des liaisons sur la vitesse de MySQL . Si la gnration choue et produit des erreurs disant que votre compilateur ou outil de liaison n'est pas capable de crer la bibliothque partage libmysqlclient.so.# (# tant un numro de version), vous pouvez contourner ce problme en donnant l'option --disableshared configure. Dans ce cas, configure ne gnrera pas de bibliothque partage libmysqlclient.so.#. Par dfaut, MySQL utilise le jeu de caractres ISO-8859-1 (Latin1). Pour changer le jeu par dfaut, 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 win1251ukr. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . Depuis MySQL 4.1.1, la collation par dfaut peut aussi tre spcifie. MySQL utilise la collation latin1_swedish_ci. Pour le changer, utilisez l'option --with-collation :
shell> ./configure --with-collation=COLLATION
Pour changer le jeu de caractres et la collation, utilisez les options --with-charset et --withcollation. La collation doit tre valide pour le jeu de caractres spcifi. Utilisez la commande SHOW COLLATION pour dterminer les collations valides pour un jeu de caractres donn. 91
Si vous voulez convertir les caractres entre le serveur et le client, regardez du ct de la commande SET CHARACTER SET. See Section 13.5.2.8, Syntaxe de SET . Attention : Si vous changez les jeux de caractres aprs avoir cre des tables, vous devrez excuter myisamchk -r -q --set-character-set=charset sur chaque table. Vos index pourraient tre stocks de manire incorrecte sinon. (Cela peut survenir si vous installez MySQL, crez quelques tables, puis reconfigurez MySQL pour qu'il utilise un jeu de caractres diffrent et le rinstallez.) Avec l'option --with-extra-charsets=LIST vous pouvez dfinir les jeux de caractres additionnels compiler dans le serveur. Ici LIST est soit une liste de jeux de caractres spars par des espaces, soit complex pour inclure tous les jeux de caractres ne pouvant tre chargs dynamiquement, ou encore all pour inclure tous les jeux de caractres dans les binaires. Pour configurer MySQL avec le code de dbogage, utilisez l'option --with-debug :
shell> ./configure --with-debug
Cela alloue un vrificateur d'allocation de mmoire qui peut trouver quelques erreurs et qui fournit des informations sur ce qui se produit. See Section D.1, Dboguer un serveur MySQL . Si vos programmes clients utilisent les threads, vous avez besoin de compiler une version sre pour les threads de la bibliothque du client MySQL avec l'option de configuration --enable-threadsafe-client. Cela crera une bibliothque libmysqlclient_r avec laquelle vous devez lier vos applications threades. See Section 24.2.15, Comment faire un client MySQL thread . Les options relatives un systme d'exploitation particulier peuvent tre trouves dans la section spcifique aux systmes de ce manuel. See Section 2.8, Notes spcifiques aux systmes d'exploitation .
92
Dans l'exemple prcdent, les sources seront respectivement places dans les dossiers mysql-3.23/, mysql-4.0/, mysql-4.1/ ou mysql-5.0/, de votre dossier courant. Si vous tes derrire un firewall et que vous ne pouvez utiliser que des connexions HTTP, vous pouvez aussi accder BitKeeper via HTTP. Si vous devez utiliser un serveur proxy, assignez la variable d'environnement http_proxy pour qu'elle pointe sur votre proxy :
shell> export http_proxy="http://your.proxy.server:8080/"
Puis, remplacez le protocole bk:// par http:// lors de votre export. Par exemple :
shell> bk clone http://mysql.bkbits.net/mysql-4.1 mysql-4.1
Le premier tlchargement de l'arbre source peut prendre un certain temps, selon la vitesse de votre connexion. Soyez patients. 4. Vous aurez besoin de GNU make, autoconf 2.53 (ou plus rcent), automake 1.5, libtool 1.4 et m4 pour lancer la prochaine srie de commandes. Mme si la plupart des systmes d'exploitation sont livrs avec leur propre implmentation de make, les chances sont fortes pour que la compilation choue avec des messages d'erreur tranges. Par consquent, il est fortement recommand d'utiliser GNU make (parfois aussi appel gmake). Heureusement, d'autres systmes d'exploitation sont livrs avec les utilitaires GNU, ou propose des paquets facilement installables. Dans tous les cas, vous pouvez les tlcharger sur ces sites : http://www.gnu.org/software/autoconf/ http://www.gnu.org/software/automake/ http://www.gnu.org/software/libtool/ http://www.gnu.org/software/m4/ http://www.gnu.org/software/make/ Si vous essayez ded configurer MySQL 4.1 ou plus rcent, vous aurez besoin de GNU bison 1.75 ou plus rcent. Les anciennes versions de bison peuvent indiquer cette erreur :
sql_yacc.yy:#####: fatal error: maximum table size (32767) exceeded
Note : la taille maximale de la table n'est pas dpasse. L'erreur est cause par un bug dans les versions plus anciennes de bison. Les versions de MySQL avant la version 4.1 peuvent aussi se compiler avec d'autres versions de yacc (par exemple, BSD yacc 91.7.30). Pour les versions plus rcentes, GNU bison est une obligation. Les commandes typiques ncessaires pour compiler MySQL sont prsentes ci-dessous. La premire commande cd change le dossier de travail : remplacez mysql-4.0 avec le bon nom de dossier.
shell> shell> shell> shell> shell> cd mysql-4.0 bk -r get -Sq aclocal; autoheader; autoconf; automake; ./configure # Ajoutez ici vos options favorites make
93
Les lignes de commande qui passent dans les dossiers innobase et bdb/dist sont utilises pour configurer InnoDB et Berkeley DB (BDB). Vous pouvez omettre ces lignes si vous n'avez pas besoin du support InnoDB ou BDB. Si vous obtenez des erreurs tranges pendant cette tape, vrifiez bien que vous avez vraiment install libtool! Une collection de nos scripts de configuration les plus courants de trouve dans le sous-rpertoire BUILD/. Si vous tes fainants, vous pouvez utiliser BUILD/compile-pentium-debug. Pour compiler sur une architecture diffrente, modifiez ce script en enlevant les drapeaux spcifiques au Pentium. 5. Quand la compilation est acheve, 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 diffrentes de celles de votre serveur de production. 6. Torturez votre nouvelle installation et tentez de faire planter les nouvelles fonctionnalits. Commencez par lancer make test. See Section 27.1.2, Suite de test de MySQL . 7. Si vous avez chou avec l'tape make et que la distribution ne compile pas, envoyez un rapport sur le site http://bugs.mysql.com/. Si vous avez install la dernire version des indispensables outils GNU, et qu'ils chouent dans l'analyse de vos fichiers de configuration, envoyez aussi un rapport. D'autre part, si vous excutez aclocal et que vous obtenez l'erreur command not found ou un problme du mme type, n'envoyez pas de rapport. A la place, assurez vous que les outils ncessaires sont bien installs et que votre variable PATH est configure de telle faon que votre interprteur de commandes les trouvent. 8. Aprs la premire opration bk clone pour obtenir l'arbre source, vous devez lancer rgulirement bk pull pour obtenir les mises jour. 9. Vous pouvez examiner l'historique des changements de l'arbre avec toutes les diffrences en utilisant bk sccstool. Si vous apercevez des diffrences anormales ou sur lesquelles vous avez des questions, n'hsitez pas envoyer un e-mail aux listes internes. See Section 1.4.1.1, Les listes de diffusion de MySQL . De mme, si vous pensez avoir une meilleure mthode pour traiter un problme, envoyez un e-mail accompagn d'un patch la mme adresse. bk diffs vous fournira un patch aprs que vous ayez fait vos changements aux sources. Si vous n'avez pas le temps de coder votre ide, envoyez en juste une description. 10. BitKeeper dispose d'une aide agrable laquelle vous pouvez accder via bk helptool. 11. Veuillez noter que chaque commit (bk ci ou bk citool) postera un message avec un aperu des changements notre liste de diffusion interne, la faon habituelle des propositions openlogging.org avec seulement les commentaires des changements. Gnralement, vous n'aurez pas besoin d'utiliser commit (l'arbre public interdisant les bk push), mais plutt d'utiliser la mthode bk diffs dcrite plus haut. Vous pouvez aussi naviguer dans les fichiers d'historiques, les commentaires et le code source en ligne. Par exemple, pour lire ses informations pour MySQL 4.1, allez http://mysql.bkbits.net:8080/ mysql-4.1. Le manuel est dans un module spar, qui peut tre obtenu comme ceci :
shell> bk clone bk://mysql.bkbits.net/mysqldoc mysqldoc
Il y a aussi des arbres BitKeeper pour MySQL Control Center et Connector/ODBC. Ils sont disponibles comme ceci : Pour obtenir le MySQL Control Center, utilisez cette commande :
shell> bk clone http://mysql.bkbits.net/mysqlcc mysqlcc
94
Problmes de compilation?
Alternativement, vous pouvez aussi utiliser make distclean. La liste suivante dcrit certains problmes lors de la compilation de MySQL, qui surviennent souvent : Si vous avez des problmes lors de la compilation de sql_yacc.cc, comme ceux qui sont dcrits ci-dessous, vous avez probablement t court de mmoire ou d'espace de swap :
Internal compiler error: program cc1plus got fatal signal 11 Out of virtual memory Virtual memory exhausted
Le problme est que gcc requiert de grandes quantit de mmoire pour compiler sql_yacc.cc avec les options inline. Essayez d'excuter 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 mme si il vous reste suffisamment de mmoire, et que vous ne pensez pas tre limit. Ce problme a t observ sur des systmes avec de gnreuses configurations, et --with-low-memory rsout ce problme. Par dfaut, configure choisit c++ comme compilateur, et GNU c++ pour les liens avec -lg++. Si vous utilisez gcc, ce comportement peut poser les problmes suivants :
configure: error: installation or configuration problem: C++ compiler cannot create executables.
Vous pourriez aussi observer des problmes durant la compilation, avec g++, libg++ ou libstdc+ +. La cause de ces problmes 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 config.log. Il va srement contenir la raison exacte du mauvais fonctionnement de votre compilateur. Pour contourner ce
95
Problmes de compilation?
problme, 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 dfaut. Un autre moyen pour rgler ces problmes, 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'accrotre la taille de votre excutable binaire, sans vous apporter d'avantages. Par le pass, certaines versions de ces bibliothques ont pos des problmes tranges aux utilisateurs MySQL. Utiliser gcc comme compilateur C++ est aussi ncessaire, si vous voulez compiler MySQL avec le support de RAID (voyez Section 13.2.5, Syntaxe de CREATE TABLE pour plus d'information sur le type de table RAID), ou utilisez GNU gcc version 3 plus rcent. Si vous avez des erreurs de compilation comme celles ci-dessous avec l'option --with-raid, essayez d'utiliser gcc comme compilateur C++ en dfinissant la variable d'environnement CXX ci-dessus :
gcc -O3 -DDBUG_OFF -rdynamic -o isamchk isamchk.o sort.o libnisam.a ../mysys/libmysys.a ../dbug/libdbug.a ../strings/libmystrings.a -lpthread -lz -lcrypt -lnsl -lm -lpthread ../mysys/libmysys.a(raid.o)(.text+0x79): In function `my_raid_create':: undefined reference to `operator new(unsigned)' ../mysys/libmysys.a(raid.o)(.text+0xdd): In function `my_raid_create':: undefined reference to `operator delete(void*)' ../mysys/libmysys.a(raid.o)(.text+0x129): In function `my_raid_open':: undefined reference to `operator new(unsigned)' ../mysys/libmysys.a(raid.o)(.text+0x189): In function `my_raid_open':: undefined reference to `operator delete(void*)' ../mysys/libmysys.a(raid.o)(.text+0x64b): In function `my_raid_close':: undefined reference to `operator delete(void*)' collect2: ld returned 1 exit status
Si votre compilation choue avec des erreurs, ou si l'une des erreurs suivantes apparat, 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 problmes avec make. GNU make version 3.75 est reconnu pour fonctionner. Si vous voulez dfinir des options supplmentaires qui seront utilises par votre compilateur C ou C++, faites le en ajoutant ces options aux variables d'environnement CFLAGS et CXXFLAGS. Vous pouvez aussi spcifier le nom du compilateur via les variables CC et CXX. Par exemple :
shell> shell> shell> shell> shell> CC=gcc CFLAGS=-O3 CXX=gcc CXXFLAGS=-O3 export CC CFLAGS CXX CXXFLAGS
96
Problmes de compilation?
Voyez Section 2.1.2.5, Binaires compils par MySQL AB , pour avoir une liste des dfinitions des options disponibles sur divers systmes. 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 affiches ci-dessous lors de la compilation de mysqld, c'est que configure n'a pas correctement dtecter le dernier argument des fonctions accept(), getsockname() ou getpeername() :
cxx: Error: mysqld.cc, 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 problme, ditez le fichier config.h (qui est gnr 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 systme d'exploitation. Notez que vous devrez faire cette manipulation chaque fois que vous excuterez le script configure car configure regnre config.h. Le fichier sql_yacc.cc est gnr partir du fichier sql_yacc.yy. Normalement, le processus de cration ne s'occupe pas de sql_yacc.cc, car MySQL en a dj une copie. Cependant, si vous devez le recrer, vous pouvez rencontrer cette erreur :
"sql_yacc.yy", line xxx fatal: default action causes potential...
Cela indique que votre version de yacc est inadquate. Vous devrez probablement rinstaller bison (la version GNU de yacc) et l'utiliser la place. Sur Debian Linux 3.0, vous devez installer gawk au lieu du programme par dfaut mawk si vous voulez compiler MySQL 4.1 ou plus rcent avec le support Berkeley DB. Si vous avez besoin de dboguer mysqld ou un client MySQL, excutez le script configure avec l'option --with-debug, puis recompilez vos clients avec la nouvelle bibliothque. See Section D.2, Dbogage un client MySQL . Si vous rencontrez une erreur de compilation sous Linux (e.g. SuSE Linux 8.1 ou Red Hat Linux 7.3) similaire celle-ci :
libmysql.c:1329: warning: passing arg 5 of `gethostbyname_r' from incompatible pointer type libmysql.c:1329: too few arguments to function `gethostbyname_r' libmysql.c:1329: warning: assignment makes pointer from integer without a cast make[2]: *** [libmysql.lo] Error 1
Par dfaut, le script configure tente de dterminer le nombre correct d'argument en utilisant g++, le compilateur GNU C++. Ce test retourne des rsultats erron si g++ n'est pas install. Il y a deux faons de contourner le problme : Assurez vous que GNU C++ g++ est install. Sur certains Linux, le paquet ncessaire est appel gpp, et sur d'autres, c'est gcc-c++.
97
Utilisez gcc comme compilateur C++ en mettant donnant la variable d'environnement CXX, la valeur de gcc:
export CXX="gcc"
La compilation dans un dossier non-sources n'est pas support lors de l'utilisation des MITpthreads car nous voulons minimiser les changements de leur code. La vrification 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 utiliss et utiliserons les socket Unix pour les connexions par dfaut. 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 excuterez les programmes clients. Lorsque MySQL est compil en utilisant les MIT-pthreads, le verrouillage systme est dsactiv par dfaut pour des soucis de performances. Vous pouvez demander au serveur d'utiliser les verrous systmes avec l'option --external-locking. Cela n'est requis que si vous avez besoin de faire fonctionner deux serveurs MySQL avec les mmes donnes (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 rsultat 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 redmarrer. Cela ne nous est arriv que quand nous avons forc le serveur se terminer et que nous l'avons redmarr immdiatement aprs. Avec les MIT-pthreads, l'appel systme sleep() ne peut pas tre interrompu avec SIGINT (break). On ne s'en rend compte que quand on excute mysqladmin --sleep. Vous devez attendre que l'appel systme sleep() se termine avant que le processus ne s'arrte.
98
Lors de la liaison, vous pouvez obtenir des messages d'erreurs comme ceux-ci (du moins sur Solaris); ils peuvent tre ignors :
ld: warning: symbol `_iob' has differing sizes: (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4; file /usr/lib/libc.so 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 /usr/lib/libc.so value=0x140); /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
Nous n'avons pas russi faire fonctionner readline avec les MIT-pthreads. (Cela n'est pas ncessaire, mais peut tre utile quelqu'un.)
99
Si vous dcouvrez quelque chose qui ne fonctionne pas comme prvu, ou si vous avez des suggestions pour amliorer le processus actuel envoyez un message la liste de diffusion ddie win32. See Section 1.4.1.1, Les listes de diffusion de MySQL .
100
Si vous voulez compiler d'autres clients et les lier MySQL, il faudra crer d'autres dossiers :
mkdir mkdir mkdir mkdir \mysql\include \mysql\lib \mysql\lib\debug \mysql\lib\opt
Les tests de performances requirent Perl. 2. Depuis le dossier workdir, copiez dans le dossier C:\mysql les fichiers suivants :
copy client_release\*.exe C:\mysql\bin copy client_debug\mysqld.exe C:\mysql\bin\mysqld-debug.exe xcopy scripts\*.* C:\mysql\scripts /E xcopy share\*.* C:\mysql\share /E
Si vous voulez compiler d'autres clients, et les lier avec MySQL, vous devrez aussi faire ceci :
copy copy copy copy copy copy copy copy lib_debug\mysqlclient.lib C:\mysql\lib\debug lib_debug\libmysql.* C:\mysql\lib\debug lib_debug\zlib.* C:\mysql\lib\debug lib_release\mysqlclient.lib C:\mysql\lib\opt lib_release\libmysql.* C:\mysql\lib\opt lib_release\zlib.* C:\mysql\lib\opt include\*.h C:\mysql\include libmysql\libmysql.def C:\mysql\include
Puis lancez votre serveur de la mme faon que vous lancez l'excutable MySQL classique. See Section 2.2.1, Installer MySQL sous Windows .
3. Aprs vous tre assurs que le processus est complet et russi, lancez l'utilitaire suivant depuis la racine de vos sources :
shell> ./scripts/make_win_src_distribution
Ce script cre un paquet source Windows, qui peut tre utilis sur votre systme. Vous pouvez passer d'autres options ce script, suivant vos besoins. Il accepte les options suivantes : --help Affiche ce message d'aide.
101
--debug Dbogage, sans crer le paquet. --tmp Spcifie le dossier temporaire. --suffix Suffixe pour le nom du paquet. --dirname Nom du dossier o copier les fichiers (intermdiaire). --silent Ne liste pas tous les fichiers traits. --tar Cre le paquet au format tar.gz plutt que .zip. Par dfaut, make_win_src_distribution cre une archive zippe avec le nom mysqlVERSION-win-src.zip, o VERSION reprsente la version de votre source MySQL. 4. Copiez ou tlchargez le paquet sur votre machine Windows. Pour le compiler, suivez les instructions de la section Section 2.4.6.1, Compiler MySQL avec VC++ .
my_global.h inclut tous les autres fichiers ncessaires pour Windows (comme le fichier windows.h) si vous compilez votre programme sous Windows. Vous pouvez soit lier votre code avec la bibliothque dynamique libmysql.lib, qui est juste une interface pour charger libmysql.dll la demande, soit lier avec la bibliothque statique mysqlclient.lib. Notez que puisque les bibliothques mysqlclient sont compiles en tant que bibliothques threades, vous devez aussi compiler votre code pour qu'il soit multi-thread !
102
Lorsque vous tes prts crer d'autres comptes, vous pouvez trouver des informations sur le contrle d'accs MySQL et la gestion de comptes dans les sections Section 5.5, Rgles de scurit et droits d'accs au serveur MySQL et Section 5.6, Gestion des comptes utilisateurs de MySQL .
Si vous avez une version fonctionnelle de Windows qui supporte les services, et que vous voulez que MySQL fonctionne automatiquement au lancement de Windows, voyez la section Section 2.2.9.1, Lancer MySQL comme un service Windows .
103
l'accessibilit du serveur. Pour des informations sur le dmarrage et l'extinction automatique du serveur, voyez Section 2.5.2.2, Lancer et arrter MySQL automatiquement . Une fois que vous avez excut la procdure, et que le serveur fonctionne, vous devez assigner des mots de passe aux comptes crs par mysql_install_db. Les instructions pour faire cela Section 2.5.3, Cration des premiers droits MySQL . Dans les exemples ici, le serveur fonctionne avec l'utilisateur mysql. On suppose donc que ce compte existe. Crez ce compte, s'il n'existe pas, ou bien utilisez le nom que vous avez choisi. 1. Changez de dossier de travail, pour vous mettre la racine de l'installation MySQL, reprsente ici par BASEDIR :
shell> cd BASEDIR
BASEDIR vaut probablement /usr/local/mysql ou /usr/local. Les tapes suivantes supposent que vous tes dans ce dossier. 2. Si ncessaire, lancez le programme mysql_install_db pour configurer les tables de droits initiales, qui dterminent les utilisateurs qui sont autorises se connecter au serveur. Vous devez faire cela si vous avez install le programme avec une distribution qui ne lance pas ce programme pour vous. Typiquement, mysql_install_db doit tre utilis uniquement la premire installation, et vous pouvez viter cette tape si vous faites une mise jour. Cependant, mysql_install_db n'crase pas les tables de droits : vous pouvez l'utiliser, en cas de doute. Pour initialiser les tables de droits, utilisez une des commandes suivantes, en fonction de la localisation de mysql_install_db dans le dossier bin scripts :
shell> bin/mysql_install_db --user=mysql shell> scripts/mysql_install_db --user=mysql
Le script mysql_install_db cre la base mysql qui contient les tables de droits, et la base test que vous pouvez utiliser pour les tests avec MySQL. Ce script va aussi crer l'utilisateur root et un compte anonyme. Ces deux comptes sont crs sans mot de passe. Une description des droits initiaux sont prsents dans la section Section 2.5.3, Cration des premiers droits MySQL . Le script mysqld_safe lance le serveur mysqld. Avant la version 4.0, utilisez safe_mysqld au lieu de mysqld_safe. Il est important de vous assurer que les dossiers et les fichiers appartiennent au compte mysql pour que le serveur puisse lire et crire dedans. Pour cela, l'option --user doit tre utilise comme prsent si vous utilisez mysql_install_db comme root. Sinon, il est recommand d'excuter le script lorsque vous tes connects en tant que mysql : dans ce cas, vous pouvez omettre l'option --user. mysql_install_db cre de nombreuses tables dans la base mysql : user, db, host, tables_priv, columns_priv, func, et mme d'autres, en fonction des versions de MySQL. Si vous ne voulez pas de la base test, vous pouvez la supprimer avec mysqladmin -u root drop test au redmarrage du serveur. Si vous avez des problmes avec mysql_install_db, voyez Section 2.5.2.1, Problmes d'excution de mysql_install_db . Il y a d'autres alternatives pour lancer mysql_install_db tel que fournit par la distribution MySQL : Si vous voulez que les droits initiaux soient diffrents des valeurs par dfaut, vous pouvez modifier le script mysql_install_db avant de l'excuter. Cependant, une technique prfrable est d'utiliser GRANT et REVOKE pour changer les droits aprs avoir configur les tables de droits. En d'autres termes, vous pouvez lancer mysql_install_db, puis utiliser mysql -u root
104
mysql pour vous connecter au serveur en tant que root MySQL, pour mettre les commandes GRANT et REVOKE. Si vous voulez installer MySQL sur de nombreuses machines avec les mmes droits, vous pouvez mettre les commandes GRANT et REVOKE dans un fichier de script, et excuter ce script avec mysql aprs avoir utilis mysql_install_db. Par exemple :
shell> bin/mysql_install_db --user=mysql shell> bin/mysql -u root < your_script_file
Comme cela, vous pouvez viter les problmes de rptition manuelle entre chaque machine. Il est possible de re-crer entirement les tables de droits aprs les avoir cres. Vous pouvez le faire si vous apprenez comment utiliser GRANT et REVOKE et que vous avez fait tellement de modifications aprs mysql_install_db que vous voulez recommencer zro. Pour re-crer les tables de droits, supprimez les fichiers .frm, .MYI et .MYD dans le dossier contenant les tables mysql. C'est le dossier appel mysql dans le dossier de donnes, qui est list dans le dossier datadir lorsque vous utilisez la commande mysqld --help. Puis, utilisez nouveau le script mysql_install_db. Note : pour les versions MySQL antrieure la version 3.22.10, vous ne devez pas supprimer les fichiers .frm. Si vous les supprimez accidentellement, essayez de les retrouver et de les remettre dans le dossier mysql depuis votre distribution MySQL, avant d'utiliser mysql_install_db. Vous pouvez lancer mysqld manuellement en utilisant l'option --skip-grant-tables et en ajoutant les droits mysql :
shell> bin/mysqld_safe --user=mysql --skip-grant-tables & shell> bin/mysql mysql
Depuis mysql, excutez manuellement les commandes SQL contenues dans le script mysql_install_db. Assurez vous que vous utilisez mysqladmin flush-privileges ou mysqladmin reload aprs, pour dire au serveur de relire les tables de droits. Notez que si vous n'utilisez pas mysql_install_db, vous devez remplir les tables manuellement, et en plus, vous devez commencer par les crer. 3. Lancez le serveur MySQL :
shell> bin/mysqld_safe --user=mysql &
Pour les versions de MySQL antrieure 4.0, remplacez bin/safe_mysqld par bin/ mysqld_safe dans cette commande. Il est important de vous assurez que le dossier de base de donnes et les fichiers de mysql sont accessibles, pour que le serveur puisse y lire et crire. Pour cela, l'option --user peut tre utilise avec mysql_install_db si vous l'excutez en tant que root. Sinon, vous devez excuter le script lorsque vous tes identifi comme mysql, auquel cas, vous pouvez omettre l'option --user. D'autres instructions pour faire fonctionner MySQL en tant qu'utilisateur sans droits sont donnes dans la section Section A.3.2, Comment excuter MySQL comme un utilisateur normal . Si vous n'avez pas cr les tables de droits, l'erreur suivante sera inscrite dans le fichier de log d'erreur de votre serveur :
mysqld: Can't find file: 'host.frm'
Si vous avez des problmes au dmarrage du serveur, voyez Section 2.5.2.3, Problmes de dmarrage du serveur MySQL . 105
4. Utilisez mysqladmin pour vrifier que le serveur fonctionne. La commande suivante vous permet de faire un test simple pour vrifier que le serveur est actif et qu'il rpond aux connexions :
shell> bin/mysqladmin version shell> bin/mysqladmin variables
Le rsultat de mysqladmin version varie lgrement, suivant votre plates-formes et votre version de MySQL, mais il doit tre proche de ceci :
shell> bin/mysqladmin version mysqladmin Ver 8.40 Distrib 4.0.18, 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 Protocol version Connection TCP port UNIX socket Uptime:
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 voir ce que vous pouvez faire d'autre avec mysqladmin, utilisez l'option --help. 5. Vrifiez que vous pouvez teindre le serveur :
shell> BINDIR/mysqladmin -u root shutdown
6. Vrifiez que vous pouvez relancer le serveur. Pour cela, utilisez mysqld_safe ou mysqld directement. Par exemple :
shell> BINDIR/mysqld_safe --log &
Si mysqld_safe choue, essayez de l'excuter directement depuis le dossier d'installation MySQL (si vous n'y tes pas dj). Si cela ne fonctionne toujours pas, voyez Section 2.5.2.3, Problmes de dmarrage du serveur MySQL . 7. Excutez les tests simples pour vrifier que le serveur fonctionne. Le rsultat devrait tre proche de celui-ci :
shell> BINDIR/mysqlshow +-----------+ | Databases | +-----------+ | mysql | +-----------+ shell> BINDIR/mysqlshow mysql Database: mysql +--------------+ | Tables | +--------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +--------------+ shell> BINDIR/mysql -e "SELECT host,db,user FROM db" mysql +------+--------+------+ | host | db | user |
106
Il y a aussi une suite de tests dans le dossier sql-bench (sous le dossier d'installation MySQL) que vous pouvez utiliser pour comparer les performances de MySQL sur diffrentes plates-formes. La suite de tests utilise le module Perl DBI pour assurer une interface avec les autres bases de donnes. Les modules Perl suivants sont aussi ncessaires pour excuter la suite de tests :
DBI DBD::mysql Data::Dumper Data::ShowTable
Ces modules sont disponibles sur la bibliothque CPAN http://www.cpan.org/. See Section 2.9.1, Installer Perl sur Unix . Le dossier sql-bench/Results contient des rsultats de tests sur diffrentes plates-formes et bases. Pour lancer tous les tests, excutez ces commandes :
shell> cd sql-bench shell> run-all-tests
Si vous n'avez pas de dossier sql-bench, vous avez probablement install MySQL avec un fichier RPM, diffrent du RPM source. Le RPM source inclut le dossier sql-bench) Dans ce as, vous devez d'abord installer la suite de tests avant de l'utiliser. Depuis MySQL version 3.22, il y a des fichiers de tests RPM appel mysql-bench-VERSION-i386.rpm, qui contiennent le code et les donnes. Si vous avec une distribution source, il y a aussi des tests dans le sous-dossier tests. Par exemple, pour lancer auto_increment.tst, fates :
shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst
Les rsultats attendus des tests sont disponibles dans le fichier ./tests/auto_increment.res. 8. A ce point, vous devez avoir un serveur fonctionnel. Cependant, les comptes initiaux n'ont pas de mot de passe : il est recommand de leur assigner des mots de passe en suivant les instructions de la section Section 2.5.3, Cration des premiers droits MySQL .
Cette section liste les problmes que vous pourriez rencontrer lors de l'excution du script mysql_install_db : mysql_install_db n'installe pas les tables de droits Vous ralisez 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 trs 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 dmarr. Si vous
107
ne comprenez pas ce qui est arriv, incluez le log dans votre message, lors de l'envoi du rapport de bugs avec mysqlbug! See Section 1.4.1.3, Comment rapporter un bogue ou un problme . Un dmon mysqld fonctionne dj Dans ce cas, vous n'avez probablement pas excut mysql_install_db du tout. Vous avez excut mysql_install_db une fois, lorsque vous avez install MySQL pour la premire fois. Installer un second dmon mysqld n'est pas possible lorsque le premier fonctionne. Cela arrive lorsque vous avez une installation MySQL pre-existantes, mais que vous voulez installer une autre version ailleurs (par exemple, pour faire des tests ou simplement pour avoir deux installations). Gnralement, le problme survient lorsque le second serveur est dmarr, et qu'il essaie d'utiliser les mmes 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 Can't start server: Bind on unix socket...
Pour des instructions sur la configuration de serveurs multiples, voyez la section Section 5.10, Faire fonctionner plusieurs serveurs MySQL sur la mme machine . You don't have write access to /tmp Si vous n'avez pas les droits d'accs suffisant pour crer un fichier de socket l'endroit prvu ou les permissions pour crer un fichier temporaire dans /tmp, vous allez avoir une erreur lors de l'utilisation de mysql_install_db ou avec mysqld. Vous pouvez spcifier une socket diffrente et un dossier temporaire diffrent avec les options suivantes :
some_tmp_dir doit tre le chemin complet d'un dossier dans lequel vous avez les droits en criture. Aprs cela, vous devriez tre capable d'excuter mysql_install_db et lancer le serveur avec ces commandes :
shell> bin/mysql_install_db --user=mysql shell> bin/mysqld_safe --user=mysql &
Si mysql_install_db est situ dans le dossier scripts, modifiez la premire commande pour utiliser scripts/mysql_install_db. Voyez Section A.4.5, Comment protger ou changer le fichier socket /tmp/mysql.sock . See Annexe E, Variables d'environnement.
demande. Pour des instructions, reportez vous Section 2.2.9.1, Lancer MySQL comme un service Windows . En appelant mysqld_safe, qui essaie de dterminer les options correctes avant de lancer mysqld. Ce script est utilis sur les systmes Unix BSD. Il est aussi appel par mysql.server. See Section 5.1.3, safe_mysqld, le script pre de mysqld . En appelant mysql.server. Ce script sert principalement au moment du dmarrage et de l'extinction du systme, sur les systmes qui utilisent un dossier de processus programms System V, o il est gnralement enregistr sous le nom de mysql. Le scriptmysql.server lance le serveur en appelant mysqld_safe. See Section 5.1.4, Le script de dmarrage mysql.server . Sur Mac OS X, vous pouvez installer un paquet indpendant appel MySQL Startup Item pour activer le lancement automatique de MySQL au dmarrage. Le Startup Item lance le serveur en appelant mysql.server. Voir Section 2.2.13, Installer MySQL sur Mac OS X pour plus de dtails. Les scripts mysql.server et safe_mysqld et le StartUp Item de Mac OS X peuvent tre utiliss pour dmarrer le serveur automatiquement au moment du dmarrage du serveur. mysql.server peut aussi servir arrter le serveur. Le script mysql.server peut servir dmarrer ou arrter le serveur en l'appelant avec les arguments start ou stop :
shell> mysql.server start shell> mysql.server stop
Avant que mysql.server ne dmarre le serveur, il change de dossier pour aller dans le dossier d'installation et appelle safe_mysqld. Si vous voulez que le serveur fonctionne sous un nom d'utilisateur spcifique, ajoutez l'option user approprie dans le groupe [mysqld] du fichier /etc/ my.cnf, tel que prsent ultrieurement dans cette section (il est possible que vous ayez besoin d'diter mysql.server). 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'excute safe_mysqld. Si vous voulez que le serveur fonctionne avec un utilisateur spcifique, ajouter l'option user approprie dans le fichier /etc/my.cnf, tel que prsent ultrieurement dans cette section. mysql.server stop arrte le serveur en lui envoyant un signal. Vous pouvez teindre le serveur manuellement avec la commande mysqladmin shutdown. Pour lancer et arrter automatiquement MYSQL sur votre serveur, vous devez ajouter les commandes de lancement et d'arrt dans les bons endroits de vos fichiers /etc/rc*. Notez que si vous utilisez des paquets Linux RPM (MySQL-server-VERSION.rpm), le script mysql.server est install sous le nom /etc/init.d/mysql. Vous n'avez pas l'installer manuellement. Voyez Section 2.2.12, Installer MySQL sous Linux pour plus d'informations sur les paquets Linux RPM. Certaines diteurs fournissent des paquets RPM qui installent un script de dmarrage sous un autre nom, comme mysqld. Si vous installez MySQL depuis une distribution source, ou en utilisant une distribution binaire qui n'installe pas automatiquement le script mysql.server, vous pouvez l'installer manuellement. Le script est disponible dans le dossier support-files du dossier d'installation MySQL, ou dans le dossier source de MySQL. Pour installer mysql.server manuellement, copiez le dans le dossier /etc/init.d sous le nom mysql, puis rendez-le excutable. Pour cela, placez vous dans le dossier o mysql.server est stock, et utilisez ces commandes :
shell> cp mysql.server /etc/init.d/mysql
109
Les anciens systmes Red Hat utilisent le dossier /etc/rc.d/init.d plutt que /etc/init.d. Adaptez les commandes prcdentes. Alternativement, crez un lien symbolique /etc/init.d qui pointe sur /etc/rc.d/init.d :
shell> cd /etc shell> ln -s rc.d/init.d .
Aprs installation du script, les commandes doivent tre actives pour fonctionner au lancement du systme, sur votre systme d'exploitation. Sous Linux, vous pouvez utiliser chkconfig :
shell> chkconfig --add mysql
Sur certains systmes Linux, les commandes suivantes sont aussi ncessaires pour activer totalement le script mysql :
shell> chkconfig --level 345 mysql on
Sous FreeBSD, les scripts de dmarrage vont gnralement dans le dossier /usr/local/etc/ rc.d/. La page de manuel rc(8) indique que les scripts de ce dossier ne sont excuts que si leur nom est de la forme *.sh. Tout autre fichier de ce dossier sera alors ignor. En d'autres termes, vous devez installer le script mysql.server sous le nom /usr/local/etc/rc.d/mysql.server.sh pour activer le dmarrage automatique. Alternativement la configuration prcdente, certains systmes d'exploitation utilisent aussi /etc/ rc.local ou /etc/init.d/boot.local pour lancer des services supplmentaires au dmarrage. Pour lancer MySQL avec cette mthode, vous pouvez ajouter une commande comme celle-ci au fichier de dmarrage :
/bin/sh -c 'cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &'
Pour les autres systmes, consultez la documentation de votre systme d'exploitation pour savoir comment installer un script de dmarrage. Vous pouvez aussi ajouter des options mysql.server via le fichier global /etc/my.cnf file. Un fichier /etc/my.cnf typique peut ressembler ceci :
[mysqld] datadir=/usr/local/mysql/var socket=/var/tmp/mysql.sock port=3306 user=mysql [mysql.server] basedir=/usr/local/mysql
Le script mysql.server comprend les options suivantes : basedir, datadir et pid-file. Si spcifies, elles doivent tre places dans un fichier d'option, et non pas en ligne de commande. mysql.server comprend les options de ligne de commande start et stop. La table suivante montre quels groupes d'options chaque scripts de dmarrage utilise : Script mysqld mysql.server safe_mysqld Groupe d'options mysqld et server mysql.server, mysqld, et server mysql.server, mysqld, et server
[mysqld-major-version] signifie que des groupes ayant des noms tels que [mysqld-4.0], [mysqld-4.1], et [mysqld-5.0] seront lus par les serveurs de versions 4.0.x, 4.1.x, 5.0.x, etc. Cette fonctionnalit a t ajoute en MySQL 4.0.14. Elle sert spcifier des options qui ne seront lues que par des serveurs dont les versions sauront les comprendre.
110
A des fins de compatibilit ascendante, mysql.server lit aussi le groupe d'options [mysql_server] et mysqld_safe lit le groupe d'options [safe_mysqld]. Cependant, il est recommand de modifier vos fichiers de configuration pour utiliser les groupes [mysql.server] et [mysqld_safe] la place. See Section 4.3.2, Fichier d'options my.cnf .
Vous pouvez spcifier d'autres options comme --datadir, mais notez que --verbose et --help doivent tre les dernires options. Avant MySQL 4.1, omettez l'option --verbose.
111
Une fois que vous dterminez les configurations que vous voulez, lancez le serveur avec --verbose et --help. Si votre dmon mysqld fonctionne dj, vous pouvez connatre les chemins de configuration avec la commande :
shell> mysqladmin variables
ou :
shell> mysqladmin -h host_name variables
host_name est le nom de l'hte MySQL. Si vous avez une erreur Errcode 13 (ce qui signifie Permission denied) lorsque vous dmarrez mysqld, cela signifie que les droits d'accs au serveur ou son contenu ne sont pas bons. Dans ce cas, vous devez modifier les droits sur les dossiers et fichiers que le serveur va utiliser. Vous pouvez aussi lancer le serveur en tant que root, mais cela pose des problmes de scurit, et il vaut mieux l'viter. Sous Unix, vrifiez l'existence du dossier de donnes et vrifiez le nom du propritaire du dossier de donnes et de son contenu. Par exemple, si le dossier est /usr/local/mysql/var, utilisez cette commande :
shell> ls -la /usr/local/mysql/var
Si le dossier, ses sous-dossiers ou ses fichiers ne sont pas au nom du compte qui fait tourner le serveur, changez le propritaire avec cette commande :
shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysql/var
Quelque soit la mthode que vous utilisez pour dmarrer le serveur, si elle choue, vrifiez le fichier de log d'erreurs pour savoir pourquoi. Les fichiers de log sont situs dans le dossier de donnes (typiquement /usr/local/mysql/data pour une distribution binaire, /usr/local/var pour une distribution source, et \mysql\data\mysql.err sous Windows). Regardez dans le dossier de donnes et recherchez des fichiers de la forme host_name.err et host_name.log ou host_name est le nom de votre serveur. Vrifiez alors les dernires lignes de ce fichier :
shell> tail host_name.err shell> tail host_name.log
Cela signifie que vous n'avez pas dmarr 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 dplacer le vieux fichier de log Berkeley DB vers un autre dossier, pour l'examiner plus tard. Les fichiers de logs sont nomms log.0000000001, et ce nombre augmente au fil du temps. Si vous excutez mysqld avec les tables BDB et que mysqld fait des core dumps au dmarrage, c'est peut tre que vous avez des problmes avec le fichier de restauration de BDB. Dans ce cas, essayez de dmarrer mysqld avec --bdb-no-recover. Si cela aide, vous devriez alors retirer tous les fichiers de log log.* du dossier de donnes, et dmarrer mysqld nouveau. Si vous obtenez l'erreur suivant, cela signifie que d'autres programmes (ou un autre serveur mysqld) fonctionne dj 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
112
Utilisez ps pour vous assurer que vous n'avez pas d'autre serveur mysqld qui fonctionne. Si c'est le cas, teignez le serveur avant de lancer mysqld nouveau. Si un autre serveur fonctionne, et que vous voulez vraiment en avoir plusieurs, voyez la section Section 5.10, Faire fonctionner plusieurs serveurs MySQL sur la mme machine .) Si vous ne pouvez pas trouver d'autre serveur en fonctionnement, essayer d'excuter la commande telnet votre-nom-d-hote numero-de-port-tcp puis pressez la touche 'Entre' 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. Vous devrez alors rechercher le programme qui utilise ce port, et le dsactiver, ou bien dire mysqld d'couter sur un autre port avec l'option --port. Dans ce cas, vous devrez aussi spcifier le numro de port tous les clients qui se connecte au serveur via TCP/IP. Une autre raison d'inaccessibilit du port est que vous avez un coupe-feu qui fonctionne, et qui bloque ces port. Pour cela, modifiez la configuration du coupe-feu pour librer l'accs au port. Si safe_mysqld dmarre le serveur, mais que vous n'arrivez pas vous y connecter, vous devriez vous assurer que vous avez une entre dans le fichier /etc/hosts qui ressemble ceci@ :
127.0.0.1 localhost
Ce problme survient uniquement sur les systmes qui n'ont pas une bibliothque de threads fonctionnels, ou pour lesquels MySQL a t configur pour utiliser les MIT-pthreads. Si vous n'arrivez toujours pas lancer mysqld, vous pouvez essayer de gnrer un fichier de traces avec l'option --debug. See Section D.1.2, Crer un fichier de traage .
113
Sous Unix, les deux comptes anonymes servent depuis l'hte local. Les connexions doivent tre fates en spcificant le nom d'hte localhost, ou le vritable nom d'hte, ou l'adresse IP. Ces comptes ont tous les droits dans les bases test ou dont le nom commence par test_. Comme indiqu, aucun des comptes initiaux n'a de mot de passe. Cela signifie que votre installation MySQL n'est pas protge jusqu' ce que vous y remdiez : Si vous voulez viter que les clients ne se connectent en tant qu'utilisateur anonyme sans mot de passe, vous devez assigner des mots de passe ces comptes, ou bien les supprimer. Vous devez assigner des mots de passe aux comptes root. Les instructions suivantes dcrivent comment configurer les mots de passe pour les comptes initiaux, en commenant par les comptes anonymes, puis pour les comptes root. Remplacez ``nouveau_mot'' dans les exemples ci-dessous par le nouveau mot de passe que vous voulez utiliser. Ces instructions montrent aussi comment supprimer les comptes anonymes. Vous pouvez diffrer le changement de mot de passe jusqu' plus tard, pour pouvoir utiliser cette configuration pour les tests. Cependant, n'oubliez pas de le faire avant de mettre votre serveur en production. Pour assigner des mots de passe aux comptes anonymes, vous pouvez utiliser les commandes SET PASSWORD et UPDATE. Dans les deux cas, assurez-vous de chiffrer les mots avec la fonction PASSWORD(). Pour utiliser SET PASSWORD sur Windows, fates :
shell> mysql -u root mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('nouveau_mot'); mysql> SET PASSWORD FOR ''@'%' = PASSWORD('nouveau_mot');
Dans la seconde commande SET PASSWORD, remplacez host_name par le nom de l'hte du serveur. C'est le nom qui sera spcifi dans la colonne Host de la ligne du compte root, et qui n'est pas localhost. Si vous ne savez pas quel nom d'hte c'est, utilisez cette commande avant d'utiliser SET PASSWORD :
mysql> SELECT Host, User FROM mysql.user;
Recherchez une ligne qui contient root dans la colonne User et quelque chose d'autre que localhost dans la colonne Host. Puis, utilisez la valeur de Host dans la seconde commande SET PASSWORD. L'autre moyen d'assigner des mots de passe un compte anonyme est d'utiliser la commande UPDATE pour modifier la table user directement. Connectez vous en tant que root et envoyez une commande UPDATE qui assigne une valeur la colonne Password dans les lignes approprie de la table user. La procdure est la mme sous Unix et sous Windows. La commande suivante UPDATE met jour le mot de passe pour les deux comptes en mme temps :
shell> mysql -u root mysql> UPDATE mysql.user SET Password = PASSWORD('nouveau_mot') -> WHERE User = ''; mysql> FLUSH PRIVILEGES;
Aprs voir fait la mise jour des mots de passe dans la table user avec la commande UPDATE, vous devez demander au serveur de relire les tables de droits, avec FLUSH PRIVILEGES. Sinon, les modifications ne seront pas prises en compte avant le prochain redmarrage du serveur.
114
La commande DELETE s'applique Windows et Unix. Sous Windows, si vous voulez supprimer uniquement les comptes anonymes qui ont les mmes droits que root, fates ceci :
shell> mysql -u root mysql> DELETE FROM mysql.user WHERE Host='localhost' AND User=''; mysql> FLUSH PRIVILEGES;
Ce compte permet un accs anonyme avec les pleins droits : le supprimer amliore la scurit. Vous pouvez assigner les mots de passe au compte root de nombreuses faons. La discussion suivante montre trois mthodes : Utiliser la commande SET PASSWORD Utiliser la commande en ligne mysqladmin Utiliser la commande UPDATE Pour assigner un mot de passe avec la commande SET PASSWORD, connectez vous en tant que root et faites deux commandes SET PASSWORD. Assurez vous de chiffrer le mot de passe avec PASSWORD(). Pour Windows, fates ceci :
shell> mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('nouveau_mot'); mysql> SET PASSWORD FOR 'root'@'%' = PASSWORD('nouveau_mot');
Dans la seconde commande SET PASSWORD, remplacez host_name par le nom de l'hte du serveur. C'est le mme nom que celui qui a t utilis pour les comptes anonymes. Pour assigner un mot de passe root en utilisant mysqladmin, excutez les commandes suivantes :
shell> mysqladmin -u root password "nouveau_mot" shell> mysqladmin -u root -h host_name password "nouveau_mot"
Ces commandes s'appliquent Windows et Unix. Dans la seconde commande, remplacez host_name par le nom du serveur hte. Les guillemets doubles autour du mot de passe ne sont pas ncessaires, mais vous devez les utiliser si vous avez des espaces ou d'autres caractres spciaux. Si vous utilisez un serveur d'une trs vieille version de MySQL, la commande mysqladmin va chouer avec un message d'erreur : parse error near 'SET password'. La solution ce problme est de changer la version du serveur MySQL. Vous pouvez aussi utiliser UPDATE pour modifier directement la table user. La commande UPDATE suivante assigne un mot de passe aux comptes root en mme temps :
shell> mysql -u root mysql> UPDATE mysql.user SET Password = PASSWORD('nouveau_mot') -> WHERE User = 'root'; mysql> FLUSH PRIVILEGES;
115
Aprs modification des mots de passe, vous devrez les fournir chaque connexion au serveur. Par exemple, si vous voulez utiliser la commande mysqladmin pour teindre le serveur, vous devez utiliser une commande de cette forme :
shell> mysqladmin -u root -p shutdown Enter password: (enter root password here)
Note : si vous perdez votre mot de passe root aprs l'avoir configur, la procdure pour le remettre zro est prsente dans la section Section A.4.1, Comment rinitialiser un mot de passe Root oubli . Pour crer de nouveaux comptes, utilisez la commande GRANT. Pour les instructions, voyez Section 5.6.2, Ajouter de nouveaux utilisateurs MySQL .
116
Si vous avez des problmes tels que le nouveau serveur mysqld ne peut plus dmarrer, ou que vous ne pouvez pas vous connecter sans un mot de passe, vrifiez que vous n'avez pas un vieux fichier my.cnf dans votre installation! Vous pouvez le vrifier comme ceci : program-name --printdefaults. Si cette commande affiche autre chose que le nom du programme, vous avez un fichier my.cnf actif, qui perturbe vos oprations. C'est une bonne ide que de reconstruire et re-installer le module Msql-Mysql chaque fois que vous faites une nouvelle version de MySQL, en particulier si vous rencontrez des symptmes tels que les DBI qui font des core dump aprs votre mise jour de MySQL.
117
Si vous ne mettez pas jour, certaines commandes telles que DBI->do() ne rapporteront pas correctement les erreurs. L'option --defaults-file=option-file-name vous donnera une erreur si le fichier d'options n'existe pas. Plusieurs comportements visibles ont chang entre MySQL 4.0 et MySQL 4.1 pour corriger des bogues critiques et rendre MySQL plus compatible avec le standard SQL. Ces changements peuvent affecter votre application. Certains des comportement 4.1 peuvent tre tests en version 4.0 avant de passer la 4.1. Nous avons ajout l'option --new de dmarrage de mysqld pour les versions suprieure la 4.0.12. See Section 5.2.1, Options de ligne de commande de mysqld . Cette option vous donne le comportement de la version 4.1 pour les modifications les plus critiques. Vous pouvez aussi activer ces comportements pour une connexion particulire en utilisant la commande SET @@new=1, pour dsactiver cette option avec SET @@new=0. Si vous pensez que certains des changements de la version 4.1 vous affecteront, nous vous recommandons, avant de passer en version 4.1, de tlcharger la dernire version 4.0, et de l'excuter avec l'option --new en plus de vos configuration habituelles :
[mysqld-4.0] new
De cette manire, vous pouvez tester le comportement de la version 4.1 depuis votre serveur 4.0. Cela vous donnera le temps de supprimer les anomalies, et de passer sans problme la version 4.1, ultrieurement. En faisant cela, vous n'allez pas rencontrer de bug accidentel lors du changement, que vous n'aurez pas corrig grce --new. Voici une liste complte, vous indiquant ce quoi vous devez faire attention lors du changement de version : Modification du serveur : Toutes les colonnes et tables ont dsormais un jeu de caractres, qui apparat dans le rsultat de la commande SHOW CREATE TABLE et mysqldump. See Chapitre 10, Jeux de caractres et Unicode. (MySQL 4.0.6 et plus rcent peuvent lire les nouveaux fichiers de dump, mais pas les plus anciennes versions de MySQL). Cela ne doit pas affecter les applications qui n'utilisent qu'un seul jeu de caractres. Le format de dfinition de table du fichier .frm a lgrement chang en version 4.1. Les versions de MySQL 4.0 partir de la 4.0.11 peuvent lire le nouveau format .frm directement, mais les versions plus anciennes ne le peuvent pas. Si vous devez dplacer des tables de la version 4.1 vers une version 4.0.11, passez plutt par mysqldump. See Section 8.8, mysqldump, sauvegarde des structures de tables et les donnes . Note importante : si vous mettez jour en version InnoDB-4.1.1 ou plus rcent, il sera difficile de revenir une version plus ancienne, 4.0 or 4.1.0! Ceci est d aux versions de InnoDB qui ne reconnaissent pas les espaces de table multiples. Si vous utilisez plusieurs serveurs sur la mme machine Windows, vous devriez utiliser l'option -shared_memory_base_name avec des valeurs diffrentes sur toutes les machines. L'interface des fonctions UDF agrgeantes a un peu chang. Vous devez commencer par dclarer une fonction xxx_clear() pour chaque fonction agrgeante XXX(). Evolution du client : mysqldump dispose des options --opt et --quote-names, qui sont actives par dfaut. Vous pouvez les dsactiver avec --skip-opt et --skip-quote-names.
118
Evolution du SQL : La comparaison de chanes fonctionne maintenant conformment au standard SQL : au lieu de supprimer les espaces de fin de chane avant la comparaison, nous compltons les chanes courte avec des espaces. Le problme est que maintenant, 'a' > 'a\t', ce qui n'tait pas le cas avant. Si vous avez des tables avec des colonnes CHAR ou VARCHAR dont le dernier caractres peut tre de code ASCII(32) ou plus petit, vous devez utiliser la commande REPAIR TABLE ou myisamchk. Lorsque vous utilisez des commandes DELETE multi-tables, vous devez utiliser les alias de tables que vous voulez effacer, et non pas le vritable nom de la table. Par exemple, au lieu de :
DELETE test FROM test AS t1, test2 WHERE ...
fates :
DELETE t1 FROM test AS t1, test2 WHERE ...
TIMESTAMP est maintenant retourn comme une chane, au format 'YYYY-MM-DD HH:MM:SS'. L'option --new peut tre utilise depuis la version 4.0.12, pour que le serveur adopte le comportement de la version 4.1 pour ce point. Si vous voulez recevoir la version entire de la valeur, comme en version 4.0, il suffit d'ajouter +0 chaque colonne TIMESTAMP :
mysql> SELECT ts_col + 0 FROM tbl_name;
La largeur d'affichage des colonnes TIMESTAMP ne sont plus supportes. Par exemple, si vous dclarez une colonne de type TIMESTAMP(10), le nombre (10) est ignor. Ces changements sont ncessaires pour respecter les standards SQL. Dans une future version, une autre modification aura lieu, mais restera compatible avec celle-ci : la taille de la valeur TIMESTAMP indiquera le nombre de chiffres voulu pour les fractions de secondes. Les valeurs binaires, comme 0xFFDF, sont maintenant supposes tre des chanes et non pas des nombres. Cela corrige des problmes avec les jeux de caractres, o il est plus pratique d'insrer une chane comme une chane binaire. Avec cette modification, vous devez utiliser la fonction CAST() si vous voulez comparer des valeurs binaires avec les entiers :
mysql> SELECT CAST(0xFEFF AS UNSIGNED INTEGER) < CAST(0xFF AS UNSIGNED INTEGER); -> 0
Si vous n'utilisez pas CAST(), une comparaison lexicale de la chane aura lieu :
mysql> SELECT 0xFEFF < 0xFF; -> 1
Utiliser des chanes binaires dans un contexte numrique, ou bien comparer des valeurs avec les oprateurs comme = devrait fonctionner comme auparavant. L'option --new peut tre utilise partir de la version 4.0.13 pour que le serveur 4.0 se comporte comme le serveur 4.1. Les fonctions qui retournent des DATE, DATETIME, ou TIME sont dsormais traites lors de leur arrive sur le client. Par exemple, en MySQL 4.1, vous obtenez le rsultat suivant :
mysql> SELECT CAST("2001-1-1" as DATETIME); -> '2001-01-01 00:00:00'
Les valeurs DEFAULT ne peuvent plus tre spcifies pour les colonnes de type AUTO_INCREMENT. En 4.0, la clause DEFAULT est ignore silencieusement. En 4.1, une erreur survient. LIMIT n'accepte plus les arguments ngatifs. Utilisez 18446744073709551615 au lieu de -1.
119
SERIALIZE n'est plus une option valide pour la variable sql_mode. Il faut utiliser la commande SET TRANSACTION ISOLATION LEVEL SERIALIZABLE la place. SERIALIZE n'est plus valide comme option de --sql-mode pour mysqld, non plus. Utilisez --transactionisolation=SERIALIZABLE. Changement de l'interface C : Certaines fonctions C telles que mysql_real_query() retournent maintenant 1 en cas d'erreur, et non plus -1. Vous aurez peut tre changer certaines anciennes applications comme ceci :
if (mysql_real_query(mysql_object, query, query_length) == -1) { printf("Erreur"); }
Gestion des mots de passe : Le mcanisme de mot de passe a chang en version 4.1 pour assurer une meilleure scurit, mais cela pose des problmes de compatibilit, si vous avez encore des clients qui utilisent les bibliothques 4.0 ou plus ancien. Il est probable que vous ayez de tels clients, s'ils se connectent depuis des serveurs distants qui n'ont pas encore adopt la version 4.0. La liste suivante prsente les stratgies de mise jour. Elle reprsentent diffrents compromis entre la compatibilit et la scurit. Ne passez pas en version 4.1. Aucun comportement ne changera, mais vous ne pourrez pas utiliser les nouvelles fonctionnalits du protocole de la version 4.1. MySQL a amlior le protocole client/serveur de la version 4.1, en ajoutant les commandes prpares et le support des jeux de caractres. See Section 24.2.4, Fonctions C de commandes prpares . Passez en version 4.1, utilisez le script mysql_fix_privilege_tables pour agrandir la colonne Password de la table user pour qu'elle puisse contenir les nouveaux hashs de mots de passe. Mais lancez le serveur avec l'option --old-passwords pour que les clients pre-4.1 puissent continuer d'utiliser leurs anciens comptes. Finalement, lorsque tous les clients seront passs en version 4.1, vous pourrez cesser d'utiliser l'option --old-passwords. Vous pouvez aussi changer les mots de passe de vos comptes MySQL pour adopter le nouveau format. Passez en version 4.1 et utilisez le script mysql_fix_privilege_tables pour aggrandir la colonne Password de la table user. Si vous savez que tous les clients sont passs en version 4.1, n'utilisez pas l'option --old-passwords. Au lieu de cela, changez les mots de passe de tous les comptes, pour qu'ils adoptent le nouveau format. Une installation 100% 4.1 est la plus sre. D'autres informations sur le nouvel algorithme de protection des mots de passe et les oprations les concernants sont disponibles dans la section Section 5.5.9, Hashage de mots de passe en MySQL 4.1 . Section A.2.3, Erreur Client does not support authentication protocol .
120
Editez les scripts de dmarrage MySQL pour les fichiers de configuration pour ne plus utiliser les options abandonnes, listes ci-dessous. Convertissez vos vieilles tables ISAM en tables MyISAM avec la commande : mysql_convert_table_format database. Pour convertir toutes les tables d'une base de donnes, utilisez cette commande :
shell> mysql_convert_table_format database db_name
Notez que cela ne doit tre fait que si toutes les tables de la base sont des tables ISAM ou MyISAM. Pour viter de convertir toutes les tables d'une base au format MyISAM, vous pouvez explicitement utiliser les noms de vos tables ISAM aprs le nom de la base dans la commande. Vous pouvez aussi utiliser la commande ALTER TABLE table_name TYPE=MyISAM sur toutes les tables ISAM. Les tables individuelles peuvent tre mises au format MyISAM en utilisant la commande ALTER TABLE suivante, pour chaque table :
mysql> ALTER TABLE tbl_name TYPE=MyISAM;
Assurez-vous que vous n'avez pas de client MySQL qui utilise des bibliothques partages (comme les modules Perl Msql-Mysql). Si vous en avez, vous devriez les recompiler car les structures utilises dans libmysqlclient.so ont changes. Si vous utilisez MySQL sur Windows, voyez aussi Section 2.2.11, Mettre jour MySQL sous Windows . Si vous utilisez la rplication, voyez aussi Section 6.6, Changer de version de rplication pour plus de dtails sur la mise jour de la rplication. MySQL 4.0 va fonctionner mme 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 problmes lors de l'volution vers MySQL 4.1 ou plus rcent. Les fichiers ISAM fonctionne toujours en MySQL 4.0 mais il est abandonn, et il sera dsactiv en MySQL 5.0. Les anciens clients doivent fonctionner avec le serveur version 4.0 sans aucun problme. Mme si vous suivez les instructions ci-dessus, vous pourrez retourner en version MySQL 3.23.52 ou plus rcent, si vous rencontrez des difficults 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 complte de points contrler lorsque vous passez la version 4.0 : MySQL 4.0 a de trs nombreux nouveaux droits dans la table mysql.user. See Section 5.5.3, Droits fournis par MySQL . Pour installer ces nouveaux droits, suivez la procdure dans Section 2.6.7, Mise jour des tables de droits . Jusqu' ce que ce script soit excut, les utilisateurs auront les droits de SHOW DATABASES, CREATE TEMPORARY TABLES, et LOCK TABLES. Les droits de SUPER et EXECUTE hritent leur valeur du droit de PROCESS. REPLICATION SLAVE et REPLICATION CLIENT hritent leur valeur de FILE. Si vous avez un script qui cre 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 ide que de les vrifier. En version 4.0.2, l'option --safe-show-database est abandonne (et ne fait plus rien du tout). See Section 5.4.3, Options de dmarrage qui concernent la scurit .
121
Si vous obtenez des interdictions d'accs pour les nouveaux utilisateurs en version 4.0.2, vous devriez vrifier 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. safe_mysqld a t renomm en mysqld_safe. Pour assurer la compatibilit ascendante, les distribution binaires vont inclure pour quelques temps un lien symbolique de safe_mysqld vers mysqld_safe. Le support InnoDB est dsormais inclut par dfaut dans la distribution binaire. Si vous compilez MySQL depuis les sources, et que vous voulez conomiser de la mmoire, utilisez l'option --skipinnodb au dmarrage du serveur. Pour compiler MySQL sans le support InnoDB, utilisez le script configure avec l'option --without-innodb. Les paramtres de dmarrage myisam_max_extra_sort_file_size et myisam_max_extra_sort_file_size sont dsormais exprims en octets, et non plus en Mo, comme cela tait le cas jusqu'en version 4.0.3). mysqld dispose maintenant de l'option --temp-pool active par dfaut, car cela donne de meilleures performances sur certains systmes d'exploitation, et notamment Linux. Les options de dmarrage mysqld --skip-locking et --enable-locking ont t renommes --skip-external-locking et --external-locking. Les systmes externes de verrouillages des tables MyISAM/ISAM sont dsormais dsactivs par dfaut. Vous pouvez les ractiver avec l'option --external-locking. Pour la plupart des utilisateurs, ce n'est jamais ncessaire. Les options de dmarrage suivantes ont t renommes : Ancien nom myisam_bulk_insert_tree_size query_cache_startup_type record_buffer record_rnd_buffer sort_buffer warnings err-log Nouveau nom. bulk_insert_buffer_size query_cache_type read_buffer_size read_rnd_buffer_size sort_buffer_size log-warnings --log-error (for mysqld_safe)
Les options de dmarrage record_buffer, sort_buffer et warnings vont encore fonctionner avec MySQL 4.0 mais elles sont obsoltes. Changements SQL : Les variables SQL suivantes ont chang de nom. Ancien nom SQL_BIG_TABLES SQL_LOW_PRIORITY_UPDATES SQL_MAX_JOIN_SIZE SQL_QUERY_CACHE_TYPE Nouveau nom. BIG_TABLES LOW_PRIORITY_UPDATES MAX_JOIN_SIZE QUERY_CACHE_TYPE
Les anciens noms fonctionneront encore en MySQL 4.0, mais sont obsoltes. Vous devez utiliser la commande SET GLOBAL SQL_SLAVE_SKIP_COUNTER=# au lieu de SET SQL_SLAVE_SKIP_COUNTER=#.
122
SHOW MASTER STATUS retourne dsormais une liste vide si les logs binaires ne sont pas activs. SHOW SLAVE STATUS retourne dsormais une liste vide si l'esclave n'est pas initialis. SHOW INDEX a 2 colonnes de plus (Null et Index_type) qu'il n'avait pas en version 3.23. Le format de SHOW OPEN TABLE a t chang. ORDER BY col_name DESC trie les valeurs NULL en dernier, depuis MySQL 4.0.11. En 3.23 et dans les premires versions de 4.0, ce n'tait pas toujours cohrent. CHECK, SIGNED, LOCALTIME et LOCALTIMESTAMP sont des mots rservs. Les colonnes DOUBLE et FLOAT acceptent dsormais l'option UNSIGNED pour le stockage (auparavant, UNSIGNED tait ignor pour ces colonnes). Le rsultat de toutes les oprations sur les bits, |, &, <<, >> et ~ est maintenant non sign. Cela peut poser des problmes si vous aviez un contexte dans lequel vous souhaitez un rsultat sign. See Section 12.7, Fonctions de transtypage . Note : lorsque vous utilisez la soustraction entre des entiers dont l'un est UNSIGNED, le rsultat sera non sign! En d'autres termes, avant de passer la version MySQL 4.0, vous devriez vrifier les situations o votre application soustrait une valeur d'un entier non sign, et que vous attendez une valeur ngative, ou si vous soustrayez une valeur non signe d'une colonne. Vous pouvez dsactiver ce comportement en utilisant l'option de dmarrage --sql-mode=NO_UNSIGNED_SUBTRACTION lorsque vous dmarrez mysqld. See Section 12.7, Fonctions de transtypage . Vous devriez utiliser des entiers pour stocker les valeurs dans les colonnes de type BIGINT (au lieu d'utiliser des chanes, comme vous le faisiez en MySQL 3.23). Utiliser des chanes va toujours fonctionner, mais passer des entiers est bien plus efficace. En version 3.23, INSERT INTO ... SELECT fonctionne toujours avec l'option IGNORE. En version 4.0.1, MySQL va s'arrter (et peut tre annuler la transaction) si vous ne spcifiez pas l'option IGNORE. 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 effaces 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. Pour utiliser MATCH ... AGAINST (... IN BOOLEAN MODE) avec vos table,s vous devez les reconstruire avec ALTER TABLE table_name TYPE=MyISAM, mme si la table est dj au format MyISAM. See Section 12.6.4, Paramtrage prcis de la recherche en text intgral de MySQL . LOCATE() et INSTR() sont sensibles la casse, si l'un des arguments est une chane binaire. Sinon, ils sont insensibles la casse. STRCMP() utilise dsormais le jeu de caractres courant pour les comparaisons, ce qui signifie que le comportement par dfaut des comparaisons est dsormais insensible la casse. HEX(string) retourne dsormais les caractres convertis sous la forme d'une chane hexadcimale. Si vous voulez convertir un nombre en hexadcimal, vous devez vous assurer d'appeler HEX() avec un argument numrique. RAND(seed) retourne un nombre diffrent en version 4.0 qu'en version 3.23 : cela est fait pour diffrencier plus fortement RAND(seed) de RAND(seed+1). Le type par dfaut retourn par IFNULL(A,B) est maintenant le plus gnral des deux types A et B. (L'ordre est STRING, REAL puis INTEGER). Changements de l'interface C :
123
Les fonctions de l'ancienne API C API mysql_drop_db, mysql_create_db et mysql_connect ne sont plus supportes, 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 problmes, hormis le fait qu'ils peuvent gnrer des messages d'alerte lorsqu'ils sont utilis comme argument de fonctions comme printf(). Les clients multi-threads doivent utiliser mysql_thread_init() et mysql_thread_end(). See Section 24.2.15, Comment faire un client MySQL thread . Autres changements : Si vous voulez recompiler le module Perl DBD::mysql, vous devez prendre les versions Msql-Mysqlmodules 1.2218 ou plus rcente, car les anciennes versions des module DBD utilisent une fonction drop_db() abandonne.
124
Le type de retour par dfaut de IF() dpendant maintenant des deux arguments, et plus seulement du premier. AUTO_INCREMENT ne fonctionne pas sur les nombres ngatifs. La raison pour cela est que les nombres ngatifs posaient des problmes d'crasement entre -1 et 0. AUTO_INCREMENT pour les tables MyISAM est maintenant gr un niveau plus bas, et il est bien plus rapide. Pour les tables MyISAM, les anciens numros ne sont plus rutiliss, mme si vous effacez des lignes dans la table. CASE, DELAYED, ELSE, END, FULLTEXT, INNER, RIGHT, THEN et WHEN sont de nouveaux mots rservs. FLOAT(p) est maintenant un vritable type de nombre virgule flottante, avec un nombre dfini de dcimales. Lors de la dclaration de DECIMAL(length,dec), la taille de l'argument n'inclut plus une place pour le signe ou le sparateur dcimal. Une chane 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 chanes en appliquant les mmes rgles 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 chanes normales (non binaires). Quand vous vrifiez/rparez des tables, vous devez utiliser CHECK TABLE ou myisamchk pour les tables MyISAM (.MYI) et isamchk pour les tables ISAM (.ISM). Vrifiez tous vos appels DATE_FORMAT() pour vous assurer qu'il y a un signe pourcentage % avant chaque caractre de format (MySQL version 3.22 et plus rcent avait dj cette syntaxe, mais dsormais % est obligatoire). En MySQL version 3.22, le rsultat de SELECT DISTINCT ... tait toujours tri. En version 3.23, vous devez spcifier la clause GROUP BY ou ORDER BY pour obtenir un rsultat tri. SUM() retourne dsormais 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 dsormais retourner NULL au lieu de 0. Cela affecte surtout les requtes qui utilisait NOT ou une expression AND/OR telle que NOT NULL = NULL. LPAD() et RPAD() vont rduire la taille de la chane rsultante, si elle est plus grand que l'argument de taille. Changement de l'interface C : 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).
125
Aprs avoir install MySQL version 3.22, vous devriez dmarrer le nouveau serveur, et excuter 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. La procdure pour mettre jour les tables de droits est dcrite dans Section 2.6.7, Mise jour des tables de droits . 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 rcrire le client pour qu'il envoie l'lment db, et acclre 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 dmarrage.
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 changs). Les modifications actuelles affectent les requtes des anciennes applications : HAVING doit tre spcifi avant la clause ORDER BY. Les paramtres de la fonction LOCATE() ont t changs.
126
Il y a de nouveaux mots rservs. Les plus notables sont DATE, TIME et TIMESTAMP.
Vous devez excuter ce script lorsque le serveur fonctionne. Le script tente de se connecter au serveur local avec le compte root. Si votre compte root requiert un mot de passe, indiquez-le en ligne de commande. Depuis MySQL 4.1 et plus rcent, spcifiez le mot de passe comme ceci :
shell> mysql_fix_privilege_tables --password=root_password
Pour les versions antrieures la version MySQL 4.1, spcifiez le mot de passe comme ceci :
shell> mysql_fix_privilege_tables root_password
L script mysql_fix_privilege_tables effectue les manipulations ncessaires pour convertir vos tables de droits au format courant. Vous pouvez apercevoir des alertes Duplicate column name durant l'excution du script : ces alertes peuvent tre ignores sans danger. Aprs avoir excut le script, arrtez le serveur, et relancez le. Sous Windows, il n'existe pas de moyen facile de modifier les tables de droits jusqu' MySQL 4.0.15. Depuis la version 4.0.15 on, la distribution MySQL inclut un script SQL mysql_fix_privilege_tables.sql que vous pouvez utiliser avec le client mysql. Si votre installation MySQL est situe dans le dossier C:\mysql, la commande a utiliser ressemble celle-ci :
C:\mysql\bin> mysql -u root -p mysql mysql> SOURCE C:\mysql\scripts\mysql_fix_privilege_tables.sql
Si votre installation est situe dans un autre dossier, vous devrez adapter les chemins. La commande mysql vous demandera le mot de passe pour le compte root : saisissez-le lorsqu'il est demand. Comme pour la procdure Unix, vous pouvez voir apparatre des alertes Duplicate column name durant le traitement de votre base mysql par le script mysql_fix_privilege_tables.sql : elles peuvent tre ignores. Aprs avoir excut le script arrtez le serveur, et relancez-le.
127
Par dfaut, mysqldump va crer un fichier de requtes SQL. Vous pouvez alors transfrer 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 envoyez les donnes 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 dplacer une base de donnes entre deux machines et d'excuter les commandes suivantes sur la machine qui hberge 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 rseau 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 rsultat dans un fichier, et transfrer 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 > db_name.contents.gz
Le fichier cr est compress. Transfrez le fichier contenant le contenu de votre base sur la machine de destination, puis utilisez ces commandes :
shell> mysqladmin create db_name shell> gunzip < db_name.contents.gz | mysql db_name
Vous pouvez aussi utiliser mysqldump et mysqlimport pour accomplir cette opration. Pour les grandes tables, c'est bien plus rapide que d'utiliser simplement mysqldump. Dans les commandes suivantes, DUMPDIR reprsente le chemin complet du dossier que vous utilisez pour stocker le rsultat de mysqldump. Premirement, crez un dossier pour les fichiers d'exportation, puis faites l'export :
shell> mkdir DUMPDIR shell> mysqldump --tab=DUMPDIR db_name
Puis transfrez 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 shell> cat DUMPDIR/*.sql | mysql db_name shell> mysqlimport db_name DUMPDIR/*.txt # Cration de la base # Cration des tables dans la base # Chargement des donnes dans les tables
N'oubliez pas non plus de copier le contenu de votre base mysql car c'est l que rsident les droits (user, db, host). Vous devrez alors excuter les commandes en tant que root MySQL sur la nouvelle machine, jusqu' ce que vous ayez rinstall mysql. Aprs l'importation de la base mysql sur la nouvelle machine, excutez la commande mysqladmin flush-privileges pour que le serveur relise les droits.
128
pas besoin de toucher aux donnes. Comme toujours, il est cependant recommand de faire une sauvegarde. Les informations suivantes sont garder comme liste de vrification avant de faire la migration : Lisez la section de mise jour pour les versions que vous allez utiliser, et assurez-vous que vous n'aurez pas besoin de fonctionnalits qui ne seront plus disponibles. Section 2.6, Changer de version de MySQL . S'il y a une section de rduction de version pour votre installation, lisez-la. Vous pouvez toujours copier les fichiers de format et de donnes entre diffrentes installation de la mme famille, sur la mme architecture. La version en production actuellement est la version 4.1. Si vous passez d'une version de production une autre plus ancienne, il est possible que vous rencontriez des incompatibilits dans les formats de stockage de table. Dans ce cas, utilisez la commande mysqldump pour exporter vos tables avant de faire la migration. Aprs la mise jour, importez nouveau les tables avec la commande mysql ou mysqlimport. Voyez Section 2.6.8, Migrer depuis une autre architecture pour des exemples. Le symptme normal d'incompatibilit entre deux versions de tables est l'impossibilit d'ouvrir la table. Dans ce cas, utilisez la procduire suivante : 1. Stoppez le vieux serveur MySQL, celui qui est l'objectif de votre migration. 2. Redmarrez le nouveau serveur, que vous essayez de quitter. 3. Exportez les tables qui taient inaccessibles sur le vieux serveur, en utilisant la commande mysqldump pour crer un fichier d'export. 4. Stoppez le nouveau serveur et relancez l'ancien. 5. Rechargez les fichiers exports dans le vieux serveur. Vos tables devraient tre disponibles.
Dans ce cas, suivez ces instructions : 1. Lancez MySQL 5.0.4 ou plus rcent. 2. Excutez la commande mysql_fix_privilege_tables, qui va changer la table mysql.user pour qu'elle ait un format que les deux versions 4.1 et 5.0 peuvent utiliser. 3. Arrtez le serveur MySQL. 4. Lancez MySQL 4.1. Si la procdure prcdente choue, alors il faut suivre ces instructions : 1. Lancez MySQL 5.0.4 ou plus rcent. 2. Excutez la commande mysqldump --opt --add-drop-table mysql > /tmp/ mysql.dump. 3. Arrtez le serveur MySQL. 4. Lancez MySQL 4.1 avec l'option --skip-grant.
129
5. Excutez la commande mysql mysql < /tmp/mysql.dump. 6. Excutez la commande mysqladmin flush-privileges.
Puis, arrtez le nouveau serveur, relancez l'ancien, et importez les donnes depuis ce fichier :
shell> mysql db_name < dump_file
Dans le cas particulier o vous utilisez des tables MyISAM, aucun traitement spcial n'est ncessaire si toutes les colonnes contiennent des nombres ou des chanes de caractres (CHAR, VARCHAR, TEXT etc) qui ne contiennent que des caractres latin1. Dans ce cas, les tables version 4.1 devraient tre directement utilisables en version 4.0. Si vous utilisez le script mysql_fix_privilege_tables pour mettre jour les tables de droits, vous pouvez utilisez la mthode prcdente pour convertir les tables en version 4.0, ou appliquez les commandes suivantes aux tables version 4.1 :
ALTER ALTER ALTER ALTER ALTER ALTER TABLE TABLE TABLE TABLE TABLE TABLE mysql.user CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci; mysql.db CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci; mysql.host CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci; mysql.tables_priv CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci; mysql.columns_priv CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci; mysql.func CONVERT TO CHARACTER SET latin1 COLLATE latin1_swedish_ci;
MySQL require au moins la version 2.0 de Linux. Attention : Certains utilisateurs de MySQL nous ont avertis qu'ils ont rencontr de graves problmes 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 rcent) ou a un noyau 2.4. Si vous utilisez un ordinateur multi-processeurs, vous devriez srieusement songer passer au noyau 2.4 qui vous apportera de grandes performances niveau vitesse. La version binaire est lie avec -static, ce qui signifie que normalement vous n'avez pas besoin de vous soucier des versions des bibliothques systme que vous avez. Vous n'avez pas besoin d'installer LinuxThreads non plus. Un programme li avec -static est lgrement plus grand qu'un programme lie dynamiquement mais aussi un peu plus rapide (3-5%). Un problme, toutefois, est que vous ne pouvez utiliser de fonctions dfinies par l'utilisateur avec un programme li statiquement. Si vous allez crire ou utiliser des fonctions UDF (c'est rserv aux dveloppeurs C ou C++), vous devez compiler MySQL vous-mme, en utilisant les liaisons dynamiques. Si vous utilisez un systme bas sur libc (au lieu de glibc2), vous aurez probablement quelques problmes de rsolution des noms d'htes et des problmes avec getpwnam() avec les versions binaires. (Cela vient du fait que glibc dpend malheureusement de quelques bibliothques externes pour rsoudre les noms d'htes et getpwent(), mme quand elle est compile avec -static). Dans ce cas, vous obtiendrez probablement l'erreur suivante quand vous excuterez mysql_install_db :
Sorry, the host 'xxxx' could not be looked up
ou l'erreur suivante quand vous essayez de dmarrer mysqld avec l'option --user :
getpwnam: No such file or directory
Vous pouvez rsoudre ce problme de la faon suivante : Obtenez une distribution des sources MySQL (un distribution RPM ou le tar.gz) et installez la la place. Excutez mysql_install_db --force; cela n'excutera pas le test resolveip dans mysql_install_db. Le mauvais ct est que vous ne pourrez pas utiliser de noms d'htes 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. Dmarrez mysqld avec su au lieu d'utiliser --user. Le binaire Linux-Intel et les RPM de MySQL sont configurs pour la vitesse la plus grande possible. Nous essayons toujours d'utiliser le compilateur le plus rapide disponible. Le support Perl de MySQL require la version 5.004_03 de Perl ou plus rcent. 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 problme est que Linux possde un dlai entre votre fermeture de la socket TCP/IP et sa libration par le systme. Vu qu'il y a un nombre fini de places pour les branchements TCP/IP, vous obtiendrez l'erreur prcdente si vous essayez de faire beaucoup de connexions TCP/IP en peu de temps, comme quand vous excutez le benchmark MySQL test-connect via TCP/IP. Nous avons envoy des questions plusieurs fois propos de ce problme diffrentes listes de diffusions Linux mais n'avons jamais russi rsoudre ce problme proprement. Le seul correctif connu pour ce problme est d'utiliser des connexions persistantes dans vos clients ou d'utiliser les sockets, si vous utilisez le serveur de bases de donnes et le client sur la mme machine. Nous esprons que le noyau de Linux 2.4 corrigera ce problme bientt.
131
132
scuritaires pour MySQL, et amliore significativement les performances, mais nous ne pouvons pas nous avancer pour les autres applications. Si vous compilez d'autres applications qui requirent les LinuxThreads avec la version statique corrige de la bibliothque, fates le vos risques et prils. Si vous rencontrez des problmes tranges durant l'installation de MySQL, ou si vous voyez les utilitaires se geler, il est trs probable que vous ayez un problme de compilateur ou de bibliothque. Dans ce cas, utiliser notre binaire rsoudra vos problmes. Si vous compilez vos propres clients MySQL, vous pouvez rencontrer l'erreur suivante durant l'excution :
ld.so.1: fatal: libmysqlclient.so.#: open failed: No such file or directory
Ce problme peut tre vit avec les mthodes suivantes : Compilez le client avec l'option -Wl,r/full/path/to/libmysqlclient.so plutt que -Lpath). Copiez libmysqlclient.so dans /usr/lib. Ajoutez le chemin du dossier o libmysqlclient.so est situ dans la variable d'environnement LD_RUN_PATH avant de lancer votre client. Si vous utilisez le compilateur Fujitsu (fcc/FCC), vous aurez des problmes pour compiler MySQL car le fichier d'entte Linux est trs orient gcc. La ligne de configuration 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
Si vous avez plus de 16 Mo de mmoire, vous devez ajouter quelque 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 excuter les commandes prcdentes partir de la ligne de commande en tant que root, mais les changements seront perdus au prochain redmarrage de l'ordinateur.
133
Vous pouvez sinon dfinir ces paramtres lors du dmarrage 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 /etc/sysctl.conf :
# Increase some values for MySQL fs.file-max = 65536 fs.dquot-max = 8192 fs.super-max = 1024
Cela va autoriser le serveur un maximum de 8192 de connexions et fichiers ouvertes simultanment. La constante STACK_SIZE des LinuxThreads contrle 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 thread individuel, mais assez petite pour empcher les piles de certains threads d'agir sur les donnes globales de mysqld. Malheureusement, l'implmentation Linux de mmap(), comme nous l'avons dcouvert, va librer une rgion rserve, si vous lui demandez de librer une adresse dj utilise, dtruisant les donnes de la page, au lieu de retourner une erreur. Donc, la scurit de mysqld et des autres applications qui dpendent d'un comportement civils du code qui gre les threads. L'utilisateur doit s'assurer que le nombre de threads fonctionnant simultanment est suffisamment bas pour viter d'entrer dans la pile globale. Avec mysqld, vous devez suivre cette rgle de bon fonctionnement en donnant une valeur raisonnable max_connections. Si vous compilez MySQL vous-mmes, vous pouvez corriger LinuxThreads pour amliorer l'utilisation de la pile. See Section 2.8.1.3, Notes sur la distribution source de Linux . Si vous ne voulez pas corriger LinuxThreads, vous ne devez pas dpasser 500 pour la valeur de max_connections. Cela devrait mme 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 mmoire 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 problmes, en supposant que vous n'avez ni de grosses tables heap ni grands tampons de clefs. Plus vous rduirez STACK_SIZE dans LinuxThreads plus les threads crs seront srs. Nous recommandons une valeur entre 128 ko et 256 ko. Si vous utilisez beaucoup de connexions simultanes, vous pouvez souffrir d'une ``fonctionnalit'' du noyau 2.2, qui tente d'viter les DOS par fork en pnalisant les processus qui forkent ou qui clonent des fils. Cela fait que MySQL ne se comporte pas bien si vous augmentez le nombre de clients simultans. Sur les systmes mono-processeurs, nous avons vu des symptmes sous la forme de ralentissement : il prenait un trs long temps pour se connecter (parfois une minute), et il fallait autant de temps pour terminer le processus. Sur les systmes multi-processeurs, nous avons observ une dcroissance graduelle des performances des requtes chez de nombreux clients. Durant nos recherches pour corriger le problme, nous avons reu un patch d'un client qui prtendait avoir rsolu le problme pour son site. Ce patch est disponible sur http://www.mysql.com/Downloads/Patches/ linux-fork.patch. Nous avons maintenant fait des tests exhaustifs de ce patch en dveloppement et en production. Il a amlior significativement les performances sans causer de problmes, et nous l'avons recommand nos utilisateurs qui fonctionnent avec des serveurs chargs et un noyau 2.2. Ce problme a t rgl avec le noyau 2.4 : si vous n'tes pas satisfait avec les performances courantes de votre systme, au lieu de le corriger, passez donc votre noyau 2.2 en 2.4. Sur les systmes multi-processeurs, la mise jour vous donnera d'ailleurs un regain de puissance, en plus de corriger le bug. Nous avons test MySQL sur des noyaux 2.4 et sur des machines bi-processeurs, et nous avons trouv que MySQL se comporte beaucoup mieux. Il n'y avait pratiquement pas de ralentissement de requtes mme avec 1000 client, et gain de puissance tait de 180% (calcul avec le ratio de vitesse maximale divis par la vitesse moyenne d'un client). Nous avons observ des rsultats similaires sur
134
une machine quadri-processeurs : virtuellement aucun ralentissement alors que le nombre de clients est mont jusqu' 1000, et le gain de puissance a atteind 300%. En se basant sur ces rsultats, pour un serveur haute performances multi-processeurs, nous vous recommandons de passer en noyau 2.4. Nous avons dcouvert qu'il est essentiel de faire fonctionner les processus mysqld avec la priorit maximal sur le noyau 2.4 pour atteindre les meilleures performances. Cela peut se faire en ajoutant la commande renice -20 $$ dans mysqld_safe. Durant nos tests sur une machine quadriprocesseurs, augmenter la priorit a engendr 60% d'amlioration avec 400 clients. Nous essayons aussi de rassembler plus d'informations sur comment MySQL se comporte sur un systme 2.4 quadri- ou octo-processeurs. Si vous avez accs a de telles donnes, envoyez nous un email <benchmarks@mysql.com> avec les rsultats. Nous allons les tudier pour les inclure dans le manuel. Si vous voyez un processus mysqld mort avec ps, c'est que vous avez dcouvert un bug dans MySQL ou qu'une des tables est corrompue. See Section A.4.2, Que faire si MySQL plante constamment ? . Pour obtenir un core dump sur Linux si mysqld se termine avec un signal SIGSEGV, vous pouvez lancer mysqld avec l'option --core-file. Notez que vous aurez probablement augmenter la taille du fichier core en ajoutant la commande ulimit -c 1000000 mysqld_safe ou en lanant mysqld_safe avec --core-file-size=1000000. See Section 5.1.3, safe_mysqld, le script pre de mysqld .
Faites ce que le message d'erreur dit et ajoutez un _ la macro _P qui n'en a qu'un, puis essayez nouveau. Vous pouvez obtenir quelques avertissements en compilant; celles qui suivent peuvent tre ignores :
mysqld.cc -o objs-thread/mysqld.o mysqld.cc: In function `void init_signals()': mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int' mysqld.cc: In function `void * signal_hand(void *)': mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int'
135
Si mysqld provoque toujours un plantage au dmarrage, le problme peut tre que vous avez un vieux /lib/libc.a. Renommez le, puis supprimez sql/mysqld et faites nouveau un make install puis ressayez. Ce problme 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'
Si mysqld se plante immdiatement, et que vous utilisez Red Hat Version 5.0, avec une version de glibc plus ancienne que 2.0.7-5, il est recommand d'installer les patches glibc. Il y a beaucoup d'informations ce sujet dans les archives courriel, disponibles sur http://lists.mysql.com/.
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 \ --disable-shared
136
Le dbogage d'applications threades comme MySQL ne fonctionnera pas avec gdb 4.18. Vous devez tlcharger et utiliser gdb 5.1 la place ! Si vous essayez de lier statiquement mysqld en utilisant gcc, l'image rsultante videra son noyau (core dump) au dmarrage. En d'autres termes, n'utilisez pas --with-mysqld-ldflags=-allstatic avec gcc.
Sur IA64 les binaires des clients MySQL utilisent des bibliothques partages. Cela signifie que si vous installez notre distribution binaire un autre endroit que /usr/local/mysql vous devez modifier le fichier /etc/ld.so.conf ou ajouter le chemin vers le rpertoire o vous avez libmysqlclient.so la variable d'environnement LD_LIBRARY_PATH. See Section A.3.1, Problmes lors de la liaison avec la bibliothque du client MySQL .
137
Dans ce cas, vous devez utiliser GNU tar (gtar) pour dsarchiver la distribution. Vous pouvez en trouver une copie prcompile pour Solaris sur http://www.mysql.com/Downloads/. La gestion native des threads Sun fonctionne uniquement depuis Solaris 2.5. Pour les versions 2.4 et antrieures, MySQL utilisera automatiquement les MIT-pthreads. See Section 2.4.5, Notes relatives aux 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 dfectueuse! Dans ce cas, vous devez mettre jour votre compilateur en faveur d'une version plus rcente. Vous pouvez aussi rsoudre le problme en innrant 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 http://gcc.gnu.org/. Notez que egcs 1.1.1 et gcc 2.8.1 ne fonctionnent pas correctement sur SPARC! La ligne configure recommande 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 supplmentaires en ajoutant "-mcpu=v8 -Wa,-xarch=v8plusa" CFLAGS et CXXFLAGS. Si vous utilisez le compilateur Forte 5.0 (et suprieur) de Sun, vous pouvez lancer configure de la faon suivante :
CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt" \ CXX=CC CXXFLAGS="-noex -mt" \ ./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 plutt que gcc 3.2 avec les marqueurs -mcpu. Si vous crez un binaire 64 bits, il est de 4% plus lent que le binaire 32 bits,mais en contrepartie vous pouvez grer davantage de treads et de mmoire. Si vous rencontrez des problmes avec fdatasync ou sched_yield, vous pouvez les rsoudre en ajoutant LIBS=-lrt la ligne configure.
138
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'enttes pthread.h de Solaris. C'est un bogue de Sun (compilateur ou fichier d'inclusion dfectueux). Si mysqld gnre 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 ressayez. 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 sunfreeware.com, vous pouvez rencontrer de nombreux problmes. Vous devriez recompiler gcc et les GNU binutils sur la machine partir de laquelle 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'
La meilleure chose faire dans ce cas est d'obtenir la version la plus rcente 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 bibliothques systme (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 undefined reference to `dlopen' cannot find -lrt
Si de nombreux processus essaient de se connecter trs 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 dprci depuis MySQL 4.0, utilisez uniquement -back_log=50. Si vous liez votre propre client MySQL, vous pouvez avoir l'erreur suivante quand vous le lancez :
ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory
139
Liez le client avec le marqueur suivant ( la place de -Lpath) : -Wl,r/full-path-tolibmysqlclient.so. Copiez libmysqlclient.so dans /usr/lib. Ajoutez le chemin du rpertoire o libmysqlclient.so 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 compress de communication, vous devrez vous procurer et installer zlib sur ftp.gnu.org. Configurez avec --with-named-z-libs=no. Si vous utilisez gcc et rencontrez des problmes 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 crer 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.
Si cela arrive, vous pouvez faire ce qui suit pour rsoudre ce problme : 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 faons, aprs avoir apport la correction, vous devez effacer config.cache et excuter configure nouveau ! Si vous obtenez des erreurs comme celles qui suivent quand vous excutez make, c'est parce que configure n'a pas dtect le fichier curses.h (probablement cause de l'erreur dans /usr/ include/widec.h) :
In file included from mysql.cc:50: /usr/include/term.h:1060: syntax error before `,'
140
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-excutez configure. Effacez la ligne #define HAVE_TERM di fichier config.h et excutez 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 problme est probablement que votre fichier libz.so est install dans /usr/local/lib. Vous pouvez corriger ceci en utilisant l'une des mthodes suivantes : Ajoutez /usr/local/lib LD_LIBRARY_PATH. Ajoutez un lien vers libz.so 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.
Cela va viter les problmes avec la bibliothque libstdc++ et avec les exceptions C++. Si cela ne vous aide pas, il est recommand de compiler une version de dbogage, et de l'excuter avec un fichier de trace sous gdb. See Section D.1.3, Dboguer mysqld sous gdb .
141
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 dernires versions 2.2.x mais vous rencontrerez probablement des problmes en coupant mysqld. Malheureusement, certains appels systmes sur FreeBSD ne sont pas encore totalement compatibles avec les threads. Le cas le plus notable est la fonction gethostbyname() qui est utilise par MySQL pour convertir des noms d'htes en adresse IP. Dans certaines circonstances, le processus mysqld va soudainement prendre 100% du processeur, et ne plus rpondre. Si vous rencontrez cette situation, essayez de relancer MySQL avec l'option --skip-name-resolve. Alternativement, vous pouvez compiler MySQL sur FreeBSD 4.x avec la bibliothque LinuxThreads, qui vite les quelques problmes que l'implmentation thread native de FreeBSD a. Pour une bonne comparaison entre LinuxThreads et les threads natifs, voyez l'article de Jeremy Zawodny FreeBSD or Linux for your MySQL Server ? http://jeremy.zawodny.com/blog/archives/000697.html. Un problme connu lors de l'utilisation des LinuxThreads sur FreeBSD est que wait_timeout ne fonctionne pas (probablement un problme de gestion des signaux sous FreeBSD/LinuxThreads). Cela devrait tre corrig en FreeBSD 5.0. Le symptme est que les connexions persistantes vont rester bloques trs longtemps sans se refermer. Le processus de compilation de MySQL requiert GNU make (gmake) pour fonctionner. Si vous voulez compiler MySQL vous devez d'abord installer GNU make. La mthode recommande pour compiler et installer MySQL sur FreeBSD avec gcc (2.95.2 et plus rcent) 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 cd /usr/local/mysql bin/mysql_install_db --user=mysql bin/mysqld_safe &
Si vous remarquez que configure va utiliser MIT-pthreads, il faut alors lire les notes MITpthreads. See Section 2.4.5, Notes relatives aux MIT-pthreads . Si vous avez une erreur durant make install qui dit qu'il ne peut trouver /usr/include/ pthreads, configure n'a pas dtect l'absence de MIT-pthreads. Pour corriger le problme, supprimez config.cache, puis relancez configure avec l'option --with-mit-threads. Assurez-vous que votre configuration de la rsolution des noms est bonne. Sinon, vous airez peut-tre quelques problmes lors de la connexion mysqld. Assurez-vous que l'entre localhost dans le fichier /etc/hosts est correcte (sinon, vous aurez des problmes pour vous connecter la base de donnes). Le fichier doit commencer par une ligne similaire :
127.0.0.1 localhost localhost.votre.domaine
FreeBSD est aussi connu pour avoir une petite limite de gestionnaires de fichiers par dfaut. See Section A.2.17, Fichier non trouv . Dcommentez la section ulimit -n dans safe_mysqld ou enlevez la limite pour l'utilisateur mysqld dans /etc/login.conf (et regnrez le avec cap_mkdb). Assurez-vous aussi de dfinir la classe approprie pour cet utilisateur dans le fichier des mots de passe si vous n'utilisez pas celui par dfaut. (utilisez : chpass nom-utilisateur-mysqld). See Section 5.1.3, safe_mysqld, le script pre de mysqld . Si vous avez beaucoup de mmoire, vous devriez penser recompiler le noyau pour permettre MySQL d'utiliser plus de 512 Mo de RAM. Regardez l'option MAXDSIZ dans le fichier de configuration de LINT pour plus d'informations.
142
Si vous avez des problmes avec la date courante dans MySQL, configurer la variable d'environnement TZ aidera srement. See Annexe E, Variables d'environnement. Pour obtenir un systme scuris et stable, vous ne devez utiliser que les noyaux FreeBSD marqus RELEASE.
Essayez d'utiliser ulimit -v 80000 et excutez 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 problmes avec bash et ulimit. Si vous utilisez gcc, vous aurez peut-tre aussi utiliser l'option --with-low-memory de configure pour pouvoir compiler sql_yacc.cc. Si vous avez des problmes avec la date courante dans MySQL, configurer la variable TZ vous aidera probablement. See Annexe E, Variables d'environnement.
143
Vous pouvez changer les rpertoires si vous voulez, ou utiliser les valeurs par dfaut en ne spcifiant pas de chemins. Si vous avez des problmes de performances alors que la charge est petite, essayez d'utiliser l'option --skip-thread-priority de mysqld ! Cela excutera tous les threads avec la mme 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 excutant 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 problmes avec bash et ulimit.
144
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
Cela rsoudra le problme de l'obtention de EWOULDBLOCK partir de recv() et EBADF partir de accept() dans les applications threades. Si vous utilisez gcc 2.95.1 sur un systme HP-UX 11.x non-corrigs, vous obtiendrez l'erreur :
In file included from /usr/include/unistd.h:11, from ../include/global.h:125, from mysql_priv.h:15, from item.cc: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 item.cc:19:
Le problme est que HP-UX ne dfinit pas pthreads_atfork() avec cohrence. Il possde des prototypes en conflit dans /usr/include/sys/unistd.h:184 et /usr/include/sys/ pthread.h:440 (dtails 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 dfinition dans pthread.h. Voici les modifications :
extern int pthread_atfork(void (*prepare)(), void (*parent)(), void (*child)());
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
145
Vrifiez que le chemin vers le compilateur K&R ne prcde pas le chemin vers le compilateur C et C++ HP-UX. Une autre raison qui pourrait vous empcher de compiler, et le fait de n'avoir pas dfinit l'option +DD64 ci-dessus.
Ce sont les options utilises pour compiler la distribution de MySQL qui peut tre trouve sur http:// www-frec.bull.com/. Si vous changez le -O3 en -O2 dans la ligne prcdente, 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 sre pour les threads ! (Cela est test avec egcs 1.1.) Il y a aussi quelques problmes connus avec l'assembleur d'IBM, qui peuvent lui faire gnrer 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 ncessaire pour que la compilation se passe sans problmes. IBM est au courant de ce problme 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 exceptions et que l'option en question gnre un code plus rapide, nous vous recommandons de toujours utiliser cette option avec egcs / gcc. Si vous obtenez un problme 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 sre la plupart du temps, mme sur une machine power2.
146
Si vous ne savez pas quel est votre processeur, excutez "uname -m", cela vous renverra une chane comme "000514676700", avec un format xxyyyyyymmss o xx et ss sont toujours des zros, yyyyyy est un identifiant unique du systme et mm est l'identifiant du CPU Planar. Une liste de ces valeurs peut tre trouve sur http://publib.boulder.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/ uname.htm. Cela vous donnera un type et un modle de machine que vous pouvez utiliser pour dterminer quel type de processeur vous avez. Si vous avez des problmes avec les signaux (MySQL se termine de manire imprvue lors des montes en charge) vous avez peut-tre trouv un bogue du systme 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 commande. Sur 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 : Aprs la configuration, ditez config.h et include/my_config.h et changez la ligne qui comporte
#define HAVE_SNPRINTF 1
en
#undef HAVE_SNPRINTF
Si vous avez besoin d'allouer beaucoup de mmoire au processus mysqld, il ne suffit pas de configurer 'ulimit -d unlimited'. Vous aurez aussi configurer dans mysqld_safe quelque chose comme :
export LDR_CNTRL='MAXDATA=0x80000000'
Vous trouverez plus d'informations sur l'utilisation d'une grande quantit de mmoire sur : http:// publib16.boulder.ibm.com/pseries/en_US/aixprggd/genprogc/lrg_prg_support.htm.
Lors de la compilation de readline, vous pouvez obtenir des avertissements propos de dfinitions dupliques. Vous pouvez les ignorer. Lors de la compilation de mysqld, il y aura quelques avertissements implicit declaration of function. Vous pouvez les ignorer.
147
Lorsque vous compilez mysqld, vous pouvez voir apparatre des alertes comme celles-ci :
mysqld.cc: In function void handle_connections()': mysqld.cc:626: passing long unsigned int *' as argument 3 of accept(int,sockadddr *, int *)'
Vous pouvez les ignorer tranquillement. Elles apparaissent car configure ne peut dtecter que des erreurs, et pas des alertes. Si vous dmarrez le serveur directement en ligne de commande, vous pouvez rencontrer des problmes d'interruption si vous vous dconnectez. Lorsque vous vous dconnectez, les processus en cours reoivent le signal SIGHUP. Si c'est le cas, essayez de dmarrer le serveur comme ceci :
shell> nohup mysqld [options] &
nohup fait que la commande suivante va ignorer les signaux SIGHUP envoys par le terminal. Alternativement, vous pouvez dmarrer le serveur avec le script safe_mysqld, qui appelle le dmon mysqld avec l'option nohup pour vous. See Section 5.1.3, safe_mysqld, le script pre de mysqld . Si vous avez des problmes pour compiler mysys/get_opt.c, vous pouvez simplement supprimer la ligne #define _NO_PROTO au dbut 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 problme avec libtool, lorsque vous compilez les bibliothques partages, ou lorsque vous compilez mysql, vous devriez pouvoir rsoudre ce problme 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 \ ../libmysql/.libs/libmysqlclient.so -lm cd .. gnumake gnumake install scripts/mysql_install_db
148
Si vous avez des problmes avec le fichier c_asm.h, vous pouvez crer un fichier inerte c_asm.h avec :
touch include/c_asm.h CC=gcc CFLAGS=-I./include \ CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql
Notez que les problmes suivants avec le programme ld peuvent tre corrigs en tlchargeant le dernier kit de patch de DEC (Compaq) : http://ftp.support.compaq.com/public/unix/. Su OSF/1 V4.0D et avec le compilateur DEC C V5.6-071 on Digital Unix V4.0 (Rev. 878) le compilateur prsente un comportement trange (undefined asm symbols). /bin/ld apparat aussi comme incorrect (problmes avec des erreurs _exit undefined survenant lors du link de mysqld). Sur ce systme, nous avons russi compiler MySQL avec le script configure suivant, aprs avoir remplac /bin/ld par la version de OSF 4.0C:
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
Avec certaines versions de OSF/1, la fonction alloca() est bogue. Corrigez cela en supprimant la ligne du fichier config.h qui dfinit 'HAVE_ALLOCA'. La fonction alloca() a aussi un prototype incorrect dans /usr/include/alloca.h. L'alerte en rsultant peut tre ignore. Le script configure va utiliser automatiquement les bibliothques de threads suivantes : --withnamed-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 problmes avec les signaux (MySQL s'arrte inopinment 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 interrompu lorsqu'il mettra la prochaine commande. Avec gcc 2.95.2, vous aurez probablement les problmes de compilation suivants :
149
sql_acl.cc: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 dernire ligne gcc, tout en remplaant le code -O3 par le code -O0 ou ajouter le code -O0 immdiatement aprs gcc si vous n'avez aucune option -O sur votre ligne de compilation). Aprs cela, vous pouvez retourner au niveau de la racine de MySQL, et tenter nouveau un make.
Vous devrez peut-tre supprimer quelques dfinitions dans config.h aprs avoir excut configure et avant de compiler. Sur quelques implmentations d'Irix, la fonction alloca() ne marche pas. Si le serveur mysqld se stoppe sur quelques requtes SELECT, supprimez les lignes de config.h qui dfinissent HAVE_ALLOC et HAVE_ALLOCA_H. Si mysqladmin create ne fonctionne pas, supprimez la ligne qui dfinit 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 : http://support.sgi.com/surfzone/ patches/patchset/6.2_indigo.rps.html Vous devrez, au moins, installer la dernire version du noyau, de rld et de libc. Vous avez besoin de tous les patches POSIX sur cette page, pour le support des pthreads : http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html Si vous obtenez une erreur se rapprochant de la suivante lors de la compilation de mysql.cc:
"/usr/include/curses.h", line 82: error(1084): invalid combination of type
Un problme de planification a aussi t signal. Si seul un thread est en cours, les choses ralentissent. Evitez cela en dmarrant un autre client. Cela pourra acclrer l'excution de l'autre thread de 2 10 fois. Ceci est un problme pas encore trs 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 \
150
--with-named-curses-libs=/usr/local/lib/libncurses.a
1. Pour OpenServer 5.0.x, vous avez besoin de gcc-2.95.2p1 ou plus rcent, de Skunkware. http://www.sco.com/skunkware/ puis recherchez dans les paquets OpenServer ou par FTP sur ftp2.caldera.com, dans le dossier pub/skunkware/osr5/devtools/gcc. 2. Vous avez besoin de GCC 2.5.x pour ce produit, et du systme de dveloppement. Ils sont ncessaires sur cette version de Unix SCO. Vous ne pouvez pas simplement utiliser GCC Dev. 3. Vous devriez installer le paquet FSU Pthreads et l'installer. Il peut tre trouv l'adresse : http:// moss.csc.ncsu.edu/~mueller/ftp/pub/PART/pthreads.tar.gz. Vous pouvez aussi obtenir un paquet precompil sur http://www.mysql.com/Downloads/SCO/FSU-threads-3.5c.tar.gz. 4. Les FSU Pthreads peuvent tre compil sur SCO Unix 4.2 avec TCP/IP. Ou OpenServer 3.0 ou Open Desktop 3.0 (OS 3.0 ODT 3.0), avec le SCO Development System, install avec le bon port de GCC 2.5.x ODT ou OS 3.0 avec le bon port de GCC 2.5.x Il y a beaucoup de problmes si vous n'utilisez pas le bon port. Le port de ce produit requiert le SCO Unix Development. Sans cela, il vous manque des bibliothques et le linker ncessaire. 5. Pour compiler FSU Pthreads sur votre systme, fates ceci : a. Excutez ./configure dans le dossier threads/src et slectionnez l'option SCO OpenServer. Cette commande copie Makefile.SCO5 dans le fichier Makefile. b. Excutez make. c. Pour installer le paquet dans le dossier par dfaut /usr/include, identifiez vous comme root, puis utilisez cd pour vous placer dans le dossier thread/src, et faites make install. 6. N'oubliez pas d'utiliser GNU make lors de la compilation de MySQL. 7. Si vous ne lancez pas mysqld_safe en tant que root, vous obtiendrez probablement un maximum de 110 fichiers ouverts par processus. mysqld vous le dira dans les logs. 8. Avec SCO 3.2V5.0.5, il est recommand d'utiliser FSU Pthreads version 3.5c ou plus rcent. Il est recommand d'utiliser gcc 2.95.2 ou plus rcent! La commande configure devrait fonctionner :
shell> ./configure --prefix=/usr/local/mysql --disable-shared
9. Avec SCO 3.2V4.2, il est recommand d'utiliser FSU Pthreads version 3.5c ou plus rcent. La commande configure devrait 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 pourriez rencontrer des problmes avec certains fichiers inclure. Dans ce cas, vous pouvez trouver des fichiers spcifiques pour SCO l'adresse http://www.mysql.com/Downloads/SCO/ SCO-3.2v4.2-includes.tar.gz. Il suffit de dcompresser le fichier dans le dossier include de votre dossier source MySQL.
151
Notes de dveloppement SCO : MySQL doit automatiquement dtecter le paquet FSU Pthreads et l'utiliser pour compiler mysqld avec -lgthreads -lsocket -lgthreads. Les bibliothques de dveloppement SCO sont re-entrantes avec les FSU Pthreads. SCO affirme que ses bibliothques sont r-entrantes, donc elles sont aussi r-entrantes avec les FSU Pthreads. FSU Pthreads sur OpenServer essaie d'utiliser les concepts SCO pour rendre ses bibliothques r-entrantes. FSU Pthreads (tout au moins, la version de http://www.mysql.com/) est livr avec GNU malloc. Si vous rencontrez des problmes avec l'utilisation de la mmoire, assurez-vous que le fichier gmalloc.o est inclus dans libgthreads.a et libgthreads.so. Avec les FSU Pthreads, les appels systme suivants sont compatibles avec les pthreads : read(), write(), getmsg(), connect(), accept(), select() et wait(). Le patch CSSA-2001-SCO.35.2 (le patch est nomm erg711905-dscr_remap security patch (version 2.0.0)) bloque les FSU Pthreads et rend mysqld instable. Vous devez le supprimer si vous voulez faire fonctionner mysqld sur une machine OpenServer 5.0.6. SCO fournit des patches pour son systme d'exploitation l'adresse ftp://ftp.sco.com/pub/ openserver5 pour OpenServer 5.0.x SCO fournit des patches de scurits et la bibliothque libsocket.so.2 l'adresse ftp:// ftp.sco.com/pub/security/OpenServer et ftp://ftp.sco.com/pub/security/sse pour OpenServer 5.0.x Patch de scurit avant OSR506. De mme, le patch telnetd de ftp://stage.caldera.com/pub/ security/openserver/ ou ftp://stage.caldera.com/pub/security/openserver/CSSA-2001-SCO.10/ ainsi que libsocket.so.2 et libresolv.so.1 ont des instructions concernant leur installation sur un systme pre-OSR506. C'est probablement une bonne ide que d'installer les patches de scurit ci-dessus avant de compiler et d'utiliser MySQL.
Si vous voulez utiliser gcc, vous devez utiliser gcc 2.95.2 ou plus rcent.
CC=gcc CXX=g++ ./configure --prefix=/usr/local/mysql
SCO fournit des patchs pour son OS ftp://ftp.sco.com/pub/unixware7 pour UnixWare 7.1.1 et 7.1.3 et ftp://ftp.sco.com/pub/openunix8 pour OpenUNIX 8.0.0. SCO fournit des informations sur les correctifs de scurit ftp://ftp.sco.com/pub/security/OpenUNIX pour OpenUNIX et ftp://ftp.sco.com/pub/security/UnixWare pour UnixWare.
152
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 bibliothque des Pthreads. MySQL doit tre install sur une partition qui supporte les noms de fichiers longs, tel que HPFS, FAT32, etc. Le script INSTALL.CMD doit tre excut partir du CMD.EXE d'OS/2 et ne fonctionnera probablement pas avec des substituts tels que 4OS2.EXE. Le script scripts/mysql-install-db a t renomm. Il est maintenant nomm install.cmd et est un script REXX, qui mettra en place les configurations de scurit par dfaut de MySQL et crera les icnes WorkPlace Shell pour MySQL. Le support des module dynamiques est compil, mais n'est pas assez test. Les modules dynamiques doivent tre compils en utilisant la bibliothque pthreads.
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \ -o exemple udf_exemple.cc -L../lib -lmysqlclient udf_exemple.def mv exemple.dll exemple.udf
Note : A cause des limitations de OS/2, les noms des modules UDF ne doivent pas dpasser 8 caractres. Les modules sont stocks dans le rpertoire /mysql2/udf; le script safe-mysqld.cmd placera ce rpertoire dans la variable d'environnement BEGINLIBPATH. Lors de l'utilisation des modules UDF, les extensions spcifies sont ignores. Elle est suppose tre .udf. Par exemple, sous Unix, le module partag peut se nommer exemple.so et vous chargeriez une de ses fonctions de la faon suivante :
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "exemple.so";
Sous OS/2, me module s'appellera exemple.udf, mais vous n'aurez pas spcifier son extension :
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "exemple";
153
Le support de MySQL par Perl doit tre install si vous voulez excuter les scripts de tests de performances. See Section 7.1.4, La suite de tests MySQL .
L'installation de DBD::mysql effectue de nombreux tests. Ces tests requirent une connexion local au serveur MySQL, en tant qu'utilisateur anonyme, sans mot de passe. Si vous avez supprim l'accs anonyme, ou assign des mots de passe, les tests choueront. Vous pouvez utiliser force install DBD::mysql pour ignorer ces tests. DBI requiert le module Data::Dumper. Il peut tre dj install. Si non, vous devez l'installer avant d'installer DBI. Il est aussi possible de tlcharger la distribution module sous la forme d'une archive tar compresse, et de compiler manuellement les modules. Par exemple, pour dcompresser et construire la distribution DBI, utilisez cette procdure : 1. Dcompressez la distribution dans le dossier courant :
shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -
Cette commande cre un dossier appel Data-Dumper-VERSION. 2. Mettez vous dans le rpertoire racine de la distribution dcompresse :
shell> cd DBI-VERSION
La commande make test est importante car elle vrifie que le module fonctionne. Notez que quand vous excutez 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 rinstaller la distribution Msql-Mysql-modules chaque fois que vous rinstallez une nouvelle version de MySQL, particulirement si vous avez des problmes avec vos scripts DBI aprs avoir avoir mis jour MySQL. Si vous n'avez pas le droit d'installer des modules Perl dans le dossier systme ou que vous voulez installer des modules locaux de Perl, la rfrence suivante pourra vous aider : http://www.iserver.com/ support/contrib/perl5/modules.html Regardez le paragraphe ``Installing New Modules that Require Locally Installed Modules.''
Pour installer le module DBD MySQL avec ActiveState Perl sous Windows, vous devez faire ce qui suit : Obtenez ActiveState Perl partir de http://www.activestate.com/Products/ActivePerl/ et installez le. Ouvrez un terminal DOS. Si requis, dfinissez la variable HTTP_proxy. Par exemple, vous pouvez faire :
set HTTP_proxy=my.proxy.com:3128
Ce qui suit devrait fonctionner avec la version 5.6 d'ActiveState Perl. Si ce qui prcde 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";
155
Ajoutez -L/usr/lib/gcc-lib/... -lgcc la commande de liaison lorsque la bibliothque mysql.so est construite (vrifiez l'affichage de make concernant mysql.so quand vous compilez le client Perl). L'option -L doit spcifier le chemin vers le dossier o se situe libgcc.a sur votre systme. Une autre cause du problme peut tre que Perl et MySQL ne sont pas tous deux compils 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 excutez ces tests :
t/00base............install_driver(mysql) failed: Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.
cela signifie que vous avez besoin d'inclure la bibliothque dynamique, -lz, dans la ligne de liaison. Cela peut se faire en changeant ce qui suit dans lib/DBD/mysql/Install.pm :
$sysliblist .= " -lm";
en
$sysliblist .= " -lm -lz";
Aprs cela, vous devez excuter 'make realclean' et reprendre l'installation ds le dbut. Si vous voulez installer DBI sur SCO, vous devez diter le fichier Makefile de DBI-xxx et chaque sous-dossier. Notez que gcc doit tre en version 2.95.2 ou plus rcente :
ANCIEN: CC = cc CCCDLFLAGS = -KPIC -W1,-Bexport CCDLFLAGS = -wl,-Bexport LD = ld LDDLFLAGS = -G -L/usr/local/lib LDFLAGS = -belf -L/usr/local/lib LD = ld OPTIMISE = -Od NOUVEAU: CC = gcc CCCDLFLAGS = -fpic CCDLFLAGS = LD = gcc -G -fpic LDDLFLAGS = -L/usr/local/lib LDFLAGS = -L/usr/local/lib LD = gcc -G -fpic OPTIMISE = -O1
OLD: CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include NEW: CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
Ceci est d au fait que le chargeur dynamique de Perl ne va pas charger les modules DBI, s'ils sont compils avec icc ou cc. Si vous voulez utiliser le module de Perl sur un systme qui ne supporte pas les liaisons dynamiques (comme Caldera/SCO) vous pouvez gnrer une version statique de Perl incluant DBI et DBD-mysql. L'approche est de gnrer 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 crer nouveau une autre qui comporte le code de DBD li et d'installer cette version ci. Sur Caldera (SCO), vous devez dfinir les variables d'environnement suivantes :
shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
ou :
156
D'abord, crez un Perl incluant un DBI li statiquement en excutant des commandes dans le dossier o se situe votre distribution DBI :
shell> shell> shell> shell> perl Makefile.PL -static -config make make install 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'excuter 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 crer un nouveau qui inclut un DBD::mysql li statiquement en excutant ces commandes dans le dossier o votre distribution de Msql-Mysqlmodules se situe :
shell> shell> shell> shell> perl Makefile.PL -static -config make make install make perl
Finalement, vous devez installer ce nouveau Perl. Une fois de plus, l'affichage de make perl vous indiquera la commande utiliser.
157
158
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 dcrit le processus d'installation et d'utilisation d'une base de donnes en entier. Si vous n'tes intresss que par l'accs une base de donnes existante, vous pouvez sauter les sections dcrivant la cration de la base et des tables. Ce chapitre n'est qu'un tutoriel, beaucoup de dtails ne sont pas approfondis. Consultez les sections appropries du manuel pour plus d'informations sur les sujets abords.
159
******** reprsente 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'hte 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
Aprs vous tre connect avec succs, vous pouvez vous dconnecter tout moment en entrant QUIT dans l'invite mysql> :
mysql> QUIT Bye
Vous pouvez aussi le faire en appuyant sur Ctrl-D. La plupart des exemples dans les sections suivantes supposent que vous tes connect au serveur. Cela se voit l'invite mysql>.
La requte rvle 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, mentionne plus tt, en fait partie. Nous verrons les autres plus tard.) Lorsque vous entrez une commande, mysql l'envoi au serveur pour l'excution et affiche le rsultat, puis affiche un autre mysql> pour indiquer qu'il attend une autre commande.
160
mysql affiche le rsultat des requtes dans une table (lignes et colonnes). La premire ligne contient le nom des colonnes. Les lignes suivantes constituent le rsultat de la requte. Normalement, les titres des colonnes sont les noms des champs des tables de la base de donnes que vous avez rcuprs. Si vous rcuprez la valeur d'une expression au lieu d'une colonne (comme dans l'exemple prcdent), mysql nomme la colonne en utilisant l'expression elle-mme. mysql vous indique combien de lignes ont t retournes et combien de temps d'excution la requte a pris, ce qui vous donnera une approximation des performances du serveur. Ces valeurs sont imprcises car elles reprsentent le temps logiciel (et non le temps processeur ou matriel), et qu'elles sont affectes par des facteurs tels que la charge du serveur ou l'accessibilit du rseau. (Dans un soucis de brivet, la ligne contenant ``rows in set'' n'est plus montre dans les exemples suivants de ce chapitre.) Les mots-clef peuvent tre entrs sous n'importe quelle forme de casse. Les requtes suivantes sont quivalentes :
mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql> SeLeCt vErSiOn(), current_DATE;
Voil une autre requte. 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 | +-------------+---------+ | 0.707107 | 25 | +-------------+---------+
Les commandes vues jusqu' prsent ont t relativement courtes, et tenaient sur une seule ligne. Vous pouvez mme entrer plusieurs requtes 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 problme. mysql dtermine o se situe la fin de votre commande en recherchant le point-virgule de terminaison, et pas l'extrmit de la commande entre. (Dans d'autres termes, mysql accepte des formats libres d'entre : il collecte les lignes entres mais ne les excute qu'une fois le point-virgule trouv.) Voil une seule requte 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> -> aprs avoir entr la premire ligne d'une requte multi-lignes. C'est la faon dont mysql indique qu'il n'a pas vu de requte complte et
161
qu'il attend la fin de celle-ci. L'invite est votre ami en vous fournissant la rtroactivit. Si vous utilisez cette rtroactivit, vous vous rendrez toujours compte de ce que mysql attend. Si vous dcidez 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> aprs que vous ayez entr \c, vous informant que mysql est prt pour une nouvelle requte. Le tableau suivant montre les diffrentes invites que vous pourrez voir et rsume leur signification quand l'tat dans lequel se trouve mysql : Invite mysql> -> '> "> `> Signification Prt pour une nouvelle commande. En attente de la ou des lignes terminant la commande. En attente de la prochaine ligne collectant une chane commence par un guillemet simple ('). En attente de la prochaine ligne collectant une chane commence par un guillemet double ("). En attente de la prochaine ligne collectant une chane commence par un guillemet oblique (`).
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() ->
Si cela vous arrive (vous pensez que votre requte est complte mais la seule rponse 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 raliser ce que vous devez faire. Entrez un point-virgule pour complter la requte, et mysql devrait l'excuter :
mysql> SELECT USER() -> ; +--------------------+ | USER() | +--------------------+ | joesmith@localhost | +--------------------+
L'invite '> ainsi que "> apparaissent durant l'entre de chane. Dans MySQL, vous pouvez crire une chane entoure du caractre ' ou bien " (par exemple, 'Bonjour' or "Au Revoir"), et mysql vous laisse entrer une chane qui peut tre sur plusieurs lignes. Lorsque vous voyez une invite comme '> ou ">, cela signifie que vous avez entr une ligne contenant le caractre ' ou ", mais vous n'avez pas encore entr le caractre correspondant qui termine votre chane. C'est pratique si vous entrez rellement une chane lignes multiples, mais est-ce probable ? Pas vraiment. Plus souvent, les invites '> et "> indiquent que vous avez, par inadvertance, oubli un caractre de fermeture. Par exemple :
mysql> SELECT * FROM ma_table WHERE nom = "Smith AND age < 30; ">
Si vous entrez cette requte SELECT, puis appuyez sur Enter et attendez le rsultat, rien ne se passera. Au lieu de vous demander pourquoi la requte met si longtemps s'excuter, remarquez que l'invite de commande s'est transforme en ">. Cela indique que mysql attend de voir la fin d'une
162
chane de caractres non-termine. (Voyez-vous l'erreur dans cette requte ? 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'interprte comme une partie de la chane qu'il est en train de collecter ! A la place, entrez le second guillemet (pour que mysql sache que vous avez fini la chane), 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 prt pour une nouvelle requte. Il est important de savoir ce que les invites '> et "> signifient, car si vous avez entr par erreur une chane non termine, toutes les lignes suivantes que vous entrerez seront ignores par mysql, mme une ligne contenant QUIT ! Cela peut prter confusion, spcialement si vous ne savez pas que vous devez fournir le guillemet fermant avant de pouvoir annuler la commande courante.
La liste des bases de donnes est probablement diffrente sur votre machine, mais les bases mysql et test y figurent srement. La base mysql est requise car elle gre les accs et les privilges. La base test est souvent fournie pour que les utilisateurs y effectuent leurs tests. Notez que vous ne pourrez voir toutes les bases de donnes si vous n'avez pas le privilge SHOW DATABASES. See Section 13.5.1.3, Syntaxe de GRANT et REVOKE .
163
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 problmes.) La commande USE est spciale d'un autre point de vue : elle doit tre donne sur une seule ligne. Vous pouvez utiliser la base de donnes test (si vous y avez accs) pour les exemples qui suivent, mais tout ce que vous crerez dans cette base pourra tre effac par quiconque y a accs. Pour cette raison, vous feriez mieux de demander votre administrateur MySQL la permission d'utiliser une base de donnes rien que pour vous. Supposez que vous voulez nommer la votre menagerie. L'administrateur a besoin d'excuter une commande telle que :
mysql> GRANT ALL ON menagerie.* TO votre_nom_mysql;
Sous Unix, les noms des bases de donnes sont sensibles la casse (ce qui diffre des mots rservs de SQL), ce qui fait que vous devez toujours vous rfrer votre base de donnes 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 applique, mme si vous devez vous rfrer une table ou une base de la mme faon dans une mme requte). La cration d'une base de donnes ne la slectionne 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 cre juste une fois, mais vous devez la slectionner pour l'utiliser, chaque fois que vous dbutez une session mysql. Vous pouvez le faire en publiant une requte USE comme ci-dessus. Sinon, vous pouvez slectionner la base directement dans la ligne de commande lorsque vous invoquez mysql. Vous devez juste spcifier son nom aprs les paramtres 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 aprs 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 connects sur votre machine de l'obtenir.
La partie la plus difficile est le choix de la structure de la base de donnes : de quelles tables aurez vous besoin et quelles colonnes devront figurer dans chacune d'elles.
164
Vous 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 intressant, la table devra contenir d'autres informations. Par exemple, si plus d'une personne de votre famille possde un animal, vous voudrez lister le nom du matre de chaque animal. Vous voudrez peut-tre aussi enregistrer une description basique comme l'espce ou le sexe. Et pour l'ge ? C'est intressant, mais n'est pas bon pour un stockage en base de donnes. L'ge change chaque jour, vous devrez donc mettre jour vos enregistrements assez souvent. Il est prfrable 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 diffrence entre la date courante et la date enregistre. 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 donnes pour des tches, comme la gnration d'un rappel pour les prochains anniversaires d'animaux. (Si vous trouvez que ce type de requtes est quelque peu idiot, notez que c'est la mme question que vous vous poseriez dans le contexte d'une base de donnes d'affaires pour identifier les clients qui vous aurez besoin d'envoyer un message de voeux, pour cette touche informatiquement assiste 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 donnes, 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 identifis jusqu' maintenant sont largement suffisantes pour l'instant : nom, matre, espce, sexe, naissance, et mort. Utilisez une requte CREATE TABLE pour spcifier 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 ncessairement tre la mme, 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 reprsent de plusieurs faons, par exemple, "m" et "f", ou bien "male" et "femelle". Il est plus simple d'utiliser les caractres simples "m" et "f". L'utilisation du type de donnes DATE pour les colonnes naissance et mort est un choix plutt judicieux. Maintenant que vous avez cr une table, SHOW TABLES devrait produire de l'affichage :
mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | animal | +---------------------+
Pour vrifier que la table a t cre de la faon 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 | |
165
Vous pouvez utiliser DESCRIBE quand vous voulez, par exemple, si vous avez oubli les noms des colonnes dans votre table ou leurs types.
Puisque vous commencez avec une table vide, il est facile de la remplir en crant un fichier texte contenant une ligne pour chaque animal que vous avez, puis charger son contenu l'aide d'une seule commande. Vous pouvez crer un fichier animal.txt contenant un enregistrement par ligne, avec les valeurs spars par des tabulations, et ordonnes comme les champs l'taient dans la requte CREATE TABLE. Pour les donnes manquantes (comme un sexe inconnu ou la date de mort d'un animal toujours en vie), vous pouvez utiliser les valeurs NULL. Pour les reprsenter 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 Whistler matre Gwen race bird sexe \N naissance 1997-12-09 mort \N
Pour charger le fichier animal.txt dans la table animal, utilisez cette commande :
mysql> LOAD DATA LOCAL INFILE "animal.txt" INTO TABLE animal;
Notez que si vous crez un fichier sur Windows, avec un diteur qui utilise des caractres de lignes comme \r\n, vous devez utiliser :
mysql> LOAD DATA LOCAL INFILE "animal.txt" INTO TABLE animal;
Vous pouvez spcifier la valeur du sparateur de colonnes et le marqueur de fin de lignes explicitement dans la commande LOAD DATA si vous le voulez, mais les valeurs par dfaut sont la tabulation et le retour la ligne. Ceux-l sont suffisants pour que la commande lise le fichier animal.txt correctement. Si la commande choue, il est probable que votre installation MySQL n'a pas la possibilit d'accder aux fichiers. Voyez Section 5.4.4, Problmes de scurit avec LOAD DATA LOCAL pour plus d'informations sur comment modifier cela. Lorsque vous voulez ajouter des enregistrements un par un, la commande INSERT est utile. Dans sa forme la plus simple, o vous spcifiez une valeur pour chaque colonne, dans l'ordre o les colonnes
166
sont listes dans la requte CREATE TABLE. Supposons que Diane achte un nouvel hamster nomm Puffball. Vous pourriez ajouter ce nouvel enregistrement en utilisant un INSERT de la faon suivante :
mysql> INSERT INTO animal -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Notez que les chanes de caractres et les valeurs de dates sont spcifies en tant que chanes protges par des guillemets. De plus, avec INSERT vous pouvez insrer la valeur NULL directement pour reprsenter 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.
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 rcuprer les donnes. La clause WHERE est optionnelle. Si elle est prsente, conditions_a_satisfaire spcifie les conditions que les lignes doivent satisfaire pour tre slctionnes.
Cette forme de SELECT est utile si vous voulez rcuprer la table entire. Par exemple, aprs l'avoir juste remplie avec vos donnes d'origine. Il apparat alors qu'une erreur s'tait glisse dans votre fichier de donnes : Bowser a l'air d'tre n aprs 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 faons de corriger cela : Corriger le fichier animal.txt pour corriger l'erreur, puis vider et recharger nouveau la table en utilisant DELETE et LOAD DATA :
mysql> SET AUTOCOMMIT=1; # Utilis pour une recration rapide de la table mysql> DELETE FROM animal; mysql> LOAD DATA LOCAL INFILE "animal.txt" INTO TABLE animal;
Toutefois, si vous choisissez cette mthode, vous devrez aussi rentrer nouveau l'enregistrement de Puffball. Corriger uniquement l'enregistrement erron avec une requte UPDATE :
167
Comme nous l'avons montr, il est facile de rcuprer toutes les donnes d'une table. Toutefois, vous ne voudrez srement pas le faire, surtout si la table devient imposante. A la place, vous serez plus intress par rpondre une question particulire, dans ce cas-l, vous spcifiez quelques contraintes pour les informations que vous voulez. Regardons quelques requtes de slection qui rpondent des questions propos de vos animaux.
L'affichage confirme que la date est correcte maintenant : 1989, et non 1998. La comparaison des chanes de caractres se fait normalement avec sensibilit la casse, vous pouvez donc spcifier le nom "bowser", "BOWSER", etc. Le rsultat de la requte sera le mme. Vous pouvez spcifier des conditions sur toutes les colonnes, pas seulement nom. Par exemple, si vous voulez savoir quels animaux sont ns aprs 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 | +-------+--------+--------+------+------------+-------+
AND et OR peuvent tre utiliss ensemble. Si vous le faites, une bonne ide est d'utiliser les parenthses pour indiquer comment les conditions doivent tre regroupes :
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 |
168
+-------+--------+--------+------+------------+-------+
Toutefois, remarquez que la requte rcupre le champ maitre de chaque enregistrement, et certains apparaissent plus d'une fois. Pour minimiser l'affichage, rcuprez chaque rsultat unique une seule fois en ajoutant le mot-cl DISTINCT :
mysql> SELECT DISTINCT maitre FROM animal; +--------+ | maitre | +--------+ | Benny | | Diane | | Gwen | | Harold | +--------+
Vous pouvez utiliser une clause WHERE pour combiner la slection des lignes avec celle des colonnes. Par exemple, pour obtenir les dates de naissance des chiens et chats uniquement, utilisez cette requte :
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 | +--------+--------+------------+
169
Sur les noms de colonnes, le tri, comme toutes les oprations de comparaison, est normalement excut sans tenir compte de la casse. Cela signifie que l'ordre sera indfini 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 (dcroissant) au nom de la colonne trier :
mysql> SELECT nom, naissance FROM animal 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 plaant les plus jeunes en premier, utilisez la requte suivante :
mysql> SELECT nom, espece, naissance FROM animal ORDER BY espece, 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 prcde (naissance) ; les valeurs espece continuent tre tries dans l'ordre croissant.
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 dterminer quel ge a chacun de vos animaux, vous devez calculer la diffrence entre l'anne en cours et l'anne de naissance, puis soustraire la date courante si la date du jour se produit plus tt dans l'anne civile que la date de naissance. La requte suivante montre, pour chaque animal, la date de naissance, la date courante, ainsi que l'ge en annes.
mysql> SELECT nom, naissance, CURRENT_DATE, -> (YEAR(CURRENT_DATE)-YEAR(naissance)) -> - (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5)) -> AS age -> FROM animal; +----------+------------+--------------+------+ | 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'anne de la date et RIGHT() extrait les 5 caractres les plus droite de la date qui reprsentent MM-DD (anne civile). La partie de l'expression qui compare les valeurs de MM-DD value 1 ou 0, qui ajustent la diffrence d'anne la baisse, si CURRENT_DATE se produit plus au dbut de l'anne que la naissance. L'expression complte est un peu plus fine en utilisant un alias (age) pour produire un nom de colonne un peu plus significatif. La requte fonctionne, mais le rsultat pourrait tre lu plus facilement si les lignes taient prsentes dans le mme ordre. Cela peut tre obtenu en ajoutant une clause ORDER BY nom pour trier le rsultat par nom :
mysql> SELECT nom, naissance, CURRENT_DATE, -> (YEAR(CURRENT_DATE)-YEAR(naissance)) -> - (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5)) -> AS age -> FROM animal 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 rsultat par l'age plutt que par le nom, utilisez simplement une clause ORDER BY diffrente :
mysql> SELECT nom, naissance, CURRENT_DATE, -> (YEAR(CURRENT_DATE)-YEAR(naissance)) -> - (RIGHT(CURRENT_DATE,5)<RIGHT(naissance,5)) -> AS age -> FROM animal ORDER BY age; +----------+------------+--------------+------+ | nom |naissance | CURRENT_DATE | age | +----------+------------+--------------+------+ | Chirpy | 1998-09-11 | 2001-08-29 | 2 |
171
| 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 requte similaire peut tre utilise pour dterminer 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 diffrence entre la mort et la naissance :
mysql> SELECT nom, naissance, mort, -> (YEAR(mort)-YEAR(naissance)) - (RIGHT(mort,5)<RIGHT(naissance,5)) -> AS age -> FROM animal WHERE mort IS NOT NULL ORDER BY age; +--------+------------+------------+------+ | nom |naissance | mort | age | +--------+------------+------------+------+ | Bowser | 1989-08-31 | 1995-07-29 | 5 | +--------+------------+------------+------+
Cette requte utilise mort IS NOT NULL plutt que mort <> NULL parce que NULL est une valeur spciale. Cela sera expliqu plus tard. See Section 3.3.4.6, Travailler avec la valeur NULL . Vous dsirez savoir quels sont les animaux qui ont leur anniversaire le mois prochain ? Pour effectuer ce type de calculs, l'anne 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 approprie dans notre cas. Pour voir comment cette fonction travaille, excutez une requte simple qui retourne l'naissance et le MONTH(naissance) :
mysql> SELECT nom, naissance, MONTH(naissance) FROM animal; +----------+------------+------------------+ | 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 ns en Mai (mois 5) comme ceci :
mysql> SELECT nom, naissance FROM animal WHERE MONTH(naissance) = 5; +-------+------------+ | nom |naissance | +-------+------------+ | Buffy | 1989-05-13 | +-------+------------+
Il y a une petite complication si le mois courant est Dcembre, bien sr. Vous ne pouvez pas uniquement ajouter 1 au numro du mois courant (12) et chercher les animaux qui sont ns le mois numro 13, parce qu'il n'existe pas. A la place, vous cherchez les animaux ns en Janvier (mois numro 1). Vous pouvez toujours crire une requte qui fonctionne quelque soit le mois courant. Comme cela, vous n'avez pas utiliser un numro de mois particulier dans votre requte. DATE_ADD() vous permet
172
d'ajouter un intervalle de temps une date donne. Si vous ajoutez un mois la valeur de NOW(), et que vous extrayez le mois l'aide de MONTH(), le rsultat produit le mois dans lequel vous devez chercher un anniversaire :
mysql> SELECT nom, naissance FROM animal -> WHERE MONTH(naissance) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
Une manire diffrente d'arriver au mme rsultat est d'ajouter 1 pour trouver le mois prochain aprs le mois courant (aprs 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 animal -> 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 aprs l'utilisation de la fonction MOD(), sinon, nous aurions un intervalle entre Novembre (11) et Janvier (1).
Clairement, vous n'obtiendrez aucun rsultat valable pour ces comparaisons. Utilisez les oprateurs 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 considrs comme gaux lors que vous utilisez la clause GROUP BY. Avec MySQL, 0 et NULL reprsentent le boolen faux, et tout le reste reprsente le boolen vrai. La valeur par dfaut du boolen vrai issue d'une comparaison est 1. Lorsque vous utilisez la clause ORDER BY, les valeurs NULL sont toujours tries en premier, mme si vous utilisez l'attribut DESC. Ce traitement particulier de NULL explique pourquoi, dans la section prcdente, il tait ncessaire de dterminer quel animal ne vivait plus en utilisant la fonction mort IS NOT NULL au lieu de mort <> NULL.
173
Notez que vous n'utilisez ni = ni <> lorsque vous utilisez la recherche de modles SQL ; utilisez les oprateurs de comparaison LIKE ou NOT LIKE la place. Pour trouver les noms commenant par la lettre b :
mysql> SELECT * FROM animal 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 | +--------+--------+--------+------+------------+------------+
Pour trouver les noms contenant exactement 5 caractres, utilisez le caractre de recherche _ :
mysql> SELECT * FROM animal 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 modles fourni par MySQL utilise les expressions rgulires tendues. Lorsque vous testez une recherche avec ce type de modle, utilisez les oprateurs REGEXP et NOT REGEXP (ou RLIKE et NOT RLIKE qui sont des synonymes). Quelques caractristiques des expressions rgulires tendues sont : Le caractre . trouve n'importe quel caractre. Une classe de caractres [...] trouve n'importe quel caractre contenu entre les crochets. Par exemple, la classe de caractres [abc] trouve le caractre a, b, ou c. Pour dfinir un intervalle de caractres, utilisez un trait d'union. La classe de caractres [a-z] trouvera n'importe quel caractre minuscule, tout comme la classe [0-9] trouvera n'importe quel nombre. Le caractre * trouvera aucune ou plus d'instances du caractre qui le prcde. Par exemple, x* trouvera n'importe quel nombre de fois le caractre x, [0-9]* trouvera n'importe quel nombre et .* trouvera n'importe quel nombre de fois n'importe quel caractre. Le modle est trouv s'il se produit n'importe o dans la valeur teste. (Les modles SQL ne sont trouvs que s'ils sont prsents en valeur entire.) Pour ancrer un modle de sorte qu'il soit trouv au dbut ou la fin de valeur teste, utilisez ^ au dbut ou bien $ la fin du modle.
174
Pour dmontrer comment les expressions rgulires fonctionnent, les requtes LIKE vues prcdemment ont t rcrites pour utiliser REGEXP. Pour trouver les noms qui commencent par la lettre b, utilisez ^ pour trouver le dbut du nom :
mysql> SELECT * FROM animal 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 | +--------+--------+--------+------+------------+------------+
Avant la version 3.23.4 de MySQL, REGEXP tait sensible la casse, et la requte prcdente ne retournait aucune ligne. Pour trouver la lettre b minuscule ou majuscule, utilisez cette requte la place :
mysql> SELECT * FROM animal 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 chane, une chane binaire. Cette requte trouvera uniquement la lettre minuscule b au dbut du nom :
mysql> SELECT * FROM animal WHERE nom REGEXP BINARY "^b";
Pour trouver les noms finissant par fy, utilisez $ pour trouver la fin du nom :
mysql> SELECT * FROM animal 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 requte suivante :
mysql> SELECT * FROM animal 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 rgulire est trouve si le modle se trouve n'importe o dans la valeur, il n'est pas ncessaire dans la requte prcdente de mettre un joker de chaque ct du modle recherch pour trouver la valeur entire comme cela aurait t le cas en utilisant les modles de recherche SQL. Pour trouver les noms contenant exactement 5 caractres, utilisez ^ et $ pour trouver le dbut et la fin du nom, et 5 instances de . au milieu :
mysql> SELECT * FROM animal 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 requte suivante en utilisant l'oprateur {n} ``rpter-n-fois'' :
mysql> SELECT * FROM animal WHERE nom REGEXP "^.{5}$"; +-------+--------+--------+------+------------+------+ | nom | maitre | espece | sexe | naissance | mort |
175
+-------+--------+--------+------+------------+------+ | Claws | Gwen | chat | m | 1994-03-17 | NULL | | Buffy | Harold | chien | f | 1989-05-13 | NULL | +-------+--------+--------+------+------------+------+
Vous pouvez trouver galement les noms des propritaires des animaux. Vous pouvez utiliser COUNT() si vous voulez trouver combien d'animaux possde chaque propritaire :
mysql> SELECT maitre, COUNT(*) FROM animal 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 propritaire. Sans cela, vous auriez le message d'erreur suivant :
mysql> SELECT maitre, COUNT(maitre) FROM animal; 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 caractriser vos donnes de diverses faons. Les exemples suivants montrent diffrentes manires pour obtenir des statistiques sur les animaux. Nombre d'animaux par espce :
mysql> SELECT espece, COUNT(*) FROM animal GROUP BY espece; +---------+----------+ | espece | COUNT(*) | +---------+----------+ | oiseau | 2 | | chat | 2 | | chien | 3 | | hamster | 1 | | serpent | 1 | +---------+----------+
176
| m | 4 | +------+----------+
(Dans ce rsultat, NULL indique les sexes inconnus.) Nombre d'animaux par espce et sexe :
mysql> SELECT espece, sexe, COUNT(*) FROM animal GROUP BY espece, sexe; +---------+------+----------+ | 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 entire quand vous employez COUNT(). Par exemple, la requte prcdente, si vous voulez trouver uniquement les chiens et les chats, ressemble cela :
mysql> SELECT espece, sexe, COUNT(*) FROM animal -> 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 animal -> 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 | +---------+------+----------+
177
En prenant cela en considration, 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 crant un fichier texte dlimit par des tabulations, contenant l'information : nom Fluffy Buffy Buffy Chirpy Slim Bowser Fang Fang Claws Whistler date 1995-05-15 1993-06-23 1994-06-19 1999-03-21 1997-08-03 1991-10-12 1991-10-12 1998-08-28 1998-03-17 1998-12-09 type mise bas mise bas mise bas vtrinaire vtrinaire chenil chenil anniversaire anniversaire anniversaire Don d'un nouvel objet de mastication Don d'un nouveau collier anti-puces Premier anniversaire remarque 4 chatons, 3 femelles, 1 mles 5 chiots, 2 femelles, 3 mles 3 chiots, 3 femelles Redresser le bec Cotes casses
En se basant sur ce que vous avez appris des requtes effectues sur la table animal, vous devriez tre capable de faire des recherches sur les enregistrements de la table evenement ; le principe est le mme. Quand devez-vous vous demander si la table evenement est seule suffisante pour rpondre 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 mre, vous avez besoin de sa date de naissance. Parce que ces informations sont stockes dans la table animal, vous avez besoin des deux tables pour cette requte :
mysql> SELECT animal.nom, -> (TO_DAYS(date) - TO_DAYS(naissance))/365 AS age, -> remarque -> FROM animal, evenement -> WHERE animal.nom = evenement.nom AND type = "mise bas"; +--------+------+--------------------------------+ | nom | age | remarque | +--------+------+--------------------------------+ | Fluffy | 2.27 | 4 chatons, 3 femelles, 1 mle | | Buffy | 4.12 | 5 chiots, 2 femelles, 3 mles | | Buffy | 5.10 | 3 chiots, 3 femelles | +--------+------+--------------------------------+
Il y a plusieurs choses noter concernant cette requte : La clause FROM liste les deux tables parce que la requte a besoin d'informations contenues dans ces deux tables. Lorsque vous combinez (joignez) des informations provenant de plusieurs tables, vous devez spcifier quels enregistrements d'une table peuvent tre associs quels enregistrements des autres tables. C'est ais parce qu'elles ont toutes les deux une colonne nom. La requte utilise la clause WHERE pour faire correspondre les enregistrements des deux tables sur les valeurs de la colonne nom.
178
Parce que la colonne nom apparat dans les deux tables, vous devez tre explicite concernant la table que vous utilisez lorsque vous vous rfrez cette colonne. C'est fait en faisant prcder le nom de la colonne par le nom de la table. Vous n'avez pas besoin de deux tables diffrentes pour effectuer une jointure. Quelques fois, c'est plus facile de joindre une table sur elle-mme, si vous voulez comparer des enregistrements dans une table avec d'autres enregistrements de la mme table. Par exemple, pour trouver des paires multiples parmi vos animaux, vous pouvez joindre la table animal sur elle-mme pour trouver les paires mles / femelles par rapport l'espce :
mysql> SELECT p1.nom, p1.sexe, p2.nom, p2.sexe, p1.espece -> FROM animal AS p1, animal AS p2 -> WHERE p1.espece = p2.espece AND p1.sexe = "f" AND p2.sexe = "m"; +--------+------+--------+------+---------+ | nom | sexe | nom | sexe | espece | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | chat | | Buffy | f | Fang | m | chien | | Buffy | f | Bowser | m | chien | +--------+------+--------+------+---------+
Dans cette requte, nous avons spcifi des alias pour les noms de tables dans l'ordre de rfrence des colonnes et ainsi maintenir directement quelle instance de la table chaque colonne est associe.
3.4. Obtenir des informations propos des bases de donnes et des tables
Que faire si vous oubliez le nom d'une base de donnes ou d'une table, ou bien encore la structure d'une table donne (par exemple, comment se nomment ses colonnes) ? MySQL rpond ce problme en fournissant plusieurs commandes qui renvoient des informations propos des tables et des bases de donnes les contenant. Vous avez dj vu SHOW DATABASES qui liste les bases de donnes gres par le serveur. Pour trouver quelle base de donnes est actuellement slectionne, utilisez la fonction DATABASE() :
mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | menagerie | +------------+
Si vous n'avez encore slectionn aucune base de donnes, le rsultat est vide. Pour trouver quelles sont les tables que la base contient (par exemple, quand vous n'tes pas sr 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 | | | maitre | varchar(20) | YES | | NULL | |
179
| 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 donnes, NULL indique si la colonne peut contenir des valeurs NULL, Key indique si la colonne est indexe et Default spcifie la valeur par dfaut de la colonne. Si vous avez des index sur une table, SHOW INDEX FROM nom_de_table vous fournira des informations sur elles.
Si vous utilisez mysql sous Windows et que vous avez des caractres spciaux dans le fichier qui posent problmes, vous pouvez faire :
dos> mysql -e "source fichier-batch"
Si vous devez spcifier les paramtres de connexion en ligne de commande, la commande ressemblera ca :
shell> mysql -h hte -u utilisateur -p < fichier-batch Enter password: ********
Lorsque vous utilisez mysql de cette faon, vous crez un fichier de script, puis vous l'excutez. Si vous voulez que le script continue, mme 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 requte de faon rptitive (c'est dire, chaque jour, ou chaque semaine), en faire un script vous vitera de la rcrire chaque fois. Vous pouvez gnrer de nouvelles requtes partir de requtes existantes et similaires en copiant et ditant des fichiers de scripts. Ce mode peut aussi tre utile lors du dveloppement d'une requte, particulirement pour les commandes sur plusieurs lignes ou plusieurs squences de commandes. Si vous commettez une erreur, vous n'avez pas tout rcrire. Editez juste votre script pour corriger l'erreur et dites mysql de l'excuter nouveau. Si vous avez une requte qui produit beaucoup d'affichage, vous pouvez le rediriger vers un visualiseur plutt que de le regarder dfiler sur votre cran :
shell> mysql < fichier-batch | more
Vous pouvez distribuer votre script d'autres personnes pour qu'elles l'excutent. Quelques situations ne permettent pas une utilisation interactive, par exemple, quand vous excutez une requte partir d'une tche cron. Dans ce cas, vous devez utiliser le mode batch.
180
Le format d'affichage par dfaut est diffrent (plus concis) lorsque vous excutez mysql en mode batch de celui utilis inter activement. Par exemple, le rsultat de SELECT DISTINCT espece FROM animal ressemble a inter activement :
+---------+ | espece | +---------+ | oiseau | | chat | | chien | | hamster | | serpent | +---------+
Si vous voulez le format d'affichage interactif en mode batch, utilisez mysql -t. Pour crire les commandes excutez 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;
(Dans la plupart des installations de MySQL, vous pouvez utiliser la base de donnes test). Vous pouvez crer la table d'exemple de la faon 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);
181
En MySQL 4.0 ou plus ancien, vous devez le faire en deux temps : 1. Obtenir le plus grand prix de la table avec une requte SELECT.
mysql> SELECT MAX(price) FROM shop; +------------+ | MAX(price) | +------------+ | 19.95 | +------------+
Une autre solution est de trier toutes les lignes en ordre dcroissant, et de ne lire que la premire ligne avec la clause LIMIT :
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 !.
182
La ligne contenant la plus grande valeur d'un certain champ par rapport un groupe
+---------+-------+ | article | price | +---------+-------+ | 0001 | 3.99 | | 0002 | 10.99 | | 0003 | 1.69 | | 0004 | 19.95 | +---------+-------+
3.6.4. La ligne contenant la plus grande valeur d'un certain champ par rapport un groupe
``Pour chaque article, trouvez le ou les vendeurs ayant le plus haut prix.'' En ANSI SQL, je l'aurais fait de cette faon avec une sous-requte :
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 : 1. Rcuprer la liste de couples article et plus grand prix. 2. Pour chaque article, rcuprer 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 requte ?'' 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 sr, tre amlior en dcoupant les colonnes concatnes dans le client.
183
INSERT INTO person VALUES (NULL, 'Antonio Paz'); INSERT (NULL, (NULL, (NULL, INTO shirt VALUES 'polo', 'blue', LAST_INSERT_ID()), 'dress', 'white', LAST_INSERT_ID()), 't-shirt', 'blue', LAST_INSERT_ID());
INSERT INTO person VALUES (NULL, 'Lilliana Angelovska'); INSERT (NULL, (NULL, (NULL, (NULL, INTO shirt VALUES 'dress', 'orange', LAST_INSERT_ID()), 'polo', 'red', LAST_INSERT_ID()), 'dress', 'blue', LAST_INSERT_ID()), 't-shirt', 'white', LAST_INSERT_ID());
SELECT * FROM person; +----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+
184
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 | +----+---------+--------+-------+
s.* FROM person p, shirt s p.name LIKE 'Lilliana%' s.owner = p.id s.color <> 'white';
+----+-------+--------+-------+ | id | style | color | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+
La raison est que nous n'avons pas trouv le temps suffisant pour parvenir un moyen efficace de grer cela dans un cas gnral. (En comparaison, la gestion de AND est maintenant compltement gnrale et fonctionne trs bien.) En MySQL 4.0, vous pouvez rsoudre ce problme efficacement en utilisant une clause UNION qui combine le rsultat de deux requtes SELECT spare.s See Section 13.1.7.2, Syntaxe de UNION . Chaque requte SELECT ne recherche qu'avec une seule cl, et peut tre optimise :
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1' UNION SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';
Avant MYSQL 4.0, vous pouvez rsoudre ce problme efficacement en utilisant une table temporaire (TEMPORARY). Ce type d'optimisation est trs utile si vous utilisez des requtes trs 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 mthode ci-dessus pour rsoudre cette requte est en effet une UNION de deux requtes. See Section 13.1.7.2, Syntaxe de UNION .
185
Utiliser AUTO_INCREMENT
La table d'exemple contient des valeurs au format anne-mois-jour, qui reprsentent des visites d'utilisateurs sur la page. Pour dterminer le nombre de jour entre deux visites, utilisez la requte suivante :
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1 GROUP BY year,month;
Qui retourne :
+------+-------+------+ | year | month | days | +------+-------+------+ | 2000 | 01 | 3 | | 2000 | 02 | 2 | +------+-------+------+
Ce qui prcde calcule le nombre de jours diffrents qui a t utilis pour une combinaison anne/ mois, avec suppression automatique des doublons.
Qui retourne :
+----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+
Vous pouvez obtenir la valeur utilise 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 premire ligne insre. Cela permet de reproduire les insertions multilignes sur d'autres services. Pour les tables MyISAM et BDB vous pouvez spcifier AUTO_INCREMENT sur une colonne secondaire d'une clef multi-colonnes. Dans ce cas, la valeur gnre pour la colonne auto-incrmente est calcule de la faon suivante : MAX(auto_increment_column)+1) WHERE prefix=givenprefix. C'est utile lorsque vous voulez placer des donnes dans des groupes ordonns.
CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) );
186
INSERT INTO animals (grp,name) VALUES("mammal","dog"),("mammal","cat"), ("bird","penguin"),("fish","lax"),("mammal","whale"), ("bird","ostrich"); 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 | | bird | 2 | ostrich | +--------+----+---------+
Notez que dans ce cas, la valeur d'AUTO_INCREMENT sera rutilise si vous effacez la ligne avec la plus grande valeur d'AUTO_INCREMENT tous groupes confondus. Cela n'arrive jamais avec les tables MyISAM, dont les valeurs AUTO_INCREMENT ne sont jamais rutilises.
187
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 tp.id = td.id AND tp.tvab = td.tvab LEFT JOIN informant_data AS id ON tp.id = id.id AND tp.tvab = id.tvab LEFT JOIN harmony AS h ON tp.id = h.id AND tp.tvab = h.tvab LEFT JOIN lentus AS l ON tp.id = l.id AND tp.tvab = l.tvab /* For Twin 2 */ LEFT JOIN twin_data AS td2 ON p2.id = td2.id AND p2.tvab = td2.tvab LEFT JOIN informant_data AS id2 ON p2.id = id2.id AND p2.tvab = id2.tvab LEFT JOIN harmony AS h2 ON p2.id = h2.id AND p2.tvab = h2.tvab LEFT JOIN lentus AS l2 ON p2.id = l2.id AND p2.tvab = l2.tvab, 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 */ p1.id = tp.id AND p1.tvab = tp.tvab AND p2.id = p1.id AND p2.ptvab = p1.tvab AND /* Just the sceening survey */ tp.survey_no = 5 AND /* Skip if partner died before 65 but allow emigration (dead=9) */ (p2.dead = 0 OR p2.dead = 9 OR (p2.dead = 1 AND (p2.death_date = 0 OR (((TO_DAYS(p2.death_date) - TO_DAYS(p2.birthday)) / 365) >= 65)))) AND ( /* Twin is suspect */ (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 p2.dead = 0)) AND l.event = 'Finished' /* Get at area code */ AND SUBSTRING(p1.postal_code, 1, 2) = pg.code /* 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;
188
Nous voulons trier la concatnation de id et tvab dans un ordre numrique. Ajouter 0 au rsultat force MySQL le considrer 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 tche MySQL lors de l'optimisation de la requte. Cette requte montre, entre autres, comment faire pour consulter une table depuis cette mme table en utilisant une jointure (p1 et p2). Dans cet exemple, est utilis pour chercher quel partenaire du projet est dcd avant l'ge de 65 ans. Si c'est le cas, la ligne n'est pas retourne. Tout ce qui prcde 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 acclrer les requtes. Sur notre machine de production (un 200MHz UltraSPARC), cette requte retourne prs de 150-200 lignes et prend moins d'une seconde. Le nombre d'enregistrements dans les tables utilises plus haut : Table person_data lentus twin_project twin_data informant_data harmony postal_groups Lignes 71074 5291 5286 2012 663 381 100
189
/* Cela vite qu'un paire deviennen un doublon */ AND t1.tvab='1' AND t2.tvab='2' GROUP BY t1.event, t2.event;
190
191
mysqlbinlog est un outil pour traiter les fichiers de logs binaires perror affiche le message associ un code d'erreur myisamchk est prsent dans la section Chapitre 5, Administration du serveur. Les autres logiciels sont dtaills dans Chapitre 8, MySQL Scripts clients et utilitaires. La plupart des distributions MySQL incluent tous ces programmes, hormis ceux qui sont spcifiques une plate-forme. Par exemple, les scripts de dmarrage du serveur ne sont pas utiliss sur Windows. L'exception est le format RPM, qui est plus spcialis. Il y a des RPM pour le serveur, d'autres pour les clients. Si vous pensez qu'il vous en manque un, voyez la section Chapitre 2, Installer MySQL pour tout savoir sur les distributions et leur contenu. Il se peut alors que vous ayez un autre paquet installer.
Les arguments qui commencent par un tiret sont des options. Ils spcifient gnralement le type de connexion que le serveur doit faire, ou lui donne un mode opratoire spcial. La syntaxe des options est dcrite dans la section Section 4.3, Spcifier des options aux programmes . Les arguments (ceux qui ne commencent pas par un tiret), fournissent davantage d'informations au programme. Par exemple, mysql utilise le premier argument comme un nom de base de donnes : la commande mysql test indique que vous voulez utiliser la base de donnes test. Les sections ultrieures dcriront les programmes individuellement, avec leurs options spcifiques, et l'interprtation qu'ils font des arguments. Certaines options sont communes un grand nombre de programmes. Les plus communes sont -host, --user et --password qui spcifient respectivement le nom d'hte du serveur MySQL, le nom d'utilisateur et le mot de passe du compte. Tous les clients MySQL comprennent ces options : elles vous permettent d'indiquer sur quel serveur vous voulez travailler. Vous pouvez avoir besoin d'appeler les logiciels MySQL en utilisant le chemin jusqu'au dossier bin dans lequel ils sont install. Il est probable que dans ce cas, si vous rencontrez une erreur ``program not found'' lors de votre appel aux programmes hors du dossier bin. Pour rendre plus confortable l'utilisation de MySQL, vous pouvez ajouter le chemin vers bin dans votre variable d'environnement PATH. Puis, excutez le programme en utilisant simplement son nom. Consultez la documentation de votre interprteur de ligne de commande pour savoir assigner la variable PATH. La syntaxe d'assignation des variables est spcifique chaque terminal.
192
Dans les variables d'environnement. Ce sont des options pratiques si vous voulez les appliquer chaque fois que vous lancez le programme, mme si les fichiers d'options sont plus utiliss en pratique. (La section Section 5.10.2, Utiliser plusieurs serveurs sous Unix prsente une situation o les variables d'environnement peuvent tre trs utiles. Elle dcrit une situation o vous pouvez utiliser les variables pour spcifier le numro de port TCP/IP et le fichier de socket Unix pour le client et le serveur). Les programmes MySQL dterminent quelles options sont disponibles en examinant d'abord les variables d'environnement, puis le fichier d'options et enfin, la ligne de commande. Si une option est spcifies plusieurs fois, la dernire occurrence sera utilise. Cela signifie que les variables d'environnement on la plus faible priorite, et que les options de ligne de commande ont la forte priorit. La meilleure technique consiste stocker les options dans un fichier d'options. Vous pourrez alors viter de saisir les options en ligne de commande, mais vous pourrez les remplacer par d'autres valeurs ponctuellement, en utilisant la ligne de commande.
La premire commande demande mysql d'utiliser la valeur test comme mot de passe, mais ne spcifie pas de base de donnes par dfaut. La seconde commande demande mysql de demander le mot de passe l'cran, et d'utiliser la base test comme base par dfaut. MySQL 4.0 a introduit une souplesse supplmentaire dans la manire de saisir des options. Ces modifications ont t ajoute en MySQL 4.0.2. Certaines se rapportent la faon de spcifier qu'une option est ``active'' ou ``dsactive'', et d'autres se rapportent aux options qui sont disponibles dans une version, mais pas dans l'autre. Ces fonctionnalits sont dcrites ultrieurement dans cette section. Un autre changement se rapport la mthode de spcifications des variables de programme. La section Section 4.3.4, Utiliser les options pour configurer des variables de programme prsente en dtails ce sujet.
193
Certaines options qui contrlent le comportement du serveur peuvent tre actives ou dsactives. Par exemple, le client mysql supporte l'option --column-names qui dtermine si il faut afficher ou pas les noms des colonnes. Par dfaut, cette option est active. Cependant, vous pouvez la dsactiver dans certaines situations, comme lorsque vous voulez envoyer le rsultat de mysql dans un autre programme qui s'attend ne recevoir que des donnes, et pas les enttes. Pour dsactiver les nom des colonnes, vous pouvez spcifier l'option de trois manires diffrentes :
--disable-column-names --skip-column-names --column-names=0
Les prfixes --disable et --skip et le suffixe =0 ont tous le mme effet : ils dsactivent l'option. La forme ``active'' de l'option peut tre spcifie de ces trois manires :
--column-names --enable-column-names --column-names=1
Une autre modification au traitement des options, introduit en MySQL 4.0 est que vous pouvez utiliser le prfixe --loose pour les options de ligne de commande. Si une option est prfixe par --loose, le programme ne va pas se terminer avec une erreur, s'il ne reconnat pas l'option, mais il va juste mettre une alerte :
shell> mysql --loose-no-such-option mysql: WARNING: unknown option '--no-such-option'
Le prfixe --loose peut tre utilise lorsque vous excutez des programmes depuis plusieurs installations de MySQL sur la mme machine : tout au moins, des serveurs aussi rcents que la version 4.0.2. Ce prfixe est particulirement utilise lorsque vous listes les options dans un fichier d'options. Une option peut ne pas tre reconnue par une version du programme, avec le prfixe --loose, ou le prfixe loose dans un fichier d'options. Les versions du programme qui ne reconnaissent pas l'option mettront une alerte, mais ignoreront l'option. Cette stratgie requiert que les versions sont toutes en 4.0.2 ou plus rcent, car les anciennes versions ne connaissent pas -loose.
WINDIR reprsente votre dossier Windows. Il est gnralement C:\Windows ou C:\WinNT. Vous pouvez dterminer sa localisation exacte partir de la variable d'environnement WINDIR avec cette commande :
C:\> echo %WINDIR%
MySQL lit les options par dfaut dans les fichiers suivants sous Unix :
194
Objet Options globales Options spcifiques au serveur Le fichier spcifi par --defaults-extra-file=# Options spcifiques l'utilisateur
DATADIR est le dossier de donnes 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 spcifi au moment de la configuration et non pas le dossier de l'option --datadir lorsque mysqld dmarre ! (--datadir n'a aucun effet sur le serveur, car le serveur recherche les donnes avant de traiter les options de ligne de commande). MySQL essaie de lire les fichiers d'options dans l'ordre dans lequel ils sont prsents ci-dessus. Si un fichier d'options n'existe pas, vous pouvez le crer avec un diteur de texte. Si des options sont spcifies plusieurs fois, la dernire occurrence utilise prend la prsance sur les options spcifies avant. Toutes les options longues qui peuvent tre donne en ligne de commande, peuvent tre mises dans un fichier d'options. Pour avoir la liste des options d'un programme, utilisez la commande --help. La syntaxe de spcification dans un fichier d'option est similaire celle de ligne de commande, hormis le fait que vous omettez les deux tirets initiaux. Par exemple, --quick et --host=localhost en ligne de commande deviennent quick et host=localhost dans un fichier d'options. Pour spcifier une option de la forme --loose-opt_name dans un fichier d'options, crivez la sous la forme looseopt_name. Les lignes vides du fichier d'options sont ignores. Un fichier d'options contient des lignes ayant la forme suivante : #comment, ;comment Les lignes de commentaires commencent avec # ou ;. Depuis MySQL 4.0.14, un commentaire # peut tre ouvert au milieu de la ligne. [group] group est le nom du programme ou du groupe pour lequel vous souhaitez configurer des options. Aprs une ligne de groupe, toutes les option et set-variable s'appliqueront au groupe nomm, jusqu' la fin du fichier d'option ou du dmarrage d'un autre groupe. opt_name Ceci est quivalent --opt_name sur la ligne de commande. opt_name=value Ceci est quivalent --opt_name=value sur la ligne de commande. Dans un fichier d'options, vous pouvez mettre des espaces autour du caractre =, ce qui n'est pas vrai en ligne de commande. Depuis MySQL 4.0.16, vous pouvez mettre les valeurs des options entre guillemets simples ou doubles. C'est utile lorsqu'une valeur contient un dbut de commentaire # ou des espaces. set-variable = variable=value Donne la variable programme var_name sa valeur. Ceci est quivalent --set-variable variable=value sur la ligne de commande. Cette syntaxe doit tre utilise pour spcifier la valeur d'une variable mysqld. Les espaces sont autoriss autour du premier caractre = mais pas autour du second. Notez que --set-variable est obsolte depuis MySQL 4.0, utilisez simplement
195
--variable=value comme tel. Voyez Section 4.3.4, Utiliser les options pour configurer des variables de programme pour plus d'informations sur la spcification des variables programme. Les espaces initiaux et terminaux sont automatiquement effacs autour des noms d'options et de leur valeur. Vous pouvez utilisez les squences spciales \b, \t, \n, \r, \\ et \s dans les valeurs des options pour reprsenter des effacement, tabulations, nouvelles lignes, retour chariot et espaces. Sous Windows, si une valeur d'option reprsente un chemin de dossier, vous devez spcifier la valeur en utilisant / plutt que \ comme sparateur de dossiers. Si vous utilisez use \, vous devez le doubler \\, car \ est le caractre de protection de MySQL. Si un groupe d'options est le mme que le nom d'un programme, les options de ce groupe seront rserves ce programme. Le groupe d'options [client] est lu par tous les programmes clients et pas par le serveur mysqld. Cela vous permet de spcifier les options qui s'appliqueront tous les clients. Par exemple, [client] est le groupe parfait pour spcifier le mot de passe que vous utilisez pour vous connecter au serveur. Mais assurez vous que le fichier est lisible et modifiable uniquement par vous-mme pour que personne ne puisse dcouvrir votre mot de passe. Assurez vous de n'utiliser que des options qui seront reconnues par tous les programmes client. Les programmes qui ne comprennent pas une option vont afficher un message d'erreur lorsque vous les excuterez. Depuis MySQL 4.0.14, si vous voulez crer des groupes d'options qui ne doivent tre lus que par une versions spcifique du serveur mysqld, vous pouvez le faire en utilisant des groupes avec des noms du type [mysqld-4.0], [mysqld-4.1], etc. Le groupe suivante indique que l'option --new soit utilise avec les serveur de version 4.0.x :
[mysqld-4.0] new
Le fichier d'options ci-dessus utilise la syntaxe var_name=value pour les variables key_buffer_size et max_allowed_packet. Avant MySQL 4.0.2, vous auriez besoin d'utiliser la syntaxe set-variable la place (comme prsent prcdemment). Voici un fichier d'options utilisateur classique :
[client] # Le mot de passe suivant sera envoy par tous les clients standards MySQL password="my_password" [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysqlhotcopy] interactive-timeout
Ce fichier d'options utilise la syntaxe set-variable pour spcifier la variable connect_timeout. Depuis MySQL 4.0.2, vous pouvez aussi configurer la variable avec connect_timeout=2.
196
Si vous avez une distribution source, vous trouverez des exemples de configuration dans les fichiers nomms my-xxxx.cnf 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 systmes petits, moyens, grands et trs grands. Vous pouvez copier l'un des fichiers my-xxxx.cnf dans votre dossier utilisateur (renommez le fichier en .my.cnf) pour le tester. Note : sous Windows, le fichier d'options .cnf peut ne pas afficher son extension. Tous les programmes MySQL qui supportent les fichiers d'options grent les options suivantes de ligne de commande : --no-defaults N'utilise aucun fichier d'options. --print-defaults Affiche le nom du programme et toutes les options qui seront lues dans les fichiers d'options. --defaults-file=path_name Utilise uniquement le fichier d'options indiqu. path_name est le chemin complet pour y accder. --defaults-extra-file=path_name Lit ce fichier d'options aprs le fichier d'options globales, et avant le fichier d'options utilisateurs. path_name est le chemin complet pour y accder. Pour fonctionner correctement, toutes ces options doivent immdiatement suivre le nom de la commande en ligne, hormis --print-defaults qui peut tre utilise juste aprs --defaultsfile et --defaults-extra-file. Dans les scripts Shell, vous pouvez utiliser le programme my_print_defaults pour analyser les fichiers d'options. L'exemple suivant montre le rsultat que my_print_defaults peut produire lorsqu'on lui demande d'afficher les options des groupes [client] et [mysql] :
shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash
Note pour les dveloppeurs : la gestion des fichiers est implmente en C dans la bibliothque cliente simplement en traitant les options qui sont trouves, (c'est dire, les options du groupe approprie), et avant les options de ligne de commande. Cela fonctionne correctement avec les programmes qui utilisent la dernire option des options spcifies plusieurs fois. Mais si vous avez un programme C ou C++ qui gre les options de cette manire mais ne lit pas les fichiers d'options, vous aurez peut tre ajouter seulement deux lignes pour lui donner cette fonctionnalit. Voyez le code source des clients MySQL standard pour voir comment faire. De nombreux autres langages s'interfacent avec MySQL grce la bibliothque C, et certains fournissent un moyen d'accder aux fichiers d'options. Cela inclut les langages Perl et Python. Voyez la documentation de votre interface favorite pour plus de dtails.
197
La syntaxe sous Unix dpend de votre Shell. Supposons que vous voulez spcifier le numro de port TCP/IP en utilisant la variable MYSQL_TCP_PORT. La syntaxe Bourne Shell et ses variantes sont (sh, bash, zsh, etc.) est :
MYSQL_TCP_PORT=3306
Les commandes pour spcifier les variables d'environnement peuvent tre excutes l'invite de commande, et prennent effet immdiatement. Ces configurations persistent jusqu' votre dconnexion. Pour que ces configurations soient effectives lors de votre reconnexion, ajoutez les commandes appropries dans votre fichier de dmarrage. Typiquement, les fichiers de dmarrage sont AUTOEXEC.BAT sous Windows, .bash_profile pour bash, ou .tcshrc pour tcsh. Consultez la documentation de votre interprteur de ligne de commande pour les dtails spcifiques. La section Annexe E, Variables d'environnement liste toutes les variables d'environnement qui affectent le fonctionnement de MySQL.
La premire commande spcifie la valeur en octets. La seconde spcifie la valeur en mga-octets. Les valeurs des variables peuvent tre suffixes par K, M ou G (majuscule ou minuscule), pour indiquer une unit de kilo-octets, mega-octets ou giga-octets. Dans un fichier d'options, la configuration de la variable se fait sans les tirets initiaux :
[mysql] max_allowed_packet=16777216
Ou :
[mysql] max_allowed_packet=16M
Si vous voulez, les souligns d'un nom de variable peuvent tre spcfis comme des tirets. Avant MySQL 4.0.2, les noms de variables de programmes n'taient pas reconnus comme des noms d'options. Au lieu de cela, il faut utiliser l'option --set-variable pour assigner une valeur :
shell> mysql --set-variable=max_allowed_packet=16777216 shell> mysql --set-variable=max_allowed_packet=16M
Ou :
[mysql] set-variable = max_allowed_packet=16M
198
Avec --set-variable, les souligns d'un nom de variable ne peuvent pas tre spcifis sous forme de tiret dans les versions de MySQL plus ancienne que la 4.0.2. L'option --set-variable est toujours reconnue par MySQL versions 4.0.2 et plus rcent, mais elle est obsolte. Certaines variables serveurs peuvent tre configures durant l'excution. Voyez la section Section 5.2.3.1, Variables systme dynamiques .
199
200
201
5.9.2. Le log gnral de requtes ...................................................................................... 322 5.9.3. Le log de modification .............................................................................................. 323 5.9.4. Le log binaire .......................................................................................................... 323 5.9.5. Le log des requtes lentes ....................................................................................... 326 5.9.6. Entretien des fichiers de log ..................................................................................... 326 5.10. Faire fonctionner plusieurs serveurs MySQL sur la mme machine ..................................... 327 5.10.1. Utiliser plusieurs serveurs MySQL un serveur Windows ........................................... 329 5.10.2. Utiliser plusieurs serveurs sous Unix ....................................................................... 332 5.10.3. Utiliser les clients dans un environnement multi-serveur ........................................... 333 5.11. Cache de requtes MySQL ............................................................................................... 333 5.11.1. Comment fonctionne le cache de requtes .............................................................. 334 5.11.2. Options relatives au cache de requtes dans un SELECT ......................................... 335 5.11.3. Configuration du cache de requtes ....................................................................... 335 5.11.4. Statut du cache de requtes et maintenance ........................................................... 336 Ce chapitre couvre les problmes d'administration de MySQL, comme la configuration des comptes et les sauvegardes.
202
mysqld_multi Un script de dmarrage qui peut lancer ou arrter diffrentes instances du serveur, installes sur le systme. See Section 5.1.5, mysqld_multi, un programme pour grer plusieurs serveurs MySQL . mysql_install_db Cre les tables de droits MySQL, avec les droits par dfaut. Il est gnralement excut une fois, lors de la premire installation de mysql_fix_privilege_tables Ce script est utilis aprs une mise jour de MySQL, pour mettre jour les tables de droits, et les adapter aux nouvelles versions de MySQL. Il y a plusieurs autres utilitaires qui fonctionnent du cot du serveur : myisamchk Un utilitaire pour dcrire, vrifier, optimiser et rparer les tables MyISAM. myisamchk est dcrit dans Section 5.7.3, Utilisation de myisamchk pour la maintenance des tables et leur recouvrement . make_binary_distribution Ce programme cre une version compile de MySQL. Le rsultat peut tre envoy par FTP /pub/ mysql/Incoming sur support.mysql.com pour aider les autres utilisateurs MySQL. mysqlbug Le script de rapport de bogues de MySQL. Il peut tre utilis pour envoyer un rapport de bogues MySQL. Vous pouvez aussi aller sur http://bugs.mysql.com/ pour remplir un formulaire en ligne.
203
Cette option active le support du moteur InnoDB. MySQL-Max inclut toujours le support de InnoDB, mais cette option est ncessaire pour MySQL 3.23. Depuis MySQL 4, InnoDB est inclut par dfaut dans les distributions binaires, alors il n'est pas ncessaire d'utiliser MySQL-Max pour a. --with-bdb Cette option active le support du moteur de table Berkeley DB (BDB). CFLAGS=-DUSE_SYMDIR Cette option active le support des liens symboliques sous Windows. Les distributions binaires de MySQL-Max sont disponibles pour ceux qui souhaitent installer une version pr-compile. Si vous voulez compiler MySQL-Max depuis les sources, vous pouvez le faire et choisir les fonctionnalits que vous souhaitez au moment de la compilation. Le serveur MySQL-Max inclut le moteur de stockage BerkeleyDB (BDB) lorsque c'est possible, mais toutes les plate-formes ne supportent pas BDB. La table suivante montre quelles plate-formes permettent MySQL-Max d'inclure BDB : Systme AIX 4.3 HP-UX 11.0 Linux-Alpha Linux-IA-64 Linux-Intel Mac OS X NetWare SCO OSR5 Solaris-Intel Solaris-SPARC UnixWare Windows/NT BDB Support N N N N Y N N Y N Y Y Y
Pour connatre les moteurs de stockages que votre serveur supporte, utilisez la commande suivante :
mysql> SHOW ENGINES;
Avant MySQL 4.1.2, SHOW ENGINES est indisponible. Utilisez la commande suivante et vrifiez la valeur de la variable pour le moteur de table qui vous intresse :
mysql> SHOW VARIABLES LIKE 'have_%'; +------------------+----------+ | Variable_name | Value | +------------------+----------+ | have_bdb | NO | | have_crypt | YES | | have_innodb | YES | | have_isam | NO | | have_raid | NO | | have_symlink | DISABLED | | have_openssl | NO | | have_query_cache | YES | +------------------+----------+
204
YES NO DISABLED
L'option est activate et utilisable. L'option n'est pas supporte. L'option est supporte mais dsactive.
La valeur NO signifie que le serveur a t compil sans le support, et que la fonctionnalit ne peut pas tre active durant l'excution. La valeur de DISABLED apparait soit parce que le serveur a t lanc sans l'option qui active cette fonctionnalit, soit si toutes les options ncessaires ne sont pas disponibles. Dans ce dernier cas, le fichier d'erreurs host_name.err devrait contenir la raison indiquant pourquoi l'option a t dsactive. Une situation dans laquelle vous pouvez voir DISABLED survient en version MySQL 3.23, lorsque le moteurInnoDB est compil. En MySQL 3.23, vous devez fournir au moins l'option innodb_data_file_path l'excution pour configurer l'espace de tables InnoDB. Sans cette option, InnoDB se dsactive. See Section 15.3, InnoDB avec MySQL version 3.23 . Vous pouvez spcifier les options de configuration opur les tables BDB, mais BDB ne se dsactivera pas de lui-mme si vous les oubliez. See Section 14.4.3, Options de dmarrage BDB . Vous pouvez aussi rencontrer la valeur de DISABLED pour InnoDB, BDB, ou ISAM si le serveur a t compil pour les supporter, mais si les options de dmarrage --skip-innodb, --skip-bdb ou -skip-isam l'excution. Depuis la version 3.23, tous les serveurs MySQL supportent les tables MyISAM, car le moteur MyISAM est le moteur par dfaut.
205
safe_mysqld supporte les options suivantes : --basedir=path Le chemin jusqu' l'installation de MySQL. --core-file-size=# Taille du fichier core que mysqld doit tre capable de crer. Il est pass ulimit -c. --datadir=path Le chemin jusqu'au dossier de donnes. --defaults-extra-file=path Le nom du fichier d'options lire en plus des fichiers habituels. --defaults-file=path Le nom d'un fichier d'options qui doit tre lu la place du fichier d'options habituel. --err-log=path L'ancienne option --log-error, utiliser avant MySQL 4.0. --ledir=path Le chemin jusqu'au dossier contenant le dossier mysqld. Utilisez cette option pour indiquer explicitement le lieu du serveur. --log-error=path Ecrit le fichier d'erreurs dans le fichier ci-dessus. See Section 5.9.1, Le log d'erreurs . --mysqld=prog_name Le nom du programme serveur (dans le dossier ledir) que vous voulez lancer. Cette option est ncessaire si vous utilisez une distribution binaire MySQL, mais que les donnes sont hors du dossier d'installation. --mysqld-version=suffix Cette option est similaire l'option --mysqld, mais vous spcifiez uniquement le suffixe du nom du programme. Le nom de base sera alors mysqld. Par exemple, si vous utilisez --mysqldversion=max, mysqld_safe va lancer le programme mysqld-max dans le dossier ledir. Si l'argument de --mysqld-version est vide, mysqld_safe utilise mysqld dans le dossier ledir. --nice=priority Utilise le programme nice pour donner la priorit du serveur. Cette option a t ajoute en MySQL 4.0.14. --no-defaults Ne lit aucun fichier d'options. --open-files-limit=count Le nombre de fichiers que mysqld ouvre au maximum. La valeur de l'option est passe ulimit -n. Notez que vous devez lancer mysqld_safe en tant que root pour que cela fonctionne correctement. --pid-file=path
206
Le chemin jusqu'au fichier d'identifiant de processus. --port=port_num Le numro de port utiliser pour attendre les connexion TCP/IP. --socket=path Le fichier de socket Unix pour les connexions locales. --timezone=zone Configure la variable d'environnement TZ. Consultez votre documentation systme pour connatre le format lgal des fuseaux horaires. --user={user_name | user_id} Lance le serveur mysqld sous le nom d'utilisateur user_name ou avec l'utilisateur d'identifiant numrique ID user_id. (``Utilisateur'' dans ce contexte reprsente le compte systme, et non pas les utilisateurs des tables de droits MySQL). Le script safe_mysqld a t crit pour qu'il soit capable de dmarrer le serveur qui a t install partir des sources ou de la version binaire, mme si l'installation de MySQL est lgrement exotique. See Section 2.1.5, Dispositions d'installation . safe_mysqld suppose que les conditions suivantes sont remplies : Le serveur et les bases de donnes sont places 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 excutez safe_mysqld depuis votre dossier d'installation MySQL (par exemple, / usr/local/mysql pour une distribution binaire). Si le serveur et les bases de donnes ne peuvent tre trouves dans le dossier de travail, safe_mysqld essaie de les trouver en utilisant leurs chemins absolus. Les chemin typiquement tudis sont /usr/local/libexec et /usr/local/var. Les chemins rels sont dtermins lorsque la distribution est compile, et safe_mysqld a alors aussi t gnr. 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 dmarrez le script safe_mysqld dans le dossier d'installation de MySQL :
shell> cd mysql_installation_directory shell> bin/safe_mysqld &
Si safe_mysqld choue, mme 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 crase, et vous devrez la rditer. Normalement, vous ne devez pas diter le script mysqld_safe. Au lieu de cela, configurez mysqld_safe en utilisant les options de ligne de commande, ou les options de la section [mysqld_safe] du fichier d'options my.cnf. Dans de rares cas, il sera peut tre ncessaire d'diter mysqld_safe pour faire fonctionner correctement le serveur. Cependant, si vous faites cela, mysqld_safe risque d'tre cras lors de la prochaine mise jour de MySQL : fates en une sauvegarde avant d'installer. Sous NetWare, mysqld_safe est un NetWare Loadable Module (NLM) qui est un port du script Unix original. Il fait ceci : 1. Effectue des vrifications systme et des options. 2. Lance la vrification des tables MyISAM et ISAM.
207
3. Affiche un cran de prsence de MySQL. 4. Lance mysqld, le surveille et le relance s'il s'arrte sur une erreur. 5. Envoie les messages de mysqld dans le fichier host_name.err dans le dossier de donnes. 6. Envoie les affichages de mysqld_safe dans le fichier host_name.safe dans le dossier de donnes.
start, stop et report indique le type d'opration que vous voulez faire. Vous pouvez faire une opration sur un serveur unique ou plusieurs serveurs, en fonction de la liste GNR qui suit le nom de l'opration. S'il n'y a pas de liste, mysqld_multi effectue l'opration sur tous les serveurs du fichier d'options. Chaque GNR reprsente un numro de groupe d'options. Vous pouvez dmarrer, arrter ou examiner n'importe quel numro de groupe d'options, ou mme plusieurs d'entre eux en mme temps. Par
208
exemple, le groupe GNR pour le groupe appel [mysqld17] est 17. Pour spcifier un intervalle de nombres, sparez le premier et le dernier numro par un tiret. La valeur GNR 10-13 reprsente les groupes de [mysqld10] [mysqld13]. Les groupes multiples ou les intervalles de groupes peuvent tre spcifies en ligne de commande, spars par virgules. Il ne doit pas y avoir d'espace blanc entre deux lments de la liste : tout ce qui sera aprs un espace sera ignor. Cette commande lance un serveur unique, avec le groupe d'options [mysqld17] :
shell> mysqld_multi start 17
Cette commande arrte plusieurs serveurs, en utilisant les groupes d'options [mysql8] et [mysqld10] [mysqld13] :
shell> mysqld_multi start 8,10-13
Les valeurs de numro de groupe d'options peuvent tre une liste de valeurs spares par une virgule ou un tiret. Dans ce dernier cas, toutes les numro de groupe d'options situs entre les deux numros seront alors affects. Sans numro de groupe d'options spcifi, tous les numros de groupes du fichier d'options sont affects. Notez que vous ne devez pas avoir d'espace dans la liste des numros de groupe d'options. Tout ce qui est plac au-del de l'espace sera ignor. mysqld_multi supporte les options suivantes : --config-file=name 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 my.cnf. Cette option n'affecte pas la faon avec laquelle mysqld_multi lit ses options, qui sont toujours prises dans le groupe [mysqld_multi] du fichier my.cnf habituel. --example Affiche un exemple de fichier de configuration. --help Affiche l'aide et quitte. --log=name Fichier de log. Le chemin complet et le nom du fichier sont ncessaires. --mysqladmin=prog_name L'excutable mysqladmin utiliser lors de l'arrt du serveur. --mysqld=prog_name L'excutable mysqld utiliser. Notez que vous pouvez donner cette option safe_mysqld. Ces options sont passes mysqld. Assurez-vous que vous avez bien mysqld dans votre variable d'environnement PATH ou corrigez safe_mysqld. --no-log Affiche les donnes d'historique l'cran plutt que dans le fichier de log. Par dfaut, le fichier de log est activ. --password=password Le mot de passe de l'utilisateur mysqladmin.
209
--tcp-ip Connexion au serveur MySQL via le port TCP/IP au lieu de la socket Unix. Cela affecte l'arrt 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 dfaut, les connexions sont faites avec les sockets Unix. --user=user_name L'utilisateur MySQL pour mysqladmin. --version Affiche le numro 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 mmes nom d'utilisateur et mot de passe pour tous les dossiers de donnes utiliss. Et assurez-vous que cet utilisateur a bien les droits de SHUTDOWN! Si vous avez de nombreux dossiers de donnes et de nombreuses bases mysql avec diffrents mots de passe pour le serveur root MySQL, vous souhaiterez peut tre crer un utilisateur commun multi_admin chaque base, avec le mme mot de passe (voir ci-dessous). Voici comment faire :
shell> mysql -u root -S /tmp/mysql.sock -proot_password -e "GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'multipass'"
See Section 5.5.2, Comment fonctionne le systme de droits . Vous devrez utiliser la mme commande pour chaque serveur mysqld qui fonctionne : changez simplement la socket, -S=...). pid-file est trs important, si vous utilisez safe_mysqld pour dmarrer 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 redmarrera si un processus mysqld s'arrte suite la reception d'un signal kill -9, ou pour toute autre raison comme une erreur de segmentation (que MySQL ne devrait jamais faire, bien sr !). Notez bien que le script safe_mysqld vous imposera peut tre d'tre dmarr depuis un dossier spcial. Cela signifie que vous devrez probablement utiliser la commande shell cd jusqu' un certain dossier avant de pouvoir excuter mysqld_multi. Si vous avez des problmes pour dmarrer, voyez le script safe_mysqld. Vrifiez notamment ces lignes :
---------------------------------------------------------------MY_PWD=`pwd` # Check if we are starting this relative (for the binary release) if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \ -x ./bin/mysqld ----------------------------------------------------------------
See Section 5.1.3, safe_mysqld, le script pre de mysqld . Le test ci-dessus devrait fonctionner, ou bien vous rencontrerez probablement des problmes. Le fichier de socket et le port TCP/IP doivent tre diffrents pour chaque mysqld. Vous pouvez utiliser l'option --user de mysqld, mais afin de faire cela, vous devez excuter 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 dmons mysqld seront dmarrs avec vos droits Unix. Important : assurez-vous bien que le fichier de donnes et le fichier de pid-file sont accessibles en lecture et criture (et excution 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 fates. Trs important : assurez-vous de bien comprendre la signification des options que vous passez mysqlds et pourquoi vous avez besoin de plusieurs processus mysqld. Mfiez vous des piges
210
Configuration de MySQL
des serveurs multiples mysqld dans le mme dossier de donnes. Utilisez des dossiers de donnes moins que vous ne sachiers ce que vous fates. Dmarrer plusieurs serveurs mysqlds dans le mme dossier ne vous donnera aucun gain de performance dans un systme thread. See Section 5.10, Faire fonctionner plusieurs serveurs MySQL sur la mme machine . Voici un exemple de fichier de configuration fourni par mysqld_multi.
# This file should probably be in your home dir (~/.my.cnf) or /etc/my.cnf # 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 port pid-file datadir language user [mysqld3] socket port pid-file datadir language user [mysqld4] socket port pid-file datadir language user [mysqld6] socket port pid-file datadir language user
= = = = = =
= = = = = =
= = = = = =
= = = = = =
211
mmes options chaque redmarrage : il est recommand de les mettre dans le fichier d'options. See Section 4.3.2, Fichier d'options my.cnf . 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 intgr lit gnralement les options dans les groupes server, embedded et xxxxx_SERVER, o xxxxx est le nom de l'application. mysqld accepte de nombreuses options de ligne de commande. Pour une liste complte, utilisez la commande mysqld --help. Avant MySQL 4.1.1, --help affiche un message d'aide complet. Depuis 4.1.1, il affiche un bref message. Pour voir la liste complte, utilisez mysqld --verbose --help. La liste suivante montre les options de serveur les plus courantes. Les options supplmentaires sont dtailles ailleurs. Options qui affectent la scurit : voir Section 5.4.3, Options de dmarrage qui concernent la scurit . Options lies SSL : voir Section 5.6.7.5, Options SSL en ligne de commande . Options de contrle des logs binaires : voir Section 5.9.4, Le log binaire . Options de rplication : voir Section 6.8, Options de dmarrage de la rplication . Options spcifiques un moteur de table particulier : voir Section 14.1.1, Options de dmarrage MyISAM , Section 14.4.3, Options de dmarrage BDB , Section 15.5, Options de dmarrage InnoDB . Vous pouvez aussi modifier les valeurs des variables systme en utilisant le nom de l'option comme variable systme, tel que dcrit ultrieurement. --help, -? Affiche l'aide courte et termine le programme. Avant MySQL 4.1.1, --help affiche un message d'aide complet. Depuis 4.1.1, il affiche un bref message. Pour voir la liste complte, utilisez mysqld --verbose --help. --allow-suspicious-udfs Cette option contrle le fait que les fonctions utilisateurs qui disposent d'un seul symble xxx puissent tre charges. Par dfaut, cette option est dsactive, et seule les UDF qui ont au moins un symbole auxiliaire peuvent tre charges. Cela vite de charger des fonctions issues d'un objet partag qui ne serait pas une fonction utilisateur lgitime. Cette option a t ajoute en MySQL 4.0.24, 4.1.10a et 5.0.3. See Section 27.2.3.6, Prcautions prendre avec les fonctions utilisateur . --ansi Utilise la syntaxe ANSI SQL au lieu de la syntaxe MySQL. See Section 1.5.3, Excuter MySQL en mode ANSI . Pour un contrle plus prcis sur le mode SQL serveur, utilisez l'option --sql-mode. --basedir=path, -b path Chemin jusqu'au dossier d'installation. Tous les chemins sont gnralement relatifs celui-ci. --big-tables Autorise la sauvegarde de grands rsultats dans des fichiers temporaires. Cela rsout le problme des erreurs "table full", mais ralentit les requtes alors que des tables en mmoire suffirait. Depuis la version version 3.23.2, MySQL est capable de rsoudre automatiquement ce problme en utilisant de la mmoire pour toutes les tables temporaires de petite taille, et en passant sur le disque au besoin.
212
--bind-address=IP L'adresse IP utiliser. --console Ecrit les messages d'erreurs du log d'erreur sur la sortie standard, mme si --log-error est spcifie. Sous Windows, mysqld ne ferme pas l'cran de console si cette option est utilise. --character-sets-dir=path Dossier contenant les jeux de caractres. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --chroot=path Met le dmon mysqld en environnement chroot au dmarrage. Recommand pour la scurit depuis MySQL 4.0. (MySQL 3.23 n'est pas capable de fournir un encadrement chroot() qui soit 100% tanche). Cela limite les commandes LOAD DATA INFILE et SELECT ... INTO OUTFILE. --core-file Ecrire le fichier core lorsque mysqld s'arrte inopinment. Pour certains fichiers, vous devez aussi spcifier --core-file-size safe_mysqld. See Section 5.1.3, safe_mysqld, le script pre de mysqld . Notez que sur certains systmes, comme Solaris, vous n'aurez pas de fichier de core si vous avez aussi utilis l'option --user. --datadir=path, -h path Chemin jusqu'au dossier de donnes. --debug[=debug_options], -# [debug_options] Si MySQL est configur avec --with-debug, vous pouvez utiliser cette option pour obtenir un fichier de trace de ce que mysqld fait. See Section D.1.2, Crer un fichier de traage . --default-character-set=charset Spcifie le jeu de caractres par dfaut. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --default-collation=collation Spcifie la collation par dfaut. Cette option est disponible depuis MySQL 4.1.1. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --default-storage-engine=type Cette option est un synonyme de --default-table-type. Cette option est disponible depuis MySQL 4.1.2. --default-table-type=type Spcifie le type de table par dfaut. See Chapitre 14, Moteurs de tables MySQL et types de table. --delay-key-write[= OFF | ON | ALL] Comment l'option DELAYED KEYS doit tre utilise. Les critures diffres font que les buffers de cls ne sont pas crits entre deux criture pour les tables MyISAM. OFF dsactive les critures diffres. ON active les critures diffres pour les tables qui ont t cres avec l'option DELAYED KEYS. ALL active les critures diffres pour les tables MyISAM. Cette option est disponible depuis MySQL 4.0.3. See Section 7.5.2, Rglage des paramtres du serveur . See Section 14.1.1, Options de dmarrage MyISAM .
213
Note : Si vous avez donn la valeur de ALL cette option, vous ne devez pas utiliser les tables MyISAM depuis un autre programme (comme myisamchk) lorsque la tables utilise. En faisant cela, vous obtiendrez une corruption d'index. --delay-key-write-for-all-tables Ancienne forme de --delay-key-write=ALL utiliser sur les versions antrieures la version 4.0.3. Depuis la version 4.0.3, utilisez --delay-key-write. --des-key-file=file_name Lit les cls par dfaut utilises par DES_ENCRYPT() et DES_DECRYPT() dans ce fichier. --enable-named-pipe Active le support des pipes nomms (seulement sur NT/Win2000/XP). Cette option ne s'applique qu'aux systmes Windows NT, 2000 et XP, et peut tre utilis avec les serveurs mysqld-nt et mysqld-max-nt qui supportent les pipes nomms. --exit-info, -T Cette option est la combinaison d'options que vous pouvez utiliser pour le dbogage du serveur mysqld. Si vous ne savez pas ce que ca fait exactement, ne l'utilisez pas ! --external-locking Active le verrouillage systme. Notez que si vous utilisez cette option sur un systme pour qui lockd ne fonctionne pas (comme Linux), vous allez bloquer rapidement mysqld avec les verrous. Anciennement appele --enable-locking. Note : si vous utilisez cette option pour activer des modifications de tables MyISAM depuis plusieurs processus MySQL, vous devez vous assurer de trois conditions : Vous n'utilisez pas de cache de requte pour les requtes qui utilisent les tables sont modifies par un autre processus. Vous ne devez pas utiliser --delay-key-write=ALL ou DELAY_KEY_WRITE=1 sur des tables partages. Le plus simple pour s'assurer de cela est de toujours utiliser l'option --external-locking avec --delay-key-write=OFF --query-cache-size=0. (Ceci n'est pas fait par dfaut, car dans de nombreuses configurations, il est pratique de faire un mlange des options ci-dessus). --flush Ecrit toutes les donnes sur le disque aprs chaque requte SQL. Normalement, MySQL fait des critures sur le disque aprs chaque requte, et laisse le systme d'exploitation assurer la synchronisation avec le disque. See Section A.4.2, Que faire si MySQL plante constamment ? . --init-file=file Lit les commandes SQL dans ce fichier au dmarrage. Chaque commande doit tre sur une ligne, et ne pas utiliser de commentaires. --language=lang_name, -L lang_name Spcifie la langue utilise pour les messages d'erreur du client. Le chemin complet doit tre utilis. See Section 5.8.2, Langue des messages d'erreurs . --log[=file], -l [file]
214
Enregistre les connexions et les requtes dans ce fichier. See Section 5.9.2, Le log gnral de requtes . Si vous ne le faites pas, MySQL va utiliser host_name.log comme nom de fichier. --log-bin=[file] Enregistre toutes les requtes qui modifient des donnes dans un log. See Section 5.9.4, Le log binaire . Ce log est utilis pour la sauvegarde et la rplication. Si vous ne le faites pas, MySQL va utiliser host_name-bin comme nom de fichier. --log-bin-index[=file] Fichier d'index pour les noms de fichiers de log binaire. See Section 5.9.4, Le log binaire . Si vous ne le faites pas, MySQL va utiliser host_name-bin.index comme nom de fichier. --log-error[=file] Enregistre les messages d'erreurs et les messages de dmarrage dans ce fichier. See Section 5.9.1, Le log d'erreurs . Si vous ne le faites pas, MySQL va utiliser host_name.err comme nom de fichier. --log-isam[=file] Enregistre toutes les modifications des tables ISAM/MyISAM dans ce fichier (uniquement ncessaire pour dboguer ISAM/MyISAM). --log-long-format Enregistre des informations supplmentaires dans les fichiers de log (log de modifications, log binaire de modifications, log de requtes lentes, n'importe quel log en fait). Par exemple, le nom d'utilisateur et un timestamp sont enregistrs avec la requte. Si vous utilisez --log-slowqueries et --log-long-format, alors les requtes qui n'utilisent pas d'index seront aussi enregistres. Notez que --log-long-format est obsolte depuis la version 4.1, o --logshort-format a t introduite (le format de log long est la configuration par dfaut en version 4.1). Notez aussi que depuis la version MySQL 4.1 l'option --log-queries-not-using-indexes est disponible pour enregistre spcifiquement les requte qui n'utilisent pas d'index, dans le log de requtes lentes. --log-queries-not-using-indexes Si vous utilisez cette option avec --log-slow-queries, alors les requtes qui n'utilisent pas d'index seront aussi enregistres dans le log de requtes lentes. Cette option est disponible depuis MySQL 4.1. See Section 5.9.5, Le log des requtes lentes . --log-short-format Enregistre moins d'information dans les fichiers de log (log de modifications, log binaire de modifications, log de requtes lentes, n'importe quel log en fait). Par exemple, les noms d'utilisateur et un timestamp ne seront pas enregistrs avec les requtes. Cette option a t ajoute en MySQL 4.1. --log-slow-queries[=file] Enregistre toutes les requtes qui prennent plus de long_query_time secondes a s'excuter. Notez que la quantit d'information enregistre par dfaut a chang en MySQL 4.1. Voyez les options --log-long-format et --log-long-format pour plus de dtails. See Section 5.9.5, Le log des requtes lentes . --log-update[=file]
215
Enregistre les modifications de donnes dans le fichier file.# o # est un nombre unique, s'il n'est pas fourni. See Section 5.9.3, Le log de modification . Le log de modification est obsolte et supprim en MySQL 5.0.0; vous devriez utiliser le log binaire la place. (--log-bin). See Section 5.9.4, Le log binaire . Depuis la version 5.0.0, utilisez --log-update va simplement activer le log binaire. (see Section C.1.7, Changements de la version 5.0.0 (22 dcembre 2003 : Alpha) ). --log-warnings, -W Affiche les alertes comme Aborted connection... dans le fichier d'erreur .err. Activer cette option est recommand, par exemple, si vous utilisez la rplication : vous obtiendrez plus d'informations sur ce qui se passe, comme les erreurs de connexion rseau, ou les reconnexions. Cette option est active par dfaut depuis MySQL 4.1.2; pour la dsactiver, utilisez --skip-logwarnings. See Section A.2.10, Erreurs de communication / Connexion annule . Cette option s'appelait --warnings avant MySQL 4.0. --low-priority-updates Les oprations de modifications de table (INSERT/DELETE/UPDATE) auront une priorit infrieure aux slections. Cela peut tre aussi fait via l'attribut {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... pour baisser la priorit d'une requte, ou avec SET LOW_PRIORITY_UPDATES=1 pour changer la priorit dans plus d'un thread. See Section 7.3.2, Problme de verrouillage de tables . --memlock Verrouille le processus mysqld en mmoire. Cela fonctionne si votre systme support la fonction mlockall() (comme Solaris). Ceci peut tre utile si vous avez des problmes avec le systme d'exploitation qui force mysqld 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 dsactiver cette option. Si cette option est utilise, mysqld va vrifier si la table est marque comme corrompue l'ouverture de chaque table (cette dernire option ne fonctionne que si vous utilisez l'option --skip-external-locking). Si c'est le cas, mysqld va essayer de vrifier la table. Si la table tait corrompue, mysqld essaie alors de la rparer. L'option suivante va affecter la manire avec la quelle la rparation s'effectue.
Description Identique ne pas donner d'option --myisam-recover. Si la table a t modifie durant la rparation, sauver une copie du fichier table_name.MYD, sous le nom de table_name-datetime.BAK. Excute une rparation mme si nous allons perdre une ou plusieurs lignes dans le fichier .MYD. Ne vrifie pas les lignes dans la table si il n'y a pas eu d'effacement.
Avant que la table ne soit automatiquement rpare, 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 rparation de la table, mme si quelques lignes sont effaces, et conserve le vieux fichier de donnes comme sauvegarde, pour examen ultrieur. Cette option est disponible depuis MySQL 3.23.25. 216
--new Depuis la version 4.0.12, l'option --new sert dire au serveur d'adopter le comportement de la version 4.1 pour certains aspects, afin de simplifier la migration de 4.0 en 4.1 : TIMESTAMP est retourn sous forme de chane avec le format 'YYYY-MM-DD HH:MM:SS'. See Chapitre 11, Types de colonnes. Cette option peut vous aider voir comment vos applications vont se comporter en MySQL 4.1, sans rellement changer de version. --pid-file=path Le chemin jusqu'au fichier de PID utilis par safe_mysqld. --port=port_num, -P port_num Numro de port utilis pour attendre les connexion TCP/IP. --old-protocol, -o Utilise le protocole 3.20, pour la compatibilit avec de trs vieux clients. See Section 2.6.6, Passer de la version 3.20 la version 3.21 . --one-thread Utilise uniquement un thread (pour dbogage sous Linux). Cette option est disponible uniquement si le serveur est compil avec les options de dbogage. See Section D.1, Dboguer un serveur MySQL . --open-files-limit=count Pour changer le nombre de pointeurs de fichiers disponibles pour mysqld. Si cette option n'est pas configure, ou qu'elle vaut 0, alors mysqld va utiliser cette valeur pour rserver ce nombre de pointeurs de fichiers, utiliser avec setrlimit(). Si la valeur est 0 alors mysqld va rserver max_connections*5 ou max_connections + table_cache*2 (le plus grand des deux) pointeurs de fichiers. Il est recommand d'augmenter cette valeur si mysqld met des erreurs de type 'Too many open files'. --safe-mode Ignore certains tapes d'optimisation. --safe-show-database Avec cette option, la commande SHOW DATABASES retourne uniquement les bases pour lesquelles l'utilisateur a des droits. Depuis la version 4.0.2, cette option est abandonne, et ne fait plus rien (l'option est active par dfaut) car nous avons dsormais le droit de SHOW DATABASES. See Section 13.5.1.3, Syntaxe de GRANT et REVOKE . --safe-user-create Si cette option est active, un utilisateur ne peut pas crer de nouveaux utilisateurs avec la commande GRANT si l'utilisateur n'a pas les droits de INSERT dans la table mysql.user ou dans aucune colonne de cette table. --secure-auth Interdit l'identification des comptes qui ont des mots de passe ancien (avant la version 4.1). Cette option est disponible depuis MySQL 4.1.1. --skip-bdb
217
Dsactive l'utilisation des tables BDB. Cela va conomiser de la mmoire et acclrer le serveur un peu. N'utilisez pas cette option si vous avez besoin des tables BDB. --skip-concurrent-insert Dsactive la possibilit de slectionner et insrer en mme 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 Ignore l'option DELAY_KEY_WRITE de toutes les tables. Depuis MySQL 4.0.3, vous devez utiliser -delay-key-write=OFF la place. See Section 7.5.2, Rglage des paramtres du serveur . --skip-external-locking Ne pas utiliser le verrouillage du systme. Pour utiliser les utilitaires isamchk ou myisamchk vous devez alors teindre le systme. See Section 1.2.3, Jusqu' quel point MySQL est il stable ? . Notez qu'en MySQL version 3.23 vous pouvez utiliser la commande REPAIR et CHECK pour rparer ou vrifier des tables MyISAM tables. Cette option s'appelait auparavant --skip-locking. --skip-grant-tables Cette option force le serveur ne pas utiliser le systme de privilge du tout. Cela donne tous l'accs complet toutes les bases de donnes ! Vous pouvez demander un serveur en excution d'utiliser nouveau les tables de droits en excutant la commande mysqladmin flushprivileges ou mysqladmin reload). --skip-host-cache Ne pas utiliser le cache de nom de domaine pour une rsolution des IP plus rapide, mais interroger le serveur DNS chaque connexion. See Section 7.5.6, Comment MySQL utilise le DNS . --skip-innodb Dsactive l'utilisation des tables InnoDB. Cela va conomiser de la mmoire et acclrer le serveur un peu. N'utilisez pas cette option si vous avez besoin des tables InnoDB. --skip-isam Dsactive l'utilisation des tables ISAM. Cela va conomiser de la mmoire et acclrer le serveur un peu. Depuis MySQL 4.1, ISAM est dsactiv par dfaut, ce qui fait que cette option n'apparat que si le serveur a t configur avec le support N'utilisez pas cette option si vous avez besoin des tables ISAM. --skip-name-resolve Les noms d'htes ne sont pas rsolus. Toutes les colonnes Host dans vos tables de droits doivent tre des IP numriques ou le mot localhost. See Section 7.5.6, Comment MySQL utilise le 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 particulirement recommande pour les systmes qui utilisent des requtes locales. See Section 7.5.6, Comment MySQL utilise le DNS . --skip-new Ne pas utiliser les nouvelles routines qui sont possiblement errones. --skip-symlink
218
C'est l'ancienne forme de --skip-symbolic-links, utiliser avant MySQL 4.0.13. --symbolic-links, --skip-symbolic-links Active ou dsactive le support des liens symboliques. Cette option a diffrents effets sur Windows et sur Unix. Sous Windows, activer les liens symboliques vous permet d'tablir un lien symbolique vers une base de donnes, en crant un fichier directory.sym qui contient le chemin rel. See Section 7.6.1.3, Utiliser des liens symboliques pour les bases de donnes sous Windows . Sous Unix, activer les liens symboliques signifie que vous pouvez mettre un fichier d'index MyISAM ou un autre fichier de donnes dans un autre dossier, avec les options INDEX DIRECTORY ou DATA DIRECTORY de la commande CREATE TABLE. Si vous effacer ou renommez la table, les fichiers qui sont des liens symboliques seront aussi effacs ou renomms. See Section 13.2.5, Syntaxe de CREATE TABLE . Cette option est disponible depuis MySQL 4.0.13. --skip-show-database Si MySQL est configur avec --with-debug=full, tous les programmes vrifieront la mmoire pour rechercher les crasements de zone lors des allocations et librations de mmoire. Comme ce test est lent, vous pouvez l'viter, si vous n'avez pas besoin de tester la mmoire, 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 distribus 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 dbogueur. Sur certains systmes, vous devez aussi utiliser cette option pour obtenir un fichier de core. See Section D.1, Dboguer un serveur MySQL . --skip-thread-priority Dsactive les priorits des threads pour amliorer la vitesse de rponse. --socket=path
Sous Unix, le fichier de socket pour les connexions locales. (par dfaut, /tmp/mysql.sock). Sous Windows, le nom du pipe utiliser pour les connexions locales qui utilisent un pipe nomm (par dfaut, MySQL).
--sql-mode=value[,value[,value...]] Spcifie le mode SQL. See Section 5.2.2, Le mode SQL du serveur . Cette option est disponible depuis 3.23.41. --temp-pool En utilisant cette option, vous allez rduire le jeu de noms qui sont utiliss lors de la cration de fichier temporaires, plutt qu'un nom unique chaque fois. Ceci est un palliatif au noyau Linux qui cre plusieurs fichiers nouveaux avec des noms diffrents. Avec l'ancien comportement, Linux
219
semble "perdre de la mmoire", car ils sont allous au cache d'entres du dossier au lieu de celui du disque. --transaction-isolation=level Configure le niveau d'isolation des transactions. Le niveau peut tre READ-UNCOMMITTED, READCOMMITTED, REPEATABLE-READ ou SERIALIZABLE. See Section 13.4.6, Syntaxe de SET TRANSACTION . --tmpdir=path, -t path Chemin vers les fichiers temporaires. Il peut s'avrer pratique si votre dossier par dfaut /tmp rside dans une partition qui est trop petite pour absorber les tables temporaires. Depuis MySQL MySQL 4.1, cette option accepte diffrents chemins, qui sont utiliss en alternance. Les chemins doivent tre spars par des deux points (:) sous Unix et des points-virgules (;) sous Windows. Il est possible de dire tmpdir de pointer sur un systme de fichiers en mmoire, hormis si le serveur MySQL est un esclave. Si c'est un esclave, il faut un systme de fichiers permanents (pour que la rplication des tables temporaires et des commandes LOAD DATA INFILE) survive a un redmarrage de la machine : un systme de fichiers en mmoire tmpdir, qui est effac au lancement de la machine n'est pas acceptable. Un disque est ncessaire pour tmpdir, dans ce contexte. --user={user_name | user_id}, -u {user_name | user_id} Excute le dmon mysqld avec l'utilisateur user_name ou userid (numrique). (``utilisateur'' dans ce contexte fait rfrence l'utilisateur du systme d'exploitation, mais pas l'utilisateur MySQL, list dans les tables de droits.) Cette option est obligatoire lorsque vous dmarrez mysqld en tant que root. Le serveur va changer d'ID durant le lancement du serveur, pour utiliser un autre utilisateur que root. See Section 5.4, Scurit gnrale du serveur . Depuis MySQL 3.23.56 et 4.0.12: Pour viter des trous de scurit si un utilisateur ajoute -user=root dans un fichier my.cnf (et donc, faisant que le serveur fonctionne en tant que utilisateur systme root), mysqld utilise uniquement la premire option --user spcifie, et produit une alerte s'il rencontre d'autres options --user. Les options des fichiers /etc/my.cnf et datadir/my.cnf sont traits avant les options de ligne de commande, et il est recommand que vous ajoutiez l'option --user dans le fichier /etc/my.cnf puis spcifiez une valeur autre que root. L'option de /etc/my.cnf peut tre place avant toute autre option --user, ce qui assure que le serveur fonctionnera avec l'utilisateur autre que root, et qu'une alerte apparatra si une autre option --user est dcouverte. --version, -V Affiche les informations de version. Vous pouvez assigner une valeur une variable systme en utilisant une option de la forme -nom_de_variable=valeur. Par exemple, --key_buffer_size=32M donne la variable key_buffer_size la valeur de 32 Mo. Notez que lorsque vous donnez une valeur une variable, MySQL peut corriger automatiquement la valeur pour qu'elle reste dans un intervalle donn, ou peut ajuster la valeur la valeur possible la plus proche. Il est aussi possible de donner des valeurs aux variables avec la syntaxe --setvariable=var_name=value ou -O var_name=value. Notez que cette syntaxe est abandonne depuis MySQL 4.0. Vous pouvez trouver une description complte de toutes les variables dans la section Section 5.2.3, Variables serveur systme . La section sur le paramtrage du serveur inclut des dtails sur l'optimisation. See Section 7.5.2, Rglage des paramtres du serveur . 220
Vous pouvez changer la valeur de la plupart des variables systme sur un serveur en fonctionnement avec la commande SET. See Section 13.5.2.8, Syntaxe de SET . Si vous voulez limiter la valeur maximale qu'une option recevra avec la commande SET, vous pouvez la dfinir en utilisant l'option --maximum-nom_de_variable en ligne de commande.
221
Ce mode est nouveau en MySQL 5.0.2. Avant 5.0.2, c'tait le mode par dfaut de gestion des dates. Depuis 5.0.2, activer le mode strict impose au serveur de vrifier la validit des dates, et non pas seulement les intervalles. Par exemple, '2004-04-31' est valide sans le mode strict, mais ne l'est plus avec le mode strict. Pour permettre ces valeurs malgr le mode strict, utilisez le mode ALLOW_INVALID_DATES. ANSI_QUOTES Traite " comme un dlimiteur d'identifiant (comme le caractre MySQL `) et non comme un dlimiteur de chanes. Vous pouvez toujours utiliser ` pour dlimiter les identifiants en mode ANSI. Avec ANSI_QUOTES active, vous ne pouvez pas utiliser les guillemets doubles pour dlimiter une chane de caractres, car ce sera uniquement interprt comme un identifiant. (Nouveau en MySQL 4.0.0.) ERROR_FOR_DIVISION_BY_ZERO Produit une erreur en mode strict et sinon une alerte, lorsque MySQL doit tenter une division par 0 ou un MOD(X,0)) durant une commande INSERT/ UPDATE. Si ce mode n'est pas activ, MySQL retourne simplement NULL pour les divisions par zro. Si utilis avec l'attribut IGNORE, MySQL gnre une alerte pour les divisions par zro, mais le rsultat de l'opration sera NULL. (Nouveau en MySQL 5.0.2) IGNORE_SPACE Permet les espaces entre le nom de la fonction et le caractre (. Cela force les noms de fonctions a tre traits comme des mots rservs. En consquence, si vous voulez accder aux bases, tables et colonnes dont le nom est un mot rserv, vous devez le mettre entre dlimiteurs. Par exemple, comme la fonction USER() existe, le nom de la table user de la base mysql et la colonne User de cette table doivent tre protgs :
SELECT "User" FROM mysql."user";
(Nouveau en MySQL 4.0.0.) NO_AUTO_VALUE_ON_ZERO NO_AUTO_VALUE_ON_ZERO affecte la gestion des colonnes de type AUTO_INCREMENT. Normalement, vous gnrez le prochain numro de squence dans la colonne en insrant soit NULL soit 0 dedans. NO_AUTO_VALUE_ON_ZERO supprime ce comportement pour 0 pour que seule la valeur NULL gnre le prochain numro de squence. Ce mode est utile si vous avez stock la valeur 0 dans la colonne AUTO_INCREMENT de la table. Ce n'est pas recommand. Par exemple, si vous voulez exporter une table avec mysqldump et que vous la rechargez, normalement MySQL va gnrer de nouveaux identifiants pour les lignes avec la valeur 0, ce qui entranera une diffrence avec la table originale. En activant NO_AUTO_VALUE_ON_ZERO avant de recharger le fichier exporter, vous viter de problme. Depuis MySQL 4.1.1, mysqldump va automatiquement inclure les commandes ncessaires dans l'export, pour activer NO_AUTO_VALUE_ON_ZERO. (Nouveau en MySQL 4.1.1.) NO_DIR_IN_CREATE Lors de la cration d'une table, ignore les directives INDEX DIRECTORY et DATA DIRECTORY. Cette option est pratique sur un esclave de rplication. (Nouveau en MySQL 4.0.15.) NO_FIELD_OPTIONS N'affiche pas les options spcifiques MySQL dans le rsultat de SHOW CREATE TABLE. Ce mode est utilis par mysqldump dans un souci de portabilit. (Nouveau en MySQL 4.1.1.) NO_KEY_OPTIONS
222
N'affiche pas les options spcifiques MySQL dans le rsultat de SHOW CREATE TABLE. Ce mode est utilis par mysqldump dans un souci de portabilit. (Nouveau en MySQL 4.1.1.) NO_TABLE_OPTIONS N'affiche pas les options de tables spcifiques MySQL (comme ENGINE) dans le rsultat de SHOW CREATE TABLE. Ce mode est utilis par mysqldump dans un souci de portabilit. (Nouveau en MySQL 4.1.1.) NO_ZERO_DATE Ne permet pas l'utilisation de '0000-00-00' comme date valide. Vous pouvez toujours insrer des dates nulles avec l'option IGNORE. (Nouveau en MySQL 5.0.2) NO_ZERO_IN_DATE N'accepte pas les dates o le mois ou le jour vaut 0. Si utilis avec L'option IGNORE, la date '0000-00-00' sera insre pour chaque date invalide. (Nouveau en MySQL 5.0.2) NO_UNSIGNED_SUBTRACTION Dans les oprations de soustraction, ne marque pas le rsultat UNSIGNED si un des oprandes est non sign. Notez que cela fait que UNSIGNED BIGINT n'est plus totalement utilisable dans tous les contextes. See Section 12.7, Fonctions de transtypage . (Nouveau en MySQL 4.0.2.) ONLY_FULL_GROUP_BY N'autorise pas les requtes dont la clause GROUP BY fait rfrence une colonne qui n'est pas slectionne. (Nouveau en MySQL 4.0.0.) PIPES_AS_CONCAT Traite || comme un oprateur de concatnation (identique CONCAT()) au lieu d'tre un synonyme de OR. (Nouveau en MySQL 4.0.0.) REAL_AS_FLOAT Traite le type REAL comme un synonyme FLOAT plutt que comme un synonyme de DOUBLE. (Nouveau en MySQL 4.0.0.) STRICT_ALL_TABLES Active le mode strict pour tous les moteurs de stockage. Les valeurs invalides sont rejetes. Plus de dtails suivent. (Nouveau en MySQL 5.0.2) STRICT_TRANS_TABLES Active le mode strict pour tous les moteurs de stockage transactionnels. Les valeurs invalides sont rejetes. Plus de dtails suivent. (Nouveau en MySQL 5.0.2) Lorsque le mode strict est activ, MySQL retourne une erreur si une valeur est invalide ou manquante (aucune valeur fournie pour la colonne, et la colonne n'a pas de valeur DEFAULT explicite dans sa dfinition). Pour les tables transactionnelles, cela arrive lorsque le mode STRICT_ALL_TABLES et STRICT_TRANS_TABLES est activ. La commande est alors annule. Pour les tables nontransactionnelles, MySQL gre les valeurs invalides comme ceci : si la commande insre ou modifie une seule ligne, l'erreur survient si la valeur est invalide ou manquante. La commande est annule et la table reste intacte. Si la commande insre ou modifie plusieurs lignes, l'effet dpend de l'option stricte active : Pour le mode STRICT_ALL_TABLES, si une valeur est invalide ou manquante dans la premire ligne, MySQL retourne une erreur et aucune ligne n'est modifie. Si une valeur est invalide ou
223
manquante partir de la seconde ligne, MySQL retourne une erreur et ignore le reste des lignes. Cependant, dans ce cas, les premires lignes restent modifies ou insres. Cela signifie que vous risquez d'obtenir une opration partielle, ce qui n'est pas forcment souhaitable. Pour viter cela, il est alors recommand d'utiliser des commandes uni-lignes. Pour le mode STRICT_TRANS_TABLES, si une valeur est invalide ou manquante pour la premire ligne, MySQL retourne une erreur et aucune ligne n'est modifie. Pour les lignes suivantes, si une valeur est invalide, MySQL insre la valeur valide la plus proche. Si une valeur manque, MySQL insre explicitement la valeur par dfaut pour ce type de donnes. Dans ce cas, MySQL gnre une alerte, et continue le traitement. Le mode strict interdit l'utilisation de dates invalides comme '2004-04-31'. Il n'interdit pas les dates avec des 0 comme 2004-04-00' ou encore les dates ``zro''. Pour les interdire, il faut activer les modes NO_ZERO_IN_DATE et NO_ZERO_DATE. Si vous n'utilisez pas de mode strict, c'est dire ni STRICT_TRANS_TABLES ni STRICT_ALL_TABLES, MySQL gnre une alerte pour toutes les valeurs qui sont adaptes pour tre insres. See Section 13.5.3.19, SHOW WARNINGS | ERRORS . Les modes suivants sont fournis comme raccourcis pour diffrentes combinaisons des valeurs prcdentes. Tous les raccourcis sont disponibles depuis MySQL 4.1.1, hormisTRADITIONAL (5.0.2). ANSI Equivalent REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, ONLY_FULL_GROUP_BY. See Section 1.5.3, Excuter MySQL en mode ANSI . DB2 Equivalent PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. MAXDB Equivalent PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. MSSQL Equivalent PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. MYSQL323 Equivalent NO_FIELD_OPTIONS. MYSQL40 Equivalent NO_FIELD_OPTIONS. ORACLE Equivalent PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. POSTGRESQL Equivalent PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. TRADITIONAL 224
La lettre de suffixe peut tre en majuscule ou en minuscule : 16M et 16m sont quivalents. Durant l'excution, utilisez la commande SET pour donner de nouvelles valeurs aux variables systme. Dans ce contexte, les lettres de suffixes ne pourront pas tre utilises. Leur valeur peut tre calcule avec l'expression suivante :
mysql> SET sort_buffer_size = 10 * 1024 * 1024;
Pour spcifier explicitement si vous voulez modifier une variable globale ou une variable de session, utilisez les options GLOBAL et SESSION :
mysql> SET GLOBAL sort_buffer_size = 10 * 1024 * 1024; mysql> SET SESSION sort_buffer_size = 10 * 1024 * 1024;
Si cette option est omise, la variable de session sera modifie. Les variables qui peuvent tre modifies durant l'excution sont listes dans la section Section 5.2.3.1, Variables systme dynamiques .
225
Si vous voulez restreindre le maximum possible d'une variable systme, modifie avec SET, vous pouvez spcifier ce maximum avec les options de la forme --maximum-var_name au lancement du serveur. Par exemple, pour viter que la valeur de query_cache_size dpasse 32 Mo, utilisez l'option --maximum-query_cache_size=32M. Cette fonctionnalit est disponible depuis MySQL 4.0.2. Vous pouvez dcouvrir les variables systme et leur valeur avec la commande SHOW VARIABLES. Voyez Section 9.4, Variables systme pour plus d'informations.
mysql> SHOW VARIABLES; +---------------------------------+------------------------------+ | Variable_name | Value | +---------------------------------+------------------------------| | back_log | 50 | | basedir | /usr/local/mysql | | bdb_cache_size | 8388572 | | bdb_home | /usr/local/mysql | | bdb_log_buffer_size | 32768 | | bdb_logdir | | | bdb_max_lock | 10000 | | 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/ | | default_week_format | 0 | | delay_key_write | ON | | delayed_insert_limit | 100 | | delayed_insert_timeout | 300 | | delayed_queue_size | 1000 | | flush | OFF | | flush_time | 0 | | ft_boolean_syntax | + -><()~*:""&| | | ft_max_word_len | 84 | | ft_min_word_len | 4 | | ft_query_expansion_limit | 20 | | ft_stopword_file | (built-in) | | have_bdb | YES | | have_innodb | YES | | have_isam | YES | | have_openssl | YES | | have_query_cache | YES | | have_raid | NO | | have_symlink | DISABLED | | 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_fast_shutdown | ON | | innodb_file_io_threads | 4 | | innodb_flush_log_at_trx_commit | 1 | | innodb_flush_method | | | innodb_force_recovery | 0 | | 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 | | innodb_thread_concurrency | 8 | | interactive_timeout | 28800 | | join_buffer_size | 131072 |
226
| key_buffer_size | 16773120 | | key_cache_age_threshold | 300 | | key_cache_block_size | 1024 | | key_cache_division_limit | 100 | | language | /usr/local/mysql/share/... | | large_files_support | ON | | local_infile | ON | | locked_in_memory | OFF | | log | OFF | | log_bin | OFF | | log_slave_updates | OFF | | log_slow_queries | OFF | | log_update | OFF | | log_warnings | OFF | | long_query_time | 10 | | low_priority_updates | OFF | | lower_case_table_names | 0 | | max_allowed_packet | 1047552 | | max_binlog_cache_size | 4294967295 | | max_binlog_size | 1073741824 | | max_connect_errors | 10 | | max_connections | 100 | | max_delayed_threads | 20 | | max_error_count | 64 | | max_heap_table_size | 16777216 | | max_join_size | 4294967295 | | max_relay_log_size | 0 | | max_sort_length | 1024 | | max_tmp_tables | 32 | | max_user_connections | 0 | | max_write_lock_count | 4294967295 | | myisam_max_extra_sort_file_size | 268435456 | | myisam_max_sort_file_size | 2147483647 | | myisam_recover_options | force | | myisam_repair_threads | 1 | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | net_read_timeout | 30 | | net_retry_count | 10 | | net_write_timeout | 60 | | open_files_limit | 1024 | | pid_file | /usr/local/mysql/name.pid | | port | 3306 | | protocol_version | 10 | | query_cache_limit | 1048576 | | query_cache_size | 0 | | query_cache_type | ON | | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | | rpl_recovery_rank | 0 | | server_id | 0 | | skip_external_locking | ON | | skip_networking | OFF | | skip_show_database | OFF | | slave_net_timeout | 3600 | | slow_launch_time | 2 | | socket | /tmp/mysql.sock | | sort_buffer_size | 2097116 | | sql_mode | | | table_cache | 64 | | table_type | MYISAM | | thread_cache_size | 3 | | thread_stack | 131072 | | timezone | EEST | | tmp_table_size | 33554432 | | tmpdir | /tmp/:/mnt/hd2/tmp/ | | tx_isolation | READ-COMMITTED | | version | 4.0.4-beta | | wait_timeout | 28800 | +---------------------------------+------------------------------+
227
La plupart des variables systme sont prsentes ici. Les variables sans version sont prsente depuis MySQL 3.22. Les variables systme InnoDB sont listes dans Section 15.5, Options de dmarrage InnoDB . Les valeurs pour les tailles de buffer, longueur et taille de pile sont donnes en octets, moins que cela ne soit spcifi autrement. Les informations sur le choix des valeurs de ces paramtres est disponible dans Section 7.5.2, Rglage des paramtres du serveur . ansi_mode Vaut ON si mysqld a t dmarr en mode --ansi. See Section 1.5.3, Excuter MySQL en mode ANSI . Cette variable a t ajoute en MySQL 3.23.6 et supprime en 3.23.41. Voyez la description de sql_mode. back_log Le nombre de connexions sortantes que MySQL peut supporter. Cette valeur entre en jeu lorsque le thread principal MySQL reoit de trs nombreuses requtes de connexions en trs peu de temps. MySQL prend un peu de temps (mme si c'est trs peu de temps), pour vrifier la connexion et dmarrer un nouveau thread. La valeur de back_log indique combien de requte seront mises en attente durant ce temps. Vous devrez augmenter ce nombre si vous voulez mettre en attente plus de requtes durant une courte priode de temps. En d'autres termes, cette valeur est la taille de la queue d'attente pour les connexions TCP/IP entrantes. Votre systme d'exploitation a ses propres limites pour ce type de queue. La page du manuel Unix listen(2) doit contenir plus de dtails. Vrifiez la documentation de votre OS pour connatre la valeur maximale de votre systme. Si vous donne une valeur back_log qui est plus grande que celle que votre systme supporte, cela restera sans effet. basedir Le dossier d'installation de MySQL. 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 dmarrer mysqld avec l'option --skip-bdb pour ne pas gaspiller de mmoire. Cette variable a t ajoute en MySQL 3.23.14. bdb_home Le dossier de base des tables BDB. Cette valeur doit tre la mme que celle de la variable datadir. Cette variable a t ajoute en MySQL 3.23.14. 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 dmarrer mysqld avec l'option --skip-bdb pour ne pas gaspiller de mmoire. Cette variable a t ajoute en MySQL 3.23.31. bdb_logdir Le dossier o le moteur BDB crit les fichiers de log. C'est la valeur de l'option --bdb-logdir. Cette variable a t ajoute en MySQL 3.23.14. bdb_max_lock Le nombre maximum de verrous (par dfaut 10 000) que vous pouvez activer simultanment dans une table BDB. Vous devriez augmenter cette valeur si vous obtenez des erreurs du type bdb: 228
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 requte.
bdb: Lock table is out of available locks Got error 12 from ...
Cette variable a t ajoute en MySQL 3.23.29. bdb_shared_data Vaut ON si vous utilisez l'option --bdb-shared-data. Cette variable a t ajoute en MySQL 3.23.29. bdb_tmpdir La valeur de l'option --bdb-tmpdir. Cette variable a t ajoute en MySQL 3.23.14. bdb_version La version du moteur BDB. Cette variable a t ajoute en MySQL 3.23.31. binlog_cache_size La taille du cache qui contient les requtes SQL destines au log binaire, durant une transaction. Un cache binaire est allou chaque client si le serveur supporte les moteurs transactionnel, et depuis MySQL 4.1.2, si le serveur a un log binaire activ (option --log-bin). Si vous utilisez souvent de grandes transactions multi-requtes, vous devez augmenter cette valeur pour amliorer les performances. Les variables Binlog_cache_use et Binlog_cache_disk_use sont aussi utiles pour optimiser la taille de cette variable. Cette variable a t ajoute en MySQL 3.23.29. See Section 5.9.4, Le log binaire . bulk_insert_buffer_size MyISAM utilise une cache hirarchis 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 dsactiver cette optimisation. Note : ce cache est uniquement utilis lorsque vous ajoutez des donnes dans une table non-vide. Par dfaut, cette option vaut 8 Mo. Cette variable a t ajoute en MySQL 4.0.3. Cette variable s'appelait myisam_bulk_insert_tree_size. character_set Le jeu de caractres par dfaut. Cette variable a t ajoute en MySQL 3.23.3, puis retire en MySQL 4.1.1 et remplaces par diffrentes variables character_set_xxx. character_set_client Le jeu de caractres pour les commandes du client. Cette variable a t ajoute en MySQL 4.1.1. character_set_connection Le jeu de caractres utilis pour les littraux qui n'ont pas d'indication de jeu de caractres, pour certaines fonctions et pour les conversions de nombres vers une chane. Cette variable a t ajoute en MySQL 4.1.1. character_set_database Le jeu de caractres par dfaut pour les bases de donnes. Le serveur modifie cette variable chaque fois que la base de donnes par dfaut change. S'il n'y a pas de base de donnes par dfaut, cette variable prend la valeur de character_set_server. Cette variable a t ajoute en MySQL 4.1.1.
229
character_set_results Le jeu de caractres utilis pour retourner des rsultats au client. Cette variable a t ajoute en MySQL 4.1.1. character_set_server Le jeu de caractres par dfaut pour le serveur. Cette variable a t ajoute en MySQL 4.1.1. character_set_system Le jeu de caractres utilis par le serveur pour stocker des identifiants. Cette valeur est toujours utf8. Cette variable a t ajoute en MySQL 4.1.1. character_sets Les jeux de caractres supports. Cette variable a t ajoute en MySQL 3.23.15. collation_connection Cette variable a t ajoute en MySQL 4.1.1. collation_database La collation utilise par la base de donnes par dfaut. Le serveur modifie cette variable chaque fois que la base de donnes par dfaut change. S'il n'y a pas de base de donnes par dfaut, cette variable prend la valeur de collation_server. Cette variable a t ajoute en MySQL 4.1.1. collation_server La collation par dfaut du serveur. Cette variable a t ajoute en MySQL 4.1.1. concurrent_insert Si cette option vaut ON, MySQL va vous permettre de raliser des commandes INSERT sur les tables MyISAM en mme temps que d'autres commandes SELECT seront excutes. Vous pouvez dsactiver cette option en dmarrant mysqld avec l'option --safe or --skip-new. Cette variable a t ajoute en MySQL 3.23.7. connect_timeout Le nombre de secondes d'attente d'un paquet de connexion avant de conclure avec une erreur Bad handshake. datadir Le dossier de donnes de MySQL. C'est la valeur de l'option --datadir. default_week_format Le mode par dfaut pour la fonction WEEK(). Cette variable a t ajoute en MySQL 4.0.14. delay_key_write Les options pour les tables MyISAM. Elles peuvent prendre l'une des valeurs suivantes : Option OFF ON ALL Description DELAYED_KEY_WRITE est ignor. (Par dfaut) MySQL va honorer l'option DELAY_KEY_WRITE de CREATE TABLE. Toutes les nouvelles tables ouvertes sont traites comme si elles taient cres avec l'option DELAY_KEY_WRITE.
230
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 ds la fin de la modification de la table, mais attendrons que la table soit crite. Cela acclre notablement les critures des modifications, mais il faut penser ajouter une vrification automatique des tables au dmarrage avec --myisam-recover=BACKUP,FORCE. Voir aussi Section 5.2.1, Options de ligne de commande de mysqld et Section 14.1.1, Options de dmarrage MyISAM . Notez que --external-locking n'offre aucune protection contre les corruptions d'index pour les tables qui utilisent les critures retardes de cls. Cette variable a t ajoute en MySQL 3.23.8. delayed_insert_limit Aprs avoir insr delayed_insert_limit lignes, le gestionnaire de INSERT DELAYED va vrifiez si il n'y a pas de commande SELECT en attente. Si c'est le cas, il va autoriser ces commandes avant de continuer. 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 alloue pour grer 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 dmarr MySQL avec l'option --flush. Cette variable a t ajoute en MySQL 3.22.9. flush_time Si cette option a une valeur non nulle, toutes les flush_time secondes, toutes les tables seront fermes (pour librez des ressources et synchroniser les index sur le disque). Nous ne recommandons cette option que sur les systmes Windows 9x/Me, ou les systmes qui ont trs peu de ressources. Cette variable a t ajoute en MySQL 3.22.18. ft_boolean_syntax Liste des oprateurs supports par IN BOOLEAN MODE. Cette variable a t ajoute en MySQL 4.0.1. See Section 12.6.1, Boolens de recherches en texte intgral . La valeur par dfaut de cette variable est '+ -><()~*:""&|'. Les rgles pour modifier cette valeur sont les suivantes : La fonction de l'oprateur est dtermine par sa position dans la chane. La chane de remplacement doit faire 14 caractres. Chaque caractre doit tre ASCII, non-alphanumrique. Le premier ou le deuxime caractre doit tre un espace. Aucun doublon n'est autoris, hormis les oprateurs guillemets aux positions 11 et 12. Ceux deux caractres ne sont pas obligatoirement les mmes, mais ils sont les deux qui peuvent l'tre.
231
Les positions 10, 13 et 14 (qui sont par dfaut :, & et |) sont rserves pour une utilisation ultrieure. ft_max_word_len La taille maximale d'un mot inclure dans un index FULLTEXT. Cette variable a t ajoute en MySQL 4.0.0. Note : les index FULLTEXT doivent tre reconstruits aprs chaque modification de cette variable. Utilisez REPAIR TABLE tbl_name QUICK. ft_min_word_len La taille minimale d'un mot inclure dans un index FULLTEXT. Cette variable a t ajoute en MySQL 4.0.0. Note : les index FULLTEXT doivent tre reconstruits aprs chaque modification de cette variable. Utilisez REPAIR TABLE tbl_name QUICK. ft_query_expansion_limit Le nombre de solutions gnrales utiliser pour les extensions de recherche avec WITH QUERY EXPANSION. Cette variable a t ajoute en MySQL 4.1.1. ft_stopword_file Une fichier dans lequel lire une liste de mots interdits pour les recherches en texte plein. Tous les mots du fichier seront utiliss : les commentaires ne sont pas respects. Par dfaut, des listes de mots interdits internes sont utiliss, tels que dfinis dans myisam/ft_static.c). En donnant cette option la valeur d'une chane vide "", vous dsactivez le filtre de mots interdits. Note : les index FULLTEXT doivent tre reconstruits aprs chaque modification de cette variable. Utilisez la commande REPAIR TABLE tbl_name QUICK. Cette variable a t ajoute en MySQL 4.1.0. group_concat_max_len La taille maximale de la chane rsultat de GROUP_CONCAT(). Cette variable a t ajoute en MySQL 4.1.0. have_bdb YES si mysqld supporte les tables BDB. DISABLED si --skip-bdb a t utilis. Cette variable a t ajoute en MySQL 3.23.30. have_innodb YES si mysqld supporte les tables InnoDB. DISABLED si --skip-innodb a t utilis. Cette variable a t ajoute en MySQL 3.23.37. have_isam YES si mysqld supporte les tables ISAM. DISABLED si --skip-isam a t utilis. Cette variable a t ajoute en MySQL 3.23.30. have_raid YES si mysqld supporte les tables RAID. Cette variable a t ajoute en MySQL 3.23.30. have_openssl 232
YES si mysqld supporte le chiffrement SSL avec le protocole de communication client / serveur. Cette variable a t ajoute en MySQL 3.23.43.
init_connect Une chane a excuter sur le serveur lors de chaque connexion. La chane est constitue d'une ou plusieurs commandes SQL. Pour spcifier une commande multiple, sparez les requtes individuelles par des points-virgules. Cette variable a t ajoute en MySQL version 4.1.2. Par exemple, chaque client commence par dfaut avec le mode d'auto-validation activ. Il n'y a pas de variable globale spcifier pour dsactiver l'auto-validation, et init_connect peut servir a :
SET GLOBAL init_connect='SET AUTOCOMMIT=0';
Cette variable peut aussi tre configure en ligne de commande ou dans un fichier d'options. Pour assigner la variable comme montr dans le fichier d'options, ajoutez ces lignes l :
[mysqld] init_connect='SET AUTOCOMMIT=0'
Cette variable a t ajoute en MySQL 4.1.2. init_file Le nom du fichier spcifi avec l'option --init-file lorsque vous dmarrez le serveur. C'est un fichier qui contient les requtes SQL que vous voulez voir excutes ds le dmarrage. Chaque commande doit tre sur une seule ligne, et ne doit pas inclure de commentaires. Cette variable a t ajoute en MySQL 3.23.2. init_slave Cette variable est similaire init_connect, mais la chane doit tre excute par l'esclave, chaque dmarrage du thread SQL. Le format de la chane est le mme que pour la variable init_connect. Cette variable a t ajoute en MySQL 4.1.2. innodb_xxx Les variables systme de InnoDB sont listes dans Section 15.5, Options de dmarrage InnoDB . interactive_timeout Le nombre de secondes durant lequel le serveur attend une activit de la part de la connexion avant de la ferme. 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 utilise pour les jointures compltes (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 des tables MyISAM et ISAM sont mis en buffer et partags par tous les threads. key_buffer_size est la taille du buffer utilis. Le buffer de cl est aussi appel le cache de cl.
233
Augmentez cette valeur pour obtenir une meilleure gestion des index (pour les lectures et critures multiples), autant que vous le pouvez : 64 Mo sur une machine de 256 Mo est une valeur rpandue. Toutefois, si vous utilisez une valeur trop grande (par exemple, plus de 50% de votre mmoire totale), votre systme risque de commencer utiliser sa mmoire swap, et devenir trs lent. N'oubliez pas que MySQL ne met pas en cache les donnes lues, et il faut laisser le systme d'exploitation respirer. Pour obtenir encore plus de vitesse lors de l'criture de plusieurs lignes en mme temps, utilisez LOCK TABLES. See Section 13.4.5, Syntaxe de LOCK TABLES/UNLOCK TABLES . Vous pouvez vrifier les performances du buffer de cls avec la commande SHOW STATUS et en examinant les variables Key_read_requests, Key_reads, Key_write_requests et Key_writes. See Section 13.5.3, Syntaxe de SHOW . Le ratio Key_reads/Key_read_requests doit normalement tre infrieur 0.01. Le ratio Key_writes/Key_write_requests est gnralement prs de 1 si vous utilisez essentiellement des modifications et des effacements mais il peut tre plus petit si vous avez des modifications qui changent plusieurs lignes en mme temps, ou si vous utilisez l'option DELAY_KEY_WRITE. La fraction du buffer de cl utilise est dtermine avec la variable key_buffer_size en conjonction avec la variable Key_blocks_used et la taille de bloc de buffer. Depuis MySQL 4.1.1, la taille de bloc de buffer est disponible dans la variable serveur key_cache_block_size. La fraction utilise du buffer est :
(Key_blocks_used * key_cache_block_size) / key_buffer_size
Avant MySQL 4.1.1, les blocs du cache de cl taient de 1024 octets, ce qui fait que la fraction utilise tait :
(Key_blocks_used * 1024) / key_buffer_size
See Section 7.4.6, Le cache de cl des tables MyISAM . key_cache_age_threshold Cette valeur contrle le transit des buffers d'une sous-chane de cache de cl vers une autre, moins prioritaire. Les valeurs les plus basses accroissent la vitesse de transit. La valeur minimale est de 100. La valeur par dfaut est 300. Cette variable a t ajoute en MySQL 4.1.1. See Section 7.4.6, Le cache de cl des tables MyISAM . key_cache_block_size La taille du bloc de cache de cl, en octets. La valeur par dfaut est 1024. Cette variable a t ajoute en MySQL 4.1.1. See Section 7.4.6, Le cache de cl des tables MyISAM . key_cache_division_limit Le point de division entre la sous-chane prioritaire et la seconde sous-chane. Cette valeur est le pourcentage du buffer utiliser pour la sous-chane secondaire. Les valeurs possibles vont de 1 100. La valeur par dfaut est 100. Cette variable a t ajoute en MySQL 4.1.1. See Section 7.4.6, Le cache de cl des tables MyISAM . language La langue utilise pour les message d'erreurs. large_file_support Si mysqld a t compil avec le support des grands fichiers. Cette variable a t ajoute en MySQL 3.23.28. 234
local_infile Si mysqld a t configur avec le support de LOCAL pour les commandes LOAD DATA INFILE. Cette variable a t ajoute en MySQL 4.0.3. locked_in_memory Si mysqld a t verrouill en mmoire avec --memlock Cette variable a t ajoute en MySQL 3.23.25. log Si le log de toutes les requtes est activ. See Section 5.9.2, Le log gnral de requtes . log_bin Si le log binaire est activ. Cette variable a t ajoute en MySQL 3.23.14. See Section 5.9.4, Le log binaire . log_slave_updates Si les modifications des esclaves doivent tre enregistres. Le log binaire doit tre activ pour que cette option fonctionne. Cette variable a t ajoute en MySQL 3.23.17. See Section 6.8, Options de dmarrage de la rplication . log_slow_queries Indique si les requtes lentes doivent tre enregistres. ``Lente'' est dtermin par la valeur de long_query_time. Cette variable a t ajoute en MySQL 4.0.2. See Section 5.9.5, Le log des requtes lentes . log_update Si le log de modification est activ. Cette variable a t ajoute en MySQL 3.22.18. Notez que le log binaire est prfrable au log de modifications, qui n'est plus disponible en MySQL 5.0. See Section 5.9.3, Le log de modification . long_query_time Si une requte prend plus de long_query_time secondes, le compteur de requtes lentes Slow_queries sera incrment. Si vous utilisez l'option --log-slow-queries, ces requtes seront enregistres dans un historique de requtes lentes. Cette dure est mesure en temps rel, et non pas en temps processus, ce qui fait que les requtes qui seraient juste sous la limite avec un systme lgrement charg, pourrait tre au dessus avec le mme systme, mais charg. See Section 5.9.5, Le log des requtes lentes . low_priority_updates Si cette option vaut 1, toutes les requtes INSERT, UPDATE, DELETE et LOCK TABLE WRITE attendent qu'il n'y ait plus de SELECT ou de LOCK TABLE READ en attente pour cette table. Cette variable s'appelait avant sql_low_priority_updates. Cette variable a t ajoute en MySQL 3.22.5. lower_case_table_names Si cette option vaut 1, les noms de tables sont stockes en minuscules sur le disque, et les comparaisons de nom de tables seront insensibles la casse. Depuis la version 4.0.2, cette option s'applique aussi aux noms de bases. Depuis la version 4.1.1 cette option s'applique aussi aux alias de table. See Section 9.2.2, Sensibilit la casse pour les noms . Vous ne devez pas mettre cette variable 0 si vous utilisez MySQL sur un serveur qui n'a pas de sensibilit la casse au niveau du systme de fichiers (comme Windows ou Mac OS X). Nouveau
235
en 4.0.18 : si cette variable vaut 0 est que le systme de fichier n'est pas sensible la casse, MySQL va automatiquement donner la valeur de 2 lower_case_table_names. 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 ncessaire. Cette valeur est par dfaut petit, pour intercepter les gros paquets, probablement errons. 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 16 Mo en MySQL 3.23 et 1 Go en MySQL 4.0. max_binlog_cache_size Si une transaction multi-requte requiert plus que cette quantit de mmoire, vous obtiendrez une erreur "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage". Cette variable a t ajoute en MySQL 3.23.29. max_binlog_size Disponible depuis la version 3.23.33. Si vous crivez dans le log binaire (de rplication) et que cela dpasse la taille de max_binlog_size, une erreur sera indique. Vous ne pouvez pas donner max_binlog_size une valeur infrieure 1024 octets, ou plus grande que 1 Go. Cette variable a t ajoute en MySQL 3.23.33. Notez bien si vous utilisez les transactions : une transaction est crite en une seule fois dans le log binaire, et elle ne peut pas tre rpartie en plusieurs fichiers. Par consquent, si vous avez de grandes transactions, vous verrez peut tre des fichiers de log plus grand que max_binlog_size. Si max_relay_log_size vaut 0, la valeur de max_binlog_size s'applique aussi aux logs de relais. max_relay_log_size a t ajoute en MySQL 4.0.14. max_connect_errors S'il y a plus que max_connect_errors connexion interrompues depuis un mme hte, cet hte sera bloqu dans ses prochaines tentatives de connexions. Vous pouvez dbloquer un hte avec la commande FLUSH HOSTS. max_connections Le nombre maximal de clients simultans accept. En augmentant cette valeur, vous augmentez le nombre de pointeur de fichier que requiert mysqld. Voyez la section Section 7.4.8, Quand MySQL ouvre et ferme les tables pour des commentaires sur les pointeurs de fichiers. Voyez aussi la section Section A.2.6, Erreur Too many connections . max_delayed_threads Ne pas lancer plus que max_delayed_threads threads pour grer les insertions INSERT DELAYED. Si vous essayez d'insrer des donnes dans une nouvelle table alors que tous les gestionnaires INSERT DELAYED sont utiliss, la ligne sera insre comme si l'option DELAYED n'avait pas t spcifie. Cette variable a t ajoute en MySQL 3.23.0. max_error_count Le nombre maximum d'erreur, alertes et messages de note stocker pour afficher avec SHOW ERRORS ou SHOW WARNINGS. Cette variable a t ajoute en MySQL 4.1.0. max_heap_table_size
236
Ne pas autoriser la cration de tables de type MEMORY (HEAP) plus grande que max_heap_table_size. La valeur de la variable est utilise pour calculer la valeur maximale de MAX_ROWS pour la table MEMORY. Modifier cette variable n'a pas d'effet sur les tables existantes, moins que la table ne soit recre, avec une commande comme CREATE TABLE ou TRUNCATE TABLE, ou encore modifie avec ALTER TABLE. Cette variable a t ajoute en MySQL 3.23.0. max_insert_delayed_threads Cette variable est un synonyme de max_delayed_threads. Cette variable a t ajoute en MySQL 4.0.19. 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. En donnant une valeur cette variable qui est autre que DEFAULT remet la valeur de SQL_BIG_SELECTS 0. Si vous modifiez nouveau la valeur de SQL_BIG_SELECTS, la variable max_join_size sera ignore. Si un rsultat de requte est dj dans le cache de requte, aucune limite de taille n'est vrifie, car le rsultat a dj t compil, et cela ne posera aucun problme au serveur pour l'envoyer nouveau. Cette variable s'appelait prcdemment sql_max_join_size. max_relay_log_size Disponible depuis la version 4.0.14. Si vous crivez des donnes dans un log de relais et que leur taille dpasse la valeur donne, le log de relais passe au fichier suivant. Cette variable vous permet de placer diffrentes contraintes de taille sur les logs binaire et de relais. Cependant, en donnant la valeur de 0 cette valeur, MySQL utilisera max_binlog_size pour les deux logs, binaire et de relais. Vous devez donner max_relay_log_size la valeur de 0 ou plus de 4096, et moins que 1 Go. Par dfaut, c'est 0. Cette variable a t ajoute en MySQL 4.0.14. See Section 6.3, Dtails d'implmentation de la rplication . max_seeks_for_key La limite de recherche lors de recherche de lignes bases sur un index. L'optimiseur MySQL va supposer que lorsque vous recherchez des lignes dans une table en analysant les index, vous n'aller pas gnrer plus de ce nombre de recherches, indpendamment de la cardinalit de la cl. En donnant une valeur faible cette variable (100 ?) vous pouvez forcer MySQL a prfrer les scans d'index plutt que les scans de tables. Cette variable a t ajoute en MySQL 4.0.14. 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 utiliss pour le tri. Le reste est ignor. max_tmp_tables Cette option ne fait encore rien. Le nombre maximal de tables temporaires qu'un client peut garder ouverte en mme temps. max_user_connections Le nombre maximum de connexions actives pour un utilisateur particulier (0 = pas de limite). Cette variable a t ajoute en MySQL 3.23.34. max_write_lock_count
237
Aprs max_write_lock_count pose de verrou en criture, autorise quelques verrous en lecture. Cette variable a t ajoute en MySQL 3.23.7. myisam_data_pointer_size La taille par dfaut du pointeur utiliser avec CREATE TABLE pour les tables MyISAM lorsque qu'aucune option MAX_ROWS n'est spcifie. Cette variable ne peut pas tre infrieure 2 ni suprieure 8. La valeur par dfaut est de 4. Cette variable a t ajoute en MySQL 4.1.2. See Section A.2.11, Erreur The table is full . myisam_max_extra_sort_file_size Si un fichier temporaire est utilis pour crer rapidement un fichier d'index pour une table MyISAM est plus grand que la valeur de cette variable, alors prfre la mthode du cache de cl. C'est surtout utilis pour forcer les grands index utiliser la mthode plus lente du cache de cl pour crer l'index. Cette variable a t ajoute en MySQL 3.23.37. Note : la valeur donne est en megaoctets avant 4.0.3 et en octets aprs. myisam_max_sort_file_size La taille maximale du fichier temporaire que MySQL est autoris utiliser durant la recration des fichiers d'index (avec REPAIR, ALTER TABLE ou LOAD DATA INFILE). Si la taille du fichier dpasse myisam_max_sort_file_size, l'index sera cr avec un cache de cl (plus lent). Cette variable a t ajoute en MySQL 3.23.37. Note : ce paramtre est spcifi en megaoctets avant la version 4.0.3 et en octets depuis. myisam_recover_options La valeur de l'option --myisam-recover. Cette variable a t ajoute en MySQL 3.23.36. myisam_repair_threads Si cette valeur est plus grande que 1, les index des tables MyISAM durant un processus de Repair by sorting seront crs en parallle : chaque index avec son propre thread. Note : les rparations multi-threades sont encore en dveloppement, et en qualit alpha. Cette variable a t ajoute en MySQL 4.0.13. myisam_sort_buffer_size Le buffer qui est allous lors du tri d'index avec la commande REPAIR ou lors de la cration d'index avec CREATE INDEX ou ALTER TABLE. Cette variable a t ajoute en MySQL 3.23.16. named_pipe Sous Windows, indique si le serveur supporte les connexions via les pipes nomms. Cette variable a t ajoute en MySQL 3.23.50. net_buffer_length Le buffer de communication est remis zro entre deux requtes. Cela ne devrait pas tre modifi, mais si vous avez trs peu de mmoire, vous pouvez le remettre la taille prsume de la requte (c'est dire, la taille de requte envoy par le client. Si la requte dpasse cette taille, le buffer est automatiquement agrandi jusqu' max_allowed_packet octets). net_read_timeout Nombre de secondes d'attente des dernires donnes, avant d'annuler la lecture. Notez que lorsque nous n'attendons pas de donnes d'une connexion, le dlai d'expiration est donn par write_timeout. Voir aussi slave_net_timeout. Cette variable a t ajoute en MySQL 3.23.20. net_retry_count
238
Si une lecture sur une port de communication est interrompu, net_retry_count tentatives sont faites avant d'abandonner. Cette valeur doit tre particulirement grande pour FreeBSD car les interruptions internes sont envoys tous les threads. Cette variable a t ajoute en MySQL 3.23.7. net_write_timeout Nombre de secondes d'attente pour qu'un bloc soit envoy une connexion, avant d'annuler l'criture. Voir aussi net_read_timeout. Cette variable a t ajoute en MySQL 3.23.20. open_files_limit Si open_files_limit ne vaut pas 0, alors mysqld va utiliser cette valeur pour rserver des pointeurs de fichiers utiliser avec setrlimit(). Si cette valeur est 0, alors mysqld va rserver 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 Le chemin vers le fichier de processus (PID). La valeur de l'option --pid-file. Cette variable a t ajoute en MySQL 3.23.23. port Le port de connexion sur lequel le serveur attend les connexions TCP/IP. Cette variable peut tre spcifie avec --port. protocol_version La version du protocole utilis par le serveur MySQL. Cette variable a t ajoute en MySQL 3.23.18. query_alloc_block_size Taille des blocs de mmoire allous pour les objets durant l'analyse et la prparation des requtes. Si vous avez un problme avec la fragmentation de la mmoire, cela peut tre utile d'augmenter cette valeur. Cette variable a t ajoute en MySQL 4.0.16. query_cache_limit Ne met pas en cache les rsultats qui sont plus grands que query_cache_limit. Par dfaut, 1 Mo. Cette variable a t ajoute en MySQL 4.0.1. query_cache_min_res_unit La taille minimale pour les blocs allous par le cache de requte. La valeur par dfaut est de 4 ko. Des informations sur l'optimisation de cette variable sont donnes dans la section Section 5.11.3, Configuration du cache de requtes . Cette variable a t ajoute en MySQL 4.1. query_cache_size La mmoire alloue pour stocker les rsultats des vieilles requtes. Si query_cache_size vaut 0, le cache de requte est dsactiv (par dfaut). Cette variable a t ajoute en MySQL 4.0.1. query_cache_type Choisit le type de cache de requte. Modifier la variable GLOBAL modifie le cache pour tous les clients. Les clients peuvent modifier la variable de SESSION pour l'adapter leur utilisation. query_cache_type peut prendre les valeurs numriques suivantes :
239
Description Ne met pas en cache les rsultats. Notez que cela ne va pas librer le buffer de requte. Pour cela, il faut donner query_cache_size la valeur de 0. Met en cache tous les rsultats excepts les requtes SELECT SQL_NO_CACHE .... Met en cache uniquement les requtes SELECT SQL_CACHE ....
Cette variable a t ajoute en MySQL 4.0.3. query_cache_wlock_invalidate Normalement, lorsqu'un client pose un verrou WRITE sur une table MyISAM, les autres clients ne sont pas empchs d'mettre des requtes sur la table, si le rsultat est dj en cache. En donnant la valeur de 1 cette variable, le verrou WRITE empchera toutes les requtes qui feront rfrence cette table. Cela force les autres clients attendre que le verrou se libre. Cette variable a t ajoute en MySQL 4.0.19. query_prealloc_size La taille du buffer persistant utilis pour l'analyse des requtes et leur excution. Ce buffer n'est pas libr entre deux requtes. Si vous manipulez des requtes complexes, une valeur plus grande pour query_prealloc_size sera plus utile pour amliorer les performances, car elle peut rduire les allocations complmentaires de mmoire durant l'excution des requtes.
Cette variable a t ajoute en MySQL 4.0.16. range_alloc_block_size La taille de bloc qui est allou lors de l'optimisation d'intervalle. Cette variable a t ajoute en MySQL 4.0.16. read_buffer_size Chaque thread qui fait une recherche squentielle alloue un buffer de cette taille pour son scan. Si vous faites de nombreux scan squentiels, vous pourriez avoir besoin d'augmenter cette valeur. Cette variable a t ajoute en MySQL 4.0.3. Auparavant, cette variable s'appelait record_buffer. read_only Lorsque cette variable vaut ON pour un serveur de rplication esclave, cela fait que le serveur ne permet aucune modification, hormis celles de la rplication, ou des utilisateurs ayant le droit de SUPER. Cela peut tre pratique pour s'assurer qu'un esclave n'accepte aucune modification des clients. Cette variable a t ajoute en MySQL 4.0.14. read_rnd_buffer_size Lors de la lecture des lignes tries, les lignes sont lues dans un buffer, pour viter les accs disques. En donnant cette variable une grande valeur, vous amliorerez les performances des clauses ORDER BY. Cependant, ce buffer est allou pour chaque client : il est recommand de ne pas donner une valeur globale trop importante. Au lieu de cela, modifiez cette valeur si votre client a besoin de faire de gros tris. Cette variable a t ajoute en MySQL 4.0.3. Auparavant, cette variable s'appelait record_rnd_buffer. safe_show_database
240
Ne montre pas les bases pour lesquelles un utilisateur n'a pas des droits de bases ou de tables. Cela peut amliorer considrablement la scurit si vous craignez de voir les utilisateurs dcouvrir ce que les autres ont mis en place. Voir aussi skip_show_database. Cette variable a t supprime en MySQL 4.0.5. A la place, utilisez le droit SHOW DATABASES pour contrler les accs aux noms des bases de donnes. secure_auth Si le serveur MySQL a t lanc avec l'option --secure-auth, il va empcher les connexions des comptes qui ont un compte au format pre-version 4.1. Dans ce cas, la valeur de cette variable vaut ON, sinon, c'est OFF. Vous devriez activer cette option si vous voulez empcher l'utilisation des mots de passe l'ancien format (et donc, amliorer la scurit de votre serveur). Cette variable a t ajoute en MySQL 4.1.1. Le dmarrage du serveur chouera avec une erreur si cette option est active, mais que la table de droits est toujours au format pre-version 4.1. Lorsqu'elle est utilise comme une option du client, le client va refuser de se connecter au serveur si le serveur requiert un mot de passe l'ancien format. server_id La valeur de l'option --server-id. Elle sert la rplication. Cette variable a t ajoute en MySQL 3.23.26. skip_external_locking skip_locking vaut OFF si mysqld utilise le verrouillage externe. Cette variable a t ajoute en MySQL 4.0.3. Auparavant, cette variable s'appelait skip_locking. skip_networking skip_networking vaut ON si seules les connexions locales (via socket) sont autorises. Sous Unix, les connexions locales utilisent un fichier de socket Unix. Sous Windows, les connexions locales utilisent les pipes nomms. Sous NetWare, seules les connexions TCP/IP sont supportes, alors ne donnez pas la valeur de ON cette variable. Cette variable a t ajoute en MySQL 3.22.23. skip_show_database skip_show_database empche les utilisateurs d'excuter des commandes SHOW DATABASES si ils n'ont pas les droits de PROCESS. Cela peut amliorer la scurit si vous craignez de voir les utilisateurs dcouvrir ce que les autres ont mis en place. Voir aussi safe_show_database. Cette variable a t ajoute en MySQL 3.23.4. Depuis MySQL 4.0.2, son effet dpend aussi du droit SHOW DATABASES : si la variable vaut ON, la commande SHOW DATABASES n'est autorise qu'aux comptes ayant le droit de SHOW DATABASES, et la commande affiche tous les noms de bases. Si la valeur est OFF, SHOW DATABASES est autoris tous les utilisateurs, mais il n'affichera que les noms de bases de donnes pour lesquelles l'utilisateur a le droit de SHOW DATABASES ou un droit quelconque dans la base. slave_net_timeout Nombre de secondes d'attente de donnes en lecture ou criture sur une connexion matre / esclave avant d'annuler. Cette variable a t ajoute en MySQL 3.23.40. slow_launch_time Si la cration du thread prend plus de slow_launch_time secondes, le compteur de threads lents Slow_launch_threads sera incrment. Cette variable a t ajoute en MySQL 3.23.15.
241
socket La socket Unix utilis par le serveur. Sous Unix, c'est le fichier de socket Unix, pour les connexions locales. Sous Windows, c'est le nom du pipe nomm, pour les connexions locales. sort_buffer_size Chaque thread qui doit faire un tri alloue un buffer de cette taille. Augmentez cette taille pour acclrer les clauses ORDER BY ou GROUP BY. See Section A.4.4, O MySQL stocke les fichiers temporaires ? . sql_mode Le mode SQL courant. Cette variable a t ajoute en MySQL 3.23.41. See Section 5.2.2, Le mode SQL du serveur . storage_engine Cette variable est un synonyme de table_type. Cette variable a t ajoute en MySQL 4.1.2. table_cache Le nombre de tables ouvertes pour tous les threads runis. En augmentant cette valeur, vous augmentez le nombre de pointeurs de fichiers que mysqld utilise. Vous pouvez vrifier si vous avez besoin de plus de cache de tables en tudiant la valeur de la variable Opened_tables. See Section 5.2.4, Variables de statut du serveur . Si cette variable est grande, c'est que vous ne faites pas souvent de commandes FLUSH TABLES (qui force les tables se recharger), vous devrez alors augmenter cette valeur. Pour plus d'informations sur le cache de table, voyez Section 7.4.8, Quand MySQL ouvre et ferme les tables . table_type Le type de table par dfaut. Pour configurer le type de table par dfaut au dmarrage, utilisez --default-table-type. Cette variable a t ajoute en MySQL 3.23.0. See Section 5.2.1, Options de ligne de commande de mysqld . thread_cache_size Combien de threads nous allons conserver en cache pour rutilisation. Lorsqu'un client se dconnecte, les threads du client sont mis en cache s'il n'y en a pas dj thread_cache_size de conserv. Tous les nouveaux threads sont d'abord prlev dans le cache, et uniquement lorsque le cache est vide, un nouveau thread est cr. Cette variable peut vous permettre d'amliorer les performances si vous avez de nombreuses connexions. Normalement, thread_cache_size ne donne pas d'amlioration notable si vous avez une bonne implmentation des threads. En examinant la diffrence entre les variables de statut Connections et Threads_created vous pouvez voir comment votre systme de cache de threads est efficace. (see Section 5.2.4, Variables de statut du serveur pour plus de dtails) Cette variable a t ajoute en MySQL 3.23.16. thread_concurrency Sous Solaris, mysqld va appeler thr_setconcurrency() avec cette valeur. thr_setconcurrency() permet l'application de donner au systme de threads une indication sur le nombre de threads qui seront excuts en mme temps. Cette variable a t ajoute en MySQL 3.23.7. thread_stack La taille de la pile pour chaque thread. De nombreuses limites dtectes par crash-me sont dpendantes de cette valeur. La valeur par dfaut est suffisamment grande pour des oprations normales. See Section 7.1.4, La suite de tests MySQL .
242
timezone Le fuseau horaire du serveur. Cette option prend la valeur de la variable d'environnement TZ lorsque mysqld est dmarr. Elle peut aussi tre modifie avec l'argument --timezone de mysqld_safe. Cette variable a t ajoute en MySQL 3.23.15. See Section A.4.6, Problmes de fuseaux horaires . tmp_table_size Si une table temporaire en mmoire excde 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 mmoire. tmpdir Le dossier utilis pour les fichiers temporaires et les tables temporaires. Depuis MySQL 4.1, cette variable peut prendre une liste de diffrents chemins, qui sont utiliss circulairement. Les chemins doivent tre spars par des deux points (:) sous Unix et des points-virgules (;) sous Windows, NetWare et OS/2. Cette fonctionnalit permet de rpartir la charge en plusieurs disques. Si le serveur MySQL sert d'esclave de rplication, vous ne devez pas faire pointer tmpdir sur un dossier en mmoire, car il sera vid si le serveur redmarre. Un esclave de rplication doit pouvoir reprendre ses fichiers temporaires pour que la rplication puisse redmarrer, en incluant les tables temporaires et les oprations de LOAD DATA INFILE. Si les fichiers du dossier temporaire sont perdus au redmarrage, la rplication s'arrtera. Cette variable a t ajoute en MySQL 3.22.4. transaction_alloc_block_size La taille de bloc d'allocation de mmoire pour le stockage des requtes qui font partie d'une transaction, qui sera stocke dans le log binaire durant une validation. Cette variable a t ajoute en MySQL 4.0.16. transaction_prealloc_size Le buffer persistant pour transaction_alloc_blocks, qui n'est pas libr entre deux requtes. En rendant cet buffer ``assez grand'' pour accommoder toutes les requtes dans une transaction classique, vous pouvez viter de nombreux appels malloc(). Cette variable a t ajoute en MySQL 4.0.16. tx_isolation Le niveau par dfaut d'isolation de transactions. Cette variable a t ajoute en MySQL 4.0.3. version Le numro de version du serveur. wait_timeout Le nombre de secondes d'attente du serveur sur une connexion non interactive avant de la refermer. Lors du dmarrage du thread, SESSION.WAIT_TIMEOUT est initialis avec GLOBAL.WAIT_TIMEOUT ou GLOBAL.INTERACTIVE_TIMEOUT, suivant le type de client (tel que dfini par l'option de connexion CLIENT_INTERACTIVE). Voir aussi interactive_timeout.
243
244
max_binlog_cache_size max_binlog_size max_connect_errors max_connections max_delayed_threads max_error_count max_heap_table_size max_insert_delayed_threads max_join_size max_relay_log_size max_seeks_for_key max_sort_length max_tmp_tables max_user_connections max_write_lock_count myisam_max_extra_sort_file_size myisam_max_sort_file_size myisam_repair_threads myisam_sort_buffer_size net_buffer_length net_read_timeout net_retry_count net_write_timeout query_alloc_block_size query_cache_limit query_cache_size query_cache_type query_cache_wlock_invalidate query_prealloc_size range_alloc_block_size read_buffer_size read_only read_rnd_buffer_size rpl_recovery_rank safe_show_database server_id slave_compressed_protocol slave_net_timeout slow_launch_time sort_buffer_size sql_auto_is_null sql_big_selects
numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric numeric enumeration boolean numeric numeric numeric numeric numeric numeric boolean numeric boolean numeric numeric numeric boolean boolean
GLOBAL GLOBAL GLOBAL GLOBAL GLOBAL GLOBAL | SESSION GLOBAL | SESSION GLOBAL GLOBAL | SESSION GLOBAL GLOBAL | SESSION GLOBAL | SESSION GLOBAL GLOBAL GLOBAL GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL GLOBAL GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL GLOBAL | SESSION GLOBAL GLOBAL GLOBAL GLOBAL GLOBAL GLOBAL GLOBAL | SESSION SESSION SESSION
245
sql_big_tables sql_buffer_result sql_log_bin sql_log_off sql_log_update sql_low_priority_updates sql_max_join_size sql_quote_show_create sql_safe_updates sql_select_limit sql_slave_skip_counter sql_warnings storage_engine table_cache table_type thread_cache_size timestamp tmp_table_size transaction_alloc_block_size transaction_prealloc_size tx_isolation unique_checks wait_timeout warning_count
boolean boolean boolean boolean boolean boolean numeric boolean boolean numeric numeric boolean enumeration numeric enumeration numeric boolean enumeration numeric numeric enumeration boolean numeric numeric
SESSION SESSION SESSION SESSION SESSION GLOBAL | SESSION GLOBAL | SESSION SESSION SESSION SESSION GLOBAL SESSION GLOBAL | SESSION GLOBAL GLOBAL | SESSION GLOBAL SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION GLOBAL | SESSION SESSION GLOBAL | SESSION SESSION
Les variables qui sont marques comme ``string'' prennent une valeur de chane de caractres. Les variables qui sont marques comme ``numeric'' prennent un nombre. Les variables qui sont marques comme ``boolean'' peuvent prendre 0 ou 1, ON ou OFF. Les variables qui sont marques comme ``enumeration'' doivent normalement prendre l'une des valeurs possible de cette variable, mais elles peuvent aussi prendre le numro de l'lment dans l'numration. Pour les systmes numration, la premire numration est 0. Cela est diffrent des colonnes de type ENUM, pour qui la premire valeur est la 1.
246
| Delayed_insert_threads | 0 | | Delayed_writes | 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_delayed_rows | 0 | | Not_flushed_key_blocks | 0 | | Open_files | 2 | | Open_streams | 0 | | Open_tables | 1 | | Opened_tables | 44600 | | Qcache_free_blocks | 36 | | Qcache_free_memory | 138488 | | Qcache_hits | 79570 | | Qcache_inserts | 27087 | | Qcache_lowmem_prunes | 3114 | | Qcache_not_cached | 22989 | | Qcache_queries_in_cache | 415 | | Qcache_total_blocks | 912 | | Questions | 2026873 | | Select_full_join | 0 | | Select_full_range_join | 0 | | Select_range | 99646 | | Select_range_check | 0 | | Select_scan | 30802 | | Slave_open_temp_tables | 0 | | Slave_running | OFF | | 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_connected | 1 | | Threads_created | 30022 | | Threads_running | 1 | | Uptime | 80380 | +--------------------------+------------+
De nombreuses variables de statut sont remises 0 par la commande FLUSH STATUS. Les variables de statut ont les significations suivantes. Les variables compteur de commande Com_xxx ont t ajoutes en MySQL 3.23.47. Les variables de cache de requtes Qcache_xxx ont t ajoutes en MySQL 4.0.1. Sinon, les variables sans versions sont prsentes depuis MySQL 3.22. Aborted_clients Nombre de connexions annules parce que le client est mort sans se dconnecter correctement. See Section A.2.10, Erreurs de communication / Connexion annule . Aborted_connects Nombre de tentatives de connexions au serveur MySQL qui ont choues. See Section A.2.10, Erreurs de communication / Connexion annule .
247
Binlog_cache_disk_use Le nombre de transactions qui ont utilis le cache de log binaire mais qui ont dpass la taille de binlog_cache_size et ont finalement utilis un fichier temporaire pour stocker les commandes de la transaction. Cette variable a t ajoute en MySQL 4.1.2. Binlog_cache_use Le nombre de transactions qui ont utilis le cache de log binaire temporaire. Cette variable a t ajoute en MySQL 4.1.2. Bytes_received Nombre d'octets reu de tous les clients. Cette variable a t ajoute en MySQL 3.23.7. Bytes_sent Nombre d'octets envoys tous les clients. Cette variable a t ajoute en MySQL 3.23.7. Com_xxx Nombre d'excution de chaque commande xxx. Il y a une variable par type de commande. Par exemple, Com_delete et Com_insert comptent respectivement les commandes DELETE et INSERT. Connections Nombre de tentatives de connexions au serveur MySQL, russies ou pas. Created_tmp_disk_tables Nombre de tables temporaires implicites cres sur le disque lors d'excutions de commandes. Cette variable a t ajoute en MySQL 3.23.24. Created_tmp_files Combien de fichiers temporaires mysqld a cr. Si Created_tmp_disk_tables est grand, augmentez la taille de tmp_table_size pour que les tables temporaires restent plus souvent en mmoire. Created_tmp_tables Nombre de tables temporaires implicites cres en mmoire lors d'excutions de commandes. Cette variable a t ajoute en MySQL 3.23.28. Delayed_errors Nombre de lignes crites avec INSERT DELAYED pour lesquelles des erreurs sont survenues (probablement une erreur de doublons (duplicate key)). Delayed_insert_threads Nombre de gestionnaires d'insertion retardes sont en cours d'utilisation. Delayed_writes Nombre de lignes crites avec INSERT DELAYED. Flush_commands Nombre de commandes FLUSH. Handler_commit
248
Nombre de commandes internes COMMIT. Cette variable a t ajoute en MySQL 4.0.2. Handler_delete Nombre de fois qu'une ligne a t effaces dans une table. Handler_read_first Nombre de fois que la premire ligne a t lue dans un index. Si ce chiffre est haut, c'est que le serveur fait de nombreuses recherches par analyse complte de la table, par exemple SELECT col1 FROM foo, en supposant que col1 est index. Handler_read_key Nombre de requte de lecture de ligne bases sur une cl. Si ce chiffre est grand, c'est une bonne indication de l'indexation correcte de vos tables. Handler_read_next Nombre de requte de lecture de la ligne suivante en ordre. Cela sera augment si vous listez une colonne avec une contrainte d'intervalle. Cette valeur sera aussi incrmente si vous effectuez un scan d'index. Handler_read_prev Nombre de requte de lecture de la cl prcdente, dans l'ordre. C'est souvent utilis pour optimiser les clauses ORDER BY ... DESC. Cette variable a t ajoute en MySQL 3.23.6. Handler_read_rnd_next Nombre de requtes de lecture de la prochaine ligne dans le fichier de donnes. Ce chiffre sera grand si vous fates de nombreux scans de tables. Gnralement, cela indique que vos requtes ne sont pas crites pour profiter des index que vous avez mis en place. Handler_read_rnd Nombre de lecture d'une ligne base sur une position fixe. Ce chiffre sera grand si vous effectuez de nombreuses requtes qui rclament le tri du rsultat. Handler_rollback Nombre de commandes internes ROLLBACK. Handler_update Nombre de requte de modification d'une ligne dans une table. Handler_write Nombre de requte pour insrer une ligne dans une table. Key_blocks_used Nombre de blocs utiliss dans un cache de cl. Vous pouvez utiliser cette valeur pour dterminer l'occupation du cache de cl : voyez la discussion de key_buffer_size dans Section 5.2.3, Variables serveur systme . Key_read_requests Nombre de requtes de lecture d'un bloc de cl dans le cache. Key_reads
249
Nombre de lecture physique d'un bloc de cl sur le disque. Si Key_reads est grand, alors votre valeur pour key_buffer_size est probablement trop petite. Le ratio peut tre calcul avec Key_reads/Key_read_requests. Key_write_requests Nombre de requtes 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 utilises simultanment. Not_flushed_delayed_rows Nombre de lignes en attente d'criture dans les listes INSERT DELAY. Not_flushed_key_blocks Nombre de blocs de cls dans le cache de cls, qui ont t modifies, mais pas encore crites sur le disque. Open_files Nombre de fichiers ouverts. Open_streams Nombre de flux ouverts (utiliss gnralement pour les logs). Open_tables Nombre de tables ouvertes. Opened_tables Nombre de tables qui ont t ouvertes. Si Opened_tables est grand, votre valeur pour table_cache est probablement trop petite. Qcache_free_blocks Le nombre de blocs de mmoire libre dans le cache de requte. Qcache_free_memory La quantit de mmoire libre dans le cache de requte. Qcache_hits Le nombre de sollicitations du cache. Qcache_inserts Le nombre de requtes ajoutes dans le cache. Qcache_lowmem_prunes Le nombre de requtes qui ont t effaces du cache, pour librer de la place. Qcache_not_cached
250
Le nombre de requtes non-caches (elles ne peuvent pas tre mises en cache, ou cause de query_cache_type). Qcache_queries_in_cache Le nombre de requtes enregistres dans le cache. Qcache_total_blocks Le nombre total de blocs dans le cache de requtes. Questions Nombre de requtes envoyes au serveur. Rpl_status Statut de la rplication sans erreur (rserv pour utilisation ultrieure). Select_full_join Nombre de jointures sans cl (si cette variable vaut 0, vous devriez vrifier soigneusement les index de vos tables). Cette variable a t ajoute en MySQL 3.23.25. Select_full_range_join Nombre de jointures o une recherche d'intervalle a t utilise. Cette variable a t ajoute en MySQL 3.23.25. Select_range_check Nombre de jointures sans cl, o l'utilisation de cl a t vrifie aprs chaque ligne (si cette variable vaut 0, vous devriez vrifier soigneusement les index de vos tables). Cette variable a t ajoute en MySQL 3.23.25. Select_range Nombre de jointures o une recherche d'intervalle a t utilise sur la premire table. (Ce n'est gnralement pas important, mme si cette valeur est importante). Cette variable a t ajoute en MySQL 3.23.25. Select_scan Nombre de jointures o la premire table a t totalement analyse. Cette variable a t ajoute en MySQL 3.23.25. Slave_open_temp_tables Nombre de tables temporaires actuellement utilise par le thread esclave. Cette variable a t ajoute en MySQL 3.23.29. Slave_running Cette variable vaut ON si ce serveur est un esclave connect au matre. Cette variable a t ajoute en MySQL 3.23.16. Slow_launch_threads Nombre de threads qui ont pris plus de slow_launch_time secondes pour tre crs. Cette variable a t ajoute en MySQL 3.23.15. Slow_queries
251
Nombre de requtes qui ont pris plus de long_query_time pour s'excuter. See Section 5.9.5, Le log des requtes lentes . Sort_merge_passes Nombre de passes que l'algorithme de tri a du faire. Si cette valeur est grande, vous devriez vrifier la taille de sort_buffer. Sort_range Nombre de tris qui ont t fait sur des intervalles. Sort_rows Nombre de lignes tries. Sort_scan Nombre de tris qui ont t fait en analysant la table. ssl_xxx Variables utilises par SSL; Rserve pour utilisation ultrieure. Ces variables ont t ajoutes en MySQL 4.0.0. Table_locks_immediate Nombre de fois que la table a reu immdiatement un verrou. Disponible depuis 3.23.33. Cette variable a t ajoute en MySQL 3.23.33. Table_locks_waited Nombre de fois qu'une table n'a pu recevoir de verrou immdiatement, et qu'il a fallu attendre. Si ce chiffre est haut, vous avez des problmes de performance, et vous devriez optimiser vos requtes, couper vos tables en deux, ou utiliser la rplication. Disponible depuis la version 3.23.33. Cette variable a t ajoute en MySQL 3.23.33. Threads_cached Nombre de threads dans le cache de thread. Cette variable a t ajoute en MySQL 3.23.17. Threads_connected Nombre de connexions actuellement ouvertes. Threads_created Nombre de threads crs pour grer les connexions. Si Threads_created est grand, vous pouvez augmenter la valeur de Threads_running Nombre de threads qui ne dorment pas. Uptime Dure de vie du serveur, en secondes depuis le redmarrage.
252
1. Le processus est activ 2. Le serveur cre un thread d'extinction, si ncessaire 3. Le serveur cesse d'accepter les nouvelles connexions 4. Le serveur conclut les activits en cours 5. Les moteurs de stockages se ferment 6. Le serveur se termine Voici une version plus dtaille de ce synopsis : 1. Le processus est activ L'extinction du serveur peut tre initie par plusieurs mthodes. Par exemple, un utilisateur avec le droit de SHUTDOWN peut excuter la commande mysqladmin shutdown. mysqladmin peut tre utilise sur n'importe quelle plate-forme supporte par MySQL. Les autres mthodes d'extinction spcifiques aux systmes d'exploitation existent aussi : le serveur s'teind lorsqu'il reoit un signal SIGTERM sous Unix. Un serveur install comme service Windows s'teind sur ordre du gestionnaire. 2. Le serveur cre un thread d'extinction, si ncessaire En fonction de l'origine de l'extinction, le serveur peut lancer un thread qui grera l'extinction. Si l'extinction a t demande par un client, un thread d'extinction est cr. Si l'extinction est le rsultat d'un signal SIGTERM, le thread signal pourra grer l'extinction lui-mme, ou alors lancer un autre thread. SI le serveur essaie de crer un thread et ne peut pas le faire (par exemple, plus de mmoire), il va mettre un message qui apparaitra comme ceci dans les logs :
Error: Can't create thread to kill server
3. Le serveur cesse d'accepter les nouvelles connexions Pour viter de voir de nouvelles oprations se lancer, le serveur commence par arrter d'accepter les nouvelles connexions. Il fait cela en fermant les connexions au rseau qui attendent les connexions : le port TCP/IP, la socket Unix ou le Pipe Windows. 4. Le serveur conclut les activits en cours Pour chaque thread associ une connexion rseau, la connexion est interrompue, et le thread est marqu comme mort. Le thread s'arrte lorsqu'il remarque qu'il a t tu. Les threads qui sont inactifs meurent rapidement. Les threads qui traitent des requtes vrifient priodiquement leur tat, et prennent plus de temps pour s'arrter. Pour plus d'information sur la fin des threads, voyez Section 13.5.4.3, Syntaxe de KILL , en particulier propos des commandes REPAIR TABLE ou OPTIMIZE TABLE sur les tables MyISAM. Pour les threads qui ont une transaction ouverte, la transaction est annule. Notez que si un thread modifie une table non-transactionnelle, une opration comme un UPDATE multi-ligne ou un INSERT peuvent laisser la table partiellement modifie, car l'opration peut se terminer avant sa fin logique. Si le serveur est un serveur de rplication, les threads associs avec les esclaves sont traits comme n'importe quel autre client. C'est dire, ils sont marqus comme termins, et se termine leur prochaine vrification d'tat. Si le serveur est un esclave de rplication, le thread d'entre/sortie et le thread SQL sont arrts avant que le thread client ne soit tu. Le thread SQL est autoris terminer sa commande en cours (pour viter des problmes de rplication), puis cesse. Si le thread SQL tait au milieu d'une transaction, elle sera annule. 5. Les moteurs de stockages se ferment
253
A ce stade, les cache de tables ont envoys sur le disque, et toutes les tables ouvertes sont fermes. Chaque moteur de stockage effectue les oprations ncessaire pour fermer les tables qu'il gre. Par exemple, MyISAM envoye les dernires critures pour la table. InnoDB vide ses buffers sur le disque, crit le LSN courant dans l'espace de table, et termine ses propres threads. 6. Le serveur se termine
254
Guide de scurit
est bien mieux : il contient aussi le mot ``fish'' mais dcal d'une touche sur un clavier QWERTY. Une autre mthode de gnration consiste prendre la premire lettre de chaque mot d'une phrase : ``Maupa'' est issu de ``Marie a un petit agneau.'' C'est facile retenir, mais difficile devenir pour un attaquant. Investissez dans un coupe-feu. Cela protge de 50% de tous les types d'attaque et vulnrabilit. Placez MySQL derrire le coupe-feu, ou dans une zone dmilitarise (DMZ). Liste de vrification : Essayez de scanner vos portes depuis l'Internet, avec des outils comme nmap. MySQL utilise le port 3306 par dfaut. Ce port ne doit pas tre accessible tous les serveurs. Une autre mthode simple pour vrifier si le port MySQL est ouvert ou non, est d'essayez la commande suivante depuis une machine distante, o server_host est le serveur qui hberge MySQL :
shell> telnet server_host 3306
Si vous obtenez une connexion et des caractres binaires, le port est ouvert, et il devrait tre ferm par votre routeur ou votre coupe-feu, moins d'avoir une bonne raison pour le garder ouvert. Si telnet attend, ou que la connexion est refuse, tout va bien : le port est bloqu. Ne fates confiance aucune donne entre par les utilisateurs de votre application. Ils peuvent djouer vos filtres en entrant des squences spciales via les formulaires Web, les URL ou tout autre point d'entre de l'application. Assurez vous que votre application reste sre si un utilisateur entre une chane telle que ``; DROP DATABASE mysql;''. C'est un exemple extrmement simple, mais il dvoilera un trou de scurit important. Il engendrera aussi des pertes de donnes si un pirate, utilisant cette technique, vous attaque. Une erreur courante est de ne protger que les chanes de caractres. N'oubliez pas de protger aussi les valeurs numriques. Si une application gnre une requte telle que SELECT * FROM table WHERE ID=234 o l'utilisateur fournit le 234, alors ce dernier peut proposer la valeur 234 OR 1=1 pour conduire la requte SELECT * FROM table WHERE ID=234 OR 1=1. Par consquent, le serveur va lire toutes les lignes de la table. Cela va diffuser toutes les lignes de votre application, et gnrer un trafic excessif. Pour vous prmunir contre ce type d'attaque, ajoutez toujours des guillemets autour des constantes numriques : SELECT * FROM table WHERE ID='234'. Si un utilisateur entre des informations supplmentaires, elles seront intgres dans la chane. Dans un contexte numrique, MySQL supprimera automatiquement les caractres incomprhensibles. Parfois, les gens pensent que si une base de donnes contient des informations publiques, elle n'a pas besoin d'tre dfendue. C'est faux. Mme si vous pouvez accder toutes les lignes de la table, il faut toujours se prmunir contre les dnis de service (par exemple, en utilisant la technique cidessus pour gnrer un trafic excessif). Sinon, votre serveur sera inutilisable. Liste de vrification : Essayez d'entrer des caractres ' et " dans tous vos formulaires Web. Si vous obtenez une erreur MySQL, tudiez immdiatement le problme. Essayez de modifier une URL dynamique en ajoutant les squences %22 ("), %23 (#) et %27 ('). Essayez de modifier les types de donnes des URL dynamiques de numriques en textuels, avec les caractres cits ci-dessus. Votre application doit tre scurise contre ce type d'attaque. Essayez d'entrer des caractres, des espaces et d'autres symboles spciaux, autre que des nombres, dans un champ numrique. Votre application devrait supprimer tous ces caractres avant de les passer MySQL, ou gnrer une erreur. Passer MySQL des valeurs non vrifies est trs dangereux. Vrifiez la taille des chanes avant de les passer MySQL.
255
Essayez de faire connecter votre application en utilisant un autre nom que celui qui est utilis pour les tches d'administration. Ne donnez pas votre application des droits dont elle n'a pas besoin. De nombreuses interfaces de programmation disposent de moyens pour protger les valeurs. Correctement utiliss, ils vitent aux utilisateurs de l'application de faire passer des caractres qui auront un effet diffrent de celui attendu : MySQL C API : Utilisez la fonction mysql_real_escape_string(). MySQL++ : Utilisez les options escape et quote dans le flux de requte. PHP : Utilisez la fonction mysql_escape_string(), qui est base sur la fonction C du mme nom. Avant PHP 4.0.3, utilisez addslashes(). Perl DBI : Utilisez la mthode quote() ou utilisez les variables de requte. Java JDBC : Utilisez un objet PreparedStatement ou utilisez les variables de requte. Les autres interfaces ont des fonctionnalits similaires. Ne transmettez pas de donnes dchiffres sur Internet. Cette information est accessible tout ceux qui ont le temps et la capacit d'intercepter et d'utiliser ces mots de passe. Utilisez plutt un protocole scuris comme SSL ou SSH. MySQL supporte les connexions SSL depuis la version 4.0.0. SSH peut tre utilis pour crer un tunnel chiffr et compress de communication. Apprenez utiliser les programmes tcpdump et strings. Dans la plupart des cas, vous pouvez vrifier si un flux MySQL est chiffr avec la commande suivante :
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
(Cette commande fonctionne sous Linux, et devrait tre adapte facilement dans les autres systmes.) Attention : si vous ne voyez pas de donnes en clair, cela ne signifie pas toujours que les informations sont chiffres. Si vous avez besoin de haute scurit, consultez un expert.
256
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 spcifie son nom d'utilisateur. Il sera plus difficile un attaquant de pntrer dans votre serveur si tous les comptes ont un mot de passe. Vous pouvez modifier les mots de passe de tous les utilisateurs en modifiant le script mysql_install_db avant de l'excuter, ou vous pouvez modifier seulement le mot de passe du root MySQL comme ceci@ :
shell> mysql> -> mysql> mysql -u root UPDATE mysql.user SET Password=PASSWORD('nouveau_mot_de_passe') WHERE User='root'; FLUSH PRIVILEGES;
N'excutez jamais le dmon MySQL avec l'utilisateur Unix root. C'est trs dangereux, car tout personne ayant le droit de FILE pour crer des fichiers au nom du root (par exemple, ~root/.bashrc). Pour viter cela, mysqld refusera de s'excuter au nom de root moins que soit prcis l'option --user=root. mysqld peut tre excut avec un utilisateur ordinaire sans droits particuliers. Vous pouvez aussi crer un utilisateur Unix mysql pour rendre cela encore plus sr. Si vous excutez 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 dmarrer mysqld sous un autre nom d'utilisateur Unix, ajoutez la ligne user, qui spcifie le nom de l'utilisateur, dans le fichier d'options de [mysqld] /etc/my.cnf ou dans le fichier my.cnf prsent dans le dossier de donnes du serveur. Par exemple :
[mysqld] user=mysql
Cette ligne va forcer le serveur dmarrer en tant qu'utilisateur mysql, mme si vous dmarrez le serveur manuellement ou avec les scripts safe_mysqld, ou mysql.server. Pour plus de dtails, voyez Section A.3.2, Comment excuter MySQL comme un utilisateur normal . Excuter mysql sous un autre compte Unix que root ne signifie pas que vous devez changer le nom de root dans la table user. Les comptes utilisateurs de MySQL n'ont rien voir avec ceux du compte Unix. N'autorisez pas l'utilisation de liens symboliques pour les tables. Cette fonctionnalit peut tre dsactive avec l'option --skip-symbolic-links. C'est particulirement important si vous utilisez mysqld comme root, car tout utilisateur a alors le droit d'crire des donnes sur le disque, n'importe o sur le systme!! See Section 7.6.1.2, Utiliser les liens symboliques avec les tables sous Unix . Vrifiez que l'utilisateur Unix qui excute mysqld est le seul utilisateur avec les droits de lecture et criture dans le dossier de base de donnes. Ne donnez pas le droit de PROCESS tous les utilisateurs. La liste fournie par mysqladmin processlist affiche le texte des requtes actuellement excutes, ce qui permet toute personne pouvant excuter cette commande de lire des valeurs qui seraient en clair, comme : UPDATE user SET password=PASSWORD('not_secure'). mysqld rserve une connexion supplmentaire pour les utilisateurs qui ont le droit de PROCESS, afin que le root MySQL puisse toujours se connecter et vrifier que tout fonctionne bien, mme s'il ne reste plus de connexions libres pour les autres utilisateurs. Le droit SUPER peut tre utilis pour fermer des connexions clients, changer les variables systmes et contrler la rplication.
257
Ne donnez pas le droit de FILE tous les utilisateurs. Tout utilisateur qui possde ce droit peut crire un fichier n'importe o sur le serveur, avec les droits hrits du dmon mysqld ! Pour rendre cela plus scuritaire, tous les fichiers gnrs 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 dmon 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'htes. Dans ce cas, soyez trs prudents lors de la cration de droits qui utilisent des caractres 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. La commande GRANT dispose aussi d'option de contrle des ressources, pour limiter l'utilisation du serveur par un compte utilisateur.
Cela va s'assurer que l'utilisateur ne peut par modifier une colonne directement, mais qu'il peut excuter la commande GRANT sur d'autres utilisateurs. --secure-auth Interdit l'identification pour les comptes qui ont d'anciens mot de passe (avant la version 4.1). Cette option est valable depuis MySQL 4.1.1. --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 excutant la commande mysqladmin flush-privileges ou mysqladmin reload.) --skip-name-resolve Les noms d'htes ne sont pas rsolus. Toutes les valeurs de la colonne Host dans les tables de droits doivent tre des adresses IP, ou bien localhost.
258
--skip-networking Ne pas accepter les connexions TCP/IP venant du rseau. Toutes les connexions au serveur mysqld doivent tre fates avec les sockets Unix. Cette option n'existe pas pour les versions antrieures la 3.23.27, avec les MIT-pthread, car les sockets Unix n'taient pas supports 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 accs sont dsormais donns spcifiquement avec le droit SHOW DATABASES.
La fonction premire du systme de privilges de MySQL est d'authentifier les utilisateurs se connectant partir d'un hte donn, et de leur associer des privilges sur une base de donnes comme SELECT, INSERT, UPDATE et DELETE. Les fonctionnalits additionnelles permettent d'avoir un utilisateur anonyme et de contrler les privilges pour les fonctions spcifiques MySQL comme LOAD DATA INFILE et les oprations administratives.
260
Index_priv Alter_priv Create_priv Drop_priv Grant_priv References_priv Reload_priv Shutdown_priv Process_priv File_priv Show_db_priv Super_priv
Create_tmp_table_priv Create_tmp_table_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv ssl_type ssl_cypher x509_issuer x509_cubject max_questions max_updates max_connections Lors de la seconde tape du contrle d'accs (vrification de la requte), le serveur peut, suivant la requte, consulter aussi les tables tables_priv et columns_priv. Les champs de ces tables sont : Nom de la table Champ tables_priv Host Db User Table_name Droit Autre champ columns_priv Host Db User Table_name Column_name Table_priv Column_priv Timestamp Grantor Chaque table de droit contient des champs d'identification et des champs de droits. Les champs d'identification dterminent 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 'thomas.loc.gov' et 'bob' servira identifier les connexions qui sont faites par l'utilisateur bob depuis l'hte thomas.loc.gov. De mme, une ligne dans la table db avec les valeurs des colonnes Host, User et Db de 'thomas.loc.gov', 'bob' et 'reports' sera utilise lorsque Timestamp Column_priv Lock_tables_priv Lock_tables_priv
261
l'utilisateur bob se connecte depuis l'hte thomas.loc.gov pour accder 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. Les champs de droits indiquent si le droit est donn, c'est dire si l'opration indique peut tre excut. Le serveur combine les informations dans diffrentes tables pour former une description complte de l'utilisateur. Les rgles utilises sont dcrites dans Section 5.5.6, Contrle d'accs, tape 2 : Vrification de la requte . Les champs d'identification sont des chanes, dclares comme suit. La valeur par dfaut de chacun des champs est la chane vide. Nom de la colonne Host User Password Db Table_name Column_name Type CHAR(60) CHAR(16) CHAR(16) CHAR(64) CHAR(60) CHAR(60)
Avant MySQL 3.23, la colonne Db valait CHAR(32) dans certaines tables, et CHAR(60) dans d'autres. Pour vrifier les accs, la comparaison sur les valeurs de la colonne Host sont sensibles la casse. User, Password, Db et Table_name sont insensibles. Les valeurs de Column_name sont insensibles depuis MySQL 3.22.12. Dans les tables user, db et host, tous les champs de droits sont dclars avec le type ENUM('N','Y') : il peuvent prendre tous les valeurs de 'N' (non) ou 'Y' (oui, YES), et la valeur par dfaut est 'N'. Dans les tables tables_priv et columns_priv, les champs de droits sont dclars comme des champs de type SET : Nom de la table Nom du champs tables_priv Table_priv Valeurs possibles 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter' 'Select', 'Insert', 'Update', 'References' 'Select', 'Insert', 'Update', 'References'
tables_priv
Column_priv
columns_priv Column_priv
En bref, le serveur utilise les tables de droits comme ceci : La table user dtermine si le serveur accepte ou rejette la connexion. Pour les connexions acceptes, tous les privilges donns dans la table user indiquent des privilges globaux. Ces droits d'appliquent toutes les bases du serveur. Les champs d'identification de la table db dterminent quels utilisateurs peuvent accder quelles bases, depuis quel hte. Les champs de droits indiquent alors les oprations permises. Les droits s'appliquent alors toutes les bases sur le serveur. La table host est utilise comme extension de la table db lorsque vous voulez qu'une ligne de la table db s'applique plusieurs htes. Par exemple, si vous voulez qu'un utilisateur soit capable d'utiliser une base depuis plusieurs htes dans votre rseau, laissez la colonne Host vide dans la table db, Ce mcanisme est dcrit en dtails dans Section 5.5.6, Contrle d'accs, tape 2 : Vrification de la requte .
262
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, plutt qu'au niveau des bases. Notez que les droits d'administration tels que (RELOAD, SHUTDOWN, etc...) ne sont spcifis que dans la table user. En effet, ces oprations sont des oprations au niveau serveur, et ne sont pas lies une base de donnes, 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 dterminer les autorisations d'administration. Le droit de FILE est spcifi par la table user. Ce n'est pas un droit d'administration, mais votre capacit lire ou crire des fichiers sur le serveur hte et dpendant de la base laquelle vous accdez. Le serveur mysqld lit le contenu des tables de droits une fois, au dmarrage. Lorsqu'il y a des modifications dans les tables, elles prennent effet tel qu'indiqu dans Section 5.5.7, Quand les modifications de privilges prennent-ils effets ? . Lorsque vous modifiez le contenu des tables de droits, c'est une bonne ide que de s'assurer que vous avez bien configur les droits qui vous intressent. Un moyen de vrifier les droits pour un compte est d'utiliser la commande SHOW GRANTS. Par exemple, pour dterminer les droits qui sont donns un compte avec les valeurs Host et User de pc84.example.com et bob, utilisez cette commande :
mysql> SHOW GRANTS FOR 'bob'@'pc84.example.com';
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 vrifie les accs que pour les tables user, db et host. Il n'utilise pas les tables de droit de niveau table ou colonne. Pour plus d'aide au diagnostique pour les problmes de droits, voyez la section Section 5.5.8, Causes des erreurs Access denied . Pour des conseils gnraux sur la scurit, voyez la section Section 5.4, Scurit gnrale du serveur .
263
CREATE TEMPORARY TABLES EXECUTE FILE LOCK TABLES PROCESS RELOAD REPLICATION CLIENT REPLICATION SLAVE SHOW DATABASES SHUTDOWN SUPER
Execute_priv File_priv Lock_tables_priv Process_priv Reload_priv Repl_client_priv Repl_slave_priv Show_db_priv Shutdown_priv Super_priv
administration du serveur accs aux fichiers du serveur administration du serveur administration du serveur administration du serveur administration du serveur administration du serveur administration du serveur administration du serveur administration du serveur
Les droits de SELECT, INSERT, UPDATE et DELETE vous permettent de faire des oprations 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 exctuer une commande SELECT mme sans aucun droit d'accs une base de donnes 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 crer et dtruire des index de table. Le 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 crer de nouvelles tables et bases de donnes, et de les supprimer. Notez que si vous donnez le droit de DROP pour la base de donnes mysql un utilisateur, cet utilisateur pourra dtruire la base qui contient les droits d'accs du serveur ! Le droit de GRANT vous permet de donner les droits que vous possdez 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 possde ce droit peut donc lire ou crire dans n'importe quel fichier l'intrieur duquel le serveur MySQL peut lire ou crire. Les autres droits sont utiliss pour les oprations administratives qui sont excutes par l'utilitaire mysqladmin. La table ci-dessous montre quelle commande est associe mysqladmin avec un de ces droits : Droit RELOAD SHUTDOWN PROCESS SUPER Commande autorise reload, refresh, flush-privileges, flush-hosts, flush-logs et flushtables shutdown processlist kill
264
La commande reload indique au serveur de relire les tables de droits. La commande refresh vide les tables de la mmoire, crit les donnes 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 limites dans leur application, et sont prfrables dans certains contextes. Par exemple, si vous souhaitez simplement vider les tampons dans le fichier de log, 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'excutent 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 dmarrs par d'autres utilisateurs. See Section 13.5.4.3, Syntaxe de KILL . C'est une bonne ide en gnral, de ne donner les droits de Grant qu'aux utilisateurs qui en ont besoin, et vous devriez tre particulirement vigilant pour donner certains droits : Le droit de GRANT permet aux utilisateurs de donner leurs droits d'autres utilisateurs. Deux utilisateurs avec des droits diffrents 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 systme 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 donnes. Le contenu pourra alors tre lu et manipul avec SELECT. Cela inclus le contenu de toutes les bases actuellement hberges sur le serveur ! Le droit de SHUTDOWN peut conduire au dnis de service, en arrtant le serveur. Le droit de PROCESS permet de voir en texte clair les commandes qui s'excutent actuellement, et notamment les changements de mot de passe. Le droit de SUPER peut tre utilis pour terminer les connexions ou modifier le mode opratoire du serveur. Les droits sur la base de donnes mysql peuvent tre utiliss pour changer des mots de passe ou des droits dans la table des droits (Les mots de passe sont stocks chiffrs, ce qui vite que les intrus ne les lisent). S'ils accdent un mot de passe dans la table mysql.user, ils pourront l'utiliser pour se connecter au serveur avec cet utilisateur (avec des droits suffisants, le mme utilisateur pourra alors remplacer un mot de passe par un autre). Il y a des choses qui ne sont pas possibles avec le systme de droits de MySQL : Vous ne pouvez pas explicitement interdire l'accs un utilisateur spcifique. C'est dire, vous ne pouvez pas explicitement dcrire un utilisateur et lui refuser la connexion. Vous ne pouvez pas spcifier qu'un utilisateur a les droits de crer et de supprimer des tables dans une base, mais qu'il n'a pas les droits pour crer et supprimer cette base.
265
Les formes alternatives des options -h, -u et -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. Si vous utilisez les options -p et --password mais que vous ne spcifiez pas de mot de passe, le client vous le demandera interactivement. Le mot de passe ne sera alors pas affich. C'est la mthode la plus scuritaire. Sinon, n'importe quel utilisateur du systme pourra voir le mot de passe de la ligne de commande en excutant une commande telle que ps auxww. See Section 5.6.6, Garder vos mots de passe en lieu sr . mysql utilise des valeurs par dfaut pour chacun des paramtres qui manquent en ligne de commande : Le nom d'hte par dfaut est localhost. Le nom d'utilisateur par dfaut est votre nom d'utilisateur de systme Unix. Aucun mot de passe n'est transmis si -p manque. Par exemple, pour un utilisateur Unix joe, les commandes suivantes sont quivalentes :
shell> shell> shell> shell> mysql -h localhost -u joe mysql -h localhost mysql -u joe mysql
Les autres clients MySQL se comportent de manire similaire. Sous Unix, vous pouvez spcifier diffrentes valeurs par dfaut qui seront utilises lorsque vous tablirez la connexion, de manire 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 faons : Vous pouvez spcifier les informations de connexion dans la section [client] du fichier de configuration .my.cnf de votre dossier personnel. La section qui vous intresse ressemble ceci :
[client] host=nom_d_hote user=nom_d'utilisateur password=votre_mot_de_passe
Les fichiers d'options sont prsents dans la section Section 4.3.2, Fichier d'options my.cnf . Vous pouvez spcifier les paramtres de connexion avec les variables d'environnement. L'hte peut tre spcifi mysql avec la variable MYSQL_HOST. L'utilisateur MySQL peut tre spcifi avec la variable USER (uniquement pour Windows). Le mot de passe peut tre spcifi avec MYSQL_PWD : mais ceci est peu scuritaire voyez Section 5.6.6, Garder vos mots de passe en lieu sr . Voyez aussi la prochaine section Annexe E, Variables d'environnement.
266
La vrification d'identit est ralise avec les trois colonnes de la table user (Host, User et Password). Le serveur accepte la connexion uniquement si une entre dans la table user correspond votre hte, et que vous fournissez le mot de passe qui correspond. Les valeurs de la table user peuvent tre paramtres comme ceci : Une valeur de la colonne Host peut tre un nom d'hte, une adresse IP numrique, ou encore 'localhost', qui reprsente l'hte local. Vous pouvez utiliser les caractres jokers % et _ dans le champ Host. Ces caractres ont la mme valeur que pour les oprations de recherches avec l'oprateur LIKE. Par exemple, une valeur Host de '%' remplace n'importe quel nom d'hte, alors que la valeur '%.mysql.com' reprsente tous les htes du domaine mysql.com. Depuis MySQL version 3.23, les valeurs de Host spcifies sous la forme d'IP numriques peuvent tre compltes avec le masque de rseau qui indique combien de bits d'adresse sont utiliss. 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
Les adresses IP qui satisfont cette condition et qui peuvent se connecter au serveur MySQL sont dans l'intervalle 192.58.197.0 192.58.197.255. Une valeur vide pour la colonne Host indique que les droits doivent tre grs avec les entres de la table host qui correspond l'hte se connectant. Vous trouverez plus d'informations ce sujet dans le chapitre Section 5.5.6, Contrle d'accs, tape 2 : Vrification de la requte . Une valeur vide dans la colonne Host des autres tables de droits revient '%'. Comme vous pouvez utiliser des jokers dans les valeurs IP de Host (par exemple, '144.155.166. %' pour tous les htes d'un sous-rseau), il est possible d'exploiter cette possibilit en appelant un hte 144.155.166.ailleurs.com. Pour contrer ce type d'attaque, MySQL bloque les noms de domaines qui commence par des chiffres et des points. Par consquent, si vous avez un hte nomm 1.2.foo.com, il ne sera jamais accept par la colonne Host des tables de droits. Un caractre joker d'adresse IP peut remplacer uniquement des nombres d'IP, et pas un nom d'hte. Dans la colonne User, les caractres joker ne sont pas autoriss, mais vous pouvez laisser cette valeur vide, qui acceptera tous les noms. Si la table user contient une connexion avec un nom d'utilisateur vide, l'utilisateur est considr comme anonyme. Cela signifie que le nom d'utilisateur vide est utilis pour les prochaines vrifications d'accs pour la dure de la connexion. 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 reprsentent des valeurs du mot de passe chiffres. 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 vrifier 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 accs en lecture aux utilisateurs normaux aux tables d'administration dans la base mysql! A partir de sa version 4.1, MySQL utilise un
267
mcanisme diffrent pour les logins, mots de passes qui est scuris mme si les paquets TCP/IP sont sniffs et/ou que la base de donnes mysql est capture. Depuis la version 4.1, MySQL emploie une identification forte qui protge mieux les mots de passe durant le processus de connexion. Cette mthode est scuritaire, mme si les paquets TCP/IP sont surveills pour que la base de donnes mysql est capture. Le chiffrement est prsent dans la section Section 5.5.9, Hashage de mots de passe en MySQL 4.1 . Les exemples ci-dessous illustrent comment diffrentes variantes de Host et User dans la table user s'appliquent aux connexion entrantes : Host value 'thomas.loc.gov' 'thomas.loc.gov' '%' '%' '%.loc.gov' 'x.y.%' User value 'fred' '' 'fred' '' 'fred' 'fred' Connexions autorises fred, se connectant depuis thomas.loc.gov N'importe quel utilisateur, se connectant depuis thomas.loc.gov fred, se connectant depuis n'importe quel hte N'importe quel utilisateur, se connectant depuis n'importe quel hte fred, se connectant depuis n'importe quel hte dans le domaine loc.gov fred, se connectant depuis x.y.net, x.y.com,x.y.edu, etc. (Ceci n'est probablement pas trs utilis) fred, se connectant depuis l'hte d'IP 144.155.166.177 fred, se connectant depuis un hte d'IP dans la classe C 144.155.166 Identique l'exemple prcdent
'144.155.166.177' '144.155.166.%'
'fred' 'fred'
'144.155.166.0/255.255.255.0' 'fred'
Comme vous pouvez utiliser des caractres jokers dans les adresses IP de la colonne Host (par exemple, '144.155.166.%' pour identifier tout un sous-rseau), il est possible d'exploiter cette fonctionnalit en nommant un hte 144.155.166.kekpart.com. Pour contrer de telles tentatives, MySQL interdit les caractres jokers avec les noms d'htes qui commencent par des chiffres ou des points. Par exemple, si vous avez un nom d'hte tel que 1.2.foo.com, il ne sera jamais trouv dans la colonne Host des tables de droits. Seule une adresse IP numrique peut tre compare avec un masque caractre joker. Une connexion entrante peut tre identifie par plusieurs entres dans la table user. MySQL rsout ce problme comme ceci : Lorsque le serveur lit la table user en mmoire, il trie les lignes. Lorsqu'un client tente de se connecter, le serveur lit les lignes dans l'ordre. Le serveur utilise la premire ligne qui correspond au nom du client et son nom d'utilisateur. 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 spcialises de la colonne Host jusqu'aux plus gnrales ('%' dans la colonne Host signifie ``tous les htes'' et elle est
268
la moins spcifique). Les entres identiques dans la colonne Host sont ordonnes en fonction de la spcificit des valeurs de la colonne User (une entre vide dans la colonne User signifie ``n'importe quel utilisateur'' et est spcifique). Le rsultat 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 premire entre trouve. Pour une connexion depuis l'hte localhost avec le nom d'utilisateur jeffrey, les entres 'localhost' dans la colonne Host sont trouves en premier. Parmi cellesla, la ligne avec un utilisateur vide satisfait les deux contraintes sur le nom et l'hte. '%'/'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 | ... | thomas.loc.gov | | ... +----------------+----------+-
Une connexion depuis l'hte thomas.loc.gov avec jeffrey satisfait les conditions de la premire ligne, tandis qu'une connexion depuis whitehouse.gov avec jeffrey satisfait la seconde ligne. Une erreur commune est de penser que pour un utilisateur donn, toutes les entres qui utilisent explicitement ce nom seront utilises en premier lorsque la connexion est en cours d'tablissement. Ceci est tout simplement faux. L'exemple prcdent illustre cette situation, car la connexion depuis l'hte thomas.loc.gov avec jeffrey est la premire ligne qui est trouve, alors que la ligne contenant 'jeffrey' dans la colonne User est ignore, car il n'y a pas de nom d'utilisateur. Si vous arrivez vous connecter au serveur, mais que les droits ne sont pas ce que vous attendez, vous vous tes probablement identifi avec un autre compte. Pour savoir quel compte le serveur utilise lors de votre identification, utilisez la fonction CURRENT_USER(). Elle retourne la valeur au format user_name@host_name qui indique les valeurs des colonne User et Host de la table user qui vous est affecte. Supposons que jeffrey se connecte et utilise la requte suivante :
mysql> SELECT CURRENT_USER(); +----------------+ | CURRENT_USER() | +----------------+ | @localhost | +----------------+
Le rsultat affich ci-dessus indique que la ligne de la table user est l'utilisateur User vide. En d'autres termes, le serveur traite jeffrey comme un utilisateur anonyme. La fonction CURRENT_USER() est disponible depuis MySQL 4.0.6. See Section 12.8.3, Fonctions d'informations . Une autre piste explorer : imprimez le contenu de la table user et triez la manuellement pour voir quelle est la premire ligne qui est utilise.
269
270
Pour les requtes d'administration comme SHUTDOWN, RELOAD, etc., le serveur vrifie uniquement l'entre dans la table user, car c'est la seule table qui spcifie des droits d'administration. Le droit est donn si la ligne utilise dans la connexion courante dans la table user donne le droit, et sinon, ce droit est interdit. Par exemple, si vous souhaitez excuter 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 mme vrifier les tables db ou host : ces tables ne contiennent pas de colonne Shutdown_priv, ce qui vite qu'on en ait besoin. Pour les requtes exploitant une base de donnes, comme INSERT, UPDATE, etc., le serveur vrifie d'abord les droits globaux de l'utilisateur (droits de super utilisateur), en regardant dans la table user. Si la ligne utilise dans cette table donne droit cette opration, le droit est donn. Si les droits globaux dans user sont insuffisants, le serveur dterminera les droits spcifiques la base avec les tables db et host : 1. 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 compars avec les valeurs de l'hte et de l'utilisateur qui sont connects. Le champ Db est compar avec le nom de la base de donnes que l'utilisateur souhaite utiliser. S'il n'existe pas de ligne qui corresponde Host et User, l'accs est interdit. 2. S'il existe une ligne dans la table db et que la valeur de la colonne Host n'est pas vide, cette ligne dfinit les droits de l'utilisateur. 3. Si dans la ligne de la table db, la colonne Host est vide, cela signifie que la table host spcifie quels htes doivent tre autoriss 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 trouve, l'accs est interdit. S'il y a une ligne, les droits de l'utilisateur sont calculs comme l'intersection (NON PAS l'union !) des droits dans les tables db et host, c'est--dire que les droits doivent tre marqus 'Y' dans les deux tables (de cette faon, vous pouvez donner des droits gnraux dans la table db puis les restreindre slectivement en fonction des htes, en utilisant la table host. Aprs avoir dtermin les droits spcifiques l'utilisateur pour une base grce aux tables db et host, le serveur les ajoute aux droits globaux, donns par la table user. Si le rsultat autorise la commande demande, l'accs est donn. Sinon, le serveur vrifie les droits au niveau de la table et de la colonne dans les tables tables_priv et columns_priv, et les ajoute aux droits dj acquis. Les droits sont alors donns ou rvoqus en fonction de ces rsultats. Exprime en termes boolens, la description prcdente du calcul des droits peut tre rsum comme ceci :
droits globaux OR (droits de base AND droits d'hte) 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'opration demande, le serveur ajoute ces droits ceux de base, table ou colonne ? La raison est que la requte peut demander l'application de plusieurs droits. Par exemple, si vous excutez 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 ncessaires pour faire une opration, mais le serveur ne peut le dduire d'une seule table : les droits de plusieurs tables doivent tre combins pour arriver la bonne conclusion. La table host sert grer une liste d'htes reconnus et scuritaires. Chez TcX, la table host contient une liste de toutes les machines du rseau local. Ces machines reoivent tous les droits. Vous pouvez aussi utiliser la table host pour spcifier les htes qui ne sont pas scuritaires. Supposons que la machine public.votre.domaine t est place dans une zone publique que vous
271
considrez comme peu sre. Vous pouvez autoriser l'accs de toutes les machines, hormis celle-ci, grce la table host configure comme ceci :
+--------------------+----+| Host | Db | ... +--------------------+----+| public.your.domain | % | ... (tous les droits 'N') | %.your.domain | % | ... (tous les droits 'Y') +--------------------+----+-
Naturellement, vous devriez toujours tester vos requtes dans la table de droits, en utilisant l'utilitaire mysqlaccess pour vous assurer que vous disposez des droits ncessaires pour raliser cette opration.
Il se peut aussi que le serveur fonctionne, mais que vous essayez de vous connecter en utilisant un port TCP/IP, un pipe nomm ou un fichier de socket Unix qui n'est pas celui que le serveur utilise. Pour corriger cela, lorsque vous utilisez un client, spcifiez l'option --port pour indiquer le bon port, et l'option --socket pour indiquer le bon fichier de socket Unix ou le pipe nomm Windows. Pour connatre le port utilis, et le chemin jusqu' la socket, vous pouvez utiliser cette commande :
shell> netstat -l | grep mysql
Les tables de droits doivent tre correctement configure pour que le serveur les utilise lors de l'identification. Les installations Windows qui utilisent une distribution binaire ou les installations binaires Unix RPM initialisent automatiquement la base mysql contenant les tables de droits. Pour
272
les autres types d'installation, vous devez initialiser les tables de droits manuellement, avec le script mysql_install_db. Pour plus de dtails, voyez Section 2.5.2, Procdures de post-installation sous Unix . Un moyen de dterminer si vous avez besoin d'initialiser les tables de droits est de regarder dans le dossier mysql dans le dossier de donnes. Le dossier de donnes s'appelle data ou var et est situ dans le dossier d'installation de MySQL. Assurez vous que vous avez un fichier appel user.MYD dans le dossier mysql. Si vous ne le trouvez pas, excutez le script mysql_install_db. Aprs excution de ce script, et redmarrage du serveur, testez les premiers droits avec la commande :
shell> mysql -u root test
Le serveur doit vous laisser vous connecter sans erreur. Aprs une installation toute frache, vous devez vous connecter au serveur et crer les utilisateurs en rglant leurs permissions d'accs :
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 scurit, et donc, vous devez choisir un mot de passe pour l'utilisateur root en mme tant que les autres utilisateurs MySQL. Pour des instructions sur la configuration des mots de passe initiaux, voyez la section Section 2.5.3, Cration des premiers droits MySQL . Si vous avez mis jour une version de MySQL avec une nouvelle versions, avez-vous utilis le script mysql_fix_privilege_tables? Si ce n'est pas le cas, fates-le. La structure des tables de droits change occasionnellement, lorsque de nouvelles fonctionnalits sont ajoutes : aprs une mise jour, assurez-vous que vos tables ont la bonne structure. Pour des instructions, voyez Section 2.6.7, Mise jour des tables de droits . Si un programme client reoit l'erreur suivante lorsqu'il essaie de se connecter, cela signifie que le serveur attend un mot de passe dans un nouveau format, alors que le client fournit un ancien format :
shell> mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client
Pour des informations sur comment traiter ce type de situations, voyez Section 5.5.9, Hashage de mots de passe en MySQL 4.1 et Section A.2.3, Erreur Client does not support authentication protocol . Si vous essayez de vous connecter en tant que root et que vous recevez l'erreur suivante, cela signifie que vous n'avez pas d'entre dans la table user avec une valeur 'root' dans la colonne User et que mysqld ne peut pas rsoudre le nom d'hte du client :
Access denied for user: ''@'unknown' to database mysql
Dans ce cas, vous devez relancer le serveur avec l'option --skip-grant-tables, et diter votre fichier /etc/hosts ou \windows\hosts pour ajouter une ligne vous votre hte. N'oubliez pas que les clients utilisent les paramtres de connexions placs dans les fichiers d'options ou les variables d'environnement. Si un client semble envoyer des paramtres de connexions invalides, lorsque vous n'en spcifiez aucun, vrifiez votre environnement, et les options appropries. Par exemple, si vous recevez l'erreur Access denied avec un client utilis sans option, assurez vous que vous n'avez pas spcifi un ancien mot de passe dans vos anciens fichiers d'options. Vous pouvez supprimer l'utilisation des fichiers d'options d'un client en utilisant l'option --nodefaults. Par exemple :
273
Le fichier d'option que les clients utilisent sont lists dans la section Section 4.3.2, Fichier d'options my.cnf . Les variables d'environnement sont listes dans Annexe E, Variables d'environnement. 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. Si l'erreur prcdente survient lorsque vous n'avez pas spcifi de mot de passe, cela signifie que vous n'avez pas spcifi de mot de passe dans un fichier d'options. Essayez l'option --nodefaults telle dcrit ci-dessus. Pour des informations sur les changements de mot de passe, voyez Section 5.6.5, Configurer les mots de passe . Si vous avez oubli le mot de passe root, vous pouvez redmarrer mysqld avec --skip-granttables pour changer le mot de passe. See Section A.4.1, Comment rinitialiser un mot de passe Root oubli . 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 ncessaire si vous spcifiez le mot de passe en utilisant la commande GRANT ... INDENTIFIED BY ou la commande mysqladmin password. See Section 5.6.5, Configurer les mots de passe .
mysql> SET PASSWORD FOR 'abe'@'host_name' = 'eagle';
La fonction PASSWORD() n'est pas ncessaire si vous spcifiez un mot de passe avec la commande GRANT ou la commande en ligne mysqladmin password, qui utilisent automatiquement PASSWORD() pour chiffrer le mot de passe. localhost est un synonyme de votre nom d'hte local, et est aussi l'hte par dfaut auquel le client essaye de se connecter si vous n'en spcifiez pas un explicitement. Toutefois, les connexions localhost ne fonctionnent pas si vous utilisez une version antrieure la 3.23.27 qui utilise les MIT-pthreads. Pour contourner ce problme sur de tels systmes, vous devez utiliser l'option --host pour nommer l'hte du serveur explicitement. Cela crera une connexion TCP/IP vers le serveur mysqld. Dans ce cas, vous devez avoir votre vrai nom d'hte dans les entres de la table user du serveur hte. (Cela est vrai mme si vous utilisez un programme client sur la mme machine que le serveur.) Si vous obtenez une erreur Access denied lorsque vous essayez de vous connecter la base de donnes avec mysql -u nom_utilisateur nom_base, vous pouvez avoir un problme dans la table user. Vrifiez le en vous excutant mysql -u root mysql et entrant la commande SQL suivante :
mysql> SELECT * FROM user;
Le rsultat devrait comprendre une entre avec les colonnes Host et User correspondante au nom d'hte de votre ordinateur et votre nom d'utilisateur MySQL. Le message d'erreur Access denied vous dira en tant que qui vous essayez de vous identifier, l'hte partir duquel vous voulez le faire, et si vous utilisez ou pas un mot de passe. Normalement, vous devez avoir une entre dans la table user qui correspondent au nom d'hte et nom d'utilisateur
274
donns 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 hte diffrent 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 hte :
Host ... is not allowed to connect to this MySQL server
Vous pouvez corriger ce problme en configurant un compte avec la combinaison hte / nom d'utilisateur que vous utilisez lors de la connexion. Si vous ne connaissez ni l'IP ni le nom d'hte partir duquel vous essayez de vous connecter, vous devez crer une entre avec '%' dans la colonne Host dans la table user et redmarrer mysqld avec l'option --log sur la machine serveur. Aprs 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 connects. (Remplacez alors l'entre de la table user contenant '%' avec le nom d'hte qui apparat dans le log. Sinon, vous aurez un systme non-scuris.) Une autre raison pour cette erreur sous Linux est que vous utilisez une version binaire de MySQL qui est compile avec une version de glibc diffrente de celle que vous utilisez. Dans ce cas, vous devez soit mettre jour votre systme d'exploitation et sa bibliothque glibc, soit tlcharger les sources de MySQL et les compiler vous-mme. Un RPM de sources est normalement facile compiler et installer, cela ne devrait donc pas vous poser de gros problmes. Si vous obtenez une erreur o le nom d'hte est absent ou que celui-ci est une adresse IP alors que vous avez bien entr le nom d'hte :
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 rsolution de l'IP du nom d'hte. Dans ce cas, vous pouvez excuter mysqladmin flush-hosts pour vider le cache interne des DNS. See Section 7.5.6, Comment MySQL utilise le DNS . Les autres solutions sont : Essayez de trouver le problme avec votre serveur DNS et corrigez le. Spcifiez les IP la place des noms d'htes dans les tables de droits de MySQL. Ajoutez une ligne pour le nom de votre machine dans /etc/hosts. Dmarrez mysqld avec --skip-name-resolve. Dmarrez mysqld avec --skip-host-cache. Sous Unix, si vous utilisez le serveur et le client sur la mme machine, connectez vous localhost. Les connexions Unix localhost utilisent une socket Unix plutt que TCP/IP. Sous Windows, si vous excutez le serveur et le client sur la mme machine, et que le serveur supporte les pipes nomms, connectez vous l'hte . (point). Les connexions . utilisent les pipes nomms plutt que TCP/IP. 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'hte dans la table user. Un problme commun ici est que la valeur Host dans la table user spcifie un nom d'hte non-qualifi, mais que vos routines systme de rsolution de noms retournent un nom de domaine pleinement qualifi (ou vice-versa). Par exemple, si vous avez une entre avec l'hte 'tcx' dans la table user, mais que vos DNS disent MySQL que votre nom d'hte est 'tcx.subnet.se', l'entre ne fonctionnera pas. Essayez d'ajouter une entre dans la table user qui contient votre adresse IP en tant que valeur de la colonne Host. (Une alternative est
275
d'ajouter une entre dans la table user avec une valeur de Host qui contient un caractre spcial, par exemple, 'tcx.%'. Toutefois, l'utilisation des noms d'htes se terminant par % est non-scuris et n'est pas recommand !) Si mysql -u utilisateur test fonctionne mais que mysql -u utilisateur autre_base ne fonctionne pas, vous n'avez pas d'entre pour autre_base liste 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 liste dans la table user ou db. Si vous n'arrivez pas trouver pourquoi vous obtenez l'erreur Access denied, effacez toutes les entres de la table user dont la valeur du champ Host contiennent des caractres spciaux (entres contenant % ou _). Une erreur commune est d'insrer une nouvelle entre avec Host='%' et User='un utilisateur', en pensant que cela vous permettra de spcifier localhost pour vous connecter partir de la mme machine. La raison pour laquelle cela ne fonctionnera pas est que les droits par dfaut incluent une entre avec Host='localhost' et User=''. Puisque cette entre possde une valeur de Host gale 'localhost', qui est plus spcifique que '%', elle est utilise de prfrence la nouvelle entre lors de la connexion partir de localhost ! La procdure correcte est d'insrer une seconde entre avec Host='localhost' et User='un_utilisateur', ou de supprimer l'entre avec Host='localhost' et User=''. Si vous avez l'erreur suivante, vous avez peut-tre un problme avec la table db ou host :
Access to database denied
Si l'entre slectionne dans la table db possde un champ Host vide, assurez-vous qu'il y a au moins une entre correspondante dans la table host spcifiant les htes auxquels l'entre 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 entre dans la table user ne possde probablement pas les droits de FILE. Si vous apportez des modifications aux tables de droits directement (en utilisant une requte INSERT ou UPDATE) et que vos changements semblent ignors, souvenez vous que vous devez excuter une requte 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 dmarrage du serveur. Souvenez-vous qu'aprs avoir choisi le mot de passe root avec une commande UPDATE, vous n'aurez pas le spcifier avant de recharger les privilges, car le serveur ne sait pas que vous l'avez modifi ! Si vos droits changent en milieu de session, c'est peut tre qu'un administrateur MySQL a chang les droits. En rechargeant les tables de droits, il a modifi aussi les connexions existantes, comme indiqu dans Section 5.5.7, Quand les modifications de privilges prennent-ils effets ? . Si vous avez des problmes d'accs 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 problme 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 spcifier le mot de passe. Si vous utilisez l'option -p toute seule, MySQL vous demandera le mot de passe.) Pour les tests, dmarrez le dmon mysqld avec l'option --skip-grant-tables. Vous pourrez alors changer les tables de droits MySQL puis utiliser le script mysqlaccess pour vrifier si vos changements ont l'effet dsir. Lorsque vous tes satisfait de vos modifications, excutez mysqladmin flush-privileges pour dire au serveur mysqld de commencer utiliser les nouvelles tables de droits. Recharger les tables de droits crase l'option --skip-grant-tables. Cela vous permet de dire au serveur de commencer prendre en considration les droits sans avoir le couper et le redmarrer.
276
Si rien ne fonctionne, dmarrez le dmon mysqld avec l'option de dbogage (par exemple, -debug=d,general,query). Cela affichera l'hte et les informations de l'utilisateur pour chaque tentative de connexion. Les informations propos de chaque commande excute seront aussi affiches. See Section D.1.2, Crer un fichier de traage . Si vous avez d'autres problmes avec les tables de droits de MySQL et que vous sentez que vous devez envoyer le problme la liste de diffusion, fournissez toujours le contenu de vos tables de droits. Vous pouvez obtenir les donnes avec la commande mysqldump mysql. Comme toujours, postez votre problme l'aide du script mysqlbug. See Section 1.4.1.3, Comment rapporter un bogue ou un problme . Dans certains cas, vous aurez besoin de redmarrer mysqld avec -skip-grant-tables pour pouvoir excuter mysqldump.
La discussion suivante dcrit les diffrences entre les mcanismes de mots de paase, et ce que vous devez faire pour mettre jour votre serveur en version 4.1, tout en conservant la compatibilit avec les clients pre-4.1. Note : Cette discussion compare les comportements des versions 4.1 avec les versions d'avant (dites pre-4.1), mais le comportement 4.1 ne commence en ralit qu'avec la version 4.1.1. MySQL 4.1.0 est une version ``marginale'' car elle a un mcanisme lgrement diffrent de celui qui est implment en versions 4.1.1 et plus rcent. Les diffrences entre les versions 4.1.0 et les versions plus rcentes sont dcrites ultrieurement. Avant MySQL 4.1, les hashes calculs par PASSWORD() taient longs de 16 octets. Des hashes ressemblait ceci :
mysql> SELECT PASSWORD('mypass'); +--------------------+
277
La colonne Password de la table user, dans laquelle les hash de mot de passes sont stocks, faisait 16 octets de long, avant MySQL 4.1. Depuis MySQL 4.1, la fonction PASSWORD() a t modifie, pour produire une valeur de 41 octets, comme ceci :
mysql> SELECT PASSWORD('mypass'); +-----------------------------------------------+ | PASSWORD('mypass') | +-----------------------------------------------+ | *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 | +-----------------------------------------------+
La colonne Password de la table user a t aggrandie pour faire dsormais 41 octets de long : Si vous faites une nouvelle installation de MySQL 4.1, la colonne Password fera automatiquement 41 octets. Si vous mettez jour une ancienne installation, il est recommand d'utiliser le script mysql_fix_privilege_tables pour mettre jour la taille de la colonne Password, de 16 41 octets. Le script ne modifie pas les valeurs elles-mmes, qui restent 16 octets de long. Une colonne Password largie peut stocker les mots de passe dans les deux formats, ancien et nouveau. Le format d'un hash de mot de passe peut tre dterminer de deux manires : La diffrence principale et vidente est la taille : 16 octets et 41 octets. La seconde diffrence est que les hashs au nouveau format commencent par le caractre *, alors que l'ancien format ne le fait pas. Plus le hash du mot de passe est long, meilleure sont ses caractristiques de chiffrement, et l'identification des client, base sur des hash longs, est plus scuritaire que l'ancienne mthode, dont les hashs sont plus courts. La diffrence de taille entre les mots de passe est utile lors de l'utilisation des mots de passe, pour l'identification, et lors de la gnration des hashs pour la modification des mots de passe, sur le client. La faon de traiter le hash de mot de passe durant la phase d'identification diffre, en fonction de la taille de la colonne Password : Si la colonne est troite, l'identification par hash court sera utilise. Si la colonne est large, elle peut contenir des hashs longs ou courts, et le serveur peut utiliser l'un ou l'autre des formats : Les clients pre-4.1 peuvent se connecter, car ils connaissent l'ancien mcanisme de hashing, et ils peuvent s'identifier pour les comptes qui ont des mots de passe court. Les clients 4.1 peuvent s'identifier pour les comptes qui ont des hash longs ou courts. Pour les comptes hash court, l'identification est un peut plus scuritaire pour les clients 4.1 que pour les anciens clients. En terme de scurit, le gradient de scurit du plus faible au meilleur est : Les clients pre-4.1 s'identifiant avec un hash court Les clients 4.1 s'identifiant avec un hash court Les clients 4.1 s'identifiant avec un hash long
278
La mthode de gnration des hashs de mots de passe pour les clients connects est aussi affecte par la taille de la colonne Password, et par l'option --old-passwords. Un serveur 4.1 gnre des hashs longs sous certaines conditions : La colonne Password doit tre assez grande pour acceuillir un hash de mot de passe long, et l'option --old-passwords doit tre inactive. Ces conditions s'appliquent comme suit : La colonne Password doit tre assez grande pour acceuillir des hashs de mot de passe longs (41 octets). Si la colonne n'a pas t mise jour, et qu'elle a toujours la taille de 16 octets, le serveur le remarque, et gnrera des hashs de mots de passe courts lorsque le client va modifier son mot de passe avec PASSWORD(), GRANT ou SET PASSWORD. Ce comportement survient si vous avez mis jour le serveur en version 4.1, mais omis d'utiliser le script mysql_fix_privilege_tables pour largir la colonne Password. Si la colonne Password est suffisamment grande, elle peut stocker un mot de passe long ou court. Dans ce cas, PASSWORD(), GRANT et SET PASSWORD vont gnrer des hashs longs, moins que le serveur n'ait t lanc avec l'option --old-passwords. Cette option force le serveur utiliser les hashs courts. Le but de l'option --old-passwords est d'assurer la compatibilit ascendante avec les clients pre-4.1 clients dans certaines circonstances o le serveur aurait gnr des hashs longs. Cela n'affecte pas l'identification, puisque les clients 4.1 peuvent continuer utiliser les comptes avec des hashs longs, mias cela empche la cration de hash longs dans la table user, lors de la modification de mots de passe. Si cela arrive, le compte me pourra plus tre utilis avec les clients pre-4.1. Sans l'option -old-passwords le scnario suivant est possible : Un ancient client se connecter sur un compte, avec un hash court. Le client change le mot de passe. Sans l'option --old-passwords, cela conduit la cration d'un hash long. Lors de la prochaine connexion, le client pre-4.1 ne peut plus se connecter, car le compte requiert dsormais le nouveau mcanisme d'identification. Une fois que le hash long est dans la table user, seuls les clients 4.1 peuvent l'utiliser, car les clients pre-4.1 ne le comprennent pas. Ce scnario montre combien il est dangeureux d'utiliser un serveur 4.1 sans l'option --oldpasswords si vous devez supporter des clients pre-4.1. En utilisant l'option --old-passwords sur le serveur, les oprations de modification de mots de passe ne gnrent pas de hashs longs, et les utilisateurs ne se barreront pas l'accs par inadvertence. L'inconvnient de l'option --old-passwords est que tous les hashs que vous allez crer seront des hashs courts, mme pour les clients 4.1. Par consquent, vous perdez la scurit amliore que les hashs longs apportent. Si vous voulez crer un compte avec un hash long (par exemple, pour un client 4.1), il faudra le faire avec un serveur qui n'utilise pas l'option --old-passwords. Les scnarios suivants sont possibles avec un serveur 4.1 : Scenario 1 : Colonne Password courte dans la table user Seuls, les hashs courts peuvent tre stocks dans la colonne Password. Le serveur utilise uniquement les hashs courts pour les identifications. Pour les clients connects, la gnration de mot de passe avec PASSWORD(), GRANT ou SET PASSWORD utilise les mots de passe courts uniquement. Toute modification de compte entraine la cration d'un hash court. L'option --old-passwords peut tre utilise, mais est superflue, car la colonne Password courte impose la manipulation de hashs courts de toutes manires. Scenario 2 : colonne Password longue dans la table user; serveur sans l'option --old-passwords
279
les hashs courts et longs peuvent tre stocks dans la colonne Password. Les clients 4.1 peuvent s'identifier sur leur compte avec des hashs courts ou longs. Les clients pre-4.1 peuvent s'identifier sur leur compte avec des hashs courts. Pour les clients connects, la gnration de mot de passe avec PASSWORD(), GRANT ou SET PASSWORD utilise les mots de passe longs uniquement. Toute modification de compte entraine la cration d'un hash long. Comme indiqu prcdemment, le danger de ce scnario est qu'il est possible que les clients pre-4.1 se voient l'accs au serveur barr. Toutes les modifications du compte avec GRANT, SET PASSWORD et PASSWORD() conduisent un hash long, qui emprchera les clients pre-4.1 d'utiliser ce compte. Pour rgler ce problme, vous pouvez modifier le mot de passe d'une manire spciale. Par exemple, normalement, vous pouvez utiliser la commande SET PASSWORD comme ceci pour modifier un mot de passe :
mysql> SET PASSWORD FOR -> 'some_user'@'some_host' = PASSWORD('mypass');
Pour changer le mot de passe avec un hash court, utilisez la fonction OLD_PASSWORD() :
mysql> SET PASSWORD FOR -> 'some_user'@'some_host' = OLD_PASSWORD('mypass');
OLD_PASSWORD() est pratique pour les situations o vous voulez explicitement gnrer un hash court. Scenario 3 : colonne Password longue dans la table user; serveur avec l'option --old-passwords les hashs courts et longs peuvent tre stocks dans la colonne Password. Les clients 4.1 peuvent s'identifier sur leur compte avec des hashs courts ou longs. Notez qu'il n'est alors possible de crer des hashs longs si le serveur utilise --old-passwords). Les clients pre-4.1 peuvent s'identifier sur leur compte avec des hashs courts. Pour les clients connects, la gnration de mot de passe avec PASSWORD(), GRANT ou SET PASSWORD utilise les mots de passe courts uniquement. Toute modification de compte entraine la cration d'un hash long. Dans ce scnario, vous ne pouvez plus crer de compte avec un hash long, car --old-passwords l'empche. De mme, si vous crez un compte avec un hash long sur un serveur qui utilise l'option -old-passwords, la modification du mot de passe tant que --old-passwords est active, aura pour effet de rduire la taille du hash, et vous perdre en scurit. Les inconvnients de ces scnario sont les suivants : Scenario 1) vous ne pouvez pas tirer partie des hashs long et de leur scurit accrue. Scenario 2) Les comptes avec des mots de passe courts sont inaccessibles aux clients pre-4.1 si vous modifiez leur mot de passe sans utiliser la fonction OLD_PASSWORD(). Scenario 3) --old-passwords empche les comptes avec des hashs courts d'tre barrs, mais les oprations de modifications de mots de passe creront des hashs courts, et vous ne pourrez pas les modifier tant que --old-passwords est effective.
280
devraient pas faire cela, car PASSWORD() doit tre rserv pour grer les mots de passe de MySQL. Mais certaines applications utilisent PASSWORD() pour leurs propres objectifs. Si vous passez en version 4.1 et lancez le serveur dans certaines conditions, o il va gnrer des hashs de mots de passe longs, l'application qui utilise PASSWORD() va srement planter. Notre recommandation est d'utiliser les fonctions de chiffrement SHA1() ou MD5() pour produire des signatures. Si ce n'est pas possible, vous pouvez utiliser OLD_PASSWORD(), qui est fournie pour gnrer des hashs courts, dans l'ancien format (mais notez que OLD_PASSWORD() pourrait tre abandonn un jour aussi. Si le serveur fonctionne dans des conditions o il gnre des hashs courts, OLD_PASSWORD() est disponible comme alias de PASSWORD().
281
Les mots de passe MySQL n'ont aucun rapport avec le passeport Unix. Il n'y a pas ncessairement de connexion entre le mot de passe que vous utilisez pour vous connecter sur la machine Unix et celui que vous utilisez pour accder au serveur MySQL. MySQL chiffre les mots de passe avec un algorithme diffrent de celui qui est utilis par Unix. Reportez-vous aux descriptions des fonctions PASSWORD() et ENCRYPT() dans Section 12.8.2, Fonctions de chiffrements . Notez que mme si le mot de passe est enregistr 'brouill', connatre votre mot de passe 'brouill' est suffisant pour se connecter au serveur MySQL. Lorsque vous installez MySQL, la table de droit contient quelques comptes initiaux. Ces comptes ont des noms et droits qui sont dcrits dans Section 2.5.3, Cration des premiers droits MySQL , qui montre aussi comment donner des mots de passe. Aprs cela, vous pouvez crer, modifier ou supprimer normalement des comptes MySQL avec les commandes GRANT et REVOKE. See Section 13.5.1.3, Syntaxe de GRANT et REVOKE . Lorsque vous vous connectez un serveur MySQL avec un client en ligne de commande, vous devez spcifier le mot de passe avec l'option --password=mot-de-passe. See Section 5.5.4, Se connecter au serveur MySQL .
mysql --user=monty --password=devine nom_base
ou la version courte :
shell> mysql -u monty -pdevine nom_base
Il ne doit pas y avoir d'espace entre l'option -p et le mot de passe suivant. Les commandes incluent la valeur d'un mot de passe en ligne de commande, ce qui n'est pas scuritaire. See Section 5.6.6, Garder vos mots de passe en lieu sr . Pour viter cela, spcifiez l'option --password ou -p sans aucune valeur :
shell> mysql --user=monty --password nom_base shell> mysql -u monty -p nom_base
Le client va alors afficher une invite, et vous demander d'y saisir le mot de passe. Dans les exemples, nom_base n'est pas interprt comme un mot de passe, car il est spar de l'option prcdente par un espace. Sur certains systmes, l'appel que MySQL utilise pour demander le mot de passe va limiter automatiquement le mot de passe 8 caractres. C'est un problme avec la bibliothque systme, et non pas avec MySQL. En interne, MySQL n'a pas de limite pour la taille du mot de passe. Pour contourner le problme, modifiez la taille du mot de passe pour qu'il fasse 8 caractres ou mois, ou placez votre mot de passe dans un fichier d'options.
282
discutes dans la section Section 2.5.3, Cration des premiers droits MySQL . Cela signifie que pour effectuer des changements, vous devez tre sur la mme 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 spcifier dans les commandes mysql ci-dessous. D'abord, utilisez le programme client mysql pour vous connecter au serveur MySQL en tant qu'utilisateur root :
shell> mysql --user=root mysql
Ces commandes GRANT ajoutent trois nouveaux utilisateurs : Deux comptes de super-utilisateur qui utilisent le mot de passe 'un_mot_de_passe'. Les deux comptes ont tous les droits sur le serveur. Un des comptes, 'monty'@'localhost', peut tre utilis depuis la machine locale. L'autre depuis n'importe quel autre serveur : 'monty'@'%'. Notez que nous devons excuter une commande GRANT pour 'monty'@'localhost' et 'monty'@'%'. Si nous n'ajoutons pas l'entre avec localhost, l'entre concernant l'utilisateur anonyme pour localhost qui est cre par mysql_install_db prendra prcdence lors de la connexion partir de l'hte local, car elle a une entre plus spcifique pour la valeur du champ Host et de plus, elle vient en premier dans l'ordre de tri de la table user. Les tris de la table user sont prsents dans la section Section 5.5.5, Contrle d'accs, tape 1 : Vrification de la connexion . Un utilisateur admin qui peut se connecter depuis localhost sans mot de passe et qui a les droits administratifs RELOAD et PROCESS. Cela permet cet utilisateur d'excuter les commandes mysqladmin reload, mysqladmin refresh, et mysqladmin flush-*, ainsi que mysqladmin processlist. Aucun droit li aux bases de donnes n'est donn. Ils peuvent l'tre plus tard en utilisant d'autres instructions GRANT. Un utilisateur dummy qui peut se connecter sans mot de passe, mais seulement partir de l'hte local. Les droits globaux sont tous 'N' : le type de droit USAGE vous permet de crer un utilisateur dmuni de privilge. Il est suppos que vous lui assignerez les droits spcifiques aux bases de donnes plus tard. Vous pouvez ajouter les mmes droits d'accs aux utilisateurs en utilisant directement des requtes INSERT puis en demandant au serveur de recharger les tables de droits :
shell> mysql> -> mysql> -> mysql> -> mysql> -> mysql> mysql --user=root 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'); INSERT INTO user VALUES('%','monty',PASSWORD('un_mot_de_passe'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); INSERT INTO user SET Host='localhost',User='admin', Reload_priv='Y', Process_priv='Y'; INSERT INTO user (Host,User,Password) VALUES('localhost','dummy',''); FLUSH PRIVILEGES;
Selon votre version de MySQL, vous pouvez avoir un nombre diffrent de valeurs 'Y' plus haut (les versions antrieures la 3.22.11 possdent moins de colonnes de privilges). Pour l'utilisateur admin, la syntaxe d'INSERT tendue la plus lisible disponible depuis la version 3.22.11 est utilise. Notez que pour ajouter un super-utilisateur, vous avez juste besoin de crer une entre dans la table user avec tous les champs de droits 'Y'. Aucune entre n'est requise dans les tables db et host.
283
Les colonnes de privilges de la table user n'taient pas renseignes explicitement dans la dernire requte INSERT (pour l'utilisateur dummy), ses colonnes prennent donc la valeur par dfaut, 'N'. C'est la mme chose que ce que fait GRANT USAGE. L'exemple suivant ajoute un utilisateur custom qui peut se connecter partir des htes localhost, server.domain, et whitehouse.gov. Il ne pourra accder la base de donnes bankaccount qu' partir de localhost, la base expenses qu' partir de whitehouse.gov, et la base customer partir des trois htes. Il utilisera le mot de passe stupid pour les trois htes. Pour configurer les privilges de cet utilisateur en utilisant des commandes GRANT, excutez ce qui suit :
shell> mysql> -> -> -> mysql> -> -> -> mysql> -> -> -> mysql --user=root mysql GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO custom@localhost IDENTIFIED BY 'stupid'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO custom@whitehouse.gov IDENTIFIED BY 'stupid'; GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@'%' IDENTIFIED BY 'stupid';
Les trois comptes peuvent tre utiliss comme suit : Le premier compte a accs la base bankaccount, mais uniquement depuis l'hte local. Le second compte peut accder la base expenses, mais uniquement depuis l'hte whitehouse.gov. Le troisime compte peut accder la base customer, mais uniquement depuis l'hte server.domain. Pour rgler les permissions d'accs en modifiant directement les tables de droits, excutez ces commandes (notez l'appel FLUSH PRIVILEGES la fin) :
shell> mysql> -> mysql> -> mysql> -> mysql> -> -> -> -> mysql> -> -> -> -> mysql> -> -> -> mysql> mysql --user=root mysql INSERT INTO user (Host,User,Password) VALUES('localhost','custom',PASSWORD('stupid')); INSERT INTO user (Host,User,Password) VALUES('server.domain','custom',PASSWORD('stupid')); INSERT INTO user (Host,User,Password) VALUES('whitehouse.gov','custom',PASSWORD('stupid')); 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'); INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y'); 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'); FLUSH PRIVILEGES;
Les trois premires requtes INSERT ajoute les entres dans la table user qui permettent l'utilisateur custom se connecter partir de plusieurs htes avec le mot de passe donn, mais ne lui donnent aucun droit (tous les droits sont mis la valeur par dfaut qui est 'N'). Les trois requtes INSERT suivantes ajoutent des entres dans la table db qui autorisent custom utiliser les bases de donnes
284
bankaccount, expenses, et customer, mais seulement s'il y accde partir de l'hte spcifi. Comme d'habitude, lorsque les tables de droits sont modifies 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 accs spcifique un utilisateur partir de n'importe quelle machine d'un domaine donn, vous pouvez utiliser la commande GRANT, en utilisant % comme joker dans le nom de l'hte :
mysql> GRANT ... -> ON *.* -> TO monutilisateur@"%.mondomaine.com" -> IDENTIFIED BY 'monmotdepasse';
285
Les types de limite n'ont pas besoin d'tre tous appels avec WITH, mais ils peuvent tre appels dans n'importe quel ordre. La valeur de chaque limite doit tre un entier reprsentant le nombre autoris par heure. Si la commande GRANT n'a pas de clause WITH, les limites valent alors 0, c'est dire qu'il n'y a pas de limite. Pour configurer et changer les limites d'un compte existant, utilisez la commande GRANT USAGE au niveau global, avec ON *.*. La commande suivante modifie la limite de requtes du compte francis 100 :
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost' -> WITH MAX_QUERIES_PER_HOUR 100;
Cette commande ne touche pas aux droits du compte : elle ne modifie que les valeurs des limites. Pour supprimer une limite existante, donnez lui la valeur de 0. Par exemple, pour supprimer la limite de connexions de francis, utilisez cette commande :
mysql> GRANT USAGE ON *.* TO 'francis'@'localhost' -> WITH MAX_CONNECTIONS_PER_HOUR 0;
Le compteur d'utilisation des ressources se met en marche ds que la limite n'est pas nulle. Durant le fonctionnement du serveur, les ressources utilises sont comptes. Si le compte atteint la limite de connexions dans un intervalle d'une heure, les connexions suivantes sont rejetes, jusqu' la fin de l'heure. Similairement, si le compte atteint la limite de requte dans un intervalle d'une heure, les requtes suivantes sont sont rejetes, jusqu' la fin de l'heure. Dans tous les cas, un message appropri est affich. Le compte de ressource est fait par compte, et non pas client. Par exemple, si votre compte a une limite de requtes de 50, vous ne pouvez pas augmenter votre limite 100 en vous connectant deux fois. Les requtes issues des deux connexions seront alors comptes ensemble. Le compte courant d'utilisation peut tre remis zro, globalement, ou individuellement : Pour remettre zro les compteurs pour tous les comptes, faites un FLUSH USER_RESOURCES. Les comptes sont remis zro au moment du re-chargement des tables de droits : par exemple, avec la commande FLUSH PRIVILEGES ou la commande mysqladmin reload. Les comptes individuels peuvent tre remis zro en donnant de nouvelles limites ou changeant les droits. Pour cela, utilisez GRANT USAGE tel que dcrit prcdemment, en donnant la mme limite que celle qui est configure.
Le compte qui est remis zro par cette commande est celui pour lequel une ligne de la table user qui correspond la valeur user_name dans la colonne User et l'hte client d'o vous vous connectez dans la colonne Host. Un autre moyen pour assigner un mot de passe un compte est d'utiliser la commande SET PASSWORD :
mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');
286
Seuls les utilisateurs root ayant des accs en criture la base mysql peuvent changer les mots de passe des autres utilisateurs. Si vous n'tes pas connects en tant qu'utilisateur anonyme, vous pouvez modifier votre propre mot de passe en omettant la clause FOR :
mysql> SET PASSWORD = PASSWORD('biscuit');
Vous pouvez aussi utiliser la commande GRANT USAGE au niveau global (ON *.*) pour assigner un mot de passe sans affecter les droits du compte :
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
Mme s'il est gnralement prfrable d'assigner un mot de passe en utilisant une des mthodes prcdentes, vous pouvez aussi modifier la table user directement : Pour tablir un mot de passe lors de la cration d'un compte, fournissez une valeur la colonne Password :
shell> mysql> -> mysql> mysql -u root mysql INSERT INTO user (Host,User,Password) VALUES('%','jeffrey','biscuit'); FLUSH PRIVILEGES;
Pour changer le mot de passe d'un compte existant, utilisez la commande UPDATE pour modifier la valeur de la colonne Password :
shell> mysql> -> mysql> mysql -u root mysql UPDATE user SET Password = PASSWORD('bagel') WHERE Host = '%' AND User = 'francis'; FLUSH PRIVILEGES;
Lorsque vous assignez un mot de passe un compte avec SET PASSWORD, INSERT, ou UPDATE, vous devez utiliser la fonction PASSWORD() pour le chiffrer. La seule exception est que vous n'avez pas besoin d'utiliser PASSWORD() si le mot de passe est vide. PASSWORD() est ncessaire car la table user stocke les mots de passe sous forme chiffre, et non en texte clair. Si vous oubliez cela, vous risquez d'avoir des mots de passe de la forme :
shell> mysql> -> mysql> mysql -u root mysql INSERT INTO user (Host,User,Password) VALUES('%','jeffrey','biscuit'); FLUSH PRIVILEGES;
Le rsultat est que la valeur 'biscuit' est stocke 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 compare ce mot de passe chiffr avec sa version en clair stocke dans la table user. Cependant, la version stocke est la valeur littrale de 'biscuit', et la comparaison choue, le serveur rejette la connexion :
shell> mysql -u jeffrey -pbiscuit test Access denied
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 ncessaire. Ces commandes assureront le chiffrement de votre mot de passe pour vous, ce qui vous permet de spcifier le mot de passe de 'biscuit' comme ceci : Note : PASSWORD() n'effectue pas le chiffrement du mot de passe de la mme faon qu'Unix. See Section 5.6.1, Nom d'utilisateurs MySQL et mots de passe .
287
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: ********
Cette mthode est pratique mais peu sre, car le mot de passe est visible par les programmes systme tels que ps qui peuvent tre appel par les autres utilisateurs. Les clients MySQL remplacent gnralement les arguments de la ligne de commande par des zros durant leur initialisation, mais il y a un court instant o la valeur est visible. Utilisez les options -p ou --password sans valeur de mot de passe. Dans ce cas, le client va solliciter explicitement le mot de passe du terminal :
shell> mysql -u francis Enter password: ********
Les caractres * reprsentent votre mot de passe. Le mot de passe n'est pas affich en clair lors de votre saisie. Cette mthode est bien plus sre pour saisir votre mot de passe qu'en le spcifiant directement en ligne de commande, car il n'est pas visible des autres utilisateurs. Cependant, cette mthode n'est possible qu'avec les programmes que vous utilisez en mode interactif. Si vous voulez invoquer le client depuis un script qui s'excute de manire non interactive, il n'y aura pas d'opportunit pour saisir ce mot de passe dans le terminal. Sur certains systmes, vous pourriez mme voir la premire ligne de votre script lue et interprte 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 .my.cnf dans votre dossier personnel :
[client] password=mot_de_passe
Si vous stockez ce mot de passe dans le fichier .my.cnf, le fichier ne doit pas tre lisible par le groupe ou par les autres utilisateurs, ou encore accessible en criture : seul le propritaire de ce fichier doit avoir ces droits. Assurez-vous les droits d'accs au fichiers sont 400 ou 600. Par exemple :
shell> chmod 600 .my.cnf
Section 4.3.2, Fichier d'options my.cnf prsente les options pour plus de dtail.s Vous pouvez stocker votre mot de passe dans la variable d'environnement MYSQL_PWD, mais cette mthode doit tre considre comme extrmement peu sre, et doit tre vite 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. Mme sur les systmes sans une telle version de la commande ps, il est peu recommand de supposer que les variables d'environnement sont inaccessibles par une mthode quelconque. See Annexe E, Variables d'environnement. En conclusion, la mthode la plus sre est encore de laisser le client vous demander le mot de passe, ou de le spcifier dans le fichier de configuration.
288
modifier les donnes qui transitent entre le client et le serveur. Parfois, vous aurez besoin d'changer des informations sur un rseau public, mais en scurisant ces informations. Dans ce cas, utiliser une connexion sans protection est inacceptable. SSL est un protocole qui utilise diffrents algorithmes de chiffrement pour s'assurer que les donnes qui transitent par un rseau public peuvent tre considres comme fiables. Ce protocole dispose de mthodes pour s'assurer que les donnes n'ont pas t modifies, ce que soit par une altration, une perte ou une rptition des donnes. SSL inclut aussi des algorithmes pour reconnatre et fournit des outils de vrifications d'identit, pris en charge par le standard X509. Le chiffrement est une mthode pour rendre des donnes illisibles. En fait, les pratiques actuelles requirent d'autres lments de scurit issus des algorithmes de chiffrement. Ils doivent savoir rsister de nombreux types d'attaque, comme la modification de l'ordre des messages ou les rptitions inopines. X509 est un standard qui rend possible l'identification d'une personne sur l'internet. Il est particulirement utilis pour les applications e-commerce. En termes simples, il doit y avoir une entreprise (appele l'``autorit de certification'') qui assigne un certificat lectronique toute personne qui en a besoin. Ces certificats utilisent un chiffrement assymtrique qui exploitent deux cls de chiffrement, une cl publique et une cl prive. Le propritaire d'un certificat peut prouver son identit en montrant son certificat l'autre partie. Un certificat est constitu de la cl publique du propritaire. Toute donne qui est chiffre avec cette cl publique doit tre dchiffre avec la cl secrte correspondante, qui est dtenue par le propritaire du certificat. MySQL n'utilise pas les connexions chiffres par dfaut, car cela ralentit considrablement le protocole de communication. Toute fonctionnalit supplmentaire requiert du travail supplmentaire de la part du serveur, et chiffrer des donnes est une tche particulirement coteuse, qui peut ralentir considrablement les tches principales de MySQL. Par dfaut, MySQL est paramtr 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 prfr sur Internet, et utilisez ces mots cls pour avoir plus de dtails.
289
# # Cration des cl et requtes serveur # openssl req -new -keyout $DIR/server-key.pem -out \ $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf # # # # # # # # # # # # # # # # # # Exemple de rsultat : Using configuration from /home/monty/openssl/openssl.cnf Generating a 1024 bit RSA private key ..++++++ ..........++++++ writing new private key to '/home/monty/openssl/server-key.pem' Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:FI State or Province Name (full name) [Some-State]:.
290
# # # # # # # # # #
Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:MySQL server Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
# # Supprimez la passe-phrase de la cl (optionnel) # openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem # # Signez le certificat serveur # openssl ca -policy policy_anything -out $DIR/server-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/server-req.pem # # # # # # # # # # # # # # # # Exemple de rsultat : Using configuration from /home/monty/openssl/openssl.cnf Enter PEM pass phrase: Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'FI' organizationName :PRINTABLE:'MySQL AB' commonName :PRINTABLE:'MySQL admin' Certificate is to be certified until Sep 13 14:22:46 2003 GMT (365 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
# # Crez les cl et requtes client # openssl req -new -keyout $DIR/client-key.pem -out \ $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf # # # # # # # # # # # # # # # # # # # # # # # # # # Exemple de rsultat : Using configuration from /home/monty/openssl/openssl.cnf Generating a 1024 bit RSA private key .....................................++++++ .............................................++++++ writing new private key to '/home/monty/openssl/client-key.pem' Enter PEM pass phrase: Verifying password - Enter PEM pass phrase: ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:FI State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:MySQL user Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request
291
# A challenge password []: # An optional company name []: # # Supprimez la passe-phrase de la cl (optionnel) # openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem # # Signez le cerficat client # openssl ca -policy policy_anything -out $DIR/client-cert.pem \ -config $DIR/openssl.cnf -infiles $DIR/client-req.pem # # # # # # # # # # # # # # # # Exemple de rsultat : Using configuration from /home/monty/openssl/openssl.cnf Enter PEM pass phrase: Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'FI' organizationName :PRINTABLE:'MySQL AB' commonName :PRINTABLE:'MySQL user' Certificate is to be certified until Sep 13 16:45:17 2003 GMT (365 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
# # Crez le fichier my.cnf que vous pourrez utiliser pour tester les diffrents certificats # cnf="" cnf="$cnf [client]" cnf="$cnf ssl-ca=$DIR/cacert.pem" cnf="$cnf ssl-cert=$DIR/client-cert.pem" cnf="$cnf ssl-key=$DIR/client-key.pem" cnf="$cnf [mysqld]" cnf="$cnf ssl-ca=$DIR/cacert.pem" cnf="$cnf ssl-cert=$DIR/server-cert.pem" cnf="$cnf ssl-key=$DIR/server-key.pem" echo $cnf | replace " " ' ' > $DIR/my.cnf # # To test MySQL mysqld --defaults-file=$DIR/my.cnf & mysql --defaults-file=$DIR/my.cnf
Pour tester les connexions SSL, lancez le serveur comme ceci, o $DIR est le dossier o le fichier de configuration my.cnf est situ :
shell> mysqld --defaults-file=$DIR/my.cnf &
Si vous avez une distribution source MySQL, vous pouvez aussi tester votre configuration en modifiant le fichier my.cnf prcdent, pour utiliser les certificats et fichiers de cl SSL de la distribution.
292
d'adresse IP, nom de base de donnes, nom de table). See Section 13.5.1.3, Syntaxe de GRANT et REVOKE . Voici diffrentes possibilits pour limiter les connexions : Sans aucune option SSL ou X509, toutes les connexions chiffres ou non chiffres sont autorises si le nom d'utilisateur et le mot de passe sont valides. L'option REQUIRE SSL requiert que les connexions soient chiffres 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 mme est de peu d'importance. La seule restriction est qu'il doit tre possible de vrifier la signature avec une des autorits 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 prsenter avec un certificat X509 valide, mis par l' autorit de certification "issuer". 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@mysql.com";
REQUIRE SUBJECT "subject" impose au client d'avoir un certificat X509 valide, avec le sujet "subject". Si le client prsente un certificat valide, mais que le "subject" est diffrent, la connexion est refuse.
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@mysql.com";
REQUIRE CIPHER "cipher" est utilis pour s'assurer que les chiffrements sont suffisamment robuste, et que la bonne longueur de cl est utilise. SSL lui mme peut tre faible si des algorithmes sont utiliss avec des cls courtes. En utilisant cette option, il est possible d'imposer la mthode 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 combines 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@mysql.com" AND ISSUER "C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com" 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 spcifie deux fois.
293
La table suivante liste les diffrentes options que vous pouvez utiliser avec SSL, les fichiers de certificats et de cls. Ces options sont disponibles depuis MySQL 4.0. Elles peuvent tre spcifies en ligne de commande ou bien dans le fichier d'options. --ssl Pour le serveur, indique que le serveur autorise les connexions SSL. Pour le client, permet au logiciel de se connecter au serveur en utilisant le protocole SSL. Cette option seule n'est pas suffisante pour que la connexion soit scurise par SSL. Vous devez aussi spcifier les options -ssl-ca, --ssl-cert et --ssl-key. Cette option est plus souvent utilise que sa forme contraire, pour indiquer que SSL ne doit pas tre utilis. Pour cela, spcifiez l'option sous la forme --skip-ssl ou --ssl=0. Notez que cette option ne requiert pas de connexion SSL. Par exemple, si le serveur ou le client sont compils sans le support SSL, une connexion sans chiffrement sera utilise. Une mthode pour s'assurer que la connexion sera bien scurise par SSL est de crer un compte sur le serveur, avec l'option REQUIRE SSL dans la commande GRANT. Utilisez alors ce compte pour vous connecter au serveur, avec le serveur et le client qui disposent du support SSL. Vous pouvez utiliser cette option pour indiquer que la connexion ne doit pas tre SSL. Pour faire cela, spcifiez l'option --skip-ssl ou --ssl=0. --ssl-ca=file_name Le chemin jusqu'au fichier avec une liste des autorits de certifications SSL connues. --ssl-capath=directory_name Le chemin jusqu'au dossier qui contient les certificats SSL au format PEM. --ssl-cert=file_name Le nom du fichier de certificat SSL utiliser pour tablir une connexion scurise. --ssl-cipher=cipher_list Une liste de chiffrements autorises, utiliser avec SSL. cipher_list a le mme format que la commande openssl ciphers. Exemple : --ssl-cipher=ALL:-AES:-EXP --ssl-key=file_name Le nom du fichier de la cl SSL a utiliser pour tablir une connexion scurise.
Configurez le forward de port. Faites soit un forward distant (spcifiez local_port: 3306, remote_host: yourmysqlservername_or_ip, remote_port: 3306 ) soit un forward local (spcifiez 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 crer. Sous votre machine Windows, dmarrez une application ODBC (comme Access). Crez un nouveau fichier dans Windows et reliez le avec MySQL en utilisant le pilote ODBC de la mme faon que vous le feriez habituellement, hormis le fait que vous devrez taper localhost comme hte serveur au lieu de yourmysqlservername. Vous avez maintenant une connexion ODBC avec un serveur MySQL distant, et scurise avec SSH.
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 mthode. 2. Arrtez mysqld si il est en marche, puis dmarrez le avec l'option --logupdate[=nom_fichier]. See Section 5.9.3, Le log de modification . Le ou les fichiers de log fournissent les informations dont vous avez besoin pour rpliquer les modifications de la base de donnes qui sont subsquents au moment o vous avez excut mysqldump.
Si votre serveur MySQL est un esclave, quelque soit la sauvegarde que vous utilisez, lorsque vous sauvez vos donnes sur votre esclave, vous devez aussi sauver les fichiers master.info et relaylog.info, qui sont ncessaires pour relancer la rplication aprs la restauration des donnes de l'esclave. Si votre esclave doit traiter des commandes LOAD DATA INFILE, vous devez aussi sauver
295
les fichiers nomms SQL_LOAD-*, qui sont dans le dossier spcifi par --slave-load-tmpdir. Ce dossier vaut par dfaut la valeur de la variable tmpdir, si elle n'est pas spcifie. L'esclave aura besoin de ces fichiers pour relancer la rplication d'une opration LOAD DATA INFILE interrompue. Si vous avez besoin de restaurer quelque chose, essayez d'abord de restaurer vos tables avec REPAIR TABLE ou myisamchk -r en premier. Cela devrait fonctionner dans 99.9% des cas. Si myisamchk ne russi pas, essayez la procdure suivante (cela ne fonctionnera que si vous avez dmarr MySQL avec --log-update, Section 5.9.4, Le log binaire ) : 1. Restaurez la sauvegarde originale de mysqldump. 2. Excutez la commande suivante pour remettre en marche les mises jour dans le log binaire :
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
Dans votre cas, vous voudrez peut-tre n'excuter que certains logs binaires, depuis certaines positions : par exemple, depuis la date de la sauvegarde que vous avez restaur, hormis quelques requtes problmatiques. Voyez Section 8.5, mysqlbinlog, Excuter des requtes dans le log binaire pour plus d'informations sur l'utilitaire mysqlbinlog, et comment l'utiliser. Si vous utilisez le journal des mises jour (qui a t supprim en MySQL 5.0.0) vous pouvez utiliser :
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
ls est utilise pour avoir tous les fichiers de mise jour dans le bon ordre. Vous pouvez aussi faire des sauvegardes slectives de fichiers individuels : Exportez la table avec SELECT * INTO OUTFILE 'nom_fichier' FROM nom_de_table Restaurez avec LOAD DATA INFILE 'nom_fichier' REPLACE .... Pour viter les lignes dupliques, vous aurez besoin d'une PRIMARY KEY ou une clef UNIQUE dans la table. Le mot clef REPLACE fait que les anciens enregistrements sont remplacs par les nouveaux lorsque l'un d'eux duplique un ancien sur une valeur de clef unique. Si vous obtenez des problmes de performances sur votre systme, vous pouvez les contourner en mettant en place une rplication et faisant les copies sur l'esclave au lieu du matre. See Section 6.1, Introduction la rplication . Si vous utilisez un systme de fichiers Veritas , vous pourrez faire : 1. A partir d'un client (ou de Perl), excutez : FLUSH TABLES WITH READ LOCK. 2. A partir d'un autre Shell, excutez : mount vxfs snapshot. 3. Depuis le premier client, excutez : UNLOCK TABLES. 4. Copiez les fichiers partir de la sauvegarde. 5. Dmontez snapshot.
296
Problme matriel : disque dur, carte mre, etc. Les instructions suivantes requirent l'utilisation de la version minimale de MySQL 4.1.8, car certaines options de mysqldump utilises ici ne sont pas disponibles dans les prcdentes versions. Les commandes d'exemples n'inclut pas les options telles que --user et --password avec les utilitaires mysqldump et mysql. Il vous faudra les ajouter en fonction des besoins, pour que MySQL puisse se connecter au serveur. Nous considrerons les donnes stockes dans une table de moteur InnoDB, qui supporte les transaction et la restauration automatique. Nous supposerons que le serveur MySQL est en charge au moment de la panne. Si ce n'est pas le cas, aucune restauration ne sera ncessaire. Dans les cas de panne du systme d'exploitation ou de l'alimentation lectrique, on peut supposer que les disques de donnes MySQL sont toujours disponibles aprs un redmarrage. Les fichiers de donnes InnoDB sont analyss, et partir des logs, on peut retrouver la liste des transactions archives et non-archives, qui n'ont pas encore t crites sur le disque. Le moteur de table va alors annuler automatiquement les transactions qui n'ont pas t termines. Le dtail des oprations du processus de restauration est fourni l'administrateur dans le fichier de log d'erreur de MySQL. Voici un extrait :
InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: ... InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: mysqld: Database was not shut down normally. Starting recovery from log files... Starting log scan based on checkpoint at log sequence number 0 13674004 Doing recovery: scanned up to log sequence Doing recovery: scanned up to log sequence Doing recovery: scanned up to log sequence Doing recovery: scanned up to log sequence
0 0 0 0
Doing recovery: scanned up to log sequence number 0 20555264 Doing recovery: scanned up to log sequence number 0 20620800 Doing recovery: scanned up to log sequence number 0 20664692 1 uncommitted transaction(s) which must be rolled back Starting rollback of uncommitted transactions Rolling back trx no 16745 Rolling back of trx no 16745 completed Rollback of uncommitted transactions completed Starting an apply batch of log records to the database... Apply batch completed Started ready for connections
Dans le cas d'une panne du systme de fichiers ou du matriel, nous pouvons supposer que les donnes MySQL ne sont plus disponibles aprs le redmarrage. Cela signifie que MySQL ne pourra pas dmarrer correctement, car certains blocs de donnes ne seront plus lisibles. Dans ce cas, il est ncessaire de formatter le disque, d'en installer un nouveau ou bien de corriger le problme sousjacent. Puis, il faut restaurer les donnes partir des sauvegardes : cela signifie que nous devons avoir dj fait des sauvegardes. Pour s'assurer que c'est le cas, voyons comment se droule un processus de sauvegarde.
297
C'est un outil de sauvegarde en ligne, non-bloquant, qui ne perturbe pas les oprations sur les tables. Nous avons suppos plus haut que nos tables utilisent le moteur InnoDB : l'option --singletransaction utilise une lecture cohrente, et garantit la stabilit des donnes prleves par mysqldump. Les modifications peuvent tre fates par d'autres clients sur les tables InnoDB sans que la commande mysqldump ne le peroive. Si nous avons d'autres types de tables, nous devons aussi supposer qu'elles ne changeront pas durant la sauvegarde. Par exemple, pour une table MyISAM dans la base mysql, nous devons supposer qu'aucun administrateur ne fera de modification aux comptes MySQL durant la sauvegarde. Le fichier .sql rsultant, produit par mysqldump contient les commandes SQL INSERT qui peuvent tre utilises pour recharger les tables ultrieurement. Les sauvegardes compltes sont ncessaires, mais elles ne sont pas toujours pratiques. Elles produisent de trs grands fichiers de donnes, et prennent du temps s'excuter. Elles ne sont pas optimales, car chaque sauvegarde inclut toutes les donnes, mme celles qui n'ont pas volu entre deux sauvegardes. Une fois qu'une sauvegarde initiale a t faite, les sauvegardes incrmentales sont bien plus optimales : elles gnrent des fichiers plus petits, et sont plus rapides raliser. L'inconvnient est que cette sauvegarde ne vous permettra pas de restaurer toutes vos donnes partir de la sauvegarde complte : il vous faudra utiliser les sauvegardes incrmentales pour restaurer totalement votre base. Pour raliser des sauvegardes incrmentales, vous devez sauver les modifications incrmentales. Le serveur MySQL doit tre lanc avec l'option --log-bin pour qu'il puisse stocker ces modifications au fur et mesure des modifications des donnes. Cette option active le log binaire, ce qui fait que chaque commande qui modifie les donnes est enregistr dans un fichier appel le log binaire. Voyons le dossier de donnes de MySQL, une fois qu'il a t lanc avec l'option --log-bin. Nous y trouverons les fichiers suivants :
-rw-rw----rw-rw----rw-rw----rw-rw----rw-rw----rw-rw----rw-rw---1 1 1 1 1 1 1 guilhem guilhem guilhem guilhem guilhem guilhem guilhem guilhem 1277324 Nov 10 guilhem 4 Nov 10 guilhem 79 Nov 11 guilhem 508 Nov 11 guilhem 220047446 Nov 12 guilhem 998412 Nov 14 guilhem 361 Nov 14 23:59 23:59 11:06 11:08 16:47 10:08 10:07 gbichot2-bin.000001 gbichot2-bin.000002 gbichot2-bin.000003 gbichot2-bin.000004 gbichot2-bin.000005 gbichot2-bin.000006 gbichot2-bin.index
A chaque fois que le serveur redmarre, MySQL cre un nouveau fichier de log binaires, en utilisant le numro de squence suivant. Lorsque le serveur fonctionne, vous pouvez aussi lui dire de clore le fichier de log, et d'en ouvrir un nouveau avec la commande SQL FLUSH LOGS ou bien avec la commande en ligne mysqladmin flush-logs. La commande mysqldump dispose aussi d'une option pour clore les fichiers de logs. Le fichier .index contient la liste de tous les fichiers de logs binaire du dossier de donnes. Ce fichier est utilis durant les oprations de rplication. Les fichiers de log binaires MySQL sont importants lors de restauration, car ils reprsentent des sauvegardes incrmentales. Si vous vous assurez de bien refermer les fichiers de log binaire lorsque vous ralisez une sauvegarde complte, alors les fichiers de log binaires qui ont t crs aprs votre sauvegarde reprsente les modifications incrmentales de vos donnes. Maintenant, modifions la commande mysqldump pour qu'elle referme les logs binaires lors de sauvegarde complte, et que le fichier de sauvegarde contienne les noms des nouveaux fichiers de logs :
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > backup_sunday_1_PM.sql
Aprs avoir excut cette commande, le dossier de donnes contient un nouveau fichier de log binaire, gbichot2-bin.000007. Le fichier .sql rsultant contient les lignes suivantes :
-- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='gbichot2-bin.000007',MASTER_LOG_POS=4;
Comme la commande mysqldump a fait une sauvegarde complte, ces lignes signifie deux choses : Le fichier .sql contient toutes les modifications effectues sur les donnes avant le fichier appel gbichot2-bin.000007, ou plus rcent.
298
Toutes les modifications des donnes effectes aprs la sauvegarde ne sont pas enregistres dans le fichier .sql, mais sont prsentes dans le fichier de log binaire gbichot2-bin.000007. Le lundi, une heure du matin, nous pouvons crer une sauvegarde incrmentale en refermant les fichiers de log binaire, et en crant un nouveau fichier de log. Par exemple, la commande mysqladmin flush-logs cre un fichier gbichot2-bin.000008. Toutes les modifications qui ont eu lieu entre dimanche, 1 heure et lundi, 1 heure sont stockes dans le fichier gbichot2bin.000007. Cette sauvegarde incrmentale est importante, et il est recommand de la stocker dans un endroit sr. Par exemple, copiez la sur une cassette ou un DVD, ou mme sur une autre machine. Le mardi, 1 heure, vous pouvez excuter nouveau la commande mysqladmin flush-logs. Toutes les oprations effectues entre lundi, 1 heure et mardi, 1 heure sont dans le fichier gbichot2bin.000008, qui doit tre mis en scurit. Les logs binaires MySQL occupent de l'espace disque sur le serveur. Pour rcuprer cet espace, supprimez-le de temps en temps. Pour le faire en toute scurit, supprimez simplement les fichiers qui ne servent plus rien, c'est dire ceux qui sont antrieurs la dernire sauvegarde complte :
shell> mysqldump --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > backup_sunday_1_PM.sql
Note : effacer les logs binaires avec la commande mysqldump --delete-master-logs peut tre dangereux, car si le serveur est un matre de rplication, les esclaves pourraient ne pas avoir traits en totalit le contenu des logs binaires. La description de la commande PURGE MASTER LOGS explique ce qui doit tre vrifi avant d'effacer un fichier de log binaire. See Section 13.6.1.1, PURGE MASTER LOGS .
Aprs cela, les donnes sont celles que nous avions dimanche, 1 heure. Pour appliquer les modifications qui ont eu lieu depuis cette date, nous devons utiliser les sauvegardes incrmentales, c'est dire les fichiers de log binaire gbichot2-bin.000007 et gbichot2-bin.000008. Retrouvez-les dans vos documents de sauvegarde, puis, excutez-les de cette manire :
shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql
Nous avons maintenant retrouv les donnes dans leur tat de mardi, 1 heure, mais il manque encore les donnes entre cette date et le crash. Pour ne pas les avoir perdu, il faut que les logs aient t sauvs dans un volume scuris (disque RAID, SAN, ...), sur un serveur diffrent de celui qui a crash : tout cela pour que le serveur n'ait pas dtruit les logs durant le crash. Pour cela, nous pouvons lancer le serveur avec l'option --log-bin, et spcifier un chemin sur un volume physique spar. De cette manire, les logs ne seront pas perdus, mme si le dossier contenant les donnes est perdu. Si nous pouvons retrouver ces fichiers de log, nous aurons un fichier appel gbichot2-bin.000009 et nous pouvons l'appliquer aux donnes pour obtenir l'tat le plus proche du moment du crash.
299
Fates des sauvegardes periodiques, en utilisant la commande mysqldump pour raliser des sauvegardes non-bloquantes. Faites des sauvegardes incrmentales priodiques, en vidant les logs sur le disque, avec la commande SQL FLUSH LOGS ou la commande en ligne mysqladmin flush-logs.
Les options spcifient ce que vous voulez que myisamchk fasse. Elles sont dcrites dans ce chapitre. Vous pouvez aussi obtenir une liste d'options en invoquant le programme avec myisamchk --help. Sans option, myisamchk va simplement vrifier les tables. Pour obtenir plus d'information ou pour demander myisamchk de prendre des mesures correctives, il faut ajouter l'une des options listes ici. tbl_name est la table que vous voulez rparer ou vrifier. Si vous excutez myisamchk autre part que dans le dossier de donnes, vous devez spcifier le chemin jusqu'au fichier, car sinon,
300
myisamchk n'aura aucune ide d'o chercher les donnes dans votre base. En fait, myisamchk ne se proccupe pas du fait que le fichier que vous utilisez est dans le dossier de base ou pas : vous pouvez copier le fichier rparer dans un autre dossier, et y faire les oprations d'entretien. Vous pouvez spcifier plusieurs noms de tables myisamchk si vous le voulez. Vous pouvez aussi spcifier un nom sous la forme d'un fichier d'index (avec l'option .MYI), qui vous permettra de spcifier toutes les tables dans un dossier en utilisant le schma *.MYI. Par exemple, si vous tes dans le dossier de donnes, vous pouvez spcifier toutes les tables dans le dossier comme ceci :
shell> myisamchk *.MYI
Si vous n'tes pas dans le dossier de donnes, et que vous souhaitez vrifier toutes les tables, vous devez ajouter le chemin jusqu'au dossier :
shell> myisamchk /path/to/database_dir/*.MYI
Vous pouvez mme vrifier toutes les tables de toutes les bases avec le chemin suivant :
shell> myisamchk /path/to/datadir/*/*.MYI
Si vous voulez vrifier toutes les tables et rparer 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
Ces commandes ci-dessus supposent que vous avez plus de 64 Mo de libres. Pour plus d'informations sur l'allocation de mmoire avec myisamchk, voyez la section Section 5.7.3.6, Utilisation de la mmoire par myisamchk . 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 vrifier une table qui a t modifie 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 oprations avec myisamchk. En MySQL version 3.23, la meilleure mthode pour viter ce problme est d'utiliser la commande CHECK TABLE au lieu de myisamchk pour vrifier les tables.
301
Affiche le log de dbogage. La chane debug_options vaut souvent : 'd:t:o,filename'. --silent, -s Mode silencieux. Affiche uniquement les erreurs. Vous pouvez utiliser deux fois -s (-ss) pour que myisamchk soit trs silencieux. --verbose, -v Mode dtaill. Affiche plus d'informations. Vous pouvez combiner ce mode avec les options -d et e. Utilisez -v plusieurs fois, (-vv, -vvv) pour plus de dtails encore. --version, -V Affiche la version et quitte. --wait, -w Au lieu de s'arrter avec une erreur si la table est verrouill, le programme attend que la table soit libre avant de continuer. Notez que si vous utilisez mysqld avec l'option --skip-externallocking, la table peut ne peut tre verrouille que par une autre commande myisamchk. Vous pouvez aussi configurer les variables suivantes avec la syntaxe --var_name=value : Variable decode_bits ft_max_word_len ft_min_word_len ft_stopword_file key_buffer_size myisam_block_size read_buffer_size sort_buffer_size sort_key_blocks write_buffer_size Valeur par dfaut 9 dpend de la version 4 liste par dfaut 523264 1024 262136 2097144 16 262136
Il est aussi possible de configurer les variables avec les syntaxes --setvariable=var_name=value et -O var_name=value. Toutefois, cette syntaxe est obsolte depuis MySQL 4.0. Les variables myisamchk possibles et leur valeur par dfaut sont affiches par myisamchk --help : sort_buffer_size sert lors de la rparation des index par tri des cls, qui est le mode utilis par l'option --recover. key_buffer_size sert lorsque vous vrifiez une table avec l'option --extend-check ou lorsque les cls sont rpares par insertion de lignes dans la table (comme lors des insertions normales). La rparation par buffer de cls est utilise dans ces situations : Vous utilisez l'option --safe-recover. Les fichiers temporaires utiliss pour trier les cls seraient deux fois plus gros que lors de la cration directe du fichier. C'est souvent le cas lorsque vous avez de grandes cls pour les colonnes CHAR, VARCHAR et TEXT, car l'opration de trie a besoin de stocker la cl complte. Si vous avez beaucoup d'espace temporaire, vous pouvez forcer myisamchk rparer en triant, en utilisant l'option -sort-recover.
302
La rpartion par buffer de cl prend beaucoup moins d'espace disque, mais est bien plus lente. Si vous voulez une rparation plus rapide, donnez key_buffer_size et sort_buffer_size des valeurs reprsentant 25% de votre mmoire. Vous pouvez leur donner de grandes valeurs, car une seule des deux variables est utilise. myisam_block_size est la taille des blocs d'index. Elle est disponible depuis MySQL 4.0.0. Les variables ft_min_word_len et ft_max_word_len sont disponibles depuis MySQL 4.0.0. ft_stopword_file est disponible depuis MySQL 4.0.19. ft_min_word_len et ft_max_word_len indique la taille minimum et maximum pour les index FULLTEXT. ft_stopword_file est le nom du fichier de mots ignors. Ils doivent toujours tre configurs. Si vous utilisez myisamchk pour faire une opration qui modifie les index de tables (comme la rpartion ou l'analyse), les index FULLTEXT sont reconstruit en utilisant les valeurs par dfaut pour les tailles minimales et maximales, et pour le fichier de mots ignors. Cela peut conduire l'chec de requtes. Le problme survient lorsque ces paramtre ne sont connus que par le serveur. Elles ne sont pas stockes dans le fichier d'index MyISAM. Pour viter ce problme si vous avez modifi la taille des mots ou le fichier de mots ignors dans le serveur, pensez spcifier les mmes valeurs avec les options ft_min_word_len, ft_max_word_len et ft_stopword_file de myisamchk. Par exemple, si vous avez configur une taille minimale de 3, vous pourrez rparer la table avec myisamchk comme ceci :
shell> myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
Pour vous assurer que myisamchk et le serveur utilisent les mmes valeurs pour les paramtres des index en texte plein, vous pouvez placez ces valeurs dans les groupes [mysqld] et [myisamchk] du fichier d'options :
[mysqld] ft_min_word_len=3 [myisamchk] ft_min_word_len=3
Une alternative l'utilisation de myisamchk est les commandes REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE et ALTER TABLE. Ces commandes sont effectues par le serveur, qui sait comment traiter les paramtrages des index.
303
Ne vrifie que les tables qui ont chang depuis la dernire vrification. -f, --force Redmarrez myisamchk avec -r (rpare) sur la table, si myisamchk trouve une erreur dans la table. -i, --information Affiche des statistiques propos de la table vrifie. -m, --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, --update-state Enregistre le fichier .MYI lorsque la table t vrifie ou a t corrompue. 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 --skipexternal-locking. -T, --read-only Ne marque pas la table comme vrifie. C'est pratique si vous utilisez myisamchk pour vrifier une table issue d'une autre application qui n'utilise pas les verrous. (comme mysqld --skipexternal-locking).
304
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 cls utiliser, et chaque bit binaire reprsente une cl (la premire cl est le bit 0). Cela permet de raliser des insertions plus rapides. Les index dsactivs pourront tre ractivs avec l'option myisamchk -r. --no-symlinks, -l Ne pas suivre les lignes symboliques. Normalement, myisamchk rpare les tables qu'un lien symbolique reprsente. Cette option n'existe pas en MySQL 4.0, car MySQL 4.0 ne va pas supprimer les liens symboliques durant la rparation. --parallel-recover, -p Utilise la mme technique que -r et -n, mais cre les cls avec des threads diffrents, en parallle. Cette option a t ajoute en MySQL 4.0.2. Ceci est du code alpha. Utilisez le vos risques et prils! --quick, -q Rparation rapide, sans modifier le fichier de donnes. Il est possible d'ajouter l'option -q pour forcer myisamchk modifier le fichier original en cas de cls doublons. --recover, -r Peut rparer presque tout, sauf les cls uniques qui ne le sont plus (ce qui est extrmement 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 corrige avec l'option -r, vous pouvez alors passer l'option -o. Notez que dans le cas rarissime o -r, le fichier de donnes est toujours intact. Si vous avez beaucoup de mmoire, vous pouvez augmenter la taille du buffer sort_buffer_size! --safe-recover, -o Utilise une ancienne mthode de restauration (lit toutes les lignes dans l'ordre, et modifie l'arbre d'index conformment pour les lignes trouves). C'est une mthode 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 mthode utilise aussi moins d'espace disque que -r. Normalement, vous devriez commencer rparer avec l'option -r, et uniquement sur l'chec de cette option, passer -o. Si vous avez beaucoup de mmoire, vous devriez augmenter la taille du buffer de cl ! key_buffer_size! --set-character-set=name Change le jeu de caractres utilis par l'index. --sort-recover, -n Force myisamchk utiliser le tri pour rsoudre les cls, mme si le fichier temporaire doit tre norme. --tmpdir=path, -t path Chemin pour stocker les fichiers temporaires. Si cette option n'est pas fournie, myisamchk va utiliser la variable d'environnement TMPDIR pour cela. Depuis MySQL 4.1, tmpdir peut prendre une liste de chemins diffrents, qui seront utiliss successivement, pour les fichiers temporaires. Le caractre de sparation des diffrents chemins est le deux-points sous Unix (:) et le point-virgule (;) sous Windows, NetWare et OS/2. --unpack, -u
305
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 mmoire, vous pourriez facilement rencontrer des erreurs de mmoire. Si cela arrive, choisissez une autre valeur pour TMPDIR, avec plus d'espace disque, et redmarrez myisamchk. Lors de la rparation, myisamchk va aussi avoir besoin d'espace disque : Doublez la taille du fichier de donnes (l'original plus une copie). Cet espace n'est pas ncessaire si vous faites des rparations de type --quick, car dans ce cas, seul le fichier d'index sera recr. Cet espace est ncessaire sur le mme disque que l'original ! De l'espace pour le nouveau fichier d'index qui remplacera l'ancien. L'ancien fichier d'index est rduit ds le dmarrage, ce qui vous permet gnralement d'ignorer cet espace. Cet espace est ncessaire sur le mme 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 :
306
(plus_grande_cle + taille_du_pointeur_de_ligne)*nombre_de_lignes * 2
Vous pouvez vrifier la taille des cls et la taille du pointeur de ligne avec la commande myisamchk -dv table. Cet espace est allou sur le disque temporaire (spcifi par TMPDIR par -tmpdir=#). Si vous avez des problmes avec l'espace disque durant la rparation, vous pouvez utiliser l'option -safe-recover au lieu de --recover.
Chacun de ces trois fichiers est sujet des corruptions diverses, mais les problmes surviennent gnralement dans les fichiers de donnes ou d'index. myisamchk fonctionne en crant une copie du fichier .MYD (les donnes), ligne par ligne. Il termine sa rparation en supprimant l'ancien fichier .MYD et en renommant le nouveau la place de l'ancien. Si vous utilisez l'option --quick, myisamchk ne cre pas de fichier temporaire .MYD mais suppose plutt que le fichier .MYD est correct et il gnre simplement un nouveau fichier d'index sans toucher au fichier .MYD. C'est une mthode scuritaire, car myisamchk va automatiquement dtecter si le fichier .MYD est corrompu, et annulera alors la rparation 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 cls doublons), et essaie de rsoudre ce problme 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 raliser la rparation. Dans ce cas, vous devez au moins faire une copie de sauvegarde avant d'utiliser myisamchk.
307
308
= = = = = =
Record was already deleted (or record file crashed) / La ligne tait dj efface. No more room in record file / Plus de place dans le fichier de donnes. No more room in index file / Plus de place dans le fichier d'index. Duplicate unique key or constraint on write or update / Doublon pour une cl unique trouv dura Table is crashed and last repair failed / la table est corrompue et la dernire rparation a c Table was marked as crashed and should be repaired / La table a t marque comme corrompue et
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 rparer vos tables. myisamchk peut gnralement dtecter et corriger la plupart des erreurs. Le processus de rparation se droule en 4 tapes dcrites ici. Avant de vous lancer, vous devriez vous placer dans le dossier de donnes et vrifier les permissions des fichiers de donnes. Assurezvous qu'ils sont bien lisibles par l'utilisateur Unix que MySQL utilise (et vous aussi, car vous aurez besoin d'accder ces fichiers durant la vrification. Si vous devez corriger ces fichiers, vous aurez aussi besoin des droits d'criture. Si vous utilisez MySQL version 3.23.16 et plus rcent, vous pouvez (et vous devriez) utiliser les commandes CHECK et REPAIR pour rparer vos tables MyISAM. Voyez Section 13.5.2.3, Syntaxe de CHECK TABLE et Section 13.5.2.6, Syntaxe de REPAIR TABLE . La section du manuel sur l'entretien des tables inclut la prsentation des options des utilitaires isamchk/myisamchk : Section 5.7.3, Utilisation de myisamchk pour la maintenance des tables et leur recouvrement . La section suivante est destine aux cas o les commandes ci-dessus ont chou ou que vous voulez exploiter les fonctionnalits avances que isamchk/myisamchk proposent. Si vous allez rparer une table en ligne de commande, il est recommand d'arrter le serveur mysqld. Notez que lorsque vous excutez une commande mysqladmin shutdown sur un serveur distant, le serveur mysqld sera encore oprationnel pendant un instant aprs que mysqladmin ait termin, jusqu' ce que toutes les requtes et toutes les cls aient t crites sur le disque. Etape 1 : Vrifier vos tables Excutez 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 vrification des tables ('checked'). Vous n'aurez rparer 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 vrification, (comme, l'erreur out of memory), ou si myisamchk crashe, passez l'tape 3. Etape 2 : rparation simple et facile Note : Si vous voulez rparer trs rapidement, vous devriez ajouter -O sort_buffer=# -O key_buffer=# (o # vaut environ le quart de la mmoire du serveur), toutes les commandes isamchk/myisamchk. Premirement, essayez myisamchk -r -q tbl_name (-r -q signifie ``mode de rparation rapide''). Cette commande va tenter de rparer le fichier d'index sans toucher au fichier de donnes. Si le fichier de donnes contient toutess les donnes qu'il est sens contenir, et que les points d'ancrage pour les effacements sont corrects, cette commande doit russir, et la table sera alors rpare. Passez alors la table suivante. Sinon, suivez la procdure suivante :
309
1. Faites une copie de sauvegarde de votre fichier de donnes. 2. Utilisez la commande myisamchk -r tbl_name (-r signifie ``mode de rparation''). Cette commande va supprimer les lignes invalides et effacer ces lignes du fichier de donnes, puis reconstruire le fichier d'index. 3. Si l'instruction prcdente a chou, utilisez myisamchk --safe-recover tbl_name. Le mode restauration scuritaire utilise une vieille mthode de rparation qui peut grer certains cas rares, mais elle est bien plus lente. Si vous obtenez des erreurs tranges lors de la rpaaration (comme des erreurs de type out of memory), ou si myisamchk crashe, passez l'tape 3. Etape 3 : Rparations difficiles Nous ne devriez atteindre cette tape que si les 16 premiers ko du fichier d'index sont dtruits, ou qu'il contient des donnes errones, ou si le fichier d'index manque. Dans ce cas, il est ncessaire de crer un nouveau fichier d'index. Faites ceci : 1. Dplacez le fichier de donnes dans une archive sre. 2. Utilisez le fichier description de la table pour crer de nouveaux fichiers de donnes et d'index vides.
shell> mysql> mysql> mysql> mysql db_name SET AUTOCOMMIT=1; TRUNCATE TABLE table_name; quit
Si votre version SQL ne dispose pas de TRUNCATE TABLE, utilisez la commande DELETE FROM table_name. 3. Copiez l'ancien fichier de donnes la place du nouveau fichier de donnes (ne faites pas un simple dplacement de fichier. Utilisez une copie, au cas o un problme 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 opration automatiquement. Etape 4 : Rparation trs difficiles Vous ne devriez atteindre cette tape que si votre fichier de description .frm a aussi crash. Cela ne devrait jamais arriver, car le fichier de description n'est jamais modifi une fois que la table est cre. 1. 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 dmarrer avec l'option myisamchk -r. 2. Si vous n'avez pas de sauvegarde, mais que vous savez exactement comment la table a t cre, vous pouvez crer une telle table dans une autre base. Supprimez alors le nouveau fichier de donnes, puis dplacez les fichiers de description .frm et d'index .MYI dans votre base de donnes crashe. Cela vous donnera un nouveau fichier d'index et de description, mais laisse intact le fichier de donnes .MYD. Retournez l'tape 2 et essayez de reconstruire le fichier d'index.
310
Vous pouvez optimiser une table de la mme faon que vous le fates avec la commande SQL OPTIMIZE TABLE. OPTIMIZE TABLE effectue une rparation de la table, et une analyse des index, puis trie l'arbre d'index pour acclrer les recherches de cls. L'utilisation de la commande rduit aussi les interfrences entre le serveur et l'utilitaire car c'est le serveur lui-mme qui fait le travail. See Section 13.5.2.5, Syntaxe de OPTIMIZE TABLE . myisamchk dispose aussi d'un grand nombre d'options que vous pouvez utiliser pour amliorer les performances de la table : -S, --sort-index -R index_num, --sort-records=index_num -a, --analyze Pour une description complte de ces options, voyez Section 5.7.3.1, Syntaxe de l'utilitaire myisamchk .
Cela nous affiche les informations sur les tables qui ont t corrompues, de faon ce que nous puissions les examiner et les rparer. Comme nous n'avons jamais eu de table qui se soit corrompue inopinment (des tables qui se corrompent pour d'autres raisons que des problmes matriels) depuis quelques annes (ce qui est vridique), une fois par semaine est un bon rythme pour nous. Nous recommandons que vous commenciez par excuter la commande myisamchk -s chaque nuit, sur toutes les tables qui ont t modifies dans les 24 dernires 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 effaces, vous pouvez envisager de faire des dfragmentations du fichier, pour rcuprer 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 :
311
table description: Key Start Len Index 1 2 8 unique 2 15 10 multip. 3 219 8 multip. 4 63 10 multip. 5 167 2 multip. 6 177 4 multip. 7 155 4 multip. 8 138 4 multip. 9 177 4 multip. 193 1
Type double text packed stripped double text packed stripped unsigned short unsigned long text unsigned long unsigned long text
Type double text packed stripped double text packed stripped unsigned short unsigned long
Root Blocksize 15845376 1024 25062400 1024 40907776 1024 48097280 1024 55200768 1024 65145856 1024
312
7 8 9
4 4 4 1
226 0% 0 0 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
Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels: Max levels:
4 4 4 3 3 3 3 3 4
313
[LOTS OF ROW NUMBERS DELETED] Records: 1403698 Recordspace used: 100% Record blocks: 1403698 Recorddata: 317235748 Lost space: 0 M.recordlength: Empty space: Delete blocks: Deleted data: Linkdata: 226 0% 0 0 0 Packed: Blocks/Record: 0% 1.00
User time 1639.63, System time 251.61 Maximum resident set size 0, Integral resident set size 0 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 donnes et d'index utiliss dans les tables prcdentes :
-rw-rw-r--rw-rw-r-1 monty 1 davida tcx tcx 317235748 Jan 12 17:30 company.MYD 96482304 Jan 12 18:35 company.MYM
Des dtails sur les types d'informations retourns par myisamchk sont lists 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 cration du fichier de donnes. Recover time Date de dernire reconstruction du fichier de donnes ou d'index. Data records Combien de lignes sont stockes dans la table. Deleted blocks Combien de blocs effacs occupent toujours de l'espace. Vous pouvez optimiser la table pour rcuprer cet espace. See Section 5.7.3.10, Optimisation de table . Data file: Parts Pour les tables au format de ligne dynamique, ceci indique combien de blocs de donnes sont prsents. Pour une table optimise sans lignes fragmentes, la valeur doit tre gale Data records. Deleted data Combien d'octets de donnes effaces et non rutilises sont prsents dans la table. Vous pouvez optimiser la table pour rcuprer cet espace. See Section 5.7.3.10, Optimisation de table . Data file pointer La taille du pointeur de fichier de donnes, en octets. C'est gnralement 2, 3, 4, ou 5 octets. La plupart des tables peuvent se grer avec 2 octets, mais ceci ne peut tre contrl 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 gnralement 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 donnes, en octets. Max keyfile length Taille maximale du fichier d'index, en octets. Recordlength Taille occupe 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 cls de la table. Pour chaque cl, des informations de bas niveau sont prsentes : Key Le numro d'index.
314
Start O, dans la ligne, l'index dbute. Len Taille de cette partie d'index. Pour les nombres compacts, c'est toujours la taille maximale de la colonne. Pour les chanes, c'est plus petit que la taille maximale de la colonne index, car vous pouvez indexer un prfixe de la chane. Index unique et multip. (multiple). Indique si une valeur peut exister plusieurs fois dans cet index. Type De quel type de donnes cet index est. C'est un type de donnes ISAM avec les options packed, stripped ou empty. Root Adresse du premier bloc d'index. Blocksize La taille de chaque bloc d'index. Par dfaut, c'est 1024, mais cette valeur peut tre modifie lors de la compilation. Rec/key C'est une valeur statistique, utilise par l'optimiseur. 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 charge (ou modifie de faon majeure), avec la commande myisamchk -a. Si ce n'est pas mis jour, une valeur par dfaut de 30 est utilise. Dans le premier exemple ci-dessus, la neuvime cl est une cl multi-partie, avec deux parties. Keyblocks used Quel pourcentage des blocs de cl est utilis. Comme les tables utilises dans les exemples ont tout juste t rorganises avec myisamchk, ces valeurs sont trs grandes (trs proches du maximum thorique). Packed MySQL essaie de compacter les cls ayant un prfixe commun. Cela ne peut tre utilis que pour les colonnes de type CHAR/VARCHAR/DECIMAL. Pour les longues chanes comme des noms, cette technique va significativement rduire l'espace utilis. Dans le troisime exemple cidessus, la quatrime cl fait 10 caractres de long et a une rduction de 60 % dans l'espace utilis effectivement. Max levels La profondeur du B-tree. Les grandes tables avec de longues cls peuvent obtenir de grandes valeurs. Records Combien de lignes sont enregistres 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 chanes. Packed indique le pourcentage d'conomie d'espace ralis. Recordspace used Quel est le pourcentage d'utilisation du fichier de donnes. 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 fragmentes est constitue). 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 rorganiser la table avec myisamchk. See Section 5.7.3.10, Optimisation de table . Recordblocks Combien de blocs sont utiliss. Pour les tables format de ligne fixe, c'est le mme nombre que le nombre de lignes. Deleteblocks Combien de blocs (liens) sont effacs. Recorddata Combien d'octets sont utiliss dans le fichier. Deleted data Combien d'octets dans le fichier de donnes sont effacs (inutiliss).
315
Lost space Si une ligne est modifie, et rduite 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 lis avec des pointeurs de (4 7 octets chacun). Linkdata est la somme du stockage utilis par ces pointeurs. Si une table a t compresse avec myisampack, myisamchk -d affiche des informations supplmentaires propos de chaque colonne. Voir Section 8.2, myisampack, le gnrateur de tables MySQL compresses en lecture seule , pour un exemple de ces informations, et une description de leur signification.
o le chemin pointe vers le rpertoire o les jeux de caractres dynamiques de MySQL sont stocks.
316
Tous les caractres accentus sont convertis en leur majuscule non-accentue. Toutes les lettres sont transformes en majuscules. Lors de la comparaison des chanes de caractres avec LIKE, la conversion un vers deux caractres n'est pas effectue. Toutes les lettres sont transformes en majuscules. Les accents sont supprims de toutes les lettres, l'exception de : , , , , et .
ou :
shell> mysqld --language=/usr/local/share/french
Notez que tout les noms de langue sont spcifis en minuscule. Les fichiers de langue sont situs (par dfaut) dans share/LANGUAGE/. Pour modifier le fichier de messages d'erreurs, vous devez diter le fichier errmsg.txt et excuter la commande suivante pour gnrer le fichier errmsg.sys :
shell> comp_err errmsg.txt errmsg.sys
317
S'il a besoin de l'une de ces deux fonctionnalits, il est complexe. Par exemple, latin1 et danish sont des jeux de caractres simples tandis que big5 et czech sont complexes. Dans la section suivante, nous supposons que vous nommez votre jeu de caractres MONJEU. Pour un jeu de caractres simple, effectuez ce qui suit : 1. Ajoutez MONJEU la fin du fichier sql/share/charsets/Index Assignez-lui un nombre unique. 2. Crez le fichier sql/share/charsets/MONJEU.conf. (Vous pouvez vous inspirer de sql/ share/charsets/latin1.conf.) La syntaxe pour le fichier est trs simple : Les commentaires commencent avec le caractre # et se terminent la fin de la ligne. Les mots sont spars par un nombre changeant d'espaces blancs. Lors de la dfinition d'un jeu de caractres, chaque mot doit tre un nombre au format hexadcimal. Le tableau ctype prends les 257 premiers mots. Les tableaux to_lower[], to_upper[] et sort_order[] prennent chacun 256 mots aprs cela. See Section 5.8.4, Le tableau de dfinition des caractres . 3. Ajoutez le nom du jeu de caractres aux listes CHARSETS_AVAILABLE et COMPILED_CHARSETS dans configure.in. 4. Reconfigurez, recompilez et testez. Pour un jeu de caractres complexe faites ce qui suit : 1. Crez le fichier strings/ctype-MONJEU.c dans la distribution des sources MySQL. 2. Ajoutez MONJEU la fin du fichier sql/share/charsets/Index. Assignez-lui un nombre unique. 3. Regardez un des fichiers ctype-*.c existant pour voir ce qui doit tre dfini, 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 dans les jeux de caractres simples. See Section 5.8.4, Le tableau de dfinition des caractres . Pour un jeu de caractre complexe 4. Au dbut du fichier, placez un commentaire spcial 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 caractres dans la bibliothque MySQL. Les lignes strxfrm_multiply et mbmaxlen seront expliques dans les sections suivantes. Ne les incluez que si vous avez besoin des fonctions d'assemblage des chanes ou des fonctions de jeu de caractres multi-octets, respectivement. 5. Vous devez alors crer les fonctions suivantes :
318
my_strncoll_MONJEU() my_strcoll_MONJEU() my_strxfrm_MONJEU() my_like_range_MONJEU() See Section 5.8.5, Support d'assemblage des chanes . 6. Ajoutez le nom du jeu de caractres aux listes CHARSETS_AVAILABLE et COMPILED_CHARSETS dans configure.in. 7. Reconfigurez, recompilez et testez. Le fichier sql/share/charsets/README fournit plus d'instructions. Si vous voulez qu'un jeu de caractres soit ajout dans la distribution MySQL, envoyez un patch aux listes internes. See Section 1.4.1.1, Les listes de diffusion de MySQL .
sort_order[] est une carte indiquant comment les caractres doivent tre ordonns pour les comparaisons et les tris. Pour beaucoup de jeux de caractres, c'est la mme chose que to_upper[] (ce qui signifie que le tri sera insensible la casse). MySQL triera les caractres en se basant sur la valeur de sort_order[caractre]. Pour des rgles de tri plus compliques, voyez la discussion suivante sur l'assemblage des chanes. See Section 5.8.5, Support d'assemblage des chanes . ctype[] est un tableau de valeurs de bit, avec un lment par caractre. (Notez que to_lower[], to_upper[], et sort_order[] sont indexs par la valeur du caractre, mais que ctype[] est index par la valeur du caractre + 1. C'est une vielle habitude pour pouvoir grer EOF.) Vous pouvez trouver les dfinitions de bitmask suivantes dans m_ctype.h :
#define #define #define #define #define #define #define #define _U _L _N _S _P _C _B _X 01 02 04 010 020 040 0100 0200 /* /* /* /* /* /* /* /* Majuscule */ Minuscule */ Numrique (nombre) */ Caractre d'espacement */ Ponctuation */ Caractre de contrle */ Blanc */ nombre hexadecimal */
L'entre ctype[] de chaque caractre doit tre l'union des valeurs de masque de bits qui dcrivent le caractre. Par exemple, 'A' est un caractre majuscule (_U) autant qu'une valeur hexadcimale (_X), et donc ctype['A'+1] doit contenir la valeur :
_U + _X = 01 + 0200 = 0201
319
Vous devez spcifier la valeur de strxfrm_multiply_MYSET=N dans le commentaire spcial au dbut du fichier. N doit tre le rationnel maximal vers lequel la chane pourra crotre durant my_strxfrm_MYSET (cela doit tre un entier positif).
Dans ce cas, vous devez soit obtenir un nouveau fichier Index ou ajouter la main le nom du jeu de caractres manquant. Pour les tables MyISAM, vous pouvez vrifier le nom du jeu de caractres et son nombre associ d'une table avec myisamchk -dvv nom_de_table.
320
fuseau horaire que le serveur. La valeur initiale peut tre spcifie explicitement avec l'option -default-time-zone=timezone. Si vous avez les droits de SUPER, vous pouvez modifier la valeur de cette variable durant l'excution du serveur, avec cette commande :
mysql> SET GLOBAL time_zone = timezone;
Fuseau horaire de connexion. Chaque client qui se connecte peut disposer de sa propre configuration de fuseau horaire, grce la variable de session time_zone. Initialement, elle prend la valeur de time_zone mais peut tre redfinie avec la commande suivante :
mysql> SET time_zone = timezone;
La valeur courante du fuseau horaire global et de session est accessible avec cette commande :
mysql> SELECT @@global.time_zone, @@session.time_zone;
Les valeurs de timezone peuvent tre fournies sous forme de chanes de caractres, indiquant un dcalage par rapport au temps UTC, comme '+10:00' ou '-6:00'. Si la table de fuseau horaire de la base mysql a t cre et remplie, vous pouvez aussi utiliser les noms de fuseaux, comme 'Europe/Paris' ou 'Canada/Eastern', ou 'MET'. La valeur 'SYSTEM' indique le fuseau horaire du systme. Les noms de fuseau horaire sont insensibles la casse. La procdure d'installation de MySQL cre la table des fuseaux horaires, mais ne la remplit pas. Vous devez le faire manuellement. Si vous passez en MySQL version 4.1.3 ou plus rcent depuis une version plus rcente, il est important de crer ces tables en mettant jour la base mysql. Utilisez les instructions de Section 2.6.7, Mise jour des tables de droits .) Note : actuellement, la table des fuseaux horaires peut tre remplie uniquement sous Unix. Le problme sera bientt rgl pour Windows. Le programme mysql_tzinfo_to_sql sert charger la table des fuseaux horaires. Vous devez connatre le nom du dossier dans lequel votre systme d'exploitation enregistre les fuseaux horaires. Typiquement, c'est /usr/share/zoneinfo. Indiquez cette valeur au programme en ligne de commande mysql_tzinfo_to_sql, et passez le rsultat du programme au client mysql. Par exemple :
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql_tzinfo_to_sql lit les fichiers de fuseau horaire de votre systme et gnre des requtes SQL. Le client mysql traite ces commandes et les charge dans la base de donnes. mysql_tzinfo_to_sql peut aussi charger un fichier de fuseau horaire, et gnrer les secondes additionnelles. Pour charger un fichier de fuseaux horaires tz_file qui correspond au fuseau appel tz_name, appelez le programme mysql_tzinfo_to_sql comme ceci :
shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql
SI votre systme doit prendre en compre les secondes additionnelles, initialisez les informations de secondes additionnelles comme ceci, o tz_file est le nom de votre fichier de fuseau :
shell> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql
321
Le log d'erreurs
Problmes rencontrs lors du dmarrage, de l'excution ou de l'arrt de mysqld. Garde une trace des changements lis au tables ISAM. Utilis uniquement pour dboguer le code ISAM. Dsapprouv : Enregistre toutes les commandes qui changent les donnes. Enregistre toutes les commandes qui changent quelque chose. Utilis pour la rplication. Enregistre toutes les requtes qui ont pris plus de long_query_time s'excuter ou celles qui n'ont pas utilis d'index.
Le log de requtes Connexions tablies et requtes excutes. Le log de mises jour Le log binaire Le log des requtes lentes
Par dfaut, tous les fichiers de log peuvent tre trouvs dans le dossier de donnes de mysqld. Vous pouvez forcer mysqld rouvrir les fichiers de log (ou dans quelques cas passer un nouveau log) en excutant FLUSH LOGS. See Section 13.5.4.2, Syntaxe de FLUSH . Si vous utilisez les fonctionnalits de rplications de MySQL, les serveurs esclaves entretiennent un fichier de log supplmentaire, appel log de relais. Chapitre 6, Rplication de MySQL.
322
Le log de modification
supprimer l'option --log de mysql.server ou la changer en --log-bin. See Section 5.9.4, Le log binaire . mysqld crit le scommandes dans le log de requtes, dans l'ordre o il les recoit. Cela peut tre diffrent de l'ordre dans lequel elles sont excutes. Cela est diffrent du log de modifications et du log binaire, qui sont toujours crits aprs excution, mais avant la libration des verrous. Les redmarrage de serveur et les critures de logs ne gnrent pas un nouveau fichier de log de requtes (mme si l'criture des logs ferme puis ouvre nouveau le fichier). Sous Unix, vous pouvez renommer le fichier et en crer un nouveau avec les commandes suivantes :
shell> shell> shell> shell> mv hostname.log hostname-old.log mysqladmin flush-logs cp hostname-old.log to-backup-directory rm hostname-old.log
Sous Windows, vous ne pouvez pas renommer le fichier de logs, alors que le serveur l'a ouvert. Vous devez arrter le serveur, puis renommer le log. Puis, redmarrez le le serveur pour crer un nouveau log.
ls est utilis pour obtenir toute la liste des fichiers de logs du dossier. Ceci peut tre utile si vous devez repartir d'un fichier de sauvegarde aprs un crash, et que vous souhaitez re-excuter les modifications qui ont eu lieu depuis la sauvegarde.
323
Le log binaire
pas crite dans le log. Les commandes UPDATE qui donnent une colonne sa valeur courante sont mme vites. Le log binaire contient aussi des informations sur le temps d'excution de la requte dans la base. Il ne contient que des commandes qui modifient des donnes. Si vous voulez avoir toutes les commandes (par exemple, si vous identifiez un problme de requte, vous devez utiliser le log de requte gnral. See Section 5.9.2, Le log gnral de requtes . Le but principal de ce log est de pouvoir reprendre les modifications de la base durant les oprations de restaurations, car le log binaire contiendra les requtes qui ont eu lieu aprs une sauvegarde. Le log binaire est aussi utilis lorsque de la rplication d'un matre par un esclave. See Chapitre 6, Rplication de MySQL. L'utilisation du log binaire ralentit le serveur d'environ 1%. Cependant, les avantages du log binaire durant les oprations de restauration et pour la rplication sont gnralement plus intressants. Lorsque l'option de dmarrage --log-bin[=file_name] est utilise, mysqld crit un fichier de log contenant toutes les commandes SQL qui modifient les donnes. Si aucun nom de fichier n'est donn, le nom de la machine hte 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 donnes. Si vous fournissez une extension --log-bin=filename.extension, l'extension sera automatiquement supprime. mysqld va ajouter une extension au nom du fichier de log binaire qui est un nombre automatiquement incrment chaque fois que vous excutez mysqladmin refresh, mysqladmin flush-logs, FLUSH LOGS ou redmarrez le serveur. Un nouveau fichier de log sera automatiquement cr lorsque le fichier en cours atteint la taille de max_binlog_size. Un fichier de log binaire peut tre plus grand que max_binlog_size si vous utilisez de grandes transactions : une transaction est crite dans le log binaire d'un seul coup, et n'est jamais rpartie entre plusieurs fichiers. Pour tre capable de faire la diffrence entre les fichiers de logs binaire utiliss, mysqld cre aussi un fichier d'index de logs, qui porte le mme nom que le fichier de log, mais avec l'extension '.index'. Vous pouvez changer le nom du fichier de log avec l'option --log-bin-index=[file_name]. N'ditez pas manuellement ce fichier durant l'excution de mysqld ; cela va induire mysqld en erreur. Vous pouvez effacer tous les fichiers de log avec la commande RESET MASTER, ou seulement certains d'entre eux avec PURGE MASTER LOGS. Voyez Section 13.5.4.5, Syntaxe de la commande RESET et Section 13.6.1, Requtes SQL pour contrler les matres de rplication . Vous pouvez utiliser les options suivantes avec mysqld pour modifier ce qui est enregistr dans le fichier de log : binlog-do-db=database_name Indique au matre qu'il doit enregistrer les modifications si la base courante (c'est dire, celle qui est slectionne par USE) est db_name. Toutes les autres bases de donnes qui ne sont pas explicitement mentionnes sont ignores. Si vous utilisez cette option, assurez vous que vous ne faites des modifications que dans la base courante. Un exemple qui ne fonctionnera pas comme on pourrait l'attendre : Si le serveur est lanc avec l'option binlog-do-db=sales, et que vous utilisez USE prices; UPDATE sales.january SET amount=amount+1000;, cette commande ne sera pas crite dans le fichier de log binaire. binlog-ignore-db=database_name Indique au matre qu'il doit ne doit pas enregistrer les modifications si la base courante (c'est dire, celle qui est slectionne par USE) est db_name. Si vous utilisez cette option, assurez vous que vous ne faites des modifications que dans la base courante. 324
Le log binaire
Un exemple qui ne fonctionnera pas comme on pourrait l'attendre : Si le serveur est lanc avec l'option binlog-ignore-db=sales, et que vous utilisez USE prices; UPDATE sales.january SET amount=amount+1000;, cette commande sera crite dans le fichier de log binaire. Pour ignorer ou forcer plusieurs bases, spcifiez l'option plusieurs fois, une fois par base. Les rgles suivante sont utilises dans l'ordre suivant, pour dcider si la requte doit aller dans le log binaire ou pas : 1. Y a-t-il des rgles binlog-do-db ou binlog-ignore-db ? Non : crit la requte dans le log binaire, et quitte. Oui : aller l'tape suivante. 2. Il y a des rgles (binlog-do-db ou binlog-ignore-db ou les deux). Y a t il une base de donnes courante (une base slectionne avec la commande USE)? Non : N'crit pas la requte, et quitte. Oui : aller l'tape suivante. 3. Il y a une base de donnes courante. Y a-t-il des rgles binlog-do-db? Oui : Est-ce que la base de donnes courante vrifie une des rgles binlog-do-db? Oui : crit la requte dans le log binaire, et quitte. Non : N'crit pas la requte, et quitte. Non : aller l'tape suivante. 4. Il y a des rgles binlog-ignore-db. Est-ce que la base de donnes courante vrifie une des rgles binlog-ignore-db? Oui : N'crit pas la requte, et quitte. Non : crit la requte dans le log binaire, et quitte. Par exemple, un esclave qui fonctionne avec l'option binlog-do-db=sales ne va pas crire dans le log binaire les commandes qui concernent d'autres bases que sales (en d'autres termes, l'option binlog-do-db peut tre considr comme ``ignore les autres bases''). Si vous utilisez la rplication, vous ne devez pas effacer les anciens log binaires jusqu' ce que vous soyez srs que les esclaves n'en auront plus besoin. Une faon 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 les supprimer manuellement, ou utilisez de prfrence la commande PURGE MASTER LOGS TO (see Section 13.6, Commandes de rplication ) qui va aussi modifier le fichier de log binaires pour vous depuis MySQL 4.1. Un client avec le droit de SUPER peut dsactiver le log binaire pour ses commandes avec SET SQL_LOG_BIN=0. See Section 13.5.2.8, Syntaxe de SET . 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 Section 8.5, mysqlbinlog, Excuter des requtes dans le log binaire pour lire le fichier de log binaire directement dans le serveur MySQL.
325
Si vous utilisez les transactions, vous devez utiliser le fichier de log binaire pour les sauvegardes, plutt que le vieux fichier de log de modifications. L'enregistrement dans le fichier de log binaire est fait immdiatement aprs l'achvement de la requte, mais avant la libration des verrous ou la validation de la requte. Cela garantit que les requtes seront enregistres dans l'ordre d'excution. Les modifications dans les tables non transactionnelles sont enregistres dans le fichier de log binaire immdiatement aprs excution. 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 dmarrage, allouer un buffer de la taille de binlog_cache_size octets pour enregistrer les requtes. Si la requte est plus grande que ce buffer, le thread va ouvrir un fichier temporaire pour crire la transaction. Le fichier temporaire sera supprim ds que le thread se termine. L'option max_binlog_cache_size (par dfaut 4Go) peut tre utilis pour limiter la taille utilise pour mettre en cache une transaction multi-requte. Si la transaction est plus grande que que cette taille, elle sera annule. 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 recrer une copie exacte de la table en appliquant les mme commandes sauvegardes. Le format de log binaire est diffrent entre les versions 3.23, 4.0 et 5.0.0. Ces changements de formats sont ncessaires pour amliorer la rplication. MySQL 4.1 a le mme format de log binaire que 4.0. See Section 6.5, Compatibilit de la rplication entre les versions de MySQL .
326
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 rplication. Sur d'autres systmes, vous devez installer un court script par vous mme, qui sera excut via le dmon 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 tche suivantes : Si le log standard (--log) ou le log de requtes lentes (--log-slow-queries) est utilis, la commande ferme et rouvre le fichier de log (mysql.log et `hostname`-slow.log par dfaut). Si le log de modifications est utilis (--log-update), la commande ferme le log de modification et ouvre un nouveau fichier, avec un nouveau numro de squence 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 mysql.log mysql.old shell> mysqladmin flush-logs
327
Cette option ne sert que sous Unix. Elle indique le nom du fichier dans lequel le serveur crit l'identifiant de processus. --port contrle le numro de port des connexions TCP/IP. --socket contrle le chemin du fichier de socket sous Unix et le nom du pipe sous Windows. Il est ncessaire d'indiquer des noms de pipe diffrents sous Windows, uniquement si le serveur supporte les pipes nomms. --shared-memorybase-name dsigne le nom du segment de mmoire partage utilis par un serveur Windows pour permettre ses clients de se connecter via la mmoire partage. --pid-file indique le nom du fichier sur lequel le serveur Unix crit le numro de processus. Si vous utilisez les options suivantes, elles doivent tre diffrentes sur chaque serveur : --log=path --log-bin=path --log-update=path --log-error=path --log-isam=path --bdb-logdir=path Si vous voulez plus de performances, vous pouvez aussi spcifier les options suivantes diffremment pour chaque serveur, pour rpartir la charge entre plusieurs disques physiques : --tmpdir=path --bdb-tmpdir=path Avoir plusieurs dossiers temporaires comme ci-dessus est aussi recommand car il est plus facile pour vous de savoir quel serveur MySQL aura cr quel fichier temporaire. Gnralement, chaque serveur doit aussi utiliser des options diffrentes pour les dossiers de donnes, qui est spcifi avec l'option --datadir=path. Attention : normalement, vous ne devez pas avoir deux serveurs qui modifient en mme temps les donnes dans les mmes bases. Si votre OS ne supporte pas le verrouillage sans chec, cela peut vous mener de dplaisantes surprises ! Cette mise en garde contre le partage de donnes entre deux serveur s'applique aussi aux environnements NFS. Permettre plusieurs serveurs MYSQL d'accder aux mme donnes via NFS est une mauvaise ide! Le problme principale est que NFS devient rapidement une limitation en termes de vitesse. Il n'a pas t conu pour cela. Un autre risque avec NFS est que vous devez vous assurer que deux serveurs n'interfrent pas les uns avec les autres. Gnralement, le verrouillage de fichier NFS est fait avec lockd, mais pour le moment, aucune plate-forme ne sera 100% fiable avec cette technique. Simplifie vous la vie : vitez de partager le mme dossier de donnes entre plusieurs serveurs, via NFS. Une solution plus intelligente est d'avoir un serveur avec plusieurs processeurs, et un systme d'exploitation bien optimis pour les threads. Si vous avez plusieurs installations de serveurs MySQL a plusieurs endroits, vous pouvez spcifier le dossier de donnes pour chaque serveur avec l'option --basedir=path, pour que chaque serveur utilise des donnes diffrentes, des fichiers de log diffrents et un PID diffrent. Les valeurs par dfaut de ces options sont relatives au dossier d'installation. Dans ce cas, la seule chose qui reste adapter
328
est la socket --socket et le --port. Par exemple, supposons que vous installez diffrentes versions de MySQL en utilisant la distribution binaire .tar. Elles vont tre installes en diffrents dossiers, et vous pouvez lancer le serveur chaque fois, avec le script ./bin/mysqld_safe de chaque dossier respectif. mysqld_safe va dterminer la bonne option --basedir passer mysqld, et vous devrez spcifier --socket et --port mysqld_safe. Comme prsent dans les prochaines sections, il est possible de dmarrer d'autres serveurs en modifiant des variables d'environnement ou en spcifiant les bonnes options de ligne de commande. Cependant, si vous devez lancer des serveurs de manire rcurrente, il sera plus pratique de stocker ces valeurs dans le fichier de configuration.
(Sur NT, les serveurs vont se lancer en tche de fond, et vous devrez ouvrir deux consoles pour lancer les deux commandes spares). Pour teindre ces deux serveurs, vous devez vos connecter au bon numro de port :
shell> mysqladmin --port=3307 shutdown shell> mysqladmin --port=3308 shutdown
Les serveurs configurs comme dcrit ci-dessus permettent aux clients de se connecter via un rseau TCP/IP. Si vous voulez aussi utiliser les pipes nomms, utilisez les serveurs mysqld-nt ou mysqldmax-nt et spcifiez les options qui permettent d'activer les pipes nomms et leur nom. Chaque
329
serveur qui supporte les pipes nomms doit avoir un nom de pipe unique. Par exemple, le fichier C: \my-opts1.cnf peut tre crit comme ceci :
[mysqld] datadir = C:/mydata1 port = 3307 enable-named-pipe socket = mypipe1
C:\my-opts2.cnf doit tre modifi similairement pour l'utiliser avec le second serveur.
330
basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1 # options for mysqld2 service [mysqld2] basedir = C:/mysql-4.0.17 port = 3308 enable-named-pipe socket = mypipe2
Installez les services comme ceci, en utilisant les noms de chemin complet pour vous assurer que Windows trouve les bons programmes pour chaque service :
shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1 shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2
Pour lancer les services, utilisez le gestionnaire de services, ou bien utilisez la commande NET START avec les bons noms de services :
shell> NET START mysqld1 shell> NET START mysqld2
Pour lancer les services, utilisez le gestionnaire de services, ou bien utilisez la commande NET STOP avec les bons noms de services :
shell> NET STOP mysqld1 shell> NET STOP mysqld2
Approche 2 : Spcifiez les options de chaque serveur dans un fichier spar, et utilisez l'option -defaults-file lorsque vous installez le service pour dire au serveur quel fichier utiliser. Dans ce cas, chaque fichier doit contenir les options du groupe [mysqld]. Avec cette approche, pour spcifier les options du serveur mysqld-nt 4.0.8, il faut crer un fichier C:\my-opts1.cnf qui ressemble ceci :
[mysqld] basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1
Pour la version 4.0.17 de mysqld-nt, crez un fichier C:\my-opts2.cnf qui ressemble ceci :
[mysqld] basedir = C:/mysql-4.0.17 port = 3308 enable-named-pipe socket = mypipe2
Installez les services comme suit (entrez chaque commande comme une seule ligne) :
shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1 --defaults-file=C:\my-opts1.cnf shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2 --defaults-file=C:\my-opts2.cnf
Pour utiliser l'option --defaults-file lors de l'installation du serveur MySQL comme service, vous devez la faire prcder du nom de service. Aprs avoir install les services, lancez et arrtez les services de la mme faon que dans l'exemple prcdent. Pour supprimer plusieurs services, utilisez la commande mysqld --remove pour chacun d'entre eux, en spcifiant le nom du service, suivi de l'option --remove si le service a un nom qui n'est pas le nom par dfaut.
331
Ici, port_number et file_name doivent tre diffrents des valeurs par dfaut de numro de port et de chemin. La valeur --prefix doit spcifier un dossier d'installation diffrent de celui dans lequel le serveur existant est install. Si vous avez un serveur MySQL qui coute sur un port donn, vous pouvez utiliser la commande suivante pour connatre ses caractristiques, y compris son dossier de base et son fichier de socket :
shell> mysqladmin --host=host_name --port=port_number variables
Avec les informations affiches par la commande, vous pouvez savoir quelles valeurs ne doivent pas tre utilises lors de la configuration du nouveau serveur. Notez que si vous spcifiez ``localhost'' comme nom d'hte, mysqladmin va utiliser par dfaut une socket Unix plutt que TCP/IP. En MySQL 4.1, vous pouvez explicitement spcifier le protocole de connexion avec l'option --protocol={TCP | SOCKET | PIPE | MEMORY}. Vous n'avez pas compiler un nouveau serveur MySQL pour le lancer avec un numro de port et une socket diffrente. Il est aussi possible de spcifier ces valeurs au moment du dmarrage. Une mthode pour faire cela est d'utiliser les options de ligne de commande :
shell> /path/to/mysqld_safe --socket=file_name --port=port_number
Pour utiliser un dossier de donnes diffrent, utilisez l'option --datadir=path mysqld_safe. Un autre moyen pour arriver au mme rsultat est d'utiliser les variables d'environnement pour spcifier le nom de la socket et le numro de port.
shell> shell> shell> shell> shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock MYSQL_TCP_PORT=3307 export MYSQL_UNIX_PORT MYSQL_TCP_PORT scripts/mysql_install_db bin/mysqld_safe &
C'est une mthode rapide pour lancer un second serveur pour le tester. Le plus agrable de cette mthode est que les variables d'environnement vont tre adoptes par les logiciels clients que vous invoquerez avec le mme Shell. Par consquent, les connexions seront automatiquement diriges vers le nouveau serveur. Annexe E, Variables d'environnement inclut une liste des variables d'environnement que vous pouvez utiliser pour affecter mysqld. Pour les scripts de lancement automatique, votre script de dmarrage qui est excut au dmarrage doit utiliser la commande suivante avec les options appropries pour chaque serveur :
mysqld_safe --defaults-file=path-to-option-file
332
Sous Unix, le script mysqld_multi est une autre mthode pour lancer plusieurs serveurs. See Section 5.1.5, mysqld_multi, un programme pour grer plusieurs serveurs MySQL .
Dans un programme C, vous pouvez spcifier le port ou la socket dans l'appel mysql_real_connect(). Vous pouvez aussi faire que le programme lise des fichiers d'options en utilisant la fonction mysql_options(). See Section 24.2.3, Description des fonctions de l'API C . Si vous utilisez le module DBD::mysql, vous pourrez lire les options dans les fichiers d'options MySQL. Par exemple :
$dsn = "DBI:mysql:test;mysql_read_default_group=client;" . "mysql_read_default_file=/usr/local/mysql/data/my.cnf"; $dbh = DBI->connect($dsn, $user, $password);
333
Voici quelques performances du cache de requtes. (Ces rsultats on t gnrs en utilisant la suite benchmark MySQL sur un Linux Alpha 2 x 500 MHz avec 2GB RAM et un cache de requtes de 64MB) : Si toutes les requtes que vous effectuez sont simples (comme slctionner un champ d'une table n'en contenant qu'un) mais diffrent d'une manire que toutes les requtes ne peuvent tre caches, le gain lors de l'utilisation du cache est de 13%. Cela peut tre considr comme le pire des cas. En ralit, les requtes sont plus compliques que notre exemple le gain est donc plus petit. Les recherches sur une colonne dans une table n'en contenant qu'une sont 238% plus rapides. Cela peut tre considr comme le gain minimal attendre pour une requte cache. Si vous ne voulez pas utiliser le cache de requtes paramtrez query_cache_size zro. En dsactivant le cache de requte, il n'y a aucune surcharge apparente. (le cache de requtes peut tre dsactiv l'aide de l'option de configuration --without-query-cache)
Les requtes doivent tre les mmes (caractre caractre) pour tre considres comme identiques. Les requtes qui utilisent diffrentes bases de donnes, diffrents protocoles ou diffrents jeux de caractres sont alors considres comme diffrentes, et mises en cache diffremment. Si un rsultat de requte a t retourn depuis le cache de requte, alors la variable Com_select ne sera pas incrment, mais Qcache_hits le sera. See Section 5.11.4, Statut du cache de requtes et maintenance . Si une table change (INSERT, UPDATE, DELETE, TRUNCATE, ALTER ou DROP TABLE|DATABASE), alors toutes les requtes mises en cache qui utilisaient cette table deviennent obsoltes et en sont retires. Les tables transactionnelles InnoDB qui ont t modifies seront rendues obsoltes lorsqu'un COMMIT sera excut. En MySQL 4.0, le cache de requtes est dsactiv dans les transactions : elles ne retourne pas le rsultats. Depuis MySQL 4.1.1, le cache de requte fonctionne aussi dans les transactions avec les tables InnoDB : le serveur utilise le numro de version de table pour dtecter si le contenu est jour ou non. Avant MySQL 5.0, une requte qui commence avec un commentaire peut tre mise en cache, mais ne sera jamais lue depuis le cache. Ce problme est rsolu en MySQL 5.0. Le cache de requte fonctionne pour les requtes SELECT SQL_CALC_FOUND_ROWS ... et SELECT FOUND_ROWS(). Les requtes FOUND_ROWS() retournent la valeur correcte mme si la requte prcdent a aussi t lue dans le cache, car le nombre de lignes lues est conserv dans le cache. Une requte ne peut tre mise en cache si elle contient l'une des fonctions suivantes : BENCHMARK() CURRENT_DATE() CURTIME() CONNECTION_ID() CURRENT_TIME() DATABASE() CURDATE() CURRENT_TIMESTAMP() ENCRYPT() avec un paramtre
334
Une requte ne sera pas mise en cache dans ces conditions : Elle contient des fonctions dfinies par l'utilisateur : UDF. Elle contient des variables utilisateur. Elle fait rfrence des tables de la base mysql. Elle est de l'une des formes suivantes :
SELECT SELECT SELECT SELECT ... IN SHARE MODE ... INTO OUTFILE ... ... INTO DUMPFILE ... * FROM ... WHERE autoincrement_col IS NULL
La dernire forme n'est pas mise en cache, car elle est utilise comme palliatif pour ODBC, afin d'obtenir la dernire valeur insre. See Section 25.1.14.1, Comment obtenir la valeur d'une colonne AUTO_INCREMENT avec ODBC . Elle utilise une table TEMPORARY. Elle n'utilise pas de tables. L'utilisateur a un droit de niveau colonne pour l'une des tables implique. Avant la lecture de la requte dans le cache de requte, MySQL vrifie que l'utilisateur a les droits SELECT pour toutes les bases de donnes impliques. Si ce n'est pas le cas, le rsultat n'est pas utilis.
335
Le cache de requte ajoute plusieurs variables systme MySQL lies mysqld qui peuvent tre spcifies dans un fichier de configuration, en ligne de commande lors du dmarrage de mysqld. Les variables systmes lies au cache sont toutes prfixes avec query_cache_. Elles sont dcrites brivement dans la section Section 5.2.3, Variables serveur systme , avec des informations complmentaires. Pour configurer la taille du cache de requtes, modifiez la variable systme query_cache_size. En lui donnant la valeur de 0, vous le dsactivez. La taille par dfaut du cache est de 0 : le cache est dsactiv par dfaut. Si le cache de requte est actif, la variable query_cache_type modifie son comportement. Cette variable peut prendre les valeurs suivantes : La valeur de 0 ou OFF empche la mise en cache ou la lecture de rsultats en cache. La valeur de 1 ou ON permet le cache, sauf pour les commandes qui commencent par SELECT SQL_NO_CACHE. La valeur de 2 ou DEMAND impose la mise en cache de toutes les requtes, mme celles qui commencent par SELECT SQL_CACHE. Modifier la valeur GLOBAL de query_cache_type dtermine le comportement du cache pour tous les clients qui se connecteront aprs la modification. Les clients individuels peuvent modifier le comportement du cache pour leur connexion avec l'option SESSION de query_cache_type. Par exemple, un client peut dsactiver le cache de requte pour ses propres requtes avec :
mysql> SET SESSION query_cache_type = OFF;
Pour contrler la taille maximale des rsultats de requtes qui peuvent tre mis en cache, il faut modifier la valeur de la variable query_cache_limit. La valeur par dfaut de 1Mo. Le rsultat d'une requte (les donnes envoyes au client) sont stockes dans le cache durant la lecture. Par consquent, les donnes ne sont pas manipules en un seul gros morceau. Le cache de requte alloue des blocs la demande, pour stocker les donnes, et ds qu'un bloc est rempli, un autre est allou. Comme l'allocation de mmoire est une opration coteuse (en temps), le cache de requtes cre des blocs avec une taille minimale de query_cache_min_res_unit, jusqu' la taille des donnes mettre en cache. Suivant le type de requtes excutes, vous pourrez adapter la valeur de la variable query_cache_min_res_unit : La valeur par dfaut de query_cache_min_res_unit est 4Ko. Cela doit tre adapt la plupart des situations. Si vous avez beaucoup de requtes avec de petits rsultats, la taille par dfaut sera un peu grande, et conduit une fragmentation inutile de la mmoire, indique par un grand nombre de blocs libres. La fragmentation va forcer le cache effacer d'anciennes requtes pour librer de la place. Dans ce cas, rduisez la valeur de query_cache_min_res_unit. Le nombre de blocs libres et de requtes supprimes pour librer de la place sont stockes dans les variables Qcache_free_blocks et Qcache_lowmem_prunes. Si la plupart de vos requtes ont de grands rsultats (vrifiez les variables Qcache_total_blocks et Qcache_queries_in_cache), vous pouvez augmenter la valeur de query_cache_min_res_unit. Cependant, soyez prudent de ne pas aggrandir trop la valeur (voir point prcdent). query_cache_min_res_unit a t ajoute en MySQL 4.1.
336
mysql> SHOW VARIABLES LIKE 'have_query_cache'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | have_query_cache | YES | +------------------+-------+ 1 row in set (0.00 sec)
Avec la commande FLUSH QUERY CACHE, vous pouvez dfragmenter le cache de requtes pour mieux en utiliser la mmoire. Cette commande n'effacera aucune requte du cache. La commande RESET QUERY CACHE efface tous les rsultats de requtes du cache. FLUSH TABLES aussi. Vous pouvez visualiser les performances du cache de requtes avec SHOW STATUS:
mysql> SHOW STATUS LIKE 'Qcache%'; +-------------------------+--------+ | Variable_name | Value | +-------------------------+--------+ | Qcache_free_blocks | 36 | | Qcache_free_memory | 138488 | | Qcache_hits | 79570 | | Qcache_inserts | 27087 | | Qcache_lowmem_prunes | 3114 | | Qcache_not_cached | 22989 | | Qcache_queries_in_cache | 415 | | Qcache_total_blocks | 912 | +-------------------------+--------+
La description de chaque variable est prsente dans la section Section 5.2.4, Variables de statut du serveur . Certaines utilisations sont prsentes ici. Le nombre total de commandes SELECT vaut :
Com_select + Qcache_hits + requtes avec une erreur
Le cache de requtes utilise des blocs de longueur variable, ce qui fait que Qcache_total_blocks et Qcache_free_blocks peuvent indiquer une fragmentation de la mmoire du cache. Aprs un appel FLUSH QUERY CACHE un seul (grand) bloc libre subsiste. Note : Chaque requte a besoin au minimum de deux blocs (un pour le texte de la requte et un autre, ou plus, pour le rsultat). De mme, chaque table utilise par une requte a besoin d'un bloc, mais si deux ou plusieurs requtes utilisent la mme table, seul un bloc a besoin d'tre allou. Vous pouvez aussi utiliser la variable Qcache_lowmem_prunes pour ajuster la taille du cache de requtes. Elle compte le nombre de requtes qui ont t supprimes du cache pour librer de la place pour les nouvelles requtes. Le cache de requtes utilise une stratgie du type la plus anciennement utilise (least recently used ou LRU) pour dcider de quelle requte doit tre retire. Des informations de paramtrage sont donnes dans la section Section 5.11.3, Configuration du cache de requtes .
337
338
339
L'acclration provient de la rpartition de la charge de traitement des requtes clients entre le matre et les esclaves, permettant un meilleur temps de rponse. Les requtes SELECT peuvent tre envoyes aux esclaves pour rduire la charge du matre. Les requtes de modifications des donnes sont envoyes au matre, qui les transmettra aux esclaves. Cette stratgie de rpartition de charge est efficace si les lectures sont plus nombreuses que les critures, ce qui est la situation la plus courante. Un autre avantage de la rplication est que vous pouvez faire des sauvegardes non-bloquantes de vos donnes sur l'esclave et non plus sur le serveur principal : ce dernier n'est pas perturb. See Section 5.7.1, Sauvegardes de base de donnes .
340
commande SHOW PROCESSLIST. Le thread esclave I/O lit ce que le thread matre Binlog Dump lui envoie, et le stocke dans un fichier local l'esclave. Le troisime thread SQL lit ces commandes et les excute. Dans la description prcdente, il y a trois threads par esclave. Pour un matre avec de nombreux esclaves, il cre un thread par esclave simultanment connect, et chaque esclave a son propre thread I/O et SQL. Pour les versions de MySQL avant 4.0.2, la rplication implique uniquement deux threads : un sur le matre et un sur l'esclave. Les threads I/O et SQL sont combins en un seul thread, et il n'y a pas de log de relais. L'avantage d'utiliser deux threads est que la lecture et l'excution des requtes sont dcouples. La tche de lecture n'est pas ralentie par l'excution. Par exemple, si l'esclave n'a pas fonctionn depuis un bon moment, le thread d'I/O peut lire rapidement le contenu de toutes les commandes appliquer, mme si le thread SQL met du temps les concrtiser. Si l'esclave s'arrte avant que toutes les commandes n'ait t excutes, le thread d'I/O aura au moins lu les commandes, et elles sont dsormais locales. Cela permettra au matre de purger ces lignes, si les autres esclaves n'en ont pas besoin non plus. La commande SHOW PROCESSLIST affiche des informations qui vous indiquent ce qui se passe sur le matre et sur l'esclave, concernant la rplication. L'exemple ci-dessous montre les trois threads dans le rsultat de SHOW PROCESSLIST. Le format qui est prsent est celui de SHOW PROCESSLIST pour MySQL version 4.0.15, o le contenu de la colonne State a t chang pour tre plus significatif. Sur le serveur matre, le rsultat de SHOW PROCESSLIST ressemble ceci :
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 2 User: root Host: localhost:32931 db: NULL Command: Binlog Dump Time: 94 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL
Ici, le thread 2 est le thread de rplication pour un esclave connect. L'information indique que toutes les requtes ont t envoyes l'esclave, et que le matre attend de nouvelles instructions. Sur le serveur esclave, le rsultat de SHOW PROCESSLIST ressemble ceci :
mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 10 User: system user Host: db: NULL Command: Connect Time: 11 State: Waiting for master to send event Info: NULL *************************** 2. row *************************** Id: 11 User: system user Host: db: NULL Command: Connect Time: 11 State: Has read all relay log; waiting for the slave I/O thread to update it Info: NULL
341
Cette information indique que le thread 10 est le thread d'I/O, en communication avec le serveur, et le thread 11 est le thread SQL, qui traite les commandes stockes dans le log de relais. Actuellement, les deux threads sont oisifs, et attendent des instructions. Notez que la valeur de la colonne Time vous indique le retard de l'esclave par rapport au matre. See Section 6.9, FAQ de la rplication .
342
Si la demande de log binaire a chou ( cause d'une dconnexion), le thread passe dans cet tat durant sa mise en sommeil, et essaie de se reconnecter priodiquement. L'intervalle entre deux tentative est spcifi avec l'option --master-connect-retry. Reconnexion avec un chec de demande de log binaire (Reconnecting after a failed binlog dump request) Le thread tente de se reconnecter au matre. Attente d'informations de la part du matre (Waiting for master to send event) Le thread est connect au matre, et il attend les vnement du log binaire. Cela peut durer longtemps sur le matre est inactif. Si l'attente de prolonge au-del de slave_read_timeout secondes, un dpassement de dlai survient. A ce moment, le thread considre que la connexion est perdue, et il va se reconnecter. Ajoute un vnement au log de relais (Queueing master event to the relay log) Le thread a lu un vnement, et il le copie dans le log de relais, pour que le thread SQL puisse le lire. Attente de reconnexion aprs un chec de lecture d'vnement (Waiting to reconnect after a failed master event read) Une erreur est survenue durant la lecture, cause d'une dconnexion. Le thread est en sommeil pour master-connect-retry secondes avant de tenter de se reconnecter. Reconnexion aprs un chec de lecture d'vnement (Reconnecting after a failed master event read) Le thread tente de se reconnecter au matre. Lorsque la reconnexion est faite, l'tat deviendra Waiting for master to send event. Attente d'espace pour le log de relais auprs du thread SQL (Waiting for the slave SQL thread to free enough relay log space) Si vous utilisez une valeur relay_log_space_limit non nulle, et que le log de relais a atteint sa taille maximale, le thread d'E/S va attendre que le thread SQL ait libr suffisamment d'espace en traitant les requtes pour qu'il puisse effacer un des fichiers de logs. Attente du mutex de l'esclave (Waiting for slave mutex on exit) Un tat trs bref qui survient juste l'extinction.
343
Attente du mutex de l'esclave pour terminer (Waiting for slave mutex on exit) Un tat trs bref qui survient lorsque le thread s'arrte. La colonne State du thread d'E/S peut aussi afficher une commande. Cela indique que le thread a lu un vnement dans le log de relais, a extrait la commande et est en train de l'excuter.
344
Connect_Retry
Depuis MySQL 4.1, le fichier inclus un compteur de ligne et des informations sur les options SSL : Line 1 2 3 4 5 5 7 8 9 10 11 12 13 14 Description Nombre de lignes dans le fichier Master_Log_File Read_Master_Log_Pos Master_Host Master_User Mot de passe (pas affich par SHOW SLAVE STATUS) Master_Port Connect_Retry Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key
Le fichier relay-log.info est modifi par le thread SQL. La correspondance entre les lignes du fichier et les colonnes affiches par SHOW SLAVE STATUS est la suivante : Ligne 1 2 3 4 Description Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Exec_Master_Log_Pos
Lorsque vous sauvegardez les donnes de votre esclave, vous devriez aussi sauver ces deux fichiers, ainsi que les logs de relais. Ils ont ncessaires pour reprendre la rplication aprs une restauration de la base. Si vous perdez les logs de relais mais avez encore le fichier relay-log.info, vous pouvez l'tudier pour dterminer ce que le thread SQL a trait des logs binaires du matre. Puis, vous pouvez utiliser CHANGE MASTER TO avec les options MASTER_RELAY_LOG et MASTER_RELAY_POS pour dire au thread d'I/O de relire les logs depuis ce point. Cela impose que ces logs sont toujours disponibles sur le serveur. Si votre esclave doit rpliquer une commande LOAD DATA INFILE, vous devriez aussi sauver les fichiers SQL_LOAD-* qui existent dans le dossier que l'esclave utilise cette fin. L'esclave aura besoin de ces fichiers pour reprendre la rplication des commandes LOAD DATA INFILE. Le chemin du dossier est spcifi avec l'option --slave-load-tmpdir. Sa valeur par dfaut est tmpdir.
345
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 dtails, voyez Section 6.9, FAQ de la rplication . Si vous voulez administrer une architecture de rplication MySQL, nous vous suggrons de commencer par tudier, tester et exprimenter toutes les commandes mentionnes dans les chapitres Section 13.6.1, Requtes SQL pour contrler les matres de rplication et Section 13.6.2, Commandes SQL de contrle des esclaves de rplication . Vous devriez aussi vous familiariser avec les options de dmarrage dcrites dans la section Section 6.8, Options de dmarrage de la rplication . 1. Assurez vous que vous avez une version rcente de MySQL installe comme matre et comme esclave. Assurez vous que ces versions sont compatibles entre elles, conformment la table prsente dans la section Section 6.6, Changer de version de rplication . Ne nous rapportez pas de bugs tant que vous n'avez pas vrifi que le problme persiste dans la dernire version de MySQL. 2. Crez un utilisateur MySQL spcial pour la rplication sur le matre, 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 depuis tous les esclaves. Si l'utilisateur ne fait que de la rplication (ce qui est recommand), vous n'avez pas lui donner d'autres droits. Le nom d'hte du compte doit tre tel que chaque serveur esclave peut l'utiliser pour se connecter au matre. Par exemple, pour crer un utilisateur appel repl qui peut accder au matre, vous pourriez utiliser une commande comme :
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY '<password>';
Si vous envisagez d'utiliser LOAD TABLE FROM MASTER ou LOAD DATA FROM MASTER sur l'esclave, vous devez donner les droits supplmentaires suivants : Donnez le droit de SUPER et RELOAD. Donnez le droit de SELECT pour toutes les tables que vous voulez charger. Toutes les tables matres dans lesquelles l'esclave ne pourra pas utiliser SELECT seront ignores par LOAD DATA FROM MASTER. 3. Si vous utilisez des tables MyISAM, dchargez toutes les tables et blocs en utilisant la commande FLUSH TABLES WITH READ LOCK.
mysql> FLUSH TABLES WITH READ LOCK;
puis faire une sauvegarde des donnes de votre matre. Le plus simple pour cela (sous Unix) et d'utiliser la commande tar pour produire une archive de votre dossier de donnes total. Le dossier de donnes dpend de votre installation.
shell> tar -cvf /tmp/mysql-snapshot.tar .
Si vous voulez que vos archives incluent seulement une base de donnes appele cette_base, utilisez cette commande :
shell> tar -cvf /tmp/mysql-snapshot.tar ./cette_base
Puis copiez le fichier d'archive dans le dossier /tmp sur le serveur esclave. Sur cette machine, placez vous dans le dossier de donnes du serveur et dcompressez l'archive locale avvec cette commande : 346
Il n'est pas besoin de rpliquer la base mysql. Si c'est le cas, vous pouvez l'exclure de votre archive. Vous n'avez pas besoin d'inclure les fichiers de log dans l'archive, ou les fichiers master.info ou relay-log.info. Lorsque le verrou de lecture a t pos par FLUSH TABLES WITH READ LOCK et est en action, lisez les valeurs courantes du fichie de log et de son offset sur le matre :
mysql > SHOW MASTER STATUS; +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | mysql-bin.003 | 73 | test,bar | foo,manual,mysql | +---------------+----------+--------------+------------------+ 1 row in set (0.06 sec)
La colonne File montre le nom du fichier de log, et la colonne Position affiche l'offset. Dans l'exemple ci-dessus, le nom du fichier de log est mysql-bin.003 et son offset est 73. Notez ces valeurs. Vous en aurez besoin pour configurer l'esclave. Une fois que vous avez pris une sauvegarde et enregistr le nom de fichier, et son offset, vous pouvez ractiver l'activit sur votre matre :
mysql> UNLOCK TABLES;
Si vous utilisez des tables InnoDB, l'outil idal est InnoDB Hot Backup, qui est disponible pour ceux qui achtent des licences commerciales MySQL, du support ou l'outil lui-mme. Il fait un sauvegarde cohrente du matre, enregistre le nom du fichier de log binaire et son offset, pour que cette archive soit directement utilise par l'esclave plus tard. Pour plus d'informations sur cet outil, voyez http://www.innodb.com/order.php. Sans Hot Backup, le mieux pour faire une sauvegarde rapide d'une base InnoDB est d'arrter le serveur, puis de copier les fichiers de donnes InnoDB, leurs logs, et leur fichier de dfinition (.frm). Pour enregistrer le fichier de log courant et son offset, vous devez utiliser les commandes suivantes lors de l'extinction du serveur :
mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS;
Et ensuite, enregistrer le nom du fichier et son offset, lu dans le rsultat de la commande SHOW MASTER STATUS prsente prcdemment. Une fois que vous avez ces informations, teignez le serveur sans dverrouiller les tables, pour vous assurer qu'il va bien s'arrter dans l'tat que vous avez not :
shell> mysqladmin -uroot shutdown
Une alternative, valable pour les deux types de tables MyISAM et InnoDB, est de prendre un export SQL du matre, au lieu d'une copie binaire. Pour cela, vous pouvez utiliser l'utilitaire mysqldump --master-data sur votre matre, puis excuter les commandes SQL sur votre esclave. Toutefois, c'est plus lent que de faire une copie binaire. Si le matre fonctionnait sans l'option --log-bin, le nom du fichier de log et l'offset seront vides, lorsqu'ils sont demand SHOW MASTER STATUS et mysqldump sera vide aussi. Dans ce cas, utilisez la chane vide ('')comme nom de fichier de log, et la valeur 4 comme offset. 4. Dans le fichier my.cnf du matre, ajoutez les options log-bin et server-id=unique number, o master_id doit tre un entier positif entre 1 et 2^32 1, la section [mysqld] et redmarrez le serveur. Il est trs important que l'identifiant des esclaves soient diffrents de celui du matre. Pensez server-id comme une valeur comparable une adresse IP : elle identifie de manire unique un serveur dans la communaut des rplicateurs. 347
Si ces options ne sont pas prsentes, ajoutez-les, et redmarrez le serveur. 5. Arrtez le serveur qui va servir d'esclave, et ajoutez les lignes suivantes dans son fichier my.cnf :
[mysqld] server-id=slave_id
La valeur de slave_id, comme la valeur de master_id, doit tre un entier, entre 1 et 2^32 1. De plus, il est trs important que l'identifiant de l'esclave soit diffrent de celui du matre. Par exemple :
[mysqld] server-id=2
Si vous configurez plusieurs esclaves, chacun d'entre eux doit avoir une valeur server-id distincte de celle du matre et des autres esclaves. Pensez aux server-id comme tant des adresses IP : ces identifiants reprent de manire unique un esclave dans la communaut de rplication. Si vous ne spcifiez pas de valeur pour server-id, il prendra la valeur de 1 si vous n'avez pas dfini de valeur pour master-host, sinon, il prendra la valeur de 2. Notez que dans le cas o vous omettez server-id, un matre refusera laconnexion tous les esclaves. Par consquent, omettre server-id est uniquement valable pour des oprations de sauvegarde avec log binaire. 6. Copiez la sauvegarde des donnes dans vos esclaves. Assurez vous que les droits sur ces donnes sont corrects. L'utilisateur qui fait fonctionner MySQL doit avoir les droits d'criture et de lecture sur ces fichiers, tout comme le matre l'avait. Si vous avez fait une sauvegarde avec mysqldump, lancez d'abord les esclaves (voir prochaine tape). 7. Redmarrez les esclaves. S'il tait dj configur pour la rplication, lancez l'esclave avec l'option --skip-slave-start. Vous pouvez aussi lancer l'esclave avec l'option --log-warnings. De cette manire, vous aurez plus de dtails sur les problmes que l'esclave rencontrera (problmes rseau, d'identification, etc.) 8. Si vous avez fait une sauvegarde du matre avec l'utilitaire mysqldump, chargez l'export avec la commande suivante :
shell> mysql -u root -p < dump_file.sql
9. Excutez la commande sur l'esclave, en remplaant les valeurs entre crochets <> par les valeurs que vous aviez lu sur le matre, ou qui sont valables pour votre systme :
mysql> CHANGE MASTER TO -> MASTER_HOST='<master host name>', -> MASTER_USER='<replication user name>', -> MASTER_PASSWORD='<replication password>', -> MASTER_LOG_FILE='<recorded log file name>', -> MASTER_LOG_POS=<recorded log offset>;
60 16 32 255
Aprs avoir suivi les instructions ci-dessus, les esclaves doivent se connecter au matre, et rattraper les modifications qui ont eu lieu depuis la sauvegarde des donnes. Si vous avez oubli de spcifier 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 matre, les esclaves ne pourront pas se connecter avec le matre. Si un esclave n'est pas capable de faire la rplication pour une raison quelconque, vous allez trouvez le message d'erreur dans le fichier de log d'erreurs de l'esclave. Une fois qu'un esclave a activ la rplication, vous trouverez deux fichiers dans son dossier de donnes : master.info et relay-log.info. L'esclave utilise ces deux fichiers pour savoir o il en est des logs du matre. Ne supprimer pas et n'ditez pas ces fichiers, moins que vous ne sachiez bien ce que vous faites. Mme dans ce cas, il est prfrable d'utiliser la commande CHANGE MASTER TO. NOTE : le contenu du fichier master.info est priorit par rapport a certaines versions spcifies en ligne de commande, ou dans le fichier my.cnf. Voyez Section 6.8, Options de dmarrage de la rplication pour plus de dtails. Une fois que vous avez une sauvegarde, vous pouvez l'utiliser pour configurer d'autres esclaves, en suivant la procdure concernant l'esclave, ci-dessus. Vous n'aurez pas besoin d'une autre sauvegarde du matre.
349
En gnral, nous recommandons d'utiliser des versions rcentes de MySQL, car la rplication s'amliore continuellement. Nous recommendons aussi d'utiliser la mme version pour le matre et les esclaves.
350
En d'autres termes, il n'y a pas de mesure prendre lorsque vous passez en version 5.0.0, sauf que les esclaves doivent tre mis jour avant le matre. Notez que si vous descendez de version, cela ne fonctionnera pas automatiquement : vous devez commencer par effacer les logs binaires et de relais au format 5.0.0 avant de procder.
351
avez rpliqu les droits de mysql sans pouvoir faire de commande FLUSH PRIVILEGES sur vos esclaves pour les prendre en compte. Depuis MySQL version 4.1.1, ces commandes sont crites dans le log binaire, (hormis FLUSH LOGS, FLUSH MASTER, FLUSH SLAVE, FLUSH TABLES WITH READ LOCK) moins que vous ne spcifiez NO_WRITE_TO_BINLOG ou son alias LOCAL). Pour un exemple d'utilisation de la syntaxe, voyez Section 13.5.4.2, Syntaxe de FLUSH . MySQL supporte uniquement un matre et plusieurs esclaves. Ultrieurement, nous allons ajouter un algorithme de choix automatique du matre. Nous allons aussi introduire une notion d'agent, qui aideront quilibrer la charge en envoyer les commandes SELECT aux diffrents esclaves. Lorsqu'un serveur s'arrte et repart, les tables MEMORY (HEAP) sont vides. Depuis MySQL 4.0.18, le matre rplique cet effet comme ceci : la premire fois que le matre utilise une table MEMORY aprs le dmarrage, il indique aux esclaves que la table doit tre vide en ajoutant une commande DELETE FROM pour la table en question, dans son log binaire. Voyez Section 14.3, Le moteur de table MEMORY (HEAP) pour plus de dtails. Les tables temporaires sont rpliques 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 utilises dans des modifications ultrieures. (Si vous teignez l'esclave, les tables temporaires utilises par ces commandes ne sont plus disponibles au redmarrage de l'esclave). Pour viter ce problme, n'teignez jamais un esclave qui a des tables temporaires actives. Utilisez cette procdure : 1. Utilisez la commande SLAVE STOP. 2. Vrifiez la variable de statut Slave_open_temp_tables pour vrifier si elle vaut bien 0. 3. Si elle vaut bien 0, excutez mysqladmin shutdown. 4. Si le nombre n'est pas 0, redmarrez l'esclave avec la commande SLAVE START. 5. Rpetez la procdure et voyez si vous avez plus de chance la prochaine fois. Nous envisageons de corriger ce problme prochainement. Il est possible de connecter les serveurs MySQL en chane boucle (chaque serveur est le matre du prcdent et l'esclave du suivant, en boucle), avec l'activation de l'option log-slave-updates. Notez que de nombreuses requtes 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 problmes qui pourraient arriver dans diffrentes squences de modifications sur diffrents serveurs. Cela signifie que vous pouvez raliser une configuration comme ceci :
A -> B -> C -> A
Les identifiants de serveurs sont inscrits dans les vnements. A saura qu'un vnement qu'il a dj excut lui est revenu, et il ne l'excutera pas deux fois : il n'y a pas de risque de boucle infinie. Mais dans une configuration circulaire, vous devez vous assurer que le code client n'effectue pas de modifications conflictuelles. En d'autres termes, si vous insrez des donnes dans A et C, vous devez vous assurez qu'il n'y a pas de conflit de cl unique. Ne modifiez pas non plus deux lignes simultanment sur deux serveurs, si l'ordre des modifications a une importance pour vous. Si la requte sur l'esclave gnre une erreur, le thread esclave s'arrte, et un message sera ajout dans le fichier d'erreur. Vous devriez vous connecter pour corriger manuellement les donnes 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 redmarrer le serveur. Si la connexion au matre est perdue, l'esclave tente de se reconnecter immdiatement, et en cas d'chec, il va retenter toutes les master-connect-retry (par dfaut, 60) secondes. A cause de cela, il est sage d'teindre le serveur matre et de le redmarrer rgulirement. L'esclave sera capable de grer les problmes rseau. See Section 5.2.3, Variables serveur systme .
352
Eteindre l'esclave proprement est sr, car il garde la trace du point o il en est rendu. Les extinctions sauvages vont produire des problmes, surtout si le cache disque n'a pas t crit sur le disque avant que le systme ne s'arrte. Votre niveau de tolrance aux pannes sera grandement amlior si vous avez de bons onduleurs. 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 trs long UPDATE est interrompu au milieu du stock de ligne. Si cela arrive sur le matre, l'esclave va s'arrter et attendre que l'administrateur dcide quoi faire, moins que l'erreur soit lgitime, et que la requte arrive la mme conclusion. Si le code d'erreur n'est pas dsirable, certaines erreurs (voire mme toutes), peuvent tre masques avec l'option slave-skip-errors, depuis la version 3.23.47. Si vous modifiez une table transactionnelle depuis une table transactionnelle, dans un bloc de transaction BEGIN/COMMIT, les modifications du log binaire peut tre dphases si un thread a fait une modification dans la table non-transactionnelle, avant la validation de la transaction. Les transactions sont crites dans le log binaire au moment de leur validation. Avant la version 4.0.15, les modifications sur des tables non-transactionnelles sont crites dans le log binaire immdiatement, alors que les modifications d'une transaction sont crites au moment du COMMIT ou ignores si vous utilisez un ROLLBACK; vous devez prendre cela en compte lors de la modification de tables transactionnelles et non-transactionnelles dans la mme transaction, si vous utilisez le log binaire pour les sauvegardes ou la rplication. En version 4.0.15, nous avons modifi le comportement du log pour les transactions, qui mlent les modifications de tables transactionnelles et non-transactionnelles dans la mme transaction, pour rsoudre ce problme. L'ordre des requtes est maintenant maintenu, et toutes les requtes sont crites, mme en cas d'annulation ROLLBACK. Le problme qui reste est que lorsqu'une seconde connexion modifie une table non-transactionnelle durant la transaction de la premire connexion, une erreur d'ordre dans les requtes peut survenir, car la seconde transaction sera crite immdiatement aprs sa ralisation. Lorsque l'esclave 4.x rplique une commande LOAD DATA INFILE depuis un matre 3.23, les valeurs des colonnes Exec_Master_Log_Pos et Relay_Log_Space pour SHOW SLAVE STATUS sont incorrectes. L'erreur de Exec_Master_Log_Pos va causer un problme lorsque vous stopperez et relancerez la rplication. Il est donc bon de corriger cela avec la commande FLUSH LOGS sur le matre. Ces bogues sont corrigs pour les esclaves en MySQL 5.0.0. La table suivante liste les problmes de MySQL 3.23 qui sont corrigs en MySQL 4.0 : LOAD DATA INFILE est correctement gr, tant que les donnes rsident toujours sur le serveur matre au moment de la propagation. LOAD LOCAL DATA INFILE sera ignor. En version 3.23 RAND() dans les modifications de lignes ne se propage pas correctement. Utilisez RAND(some_non_rand_expr) si vous rpliquez des modifications qui incluent RAND(). Vous pouvez, par exemple, utiliser UNIX_TIMESTAMP() comme argument de RAND(). Ceci est corrig en version 4.0.
353
Les gestionnaires de rplication grent les options de manire spciale, sans le sens o elles sont ignores si un fichier master.info existe lorsque l'esclave est lanc, et qu'il contient des valeurs pour les options. Les options suivantes sont gres de cette manire : --master-host --master-user --master-password --master-port --master-connect-retry Depuis MySQL 4.1.1, les options suivantes sont gres de manire particulire : --master-ssl --master-ssl-ca --master-ssl-capath --master-ssl-cert --master-ssl-cipher --master-ssl-key Le format du fichier master.info de version 4.1.1 a chang pour inclure les options SSL. De plus, en version 4.1.1, le fichier inclut le nombre de lignes comme premire ligne. Si vous passez d'une ancienne version vers un serveur 4.1.1, le nouveau serveur va mettre jour le fichier master.info avec le nouveau format au dmarrage. Toutefois, si vous rtrogradez en version 4.1.1, vous devrez supprimer la premire ligne avant de relancer votre vieux serveur. Notez que dans ce cas, le serveur ancien ne pourra pas utiliser les connexions scurises pour communiquer avec le matre. Si aucun fichier master.info n'existe lors du lancement de l'esclave, il utiliser les valeurs de ces options. Cela arrivera lorsque vous lancez un serveur de rplication en tant qu'esclave, pour la premire fois, ou si vous avez utilis la commande RESET SLAVE et arrt puis relanc le serveur. Cependant, si master.info existe lorsque l'esclave dmarre, il utilisera les valeurs dans le fichier et ignorera les valeurs spcifies en ligne de commande, ou dans le fichier d'options master.info. Si vous redmarrez le serveur avec diffrentes options de dmarrage que les valeurs qui sont dans le master.info, ces nouvelles valeurs n'auront pas d'effet, car le serveur continuera d'utiliser master.info. Pour utiliser diffrentes valeurs, vous devez relancer le serveur aprs avoir supprim master.info, ou, de prfrence, utilise la commande CHANGE MASTER TO pour remettre zro les valeurs durant l'excution. Supposez que vous spcifiez cette option dans votre fichier my.cnf :
[mysqld] master-host=un_hote
La premire fois que vous dmarrez le serveur en tant qu'esclave de rplication, il va lire et utiliser cette option dans le fichier my.cnf. Le serveur va ensuite enregistrer les valeurs courantes dans le fichier master.info. Au prochain dmarrage du serveur, il va lire les valeurs dans le fichier master.info. Si vous modifiez my.cnf pour spcifier un nouvel hte, cela n'aura pas d'effet. Vous devez utiliser la commande CHANGE MASTER TO. Comme le serveur donne la priorit au fichier master.info sur les options de dmarrage dcrites, vous pourriez ne pas souhaiter utiliser les options de dmarrage pour ces valeurs, et plutt, les spcifier avec la commande CHANGE MASTER TO. Voir Section 13.6.2.1, CHANGE MASTER TO .
354
Cet exemple illustre une utilisation plus complte des options de dmarrage pour configurer un serveur esclave :
[mysqld] server-id=2 master-host=db-master.mycompany.com master-port=3306 master-user=pertinax master-password=freitag master-connect-retry=60 report-host=db-slave.mycompany.com
La liste suivante dcrit les options de dmarrage qui contrlent la rplication : De nombreuses options peuvent tre remises zro pendant que le serveur fonctionne, en utilisant la commande CHANGE MASTER TO. Sinon, des options comme --replicate-* peuvent tre utilises lorsque le serveur esclave dmarre. Nous envisageons de corriger cela. --log-slave-updates Dit l'esclave d'enregistrer les modifications effectues par son thread SQL dans son propre log binaire. Par dfaut, cette option est Off. Pour que cette option ait un effet, l'esclave doit tre lanc avec le log binaire activ : c'est l'option --log-bin option. --log-slave-updates sert lorsque vous voulez faire une chane de serveur de rplication. Par exemple :
A -> B -> C
C'est--dire, A sert de matre l'esclave B, et B sert de matre l'esclave C. Pour que cela fonctionne, avec B qui sert d'esclave et de matre simultanment, vous devez lancer B avec l'option --log-slave-updates. A et B doivent tre lancs avec le log binaire activ. --log-warnings Fait que l'esclave affiche plus de message sur ses activits. Par exemple, il vous alertera s'il russi se reconnecter aprs un problme de connexion, ou le dmarrage de thread esclaves. Cette option n'est pas limite la rplication. Elle produit des alertes sur toutes la gamme des activits du serveur. --master-connect-retry=seconds Le nombre de secondes qu'un esclave attend avant de tenter de se reconnecter au matre, dans le cas o le matre et l'esclave perdent la connexion. La valeur du fichier master.info a priorit, si elle est disponible. Par dfaut, elle vaut 60. --master-host=host Spcifie l'hte ou l'IP du matre de rplication. Si cette option n'est pas fournie, le thread esclave ne sera pas lanc. La valeur inscrite dans le fichier master.info a priorit, si elle peut tre lue. Un meilleur nom pour cette option aurait t --bootstrap-master-host, mais il est trop tard. --master-info-file=file_name Le nom utiliser pour le fichier dans lequel l'esclave stocke les informations sur le matre. Par dfaut, c'est mysql.info, dans le dossier de donnes. --master-password=password Le mot de passe que l'esclave utilise lors de l'identification auprs du matre. Si le mot de passe n'est pas configur, la chane vide est utilise. La valeur inscrite dans le fichier master.info a priorit, si elle peut tre lue. --master-port=port_number 355
Le port du matre que l'esclave utilise lors de l'identification auprs du matre. Si le port n'est pas configur, la valeur de la variable MYSQL_PORT est utilise. Si vous n'y avez pas touch lors de la compilation avec configure, ce doit tre 3306. La valeur inscrite dans le fichier master.info a priorit, si elle peut tre lue. --master-ssl, --master-ssl-ca=file_name, --master-ssl-capath=directory_name, --master-ssl-cert=file_name, --master-ssl-cipher=cipher_list, --master-sslkey=file_name Ces options servent configurer la rplication chiffre, lorsque la connexion avec le matre utilise SSL. Leurs significations respectives est la mme que les options --ssl, --ssl-ca, --sslcapath, --ssl-cert, --ssl-cipher, --ssl-key dcrites dans Section 5.6.7.5, Options SSL en ligne de commande . Ces options sont disponibles depuis MySQL 4.1.1. --master-user=username Le nom d'utilisateur que l'esclave utilise lors de l'identification auprs du matre. Le compte doit avoir les droits de REPLICATION SLAVE (avant MySQL 4.0.2, il devait avoir les droits de FILE). Si l'utilisateur matre n'est pas configur, l'utilisateur test est utilis. La valeur inscrite dans le fichier master.info a priorit, si elle peut tre lue. Si l'utilisateur matre n'est pas configur, la valeur test est utilise. --max-relay-log-size=# Pour faire la rotation automatique des logs. See Section 13.5.3.18, Syntaxe de SHOW VARIABLES . Cette option est disponible depuis MySQL 4.0.14. --read-only Cette option fait que le serveur n'autorise aucune modification, hormis celles du thread esclave, ou celle des utilisateurs ayant les droits de SUPER. Cela peut tre utile si vous voulez vous assurer que l'esclave ne reoit aucune modification des clients. Cette option est disponible depuis MySQL 4.0.14. --relay-log=filename Pour spcifier la localisation et le nom qui doivent tre utiliss pour les logs de relais. Les noms par dfaut sont de la forme host_name-relay-bin.nnn, o host_name est le nom du serveur esclave et nnn indique le numro de squence du log de relais. Vous pouvez utiliser ces options pour avoir des noms de fichier de log de relais indpendants du nom d'hte, ou si vos logs ont tendances devenir trs grands (et que vous ne voulez pas rduire la valeur de max_relay_log_size) et que vous devez les mettre dans un autre dossier, ou simplement pour acclrer la vitesse d'quilibrage entre deux disques. --relay-log-index=filename Pour spcifier la localisation et le nom qui doivent tre utiliss pour le fichier d'index du log de relais. Le nom par dfaut est host_name-relay-bin.index, o host_name est le nom du serveur esclave. --relay-log-info-file=filename Pour donner au fichier relay-log.info un autre nom ou pour le placer dans un autre dossier. Le nom par dfaut est relay-log.info dans le dossier de donnes. --relay-log-purge={0|1}
356
Active ou dsactive la vidange automatique des logs de relais, ds qu'ils ne sont plus utiles. C'est une variable globale, qui peut tre dynamiquement modifie avec SET GLOBAL RELAY_LOG_PURGE=0|1. Sa valeur par dfaut est 1. Cette option est disponible depuis MySQL 4.1.1. --relay-log-space-limit=# Limite la taille maximale de tous les fichiers de logs de relais sur l'esclave (une valeur de 0 signifie ``sans limite''). C'est utile lorsque vous avez un petit disque sur votre machine esclave. Lorsque la limite est atteinte, le thread d'I/O fait une pause : il ne lit plus rien dans le log binaire du matre, jusqu' ce que le thread SQL ait avanc, et effac des fichiers de logs. Notez que cette limite n,est pas absolue : il se peut que le thread SQL requiert plusieurs vnements pour tre capable d'effacer les fichiers de log de relais. Dans ce cas, le thread d'I/O va dpasser la limite, jusqu' ce que l'effacement devienne possible. Sans cela, des blocages pourraient survenir, ce qui arrivait sur les versions antrieures la 4.0.13). Avec --relay-log-space-limit, il ne faut pas utiliser de valeur infrieure deux fois la taille de --max-relay-log-size (ou --max-binlog-size si --max-relay-log-size vaut 0) car dans ce cas, il y a des chances que le thread d'I/O attende de l'espace libre par ce que --relay-log-space-limit est dpasse, mais que le thread SQL n'ait pas de logs effacer, et ne peut donc librer le thread d'I/O, forant le thread d'I/O ignorer temporairement --relay-log-space-limit. --replicate-do-db=db_name Indique l'esclave qu'il doit restreindre la rplication aux commandes qui utilisent la base de donnes db_name par dfaut (c'est dire celle qui est slectionne avec la commande USE). Pour spcifier plusieurs base de donnes, utilisez cette option aussi souvent que ncessaire. Note que cela ne va pas autoriser les commandes multi-bases, comme UPDATE some_db.some_table SET foo='bar' si une base de donnes diffrente ou qu'aucune base de donnes n'est slectionne. Si vous avez besoin que les commandes multi-bases fonctionnent, assurez vous que vous avez MySQL 3.23.28 ou plus rcent, et utilisez --replicate-wild-do-table=db_name.%. Lisez les notes qui suivent cette liste d'options. Un exemple qui pourrait ne pas fonctionner comme vous l'attendez : si l'esclave est lanc avec --replicate-do-db=sales et que vous mettez une commande sur le matre, la commande UPDATE suivante ne sera pas rplique :
USE prices; UPDATE sales.january SET amount=amount+1000;
Si vous avez besoin de rpliquer des commandes multi-bases, utilisez l'option --replicatewild-do-table=db_name.% la place. La raison principale de ce comportement ``vrifie juste la base par dfaut'' est qu'il est difficile de savoir si une requte doit tre rplique, uniquement partir de la requte. Par exemple, si vous utilisez une requte multi-tables DELETE oui multi-tables UPDATE, qui a des consquences dans d'autres bases. La vrification de la base courante est aussi trs rapide. --replicate-do-table=db_name.table_name Dit l'esclave qu'il doit restreindre la rplication une table spcifie. Pour spcifier plusieurs tables, il faut utiliser cette directive plusieurs fois, une fois par table. Cela fonctionnera pour les mises jours multi-bases, au contraire de --replicate-do-db. Lisez les notes qui suivent cette liste d'options. --replicate-ignore-db=db_name Indique l'esclave qu'il doit ne doit pas assurer la rplication avec les commandes qui utilisent la base de donnes db_name par dfaut (c'est dire celle qui est slectionne avec la commande USE). Pour spcifier plusieurs base de donnes, utilisez cette option aussi souvent que
357
ncessaire. Note que cela ne va pas autoriser les commandes multi-bases, comme UPDATE some_db.some_table SET foo='bar' si une base de donnes diffrente ou qu'aucune base de donnes n'est slectionne. Si vous avez besoin que les commandes multi-bases fonctionnent, assurez vous que vous avez MySQL 3.23.28 ou plus rcent, et utilisez --replicate-wild-dotable=db_name.%. Lisez les notes qui suivent cette liste d'options. Un exemple qui pourrait ne pas fonctionner comme vous l'attendez : si l'esclave est lanc avec -replicate-ignore-db=sales et que vous mettez une commande sur le matre, la commande UPDATE suivante ne sera pas rplique :
USE prices; UPDATE sales.january SET amount=amount+1000;
Si vous avez besoin de rpliquer des commandes multi-bases, utilisez l'option --replicatewild-ignore-table=db_name.% la place. --replicate-ignore-table=db_name.table_name Dit l'esclave qu'il ne doit pas rpliquer les commandes qui touche la table spcifie, mme si d'autres tables sont modifies dans la mme commande. Pour spcifier plusieurs tables, il faut utiliser cette directive plusieurs fois, une fois par table. Cela fonctionnera pour les mises jours multi-bases, au contraire de --replicate-ignore-db. Lisez les notes qui suivent cette liste d'options. --replicate-wild-do-table=db_name.table_name Dit l'esclave qu'il doit restreindre la rplication aux tables dont le nom vrifie le masque spcifi. Le masque peut contenir les caractres % et _, qui ont la mme signification que dans les expressions rgulires de la clause LIKE. Pour spcifier plusieurs tables, il faut utiliser cette directive plusieurs fois, une fois par table. Cela fonctionnera pour les mises jours multi-bases, au contraire de -replicate-do-db. Lisez les notes qui suivent cette liste d'options. Exemple : --replicate-wild-do-table=foo%.bar% va rpliquer les mises jour qui surviennent sur toutes les tables de toutes les bases qui commencent par foo, et dont le nom de table commence par bar. Notez que si vous utilisez --replicate-wild-do-table=foo%.%, alors la rgle sera propage CREATE DATABASE et DROP DATABASE, c'est dire que ces deux commandes seront rpliques si le nom de la base correspond au masque (foo% ici) (la magie est ici dclenche par % comme masque de table.). Si le masque de noms de tables est %, il accepte tous les noms de tables et les options s'appliquent aux commandes de niveau base de donnes (comme CREATE DATABASE, DROP DATABASE et ALTER DATABASE). Par exemple, si vous utilisez --replicate-wild-do-table=foo%.%, les commandes de niveau de base de donnes seront rpliques si le nom de la base de donnes est accept par le masque foo%. Si vous voulez faire la rplication des tables du type ma_petite%base (ceci est le nom exact de la base), mais que vous ne voulez pas rpliquer la base ma1petiteAABCbase, vous devez protger les caractres _ et % : il faut utiliser une syntaxe quivalent : replicate-wild-do-table=my \_own\%db. Et si vous spcifiez cette option en ligne de commande, suivant votre systme, vous devrez protger aussi le caractre \ (par exemple, en Shell bash, vous devez mettre une option sous la forme --replicate-wild-do-table=my\\_own\\%db). --replicate-wild-ignore-table=db_name.table_name Dit l'esclave qu'il ne doit pas rpliquer les tables dont le nom vrifie le masque spcifi. Pour spcifier plusieurs tables, il faut utiliser cette directive plusieurs fois, une fois par table. Cela fonctionnera pour les mises jours multi-bases, au contraire de --replicate-do-db. Lisez les notes qui suivent cette liste d'options. 358
Exemple : --replicate-wild-ignore-table=foo%.bar% n'autorisera pas de modifications dans les tables des bases dont le nom commence par foo et dont le nom de table commence par bar. Pour des informations sur le fonctionnement du filtre, voyez l'option --replicate-wild-ignoretable. La rgle pour inclure des caractres littraux est la mme que pour --replicate-wildignore-table. --replicate-rewrite-db=from_name->to_name Dit l'esclave de remplacer la base courante (celle qui est slectionne avec USE) par to_name si elle tait from_name sur le matre. Seules les commandes impliquant des tables peuvent tre affectes. (CREATE DATABASE, DROP DATABASE ne le seront pas), et uniquement si from_name tait la base de donnes courante sur le matre. Cela ne fonctionnera pas pour les commandes multi-bases de donnes. Notez que la traduction est faite avant que les rgles --replicate-* ne soient testes. Si vous utilisez cette option en ligne de commande, et que vous utilisez le caractre >, qui peut tre spcial pour votre interprteur Shell, protgez-le comme ceci :
shell> mysqld --replicate-rewrite-db="olddb->newdb"
--replicate-same-server-id A utiliser sur les serveurs esclaves. Gnralement, vous pouvez spcifier la valeur 0 pour viter les rplications infinies. Si cette option vaut 1, l'esclave n'ignorera pas les vnements de rplication, mme s'ils portent son propre numro d'identification. Normalement, cela n'est utile que pour de trs rares configurations. Vous ne pouvez pas mettre cette option 1 si --log-slaveupdates est utilis. Fates attention en dmarrant MySQL 4.1, par dfaut le thread d'E/S n'crit pas les vnements dans le log de relais s'ils portent l'identification du serveur esclave (c'est une optimisation pour conomiser l'espace disque, par rapport la version 4.0). Si vous voulez utiliser --replicate-same-server-id avec les versions 4.1, assurez vous de dmarrer l'esclave avec cette option avant que l'esclave ne lise ses propres vnements et qu'il les fasse excuter au thread SQL. --report-host=host Le nom d'hte ou l'adresse IP de l'esclave, qui doit tre indique lors de l'enregistrement de l'esclave chez le matre. Cela apparatra dans l'affichage de la commande SHOW SLAVE HOSTS. Laissez cette option vide pour que l'esclave ne s'enregistre pas sur le matre. Notez qu'il n'est pas suffisant pour que le matre lise l'adresse IP de l'esclave sur la socket, une fois que l'esclave se connecte. cause du NAT et des problmes de routages, cette IP peut tre invalide pour se connecter au matre depuis l'hte ou les autres esclaves.
Cette option est disponible depuis MySQL 4.0.0. --report-port=port_number Le port de connexion indiqu par l'esclave lors de son enregistrement chez le matre. Configurez cette option si l'esclave utilise un port autre que le port par dfaut, ou si vous avez install un tunnel spcial pour le matre ou les autres esclaves. Dans le doute, laissez cette option vide.
359
Dit l'esclave de ne pas lancer les threads esclaves au dmarrage du serveur L'utilisateur pourra les lancer manuellement, avec START SLAVE. --slave_compressed_protocol=# Si cette option vaut 1, alors le protocole client/serveur compress sera utilis, si l'esclave et le matre le supportent. --slave-load-tmpdir=filename Cette option vaut par dfaut la variable tmpdir. Lorsque le thread SQL rpliquer des commandes LOAD DATA INFILE, il extrait les fichiers charger du log de relais dans un fichier temporaire, puis charge ce fichier dans la table. Si le fichier charg sur le matre est immense, le fichier temporaire sera aussi grand. Il faudra donc dire l'esclave que placer ces fichiers temporaires sur un grand disque, qui sera diffrent de tmpdir : utilisez cette option. Dans ce cas, vous pouvez aussi utiliser l'option --relay-log, car les fichiers de log de relais seront aussi grands. --slave-loadtmpdir doit pointer sur un systme de fichier bass sur un disque, et non pas sur une portion de mmoire : l'esclave doit pouvoir accder ce fichier pour rpliquer la commande LOAD DATA INFILE, mme aprs un redmarrage. --slave-net-timeout=# Le nombre de secondes attendre des donnes du matre, avant d'annuler la lecture en considrant que la connexion est rompue, et de tenter de se reconnecter. La premire reconnexion intervient immdiatement aprs l'expiration du dlai. L'intervalle entre deux tentatives de connexion est contrl par l'option --master-connect-retry. --slave-skip-errors= [err_code1,err_code2,... | all] Normalement, la rplication s'arrte lorsqu'une erreur survient, ce qui vous donne l'opportunit de rsoudre les incohrences manuellement. Cette option Indique au thread SQL les erreurs qu'il doit ignorer durant la rplication. N'utilisez pas cette option si vous ne connaissez pas la raison des erreurs que vous rencontrez. S'il n'y a pas de bugs dans votre rplication, et qu'il n'y a pas de bug dans MySQL, vous ne devriez pas rencontrer d'erreurs, ni utiliser cette option. L'utilisation abusive de cette option conduit irrmdiablement l'esclave tre dsynchronis avec le matre sans que vous ne sachiez d'o vient l'erreur. Pour les codes d'erreur, il faut utiliser les numros d'erreurs fournis par l'esclave dans le log d'erreur, et dans le rsultat de SHOW SLAVE STATUS. La liste complte des messages d'erreurs est disponible dans la distribution source, dans le fichier Docs/mysqld_error.txt. Les codes d'erreur du serveur sont aussi disponibles sur Chapitre 26, Gestion des erreurs avec MySQL. Vous pouvez (mais ne devez pas) utiliser la valeur trs dconseille de all, qui va ignorer tous les messages d'erreur, et continuer touiller les donnes sans se proccuper de cohrence. Inutile d'insister sur le fait que l'intgrit de vos donnes n'est plus du tout garantie. Ne vous plaignez pas si les donnes de votre esclave ne ressemblent mme pas du tout celle de votre matre : vous aurez t prvenu. Exemples :
--slave-skip-errors=1062,1053 --slave-skip-errors=all
Voici l'ordre d'tude des rgles r--eplicate-*, pour dcider si une requte doit tre excute par l'esclave ou ignore : 1. Existe-t-il des rgles --replicate-do-db ou --replicate-ignore-db ?
360
Oui : les tester pour --binlog-do-db et --binlog-ignore-db (see Section 5.9.4, Le log binaire ). Quel est le rsultat? ignorer la requte : ignore la requte et quitte. excute la requte : n'excute pas la requte immdiatement, reporte la dcision, et passe l'tape d'aprs. Non : passe l'tape d'aprs. 2. Y-t-il des rgles --replicate-*-table? Non : excute la requte et quitte. Oui : passe l'tape d'aprs. Seules les tables qui doivent tre modifies seront utilises dans les rgles : (INSERT INTO sales SELECT * from prices: seule sales sera utilise pour valuer les rgles. Si plusieurs tables doivent tre modifies (modifications multi-tables), la premire table (qui correspond un ``do'' ou ``ignore'') gagne. C'est dire que la premire table est utilise dans les rgles de comparaison, et si aucune dcision ne peut tre prise, la seconde table est utilise... 3. Y a-t-il des rgles --replicate-do-table? Oui : Est-ce qu'une table entre dans cette liste? Oui : excute la requte et quitte. Non : passe l'tape d'aprs. Non : passe l'tape d'aprs. 4. Y a-t-il des rgles --replicate-ignore-table? Oui : Est-ce qu'une table entre dans cette liste? Oui : ignore la requte et quitte. Non : passe l'tape d'aprs. Non : passe l'tape d'aprs. 5. Y a-t-il des rgles --replicate-wild-do-table? Oui : Est-ce qu'une table entre dans cette liste? Oui : excute la requte et quitte. Non : passe l'tape d'aprs. Non : passe l'tape d'aprs. 6. Y a-t-il des rgles --replicate-wild-ignore-table? Oui : Est-ce qu'une table entre dans cette liste? Oui : ignore la requte et quitte. Non : passe l'tape d'aprs. Non : passe l'tape d'aprs. 7. Aucune rgle n'a fonctionn avec --replicate-*-table. Y a-t-il d'autres tables tester?
361
FAQ de la rplication
Oui : boucle. Non : Nous avons test toutes les tables mettre jour, et nous n'avons pas trouv de rgle les concernant. Y a-t-il des rgles --replicate-do-table ou --replicate-wild-do-table? Oui : ignore la requte et quitte. Non : excute la requte et quitte.
3. Excutez la commande SLAVE START Si vous n'avez pas de copie de sauvegarde, voici un moyen rapide d'en faire une : 1. Excutez cette commande MySQL :
mysql> FLUSH TABLES WITH READ LOCK;
3. Utilisez cette commande pour vous assurer de bien noter les informations de rplication. Vous en aurez besoin ultrieurement.
mysql> SHOW MASTER STATUS;
Un autre alternative est de faire un export SQL du matre, au lieu de faire une copie comme indiqu cidessus : pour cela, vous pouvez utiliser l'utilitaire mysqldump --master-data sur votre matre, et excuter ce script ultrieurement sur votre esclave. Cependant, c'est une mthode plus lente que de faire une copie binaire. Quelque soit la mthode que vous adoptez, aprs cela, suivez les instructions comme pour le cas o vous avez dj votre sauvegarde, et que vous avez enregistr le nom et l'offset du point de contrle 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 mme attendre plusieurs jours ou mois avant de mettre en place votre esclave. En thorie, le temps d'attente peut tre infini. En pratique, les limitations sont l'espace disque du matre, et le temps que cela prendra l'esclave pour rattrapper le temps. 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 contrle du log binaire, tout en une
362
FAQ de la rplication
seule commande. Dans le future, LOAD DATA FROM MASTER sera la mthode recommande pour configurer un esclave. Soyez prvenus, que le verrou de lecture pos par la commande sur le serveur peut rester en place un trs long moment, si vous utilisez cette commande : elle n'est pas encore implmente de manire efficace. Si vous avez de grandes tables, prfrez donc la mthode qui utilise la sauvegarde via l'utilitaire tar aprs avoir excut 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 dconnecter plusieurs heures ou jours, puis le reconnecter pour le voir rcuprer les modifications et rattrapper le temps. Puis, se dconnecter nouveau. De cette faon, vous pouvez, par exemple, configurer un esclave via une connexion modem, qui n'utilise que de brve priode de connexions. L'implication de cela est qu'il n'est jamais garantit que l'esclave soit synchronis avec le matre, moins que vous ne preniez des mesures pour cela. Dans le futur, nous allons avoir l'option de bloquer le matre jusqu' ce que au moins un des esclaves soit synchronis. Q : Comment puis-je mesurer le retard d'un esclave sur son matre? En d'autres termes, comme savoir quelle est la date de la dernire requte rplique par l'esclave? R : Si l'esclave est en version 4.1.1 pour plus rcent, lisez la colonne Seconds_Behind_Master dans la commande SHOW SLAVE STATUS. Pour les versions plus anciennes, suivez cette procdure : Cela n'est possible que si un thread SQL existe, c'est dire s'il existe dans la commande SHOW PROCESSLIST, See Section 6.3, Dtails d'implmentation de la rplication . En MySQL version 3.23, si le thread SQL esclave existe, c'est dire, s'il apparait dans la commande SHOW PROCESSLIST, et s'il a excut au moins un vnement lu auprs du matre, the thread modifie sa propre horloge pour prendre l'horaire du dernier vnement rpliqu (c'est pour cela que les colonnes TIMESTAMP sont bien rpliques. Dans la colonne Time du rsultat de SHOW PROCESSLIST, le nombre de secondes affiches est le nombre de secondes entre la dernire commande excute sur le serveur matre et celle excute sur l'esclave. Notez que si votre esclave a t dconnect du matre durant une heure, lorsqu'il se reconnecte, vous pouvez voir immdiatement la valeur 3600 dans la colonne Time, pour le thread esclave dans SHOW PROCESSLIST... Ceci est du au fait que la dernire requte excut date d'une heure. Q : Comment puis-je forcer le matre bloquer les modifications jusqu' ce que l'esclave ait tout rattrapp? R : Excutez les commandes suivantes : 1. Sur le matre, excutez ces commandes :
mysql> FLUSH TABLES WITH READ LOCK; mysql> SHOW MASTER STATUS;
Enregistrez le nom du fichier de log et l'offset, dans la commande SHOW. 2. Sur l'esclave, utilisez la commande ci-dessous, o vous aurez report les arguments de coordonnes de rplication donnes par MASTER_POS_WAIT() :
mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);
La commande SELECT va s'arrter jusqu' ce que l'esclave atteigne le fichier de log et l'offset. A ce point, l'esclave sera synchronis avec le matre, et la commande se terminera. 3. Sur le matre, utilisez la commande suivante pour permettre au matre de recommencer traiter les modifications :
mysql> UNLOCK TABLES;
FAQ de la rplication
R : La rplication MySQL ne supporte aucun protocole de verrouillage entre le matre et l'esclave pour garantir l'atomicit d'une modification entre les serveurs. En d'autres termes, il est possible pour un client A de faire une modification sur le serveur 1 et que dans le mme temps, avant que cela ne se soit propag au serveur 2, un client B se connecte au serveur 2, et fasse une modification sur le serveur 2 qui ne dbouchera pas sur le mme tat que celui dans lequel le serveur 1 est. C'est ainsi qu'il ne faut pas lier de cette faon deux serveurs, moins que les modifications ne puisse se faire dans n'importe quel ordre, ou que vous sachiez prendre en charge des modifications anarchiques. Vous devez aussi raliser que la rplication bi-directionnelle n'amliore pas beaucoup les performances, tout au moins au niveau des modifications. Les deux serveurs doivent faire la mme quantit de modifications, ainsi qu'un serveur seul le ferait. La seule diffrence est qu'il va y avoir moins de verrous, car les modifications qui proviennent d'un autre serveur seront optimis par l'esclave. Cet avantage peut aussi tre annul par les dlais rseau. Q : Comment puis-je utiliser la rplication pour amliorer les performances de mon systme ? R : Vous devez configurer un serveur en matre et y diriger toutes les critures, puis configurer les autres en esclaves dans la limite de vos moyens, et y distribuer les lectures. Vous pouvez aussi dmarrer les esclaves en mode --skip-bdb, --low-priority-updates et --delaykey-write=ALL pour acclrer les esclaves. Dans ce cas, l'esclave va utiliser les tables non transactionnelles MyISAM au lieu des tables BDB pour obtenir plus de vitesse. Q : Que dois-je faire pour prparer mon code client la rplication? R : Si la partie de votre code qui ralise les accs aux bases de donnes a t proprement modularise, la convertir en une configuration qui supporte la rplication ne sera pas un problme : modifiez simplement votre base pour qu'elle aille lire sur les esclaves et le matre, mais ne fasse que des modifications avec le matre. Si votre code n'a pas ce niveau d'abstraction, l'installation du systme de rplication vous donnera alors la motivation ou la raison pour le faire. Vous devriez commencer par crer une couche d'abstraction ou un module avec les fonctions suivantes : safe_writer_connect() safe_reader_connect() safe_reader_query() safe_writer_query() safe_ signifie que la fonction devra prendre en charge toutes les conditions d'erreurs. Naturellement, vous pouvez utiliser des noms diffrents pour les fonctions. L'important est de savoir clairement laquelle se connecte en criture et laquelle se connecte en lecture, et laquelle lit et laquelle crit. Vous devriez alors convertir votre code client pour qu'il utilise cette bibliothque. Cela peut tre un processus laborieux et droutant, mais il va s'avrer payant dans le long terme. Toutes les applications qui suivent la technique ci-dessus pourront alors prendre avantage des solutions de rplication. Le code sera aussi bien plus facilement entretenu, et ajouter des options sera trivial. Vous devrez modifier une ou deux fonctions, comme par exemple pour enregistrer le temps de calcul de certaines requtes, ou les requtes qui vous retournent des erreurs. Si vous avez crit beaucoup de code jusqu'ici, vous pourriez vouloir automatiser la conversion en utilisant l'utilitaire de Monty, replace, qui est distribu avec la distribution standard de MySQL, ou bien simplement en crivant un script Perl. Avec un peu de chance, votre code suit des conventions connues. Si ce n'est pas le cas, alors vous serez peut tre conduit rcrire votre application de toutes manires, ou bien, lui appliquer des mthodes la main. Q : Quand et combien de rplications de MySQL permettent d'amliorer les performances de mon systme? R : La rplication MySQL est particulirement avantageuse pour les systmes qui grent des lectures frquentes, et des critures plus rares. En thorie, en utilisant uniquement un matre et beaucoup
364
FAQ de la rplication
d'esclaves, vous pouvez augmenter les performances de votre systme jusqu' saturation de la bande passante ou du matre, pour les modifications. Afin de dterminer le nombre d'esclaves que vous pouvez obtenir voir les performances de votre systme s'amliorer, vous devez bien connatre les types de requtes que vous utilisez, et empiriquement dterminer la relation entre le nombre de lectures et d'critures (par secondes, ou maximum absolu), pour un matre et un esclave. L'exemple ci-dessous va vous montrer comment faire des calculs simples. Imaginons que votre charge systme soit constitue de 10% d'criture et de 90% de lectures. Nous avons aussi dtermin que le maximum de lectures max_reads = 1200 2 * max_writes, ou, en d'autres mots, notre systme peut voir des pics de 1200 lectures par secondes sans aucune critures, notre temps d'criture moyen est deux fois plus temps qu'une lecture, et la relation est linaire. Supposons que notre matre et notre esclave sont de la mme capacit, et que nous avons N esclaves et un matre. Nous avons alors pour chaque serveur (matre ou esclave) : lectures = 1200 - 2 * criture (issue des tests) lectures = 9* criture / (N + 1) (lectures rparties, mais toutes les critures vont tous les serveurs) 9*criture/(N+1) + 2 * criture = 1200 criture = 1200/(2 + 9/(N+1) Si N = 0, ce qui signifie que nous n'avons pas de rplication, notre systme peut grer 1200/11, environs 109 critures par secondes, ce qui signifie (que nous aurons 9 fois plus de lectures que d'critures, tant donn la nature de notre application). Si N = 1, nous pouvons monter 184 criture par seconde. Si N = 8, nous pouvons monter 400 criture par seconde. Si N = 17, nous pouvons monter 480 criture par seconde. Eventuellement, si N se rapproche de l'infini (et notre budget de l'infini ngatif), nous pourrons nous rapprocher de 600 critures par secondes, en amliorant le systme 5,5 fois. Toutefois, avec 8 serveurs, nous avons pu amliorer le systme de 4 fois. Notez que nos calculs ont supposs une bande passante infinie, et que nous avons nglig des facteurs qui pourraient tre significatifs pour notre systme. Dans de nombreux cas, nous ne pourrions pas faire de calculs prcis pour prdire l'tat de notre systme avec N esclaves de rplication. Toutefois, rpondre aux questions ci-dessus vous permettra de dcider si la rplication est une solution votre problme ou pas. Quel est le ratio d'criture/lecture de votre systme? Quelle est la charge maximale d'un serveur en criture, si vous pouvez limiter les lectures? Combien d'esclaves votre rseau peut supporter? Q : Comment puis-je utiliser la rplication pour fournir un systme haute tolrance de panne? R : Avec les fonctionnalits actuellement disponible, vous devez configurer un serveur et un esclave (ou plusieurs esclaves), et crire un script qui va surveiller le matre pour voir si il fonctionne , et instruire votre application et les esclaves d'un changement de matre en cas d'chec. Voici des suggestions : Utilisez la commande CHANGE MASTER TO pour changer un esclave en matre. Un bon moyen de garder votre application inform du matre courant est d'utiliser les DNS dynamiques, vous pouvez attribuer au matre. Avec bind, vous pouvez utiliser nsupdate pour modifier dynamiquement votre DNS.
365
FAQ de la rplication
Vous devez faire fonctionner vos esclaves avec l'option log-bin et sans l'option log-slaveupdates. De cette faon, l'esclave sera prt prendre le relais ds que vous lui enverrez la commande STOP SLAVE; envoyez RESET MASTER et CHANGE MASTER TO aux autres esclaves. Par exemple, considrez l'architecture suivante (``M'' reprsente le matre, ``S'' les esclaves, ``WC'' les clients qui mettent des commandes de lecture et criture. Les clients qui ne font que des lectures ne sont pas reprsents, car ils n'ont pas changer quoi que ce soit.
WC \ WC----> / / v S1 v M | \ | \ v v S2 S3
S1 (comme S2 et S3) est un esclave qui fonctionne avec les options --log-bin et sans --logslave-updates. Comme les seules critures faites sur S1 sont celles qui sont rpliques depuis M, le log binaire de S1 est vide : n'oubliez pas que S1 fonctionne sans --log-slave-updates. Puis, pour une raison quelconque, M devient inaccessible, et vous voulez que S1 devienne le nouveau matre (c'est dire, les WC sont diriges vers S1, et S2 et S3 rpliquent S1. Assurez vous que tous les esclaves ont fini de trater les requtes de leur log de relais. Sur chaque esclave, faites STOP SLAVE IO_THREAD, puis vrifiez le rsultat de la commande SHOW PROCESSLIST jusqu' ce que vous lisiez Has read all relay log. Lorsque cela est vrai pour tous les esclaves, ils peuvent tre reconfigurs vers un nouveau matre. Faites STOP SLAVE sur chaque esclave, et RESET MASTER sur celui qui devient le matre, puis CHANGE MASTER sur les autres. Aucun WC n'accde M. Reconfigurez les WC pour qu'ils dirigent leurs requtes sur S1. A partir de maintenant, les requtes envoyes par WC S1 sont crites dans le log binaire. Le log binaire de S1 contient maintenant exactement chaque requte envoye S1 depuis que M est mort. Sur S2 (et S3), faites STOP SLAVE, CHANGE MASTER TO MASTER_HOST='S1' (o 'S1' est remplac par le vrai nom d'hte de S1). Pour changer le matre, utilisez la commande CHANGE MASTER, et ajoutez les informations de connexion S1 depuis S2 et S3 (utilisateur, mot de passe, port). Dans CHANGE MASTER, il n'y a pas besoin de spcifier le nom du fichier de log binaire de S1, ou la position dans le log : nous savons que c'est le premier fichier et le premier offset (position 4), car ce sont les coordonnes par dfaut utilises par CHANGE MASTER. Finalement, lances START SLAVE sur S2 et S3, et maintenant, vous avez ceci :
WC / | WC | M(indisponible) \ | \ | v v S1<--S2 S3 ^ | +-------+
Lorsque M est de nouveau disponible, vous devez utiliser la commande CHANGE MASTER comme vous l'avez fait avec S2 et S3, pour que M devienne l'esclave de S1 et rattrappe toutes les modifications que les WC ont mise, et qu'il a manqu. Puis, pour refaire de M le matre, suivez la mme procdure que prcdemment, comme si S1 tait indispoinble et que M prenait le relais. Durant la procdure, n'oubliez pas d'utiliser la commande RESET MASTER sur M avant de faire de S1, S2 et S3 des esclaves de M, car ils risquent de reprendre les anciennes requtes des WC, qui datent d'avant l'indisponibilit de M. Nous travaillons actuellement l'intgration automatique de l'lection d'un nouveau matre, mais jusqu' ce que ce soit prs, vous devez crer votre propre outil de surveillance. 366
La valeur de n doit tre de 1 si la requte n'utilise pas de valeur AUTO_INCREMENT ou LAST_INSERT_ID(). Sinon, la valeur doit tre de 2. La raison pour utiliser la valeur 2 pour les requtes qui utilisent AUTO_INCREMENT ou LAST_INSERT_ID() est qu'elles requirent deux lignes dans le log binaire. 4. Si vous tes srs que l'esclave est parfaitement synchronis avec le matre, et que personne n'a mis jour les tables impliques, rapportez nous un bug.
367
Si vous avez un moyen de reproduire le bug, alors indiquez le dans notre base de bugs l'adresse http://bugs.mysql.com/. Si vous avez un problme fantme (un qui ne peut tre rproduire `` souhait''), utilisez la procduire suivante : 1. Vrifiez qu'il n'y a pas d'erreur utilisateur implique. Par exemple, si vous modifiez l'esclave sans passer par le thread esclave, les donnes seront dsynchronisez et vous pourrez alors rencontrer des problmes de contraintes de cls uniques durant les modifications. Dans ce cas, l'esclave doit tre arrt et nettoy manuellement pour tre synchronis avec le matre. Ce n'est pas un problme de rplication : c'est un problme d'interference extrieure, qui conduit l'chec de la rplication. 2. Excutez l'esclave avec les options --log-slave-updates et --log-bin. Elles font que l'esclave va enregistrer les modifications qu'il reoit dans ses propres logs binaires. 3. Sauvez toutes les preuves avant de remettre zro l'tat de la rplication. Si vous n'avez aucune information, ou seulement des informations partielles, cela nous prendra plus de temps pour rechercher le problme. Les preuves que vous devez rassembler sont : Tous les logs binaires du matre Tous les logs binaires de l'esclave Le rsultat de la commande SHOW MASTER STATUS sur le matre au moment du problme. Le rsultat de la commande SHOW SLAVE STATUS sur l'esclave au moment du problme. Les logs d'erreur du matre et de l'esclave. 4. Utilisez mysqlbinlog pour xaminer les logs binaires. La commande suivante doit permettre d'identifier la requte coupable :
mysqlbinlog -j pos_from_slave_status /path/to/log_from_slave_status | head
Une fois que vous avez rassemblez toutes ces preuves du problme fantme, essayer de l'isoler dans des cas de tests indpendants. Puis, soumettez le problme dans notre base de bugs l'adresse http://bugs.mysql.com/ avec toute autre information importante.
368
369
Prsentation de l'optimisation
Ce chapitre va tenter d'expliquer et de donner des exemples de diffrentes manires d'optimiser MySQL. Souvenez-vous, malgr tout, qu'il existe toujours d'autres moyens (de plus en plus difficiles) de rendre le systme plus vloce.
7.1.2. Portabilit
370
Comme tous les serveurs SQL implmentent diffremment le langage SQL, cela prend de solides connaissances pour crire des applications SQL portables. Pour les insertions et slections simples, c'est trs simple, mais plus vos besoins se complexifient, plus c'est abscons. Si vous voulez une application qui fonctionne rapidement sur de nombreuses bases de donnes, c'est mme encore plus difficile. Pour rendre une application complexe portable, vous pouvez commencer par choisir une panoplie de serveurs SQL avec lesquels travailler. Vous pouvez utiliser le programme/page web de MySQL appel crash-me pour trouver les fonctions, types et limites que vous pouvez utiliser avec un panel de serveurs de bases de donnes. Les tests de crash-me ne vrifient pas tout, mais il est dj trs exhaustif avec plus de 450 points de tests. Par exemple, vous ne devriez pas avoir de nom de colonne suprieur 18 caractres, si vous voulez pouvoir utiliser Informix ou DB2. Les programmes de tests crash-me et de performances de MySQL sont trs indpendants du serveur. En regardant comment nous avons gr ces situations, vous pouvez comprendre comment rendre votre propre code indpendant du serveur. Les tests de performances sont situs dans le dossier sql-bench de la distribution source de MySQL. Ils sont crits en Perl avec l'interface DBI, ce qui rsout les problmes de connexion. Voyez http://www.mysql.com/information/benchmarks.html pour connatre les rsultats de ces benchmarks. Comme vous pouvez le voir avec ces rsultats, toutes les bases de donnes ont leur point faible. En ralit, elles ont toutes une approche diffrente du mme problme, et cela conduit des comportements spcifiques. Si vous avez besoin de l'indpendance au serveurs de bases de donnes, vous devez bien connatre les faiblesses de chaque serveur. MySQL est trs rapide pour lire et modifier les donnes, mais peine lorsque les lectures et critures sont lentes sur la mme table. Oracle, d'un autre cot, a de gros problmes lorsque vous essayez d'accder aux donnes que vous avez modifi rcemment (jusqu' ce qu'elles soient crites sur le disque). Les bases de donnes transactionnelles en gnral ne sont pas trs doues pour gnrer des tables rsums partir des tables de log, car dans ce cas, le verrouillage de ligne est inutile. Pour rendre votre application reellement indpendante de la base de donnes, vous devez dfinir un classe trs souple travers laquelle vous allez vous interfacer pour manipuler vos donnes. Comme le langage C++ est disponible sur la plupart des systmes, cela rend les classes C++ trs pratiques pour cette tche. Si vous utilisez une fonctionnalit spcifique d'une base de donnes (comme la commande REPLACE de MySQL), il vous faut aussi coder la mme commande pour les autres serveurs (qui sera alors plus lente). Avec MySQL, vous pouvez aussi utiliser la syntaxe /*! */ pour utiliser des mots cls spcifiques de MySQL dans une requte. Le code entre /* */ sera alors trait comme un commentaire et ignor par la plupart des autres serveurs SQL. Si les hautes performances sont plus importantes que l'exactitude, comme pour les applications web, il est possible de crer une couche application qui met en cache les rsultats et vous donne de meilleures performances. En laissant les anciens rsultats se primer, vous pouvez garder un cache jour. Cela vous donne une mthode pour grer les grandes charges, durant lesquelles vous pouvez augmenter la taille du cache, et augmenter la dure de vie. Dans ce cas, les informations de cration de tables doivent contenir les informations de taille initiale du cache, et la frquence de rafrachissement des tables. See Section 5.11, Cache de requtes MySQL .
Pendant le dveloppement initial de MySQL, les fonctions de MySQL ont t cres pour convenir un maximum de clients. Celles ci supporte des entrepts de donnes pour deux des plus gros revendeurs sudois. Nous recevons chaque semaine le rsum de toutes les transactions par carte de toutes les boutiques, et nous sommes chargs de fournir des informations utiles aux grants des boutiques pour les aider comprendre comment leurs propres campagnes publicitaires touchent leurs clients. Les donnes sont assez normes (prs de 7 millions de rsums de transactions par mois), et nous avec les donnes de 4-10 ans que nous prsentons aux utilisateurs. Nous avons chaque semaine des requtes des clients qui veulent un accs 'instantan' aux nouveaux rapports sur ces donnes. Nous avons russi en stockant toutes les informations dans des tables de 'transactions' compresses. Nous avons une srie de macros (scripts) qui gnre des tables de rsums groups par diffrents critres (groupe de produits, identifiant de client, boutique ...). ces rapports sont des pages web gnres dynamiquement par un petit script Perl qui parcours une page web, excute les requtes SQL, et insre les rsultats. Nous aurions bien utilis PHP ou mod_perl la place, mais ils n'taient pas disponibles cette poque. Nous avons crit un outil en C pour la reprsentation graphique des donnes qui gnre des GIFs partir du rsultat de requtes SQL (avec quelques traitements sur le rsultat). Ceci est galement effectu dynamiquement par le script Perl qui parcourt les fichiers HTML. Pour la plupart des cas, un nouveau rapport peut simplement tre fait en copiant un script existant, et en modifiant la requte SQL qu'il excute. Dans certains cas, nous aurons besoin d'ajouter des champs une table de rsum existante ou d'en gnrer une nouvelle, mais c'est tout de mme toujours assez simple, car nous gardons toutes les tables de transactions sur disque. (Actuellement, nous avons au moins 50 Go de tables de transactions et 200 Go d'autres donnes sur les clients.) Nous donnons galement accs aux tables de rsums nos clients directement avec ODBC, de sorte que les utilisateurs avancs puissent traiter les donnes eux-mmes . Nous n'avons eu aucun problme supporter tout cela avec une relativement modeste Sun Ultra SPARCStation (2x200 MHz). Nous avons rcemment amlior l'un de nos serveurs en un bi-CPU 400 MHz UltraSPARC, et nous projetons actuellement de supporter les transactions au niveau du produit, ce qui signifie un dcuplement des donnes. Nous pensons pouvoir y arriver uniquement en ajoutant des disques supplmentaires nos systmes. Nous exprimentons aussi Intel-Linux, pour pouvoir avoir plus de puissance CPU pour moins cher. Comme nous utilisons dsormais le format binaire portable pour les bases de donnes (nouveaut de la version 3.23), nous utiliserons cela pour quelques parties de l'application. Nous avons au dpart le sentiment que Linux s'acquittera mieux des faibles et moyennes charges tandis que Solaris fonctionnera mieux sur les grosses charges cause des I/O disques extrmes, mais nous n'avons actuellement aucune conclusion ce propos. Aprs quelques discussion avec un dveloppeur du noyau Linux, un effet de bord de Linux pourrait tant de ressources aux travaux de traitement que les performances de l'interface interactive peut devenir vraiment lente. Cela fait apparatre la machine trs lente et sans rponse lorsque de gros traitements sont en cours. Heureusement, cela sera mieux gr dans les futurs noyaux de Linux.
372
Sachez que ces tests de performances lancent en un seul thread, donc il mesure le temps minimum pour chaque opration. Nous projetons pour le futur d'ajouter de nombreux tests multi-thread cette suite de tests. Par exemple, (tous ont t lancs sur une mme machine NT 4.0) Lecture de 2000000 lignes indexes mysql mysql_odbc db2_odbc informix_odbc ms-sql_odbc oracle_odbc solid_odbc sybase_odbc Insertion de lignes (350768 mysql mysql_odbc db2_odbc informix_odbc ms-sql_odbc oracle_odbc solid_odbc sybase_odbc Le test ci-dessus a t excut avec un index de cache de 8 Mo. Nous avons rassembl d'autres rsultats de tests http://www.mysql.com/information/ benchmarks.html. Notez que Oracle n'est pas inclus dans ces tests car ils ont demand tre retirs. Tous les tests d'Oracle doivent tre faits par Oracle! Nous croyons que cette politique va biaiser fortement les tests en faveur de Oracle, car les tests ci-dessus sont supposs montrer ce qu'une installation simple peut faire pour un client simple. Pour utiliser la suite de tests, les prerequis suivants doivent tre vrifis : La suite de tests est disponible dans la distribution source de MySQL, et vous devez avoir tlcharg cette distribution. Vous pouvez tlcharger la version publie sur le site de http://www.mysql.com/ downloads/, ou utiliser celle du serveur de dveloppement (see Section 2.4.3, Installer partir de l'arbre source de dveloppement ). Les scripts de tests ont t crits en Perl, et utilisent le module Perl DBI pour accder aux serveurs, donc DBI doit tre installe. Vous aurez aussi besoin des pilotes spcifiques DBD de chaque serveur que vous voulez tester. Par exemple, pour tester MySQL, PostgreSQL et DB2, les modules DBD::mysql, DBD::Pg et DBD::DB2 doivent tre installs. See Section 2.9, Commentaires sur l'installation de Perl . La suite de tests est situe dans le dossier sql-bench de la distribution source de MySQL. Pour excuter la suite de tests, compilez MySQL, puis allez dans le dossier sql-bench et excutez le script run-all-tests :
shell> cd sql-bench
Secondes 367 464 1206 121126 1634 20800 877 17614 Secondes 381 619 3460 2692 4012 11291 1801 4802
Secondes 249
Secondes 206
373
server_name est un des serveurs supports. Pour avoir la liste de toutes les options et serveurs supports. utilisez cette commande :
shell> perl run-all-tests --help
Le script crash-me est aussi situ dans le dossier sql-bench. crash-me essaie de dterminer quelles fonctionnalits un serveur supporte, et quelles sont ses limitations. Par exemple, le test dtermine : Les types de colonnes supports Le nombre d'index supports Les fonctions supportes La taille maximale d'une requte La taille maximale d'une colonne VARCHAR
374
requtes, il peut se rvler bnfique d'utiliser une structure de droits simplifie, pour rduire le temps de vrification. Si votre problme est spcifique une expression MySQL ou une fonction, vous pouvez utiliser la fonction BENCHMARK() du client mysql pour effectuer un test de performances. La syntaxe est BENCHMARK(loop_count,expression). Par exemple :
mysql> SELECT BENCHMARK(1000000,1+1); +------------------------+ | BENCHMARK(1000000,1+1) | +------------------------+ | 0 | +------------------------+ 1 row in set (0.32 sec)
Ce qui prcde montre que MySQL peut excuter 1 000 000 d'additions en 0.32 secondes sur un PentiumII 400MHz. Toutes les fonctions MySQL sont sens tre optimises, mais il peut y avoir quelques exceptions et la fonction BENCHMARK(nombre_de_fois,expression) est un trs bon moyen de trouver ce qui cloche dans vos requtes.
Ou :
EXPLAIN SELECT select_options
EXPLAIN nom_de_table est un synonyme de DESCRIBE nom_de_table ou SHOW COLUMNS FROM nom_de_table. La syntaxe EXPLAIN tbl_name est synonyme de DESCRIBE tbl_name ou SHOW COLUMNS FROM tbl_name. Lorsque vous faites prcder une commande SELECT avec le mot cl EXPLAIN, MySQL vous explique comment il va traiter la commande SELECT, choisir les tables et index pour les jointures. Cette section fournit des informations sur comment utiliser EXPLAIN. Avec l'aide de EXPLAIN, vous pouvez identifier les index ajouter pour acclrer les commandes SELECT. Vous devriez souvent utiliser la commande ANALYZE TABLE pour mettre jour les statistiques de cardinalit de vos tables, qui affectent les choix de l'optimiseur. See Section 13.5.2.1, Syntaxe de ANALYZE TABLE . Vous pouvez aussi voir si l'optimiseur fait les jointures dans un ordre vraiment optimal. Pour forcer l'optimiseur utiliser un ordre spcifique de jointure dans une commande SELECT, ajoutez l'attribut STRAIGHT_JOIN la clause. Pour les jointures complexes, EXPLAIN retourne une ligne d'information pour chaque table utilise dans la commande SELECT. Les tables sont listes dans l'ordre dans lequel elles seront lues. MySQL rsout toutes les jointures avec une seule passe multi-jointure. Cela signifie que MySQL lit une ligne dans la premire table, puis recherche les lignes qui correspondent dans la seconde, puis dans la troisime, etc. Lorsque toutes les tables ont t traites, MySQL affiche les colonnes demandes, et il remonte dans les tables jusqu' la dernire qui avait encore des lignes traiter. La prochaine ligne est alors traite de la mme faon. Avec MySQL version 4.1 l'affichage de EXPLAIN a t modifi pour mieux fonctionner avec les structures comme UNION, sous-requtes, et tables drives. La plus importante volution est l'addition de deux nouvelles colonnes : id et select_type.
375
Le rsultat de la commande EXPLAIN est constitu des colonnes suivantes : id identifiant de SELECT, le numro squentiel de cette commande SELECT dans la requte. select_type Type de clause SELECT, qui peut tre : SIMPLE SELECT simple (sans utiliser de clause UNION ou de sous-requtes). PRIMARY SELECT extrieur. UNION Second et autres UNION SELECTs. DEPENDENT UNION Second et autres UNION SELECTSs, dpend de la commande extrieure. SUBQUERY Premier SELECT de la sous-requte. DEPENDENT SUBSELECT Premier SELECT, dpendant de la requte extrieure. DERIVED Table drive SELECT. table La table laquelle la ligne fait rfrence. type Le type de jointure. Les diffrents types de jointures sont les suivants, dans l'ordre du plus efficace au plus lent : system La table a une seule ligne (c'est une table systme). C'est un cas spcial du type de jointure const. const La table a au plus une ligne correspondante, qui sera lue ds le dbut de la requte. Comme il n'y a qu'une seule ligne, les valeurs des colonnes de cette ligne peuvent tre considres comme des constantes pour le reste de l'optimiseur. Les tables const sont trs rapides, car elles ne sont lues qu'une fois. const est utilis lorsque vous comparez toutes les parties d'une cl PRIMARY/UNIQUE avec des constantes :
SELECT * FROM const_table WHERE primary_key=1;
376
eq_ref Une ligne de cette table sera lue pour chaque combinaison de ligne des tables prcdentes. C'est le meilleur type de jointure possible, l'exception des prcdents. Il est utilis lorsque toutes les parties d'un index sont utilises par la jointure, et que l'index est UNIQUE ou PRIMARY KEY. eq_ref peut tre utilis pour les colonnes indexes, qui sont compares avec l'oprateur =. L'lment compar doit tre une constante ou une expression qui utiliser les colonnes de la table qui est avant cette table. Dans l'exemple suivant, ref_table sera capable d'utiliser eq_ref :
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref Toutes les lignes avec des valeurs d'index correspondantes seront lues dans cette table, pour chaque combinaison des lignes prcdentes. ref est utilis si la jointure n'utilise que le prfixe de gauche de la cl, ou si la cl n'est pas UNIQUE ou PRIMARY KEY (en d'autres termes, si la jointure ne peut pas slectionner qu'une seule ligne en fonction de la cl). Si la cl qui est utilise n'identifie que quelques lignes chaque fois, la jointure est bonne. ref peut tre utilis pour les colonnes indexes, qui sont compares avec l'oprateur =. Dans les exemples suivants, ref_table sera capable d'utiliser ref.
SELECT * FROM ref_table WHERE key_column=expr; SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref_or_null Comme ref, mais avec le cot supplmentaire pour les recherches couvrant les valeurs NULL. Ce type de jointure est nouveau en MySQL 4.1.1 est sert essentiellement la rsolution des sousrequtes. Dans les exemples suivants, MySQL peut utiliser une jointure ref_or_null pour traiter ref_table :
SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
See Section 7.2.7, Comment MySQL optimise IS NULL . index_merge Ce type de jointure indique que l'optimisation de type Index Merge est utilise. Dans ce cas, la colonne key contient une liste d'index utiliss, et key_len contient la liste des plus longues parties de cls utilises. Pour plus d'informations, voyez Section 7.2.6, Optimisation de combinaison d'index . 377
unique_subquery Ce type remplace le type ref dans certaines sous-requtes IN de la forme suivante :
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery est simplement une analyse d'index, qui remplace compltement la sousrequte pour une meilleure efficacit. index_subquery Ce type de jointure est similaire unique_subquery. Elle remplace des sous-requtes IN, mais elle fonctionne pour les index non-uniques dans les sous-requtes de la forme suivante :
value IN (SELECT key_column FROM single_table WHERE some_expr)
range Seules les lignes qui sont dans un intervalle donn seront lues, en utilisant l'index pour slectionner les lignes. La colonne key indique quel est l'index utilis. key_len contient la taille de la partie de la cl qui est utilise. La colonne ref contiendra la valeur NULL pour ce type. range peut tre utilis lorsqu'une colonne indexe est compare avec une constante comme =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN ou IN.
SELECT * FROM tbl_name WHERE key_column = 10; SELECT * FROM tbl_name WHERE key_column BETWEEN 10 and 20; SELECT * FROM tbl_name WHERE key_column IN (10,20,30); SELECT * FROM tbl_name WHERE key_part1= 10 AND key_part2 IN (10,20,30);
index C'est la mme chose que ALL, hormis le fait que seul l'arbre d'index est tudi. C'est gnralement plus rapide que ALL, car le fichier d'index est plus petit que le fichier de donnes. Cette mthode peut tre utilise lorsque la requte utilise une colonne qui fait partie d'un index. ALL Une analyse complte de la table sera fate pour chaque combinaison de lignes issue des premires tables. Ce n'est pas bon si la premire table n'est pas une jointure de type const et c'est trs mauvais dans les autres cas. Normalement vous pouvez viter ces situations de ALL en ajoutant des index base sur des parties de colonnes. possible_keys La colonne possible_keys indique quels index MySQL va pouvoir utiliser pour trouver les lignes dans cette table. Notez que cette colonne est totalement dpendante de l'ordre des tables. Cela signifie que certaines cls de la colonne possible_keys pourraient ne pas tre utilises dans d'autres cas d'ordre de tables. Si cette colonne est vide, il n'y a pas d'index pertinent. Dans ce cas, vous pourrez amliorer les performances en examinant votre clause WHERE pour voir si des colonnes sont susceptibles d'tre indexe. Si c'est le cas, crez un index appropri, et examinez le rsultat avec la commande EXPLAIN. See Section 13.2.2, Syntaxe de ALTER TABLE . 378
Pour connatre tous les index d'une table, utilisez le code SHOW INDEX FROM nom_de_table. key La colonne key indique l'index que MySQL va dcider d'utiliser. Si la cl vaut NULL, aucun index n'a t choisi. Pour forcer MySQL utiliser un index list dans la colonne possible_keys, utilisez USE KEY/IGNORE KEY dans votre requte. See Section 13.1.7, Syntaxe de SELECT . Pour les tables MyISAM et BDB, la commande ANALYZE TABLE va aider l'optimiseur choisir les meilleurs index. Pour les tables MyISAM, myisamchk --analyze fera la mme chose. Voyez Section 13.5.2.1, Syntaxe de ANALYZE TABLE et Section 5.7.3, Utilisation de myisamchk pour la maintenance des tables et leur recouvrement . key_len La colonne key_len indique la taille de la cl que MySQL a dcid d'utiliser. La taille est NULL si la colonne key vaut NULL. Notez que cela vous indique combien de partie d'une cl multiple MySQL va rellement utiliser. ref La colonne ref indique quelle colonne ou quelles constantes sont utilises avec la cl key, pour slectionner les lignes de la table.
rows La colonne rows indique le nombre de ligne que MySQL estime devoir examiner pour excuter la requte. Extra Cette colonne contient des informations additionnelle sur comment MySQL va rsoudre la requte. Voici une explication des diffrentes chanes que vous pourriez trouver dans cette colonne : Distinct MySQL ne va pas continuer chercher d'autres lignes que la ligne courante, aprs en avoir trouv une. Not exists MySQL a t capable d'appliquer une optimisation de type LEFT JOIN sur la requte, et ne va pas examiner d'autres lignes de cette table pour la combinaison de lignes prcdentes, une fois qu'il a trouv une ligne qui satisfait le critre de LEFT JOIN. Voici un exemple de cela :
SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
Supposons que t2.id est dfini comme NOT NULL. Dans ce cas, MySQL va scanner t1 et rechercher des lignes dans t2 via t1.id. Si MySQL trouve une ligne dans t2, il sait que t2.id ne peut pas tre NULL, et il ne va pas scanner le reste des lignes de t2 qui ont le mme id. En d'autres termes, pour chaque ligne de t1, MySQL n'a besoin que de faire une recherche dans t2, indpendamment du nombre de lignes qui sont trouves dans t2. range checked for each record (index map: #) MySQL n'a pas trouv d'index satisfaisant utiliser. Il va, la place, pour chaque combinaison de lignes des tables prcdentes, faire une vrification de quel index utiliser (si il en existe), et utiliser
379
cet index pour continuer la recherche. Ce n'est pas trs rapide, mais c'est plus rapide que de faire une recherche sans aucun index. Using filesort MySQL va avoir besoin d'un autre passage pour lire les lignes dans l'ordre. Le tri est fait en passant en revue toutes les lignes, suivant le type de jointure est stocker la cl de tri et le pointeur de la ligne pour chaque ligne qui satisfont la clause WHERE. Alors, les cls sont tries. Finalement, les lignes sont tries dans l'ordre. Using index Les informations de la colonne sont lues de la table, en utilisant uniquement les informations contenues dans l'index, sans avoir faire d'autres lectures. Cela peut arriver lorsque toutes les colonnes utilises dans une table font partie de l'index. Using temporary Pour rsoudre la requte, MySQL va avoir besoin de crer une table temporaire pour contenir le rsultat. C'est typiquement ce qui arrive si vous utilisez une clause ORDER BY sur une colonne diffrente de celles qui font partie de GROUP BY. Using where Une clause WHERE sera utilise pour restreindre les lignes qui seront trouves dans la table suivante, ou envoye au client. Si vous n'avez pas cette information, et que la table est de type ALL ou index, vous avez un problme dans votre requte (si vous ne vous attendiez pas tester toutes les lignes de la table). Si vous voulez rendre vos requtes aussi rapide que possible, vous devriez examiner les lignes qui utilisent Using filesort et Using temporary. Vous pouvez obtenir une bonne indication de la qualit de votre jointure en multipliant toutes les valeurs de la colonne rows dans la table de la commande EXPLAIN. Cela est une estimation du nombre de lignes que MySQL va examiner pour excuter cette requte. C'est aussi ce nombre qui sera utilis pour interrompre votre requte, grce la variable max_join_size. See Section 7.5.2, Rglage des paramtres du serveur . L'exemple ci-dessous illustre comme une requte JOIN peut tre optimise avec les rsultats de la commande EXPLAIN. Supposons que vous avez la requte SELECT suivante, et que vous l'examinez avec EXPLAIN:
EXPLAIN SELECT tt.TicketNumber, tt.TimeIn, tt.ProjectReference, tt.EstimatedShipDate, tt.ActualShipDate, tt.ClientID, tt.ServiceCodes, tt.RepetitiveID, tt.CurrentProcess, tt.CurrentDPPerson, tt.RecordVolume, tt.DPPrinted, et.COUNTRY, et_1.COUNTRY, do.CUSTNAME FROM tt, et, et AS et_1, do WHERE tt.SubmitTime IS NULL AND tt.ActualPC = et.EMPLOYID AND tt.AssignedPC = et_1.EMPLOYID AND tt.ClientID = do.CUSTNMBR;
Pour cette exemple, nous supposons que : Les colonnes utilises sont dclares comme ceci : Table tt Colonne ActualPC 380 Type de colonne CHAR(10)
tt tt et do
Les tables ont les index suivants : Table tt tt tt et do Index ActualPC AssignedPC ClientID EMPLOYID (cl primaire) CUSTNMBR (cl primaire)
Les valeurs de tt.ActualPC ne sont pas rparties galement. Initialement, avant toute optimisation, la commande EXPLAIN produit les informations suivantes :
table et do et_1 tt type ALL ALL ALL ALL possible_keys key key_len ref rows Extra PRIMARY NULL NULL NULL 74 PRIMARY NULL NULL NULL 2135 PRIMARY NULL NULL NULL 74 AssignedPC, NULL NULL NULL 3872 ClientID, ActualPC range checked for each record (key map: 35)
Comme le type type vaut ALL pour chaque table, le rsultat indique que MySQL fait une analyse complte de toutes les tables. Cela va prendre un trs long temps de calcul, car le nombre de lignes examiner de cette faon est le produit du nombre de lignes de toutes les tables : dans notre cas, cela vaut 74 * 2135 * 74 * 3872 = 45,268,558,720 lignes. Si les tables taient plus grandes, cela serait encore pire. Le premier problme que vous avons ici, est que MySQL ne peut pas (encore) utiliser d'index sur les colonnes, si elles sont dclares diffremment. Dans ce contexte, les colonnes VARCHAR et CHAR sont les mmes, mais elles ont t dclare avec des tailles diffrentes. Comme tt.ActualPC est dclare comme CHAR(10) et que et.EMPLOYID est dclar comme CHAR(15), il y a un problme de taille. Pour corriger cette disparit, utilisez la commande ALTER TABLE pour agrandir la colonne ActualPC de 10 caractres 15 :
mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);
Maintenant, tt.ActualPC et et.EMPLOYID sont tous les deux des colonnes de type VARCHAR(15). Excuter la commande EXPLAIN produit maintenant le rsultat suivant :
table type tt ALL possible_keys key key_len ref AssignedPC, NULL NULL NULL ClientID, ActualPC ALL PRIMARY NULL NULL NULL range checked for each record (key map: 1) ALL PRIMARY NULL NULL NULL range checked for each record (key map: 1) eq_ref PRIMARY PRIMARY 15 tt.ActualPC rows 3872 Extra Using where
do et_1 et
2135 74 1
Ce n'est pas parfait, mais c'est bien mieux. Le produit de toutes les lignes a t divis par 74). Cette version s'excute en quelques secondes. 381
Une autre modification peut tre fate pour liminer les problmes de taille de colonne pour tt.AssignedPC = et_1.EMPLOYID et tt.ClientID = do.CUSTNMBR :
mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15), -> MODIFY ClientID VARCHAR(15);
et_1 do
PRIMARY PRIMARY
15 15
tt.AssignedPC 1 tt.ClientID 1
C'est presque aussi bon que cela pourrait l'tre. Le problme final est que, par dfaut, MySQL supporte que les valeurs de la colonne tt.ActualPC sont uniformment rpartie, et que ce n'est pas le cas pour la table tt. Mais il est facile de le dire MySQL :
mysql> <userinput>ANALYZE TABLE tt;</userinput>
et et_1 do
Notez que la colonne rows dans le rsultat de EXPLAIN est une prdiction claire de l'optimiseur de jointure MySQL. Pour optimiser une requte, vous devriez vrifier si ces nombres sont proches de la ralit. Si ce n'est pas le cas, vous pourriez obtenir de meilleures performances avec l'attribut STRAIGHT_JOIN dans votre commande SELECT, et en choisissant vous mme l'ordre de jointure des tables dans la clause FROM.
382
seront trop importantes pour tre en cache, votre application va ralentir car le serveur devra faire des lectures sur le disque (ce qui va accrotre le log). Pour viter cela, augmentez le cache d'index au fur et mesure que votre index grossit. See Section 7.5.2, Rglage des paramtres du serveur .
Les expressions constantes utilises par les index sont values une fois. COUNT(*) sur une table simple, sans clause WHERE est lu directement dans les informations de la table pour les tables MyISAM et HEAP. Cela peut aussi tre fait avec les expressions NOT NULL lorsqu'elles sont utilises sur une seule table. table. Dtection prcoce est expressions constantes invalides. MySQL dtecte rapidement les commandes SELECT qui sont impossibles, et ne retourne aucune ligne.
383
HAVING est combin avec la clause WHERE si vous n'utilisez pas la clause GROUP BY ou les fonctions de groupe (COUNT(), MIN()...). Pour chaque sous-jointure, une clause WHERE simplifie est construite pour acclrer l'valuation de WHERE pour chaque sous-jointure, et aussi essayer d'ignorer les lignes le plus tt possible. Toutes les tables constantes sont lues en premier, avant toute autre table de la requte. Une table constante est une table : Une table vide ou une table d'une ligne. Une table qui est utilise avec la clause WHERE sur un index de type UNIQUE, ou avec une cl primaire PRIMARY KEY, dont toutes les parties sont des expressions constantes, et les parties de l'index sont identifies comme NOT NULL. Toutes les tables suivantes sont considres comme constantes :
mysql> SELECT * FROM t WHERE primary_key=1; mysql> SELECT * FROM t1,t2 -> WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
La meilleure combinaison de jointure est obtenue en testant toutes les possibilits. Si toutes les colonnes des clauses ORDER BY et GROUP BY proviennent de la mme table, cette table sera utilise de prfrence comme premire table dans la jointure. Si il y a une clause ORDER BY et une clause GROUP BY diffrente, ou si la clause ORDER BY ou GROUP BY contient des colonnes issues des tables autres que la premire, une table temporaire est cre. Si vous utilisez SQL_SMALL_RESULT, MySQL va utiliser une table temporaire en mmoire. Chaque index de table est interrog, et le meilleur index qui reprsente moins de 30% des lignes est utilis. Si un tel index ne peut tre identifi, un scan rapide de la table est fait. Dans certains cas, MySQL peut lire des lignes depuis l'index sans mme consulter le fichier de donnes. Si toutes les colonnes de l'index sont des nombres, alors seul l'arbre d'index sera utilis pour rsoudre la requte. Avant chaque affichage de ligne, celles qui ne satisfont pas les critres de la clause HAVING sont ignores. Quelques exemples de requtes trs rapides :
mysql> mysql> mysql> -> mysql> -> mysql> -> SELECT COUNT(*) FROM tbl_name; SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name; SELECT MAX(key_part2) FROM tbl_name WHERE key_part_1=constant; SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... LIMIT 10; SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;
Les requtes suivantes ne sont rsolues qu'avec l'arbre d'index (en supposant que les colonnes sont numriques) :
mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val; mysql> SELECT COUNT(*) FROM tbl_name -> WHERE key_part1=val1 AND key_part2=val2; mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;
Les requtes suivantes utilisent l'indexation pour lire les lignes dans un ordre donns, dans faire de tri supplmentaire :
mysql> SELECT ... FROM tbl_name
384
Optimisation d'intervalle
-> ORDER BY key_part1,key_part2,... ; mysql> SELECT ... FROM tbl_name -> ORDER BY key_part1 DESC,key_part2 DESC,... ;
Notez que certaines valeurs non-constantes sont converties en constantes durant la phase de propagation des constantes. MySQL essaie d'extraire les conditions d'intervalle de la clause WHERE pour chaque index possible. Durant le processus d'extraction, les conditions qui ne peuvent pas tre utilises sont ignores, les conditions qui produisent des intervalles qui se recoupent sont combines ensembles, et les conditions qui produisent des intervalles vides sont supprimes. Par exemple, observez la commande suivante, o key1 est une colonne indexe et nonkey n'est pas indexe :
SELECT * (key1 (key1 (key1 FROM t1 < 'abc' < 'bar' < 'uux' WHERE AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR AND nonkey = 4) OR AND key1 > 'z');
385
Optimisation d'intervalle
2. Suppression de nonkey = 4 et key1 LIKE '%b' car elles ne peuvent pas tr utilises pour des conditions d'intervalle. La bonne mthode pour les supprimer est de les remplacer avec une valeur TRUE, pour qu'elles n'ignorent aucune lignes lors de la recherche. Cela donne :
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR TRUE)) OR (key1 < 'bar' AND TRUE) OR (key1 < 'uux' AND key1 > 'z')
3. Suppression des conditions qui sont toujours vraies ou fausses : (key1 LIKE 'abcde%' OR TRUE) est toujours vraie (key1 < 'uux' AND key1 > 'z') est toujours fausse Remplacement de ces conditions avec des constantes, nous obtenons :
(key1 < 'abc' AND TRUE) OR (key1 < 'bar' AND TRUE) OR (FALSE)
4. Combinaisons des intervalles communs conduit une seule condition finale, utiliser pour l'intervalle :
(key1 < 'bar')
En gnral (et tel que dmontr dans notre exemple), les conditions utilises pour une condition d'intervalle sont moins restrictives que la clause WHERE. MySQL va complter la recherche par des filtres appliqus aux lignes trouves pour supprimer celles qui ne satisfont par les clauses WHERE. L'algorithme d'extraction d'intervalle peut grer des conditions AND/OR de profondeur arbitraire, et son rsultat ne dpend pas de l'ordre des conditions dans la clause WHERE.
L'intervalle couvre les 4eme, 5eme et 6eme lignes dans la table prcdente, et peut tre utiliss par la mthode d'accs par intervalle.
386
Optimisation d'intervalle
Par contraste, la condition key_part3 = 'abc' ne dfinit aucun intervalle et ne peut pas tre utilise par la mthode d'accs par intervalle. La description suivante montre comment les conditions d'intervalles fonctionnent avec un index multicolonnes. Pour les index HASH, chaque intervalle contiennent des valeurs identiques qui peuvent tre utilises. Cela signifie que l'intervalle peut produire des conditions d'intervalles uniquement pour les conditions suivantes :
key_part1 cmp const1 AND key_part2 cmp const2 AND ... AND key_partN cmp constN;
Ici, const1, const2, ... sont constantes, cmp est un des oprateurs de comparaison =, <=> ou IS NULL et les conditions couvrent toutes les parties de l'index. C'est dire qu'il y a N conditions, une pour chaque partie de l'index. Voyez Section 7.2.5.1, Mthode d'accs par intervalle pour les index mono-colonnes pour avoir la dfinition d'une constante dans ce contexte. Par exemple, la condition suivante est une condition d'intervalle pour un index HASH :
key_part1 = 1 AND key_part2 IS NULL AND key_part3 = 'foo'
Pour in index BTREE, un intervalle peut tre utilisable pour des conditions AND combines, o chaque condition compare une partie de la cle avec une valeur constante et un oprateur de comparaison =, <=>, IS NULL, >, <, >=, <=, !=, <>, BETWEEN ou LIKE 'pattern' (o 'pattern' ne commence pas par un joker). Un intervalle peut tre utilis tant qu'il est possible de dterminer une ligne qui vrifie la condition, ou deux intervalles si <> ou != est utilis. Par exemple :
key_part1 = 'foo' AND key_part2 >= 10 AND key_part3 > 10
L'intervalle sera :
('foo', 10, 10) < (key_part1, key_part2, key_part3) < ('foo', +inf, +inf)
Il est possible que l'intervalle cre contienne plus de lignes que la condition initialle. Par exemple, l'intervalle prcdent inclut la valeur ('foo', 11, 0),, qui ne satisfait pas les conditions initiales. Si les conditions qui gnrent les conditions d'intervalle sont combines avec OR, elles forment une condition qui couvre un jeu de ligne contenu dans l'union des intervalles. Si les conditions sont combines avec AND, elles forment une condition qui couvre un jeu de lignes contenu dans l'intersection des intervalles. Par exemple, pour cette condition btie sur un index 2 colonnes :
(key_part1 = 1 AND key_part2 < 2) OR (key_part1 > 5)
Dans cet exemple, l'intervalle de la premire ligne utilise une partie de la cl pour l'oprande de gauche, et deux parties de cl pour l'oprande de droite. La colonne key_len dans le rsultat de EXPLAIN indique la taille maximale du prfixe de cl utilis. Dans certains cas, key_len peut indiquer qu'une cl a t utilise mais ce n'est pas ce que vous attendiez. Par exemple, supposez que key_part1 et key_part2 soient NULL. Alors, la colonne key_len va afficher deux cls de taille diffrentes pour les conditions suivantes : 387
Section 7.2.5.1, Mthode d'accs par intervalle pour les index mono-colonnes dcrit comment les optimisations sont appliques pour combiner ou liminer les intervalles bass sur des index monocultures. Des tapes analogues sont effectues pour les conditions sur des index multi-colonnes.
La mthode de combinaison d'index a diffrentes mthodes d'accs aux index, tels que prsentes dans le champ Extra du rsultat de la commande EXPLAIN : intersection union sort-union Les sections suivantes dcrivent ces mthodes avec plus de dtails : Note : L'algorithme d'optimisation des combinaisons d'index a les limitations suivantes : Si un scan d'intervalle est possible avec une cl, la combinaison d'index sera omise. Par exemple :
SELECT * FROM t1 WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
Pour cette requte, deux solutions sont possibles : 1. Une combinaison d'index avec la condition (goodkey1 < 10 OR goodkey2 < 20). 2. Un scan d'intervalle avec la condition badkey < 30.
388
Mais ici, l'optimisateur ne considrera que la seconde mthode. Si ce n'est pas ce que vous souhaitez, vous pouvez forcer l'optimiseur utiliser index_merge en utilisant les clauses IGNORE INDEX et FORCE INDEX. Les requtes suivantes seront excutes avec une combinaison d'index :
SELECT * FROM t1 FORCE INDEX(goodkey1,goodkey2) WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30; SELECT * FROM t1 IGNORE INDEX(badkey) WHERE (goodkey1 < 10 OR goodkey2 < 20) AND badkey < 30;
Si votre requte a une clause WHERE complexe avec des conditions AND/OR imbriques, et que MySQL n'a pas identifi la mthode optimale, essayez de rpartir les conditions en utilisant les lois d'identite :
(x AND y) OR z = (x OR z) AND (y OR z) (x OR y) AND z = (x AND z) OR (y AND z)
Le choix entre les mthodes de index_merge est base sur le calcul de cots.
Toute condition d'intervalle sur une cl primaire de table InnoDB ou BDB. Voci quelques exemples :
SELECT * FROM innodb_table WHERE primary_key < 10 AND key_col1=20; SELECT * FROM tbl_name WHERE (key1_part1=1 AND key1_part2=2) AND key2=2;
L'algorithme d'intersection effectue des scans simultans sur tous les index utiliss, et produit la squence de lignes qu'il reoit des analyses d'index combins. SI toutes les colonnes utilises dans la requtes sont couvertes par les index utiliss, toutes les lignes de la table ne seront pas lues : EXPLAIN indiquera Using index dans la colonne Extra. Voici un exemple de cette requte :
SELECT COUNT(*) FROM t1 WHERE key1=1 AND key2=1;
Si les index utiliss ne couvrent pas toutes les colonnes, les lignes compltes seront lues uniquement lorsque les conditions d'intervalles seront toutes satisfaites. Si une des conditions est une condition sur une cl primaire d'une table InnoDB ou BDB, elle n'est pas utilise pour lire les lignes, mais pour filtrer les lignes lues par les autres conditions.
389
Toute condition d'intervalle sur une cl primaire d'une table InnoDB ou BDB. Une condition pour laquelle l'algorithme d'intersection de combinaison d'index est applicable. Voici quelques exemples :
SELECT * FROM t1 WHERE key1=1 OR key2=2 OR key3=3; SELECT * FROM innodb_table WHERE (key1=1 AND key2=2) OR (key3='foo' AND key4='bar') AND key5=5;
La diffrence entre l'algorithme d'union trie et l'algorithme d'union est que l'algorithme d'union trie doit commencer par lire les identifiants de toutes les lignes, et les trier avant de retourner un rsultat.
Si vous utilisez column_name IS NULL sur une colonne NOT NULL dans une clause WHERE, sur une table qui ne fait pas partie d'une jointure OUTER JOIN, l'expression sera optimise immdiatement. MySQL 4.1.1 peut aussi optimiser des combinaisons column = expr AND column IS NULL, une forme qui est frquente avec les sous-requtes. EXPLAIN vous indiquera ref_or_null lorsque cette optimisation est utilise. Cette optimisation peut grer une condition IS NULL avec toute partie de cl. Quelques exemples de requtes qui sont optimises (en supposant qu'il existe une cl sur t2 (a,b) :
SELECT * FROM t1 WHERE t1.a=expr OR t1.a IS NULL; SELECT * FROM t1,t2 WHERE t1.a=t2.a OR t2.a IS NULL; SELECT * FROM t1,t2 WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b; SELECT * FROM t1,t2 WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL); SELECT * FROM t1,t2 WHERE (t1.a=t2.a AND t2.a IS NULL AND ...) OR (t1.a=t2.a AND t2.a IS NULL AND ...);
ref_or_null fonctionne en lisant la cl de rfrence, et aprs a, fait une recherche diffrente pour les valeurs NULL. Notez que l'optimisation ne peut grer qu'un seul niveau de conditions IS NULL.
SELECT * FROM t1,t2 where (t1.a=t2.a AND t2.a IS NULL) OR (t1.b=t2.b AND t2.b IS NULL);
390
Dans le cas ci-dessus, MySQL va uniquement utiliser une recherche de cl pour la partie (t1.a=t2.a AND t2.a IS NULL) et ne sera pas capable d'utiliser la cl pour b.
Dans ce cas, en supposant que t1 est utilise avant t2 (vrifiez avec EXPLAIN), MySQL arrtera de lire partir de t2 (pour cette ligne particulire de t1) lorsque la premire ligne de t2 est trouve.
7.2.9. Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN
A LEFT JOIN B est implment dans MySQL comme suit : La table B est cense tre dpendante de la table A et de toutes les tables dont dpend A. La table A est cense tre dpendante de toutes les tables ( part B) qui sont utilises dans la condition du LEFT JOIN. Toutes les conditions du LEFT JOIN sont transmises la clause WHERE. Toutes les optimisations standards de jointures sont effectues, l'except qu'une table est toujours lue aprs celles dont elle dpend. S'il y a une dpendance circulaire, MySQL retournera une erreur. Toutes les optimisations standards de WHERE sont effectues. S'il y a une ligne dans A qui rpond la clause WHERE, mais qu'il n'y avait aucune ligne dans B qui rpondait la condition du LEFT JOIN, alors une ligne supplmentaire de B est gnre avec toutes les colonnes mises NULL. Si vous utilisez LEFT JOIN pour trouver les enregistrements qui n'existent pas dans d'autres tables et que vous effectuez le test suivant : nom_colonne IS NULL dans la partie WHERE, o nom_colonne est une colonne qui est dclare en tant que NOT NULL, alors MySQL arrtera de chercher d'autres lignes (pour une combinaison de clefs particulire) aprs avoir trouv une ligne qui rpond la condition du LEFT JOIN. RIGHT JOIN est implment de manire analogue LEFT JOIN. L'ordre de lecture de tables forc par LEFT JOIN et STRAIGHT JOIN aidera l'optimiseur de jointures (qui calcule l'ordre dans lequel les tables doivent tre jointes) faire son travail plus rapidement, puisqu'il y aura moins de permutations de tables vrifier. Notez que ce qui prcde signifie que si vous faites une requte de la sorte :
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key;
391
WHERE b.key=d.key;
Depuis la version 4.0.14, MySQL effectue l'optimisation LEFT JOIN suivante : si la condition WHERE est toujours fausse pour la ligne NULL gnre, la jointure LEFT JOIN est transforme en jointure normale. Par exemple, dans la requte suivante, la clause WHERE sera fausse si t2.column est NULL : il est donc valide de convertir la jointure en une jointure normale.
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
Cela peut se faire plus rapidement, car MySQL peut maintenant utiliser la table t2 avant la table t1 si les relations sont plus favorables. Pour forcer l'utilisation spcifique d'un ordre de table, utilisez STRAIGHT JOIN.
Quelques cas o MySQL ne peut pas utiliser les index pour rpondre ORDER BY: (Notez que MySQL utilisera quand mme les indexes pour trouver les lignes qui correspondent la clause WHERE) : Vous effectuez un ORDER BY sur des clefs diffrentes :
SELECT * FROM t1 ORDER BY key1, key2;
La clef utilise pour extraire les rsultats n'est pas la mme que celle utilise lors du groupement ORDER BY :
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
Vous faites une jointure entre plusieurs tables et les colonnes sur lesquelles vous faites un ORDER BY ne font pas toutes parties de la premire table non-const qui est utilise pour rcuprer les lignes (C'est la premire table dans l'affichage d'EXPLAIN qui n'utilise pas une mthode de rcupration sur une ligne constante). Vous avez plusieurs expressions ORDER BY et GROUP BY. L'index de table utilis est un type d'index qui n'enregistre pas les lignes dans l'ordre. (comme le type d'index HASH dans les tables HEAP). Dans les cas o MySQL doit trier les rsultats, il utilisera l'algorithme suivant :
392
1. Lit toutes les lignes en fonction d'un index ou par scan de la table. Les lignes qui ne vrifient pas la condition WHERE sont ignores. 2. Stocke les valeurs des cls de tri dans un buffer. La taille du buffer est la valeur de la variable systme sort_buffer_size. 3. Lorsque le buffer se remplit, fait un tri rapide et stocke le rsultat dans une fichier temporaire. Sauve le pointeur dans un bloc tri. Si toutes les lignes tiennent dans le buffer de tri, aucun fichier temporaire n'est cr. 4. Rpte les tapes prcdentes jusqu' ce que toutes les lignes aient t lues. 5. Fait une combinaison multiple jusqu' MERGEBUFF (7) rgions en un bloc, dans un autre fichier temporaire. Rpte l'opration jusqu' ce que le premier fichier soit dans le second. 6. Rpte la suite jusqu' ce qu'il y ait moins de MERGEBUFF2 (15) bloc libres. 7. Dans la dernire combinaison multiple, seul le pointeur de ligne (la dernire partie de la cl de tri), est crite dans le fichier de rsultat. 8. Lit les lignes tries en utilisant les pointeurs de lignes du fichier de rsultat. Pour optimiser cela, on lit un gros bloc de pointeur, on les trie, et on les utilise pour lire les lignes en ordre dans un buffer. La taille du buffer est la valeur de la variable systme read_rnd_buffer_size. Le code de cette tape est dans le fichier source sql/records.cc. Vous pouvez vrifier avec EXPLAIN SELECT ... ORDER BY si MySQL peut utiliser des index pour rpondre cette requte. Si vous obtenez un Using filesort dans la colonne extra, c'est que MySQL ne peut utiliser d'index pour rsoudre cet ORDER BY. See Section 7.2.1, Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT) . Si vous voulez plus de rapidit avec les ORDER BY, vous devez d'abord voir si vous pouvez faire en sorte que MySQL utilises des index au lieu de passer par des phases de tri en plus. Si cela se rvle impossible, vous pouvez : Augmenter la taille de la variable sort_buffer. Augmenter la taille de la variable record_rnd_buffer. Changer tmpdir pour qu'il pointe vers un disque ddi avec beaucoup d'espace libre. Si vous utilisez MySQL version 4.1 ou plus rcent, vous pouvez rpartir la charge entre plusieurs disques physiques en donnant l'option tmpdir une liste de chemin, spars par des deux-points (:) ou des points-virgules ; sous Windows). Ils seront utiliss circulairement. Note : ces chemins doivent aboutir diffrents disques physiques, et non pas diffrentes partitions du mme disque. Par dfaut, MySQL trie les requtes GROUP BY x,y[,...] comme si vous aviez spcifi l'ordre ORDER BY x,y[,...]. Si vous ajoutez une clause ORDER BY explicite, MySQL l'optimise aussi sans perte de vitesse, mme si un tri a lieu. Si la requte inclut une clause GROUP BY mais que vous voulez viter le surcot du tri, vous pouvez supprimer le tri en spcifiant ORDER BY NULL :
INSERT INTO foo SELECT a,COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
393
qui sont utilises dans la requte, les conditions poses sur ces index, et les diffrentes fonctions d'agrgation. Il y a deux mthodes pour excuter une requte GROUP BY via un accs aux index, tels que prsent dans les sections suivantes. Dans la premire mthode, les oprations de rgroupmeent sont appliques ensembles avec les prdicats d'intervalles. La seconde mthodes commence par faire une analyse d'intervalle, puis regroupe les lignes trouves.
Les requtes suivantes ne peuvent pas tre excutes avec les mthodes de slection rapide, pour les raisons cites : Il y a d'autres fonctions d'agrgation que MIN() ou MAX() :
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;
La requte fait rfrence une partie de cl qui est place aprs la partie GROUP BY, et pour lesquelles l'galit ne se fait pas avec une constante :
SELECT c1,c3 FROM t1 GROUP BY c1, c2;
394
GROUP BY ne commence pas par la premire cl, mais il y a une condition qui fournit une constante pour cette partie de cl :
SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3;
EXPLAIN affiche la valeur ALL dans la colonne type lorsque MySQL utilise n scan de table pour rsoudre une requte. Cela arrive lorsque : La table est si petite qu'il est plus rapide d'analyser la table que d'utiliser les index. C'est un cas courant pour les tables de moins de 10 lignes, et de taille de ligne faible. Il n'y a pas de restriction exploitable sur les conditions ON et WHERE, avec les colonnes indexes. Vous comparez des colonnes indexes avec des constantes, et MySQL a calcul, en se basant sur l'arbre d'index, que les constantes couvrent une trop grande partie de la table : un scan devrait tre plus rapide. See Section 7.2.4, Comment MySQL optimise les clauses WHERE . Vous utilisez une cl avec une cardinalit faible (c'est dire, beaucoup de lignes sont trouves). MySQL va alors supposer que l'utilisation de l'index va lui imposer beaucoup de recherches, et qu'un scan de table sera plus rapide. Ce que vous pouvez faire pour viter les scans de grosses tables : Utilisez ANALYZE TABLE sur les tables pour optimiser la distribution des cls. See Section 13.5.2.1, Syntaxe de ANALYZE TABLE . Utilisez FORCE INDEX sur les tables, pour dire MYSQL que les scans de tables sont trop coteux, compar l'utilisation de l'index. See Section 13.1.7, Syntaxe de SELECT .
SELECT * FROM t1,t2 force index(index_for_column) WHERE t1.column=t2.column;
Lancez mysqld avec --max-seeks-for-key=1000 ou faites SET MAX_SEEKS_FOR_KEY=1000 pour dire l'optimiseur que les scans sans index ne gnreront pas plus de 1000 recherches dans les index. See Section 5.2.3, Variables serveur systme .
396
Lorsque vous chargez une table depuis un fichier texte, utilisez la commande LOAD DATA INFILE. Elle est gnralement 20 fois plus rapide que l'quivalent en commandes INSERT. See Section 13.1.5, Syntaxe de LOAD DATA INFILE . Il est possible, avec un peu de travail supplmentaire, d'acclrer encore la vitesse des commandes LOAD DATA INFILE. Utilisez la procdure standard : 1. Crez optionnellement une table avec CREATE TABLE. Par exemple, en utilisant mysql ou Perl DBI. 2. Excutez une commande FLUSH TABLES ou la commande en ligne shell mysqladmin flushtables. 3. Utilisez myisamchk --keys-used=0 -rq /path/to/db/tbl_name. Cela va supprimer l'utilisation des index dans la table. 4. Insrez vos donnes dans la table, avec LOAD DATA INFILE. Les index ne seront pas modifis, et donc, trs rapides. 5. Si vous allez uniquement lire la table dans le futur, utilisez myisampack pour la rduire de taille. See Section 14.1.3.3, Caractristiques des tables compresses . 6. Re-crez les index avec myisamchk -r -q /path/to/db/tbl_name. Cette commande va crer l'arbre d'index en mmoire, avant de l'crire sur le disque, ce qui est bien plus rapide, car il n'y a que peu d'accs disques. L'arbre final sera aussi parfaitement quilibrs. 7. Excutez une commande FLUSH TABLES ou utilisez la commande en ligne shell mysqladmin flush-tables. Notez que la commande LOAD DATA INFILE fait aussi les optimisations ci-dessus, si vous faites les insertions dans une table vide. La diffrence principale avec la procdure ci-dessus est que vous pouvez laisser myisamchk allouer plus de mmoire temporaire pour la cration d'index, que vous ne pourriez le faire pour chaque recration. Depuis MySQL 4.0 vous pouvez aussi utiliser ALTER TABLE tbl_name DISABLE KEYS au lieu de myisamchk --keys-used=0 -rq /path/to/db/tbl_name et ALTER TABLE tbl_name ENABLE KEYS au lieu de myisamchk -r -q /path/to/db/tbl_name. De cette faon, vous pouvez aussi viter l'tape FLUSH TABLES. Vous pouvez acclrer les insertions qui sont faites avec plusieurs requtes en verrouillant vos tables :
mysql> mysql> mysql> mysql> LOCK TABLES a WRITE; INSERT INTO a VALUES (1,23),(2,34),(4,33); INSERT INTO a VALUES (8,26),(6,29); UNLOCK TABLES;
La principale diffrence de vitesse est que l'index de buffer est crit sur le disque une fois, aprs toutes les insertions INSERT termines. Normalement, il aurait du y avoir de nombreuses critures, une pour chaque commande INSERT. Le verrouillage n'est pas ncessaire si vous pouvez insrer toutes les lignes d'une seule commande. Pour les tables transactionnelles, vous devriez utiliser BEGIN/COMMIT au lieu de LOCK TABLES pour acclrer les oprations. Le verrouillage va aussi rduire le nombre total de tests de connexions, mais le temps d'attente maximum de certains threads va augmenter (car il va y avoir la queue pour les verrous). Par exemple :
thread 1 fait 1000 insertions thread 2, 3, et 4 font 1 insertion thread 5 fait 1000 insertions
397
Si vous ne voulez pas utiliser le verrouillage, les threads 2, 3 et 4 auront fini avant les 1 et 5. Si vous utilisez le verrouillage, 2, 3 et 4 me finiront probablement pas avant 1 ou 5, mais la dure globale de l'opration sera 40% plus courte. Comme les commandes INSERT, UPDATE et DELETE sont trs rapides avec MySQL, vous obtiendrez de meilleures performances gnrales en ajoutant des verrous autour de toutes vos oprations de 5 insertions o modifications simultanes. Si vous fates de trs nombreux insertions dans une ligne, vous pouvez utiliser LOCK TABLES suivi de UNLOCK TABLES une fois de temps en temps (par exemple, toutes les 1000) pour permettre aux autres threads d'accder la table. Cela vous donnera quand mme une bonne acclration. Bien sur, LOAD DATA INFILE reste bien plus rapide pour charger les donnes. Pour acclrer LOAD DATA INFILE et INSERT, agrandissez le buffer de cl. See Section 7.5.2, Rglage des paramtres du serveur .
398
Utilisez ALTER TABLE ... ORDER BY expr1,expr2... si vous lisez les colonnes dans l'ordre expr1,expr2.... Avec cette option, aprs de grosses modifications dans la table, vous pourriez obtenir de meilleures performances. Dans certains cas, cela vaut la peine d'ajouter une colonne qui est une combinaison ("hashed") des informations des autres colonnes. Si cette colonne est courte, et plutt exemptes de doublons, elle peut se rvler plus rapide qu'un gros index sur plusieurs colonnes. Avec MySQL, il est trs facile d'utiliser une telle colonne :
SELECT * FROM tbl_name WHERE hash_col=MD5(CONCAT(col1,col2)) AND col1='constant' AND col2='constant';
Pour les tables qui sont souvent modifies, vous devriez essayer d'viter les colonnes VARCHAR et BLOB. Vous obtiendrez des lignes format dynamique si vous utilisez ne serait-ce qu'une seule colonne VARCHAR ou BLOB. See Chapitre 14, Moteurs de tables MySQL et types de table. Normalement, cela ne sert rien de sparer une table en diffrentes tables plus petites, juste parce que vos lignes deviennent grosses. Pour accder une ligne, le plus long est le temps d'accs au premier octets de la ligne. Aprs cela, les disques modernes vont lire trs rapidement la ligne, et suffisamment pour la plus par des applications. Le seul cas o cela peut tre important est si vous tes capables de dgager une table format de ligne fixe (voir ci-dessus), ou si vous avez besoin de scanner rgulirement la table, mais que vous n'avez pas besoin de toutes les colonnes. See Chapitre 14, Moteurs de tables MySQL et types de table. Si vous avez besoin de calculer souvent des expressions en fonction des informations places dans de nombreuses lignes (comme compter des lignes), il est probablement plus efficace d'introduire une nouvelle table qui va mettre jour ce compteur en temps rel. Une modification du type prsent cidessous est trs rapide!
UPDATE tbl_name SET count_col=count_col+1 WHERE key_col=constant;
C'est trs important lorsque vous utilisez les types de tables MyISAM et ISAM, qui ne dispose que d'un verrouillage de table (plusieurs lecteurs, un seul qui crit). Cela va aussi amliorer les performances avec la plus par des bases, car le gestionnaire de verrouillage de ligne aura moins de tches faire. Si vous devez rassembler des statistiques issues de grosses tables de log, utiliser les tables de sommaires plutt que la table complte. Entretenir un sommaire est bien plus rapide que de regnrer des tables partir des logs chaque modification (suivant l'importance de vos informations), plutt que de modifier l'application qui fonctionne. Si possible, essayez de marquer les rapports comme "direct" ou "statistique", o les donnes ncessaires pour les rapports statistiques ne sont gnres qu' partir de tables de sommaires, calcules depuis les donnes relles. Utilisez les valeurs par dfaut des colonnes. N'insrez des valeurs explicitement que lorsque la valeur diffre de la valeur par dfaut. Cela rduit le temps d'analyse de MySQL, et amliore les insertions. Dans certains cas, il est pratique de compacter et stocker les donnes dans un BLOB. Dans ce cas, vous devez ajouter du code supplmentaire pour compacter et dcompacter les donnes dans le BLOB, mais cela pourra vous faire conomiser de nombreux accs. C'est pratique lorsque vous avez des donnes qui ne peuvent s'adapter facilement une structure de base de donnes. Normalement, vous devriez essayer de garder vos donnes non redondantes (ce qui s'appelle la troisime forme normale dans les thories de bases de donnes), mais ne vous empchez pas de duplique des donnes ou de crer des tables de sommaire, pour gagner de la vitesse. Les procdures stockes ou UDF (fonctions utilisateur) peuvent tre une bonne faon de gagner en performance. Dans ce cas, vous devriez avoir une mthode pour appliquer les mmes fonctions d'une autre manire, si votre base ne supporte les procdures stockes.
399
Vous pouvez aussi gagner de la vitesse en utilisant des caches de requtes dans vos applications, et en essayant de rassembler les nombreuses insertions ou modifications. Si votre base de donnes supporte le verrouillage de table (comme MySQL et Oracle), cela vous aidera vous assurer que le cache d'index est vid aprs chaque modifications. Utilisez INSERT /*! DELAYED */ lorsque vous n'avez pas besoin d'tre assur que vos donnes sont crites. Cela acclre les insertions, car de nombreuses lignes seront crites en une seule fois. Utilisez INSERT /*! LOW_PRIORITY */ lorsque vous voulez que vos slections soient prioritaires. Utilisez SELECT /*! HIGH_PRIORITY */ pour rendre les slections prioritaires. C'est dire, les slections seront dsormais faites mme si un autre programme attend pour crire. Utilise la commande INSERT multiple pour insrer plusieurs lignes en une seule commande SQL (plusieurs serveurs SQL le supporte). Utilisez LOAD DATA INFILE pour charger de grande quantit de donnes dans une table. C'est gnralement plus rapide que des insertions, et sera mme encore plus rapide une fois que myisamchk sera intgr dans mysqld. Utilisez les colonnes AUTO_INCREMENT pour avoir des valeurs uniques. Utilisez OPTIMIZE TABLE une fois de temps en temps, pour viter la fragmentation lors de l'utilisation de tables avec un format de ligne dynamique. See Section 13.5.2.5, Syntaxe de OPTIMIZE TABLE . Utilisez la tables de type HEAP pour acclrer les traitements au maximum. See Chapitre 14, Moteurs de tables MySQL et types de table. Avec un serveur web normal, les images doivent tre stockes dans des fichiers. C'est dire, ne stockez qu'une rfrence au fichier d'image dans la base. La raison principale cela est qu'un serveur web est bien meilleur pour mettre en cache des fichiers que le contenu d'une base de donnes. Il est donc plus rapide si vous utilisez des fichiers. Utilisez des tables en mmoire pour les donnes non critiques, qui ont besoin d'tre lues souvent (comme des informations sur la dernire bannire affiche pour les utilisateurs sans cookies). Les colonnes contenant des informations identiques dans diffrentes tables doivent tre dclares identiquement lors de la cration des tables, et porter des noms identiques. Avant la version 3.23, vous pouviez ralentir les jointures. Essayez de garder des noms simples (utilisez nom au lieu de nom_du_client dans la table de clients). Pour rendre vos noms de colonnes portables vers les autres serveurs SQL, vous devriez essayer de les garder plus petits que 18 caractres. Si vous avez vraiment besoin de trs haute vitesse, vous devriez considrer les interfaces de bas niveau pour le stockage des donnes que les diffrents serveurs SQL supportent. Par exemple, en accdant directement aux tables MySQL MyISAM, vous pourriez obtenir un gain de vitesse de l'ordre de 2 5 fois, en comparaison avec l'interface SQL. Pour cela, les donnes doivent tre sur le mme serveur que l'application, et gnralement, elles ne doivent tre manipules que par un seul programme la fois (car le verrouillage externe de fichiers est trs lent). Vous pouvez liminer ces problmes en crant des commandes MyISAM de bas niveau dans le serveur MySQL (cela peut se faire facilement pour amliorer les performances). Soyez trs prudent dans la conception de votre interface, mais il est trs facile de supporter ce type d'optimisation. Dans de nombreux cas, il est plus rapide d'accder aux donnes depuis une base (en utilisant une connexion ouverte) que d'accder un fichier texte, car la base de donnes est plus compacte que le fichier texte (si vous utilisez des donnes numriques), et cela entrane moins d'accs disques. Vous allez aussi conomiser du code, car vous n'aurez pas analyser le fichier texte pour reprer les limites de lignes.
400
Verrouillage de tables
Vous pouvez aussi utiliser la rplication pour acclrer le serveur. See Chapitre 6, Rplication de MySQL. Dclarer une table avec DELAY_KEY_WRITE=1 va acclrer la mise jour des index, car ils ne seront pas crit sur le disque jusqu' ce que le fichier de donnes soit referm. L'inconvnient est que vous devez excuter l'utilitaire myisamchk sur ces tables avant de lancer mysqld pour vous assurer que les index sont bien jour, au cas o le processus aurait t interrompu avant d'enregistrer les donnes. Comme les informations d'index peuvent toujours tre regnres, vous ne perdrez pas de donnes avec DELAY_KEY_WRITE.
401
Mthodes de verrouillage
Depuis MySQL 3.23.7 (3.23.25 pour Windows), vous pouvez librement mlanger des commandes INSERT et SELECT sur une table MyISAM sans verrous, si les commandes INSERT sont sans conflit. C'est dire, vous pouvez insrer des lignes dans une table MyISAM en mme temps que d'autres clients lisent la mme table. Aucun conflit ne survient si la table ne contient aucun bloc libre dans les donnes, et que les lignes sont insres la fin de la table. Les trous sont des lignes qui ont t effaces. S'il y a des trouvs, les insertions concurrentes sont ractives automatiquement, lorsque les trous sont bouchs par de nouvelles donnes. Pour contourner ce problme dans les cas o vous voulez faire de nombreuses INSERT et SELECT sur la mme table, vous pouvez insrer les lignes dans une table temporaire, et ne modifier la table relle que de temps en temps, partir de la table temporaire. Ceci peut tre fait comme ceci :
mysql> mysql> mysql> mysql> LOCK TABLES real_table WRITE, insert_table WRITE; INSERT INTO real_table SELECT * FROM insert_table; TRUNCATE TABLE insert_table; UNLOCK TABLES;
InnoDB utilise un verrouillage de ligne, et BDB utilise un verrouillage de page. Pour les moteurs InnoDB et BDB, un blocage de verrou est possible. Cela est d au fait que InnoDB obtient automatiquement un verrou de ligne, et BDB pose le verrou de page durant le traitement SQL, et non pas au dmarrage de la transaction. Avantages du verrouillage de ligne : Moins de conflits de lignes, lorsque les mmes lignes sont utilises par diffrents threads. Moins de modifications pour les annulations (ROLLBACK) Rend possible le verrouillage d'une ligne pour une longue dure. Inconvnients du verrouillage de ligne : Prend plus de mmoire que les verrous de page ou de table. Est plus lent que les verrous de page ou de table, lorsqu'il est utilis sur une grand partie de la table, car il faut alors poser plusieurs verrous. Est vraiment bien pire que les autres verrous si vous utilisez souvent la requte GROUP BY sur la majeure partie des donnes, ou si vous avez scanner toute la table. Avec des verrous de plus haut niveau, vous pouvez aussi supporter des verrous d'autres types, pour optimiser l'application, car le cot de l'administration est moindre que pour le verrouillage de ligne. Les verrous de tables sont suprieurs aux verrous de page ou de ligne dans les cas suivants : Les lectures. Les lectures et les modifications sur des cls strictes : c'est le cas si une modification ou un effacement de ligne peut tre lu en une seule opration dans l'index.
UPDATE table_name SET column=value WHERE unique_key# DELETE FROM table_name WHERE unique_key=#
SELECT combin avec INSERT (et quelques UPDATE et DELETE rares). De nombreux scans / GROUP BY sur toute la table, sans aucune criture. Autres possibilits alternatives au verrouillage de ligne ou de page : Le versionnage (comme celui que nous utilisons pour les insertions simultanes avec MySQL), o vous pouvez avoir un thread qui crit et de nombreux autres qui lisent. Cela signifie que les bases ou
402
tables supportent diffrentes vues des donnes, suivants le moment d'accs aux donnes. D'autres noms pour cette techniques sont time travel, copy on write ou copy on demand. La copy on demand (copie sur demande) est dans de nombreuses situations bien meilleure que le verrouillage de page ou de ligne. Le pire reste l'utilisation de mmoire, qui est bien plus forte qu'avec les verrous normaux. Au lieu d'utiliser le verrouillage de ligne, vous pouvez utiliser des verrous au niveau de l'application (comme les get_lock/release_lock de MySQL). Cela ne fonctionne qu'avec les applications bien leves.
403
Dmarrez mysqld avec une valeur faible pour max_write_lock_count afin de donner plus souvent la chance aux verrous READ la possibilit de lire des donnes, entre deux verrous WRITE. Vous pouvez spcifier que toutes les modifications d'un thread spcifique doivent tre faites avec un priorit basse, en utilisant la commande SQL : SET LOW_PRIORITY_UPDATES=1. See Section 13.5.2.8, Syntaxe de SET . Vous pouvez spcifier qu'une requte particulire SELECT est trs importante, en utilisant l'attribut HIGH_PRIORITY. See Section 13.1.7, Syntaxe de SELECT . Si vous avez des problmes avec des INSERT combins avec des SELECT, utilisez les tables MyISAM car elle supportent les commandes SELECTs et INSERT simultanes. Si vous voulez mlanger les commandes INSERT et SELECT, utilisez l'attribut DELAYED de la commande INSERT pour rsoudre ce problme. See Section 13.1.4, Syntaxe de INSERT . Si vous avez des problmes avec des combinaisons de SELECT et DELETE, l'option LIMIT de DELETE peut aider. See Section 13.1.1, Syntaxe de DELETE . Utiliser SQL_BUFFER_RESULT avec les commandes SELECT peut aider rduire la dure des verrous. See Section 13.1.7, Syntaxe de SELECT . Vous pouvez changer le code de verrouillage dans le fichier mysys/thr_lock.c pour n'utiliser qu'une queue unique. Dans ce cas, les lectures et critures auront la mme priorit, ce qui peut aider certaines applications. Voici quelques conseils avec le systme de verrouillage de MySQL : Les accs concurents ne sont pas un problme si vous ne mlangez pas les slections et les modifications de nombreuses lignes dans la mme table. Vous pouvez utiliser LOCK TABLES pour acclrer les oprations : de nombreuses modifications dans un mme verrou seront plus rapides. Rpartir le contenu de la table en plusieurs tables peut aussi aider. Si vous rencontrez des problmes de vitesse avec les verrous de tables, vous devez tre capables d'amliorer les performances en convertissant certaines tables en InnoDB ou BDB. See Chapitre 15, Le moteur de tables InnoDB. See Section 14.4, Tables BDB ou BerkeleyDB .
404
Vous utilisez beaucoup d'espace, et vous devez dupliquer des index de noeuds (car vous ne pouvez pas simplement stocker des lignes dans les noeuds). Les suppressions vont perturber la table (comme les index ne sont pas modifis lors de l'effacement). Il est plus difficile de ne mettre en cache que les donnes.
405
Le nombre maximum de clefs et la longueur maximale des index sont dfinis pour chaque type de table. See Chapitre 14, Moteurs de tables MySQL et types de table. Vous pouvez avec tous les gestionnaires de tables avoir au moins 16 clefs et une taille totale d'index d'au moins 256 octets. Pour les colonnes CHAR et VARCHAR, il est possible d'indexer un prfixe de la colonne. C'est plus rapide et plus conome en espace disque que l'indexation de la colonne entire. La syntaxe pour indexer le dbut d'une colonne au moment de la cration de la table ressemble cela: See Section 7.4.3, Index de colonnes . Les moteurs de tables MyISAM et (depuis MySQL 4.0.14) InnoDB supportent aussi l'indexation des colonnes BLOB et TEXT. Lors de l'indexation d'une colonne BLOB ou TEXT, vous devez spcifier une taille pour l'index. Par exemple :
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
Les prfixes peuvent atteindre 255 octets de longeur (ou 1000 octets pour les tables MyISAM et InnoDB depuis MySQL 4.1.2). Notez que les limites de prfixes sont mesures en octets, alors que la limite de prfixe dans la commande CREATE TABLE est interprte comme un nombre de caractres. Prenez le en compte lorsque vous spcifiez une taille de prfixe pour une colonne qui utilise un jeu de caractres multi-octets. Depuis MySQL 3.23.23, vous pouvez aussi crer des index FULLTEXT. Ils sont utiliss pour les recherches en texte plein. Seules les tables MyISAM supportent les index FULLTEXT et uniquement pour les colonnes CHAR, VARCHAR, et TEXT. L'indexation se fait sur toute la largeur de la colonne. L'indexation par prfixe n'est pas possible. Voyez la section Section 12.6, Recherche en texte intgral (Full-text) dans MySQL pour plus de dtails. Depuis MySQL 4.1.0, vous pouvez crer des index spatiaux. Actuellement, le type de donnes spatial n'est support que par les tables MyISAM. Les donnes spatiales utilisent un R-tree. Le moteur de tables MEMORY (HEAP) supporte les index hash. Depuis MySQL 4.1.0, ce moteur supporte aussi les index B-tree.
Alors l'index nom_index est un index de nom et de prenom. Cela sera utile pour les requtes qui spcifient des valeurs dans une gamme donne de nom, ou pour la fois nom et prenom. Ainsi l'index nom_index sera utilis pour les requtes suivantes:
mysql> SELECT * FROM test WHERE nom="Widenius"; mysql> SELECT * FROM test WHERE nom="Widenius"
406
->
AND prenom="Michael";
mysql> SELECT * FROM test WHERE nom="Widenius" -> AND (prenom="Michael" OR prenom="Monty"); mysql> SELECT * FROM test WHERE nom="Widenius" -> AND prenom >="M" AND prenom < "N";
Cependant, l'index nom_index ne sera pas utilis pour les requtes suivantes :
mysql> SELECT * FROM test WHERE prenom="Michael"; mysql> SELECT * FROM test WHERE nom="Widenius" -> OR prenom="Michael";
Pour plus d'informations sur la mthode de MySQL pour utiliser les index dans le but d'amliorer les performance des requtes, voyez la section suivante.
Trier ou grouper des lignes dans une table, si le tri ou le regroupement est fait avec un prfixe gauche utilisable (par exemple, ORDER BY key_part_1,key_part_2 ). La cl est lue en ordre inverse, si toutes les parties de cls sont suivies du mot cl DESC. See Section 7.2.10, Comment MySQL optimise ORDER BY . Dans certains cas, la requte peut tre optimise pour lire des valeurs sans consulter le fichier de donnes. Si cette possibilit est utilise avec des colonnes qui sont toutes numriques, et forme le prfixe de gauche d'une cl, les valeurs peuvent tre lues depuis l'index, grande vitesse :
SELECT key_part3 FROM table_name WHERE key_part1=1
407
Si un index multi-colonne existe sur les colonnes col1 et col2, les lignes appropries seront directement lues. Si des index spars sur les colonnes col1 et col2 existent, l'optimiseur va essayer de trouver l'index le plus restrictif des deux, en dcidant quel index dbouche sur le moins de lignes possibles. Si une table a un index multi-colonne, tout prfixe d'index peut tre utilis par l'optimiseur pour trouver des lignes. Par exemple, si vous avez un index trois colonnes (col1,col2,col3), vous pouvez faire des recherches acclres sur les combinaisons de colonnes (col1), (col1,col2) et (col1,col2,col3). MySQL ne peut utiliser d'index partiel sir les colonnes ne forment pas un prfixe d'index. Supposez que vous avez la commande SELECT suivante :
mysql> SELECT * FROM tbl_name WHERE col1=val1; mysql> SELECT * FROM tbl_name WHERE col2=val2; mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
Si un index existe sur les colonnes (col1,col2,col3), seule la premire requte pourra utiliser l'index ci-dessus. Les deux autres requtes utilisent des colonnes indexes, mais les colonnes (col2) et (col2,col3) ne font pas partie du prfixe des colonnes (col1,col2,col3). MySQL utilise aussi les index lors des comparaisons avec l'oprateur LIKE si l'argument de LIKE est une chane constante qui ne commence pas par un caractre joker. Par exemple, les requtes SELECT suivantes utilisent des index :
mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Patrick%"; mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Pat%_ck%";
Dans le premier exemple, seules les lignes avec "Patrick" <= key_col < "Patricl" sont considres. Dans le second exemple, "Pat" <= key_col < "Pau" sont considres. Les commandes SELECT suivantes n'utilisent pas d'index :
mysql> SELECT * FROM tbl_name WHERE key_col LIKE "%Patrick%"; mysql> SELECT * FROM tbl_name WHERE key_col LIKE other_col;
Dans la premire requte, la valeur associe LIKE commence avec un caractre joker. Dans le second exemple, la valeur associe LIKE n'est pas une valeur constante. MySQL 4.0 fait une autre optimisation avec l'oprateur LIKE. Si vous utilisez ... LIKE "%string%" et que string est plus grand que 3 caractres, MySQL va utiliser l'algorithme Turbo Boyer-Moore qui prend une valeur initiale pour rsoudre le masque, et l'exploite pour acclrer la recherche. Les recherches qui utilisent la fonction column_name IS NULL vont utiliser les index si column_name sont des index. MySQL normalement utilise l'index qui gnre le moins de lignes possible. Un index est utilis avec les colonnes que vous spcifiez, et les oprateurs suivants : =, >, >=, <, <=, BETWEEN et l'oprateur LIKE sans prfixe joker, c'est dire de la forme 'quelquechose%'. Un index qui ne s'applique pas tous les niveaux de AND dans une requte WHERE, ne sera pas utilis pour optimiser la requte. En d'autres termes, pour tre capable d'utiliser un index pour optimiser une requte, un prfixe de l'index doit tre utilis dans toutes les parties de la formule logique contenant AND. Les clauses WHERE suivantes utilisent des index :
... WHERE index_part1=1 AND index_part2=2 AND other_column=3 ... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */ ... WHERE index_part1='hello' AND index_part_3=5 /* optimis par "index_part1='hello'" */ ... WHERE index1=1 and index2=2 or index1=3 and index3=3; /* peut utiliser un index sur index1 mais pas sur index2 ou index 3 */
408
Notez que dans certains cas, MySQL ne va pas utiliser un index, mme s'il y en a un disponible. Si l'utilisation de l'index requiert que MySQL accde plus de 30% des lignes de la table (dans ce cas, un scan de table est probablement plus rapide, et demandera moins d'accs disques). Notez que si une telle requte utilise la clause LIMIT pour ne lire qu'une partie des lignes, MySQL utilisera tout de mme l'index, car il va trouver plus rapidement les quelques lignes de rsultat. Les index hash ont des caractristiques diffrentes de celles prsentes : Elles sont utilises uniquement pour les comparaisons avec les oprateurs = ou <=> (mais elles sont trs rapides). L'optimiseur ne peut pas utiliser un index hash pour acclrer une clause ORDER BY. Ce type d'index ne peut tre utilis que pour rechercher la prochaine ligne dans l'ordre. MySQL ne peut dterminer approximativement le nombre de lignes qui sont prsentes entre deux valeurs : cette valeur est utilise par l'optimiseur d'intervalle pour dcider quel index utiliser. Cela affecte certaines requtes, si vous changez la table MyISAM en table MEMORY. Seules les cls entires peuvent tre recherches, pour une ligne. Avec un index B-tree, un prfixe peut tre utilis pour trouver les lignes.
409
Un bloc d'index est une adresse unitaire pour le fichier d'index MyISAM. Gnralement, la taille d'un bloc d'index est gal la taille des noeuds de l'index B-tree. Les index sont reprsents sur le disque en utilisant un arbre B-tree. Les noeuds terminaux sont appels des feuilles. Les noeuds qui ne sont pas des feuilles sont dits non-terminaux. Tous les blocs de buffer dans la structure de cache de cls ont la mme taille. Cette taille peut tre gale, suprieure ou infrieure la taille de bloc d'index de la table. Gnralement, un de ces deux valeurs est un multiple de l'autre. Lorsque des donnes d'un bloc d'index de table doivent tre lues, le serveur commence par vrifier si elles sont disponibles dans le cache de cls, plutt que sur le disque. C'est dire, qu'il va prfrer crire ou lire dans le cache de cls que sur le disque. Sinon, le serveur choisit un bloc de cache contenant un index d'une autre table, et remplace les donnes par celles de la table qu'il manipule. Ds que le bloc est dans le cache, les donnes d'index sont accessibles. Si un des blocs slectionns pour tre cras, a t modifi, le bloc est considr comme ``sale.'' Dans ce cas, avant d'tre remplac, il est d'abord crit dans le fichier d'index, sur le disque. Gnralement, le serveur suit une heuristique LRU (Least Recently Used : le moins utilis) : lorsqu'il choisit un bloc pour tre remplac, il slectionne le bloc qui a t accd le moins souvent. Pour faciliter ce choix, le module de cache de cls entretient une queue (la chane LRU) de tous les blocs utiliss. Lorsqu'un bloc doit tre remplac, les blocs du dbut de la queue sont les moins souvent slectionns, et sont les candidats au remplacement.
410
+---------+--------------------+----------+----------+ | test.t1 | assign_to_keycache | status | OK | | test.t2 | assign_to_keycache | status | OK | | test.t3 | assign_to_keycache | status | OK | +---------+--------------------+----------+----------+
Note : si le serveur a t compil en incluant le moteur de table ISAM, les tables ISAM utilise le mcanisme de cache de cls. Mais les index ISAM utilisent uniquement le cache de cls par dfaut, et ils ne peuvent pas tre assigns un autre cache. Le cache de cls indiqu dans la commande CACHE INDEX peut tre cr en spcifiant sa taille avec le paramtre SET GLOBAL ou en utilisant les options de dmarrage. Par exemple :
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
Les variables de cache de cls sont des variables systmes structures, qui ont un nom et des composants. Pour keycache1.key_buffer_size, keycache1 est le nom de variable du cache, et key_buffer_size est le composant de cache. Voyez Section 9.4.1, Variables systme structures pour une description de la syntaxe utilise pour faire rfrence aux variables systme structure. Par dfaut, les index de tables sont assigns dans le cache de cl principal, dit aussi cache par dfaut. Ce cache est cr au dmarrage. Lorsqu'un cache de cls est dtruit, les index qui lui taient assigns sont assigns au cache par dfaut. Pour un serveur en charge, nous recommandons la stratgie suivante pour les caches de cls : Un cache de cls principal qui reprsente 20% de l'espace allou pour tous les caches de cls. Il sera utilis par les tables qui sont le plus sollicites, mais qui ne sont pas modifies. Un cache de cls minoritaire qui reprsente 20% de l'espace allou pour tous les caches de cls. Il sera utilis pour les tables de taille intermdiaires, qui sont intensivement modifies, comme des tables temporaires, par exemple. Un cache de cls secondaire qui reprsente 60% de l'espace allou pour tous les caches de cls. C'est le cache de cl par dfaut, il sera utilis pour toutes les autres tables. Une raison pour utiliser les trois caches de cls est que l'accs un des caches ne bloque pas l'accs aux autres. Les requtes qui accdent aux index d'un des caches ne sont pas en comptition avec les requtes qui utilisent les index dans les autres cache. Les gains de performances sont aussi ds : Le cache principal est utilis pour les requtes en lecture et son contenu est jamais modifi. Par consquent, lorsqu'un bloc d'index doit tre lu sur le disque, le contenu du bloc remplac n'a pas besoin d'tre sauv. Pour un index assign au cache principal, s'il n'y a pas de requtes qui font des scans d'index, il y a une haute probabilit que tous les blocs d'index qui ne sont pas terminaux resteront dans le cache. Une opration de modification sur une table temporaire est effectue plus rapidement lorsque le noeud modifier est dj dans le cache, et n'a pas besoin d'tre lu dans le disque. Si la taille des index de la table temporaire est comparable la taille du cache minoritaire, la probabilit est trs haute que l'index soit dj dans le cache.
411
Lors de l'utilisation de la stratgie d'insertion au milieu, la chane LRU est divise en deux parties : une sous-chane principale, et une sous-chane secondaire. Le point de division entre les deux parties n'est pas fix, mais le systme s'assure que la partie principale n'est pas ``trop petite'', et qu'elle contient au moins key_cache_division_limit % de bloc de cache de cls. key_cache_division_limit est un composant d'une variable structure de cache de cl, et sa valeur peut tre modifie indpendamment pour chaque cache. Lorsqu'un bloc d'index est lu dans une table, depuis le cache de cl, il est plac la fin de la souschane secondaire. Aprs un certain nombre d'accs, il est promu dans la sous-chane principale. Actuellement, le nombre d'accs requis pour passer un bloc et le mme pour tous les blocs d'index. Dans le futur, nous allons permettre au compteur d'accs d'utiliser le niveau de B-tree : moins d'accs seront ncessaires un noeud s'il contient un noeud non-terminal d'un des niveaux suprieur de l'index B-tree. Un bloc de la chane principale est plac la fin de la chane. Le bloc circule alors dans la la sous-chane. Si le bloc reste la fin de la sous-chane suffisamment longtemps, il est rtrograd dans la chane secondaire. Ce temps est dtermin par la valeur du composant key_cache_age_threshold. La valeur de seuil prescrit que, pour un cache de cl contenant N blocs, le bloc au dbut de la chane principale qui n'est pas accd dans les derniers N*key_cache_age_threshold/100 accs doit tre plac au dbut de la chane secondaire. Il devient le premier candidat l'viction, car les blocs de remplacement sont toujours pris au dbut de la chane secondaire. La stratgie de l'insertion au milieu vous permet de garder les blocs les plus utiliss dans le cache. Si vous prfrez utiliser la stratgie LRU classique, laissez la valeur de key_cache_division_limit 100. La stratgie d'insertion au milieu aide amliorer les performances lorsque l'excution d'une requte qui requiert un scan d'index place dans le cache toutes les valeurs de l'index. Pour viter cela, vous devez utiliser la stratgie d'insertion au milieu, avec une valeur trs infrieure 100 pour key_cache_division_limit. Les blocs les plus utiliss seront conservs dans le cache durant un tel scan.
L'option IGNORE LEAVES fait que les blocs non-terminaux seuls seront lus dans l'index. Par consquent, la commande ci-dessus va charger tous les blocs de l'index de t1, mais uniquement les blocs non-terminaux de t2. Si un index a t assign un cache de cl en utilisant la commande CACHE INDEX, le prchargement place les blocs dans ce cache. Sinon, l'index est charg dans le cache par dfaut.
412
Si vous assignez une nouvelle valeurs aux variables key_buffer_size ou key_cache_block_size, le serveur va dtruire l'ancienne structure du cache, et en recrer un, en se basant sur les nouvelles valeurs. Si le cache contient des blocs sales, le serveur va les sauver sur le disque avant de dtruire et recrer le cache. La restructuration n'intervient pas si vous modifiez un autre paramtre du cache. Lors de la restructuration d'un cache de cl, le serveur commence par vider le contenu des buffers sales sur le disque. Aprs cela, le contenu du cache devient inaccessible. Cependant, la restructuration ne bloque pas les requtes qui utilisent des index qui sont dans le cache. Au lieu de cela, le serveur accde directement la table et utilise le cache du systme de fichiers. Le cache du systme de fichiers n'est pas aussi efficace que celui du cache de cls : si les requtes s'excutent toujours, elles seront un peu ralenties. Une fois que le cache a t restructur, il redevient accessible, et les blocs peuvent tre placs dedans. Le cache du systme de fichiers n'est plus utilis.
Cela vous laissera perplexe si vous n'avez que 6 tables. MySQL est multi-thread, il peut donc excuter plusieurs requtes sur la mme table simultanment. Pour minimiser les interfrences entre deux threads ayant diffrentes actions sur le mme fichier, la table est ouverte indpendamment par chacun des threads. Cela ncessite un peu de mmoire, mais augmente les performances. Avec les tables au format ISAM et MyISAM, cela require aussi un fichier additionnel de description du fichier des donnes. Avec ce type de tables, le fichier dcrivant l'index est partag entre tous les threads. Vous pourrez lire plus sur le sujet la section suivante : See Section 7.4.8, Quand MySQL ouvre et ferme les tables .
413
des limites de votre systme d'exploitation. Cependant, vous pourrez augmenter ces limites sur de nombreux systmes d'exploitation. Consultez votre documentation systme pour voir comment faire cela, car la mthode pour modifier la limite est diffrente pour chaque systme. table_cache est li au max_connections. Par exemple, pour 200 connexions simultanes, vous devriez avoir un cache de table d'environ 200 * n, o n est le nombre maximum de table dans une jointure. Vous devez aussi rserver des pointeurs de fichiers supplmentaires pour les tables temporaires et les fichiers. Assurez vous que votre systme d'exploitation peut grer le nombre de pointeurs de fichiers demand par l'option table_cache. Si table_cache est trop grand, MySQL peut tre court de pointeurs, et refuser des connexions, chouer l'excution de requtes, ou tre trs instable. Vous devez aussi prendre en compte que les tables MyISAM peuvent avoir besoin de deux pointeurs de fichiers pour chaque table diffrente. Vous pouvez augmenter le nombre de pointeurs de fichiers disponibles pour MySQL avec l'option de dmarrage --open-files-limit=#. See Section A.2.17, Fichier non trouv . Le cache de tables ouvertes reste au niveau de table_cache entres (par dfaut, 64; cela peut tre modifi avec l'option -O table_cache=# de mysqld). Notez que MySQL peut ouvrir temporairement plus de tables, pour tre capable d'excuter des requtes. Une table qui n'est pas utilise est referme, et supprime du cache de table, dans les circonstances suivantes : Lorsque le cache est plein, et qu'un thread essaie d'ouvrir une table qui n'est pas dans le cache. Lorsque le cache contient plus de table_cache lignes, et qu'aucun thread n'utilise cette table. Lorsque quelqu'un utilise la commande mysqladmin refresh ou mysqladmin flush-tables. Lorsque quelqu'un excute la commande FLUSH TABLES. Lorsque le cache de table se remplit, le serveur utilise la procdure suivante pour identifier une entre du cache, pour la supprimer : Les tables qui n'est pas en cours d'utilisation est libre, en utilisant la table qui a t accd depuis plus longtemps en premier. Si le cache est plein, et qu'aucune table ne peut tre libre, mais qu'une nouvelle table doit tre ouverte, le cache est temporairement tendu. Si le cache est dans un tat d'extension, et qu'une table passe de l'tat d'utilisation non utilisation, la table est immdiatement ferme et libre du cache. Une table est ouverte pour chaque accs simultan. Cela signifie que si vous avez deux threads qui accdent la mme table, ou accdent la mme table deux fois dans la requte (avec AS), la table devra tre ouverte deux fois. La premire ouverture d'une table prendre deux pointeurs de fichiers. Chaque utilisation supplmentaire de la mme table ne prendra qu'un pointeur supplmentaire. Le pointeur de fichier supplmentaire de la premire table est celui du fichier d'index. Ce pointeur est partag entre les threads. Si vous ouvrez une table avec HANDLER table_name OPEN, un objet de table ddi sera allou pour le thread. Cet objet de table n'est pas partag avec les autres threads, et il ne sera pas ferm avant que le thread n'appelle HANDLER table_name CLOSE, ou que le thread ne meurt. See Section 13.1.3, Syntaxe de HANDLER . Lorsque cela arrive, la table est place dans le cache de table (si il n'est pas plein). Vous pouvez vrifier si votre cache de table n'est pas trop petit en vrifiant la variable de mysqld appele Opened_tables. Si cette valeur est grande, mme si vous n'avez pas trop abus de la commande FLUSH TABLES, vous devrez augmenter la taille du cache. See Section 13.5.3.15, Syntaxe de SHOW STATUS .
414
Inconvnients de la cration d'un grand nombre de tables dans la mme base de donnes
7.4.9. Inconvnients de la cration d'un grand nombre de tables dans la mme base de donnes
Si vous avez beaucoup de fichiers dans un dossier, les oprations d'ouverture, fermeture, et cration seront ralenties. Si vous excutez une requte SELECT sur plusieurs tables, il y aura une lgre perte lorsque le cache de tables sera plein, car pour chaque table ouverte, une autre doit tre ferme. Vous pouvez rduire cette table en augmentant la taille du cache de tables.
415
Cette commande gnre une liste de toutes les options de mysqld et des variables configurables. Cette sortie comprend les valeurs par dfaut et ressemble cela :
Possible variables for option --set-variable (-O) are: back_log current value: 5 bdb_cache_size current value: 1048540 binlog_cache_size current value: 32768 connect_timeout current value: 5 delayed_insert_timeout current value: 300 delayed_insert_limit current value: 100 delayed_queue_size current value: 1000 flush_time current value: 0 interactive_timeout current value: 28800 join_buffer_size current value: 131072 key_buffer_size current value: 1048540 lower_case_table_names current value: 0 long_query_time current value: 10 max_allowed_packet current value: 1048576 max_binlog_cache_size current value: 4294967295 max_connections current value: 100 max_connect_errors current value: 10 max_delayed_threads current value: 20 max_heap_table_size current value: 16777216 max_join_size current value: 4294967295 max_sort_length current value: 1024 max_tmp_tables current value: 32 max_write_lock_count current value: 4294967295 myisam_sort_buffer_size current value: 8388608 net_buffer_length current value: 16384 net_retry_count current value: 10 net_read_timeout current value: 30 net_write_timeout current value: 60 read_buffer_size current value: 131072 record_rnd_buffer_size current value: 131072 slow_launch_time current value: 2 sort_buffer current value: 2097116 table_cache current value: 64 thread_concurrency current value: 10 tmp_table_size current value: 1048576 thread_stack current value: 131072 wait_timeout current value: 28800
Si un serveur mysqld est en cours d'excution, vous pouvez voir les valeurs que les variables utilisent rellement en excutant la commande :
mysql> SHOW VARIABLES;
Vous pouvez obtenir les statistiques et diffrents indicateurs de statut pour un serveur en fonctionnement avec cette commande :
mysql> SHOW STATUS;
Vous pouvez trouver une description complte de toutes les variables systme dans les sections Section 5.2.3, Variables serveur systme et Section 5.2.4, Variables de statut du serveur . MySQL utilise des algorithmes trs extensibles, donc vous pouvez utiliser trs peu de mmoire. Si malgr tout vous fournissez plus de mmoire MySQL, vous obtiendrez galement de meilleures performances. Les deux variables les plus importantes au moment du rglage d'un serveur MySQL sont key_buffer_size et table_cache. Vous devriez vous assurer que celles sont sont bien paramtres avant de modifier les autres variables.
416
Les exemples suivants indiquent quelques valeurs typiques pour diffrentes valeurs de configuration. Les exemples utilisent le script mysqld_safe et utilisent la syntaxe --name=value pour donner la variable appele name la valeur value. Cette syntaxe est disponible depuis MySQL 4.0. Pour les anciennes versions de MySQL, prenez en compte ces diffrences : Utilisez safe_mysqld plutt que mysqld_safe. Utilisez la syntaxe de modification des variables --set-variable=nom=valeur ou -O name=value. Pour les noms de variables qui finissent par _size, vous pouvez les spcifier sans le suffise _size. Par exemple, l'ancien nom de sort_buffer_size est sort_buffer. L'ancien nom de read_buffer_size est record_buffer. Pour voir quelles variables votre version du serveur reconnat, utilisez mysqld --help. Si vous avez beaucoup de mmoire (>=256 Mo) et beaucoup de tables, et que vous dsirez des performances maximales avec un faible de nombre de clients, vous devriez essayer quelque chose cela:
shell> safe_mysqld -O key_buffer=64M -O table_cache=256 \ -O sort_buffer=4M -O read_buffer_size=1M &
Si vous n'avez que 128 Mo et seulement quelques tables, mais que vous demandez beaucoup de classements, vous pouvez essayer cela :
shell> safe_mysqld -O key_buffer=16M -O sort_buffer=1M
Ou encore:
shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \ -O table_cache=32 -O read_buffer_size=8k -O net_buffer_length=1K &
Si vous utilisez GROUP BY ou ORDER BY sur des fichiers de taille suprieure la mmoire disponible, vous devriez augmenter la valeur de record_rnd_buffer pour acclrer la lecture des lignes aprs que le classement ait t fait. A l'installation de MySQL, un rpertoire support-files est cr, et contient plusieurs exemples de fichiers my.cnf: my-huge.cnf, my-large.cnf, my-medium.cnf et my-small.cnf. Vous pouvez les utiliser comme base pour optimiser votre systme. Si vous avez vraiment beaucoup de connections, des problmes peuvent apparatre avec le fichier d'change si mysqld n'a pas t configur pour utiliser peu de mmoire pour chaque connexion. mysqld fonctionne mieux si vous avec suffisamment de mmoire pour toutes les connections, bien sr ! Notez que si vous changez une option de mysqld, elle ne prendra effet qu'au prochain dmarrage du serveur. Pour voir les effets d'un changement de paramtre, essayez quelque chose comme ca:
shell> mysqld -O key_buffer=32m --help
Les valeurs des variables sont listes vers la fin du rsultat. Assurez vous bien de la prsence de l'option --help en fin de ligne; si ce n'est pas le cas, les options listes aprs dans la ligne de commande ne seront pas prises en compte la sortie. Pour plus d'information sur le paramtrage du moteur InnoDB, voyez la section Section 15.12, Conseils pour l'amlioration des performances InnoDB .
417
418
A la compilation de MySQL, vous devriez uniquement utiliser le support des caractres que vous allez utiliser. (Option --with-charset=xxx.) Les distributions binaires standards de MySQL sont compiles avec le support de toutes les gammes de caractres. Voici une liste des mesures que nous avons effectus: L'utilisation de pgcc et la compilation complte avec l'option -O6 donne un serveur mysqld 1% plus rapide qu'avec gcc 2.95.2. Si vous utilisez la liaison dynamique (sans -static), le rsultat est 13% plus lent sur Linux. Sachez que vous pouvez nanmoins utiliser la liaison dynamique pour les bibliothques de MySQL. Seul le serveur a des performances critiques. Si vous allgez votre binaire mysqld avec l'option strip libexec/mysqld, vous obtenez un binaire jusqu' 4% plus rapide. Si vous utilisez TCP/IP plutt que les sockets Unix, le rsultat est 7.5% plus lent sur le mme ordinateur. (Si vous vous connectez sur localhost, MySQL utilisera les sockets par dfaut.) Si vous vous connectez en TCP/IP depuis un autre ordinateur avec un lien Ethernet 100 Mo/s, le rsultat sera 8 11% plus lent. L'utilisation de connections scurises ( toutes les donnes chiffres par le support interne de SSL) pour nos tests comparatifs a provoqu une perte de vitesse de 55%. Si vous compilez avec --with-debug=full, vous perdrez 20% de performances sur la plupart des requtes, mais la perte peut tre plus importante sur certaines requtes (La suite de tests de MySQL tourne 35% plus lentement). Si vous utilisez --with-debug, vous ne perdrez que 15%. En dmarrant une version de mysqld, compile avec --with-debug=full, avec --skipsafemalloc, le rsultat final devrait tre proche d'une compilation avec --with-debug. Sur un Sun UltraSPARC-IIe, Forte 5.0 est 4% plus rapide que gcc 3.2. Sur un Sun UltraSPARC-IIe, Forte 5.0 est 4% plus rapide en mode 32 bit qu'en mode 64 bit. La compilation avec gcc 2.95.2 sur UltraSPARC avec l'option -mcpu=v8 -Wa,-xarch=v8plusa amliore les performances de 4%. Sur Solaris 2.5.1, MIT-pthreads est 8-12% plus lent que la gestion native des threads de Solaris sur mono-processeur. Avec plus de charge ou de CPU, la diffrente devrait tre encore plus grande. La compilation sur Linux-x86 avec gcc sans les pointeurs -fomit-frame-pointer ou -fomitframe-pointer -ffixed-ebp rend mysqld 1 4% plus rapide. Autrefois les distributions fournies par MySQL AB de MySQL-Linux taient compiles avec pgcc, mais nous avons d revenir au simple gcc cause d'un bogue dans pgcc qui gnrait du code qui ne fonctionnait pas sur AMD. Nous continuerons utiliser gcc tant que ce bogue ne sera pas corrig. Nanmoins, si vous avez une machine non-AMD, vous pouvez obtenir des binaires plus rapides en compilant avec pgcc. Le binaire standard de MySQL pour Linux est li statiquement pour tre plus rapide et plus portable.
419
une pile (par dfaut, 64 ko, variable thread_stack), un buffer de connexion (variable net_buffer_length), un buffer de rsultat (variable net_buffer_length). Le buffer de connexion et celui de rsultat sont dynamiquement largit jusqu' max_allowed_packet suivant les besoins. Lorsque la requte s'excute, une copie de la chane de requte est aussi alloue. Tous les threads partagent la mme mmoire de base. Seules les tables compresses ISAM / MyISAM sont copies en mmoire. Ceci est d au fait que pour un espace de 32 bits, il n'y a pas de place pour les grosses tables en mmoire. Lorsque les systmes de 64 bits seront plus rpandus, nous pourrions gnraliser le support pour la copie en mmoire. Chaque requte qui effectue une analyse squentielle d'une table, alloue un buffer de lecture (variable record_buffer). Lors de la lecture de lignes en ordre 'alatoire' (par exemple, aprs un tri), un buffer de lecture alatoire est alloue pour viter les accs disques (variable record_rnd_buffer). Toutes les jointures sont fates en une seule passe, et la plupart des jointure sont fates sans utiliser de table temporaire. La plupart des table temporaires sont fates en mmoire (table HEAP). Les tables temporaires avec beaucoup de donnes (calcules comme la somme des tailles de toutes les colonnes) ou qui contiennent des colonnes de type BLOB sont sauves sur le disque. Un problme avec les versions de MySQL antrieures la version 3.23.2 est que si une table HEAP dpassait la taille maximale de tmp_table_size, vous obteniez une erreur The table tbl_name is full. Dans les nouvelles versions, ce problme est gr en passant automatiquement la table HEAP en une table MyISAM sur le disque. Pour contourner ce problme, vous pouvez augmenter la taille maximale des tables en mmoire en modifiant l'option tmp_table_size de mysqld, ou en modifiant l'option SQL BIG_TABLES dans le programme client. See Section 13.5.2.8, Syntaxe de SET . En MySQL version 3.20, la taille maximale de la table temporaire est record_buffer*16, ce qui fait que si vous utilisez cette version, vous aurez augmenter la valeur de record_buffer. Vous pouvez aussi dmarrer mysqld avec l'option -big-tables pour toujours stocker les tables temporaires sur le disque. Cependant, cela va affecter la vitesse de votre serveur pour les requtes complexes. La plupart des requtes qui sont tries allouent un buffer de tri, et entre 0 et 2 fichiers temporaires, suivant la taille du rsultat. See Section A.4.4, O MySQL stocke les fichiers temporaires ? . Toute l'analyse et les calculs sont faits en mmoire locale. Aucune mmoire supplmentaire n'est ncessaire pour les petits calculs, et les allocations et librations de mmoire sont vits. La mmoire n'est alloue que pour les chanes trs grandes (ceci se fait via malloc() et free()). Chaque fichier d'index est ouvert une fois, et le fichier de donnes est ouvert pour chaque thread concurrent. Pour chaque thread concurrent, une structure de table, une structure de colonne pour chaque colonne et un buffer de taille 3 * n est allou (o n est la taille maximale de ligne, en dehors des colonnes de type BLOB). Une colonne de type BLOB utilise 5 8 octets de plus que la taille des donnes du BLOB. Les gestionnaires de table ISAM/MyISAM utilisent un buffer d'une ligne de plus pour leur utilisation interne. Pour chaque table qui a une colonne BLOB, un buffer est dynamiquement agrandi pour lire les valeurs BLOB. Si vous analysez toute une table, un buffer aussi grand que la plus grande valeur de la colonne BLOB sera allou. Les gestionnaires de tables pour les tables en cours d'utilisation sont sauves dans un cache, et gr comme une pile FIFO. Normalement, ce cache contient 64 lignes. Si une table doit tre utilise
420
par deux threads concurrents simultanment, le cache contiendra deux entres pour la table. See Section 7.4.8, Quand MySQL ouvre et ferme les tables . La commande mysqladmin flush-tables ferme toute les tables qui ne sont pas utilises, et marque toutes les tables en cours d'utilisation pour qu'elles soient fermes ds la fin du thread. Cela va librer l'essentiel de la mmoire utilise. ps et d'autres commandes de statut systme peuvent indiquer que mysqld utilise beaucoup de mmoire. Ceci est peut tre d a des erreurs de comptabilit. Par exemple, sous Solaris, ps compte la mmoire inutilise entre les threads comme de la mmoire utilise. Vous pouvez le vrifier en regardant l'tat de la swap avec swap -s. Nous avons test mysqld avec les dtecteurs de fuite mmoire commerciaux, et il n'y a aucune fuite.
421
Le paralllisme signifie que vous avez plusieurs disques matriel, et que vous crivez le premier bloc de donnes sur le premier disque, puis le second bloc de donnes sur le second disque, et le n-ime bloc sur le n-ime disque, etc. Cela signifie que si la taille normale de vos donnes sont moins grand que le nombre de disque disponibles, vous obtiendrez alors des performances additionnes. Notez que le paralllisme est trs dpendant du nombre de disque disponibles et du systme d'exploitation. See Section 7.1.5, Utiliser vos propres tests de performance . Notez que la diffrence de performance avec le paralllisme est trs dpendante des paramtres. Suivant la faon avec laquelle vous avez configur les disques en parallle, et le nombre de disque que vous utilisez, le facteur d'amlioration peut tre trs variable. Notez que vous devez faire votre optimisation en lecture alatoire ou squentielle. Pour plus de robustesse, vous pouvez utiliser des disques en RAID 0+1 (paralllisme et rplication), mais dans ce cas, vous aurez besoin de 2*N disques pour contenir vos donnes sur N disques. C'est probablement l'option la plus sre, si vous avez le budget pour cela. Vous risquez aussi d'avoir investir dans un systme de gestion de gros volume de donnes pour grer cela efficacement. Une bonne option est de garder les donnes semi-importantes (qui peuvent tre regnres) sur un disque RAID 0 tandis que les donnes vraiment importantes (comme les informations d'htes et les log) sur un disque de type RAID 0+1 ou RAID N. RAID N peut tre un problme si vous avez de nombreux accs en crire, cause du temps de modification des bits de parit. Sous Linux, vous pouvez amliorer les performances (jusqu' 100% en charge n'est pas difficile) en utilisant hdparm pour configurer votre interface disque. La commande suivante doit tre une srie de bonnes options de hdparm pour MySQL (et probablement d'autres applications) :
hdparm -m 16 -d 1
Notez que la performances et la robustesse des solutions ci-dessus dpendent de votre matriel, et nous vous conseillons vivement de tester votre systme soigneusement aprs avoir utilis hdparm! Consultez le manuel de hdparm pour plus de dtails. Si hdparm n'est pas utilis correctement, le systme de fichiers peut tre corrompu. Sauvegardez tout avant d'exprimenter. Vous pouvez aussi modifier les paramtres suivants sur le systme de fichiers que la base de donnes utilise : Si vous n'avez pas besoin de savoir quand un fichier a t accd la dernire fois (ce qui n'est pas utile avec un serveur de base de donnes), vous pouvez monter votre systme de fichier avec l'option -o noatime. Sur de nombreux systmes d'exploitation, vous pouvez monter des disques avec l'option -o async pour que le systme de fichiers soit modifi de manire asynchrone. Si votre serveur est raisonnablement stable, vous devriez obtenir de bonne performances sans sacrifier la stabilit (cette option est active par dfaut sur Linux).
422
MySQL n'accepte pas que vous fassiez le lien depuis plusieurs bases sur le mme dossier. Remplacer une base par un lien symbolique sera correct tant que vous n'essayez pas de faire des liens symboliques dans la mme base. Supposez que vous la base db1 dans le dossier de donnes MySQL, puis que vous fassiez un lien symbolique db2 qui pointe sur db1 :
shell> cd /path/to/datadir shell> ln -s db1 db2
Maintenant, pour toute table tbl_a de db1, il en apparat aussi tbl_a dans db2. Si un thread modifie db1.tbl_a et un autre db2.tbl_a, il va y avoir un conflit. Si vous avez vraiment besoin de cette fonctionnalit, vous devez changer le code suivant dans le fichier C mysys/mf_format.c:
if (!(MyFlags & MY_RESOLVE_LINK) || (!lstat(filename,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
Sous Windows, vous pouvez utiliser des liens internes symboliques pour relier des bases en compilant MySQL avec l'option -DUSE_SYMDIR. Cela vous permettra de placer vos bases de donnes sur diffrentes partitions. See Section 7.6.1.3, Utiliser des liens symboliques pour les bases de donnes sous Windows .
7.6.1.2. Utiliser les liens symboliques avec les tables sous Unix
Avant MySQL 4.0, vous ne devez pas utiliser les liens symboliques avec les tables, si vous n'tes pas trs prudents avec. Le problme est que si vous excutez ALTER TABLE, REPAIR TABLE ou OPTIMIZE TABLE sur une table symbolique, le lien sera supprim et remplac par le fichier original. Cela arrive car les commandes ci-dessus fonctionnent en crant un fichier temporaire dans le dossier de base, et lorsque l'opration est faite, l'original est remplac par la copie. Vous ne devez pas utiliser des liens symboliques sur les tables, sur les systmes qui ne supportent pas compltement la fonction realpath(). (Au moins Linux et Solaris supportent realpath()) En MySQL 4.0, les liens symboliques sont compltement supports par les tables MyISAM. Les autres types de tables vous donneront des rsultats tranges lorsque vous les utilisez comme indiqu cidessus. La gestion des liens symboliques de MySQL 4.0 fonctionne comme ceci (uniquement pour les tables MyISAM) : Dans le dossier de donnes, vous allez toujours trouver le fichier de dfinition de table, le fichier de structure et le fichier d'index. Dans le dossier de donnes, vous devez toujours avoir le fichier de dfinition de table, le fichier de donnes et le fichier d'index. Les fichiers de donnes et d'index peuvent tre dplacs ailleurs, et remplacs dans le dossier de donnes par des liens symboliques. Mais le fichier de dfinition ne le peut pas. Vous pouvez utiliser un lien symbolique avec le fichier d'index et celui de donnes, pour placer ces fichiers dans d'autres dossiers.
423
Le lien symbolique peut tre fait via le systme d'exploitation (si mysqld ne fonctionne pas) ou avec la commande INDEX/DATA DIRECTORY="path-to-dir" dans CREATE TABLE. See Section 13.2.5, Syntaxe de CREATE TABLE . myisamchk ne va pas remplacer un lien symbolique avec les donnes ou le fichier d'index, mais il va travailler directement sur le fichier vers lequel le lien pointe. Tous les fichiers temporaires seront cr dans le mme dossier que le dossier qui contient les donnes ou le fichier d'index. Lorsque vous dtruisez une table qui utilise un lien symbolique, le fichier et le lien symbolique sont dtruits. C'est une bonne raison pour ne pas excuter mysqld en tant que root ou donner des droits d'criture d'autres personnes dans les dossiers de donnes de MySQL. Si vous renommez une table avec ALTER TABLE RENAME vous n'avez pas dplacer la table dans une autre base, le lien symbolique du dossier de base sera renomm avec le nouveau nom. Si vous utilisez la commande ALTER TABLE RENAME pour dplacer la table dans une autre base, la table sera dplace dans l'autre base, et l'ancien lien symbolique et le fichier vers lequel il pointait seront dtruits (en d'autres termes, la nouvelle table ne sera pas un lien symbolique). Si vous n'utilisez pas de lien symbolique, vous devriez utiliser l'option --skip-symlink de mysqld pour vous assurer que personne n'efface ou ne renomme un fichier en dehors du dossier de donnes de MySQL. SHOW CREATE TABLE n'indique pas si une table a des liens symboliques, avant la version 4.0.15. C'est aussi vrai pour mysqldump, qui utilise SHOW CREATE TABLE pour gnrer les commandes CREATE TABLE. Ce qui n'est pas encore support : ALTER TABLE ignore toutes les options INDEX/DATA DIRECTORY="path". BACKUP TABLE et RESTORE TABLE ne respectent pas les liens symboliques. Le fichier .frm ne doit jamais tre un lien symbolique (Comme indiqu prcdemment, seul les fichiers d'index et de donnes peuvent tre des liens symboliques. Si jamais vous le faites malgr tout, vous gnrerez des erreurs de cohrence. Supposez que vous une base db1 dans le dossier de donnes MySQL, et une table tbl1 dans cette base, et dans le dossier db1, vous faites un lien symbolique tbl2 qui pointe sur tbl1 :
shell> shell> shell> shell> cd ln ln ln /path/to/datadir/db1 -s tbl1.frm tbl2.frm -s tbl1.MYD tbl2.MYD -s tbl1.MYI tbl2.MYI
Il va y avoir des problmes si un thread lit db1.tbl1 et qu'un autre modifie db1.tbl2: Le cache de requte sera induit en erreur (il va croire que tbl1 a t mis jour, et retournera des rsultats incohrents). La commande ALTER de la table tbl2 va aussi chouer.
7.6.1.3. Utiliser des liens symboliques pour les bases de donnes sous Windows
Depuis MySQL 3.23.16, les serveurs mysqld-max et mysql-max-nt de la stribution MySQL sont compil avec l'option -DUSE_SYMDIR. Cela vous permet de disposer d'un dossier de base de donnes sur un autre disque, en utilisant un lien symbolique vers ce dossier, mme si la procdure suivre pour configurer ce lien est diffrent. Depuis MySQL 4.0, les liens symboliques sont activs par dfaut. Si vous n'en avez pas besoin, vous pouvez les dsactiver avec l'option skip-symbolic-links :
[mysqld]
424
skip-symbolic-links
Avant MySQL 4.0, les liens symboliques sont dsactivs par dfaut. Pour les activer, vous pouvez ajouter la ligne suivante dans votre fichier my.cnf ou my.ini :
[mysqld] symbolic-links
Sous Windows, vous crez un lien symbolique vers une base de donnes MySQL en crant un fichier qui contient le nom du dossier de destination. Sauvez le fichier dans le dossier de donnes, en utilisant le nom db_name.sym, o db_name est le nom de la base. Supposons que le dossier de donnes MySQL est C:\mysql\data et que votre base foo soit place dans le dossier D:\data\foo, vous pouvez configurer les liens symboliques comme ceci : 1. Assurez vous que le dossier D:\data\foo existe bien, en le crant si ncessaire. Si vous avez dj un dossier appel foo dans le dossier de donnes, vous devez le dplacer dans D: \data. Sinon, le lien symbolique sera inoprant. Pour viter les problmes, le serveur ne doit pas fonctionner lorsque vous dplacez le dossier. 2. Crez le fichier C:\mysql\data\foo.sym qui contient le chemin D:\data\foo\. Aprs cela, toutes les tables cres dans la base foo seront cres dans le dossier D:\data\foo. Notes que les liens symboliques ne seront pas utiliss si un dossier du mme nom existe dans le dossier de donnes MySQL.
425
426
Utilitaire de lecture des requtes au format binaire. Peut tre utilis aprs un crash, sur une vieille sauvegarde. See Section 8.5, mysqlbinlog, Excuter des requtes dans le log binaire . mysqlcc Interface graphique avec le serveur MySQL. See Section 8.6, mysqlcc, MySQL Control Center . mysqlcheck Un client d'entretien de tables, qui vrifie, rpare, analyse et optimise les tables. See Section 8.7, Utiliser mysqlcheck pour l'entretien et la rparation . mysqldump Exporte une base de donnes MySQL dans un fichier sous la forme de requtes SQL, ou de fichiers texte, avec la tabulation comme sparateur. Un freeware amlior, d'aprs une ide originale de Igor Romanenko. See Section 8.8, mysqldump, sauvegarde des structures de tables et les donnes . mysqlhotcopy Un utilitaire qui fait des sauvegardes rapides des tables MyISAM et ISAM alors que le serveur fonctionne. See Section 8.9, mysqlhotcopy, copier les bases et tables MySQL . mysqlimport Importe les fichiers textes dans les tables, en utilisant la commande LOAD DATA INFILE. See Section 8.10, mysqlimport, importer des donnes depuis des fichiers texte . mysqlshow See Section 8.11, Afficher les bases, tables et colonnes . perror Un utilitaire qui affiche la signification des codes d'erreur MySQL. See Section 8.12, perror, expliquer les codes d'erreurs . replace replace modifie des chanes dans des fichiers, ou sur l'entre standard. See Section 8.13, L'utilitaire de remplacement de chanes replace . Chaque programme MySQL accepte diffrentes options. Mais chaque programme dispose de l'option --help qui vous donne une description complte des options du programme. Par exemple, mysql --help. Les clients MySQL qui communiquent avec le serveur, utilisent la bibliothque mysqlclient est les variables d'environnements suivantes : MYSQL_UNIX_PORT MYSQL_TCP_PORT MYSQL_PWD MYSQL_DEBUG TMPDIR Le fichier de socket Unix par dfaut. Utilis pour les connexions localhost Le port par dfaut. Utilis par les connexions TCP/IP. Le mot de passe par dfaut. Les options de dbogage. Le dossier o les tables et fichiers temporaires sont placs.
Utiliser MYSQL_PWD n'est pas scuritaire, et est fortement dconseill. See Section 5.6.6, Garder vos mots de passe en lieu sr . Vous pouvez remplacer les valeurs par dfaut des options en spcifiant les valeurs dans un fichier d'options, ou en ligne de commande. Section 4.3, Spcifier des options aux programmes .
428
Chaque nom de fichier doit tre le nom d'un fichier d'index (.MYI). Si vous n'tes pas dans le dossier de donnes, vous devez spcifier le chemin complet jusqu'au fichier. Il est tolr que vous omettiez l'extension du fichier .MYI. myisampack supporte les options suivantes : --help, -? Affiche le message d'aide et quitte. --backup, -b Fait une sauvegarde de la table sous le nom de tbl_name.OLD. --debug[=debug_options], -# [debug_options] Affiche le log de dbogage. La chane debug_options vaut souvent 'd:t:o,filename'. --force, -f Force la compression de la table, mme si elle grossit ou si le fichier temporaire existe dj. myisampack cre un fichier temporaire appel tbl_name.TMD 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 dcouvre que le fichier tbl_name.TMD existe. Avec --force, myisampack reprendra le travail. --join=big_tbl_name, -j big_tbl_name Rassemble toutes les tables indiques dans la ligne de commande dans une seule table appele big_tbl_name. Toutes les tables qui seront combines doivent tre identiques (mmes noms de colonnes, mmes types, mmes index, etc.)
429
--packlength=#, -p # Spcifie 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 dterminer 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 approprie, ou plus courte. Dans ce cas, myisampack va imprimer une note pour que vous le sachiez lors de la prochaine compression du mme fichier. --silent, -s Mode silencieux. Seules les erreurs seront affiches. --test, -t Ne compresse pas la table, mais teste juste la compression. --tmp_dir=path, -T path Utilise le dossier indiqu comme dossier pour les fichiers temporaires. --verbose, -v Mode dtaill. Toutes les informations sur la progression de la compression seront affiches. --version, -V Affiche la version et quitte. --wait, -w Attend et reessaie, si la table tait dj en cours d'utilisation. Si le serveur mysqld a t dmarr avec l'option --skip-external-locking, ce n'est pas une bonne ide d'appeler myisampack, car la table risque d'tre modifie durant la compression. La squence de commande illustre la session de compression :
shell> ls -l -rw-rw-r--rw-rw-r--rw-rw-r-station.* 1 monty 1 monty 1 monty my my my 994128 Apr 17 19:00 station.MYD 53248 Apr 17 19:00 station.MYI 5767 Apr 17 19:00 station.frm
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 Recordlength: 834 Record format: Fixed length table description: Key Start Len Index Type 1 2 4 unique unsigned long 2 32 30 multip. text Field 1 2 3 4 5 6 Start 1 2 6 10 11 31 Length Type 1 4 4 1 20 1
Rec/key 1 1
430
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
32 62 97 132 167 171 187 222 226 242 262 282 302 332 336 340 341 349 357 365 367 369 373 377 378 380 388 392 396 400 404 405 409 413 417 421 425 429 449 479 480 481 560 639 718 797 805 806 807 827 831
30 35 35 35 4 16 35 4 16 20 20 20 30 4 4 1 8 8 8 2 2 4 4 1 2 8 4 4 4 4 1 4 4 4 4 4 4 20 30 1 1 79 79 79 79 8 1 1 20 4 4
shell> myisampack station.MYI Compressing station.MYI: (1192 records) - Calculating statistics normal: 20 empty-space: 16 pre-space: 0 end-space: 12 Original trees: 57 After join: 17 - Compressing file 87.14% shell> ls -l -rw-rw-r--rw-rw-r--rw-rw-r-station.* 1 monty 1 monty 1 monty empty-zero: table-lookups: 12 5 empty-fill: zero: 11 7
my my my
127874 Apr 17 19:00 station.MYD 55296 Apr 17 19:04 station.MYI 5767 Apr 17 19:00 station.frm
shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58
431
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 1 2 4 unique unsigned long 2 32 30 multip. text Field 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 Start 1 2 6 10 11 31 32 62 97 132 167 171 187 222 226 242 262 282 302 332 336 340 341 349 357 365 367 369 373 377 378 380 388 392 396 400 404 405 409 413 417 421 425 429 449 479 480 481 560 639 718 797 805 806 807 827 831 Length 1 4 4 1 20 1 30 35 35 35 4 16 35 4 16 20 20 20 30 4 4 1 8 8 8 2 2 4 4 1 2 8 4 4 4 4 1 4 4 4 4 4 4 20 30 1 1 79 79 79 79 8 1 1 20 4 4 Type constant zerofill(1) no zeros, zerofill(1) table-lookup no endspace, no endspace, no empty no endspace, zerofill(1) no endspace, no endspace, zerofill(1) no endspace, no endspace, no endspace, no endspace, no endspace, always zero always zero table-lookup table-lookup always zero no zeros, zerofill(1) no zeros, zerofill(1) table-lookup no zeros, zerofill(1) no zeros always zero table-lookup no zeros, zerofill(1) no zeros, zerofill(1) no zeros always zero no zeros always zero no zeros always zero no empty no empty not_always not_always, no not_always, no not_always, no not_always, no not_always, no not_always no empty no empty no empty
Rec/key 1 1
no no no no no
432
Les informations affiches par myisampack sont dcrites ici : normal Le nombre de colonnes pour lesquelles aucune compression n'est utilise. 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 zros : 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 rduites en taille (par exemple, une colonne de type INTEGER sera transforme en MEDIUMINT). pre-space Le nombre de colonnes de nombres virgule flottante qui ont des valeurs stockes 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 diffrentes, 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 zro. Original trees Le nombre initial d'arbres Huffman. After join Le nombre d'arbres Huffman distincts obtenus aprs avoir joint les arbres pour conomiser de l'espace d'entte. Aprs la compression d'une table, myisamchk -dvv affiche des informations supplmentaires pour chaque champ : Type Le type de fichier peut contenir les informations suivantes : constant Toutes les lignes ont la mme valeur. no endspace Ne stocke pas les espaces finaux.
433
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 stocks. no zeros Ne stocke pas les zros. always zero Les valeurs 0 sont stockes sur un octet. Huff tree L'arbre Huffman associ au champ. Bits Le nombre de bits utiliss par l'arbre Huffman. Aprs la compression de pack_isam/myisampack vous devez excuter la commande isamchk/myisamchk pour recrer l'index. A ce moment, vous pouvez aussi trier les blocs d'index et crer des statistiques ncessaires pour l'optimiseur MySQL :
shell> myisamchk -rq --sort-index --analyze tbl_name.MYI
Une procdure similaire s'applique aux tables ISAM. Aprs avoir utilis pack_isam, utilisez isamchk pour recrer les index :
shell> isamchk -rq --sort-index --analyze tbl_name.ISM
Aprs avoir install la table compresse dans un dossier de donnes MysQL, vous devez excutez la commande mysqladmin flush-tables pour forcer mysqld utiliser cette nouvelle table. Si vous voulez dcompresser une table compresse, vous pouvez le faire avec l'option --unpack de la commande isamchk ou myisamchk.
434
ou :
shell> mysql --user=user_name --password=your_password db_name
Tapez une commande SQL, puis terminez-la avec ;, \g ou \G, et finissez avec entre. Vous pouvez excuter un script avec :
shell> mysql db_name < script.sql > output.tab
mysql supporte les options suivantes : --help, -? Affiche cette aide et quitte. --batch, _B Affiche les rsultats avec une tabulation comme rsultat, et chaque ligne avec une nouvelle ligne. N'utilise pas l'historique. --character-sets-dir=path Le dossier o les jeux de caractres sont crs. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --compress, _C Utilise la compression avec le protocole client / serveur. --database=db_name, -D db_name La base de donnes utiliser. C'est particulirement pratique dans le fichier d'options my.cnf. --debug[=debug_options], -# [debug_options] Gnre un log de dbogage. La chane debug_options vaut souvent 'd:t:o,file_name'. Par dfaut, la valeur est 'd:t:o,/tmp/mysql.trace'. --debug-info, -T Affiche des informations de dbogage lorsque le programme se termine. --default-character-set=charset Configure le jeu de caractres par dfaut. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --execute=statement, -e statement Excute une commande et quitte. Le rsultat est au format de l'option --batch. --force, f Continue mme si vous recevez une erreur SQL. --host=host_name, -h host_name Connexion avec l'hte indiqu. --html, H Produit un rsultat au format HTML.
435
--ignore-space, i Ignore les espaces aprs les noms de fonctions. L'effet de cette commande est dcrit dans la discussion sur IGNORE_SPACE de la section Section 5.2.2, Le mode SQL du serveur . --local-infile[={0|1}] Active ou dsactive la possibilit d'utiliser la commande LOCAL pour LOAD DATA INFILE. Sans valeur, cette option active LOCAL. Elle peut tre configur avec --local-infile=0 ou --localinfile=1 pour explicitement activer ou dsactiver LOCAL. Activer LOCAL n'a pas d'effet si le serveur ne le supporte pas de son cot. --named-commands, -G Les commandes nommes sont actives. Utilisez la forme \* uniquement, ou utilisez les commandes nommes au dbut d'une ligne se terminant par un point-virgule (;). Depuis la version 10.9, le client dmarre avec cette option active par dfaut. Avec l'option -g, le format long des commandes va continuer fonctionner. --no-auto-rehash, -A Pas de rehashage automatique. Cette option fait que mysql se lance plus rapidement, mais vous devez utiliser la commande rehash si vous voulez utiliser la completion de nom de tables. --no-beep, -b Ne fait pas de bip, lorsqu'une erreur survient. --no-named-commands, -g Les commandes nommes sont dsactives. Utilisez uniquement la forme \* ou bien utilisez les commandes nommes en dbut de ligne, et terminez la avec un point-virgule (;). Depuis MySQL 3.23.22, mysql dmarre avec cette option active par dfaut! Cependant, mme si cette avec cette option, les formats de commandes longues fonctionneront sur la premire ligne. --no-pager Dsactive le systme de page, et affiche directement dans la sortie standard. Plus de dtails dans la section Section 8.3.1, Commandes mysql . --no-tee Dsactive le fichier de sortie. Voyez l'aide interactive (\h). Plus de dtails dans la section Section 8.3.1, Commandes mysql . --one-database, O Ne modifie que la base par dfaut. C'est pratique pour viter les modifications dans les autres bases dans le fichier de log. --pager[=command] Type d'affichage. Par dfaut, la variable d'environnement ENV vaut PAGER. Les pagineurs valides sont less, more, cat [> filename], etc. Voyez l'aide interactive (\h). Cette option n'est pas fonctionnelle en mode batch. Les pagineurs ne fonctionnent qu'avec Unix. Plus de dtails dans la section Section 8.3.1, Commandes mysql . --password[=password], -p[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.
436
--port=port_num, -P port_num Le numro de port TCP/IP pour la connexion. --prompt=format_str Modifie le format de l'invite de commandes (prompt). Par dfaut, c'est mysql>. Les squences spciales sont prsentes dans la section Section 8.3.1, Commandes mysql . --protocol={TCP | SOCKET | PIPE | MEMORY} Spcifie le protocole de connexion utiliser. Nouveau en MySQL version 4.1. --quick, -q Ne met pas en cache le rsultat, et l'affiche ligne par ligne. C'est plus lent pour le serveur, si le rsultat est interrompu. N'utilise pas le fichier d'historique. --raw, -r Ecrit les valeurs des colonnes sans les conversions de protections. Utilis en mode --batch --reconnect Si la connexion est perdue, essaie de se reconnecter automatiquement au serveur, juste une fois. Pour supprimer la reconnexion automatique, utilisez --skip-reconnect. Nouveau en MySQL 4.1.0. --safe-updates, --i-am-a-dummy, -U N'autorise que les commandes UPDATE et DELETE qui utilisent des cls. Voir plus bas pour des informations sur cette option. Vous pouvez annuler cette option si vous l'avez dans le fichier d'option my.cnf en utilisant la syntaxe --safe-updates. Voyez la section Section 8.3.3, Conseils avec mysql pour plus d'informations sur cette option. --silent, -s Mode trs silencieux. ----skip-column-names, -N N'crit pas les noms de colonnes dans les rsultats. --skip-line-numbers, -L N'crit pas les numros de lignes dans les erreurs. Trs pratique lorsque vous voulez comparer des rsultats qui incluent des messages d'erreurs. --socket=path, -S path Le fichier de socket utiliser pour la connexion. --table, -t Affichage au format de table. C'est le mode par dfaut pour le mode non-batch. --tee=file_name Ajoute tout dans le fichier de sortie. Voyez l'aide interactive (\h). Ne fonctionne pas en mode batch. Cette option est dtaille dans Section 8.3.1, Commandes mysql . --unbuffered, -n Vide le buffer de requte aprs chaque requte.
437
--user=user_name, -u user_name Nom d'utilisateur pour la connexion, si ce n'est pas l'utilisateur Unix courant. --verbose, -v Affichage plus dtaill (-v -v -v indique le format d'affichage de table). --version, -V Affiche la version et quitte. --vertical, -E Affiche le rsultat d'une requte verticalement. Sans cette option, vous pouvez aussi obtenir ce format en terminant votre requte avec \G. --wait, -w Attend et retente si la connexion s'interrompt, au lieu de quitter. --xml, -X Affiche le rsultat au format XML. Vous pouvez aussi spcifier les variables suivantes avec la syntaxe --var=option : connect_timeout Nombre de secondes avant que la connexion n'expire. Valeur par dfaut : 0. max_allowed_packet Taille maximale du paquet de communication avec le serveur. Valeur par dfaut : 16777216. max_join_size Limite automatique pour les commandes de jointure avec l'option --i-am-a-dummy. Valeur par dfaut : 1 000 000 (un million). net_buffer_length Buffer pour les communications TCP/IP et socket. Valeur par dfaut : 16 ko. select_limit Limite automatique pour les commandes SELECT avec l'option --i-am-a-dummy Valeur par dfaut : 1000. Il est aussi possible de configurer les variables en utilisant --set-variable=var_name=value ou la syntaxe -O var_name=value. Cependant, cette syntaxe est obsolte depuis MySQL 4.0. Sous Unix, le client mysql crit l'historique des requtes dans un fichier. Par dfaut, le fichier de requtes s'appelle .mysql_history, et il est cr dans votre dossier racine. Pour spcifier un fichier diffrent, modifiez la variable d'environnement MYSQL_HISTFILE. Si vous ne voulez pas entretenir un fichier d'historiques, supprimez .mysql_history s'il existe, puis utiliser l'une des techniques suivantes : Donnez MYSQL_HISTFILE la valeur de /dev/null. Pour que cela soit pris en compte chaque redmarrage, ajoutez cette ligne votre script de dmarrage. Faites un lien symbolique depuis .mysql_histfile vers /dev/null:
438
Commandes mysql
Synonym for `help'. Clear command. Reconnect to the server. Optional arguments are db and host. Set query delimiter. Edit command with $EDITOR. Send command to mysql server, display result vertically. Exit mysql. Same as quit. Send command to mysql server. Display this help. Disable pager, print to stdout. Don't write into outfile. Set PAGER [to_pager]. Print the query results via PAGER. Print current command. Change your mysql prompt. Quit mysql. Rebuild completion hash. Execute an SQL script file. Takes a file name as an argument. Get status information from the server. Execute a system shell command. Set outfile [to_outfile]. Append everything into given outfile. Use another database. Takes database name as argument.
Les commandes edit, nopager, pager et system ne fonctionnent que sous Unix. La commande status donne des dtails sur la connexion et le serveur utiliss. Si vous fonctionnez en mode --safe-updates, status va aussi afficher les valeurs des variables de mysql qui affectent vos requtes. Pour enregistrer les requtes et leur rsultat, utilisez la commande tee. Toutes les donnes affiches l'cran seront ajoutes un fichier donn. Cela peut tre trs pratique pour dboguer. Vous pouvez activer cette fonctionnalit en ligne de commande, avec l'option --tee, ou interactivement avec la commande tee. Le fichier tee peut tre dsactiv interactivement avec la commande notee. Excuter tee nouveau r-active le log. Sans paramtre, le fichier prcdent sera utilis. Notez que tee envoie les requtes dans le fichier aprs chaque commande, juste avant que mysql ne l'affiche. La lecture et la recherche dans les rsultats de requtes en mode interactif est possible en utilisant les programmes Unix less, more, ou tout autre programme similaire, avec l'option --pager. Si vous ne spcifier par de valeur d'option, mysql regarde la valeur de la variable d'environnement PAGER, et utilise ce pager. Vous pouvez aussi l'activer interactivement avec la commande pager et la dsactiver avec nopager. La commande prend un argument optionnel : s'il est fournit, le programme de pager indiqu sera utilis. Sinon, le pager sera celui indiqu en ligne de commande, ou stdout si aucun pager n'tait indiqu. La pagination de sortie ne fonctionne que sous Unix, car elle utilise la fonction popen(), qui n'existe pas sous Windows. Pour Windows, la commande tee peut tre utilise pour sauver le rsultat, mme si ce n,est pas aussi pratique que pager pour naviguer dans le rsultat.
439
Commandes mysql
Quelques conseils avec la commande pager : Vous pouvez l'utiliser pour crire les rsultats dans un fichier :
mysql> pager cat > /tmp/log.txt
Dans le prcdent exemple, notez l'option -S. Vous la trouverez pratique pour naviguer dans des rsultats trs larges. Parfois, un rsultat trs large est difficile lire l'cran. L'option -S de less rend le rsultat plus lisible, car vous pouvez aussi scroller horizontalement, avec les flches de droite et de gauche. Vous pouvez aussi utiliser interactivement -S dans less pour activer ou dsactiver la navigation horizontale. Pour plus d'informations, voyez le manuel de less :
shell> man less
Dans cet exemple, la commande va envoyer les rsultats de la commande dans deux fichiers diffrents, dans deux dossiers diffrents, placs sur deux devis /dr1 et /dr2, mais affichera toujours le rsultat l'cran via less. Vous pouvez aussi combiner les deux fonctions ci-dessus : activer le tee, spcifier le pager less et vous serez capable de naviguer dans les rsultats avec le less Unix, tout en enregistrant tous les rsultats dans un fichier. La diffrence entre le tee d'Unix utilis avec le pager et le tee intgr du client mysql, est que le tee intgr fonctionne mme 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 dsactiver, lorsque vous souhaitez enregistrer un rsultat dans un fichier, mais que vous voulez dsactiver cette fonctionnalit d'autres moments. Depuis MySQL version 4.0.2, il est possible de modifier l'invite de commande de mysql. La chane de dfinition de l'invite de commande accepte les squences suivantes : Option \v \d \h \p \u \U \\ \n \t \ \_ \R \r \m \y \Y Description version de mysqld database en cours hte MySQL port de connexion nom d'utilisateur Identifiant complet username@host \ nouvelle ligne tabulation espace espace heure 24h (0-23) heure 12h (1-12) minutes anne sur deux chiffres anne sur quatre chiffres
440
\D \s \w \P \o \O \c
format de date complet secondes jour de la semaine en trois lettres (Mon, Tue, ...) am/pm mois au format numrique mois en trois lettres (Jan, Feb, ...) compteur du nombre de commande
\ suivi de n'importe quelle lettre reprsente la lettre littralement. Si vous spcifiez une commande prompt sans argument, mysql utilisera l'invite de commande par dfaut de mysql>. Vous pouvez modifier l'invite de commande comme ceci : Variable d'environnement Vous pouvez utiliser la variable d'environnement MYSQL_PS1, en lui donnant la chane d'invite. Par exemple :
shell> export MYSQL_PS1="(\u@\h) [\d]> "
Utiliser le fichier d'options Vous pouvez configurer l'invite de commandes prompt dans le fichier d'options MySQL, comme / etc/my.cnf ou .my.cnf, dans le groupe mysql. Par exemple :
[mysql] prompt=(\\u@\\h) [\\d]>\\_
Dans cet exemple, notez que les anti-slash sont doubls. Si vous configurez l'invite de commande prompt dans un fichier d'options, il est recommand de doubler les anti-slash, lorsque vous utilisez des options. Il y a des recoupements entre les squences protges et les options. Ces squences sont listes dans Section 4.3.2, Fichier d'options my.cnf . Ce recoupement peut vous causer des problmes avec des anti-slashs uniques. Par exemple, \s sera interprt comme un espace, plutt que comme le nombre de secondes. La valeur suivante montre comment dfinir une invite avec l'heure au format HH:MM:SS> :
[mysql] prompt="\\r:\\m:\\s> "
Utilisez une option de ligne de commande Vous pouvez utiliser l'option --prompt dans la commande mysql. Par exemple :
shell> mysql --prompt="(\u@\h) [\d]> " (user@host) [database]>
Interactivement 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>
441
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, crez un fichier texte fichier_texte qui contient les commandes SQL que vous souhaitez excuter. Puis, excutez ce fichier avec mysql comme ceci :
shell> mysql database < fichier_texte
Vous pouvez aussi dmarrer votre fichier texte avec la commande USE nom_base. Dans ce cas, il n'est pas ncessaire de spcifier le nom de la base de donnes dans la ligne de commande :
shell> mysql < fichier_texte
Si vous avez dj dmarr le client mysql, vous pouvez excuter un script SQL en utilisant la commande source :
mysql> source nom_fichier;
Pour plus d'informations sur le mode batch, consultez Section 3.5, Utilisation de mysql en mode batch .
442
Lorsque vous utilisez l'option --safe-updates, mysql met l'alerte suivante lorsqu'il se connecte MySQL :
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=1000, SQL_MAX_JOIN_SIZE=1000000;
See Section 13.5.2.8, Syntaxe de SET . La commande SET a l'effet suivant : Vous n'tes pas autoriss excuter de commandes UPDATE et DELETE moins que vous ne spcifiez une contrainte de cl dans la clause WHERE o que vous fournissiez une clause LIMIT, ou les deux. Par exemple :
UPDATE tbl_name SET not_key_column=# WHERE key_column=#; UPDATE tbl_name SET not_key_column=# LIMIT 1;
Tous les rsultats importants de SELECT sont automatiquement limits 1000, moins que la commande n'inclut la clause LIMIT. Les commandes SELECT multi-tables qui devront tudier plus d'un million de lignes sont annules. Pour spcifier des limites autres que 1000 et 1000000, vous pouvez remplacer les maxima avec -select_limit et --max_join_size :
shell> mysql --safe-updates --select_limit=500 --max_join_size=10000
La variable utilisateur @a a t perdue, et lors de la reconnexion, elle est indfinie. S'il est important que mysql gnre une erreur lors de la perte de connexion, vous pouvez lancez le client mysql avec l'option --skip-reconnect.
443
Le mysqladmin actuel supporte les commandes suivantes : create databasename Cre une nouvelle base. drop databasename Efface une base et toutes ces tables. extended-status Affiche un message de statut du serveur trs complet. flush-hosts Vide tous les htes mis en cache. flush-logs Vide de la mmoire tous les logs. flush-privileges Recharger les tables de droits (identique la commande reload). flush-status Remet zro les variables de statut. flush-tables Vide de la mmoire toutes les tables. flush-threads Vide les threads de cache. Nouveau en MySQL 3.23.16. kill id,id,... Termine un thread MySQL. password new-password Spcifie un nouveau mot de passe. Modifie l'ancien mot de passe en new-password pour le compte que vous utilisez lors de la connexion avec mysqladmin. ping Vrifie si mysqld fonctionne ou pas. processlist Affiche la liste des processus du serveur. Cela revient la commande SHOW PROCESSLIST. Si -verbose est utilis, le rsultat est le mme que SHOW FULL PROCESSLIST. reload Recharge les tables de droits. refresh
444
Vide de la mmoire toutes les tables, puis ferme et rouvre les fichiers de logs. shutdown Eteind le serveur. slave-start Dmarre l'esclave de rplication. status Affiche le message de statut court du serveur. slave-stop Eteind l'esclave de rplication. variables Affiche les variable disponibles. version Affiche la version du serveur. Toutes les commandes peuvent tre rduites leur prfixe simple. Par exemple :
shell> mysqladmin proc stat +----+-------+-----------+----+-------------+------+-------+------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------+-----------+----+-------------+------+-------+------+ | 6 | monty | localhost | | Processlist | 0 | | | +----+-------+-----------+----+-------------+------+-------+------+ 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 : Uptime Nombre de secondes de vie du serveur MySQL. Threads Nombre de threads actifs (clients). Questions Nombre de questions reu des clients depuis le dmarrage de mysqld. Slow queries Nombre de requtes qui ont pris plus de long_query_time secondes. See Section 5.9.5, Le log des requtes lentes . Opens Combien de tables sont ouvertes par mysqld. Flush tables Nombre de commandes flush ..., refresh et reload.
445
Open tables Nombre de tables qui sont ouvertes actuellement. Memory in use Mmoire alloue directement par mysqld (uniquement disponible si MySQL a t compil avec l'option --with-debug=full). Maximum memory used Maximum de mmoire alloue directement par mysqld (uniquement disponible si MySQL a t compil avec l'option --with-debug=full). Si vous excutez mysqladmin shutdown en vous connectant un serveur local, avec un fichier de socket Unix, mysqladmin va attendre que le fichier de processus du serveur soit supprim, pour s'assurer que le serveur est bien arrt. mysqladmin supporte les options suivantes : --help, -? Affiche le message d'aide et quitte. --character-sets-dir=path Le dossier o les jeux de caractres sont stocks. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --compress, -C Compresse toutes les informations entre le client et le serveur, si les deux le supporte. --count=#, -c # Le nombre d'itration faier. Cela fonctionne uniquement avec --sleep (-i). --debug[=debug_options], -# [debug_options] crit un log de dbogage. La chane debug_options est souvent 'd:t:o,file_name'. La valeur par dfaut est 'd:t:o,/tmp/mysqladmin.trace'. --force, -f Ne demande pas de confirmation pour la commande drop database. Avec des commandes multiples, continue mme si une erreur survient. --host=host_name, -h host_name Connexion au serveur MYSQL avec le nom d'hte donn. --password[=password], -p[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. --port=port_num, -P port_num Le numro de port TCP/IP pour la connexion. --protocol={TCP | SOCKET | PIPE | MEMORY} Spcifie le protocole de connexion utiliser. Nouveau en MySQL 4.1.
446
--relative, -r Affiche la diffrence entre la valeur courante et la valeur prcdente, lorsqu'utilis avec l'option -i. Actuellement, cette option fonctionne avec la commande extended-status. --silent, -s Mode trs silencieux. --sleep=delay, -i delay Excute les commandes encore et encore, avec delay secondes entre deux. --socket=path, -S path Le fichier de socket utiliser pour la connexion. --user=user_name, -u user_name Nom d'utilisateur pour la connexion, si ce n'est pas l'utilisateur Unix courant. --verbose, -v Affichage plus dtaill (-v -v -v indique le format d'affichage de table). --version, -V Affiche la version et quitte. --vertical, -E Print output vertically. This is similar to --relative, but prints output vertically. --wait[=#], -w[#] Si la connexion n'a pu tre tablie, attent et ressaie au lieu d'abandonner. Si une valeur est spcifie, elle indique le nombre de tentatives. La valeur par dfaut est 1 fois. Vous pouvez aussi configurer ces options avec la syntaxe --var_name=value : connect_timeout Le nombre de secondes avant une xpiration de connexion. (Par dfaut, 0.) shutdown_timeout Le nombre de seconde d'attente de l'extinction. (Par dfaut, 0.) Il est aussi possible de configurer les variables en utilisant --set-variable=var_name=value ou la syntaxe -O var_name=value. Cependant, cette syntaxe est obsolte depuis MySQL 4.0.
Par exemple, pour afficher le contenu du fichier de log binaire binlog.000003, utilisez cette commande :
shell> mysqlbinlog binlog.0000003
447
Le rsultat est toutes les requtes contenues dans le fichier de log binaire binlog.000003, avec diffrentes informations (dure de la requte, identifiant du thread qui l'a mise, timestamp d'mission, etc.). Normalement, vous utilisez mysqlbinlog pour lire les fichiers de log directement, et les envoyer au serveur MySQL local. Il est aussi possible de lire le fichier binaire sur un serveur distant en utilisant l'option --read-from-remote-server. Cependant, c'est une technique abandonne, car nous prfrons rendre plus simple l'utilisation des logs binaires sur un serveur MySQL local. Lorsque vous lisez des logs binaires distants, les options de connexion peuvent tre donnes pour indiquer comment se connecter au serveur, mais ils sont ignors moins que vous ne spcifiez aussi l'option --read-from-remote-server. Ces options sont --host, --password, --port, -protocol, --socket et --user. Vous pouvez aussi utiliser mysqlbinlog pour relayer des fichiers de log crits par un serveur esclave, dans une architecture de rplication. Les logs de relais sont au mme format que le log binaire. Le log binaire est prsent en dtails dans la section Section 5.9.4, Le log binaire . mysqlbinlog supporte les options suivantes : --help, -? Affiche cette aide et quitte. --database=db_name, -d db_name Limite les lignes cette base de donnes (log local uniquement). --force-read, -f Continue mme si vous obtenez une erreur SQL. --host=host_name, -h host_name Lit le log binaire depuis le serveur MySQL distant. --local-load=path, -l path Prpare les fichiers temporaires destins aux commandes LOAD DATA INFILE dans le dossier spcifi. --offset=N, -o N Ignore les N premire lignes. --password[=password], -p[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. --port=port_num, -P port_num Le numro de port TCP/IP pour la connexion. --position=N, -j N Comment la lecture dans le log binaire la position N. --protocol={TCP | SOCKET | PIPE | MEMORY} Spcifie le protocole de connexion utiliser. Nouveau en MySQL version 4.1.
448
--read-from-remote-server, -R Read the binary log from a MySQL server. Les options de connexion distantes seront ignores moins que cette option ne soit donn. Ces options sont --host, --password, --port, -protocol, --socket et --user. --result-file=name, -r name Export direct vers le fichier spcifi. --short-form, -s Affiche uniquement les commandes du log, sans les informations supplmentaires. --socket=path, -S path Le fichier de socket utiliser pour la connexion. --user=user_name, -u user_name Le nom d'utilisateur MySQL lors de la connexion distance. --version, -V Affiche la version et quitte. Vous pouvez aussi configurer les variables suivantes avec l'option --var_name=value : open_files_limit Spcifie le nombre de pointeurs de fichiers rserver. Vous pouvez envoyer le rsultat de mysqlbinlog vers un client mysql avec un pipe : c'est une technique pour restaurer le serveur aprs un crash (see Section 5.7.1, Sauvegardes de base de donnes ) :
shell> mysqlbinlog hostname-bin.000001 | mysql
ou :
shell> mysqlbinlog hostname-bin.[0-9]* | mysql
Vous pouvez aussi rediriger le rsultat de mysqlbinlog dans un fichier texte, modifier ce fichier (supprimer les requtes qui vous gnent), puis excuter ces requtes, depuis le fichier, avec mysql. Aprs edition du fichier, excutez les commandes qu'il contient comme d'habitude, avec le programme mysql. mysqlbinlog dispose de l'option --position qui affiche les requtes du log binaire partir de la position spcifie. Si vous avez plus d'un fichier de log binaire excuter sur le serveur MySQL, la mthode sre est de tout faire avec la mme connexion MySQL. Voici la mthode dangeureuse :
shell> mysqlbinlog hostname-bin.000001 | mysql # DANGER!! shell> mysqlbinlog hostname-bin.000002 | mysql # DANGER!!
Cela va causer des problmes si le premier log contient des commandes de type CREATE TEMPORARY TABLE et que le second contient des requtes d'utilisation de cette table : lorsque le premier mysql termine son excution, il va dtruire la table, et le second va rencontrer des erreurs ``unknown table''. Pour viter cela, utilisez une seule connexion, surtout si vous utilisez des tables temporaires. Voici deux mthodes possibles :
shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql
449
La seconde mthode :
shell> mysqlbinlog hostname-bin.000001 > /tmp/statements.sql shell> mysqlbinlog hostname-bin.000002 >> /tmp/statements.sql shell> mysql -e "source /tmp/statements.sql"
Depuis MySQL 4.0.14, mysqlbinlog peut prparer des requtes valides pour mysql, afin d'il utilise la commande LOAD DATA INFILE depuis le log binaire. COmme le log contient les donnes charger (c'est vrai depuis MySQL 4.0; MySQL 3.23 n'inscrivait pas les donnes charger dans le log binaire, et le fichier original tait ncessaire pour xcuter le contenu du log binaire), mysqlbinlog va copier ces donnes dans un fichie temporaire et mettre une commande LOAD DATA INFILE pour que mysql le charge. Le dossier du fichier temporaire est le dossier temporaire par dfaut : il peut tre modifi avec l'option local-load de mysqlbinlog. Comme mysqlbinlog convertit les commandes LOAD DATA INFILE en commandes LOAD DATA LOCAL INFILE (c'est dire qu'il ajouteLOCAL), le client et le serveur que vous utilisez pour traiter les commandes doivent tre configur pour autoriser l'option LOCAL. See Section 5.4.4, Problmes de scurit avec LOAD DATA LOCAL . ATTENTION : lorsque vous excutez mysqlbinlog sur un fichier binaire, il va crer un fichier temporaire pour chaque commande LOAD DATA INFILE. Ces fichiers ne seront pas automatiquement effacs, car vous en aurez besoin lorsque vous excuterez les commandes SQL gnres. Il faudra les effacer manuellement lorsque vous n'en aurez plus besoin. Les fichiers portent le nom de temporary-dir/original_file_name-#-#. Dans le futur, nous allons corriger ce problme, en permettant mysqlbinlog de se connecter directement au serveur mysqld. Dans ce cas, nous pourrons supprimer tranquillement les fichiers de log, lorsqu'ils auront t utiliss. Avant MySQL 4.1, mysqlbinlog ne pouvait pas prparer de log SQL pour mysql lorsque le log binaire contenait des requtes de diffrents threads, utilisant des tables temporaires de mme nom, si les requtes taient mlanges. Ceci est corrig en MySQL 4.1.
mysqlcc supports the following options: --help, -? Affiche cette aide. --blocking_queries, -b Utilise les requtes bloquantes. --compress, -C
450
Utilise la compression avec le protocole client/serveur. --connection_name=name, -c name Synonyme de --server. --database=db_name, -d db_name Base de donnes utiliser. C'est gnralement utile dans un fichier d'options. --history_size=#, -H # Taille de l'historique de la fentre de requte. --host=host_name, -h host_name Hte de connexion. --local-infile[={0|1}] Active ou dsactive les fonctionnalits LOCAL de LOAD DATA INFILE. Sans valeur, cette option active LOCAL. LOCAL peut tre spcifi sous la forme --local-infile=0 ou --localinfile=1 pour tre dsactive ou active. Activer LOCAL n'a pas d'effet si le serveur ne le supporte pas. --password[=password], -p[password] Le mot de passe lors de la connexion au serveur. Si le mot de passe n'est pas donn en ligne de commande, il vous sera demand. Notez que si vous utilisez la forme courte -p, vous ne devez pas mettre d'espace entre l'option et le mot de passe. --plugins_path=name, -g name Chemin du dossier de module de MySQL Control Center. --port=port_num, -P port_num Numro de port TCP/IP pour la connexion. --query, -q Ouvre une fentre de requte au dmarrage. --register, -r Ouvre la fentre de dialogue 'Register Server'. --server=name, -s name Nom de la connexion de MySQL Control Center. --socket=path, -S path Fichier de socket utiliser pour la connexion. -y, --syntax Active la coloration syntaxique et la compltion. --syntax_file=name, -Y name Fichier de syntaxe pour la compltion.
451
--translations_path=name, -T name Chemin jusqu'au dossier de traductions de MySQL Control Center. --user=user_name, -u user_name Nom d'utilisateur. --version, -V Affiche la version. Vous pouvez spcifier les variables suivantes avec l'option -O ou --set-variable. connect_timeout Nombre de seconde avant que la connexion expire. (Valeur par dfaut 0) max_allowed_packet Taille maximale des paquets changer avec le serveur (Valeur par dfaut 16777216) max_join_size Limite automatique du nombre de lignes dans une jointure avec l'option --safe-updates (Valeur par dfaut 1000000) net_buffer_length Buffer de communication TCP/IP (Valeur par dfaut 16384) select_limit Limite automatique pour les commandes SELECT avec l'option --safe-updates (Valeur par dfaut 1000) Notez que les syntaxes --set-variable=name=value et -O name=value sont obsoltes depuis MySQL 4.0. Utilisez --name=value.
Il peut aussi tre utilis comme mysqldump lorsqu'il faut choisir les bases et tables traiter. mysqlcheck dispose d'une fonctionnalit spciale, compar aux autres clients : le comportement par dfaut, c'est dire la vrification des tables, peut tre modifie en renommant le fichier binaire. Si vous voulez avoir un fichier qui rparer les tables par dfaut, il suffit de copier mysqlcheck sur
452
votre disque, et de l'appeler mysqlrepair, ou bien, de faire un lien symbolique sur l'excutable et de l'appeler mysqlrepair. Si vous appelez mysqlrepair, il va rparer les tables par dfaut. Les noms que vous pouvez utiliser pour que mysqlcheck rparer automatiquement les tables sont : mysqlrepair mysqlanalyze mysqloptimize L'option par dfaut est --repair L'option par dfaut est --analyze L'option par dfaut est --optimize
Les options disponibles pour mysqlcheck sont listes ici. Vrifiez que votre version les supporte avec la commande mysqlcheck --help. -?, --help Affiche ce message d'aide, et termine. --all-databases, -A Vrifie toutes les bases. C'est la mme chose que --databases dans toutes les bases slectionnes. --all-in-1, -1 Au lieu de faire une requte par table, excute toutes les requtes dans une requte, sparment pour chaque base. Les noms de tables seront spars par une virgule. --analyze, -a Analyse les tables indiques. --auto-repair Si une table vrifies est corrompue, la corrige automatiquement. La rparation sera faite aprs la vrification de toutes les tables, si des tables corrompues ont t dcouvertes. --character-sets-dir=... Dossier contenant le jeu de caractres. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --check, -c Vrifie les tables en erreur --check-only-changed, -C Vrifie uniquement les tables qui ont t modifies depuis la dernire modification, ou qui n'ont pas t correctement fermes. --compress Utiliser la compression du protocole client/serveur. --databases, -B Pour tester plusieurs bases de donnes. Notez que la diffrence d'utilisation : dans ce cas, aucune table n'est prcis. Tous les arguments de noms sont considrs comme des noms de base. --debug[=debug_options], -# [debug_options] Affiche le log de dbogage. Souvent, la chane debug_options vaut 'd:t:o,nom_de_fichier'. 453
--default-character-set=... Spcifie le jeu de caractres par dfaut. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --extended, -e Si vous utilisez cette option avec CHECK TABLE, elle va s'assurer que la table est totalement cohrente, mais prendre un trs long temps. Si vous utilisez cette option avec REPAIR TABLE, elle va raliser une rparation exhaustive de la table, qui peut non seulement prendre un temps trs long, mais produire de nombreuses lignes errones. --fast, -F Ne vrifie que les tables qui n'ont pas t correctement fermes. --force, -f Continue mme si on rencontre une erreur SQL. --host=host_name, -h host_name Connexion l'hte. --medium-check, -m Plus rapide que la vrification complte, mais ne trouvera que 99.99 % de toutes les erreurs. Cela devrait tre la bonne option pour la plupart des situations. --optimize, -o Optimise la table. --password[=password], -p[password] Le mot de passe utiliser lors de la connexion au serveur. Si aucun mot de passe n'est fourni, il sera demand en ligne de commande. Il ne faut pas laisser d'espace entre l'option -p et le mot de passe. --port=port_num, -P port_num Le numro de port de la connexion. --protocol={TCP | SOCKET | PIPE | MEMORY} Pour spcifier le protocole utiliser pour la connexion. Nouveau en MySQL 4.1. --quick, -q Si vous utilisez cette option avec CHECK TABLE, elle va viter que l'analyse ne traite toutes les lignes pour vrifier les mauvais liens. C'est la mthode d'analyse la plus rapide. Si vous utilisez cette option avec REPAIR TABLE, elle va essayer de ne rparer que le fichier d'index. C'est la mthode la plus rapide pour la rparation. --repair, -r Peut corriger presque tout, sauf les problmes de doublons pour les cls uniques. --silent, -s Affiche moins de messages d'erreurs.
454
--socket=path, -S path Nom du fichier de socket utiliser pour la connexion. --tables Remplace l'option --databases ou -B. Tous les arguments suivants sont considrs comme des noms de tables. --user=user_name, -u user_name Nom d'utilisateur pour la connexion, si ce n'est pas l'utilisateur courant. --verbose, -v Afficher des informations sur les diffrentes tapes. --version, -V Affiche les informations de version, et termine.
Si vous ne spcifiez pas de table, ou si vous utilisez l'option --databases ou --all-databases, la base de donnes complte sera exporte. Vous pouvez obtenir une liste des options valides pour votre version de mysqldump avec la commande mysqldump --help. Notez que si vous excutez mysqldump sans l'option --quick ou --opt, mysqldump va charger la totalit du rsultat en mmoire, avant de l'crire. Cette option peut rsoudre des problmes de mmoire 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. Les valeurs numriques hors des plages de validit comme -inf et inf, ainsi que NaN (not-anumber, pas un nombre) sont exportes par mysqldump comme NULL. Vous pouvez le voir dans la table suivante :
mysql> CREATE mysql> INSERT mysql> INSERT mysql> SELECT +------+ | f | +------+ | inf | TABLE t (f DOUBLE); INTO t VALUES(1e+111111111111111111111); INTO t VALUES(-1e111111111111111111111); f FROM t;
455
| -inf | +------+
La signification de ce comportement est que si vous voulez exporter puis restaurer une table, le nouveau contenu sera peut tre diffrent de l'original. Notez que depuis MySQL 4.1.2 vous ne pouvez pas insrer la valeur inf dans la table, et ce comportement de mysqldump ne sera pertinent qu'avec les anciens serveurs. mysqldump supporte les options suivantes : --help, -? Affiche le message d'aide et quitte. --add-drop-table Ajoute une commande drop table avant chaque requte de cration de table. --add-locks Ajoute une commande LOCK TABLES avant l'export de table et une commande UNLOCK TABLE aprs(Pour acclrer les insertions dans MySQL). See Section 7.2.14, Vitesse des requtes INSERT . --all-databases, -A Exporte toutes les tables. C'est l'quivalent de l'option --databases avec toutes les bases de donnes slectionnes. --allow-keywords Permet la cration de colonnes ayant des noms de mots rservs. Cela fonctionne en prfixant chaque nom de colonne avec le nom de la table. --comments[={0|1}] Si cette option prend 0, elle supprime les informations additionnelles (comme les versions de programme, les versions d'hte) dans les exports. L'option --skip-comments fait la mme chose. Par dfaut, la valeur de cette option est 1, pour conserver ces informations. Nouveau en MySQL 4.0.17. --compatible=name Produit un rsultat qui est compatible avec les autres bases de donnes, ou avec d'anciennes versions de MySQL. Les valeurs possibles de name sont mysql323, mysql40, postgresql, oracle, mssql, db2, sapdb, no_key_options, no_table_options, ou no_field_options. Pour utiliser plusieurs valeurs, sparez les par des virgules. Ces valeurs ont la mme signification que les options correspondantes de configuration du mode SQL. See Section 5.2.2, Le mode SQL du serveur . Cette option requiert la version 4.1.0 ou plus rcente. Avec les anciens serveurs, cela ne fait rien. --complete-insert, -c Utilise des commandes INSERT compltes, avec les noms de colonnes.
456
-C, --compress Compresse toutes les informations entre le client et le serveur, les deux supporte la compression. --create-options Inclut toutes les options spcifiques MySQL de cration de table dans les commandes CREATE TABLE. Avant MySQL 4.1.2, utilisez --all. --databases, -B Pour exporter plusieurs bases de donnes. Notez la diffrence d'utilisation. Dans ce cas, aucune table n'est spcifi. Tous les arguments de noms sont considrs comme des noms de base. Une ligne USE db_name; sera ajoute dans l'export avant chaque base de donnes. --debug[=debug_options], -# [debug_options] Active l'historique de dbogage. La chane de format est gnralement 'd:t:o,file_name'. --default-character-set=charset Configure le jeu de caractres par dfaut pour l'export. S'il n'est pas spcifi, mysqldump 10.3 (MySQL-4.1.2) ou plus rcent va utiliser utf8. Les versions plus anciennes utiliseront latin1. --delayed Les insertions se font avec la commande INSERT DELAYED. --delete-master-logs Sur un matre de rplication, efface le log binaire une fois que l'opration d'export est faite. Cette option active automatiquement --first-slave. Elle a t ajoute en MySQL 3.23.57 (pour MySQL 3.23) et MySQL 4.0.13 (pour MySQL 4.0). --disable-keys, -K Pour chaque table, entoure les commandes d'INSERT avec les commandes /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; et /*!40000 ALTER TABLE tbl_name ENABLE KEYS */;. Cela acclre les chargements du fichier d'export pour MySQL 4.0 car les index ne sont crs qu'aprs l'insertion. Cette option n'est effective que pour les tables MyISAM. --extended-insert, -e Utilise la nouvelle syntaxe multi-ligne INSERT. (Cela donne des insertions plus courtes et plus efficaces). --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionallyenclosed-by=..., --fields-escaped-by=..., --lines-terminated-by=... Ces options sont utilises avec l'option -T et ont la mme signification que les clauses correspondantes de la commande LOAD DATA INFILE. See Section 13.1.5, Syntaxe de LOAD DATA INFILE . --first-slave, -x Verrouille toutes les tables de toutes les bases de donnes. --flush-logs, -F Ecrit tout le fichier de log du serveur avant de commencer l'export. Notez que si vous utilisez cette option avec --all-databases (ou l'option -A), les logs seront vids pour chaque base de donnes exporte.
457
-f, --force, Continue mme si une erreur SQL survient durant l'export. --host=host_name, -h host_name Exporte les donnes depuis le serveur MySQL vers l'hte indiqu. L'hte par dfaut est localhost. --lock-tables, -l Verrouille toutes les tables avant de commencer l'export. Les tables sont verrouilles avec READ LOCAL pour permettre des insertions concurrentes sur les tables MyISAM. Notez que lorsque vous exportes des tables de bases diffrentes, l'option --lock-tables va verrouiller chaque base sparment. Cette option ne vous garantira pas que vos tables seront logiquement cohrente entre les bases. Des tables de diffrentes bases pourraient tre exportes dans des tats trs diffrents. --master-data Cette option est similaire --first-slave, mais produit aussi une commande CHANGE MASTER TO qui fait que le serveur esclave va commencer la bonne position dans le log du matre, si vous utilisez cette exportation pour configurer initialement l'esclave. --no-create-db, -n CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name; ne sera pas ajout dans l'export. Sinon, la ligne ci-dessus sera ajoute, si l'une des options --databases ou --all-databases ont t active. --no-create-info, -t N'crit pas les informations de cration de table (la requte CREATE TABLE). --no-data, -d N'crit aucune ligne d'informations sur la table. C'est trs pratique si vous voulez simplement exporter la structure de la table. --opt Identique --quick --add-drop-table --add-locks --extended-insert --locktables. Vous obtiendrez l'export le plus rapide importer dans un serveur MySQL. --password[=password], -p[password] Le mot de passe utiliser lors de la connexion au serveur. Notez que si vous utilisez l'option courte -p, vous ne devez pas laisser d'espace entre l'option et le mot de passe. Si vous spcifiez en omettant la partie =your_pass, mysqldump vous demandera le mot de passe en ligne de commande. --port=port_num, -P port_num Le port TCP/IP utiliser avec l'hte. --protocol={TCP | SOCKET | PIPE | MEMORY} Pour spcifier le protocole de connexion utiliser. Nouveau en MySQL 4.1. --quick, -q Ne garde pas en buffer les requtes, mais crit immdiatement dans la sortie. Utilise mysql_use_result() pour cela.
458
--quote-names, -Q Protge les noms des tables et colonnes avec le caractre `. --result-file=file, -r file Ecrit directement 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 donnes vers le serveur. C'est gnralement 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 exportes dans un tat cohrent, c'est dire que les tables MyISAM ou HEAP qui seront exportes avec cette option, pourront changer d'tat. L'option --single-transaction a t ajoute en version 4.0.2. Cette option est mutuellement exclusive avec l'option --lock-tables car LOCK TABLES va valider une transaction interne prcdente. --socket=path, -S path Le fichier de socket utiliser pour les connexions locale ( localhost), qui est l'hte par dfaut. --skip-comments Identique que --comments = 0. --tab=path, -T path Cre un fichier table_name.sql, qui contient les commandes SQL CREATE, et un fichier table_name.txt, qui contient les donnes, pour chaque table. Le format du fichier .txt est celui qui est spcifi par les options --fields-xxx et --lines--xxx. Note : cette option ne fonctionne qui si mysqldump est excut sur la mme machine que le dmon 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 crer et crire un fichier dans le dossier que vous spcifiez. --tables Remplace l'option --databases ou -B. Tous les arguments suivant les options sont considrs comme des noms de tables. --user=user_name, -u user_name Le nom d'utilisateur MySQL lors de la connexion un serveur distant. --verbose, -v Mode dtaill. Affiche plus d'informations sur les faits et gestes du programme. --version, -V Affiche la version du programme et quitte. --where='where-condition', -w 'where-condition' Exporte uniquement les lignes slectionnes. Notez que les guillemets sont obligatoires. Exemples :
459
-X, --xml Exporte la base au format XML. Vous pouvez aussi configurer les variables systmes suivantes avec la syntaxe --var_name=value : max_allowed_packet La taille maximale du buffer pour les communications client / serveur. La valeur de cette variable peut tre au maximum de 16 Mo avant MySQL 4.0, et jusqu' 1 Go depuis MySQL 4.0. Lors de la cration de commandes d'insertions multiples (avec l'option --extended-insert ou --opt), mysqldump va crer des lignes ayant une taille maximale de max_allowed_packet octets. Si vous augmentez la valeur de cette variable, assurez vous que max_allowed_packet est assez grande dans le serveur. net_buffer_length La taille initiale du buffer de communication. Il est aussi possible de configurer les variables en utilisant --set-variable=var_name=value ou O var_name=value. Mais cette syntaxe est obsolte depuis MySQL 4.0. L'usage normal de mysqldump est probablement de faire des sauvegardes de bases.
mysqldump --opt database > backup-file.sql
ou
mysql -e "source /patch-to-backup/backup-file.sql" database
Cependant, il est trs pratique pour remplir un autre serveur MySQL avec des informations depuis une base :
mysqldump --opt database | mysql ---host=remote-host -C database
Pour plus d'informations sur les sauvegardes, voyez Section 5.7.1, Sauvegardes de base de donnes .
460
mysqlhotcopy supporte les options suivantes : -?, --help Affiche un cran d'aide et quitte. --allowold Ne pas annuler si la sauvegarde existe dj (renomme la simplement en _old) --checkpoint=db_name.tbl_name Insre un point de contrle dans la table spcifie (base.table) --debug Active le dbogage. --dryrun, -n Rapporte les actions ralises sans les faire. --flushlog Vide les logs sur le disque une fois que toutes les tables sont verrouilles. --keepold Ne pas effacer une sauvegarde prcdente (celle qui a t renomme) lorsque c'est termin. --method=# Mthode de copie (cp ou scp). --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.. -p, --password=# Mot de passe utilis pour la connexion au serveur. --port=port_num, -P port_num Port utilis pour la connexion au serveur. --quiet, -q Mode silencieux. N'affiche que les erreurs. --regexp=expr Copie toutes les bases dont le nom vrifie un masque d'expression rgulire. --socket=path, -S path Socket utilise pour la connexion au serveur. --suffix=str
461
Suffixe des noms des bases copies. --tmpdir=path Dossier temporaire (au lieu de /tmp). --user=user_name, -u user_name Nom d'utilisateur pour la connexion au serveur. 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'excuter 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).
shell> perldoc mysqlhotcopy
Pour chaque fichier texte indiqu dans la ligne de commande, mysqlimport supprime toute extension du nom du fichier, et utilise le rsultat pour dterminer le nom de la table qui va recevoir le contenu du fichier. Par exemple, pour des fichiers appels patient.txt, patient.text et patient seront tous imports dans la table patient. mysqlimport supporte les options suivantes : --help, -? Affiche le message d'aide et quitte. --columns=column_list, -c column_list Cette option prend une liste de noms de colonnes, spars par des virgules. Ce champs est utilis pour crer une commande LOAD DATA INFILE correcte, qui sera alors passe MySQL. --compress, -C Compresse toutes les informations entre le client et le serveur, si c'est possible. --debug[=debug_options], -# [debug_options] Active le dbogage. la valeur de debug_options est souvent : 'd:t:o,file_name'. --delete, -D Vide la table avant d'importer le fichier texte. --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionallyenclosed-by=..., --fields-escaped-by=..., --lines-terminated-by=...
462
Ces options ont la mme signification que les clauses correspondantes de LOAD DATA INFILE. See Section 13.1.5, Syntaxe de LOAD DATA INFILE . --force, -f 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 ds qu'une erreur survient. --host=host_name, -h host_name Importe les donnes sur le serveur MySQL, avec l'hte spcifi. La valeur par dfaut est localhost. --ignore, -i Voir la description de --replace. --ignore-lines=n Ignore les n premires lignes du fichier de donnes. --local, -L Lit le fichier d'entre dans le client. Par dfaut, les fichiers textes sont supposs tre lus par le serveur, si vous vous connectez localhost (qui l'hte par dfaut). --lock-tables, -l Verrouille toutes les tables en criture avant de ne traiter les fichiers textes. Cela assure que toutes les tables sont synchronise sur le serveur. --password[=password], -p[password] Le mot de passe utiliser lors de la connexion au serveur. Notez que si vous utilisez l'option courte (-p), vous ne pouvez pas laisser d'espace entre l'option est le mot de passe. Si vous ne spcifiez pas le mot de passe avec l'option, mysqlimport va vous demander le mot de passe en ligne. --port=port_num, -P port_num Le port TCP/IP utilis avec l'hte. Cela sert pour les connexions des htes qui ne sont pas localhost, pour lequel la socket Unix est utilise. --protocol={TCP | SOCKET | PIPE | MEMORY} Spcifie le protocole utiliser pour se connecter. Nouveau en MySQL version 4.1. --replace, -r Les options --replace et --ignore contrles la gestion des lignes lues envers les lignes qui existent dj sur le serveur. Si vous spcifiez l'option --replace, les nouvelles lignes remplaceront les lignes existantes. Si vous spcifiez --ignore, les lignes qui sont en double dans une table qui dispose d'une colonne de type unique. Si vous ne spcifiez pas ces options, une erreur surviendra lorsqu'une cl en double sera trouve, et la lecture du reste du fichier sera annul. --silent, -s Mode silencieux. N'affiche que les erreurs qui surviennent. --socket=path, -S path Le fichier de socket utiliser lors de la connexion localhost (qui est l'hte par dfaut).
463
--user=user_name, -u user_name Le nom de l'utilisateur MySQL utiliser lors de la connexion au serveur MySQL. La valeur par dfaut est celui de votre utilisateur Unix. --verbose, -v Mode dtaill. Affiche bien plus d'informations sur les actions du programme. --verbose, -v 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 xxx.com 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 imptest.txt 32 q $ od -c imptest.txt 0000000 1 0 0 \t M a x S y d o w \n 1 0000020 1 \t C o u n t D r a c u l a 0000040 $ mysqlimport --local test imptest.txt test.imptest: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 $ mysql -e 'SELECT * FROM imptest' test +------+---------------+ | id | n | +------+---------------+ | 100 | Max Sydow | | 101 | Count Dracula | +------+---------------+
0 \n
Si aucune base n'est indique, toutes les bases de donnes sont listes. Si aucune table n'est nomme, toutes les tables de la base sont affiches. Si aucune colonne n'est nomme, toutes les colonnees et leur type sont affichs. Notez que dans les nouvelles versions de MySQL, vous ne verrez que les bases de donnes, tables et colonnes pour lesquelles vous avez des droits. Si le dernier argument contient un caractre joker shell ou SQL (*, ?, % ou _) alors seules les entits qui valident ce masque sont affiches. Si une base contient des caractres souligns, ils doivent tre protgs avec un anti-slash (certains shell Unix en demande mme deux), afin de lister correctement les tables et les colonnes. Les * et ? sont convertis en joker SQL % and _. Cela peut
464
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 vrifient le masque. Ceci est facilement corrig en ajoutant un caractre % en plus dans la ligne de commande (comme argument spar). mysqlshow supporte les options suivantes : --help, -? Affiche cette aide et quitte. --character-sets-dir=path Le dossier o les jeux de caractres sont crs. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --compress, -C Utilise la compression avec le protocole client / serveur. --debug[=debug_options], -# [debug_options] Gnre un log de dbogage. La chane debug_options vaut souvent 'd:t:o,file_name'. Par dfaut, la valeur est 'd:t:o,/tmp/mysql.trace'. --default-character-set=charset Configure le jeu de caractres par dfaut. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . --host=host_name, -h host_name Connexion avec l'hte indiqu. --keys, -k Affiche les index de la table. --password[=password], -p[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. --port=port_num, -P port_num Le numro de port TCP/IP pour la connexion. --protocol={TCP | SOCKET | PIPE | MEMORY} Spcifie le protocole de connexion utiliser. Nouveau en MySQL version 4.1. --socket=path, -S path Le fichier de socket utiliser pour la connexion. --status, -i Affiche des informations supplmentaires sur chaque table. --user=user_name, -u user_name Nom d'utilisateur pour la connexion, si ce n'est pas l'utilisateur Unix courant.
465
--verbose, -v Affichage plus dtaill (-v -v -v indique le format d'affichage de table). --version, -V Affiche la version et quitte.
Vous pouvez dcouvrir ce que ce code d'erreur signifie soit en examinant la documentation de votre systme, 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 ...
Exemple :
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 dpendants du systme. Un message d'erreur peut avoir diffrentes explications sur diffrents systmes.
Utilisez l'option -- pour indiquer o la liste de chanes de remplacement s'arrte, et o commence la liste de fichiers. Tout fichier nomm en ligne de commande est modifi directement : il est recommand de faire des sauvegardes de fichiers originaux. Si aucun fichier n'est nomm en ligne de commande, replace lit l'entre standard, et crit dans la sortie standard. Dansa ce cas, aucune option -- n'est ncessaire. Le programme replace sert msql2mysql. See Section 24.1.1, msql2mysql, convertit des programmes mSQL vers MySQL . replace supporte les options suivantes : -?, -I Affiche le message d'aide et quitte. -# debug_options
466
crit un log de dbogage. La chane debug_options vaut souvent 'd:t:o,file_name'. -s Mode silencieux. Affiche moins d'informations sur les activits du programme. -v Mode prolifique. Affiche plus d'informations sur les activits du programme. -V Affiche la version, et quitte.
467
468
9.1.1. Chanes
Une chane est une squence de caractres, entoure de guillemets simples (') ou doubles ("). Exemples: Si le serveur SQL est en mode ANSI_QUOTES, les chanes littrales ne peuvent tre mises qu'entre guillemets simples. Une chane avec des guillemets double sera interprte comme un identifiant.
'une chane' "une autre chane"
Depuis MySQL 4.1.1, les littraux disposent d'une option de jeu de caractres et de collation avec la clause COLLATE :
[_charset_name]'string' [COLLATE collation_name]
Exemples :
SELECT _latin1'string';
469
Chanes
Pour plus d'informations sur ces formes de chane de caractres, voyez Section 10.3.7, Jeu de caractres et collation des chanes littrales . A l'intrieur d'une chane, certains squences de caractres ont une signification spciale. Chacune d'elle commence par un anti-slash (\), connu comme le caractre d'chappement. MySQL reconnat les squences suivantes : \0 \' \" \b \n \r \t \z Un 0 ASCII (NUL). Un guillemet simple ('). Un guillemet double ("). Un effacement. Une nouvelle ligne. Un retour chariot. Une tabulation. ASCII(26) (Contrle-Z). Ce caractre peut tre encod pour vous viter des problmes avec Windows, vu qu'il quivaut une fin de fichier sur cet OS. (ASCII(26) vous posera des problmes si vous utilisez mysql base < fichier.) Un anti-slash (\). Un signe pourcentage littral : %. Voir les notes ci-dessous. Un signe soulign littral : _. Voir les notes ci-dessous.
\\ \% \_
Ces squences sont sensibles la casse. Par exemple, \b est interprte comme un anti-slash, mais \B est interprt comme la lettre B. Les caractres \% et \_ sont utiliss pour rechercher des chanes littrales % et _ dans un contexte d'expressions rgulires. Sinon, ces caractres sont interprts comme des caractres joker. See Section 12.3.1, Oprateurs de comparaison pour les chanes de caractres . Notez que si vous utilisez \% ou \_ dans d'autres contextes, ces squences retourneront \% et \_ et non % et _. Il y a plusieurs faons d'intgrer un guillemet dans une chane : Un ' l'intrieur d'une chane entoure de ' peut tre not ''. Un " l'intrieur d'une chane entoure de " peut tre not "". Vous pouvez faire prcder le guillemet par caractre d'chappement (\). Un guillemet simple ' l'intrieur d'une chane guillemets doubles " n'a besoin d'aucun traitement spcial (ni doublage, ni chappement). De mme, aucun traitement spcial n'est requis pour un guillemet double " l'intrieur d'une chane guillemets simples '. Le SELECT montr ici explique comment les guillemets et les chappements fonctionnent :
mysql> SELECT 'bonjour', '"bonjour"', '""bonjour""', 'bon''jour', '\'bonjour'; +---------+-----------+-------------+----------+----------+ | bonjour | "bonjour" | ""bonjour"" | bon'jour | 'bonjour | +---------+-----------+-------------+----------+----------+ mysql> SELECT "bonjour", "'bonjour'", "''bonjour''", "bon""jour", "\"bonjour"; +---------+-----------+-------------+----------+----------+ | bonjour | 'bonjour' | ''bonjour'' | bon"jour | "bonjour | +---------+-----------+-------------+----------+----------+ mysql> SELECT "Voil\n3\nlignes"; +--------------------+ | Voil
470
Nombres
3 lignes | +--------------------+
Si vous voulez insrer des donnes binaires dans un champ chane (comme un BLOB), les caractres suivants doivent tre chapps : NUL \ ' " ASCII 0. Reprsentez le avec \0 (un anti-slash suivi du caractre ASCII 0). ASCII 92, anti-slash. A reprsenter avec \\. ASCII 39, guillemet simple. A reprsenter avec \'. ASCII 34, guillemet double. A reprsenter avec \".
Lorsque vous crivez des applications, toutes les chanes qui risquent de contenir ces caractres spciaux doivent tre protgs avant d'tre intgre dans la commande SQL. Vous pouvez faire cela de deux manires diffrentes : passez la chane une fonction qui protge les caractres spciaux. Par exemple, en langage C, vous pouvez utiliser la fonction mysql_real_escape_string(). See Section 24.2.3.47, mysql_real_escape_string() . L'interface Perl DBI fournit une mthode base sur les guillemets pour convertir les caractres spciaux en leur squence correspondante. See Section 24.4, API Perl pour MySQL . Au lieu de protger explicitement tous les caractres, de nombreuses interfaces MySQL fournissent un systme de variables qui vous permettent de mettre des marqueurs dans la requte, et de lier les variables leur valeur au moment de leur excution. Dans ce cas, l'interface se charge de protger les caractres spciaux pour vous.
9.1.2. Nombres
Les entiers sont reprsents comme une squence de chiffres. Les dcimaux utilisent . comme sparateur. Tous les types de nombres peuvent tre prcds d'un - pour indiquer une valeur ngative. Exemples d'entiers valides :
1221 0 -32
Un entier peut tre utilis dans un contexte dcimal, il sera interprt comme le nombre dcimal quivalent.
471
Valeurs boolennes
En MySQL 4.1 (et en MySQL 4.0 si vous utilisez l'option --new), le type par dfaut d'une valeur hexadcimale est chane. Si vous voulez vous assurer qu'une telle valeur est traite comme un nombre, vous pouvez utiliser CAST(... AS UNSIGNED) :
mysql> SELECT 0x41, CAST(0x41 AS UNSIGNED); -> 'A', 65
La syntaxe 0x est base sur ODBC. Les chanes hexadcimales sont souvent utilises par ODBC pour fournir des valeurs aux colonnes BLOB. La syntaxe x'hexstring' est nouvelle en 4.0 et est base sur le standard SQL. Depuis MySQL 4.0.1, vous pouvez convertir une chane ou nombre en chane au format hexadcimal avec la fonction HEX() :
mysql> SELECT HEX('cat'); -> '636174' mysql> SELECT 0x636174; -> 'cat'
472
La table suivante dcrit la taille maximale et les caractres autorises pour chaque type d'identifiant. Identifiant Base de donnes Table Colonne Index Alias Longueur maximale 64 64 64 64 255 Caractres autoriss Tous les caractres autoriss dans un nom de dossier part /, \ et .. Tous les caractres autoriss dans le nom d'un fichier part / et .. Tous. Tous. tous.
Notez qu'en plus de ce qui prcde, vous n'avez pas droit au caractres ASCII(0) ou ASCII(255) dans un identifiant. Avant MySQL 4.1, les identifiants que pouvaient pas contenir de guillemets. Depuis MySQL 4.1, les identifiants sont stocks en Unicode (UTF8). Cela s'applique aux identifiants stocks dans les tables de dfinitions du fichier .frm, et aux identifiants stocks dans les tables de droits de la base mysql. Mme si les identifiants Unicode peuvent inclure des caractres multi-octets, notez que les tailles maximales affiches dans la table sont donns en octets. Si un identifiant contient un caractre multi-octet, le nombre de caractres autoris est alors infrieur aux chiffres affichs. Un identifiant peut tre entre guillemet ou pas. Si un identifiant est un mot rserv, ou qu'il contient des caractres spciaux, vous devez le mettre entre guillemets lorsque vous l'utilisez. Pour une liste des mots rservs, voyez Section 9.6, Cas des mots rservs MySQL . Les caractres spciaux sont hors de la plage des caractres alpha-numrique et _ et $. Notez que si un identifiant est un mot rserv, ou contient des caractres spciaux, vous devez absolument le protger avec ` : Le caractre de protection des identifiants est le guillemet oblique ` :
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Si vous utilisez MySQL avec les modes MAXDB ou ANSI_QUOTES, il est aussi possible d'utiliser les guillemets doubles pour les identifiants :
mysql> CREATE TABLE "test" (col INT); ERROR 1064: You have an error in your SQL syntax. (...) mysql> SET SQL_MODE="ANSI_QUOTES"; mysql> CREATE TABLE "test" (col INT); Query OK, 0 rows affected (0.00 sec)
See Section 1.5.2, Slectionner les modes SQL . Depuis MySQL 4.1, les guillemets peuvent tre inclus dans les noms d'identifiants. Si le caractre inclus dans l'identifiant est le mme que celui qui est utilis pour protger l'identifiant, doublez-le. La commande suivante cre la table a`b, qui contient la colonne c"d :
mysql> CREATE TABLE `a``b` (`c"d` INT);
La protection d'identifiant par guillemets a t introduite en MySQL 3.23.6 pour permettre l'utilisation de mots rservs ou des caractres spciaux dans les noms de colonnes. Avant la version 3.23.6, vous ne pouviez pas utiliser les identifiants qui utilisent des guillemets, et les rgles sont plus restrictives : Un nom d'identifiant est constitu de caractres alpha-numriques issus du jeu de caractres courant, plus _ et $. Le jeu de caractres par dfaut est ISO-8859-1 (Latin1). Cela peut tre modifi avec l'option de dmarrage --default-character-set de mysqld. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . Un nom peut commencer avec n'importe quel caractre qui est valide dans un identifiant. En particulier, un nom peut commencer par un chiffre : cela est diffrent dans de nombreuses autres
473
Identifiants
bases de donnes. Cependant, un nom sans guillemets ne peut pas contenir uniquement des chiffres. Vous ne pouvez pas utiliser le caractre . dans les noms, car il est utilis pour les formats complets de rfrences aux colonnes, en utilisant les noms de tables ou de bases. (see Section 9.2.1, Identifiants ). Il est recommand de ne pas utiliser de noms comme 1e, car une expression comme 1e+1 est ambigue. Elle pourrait tre interprte comme l'expression 1e + 1 ou comme le nombre 1e+1, suivant le contexte.
9.2.1. Identifiants
MySQL autorise l'utilisation de nom qui sont constitus d'un seul identifiant, ou d'identifiants multiples. Les composants d'un tel nom doivent tre spars par le caractre point (.). Le premier composant dtermine le contexte dans lequel l'identifiant final est interprt. En MySQL, vous pouvez faire rfrence une colonne en utilisant l'une des trois formes suivantes : Rfrence de colonne col_name tbl_name.col_name Signification La colonne col_name de n'importe quelle table de la requte qui contient une colonne de ce nom. La colonne col_name de la table tbl_name de la base de donnes par dfaut.
db_name.tbl_name.col_name La colonne col_name de la table tbl_name de la base db_name. Cette syntaxe n'est pas disponible avant MySQL version 3.22. Si un composant d'un nom complexe requiert des guillemets de protection, vous devez protger chaque composant individuellement plutt que l'identifiant dans son ensemble. Par exemple, `mytable`.`my-column` est valide, mais `my-table.my-column` ne l'est pas. Vous n'tes pas oblig de spcifier le nom d'une table tbl_name ou le nom de la base db_name.tbl_name comme prfixe dans une requte, moins que la rfrence soit ambige. Supposez que les tables t1 et t2 contiennent toutes les deux une colonne c, et que vous lisez le contenu de la colonne c dans une commande SELECT qui utilise les deux tables t1 et t2. Dans ce cas, c est ambigue, car ce n'est pas un nom unique dans les diffrentes tables de la commande. Vous devez le prciser avec un nom de table, comme dans t1.c ou t2.c. Similairement, si vous lisez des colonnes dans une table t de la base db1 et dans la table t de la base db2 dans la mme commande, vous devez utiliser les noms complets de colonnes, comme db1.t.col_name et db2.t.col_name. La syntaxe .tbl_name correspond la table tbl_name de la base courante. Cette syntaxe est accepte pour la compatibilit avec ODBC, car certains programmes ODBC prfixent le nom de la table avec un caractre point ..
474
Variables utilisateur
Les noms de colonnes et d'alias sont insensibles la casse dans tous les cas. Les alias sur tables sont sensibles la casse avant MySQL 4.1.1. La requte suivante ne marchera pas car elle se rfre a et A :
mysql> SELECT nom_de_colonne FROM nom_de_table AS a -> WHERE a.nom_de_colonne = 1 OR A.nom_de_colonne = 2;
Si vous avez du mal vous souvenir de la casse des noms de bases et de tables, adoptez une convention, comme toujours crer les bases et les tables en utilisant des minuscules. La faon de stocker les noms sur le disque et leur utilisation dans les syntaxes MySQL est dfinie par la variable lower_case_table_names, qui peuvent tre spcifi au lancement de mysqld. lower_case_table_names peut prendre l'une des valeurs suivantes : Valeur 0 Signification Les noms de tables et bases sont stockes sur le disque avec la casse utilise dans la commande CREATE TABLE ou CREATE DATABASE. Les comparaisons de nom sont sensibles la casse. C'est le comportement par dfaut sous Unix. Notez que si vous forcer cette valeur 0 avec l'option --lower-case-table-names=0 sur un systme insensible la casse, et que vous accder la table avec une autre casse, alors vous pouvez avoir des corruptions d'index. Les noms de tables sont stockes en minuscules sur le disque, et les comparaisons de nom de tables sont insensibles la casse. Ce comportement s'applique aussi aux noms de bases de donnes depuis MySQL 4.0.2, et aux alias de tables depuis 4.1.1. C'est la valeur par dfaut sur les systmes Windows et Mac OS X. Les tables et bases sont stockes sur le disque avec la casse spcifie dans CREATE TABLE et CREATE DATABASE, mais MySQL les convertis en minuscules lors des recherches. Les comparaisons de noms sont insensibles la casse. Note : cela ne fonctionne que sur les systmes de fichiers qui sont insensibles la casse. Les noms de tables InnoDB sont stockes en minuscules, comme pour lower_case_table_names=1. Donne lower_case_table_names la valeur de 2 est possible depuis MySQL 4.0.18.
Si vous utilisez MySQL sur une seule plate-forme, vous n'aurez pas changer la valeur de lower_case_table_names variable. Cependant, vous pouvez rencontrer des problmes lors des transferts entre plates-formes, o les systmes de fichiers diffrent de par leur sensibilit la casse. Par exemple, sous Unix, vous pouvez avoir deux tables ma_table et MA_TABLE, alors que sous Windows, ces deux noms reprsentent la mme table. Pour viter les problmes de transferts de noms, vous avez deux choix : Utilisez l'option lower_case_table_names=1 sur tous les systmes. L'inconvnient le plus srieux est que lorsque vous utilisez SHOW TABLES ou SHOW DATABASES, vous ne verrez pas la casse originale des noms. Utilisez lower_case_table_names=0 sous Unix et lower_case_table_names=2 sous Windows. Cela prserver la casse des noms de tables ou bases. L'inconvnient est que vous devez vous assurer que les requtes utilisent toujours la bonne casse sous Windows. Si vous transfrez vos requtes vers Unix, o la casse des noms aura son importance, les requtes ne fonctionneraient plus. Notez qu'avant de passer la valeur de lower_case_table_names 1 sous Unix, vous devez commencer par convertir vos anciens noms de tables et bases en minuscules, avant de redmarrer mysqld.
Variables systme
MySQL supporte les variables utilisateur spcifiques la connexion avec la syntaxe @variablename. Un nom de variable consiste de caractres alpha-numriques, bass sur le jeu de caractres courant, de _, $, et .. Le jeu de caractres par dfaut est ISO-8859-1 Latin1. Cette valeur peut tre change en utilisant l'option --default-character-set de mysqld. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . Les variables n'ont pas besoin d'tre initialiss. Elles sont NULL par dfaut et peuvent contenir un entier, un rel ou une chane. Toutes les variables d'un thread sont automatiquement libres lorsque le thread se termine. Vous pouvez dclarer une variable avec la syntaxe de SET :
SET @variable= { expression entier | expression rel | expression chane } [,@variable= ...].
Vous pouvez aussi assigner une valeur une variable avec d'autres commande que SET. Par contre, dans ce cas l, l'oprateur d'assignation est := au lieu de =, parce que = est rserv aux comparaisons dans les requtes autres que SET :
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
Les variables utilisateur peuvent tre utiliss l o les expressions sont alloues. Notez que cela n'inclut pas pour l'instant les contextes o un nombre est explicitement requis, comme ce qui est le cas avec la clause LIMIT dans une requte SELECT, ou la clause IGNORE nombre LINES dans une requte LOAD DATA. Note : dans une requte SELECT, chaque expression est n'value que lors de l'envoi au client. Cela signifie que pour les clauses HAVING, GROUP BY, ou ORDER BY, vous ne pouvez vous rfrer une expression qui implique des variables qui sont dfinies dans la partie SELECT. Par exemple, la requte suivante ne produira pas le rsultat escompt :
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nom_de_table HAVING b=5;
La raison est que @aa ne contiendra pas la valeur de la ligne courante, mais celle de id pour la dernire ligne accepte. La rgle gnrale est de ne jamais assigner et utiliser la mme variable dans la mme commande. Un autre problme avec l'affectation de variable et son utilisation dans la mme commande est que le type de valeur par dfaut est bas sur le type de la variable dans la commande de dpart. Une variable non-assigne est suppose tre de type NULL ou de type STRING. L'exemple suivant illustre bien ce cas de figure :
mysql> SET @a="test"; mysql> SELECT @a,(@a:=20) FROM table_name;
Dans ce cas, MySQL va indiquer au client que la colonne 1 est une chane, et il convertira tous les accs la variable @a en chane, mme si @a recevra finalement un nombre dans la seconde ligne. Aprs l'excution de la commande, @a sera considr comme un nombre. Si vous avez des problmes avec cela, essayer d'viter d'affecter et d'utiliser la mme variable dans la mme commande, ou bien initialisez la variable avec les valeurs de 0, 0.0 ou "" avant de l'utiliser.
476
Variables systme
Le serveur mysqld dispose de deux types de variables. Les variables globales, qui affectent l'ensemble du serveur. Les variables de session qui affectent des connexions individuelles. Lorsque mysqld dmarre, toutes les variables globales sont initialises partir des arguments passs en ligne de commande et des fichiers de configuration. Vous pouvez changer ces valeurs avec la commande SET GLOBAL. Lorsqu'un nouveau thread est cr, les variables spcifiques aux threads sont initialises partir des variables globales et ne changeront pas mme si vous utilisez la commande SET GLOBAL. Le serveur entretient aussi un jeu de variables de session pour chaque client qui se connecte. Les variables de session d'un client sont initialises au moment de la connexion, en utilisant les valeurs correspondantes globales. Pour les variables de session qui sont dynamiques, le client peut les changer avec la commande SET SESSION var_name. Modifier les variables de session d'une connexion ne requiert aucun droit spcifique, mais le client ne peut changer que ses propres variables de session, et non pas celle d'un autre client. Une modification une variable globale est visible tous les clients qui accdent cette variable. Mais, cela n'affecte la variable de session correspondante que lors de la prochaine connexion. Les connexions dj tablies ne sont pas affectes par un changement de variable globale. (pas mme le client qui a mis la commande SET GLOBAL). Pour dfinir la valeur d'une variable GLOBAL, vous devez utiliser l'une des syntaxes suivantes. Ici nous utilisons la variable sort_buffer_size titre d'exemple. Pour donner la valeur une variable GLOBAL, utilisez l'une de ces syntaxes :
mysql> SET GLOBAL sort_buffer_size=value; mysql> SET @@global.sort_buffer_size=value;
Pour dfinir la valeur d'une variable SESSION, vous devez utiliser l'une des syntaxes suivantes :
mysql> SET SESSION sort_buffer_size=value; mysql> SET @@session.sort_buffer_size=value; mysql> SET sort_buffer_size=value;
LOCAL est un synonyme de SESSION. Si vous ne spcifiez pas GLOBAL ou SESSION alors SESSION est utilis. See Section 13.5.2.8, Syntaxe de SET . Pour rcuprer la valeur d'une variable de type GLOBAL vous pouvez utiliser l'une des commandes suivantes :
mysql> SELECT @@global.sort_buffer_size; mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';
Pour rcuprer la valeur d'une variable de type SESSION vous pouvez utiliser l'une des commandes suivantes :
mysql> SELECT @@sort_buffer_size; mysql> SELECT @@session.sort_buffer_size; mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';
Ici aussi, LOCAL est un synonyme de SESSION. Lorsque vous rcuprez une valeur de variable avec la syntaxe @@nom_variable et que vous ne spcifiez pas GLOBAL ou SESSION, MySQL retournera la valeur spcifique au thread (SESSION) si elle existe. Sinon, MySQL retournera la valeur globale. Pour la commande SHOW VARIABLES, si vous ne spcifiez pas GLOBAL, SESSION ou LOCAL, MySQL retourne les valeurs de SESSION.
477
La raison d'imposer la prsence du mot GLOBAL pour configurer une variable de type GLOBAL mais non pour la lire est pour tre sur que vous n'aurez pas de problmes plus tard si vous voulez introduire ou effacer une variable spcifique au thread qui aurait le mme nom. Dans ce cas, vous pourriez changer accidentellement l'tat du serveur pour toutes les connexions (et non la votre uniquement). Plus d'informations sur les options de dmarrage du systme et les variables systme sont dans les sections Section 5.2.1, Options de ligne de commande de mysqld et Section 5.2.3, Variables serveur systme . Une liste des variables qui peuvent tre modifies durant l'excution est prsente dans Section 5.2.3.1, Variables systme dynamiques .
Pour chaque variables systme structure, un instance avec le nom default est toujours prdfinie. Si vous faites rfrence un composant d'une variables systme structure sans aucun nom d'instance, l'instance default sera utilise. Par consquent, default.key_buffer_size et key_buffer_size font rfrences la mme variable systme structure. Les rgles de nommage pour les variables systme structures et ses composants sont les suivantes : Pour un type donne de variables systme structures, chaque instance doit avoir un nom unique l'intrieur de ce type. Cependant, les noms d'instances doivent tre unique l'intrieur des types de variables systme structures. Par exemple, chaque variable systme structure aura une instance default, ce qui fait que default n'est pas unique l'intrieur des types de variables. Les noms de composants de chaque variable systme structure doit tre unique travers tous les noms de variables systmes. Si ce n'tait pas vrai (c'est dire, si deux types de variables structures pouvaient partager des noms de composants), il ne serait pas facile de trouver la variable structure par dfaut, pour ce type.
478
Si un nom de variable systme structure n'est pas valide en tant qu'identifiant non protg, il faut utiliser les guillemets obliques pour le protger. Par exemple, hot-cache n'est pas valide, mais `hot-cache` l'est. global, session, et local ne sont pas des noms de composants valides. Cela vite les conflits avec des notations comme @@global.var_name, qui fait rfrence des variables systme nonstructures. Actuellement, les deux premires rgles ne peuvent pas tre violes, puisqu'il n'y a qu'un seul type de variables systme structures, celui des caches de cls. Ces rgles prendront leur importance si d'autres types de variables structures sont cres dans le futur. A une exception prs, il est possible de faire rfrence une variable systme structure en utilisant des noms composs, dans un contexte o un nom de variable simple est utilis. Par exemple, vous pouvez assigner une valeur une variable structure en utilisant la ligne de commande suivante :
shell> mysqld --hot_cache.key_buffer_size=64K
Si vous lancez le serveur avec cette option, il va crer un cache de cl appel hot_cache, avec une taille de 64 ko, en plus du cache de cl par dfaut, qui a une taille de 8 Mo. Supposez que vous dmarriez le serveur avec ces options :
shell> mysqld --key_buffer_size=256K \ --extra_cache.key_buffer_size=128K \ --extra_cache.key_cache_block_size=2096
Dans ce cas, le serveur utilise une taille par dfaut de 256 ko pour le cache. Vous pourriez aussi crire --default.key_buffer_size=256K. De plus, le serveur cre un second cache de cl appel extra_cache, de taille 128 ko, avec une taille de bloc de buffer de 2096 octets. L'exemple suivant dmarre le serveur avec trois cache de cl diffrents, avec des tailles de ratio 3:1:1 :
shell> mysqld --key_buffer_size=6M \ --hot_cache.key_buffer_size=2M \ --cold_cache.key_buffer_size=2M
Les variables systme structures peuvent tre affectes et lue durant l'excution. Par exemple, pour crer un cache de cl appel hot_cache, de taille 10 Mo, utilisez une des commandes suivantes :
mysql> SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024; mysql> SET @@global.hot_cache.key_buffer_size = 10*1024*1024;
Cependant, la commande suivante ne fonctionne pas. La variable n'est pas interprte comme un nom compos, mais comme une simple chane pour l'oprateur LIKE :
mysql> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';
C'est la exception o vous ne pouvez pas utiliser une variable systme structure, l o une variable simple fonctionnerait.
479
Depuis # jusqu' la fin de la ligne. Depuis '-- ' jusqu' la fin de la ligne. Ce style est support depuis MySQL 3.23.3. Notez que le commentaire '-- ' (double-tiret) requiert que le second tiret soit suivi d'un espace ou par un autre caractre de contrle comme une nouvelle ligne. Cette syntaxe diffre lgrement des standards SQL, comme discut dans la section Section 1.5.5.7, '--' comme dbut de commentaire . Depuis /* jusqu' */. La squence de fermeture n'a pas besoin d'tre sur la mme ligne, ce qui permet de rpartir le commentaire sur plusieurs lignes. Voici un exemple avec les trois types de commentaires :
mysql> SELECT 1+1; # Ce commentaire se continue jusqu' la fin de la ligne mysql> SELECT 1+1; -- Ce commentaire se continue jusqu' la fin de la ligne mysql> SELECT 1 /* Ceci est un commentaire dans la ligne */ + 1; mysql> SELECT 1+ /* Ceci est un commentaire sur plusieurs lignes */ 1;
La syntaxe des commentaires dcrites ici s'applique l'analyseur du serveur mysqld, lorsqu'il traite les commandes SQL. Le client mysql peut aussi effectuer des analyses de commandes avant de les envoyer : par exemple, il recherche les limites de requtes dans les commandes multi-lignes. Cependant, il y a des limitations dans la faon de grer les commentaires /* ... */ : Les guillemets (simples et doubles) sont considrs comme des indications de dbut de chane, mme dans un commentaire. Si le guillemet n'est pas referm (par un second guillemet), l'analyseur ne ralisera pas que le commentaire est fini. Si vous utilisez mysql interactivement, vous pouvez vous en apercevoir, car il va modifier l'invite de commande de mysql> en '> ou ">. Un point-virgule sert indiquer la fin de la commande SQL, et tout ce qui suit un point-virgule est considr comme tant une nouvelle requte. Ces limitations s'appliquent aussi bien mysql en ligne de commande, que lorsque vous demandez mysql de lire des commandes depuis un fichier (mysql < un-fichier).
Mais omettre l'espace aprs abs gnre une erreur de syntaxe, car la commande semble utiliser la fonction ABS() :
mysql> CREATE TABLE abs(val INT);
Si vous lancez le serveur l'option de mode IGNORE_SPACE, le serveur autorisera l'appel de fonction avec un espace entre le nom de la fonction et le caractre de parenthse ouvrante ( suivant. Les noms de fonctions sont alors considrs comme des mots rservs. Comme pour les rsultats, les noms de colonnes qui sont identiques au nom de fonctions doivent tre placs entre guillemets, tels que dcrit dans Section 9.2, Noms de bases, tables, index, colonnes et alias . Le mode SQL du serveur est contrl par la procdure de la section Section 1.5.2, Slectionner les modes SQL .
480
Les mots suivants sont explicitement rservs en MySQL. La plupart sont interdits par ANSI SQL92 en tant que nom de colonnes ou de tables (par exemple, GROUP). Quelques uns sont rservs parce que MySQL en a besoin et utilise (actuellement) un analyseur yacc : ADD ANALYZE ASC BETWEEN BLOB CALL CHANGE CHECK CONDITION CONVERT CURRENT_DATE CURRENT_USER DATABASES DAY_MINUTE DECIMAL DELAYED DESCRIBE DISTINCTROW DROP ELSE ESCAPED EXPLAIN FLOAT FOR FROM GROUP HOUR_MICROSECOND IF INDEX INOUT INT INT3 INTEGER IS KEY LEADING LIKE LOAD LOCK ALL AND ASENSITIVE BIGINT BOTH CASCADE CHAR COLLATE CONSTRAINT CREATE CURRENT_TIME CURSOR DAY_HOUR DAY_SECOND DECLARE DELETE DETERMINISTIC DIV DUAL ELSEIF EXISTS FALSE FLOAT4 FORCE FULLTEXT HAVING HOUR_MINUTE IGNORE INFILE INSENSITIVE INT1 INT4 INTERVAL ITERATE KEYS LEAVE LIMIT LOCALTIME LONG ALTER AS BEFORE BINARY BY CASE CHARACTER COLUMN CONTINUE CROSS CURRENT_TIMESTAMP DATABASE DAY_MICROSECOND DEC DEFAULT DESC DISTINCT DOUBLE EACH ENCLOSED EXIT FETCH FLOAT8 FOREIGN GRANT HIGH_PRIORITY HOUR_SECOND IN INNER INSERT INT2 INT8 INTO JOIN KILL LEFT LINES LOCALTIMESTAMP LONGBLOB
481
LONGTEXT MATCH MEDIUMTEXT MINUTE_SECOND NATURAL NULL OPTIMIZE OR OUTER PRIMARY READ REFERENCES RENAME REQUIRE REVOKE SCHEMA SELECT SET SONAME SQL SQLWARNING SQL_SMALL_RESULT STRAIGHT_JOIN THEN TINYTEXT TRIGGER UNION UNSIGNED USE UTC_TIME VARBINARY VARYING WHILE XOR
LOOP MEDIUMBLOB MIDDLEINT MOD NOT NUMERIC OPTION ORDER OUTFILE PROCEDURE READS REGEXP REPEAT RESTRICT RIGHT SCHEMAS SENSITIVE SHOW SPATIAL SQLEXCEPTION SQL_BIG_RESULT SSL TABLE TINYBLOB TO TRUE UNIQUE UPDATE USING UTC_TIMESTAMP VARCHAR WHEN WITH YEAR_MONTH
LOW_PRIORITY MEDIUMINT MINUTE_MICROSECOND MODIFIES NO_WRITE_TO_BINLOG ON OPTIONALLY OUT PRECISION PURGE REAL RELEASE REPLACE RETURN RLIKE SECOND_MICROSECOND SEPARATOR SMALLINT SPECIFIC SQLSTATE SQL_CALC_FOUND_ROWS STARTING TERMINATED TINYINT TRAILING UNDO UNLOCK USAGE UTC_DATE VALUES VARCHARACTER WHERE WRITE ZEROFILL
Voici de nouveaux mots rservs en MySQL : 5.0: ASENSITIVE CONTINUE DETERMINISTIC EXIT INSENSITIVE LOOP CALL CURSOR EACH FETCH ITERATE MODIFIES CONDITION DECLARE ELSEIF INOUT LEAVE OUT
482
Les symboles suivants (issus de la table ci-dessus) sont interdits par ANSI SQL mais permis par MySQL en tant que noms de colonnes ou de tables. Cela est d au fait que ces noms sont trs courants, et de nombreux programmeur les ont dj utiliss. ACTION BIT DATE ENUM NO TEXT TIME TIMESTAMP
483
484
L'amlioration du support des jeux de caractres est un des progrs de MySQL en version 4.1. Ce chapitre couvre : Ce que sont les jeux de caractres et les collations Le systme par dfaut plusieurs niveaux Nouvelle syntaxe en MySQL 4.1 Fonctions et oprations affectes Support d'Unicode
485
La signification de chaque jeu de caractres et collation Le support des jeux de caractres est inclus dans les tables MySISAM, MEMORY (HEAP), et depuis MySQL 4.1.2, InnoDB. Le moteur de table ISAM n'inclut pas le support des jeux de caractres, et il n'y a pas de plan pour le faire car ISAM est abandonne.
486
| | | | |
DOS West European HP West European KOI8-R Relcom Russian ISO 8859-1 West European ISO 8859-2 Central European
| | | | |
| | | | |
Le rsultat inclut en ralit une autre colonne, qui n'est pas prsente dans cette page, des fins de publication. Tout jeu de caractres a toujours au moins une collation. Il peut en avoir plusieurs. Pour lister les collations d'un jeu de caractres, utilisez la commande SHOW COLLATION. Par exemple, pour afficher les collations du jeu de caractres latin1 (``ISO-8859-1 West European''), utilisez cette commande, et recherchez les noms de collation qui commencent par latin1 :
mysql> SHOW COLLATION LIKE 'latin1%'; +-------------------+---------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +-------------------+---------+----+---------+----------+---------+ | latin1_german1_ci | latin1 | 5 | | | 0 | | latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 | | latin1_danish_ci | latin1 | 15 | | | 0 | | latin1_german2_ci | latin1 | 31 | | Yes | 2 | | latin1_bin | latin1 | 47 | | Yes | 1 | | latin1_general_ci | latin1 | 48 | | | 0 | | latin1_general_cs | latin1 | 49 | | | 0 | | latin1_spanish_ci | latin1 | 94 | | | 0 | +-------------------+---------+----+---------+----------+---------+
Les collations latin1 ont les significations suivantes : Collation latin1_bin latin1_danish_ci latin1_general_ci latin1_general_cs latin1_german1_ci latin1_german2_ci latin1_spanish_ci latin1_swedish_ci Signification Binaire, suivant l'encodage latin1 Danois/Norvgien Multilingue Multilingue, sensible la casse Allemand DIN-1 Allemand DIN-2 Espagnol moderne Sudois/Finlandais
Les collations ont les caractristiques suivantes : Deux jeux de caractres diffrents ne peuvent pas avoir la mme collation. Chaque jeu de caractre a une collation qui est la collation par dfaut. Par exemple, la collation par dfaut de latin1 est latin1_swedish_ci. Il y a une convention pour les noms de collation : elles commencent par le nom du jeu de caractres auquel elles sont associes; elles incluent gnralement un nom de langue, et finissent par _ci (case insensitive, insensible la casse), _cs (case sensitive, sensible la casse), _bin (binaire), ou _uca (Algorithme Unicode, Unicode Collation Algorithm).
487
Une faon de changer la configuration par dfaut est de recompiler MySQL. Si vous voulez changer le jeu de caractres et la collation par dfaut du serveur quand vous compilez depuis les sources, utilisez --with-character-set et --with-collation comme arguments pour configure. Par exemple :
shell> ./configure --with-character-set=latin1
ou :
shell> ./configure --with-character-set=latin1 --with-collation=latin1_german1_ci
mysqld et configure vrifient aussi que la combinaison jeu de caractres/collation est valide. Ces programmes affichent un message erreur et se terminent si la combinaison n'est pas valide.
Exemple :
CREATE DATABASE db_name DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
MySQL choisit le jeu de caractres et la collation de base de donnes comme ceci : Si les deux clauses CHARACTER SET X et COLLATE Y ont t spcifies, alors leurs valeurs sont utilises. Si CHARACTER SET X a t spcifie sans COLLATE, alors le jeu de caractres est X et sa collation par dfaut. Sinon, le jeu de caractres et la collation par dfaut du serveur sont utiliss.
488
La syntaxe MySQL CREATE DATABASE ... DEFAULT CHARACTER SET ... est analogue la syntaxe du standard SQL CREATE SCHEMA ... CHARACTER SET .... Il est donc possible de crer des bases de donnes avec diffrents jeux de caractres et collations, sur le mme serveur MySQL. Le jeu de caractres et la collation sont utilises comme valeur par dfaut pour les tables, lorsque ces informations ne sont pas spcifies dans les commandes CREATE TABLE. Elles n'ont pas d'autres utilit.
Exemple :
CREATE TABLE t1 ( ... ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
MySQL choisit le jeu de caractre et la collation : Si CHARACTER SET X et COLLATE Y sont prciss tous les deux, alors on adopte le jeu de caractres X et la collation Y. Si CHARACTER SET X tait prcis sans COLLATE, alors on adopte le jeu de caractres X et sa collation par dfaut. Sinon, le jeu de caractres et la collation de la base de donnes sont utiliss. Le jeu de caractres et la collation sont utiliss comme valeurs par dfaut si ces deux attributs ne sont pas prciss par la dfinition d'une colonne. Le jeu de caractres et la collation sont des extensions MySQL : il n'y a pas de telles fonctionnalits en SQL standard.
Exemple :
CREATE TABLE Table1 ( column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci );
MySQL choisit le jeu de caractres et la collation de colonne comme ceci : Si CHARACTER SET X et COLLATE Y sont spcifis, alors le jeu de caractres est X et la collation Y. Si CHARACTER SET X a t spcifi sans la clause COLLATE, alors le jeu de caractres est X et la collation est sa collation par dfaut. Sinon, MySQL utilise le jeu de caractres et la collation par dfaut.
489
Vous avez ici une colonne avec un jeu de caractres latin1 et une collation latin1_german1_ci. La dfinition est explicite, c'est donc direct. Veuillez noter qu'il n'y a pas de problme stocker une colonne latin1 dans une table latin2. Exemple 2 : dfinition de table et colonne
CREATE TABLE t1 ( c1 CHAR(10) CHARACTER SET latin1 ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
Cette fois-ci nous avons une colonne avec un jeu de caractres latin1 et une collation par dfaut. Maintenant, bien que cela puisse sembler naturel, la collation par dfaut n'est pas spcifie au niveau de la table. A la place, comme la collation par dfaut de latin1 est toujours latin1_swedish_ci, la colonne c1 aura la collation latin1_swedish_ci (et non latin1_danish_ci). Exemple 3 : dfinition de table et colonne
CREATE TABLE t1 ( c1 CHAR(10) ) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;
Nous avons une colonne avec un jeu de caractres par dfaut et une collation par dfaut. Dans ces conditions, MySQL regarde au niveau de la table pour dterminer le jeu de caractres et la collation. Par consquent le jeu de caractres de la colonne c1 est latin1 et sa collation est latin1_danish_ci. Exemple 4: dfinition de base, table et colonne
CREATE DATABASE d1 DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci; USE d1; CREATE TABLE t1 ( c1 CHAR(10) );
Nous crons une colonne sans prciser son jeu de caractre ni sa collation. Nous ne spcifions pas non plus de jeu de caractres ni de collation au niveau de la table. Dans ces conditions, MySQL cherche au niveau de la base de donnes. (La configuration de la base de donne devient celle de la table, et par consquent celle de la colonne.) Donc le jeu de caractres de colonne c1 est latin2 et sa collation est latin2_czech_ci.
490
Le jeu de caractres et la collation par dfaut de la base de donnes sont disponibles dans character_set_database et collation_database. D'autres variables et collations sont impliques dans la gestion des connexions entre un client et un serveur. Chaque client a un jeu de caractres et une collation attitrs. Pensez ce qu'est une "connexion" : c'est ce que vous faites lorsque vous vous connectez au serveur. Le client envoie des SQL commandes comme des requtes, au travers de la connexion, vers le serveur. Le serveur renvoie des rponses, comme des jeux de rsultats, au client, au travers de la connexion. Ceci mne plusieurs questions telles que : Dans quel jeu de caractres est la requte lorsqu'elle quitte le client? Le serveur utilise la variable character_set_client pour connatre le jeu de caractres des requtes mises par le client. dans quel jeu de caractre le serveur devrait il traduire la requte aprs l'avoir reue? Pour cela, character_set_connection et collation_connection sont utilises par le serveur. Il convertit les requtes envoyes par le client de character_set_client en character_set_connection (hormis les chanes littrales qui sont prcdes de _latin1 ou _utf8). collation_connection est importante pour les comparaisons de chanes littrales. Pour les comparaisons de chanes avec des colonnes, la collation de la colonne a la priorit. Dans quel jeu de caractres le serveur devrait-il traduire les rsultats ou messages d'erreur avant de les renvoyer au client? La variable character_set_results indique le jeu de caractres que le serveur utilise pour retourner les rsultats aux clients. Cela inclut les donnes telles que les noms de colonnes ou les meta-donnes. Vous pouvez configurez ces options l, ou vous pouvez vous fier aux configurations par dfaut (auquel cas vous pouvez sauter cette section). Il y a deux commandes qui permettent de modifier le jeu de caractres de la connexion :
SET NAMES 'charset_name' SET CHARACTER SET charset_name
SET NAMES indique ce qui est dans la commande SQL que le client envoie. Par consquent, SET NAMES cp1251 indique au serveur : ``les futurs messages fournis par ce client seront dans le jeu de caractres cp1251'' et le serveur est libre de les traduire dans son propre jeu de caractres, ventuellement. La commande SET NAMES 'x' est quivalente ces trois commandes :
mysql> SET character_set_client = x; mysql> SET character_set_results = x; mysql> SET character_set_connection = x;
SET CHARACTER SET est similaire, mais spcifie le jeu de caractres et la collation par dfaut des bases pour la connexion. Une commande SET CHARACTER SET x est quivalente :
mysql> SET character_set_client = x; mysql> SET character_set_results = x; mysql> SET collation_connection = @@collation_database;
Lorsque vous excutez la commande SET NAMES ou SET CHARACTER SET, vous changez aussi la collation de la connexion. Cependant, la collation de connexion existe uniquement par cohrence. Gnralement sa valeur n'a pas d'importance. Avec le client mysql, il n'est pas ncessaire d'excuter la commande SET NAMES chaque dmarrage. Vous pouvez ajouter l'option --default-character-set-name dans la ligne de
491
commande de mysql, ou dans le fichier d'options. Par exemple, la ligne suivante est excute automatiquement chaque dmarrage de mysql :
[mysql] default-character-set=koi8r
EXEMPLE : supposez que column1 est dfini par CHAR(5) CHARACTER SET latin2. Si vous n'indiquez pas SET CHARACTER SET, alors la commande SELECT column1 FROM t retournera les valeurs de la colonne column1 en utilisant le jeu de caractres latin2. Si, d'un autre cot, vous utilisez la commande SET CHARACTER SET latin1, le serveur va alors convertir le rsultat de latin2 en latin1 juste avant de l'envoyer. De telles conversion sont lentes. Si vous ne voulez pas que le serveur fasse des conversions, utilisez la valeur NULL character_set_results :
mysql> SET character_set_results = NULL;
Exemples :
SELECT 'string'; SELECT _latin1'string'; SELECT _latin1'string' COLLATE latin1_danish_ci;
La simple commande SELECT 'string' utilise le jeu de caractres par dfaut de la connexion. L'expression _character_set_name est formellement appele un spcificateur (introducer). Elle indique l'analyseur : "la chane qui va suivre utilise le jeu de caractre X.'' Cela a t source de confusions par le pass; aussi nous insistons sur le fait qu'un spcificateur ne provoque pas de conversion. C'est strictement une indication, qui ne change pas la valeur de la chane. Un spcificateur est aussi autoris avant des notations littrales hexadcimale et numrique (x'literal' et 0xnnnn), et avant ? (qui est une substitution de paramtre lorsque l'on utilise des commandes prpares avec une interface de langage de programmation). Exemples :
SELECT _latin1 x'AABBCC'; SELECT _latin1 0xAABBCC; SELECT _latin1 ?;
MySQL dtermine le jeu de caractres et la collation de la faon suivante : Si, la fois _X et COLLATE Y ont t prciss, alors le jeu de caractres est X et la collation littrale est Y. Si _X est prcis mais que COLLATE ne l'est pas, alors le jeu de caractres de la chane littrale est X et la collation est la collation par dfaut du jeu de caractres X. Sinon, on utilise le jeu de caractres et la collation par dfaut de la connexion. Exemples: Une chane avec le jeu de caractres latin1 et la collation latin1_german1_ci :
SELECT _latin1'Mller' COLLATE latin1_german1_ci;
492
Une chane avec le jeu de caractres latin1 et sa collation par dfaut, c'est dire latin1_swedish_ci:
SELECT _latin1'Mller';
Les introducteurs de jeux de caractres et la clause COLLATE sont implments selon les spcifications standard SQL.
Avec AS :
SELECT k COLLATE latin1_german2_ci AS k1 FROM t1 ORDER BY k1;
Avec GROUP BY :
SELECT k FROM t1 GROUP BY k COLLATE latin1_german2_ci;
Avec DISTINCT :
SELECT DISTINCT k COLLATE latin1_german2_ci FROM t1;
Avec WHERE :
SELECT * FROM t1 WHERE _latin1 'Mller' COLLATE latin1_german2_ci = k;
Avec HAVING :
SELECT k FROM t1 GROUP BY k HAVING k = _latin1 'Mller' COLLATE latin1_german2_ci;
493
Oprateur BINARY
Cependant, quand des oprandes multiples sont, en jeu il peut y avoir des ambiguts. Par exemple :
SELECT x FROM T WHERE x = 'Y';
Cette requte devrait elle utiliser la collation de la colonne x, ou celle de la chane littrale 'Y'? Le standard SQL rsout de telles questions en utilisant ce qui portait le nom de rgles coercitives (``coercibility''). L'essence de la question est : puisque x et 'Y' ont tous deux des collations diffrentes, laquelle a priorit? C'est une question complexe, mais ces rgles devraient rsoudre la plupart des situations : Une clause explicite COLLATE a pour priorit 4. Une concatnation de deux chanes avec des collations diffrentes pour priorit 3. La collation d'une colonne a priorit 2. La collation d'une chane littrale a pour priorit 1. Ces rgles rsolvent les ambiguits de la faon suivante : Utiliser la collation qui a la prcdence la plus leve. Si les deux oprandes ont une collation de mme priorit, alors il y a erreur si les collations ne sont pas les mmes. Exemples : column1 = 'A' column1 = 'A' COLLATE x column1 COLLATE x = 'A' COLLATE y Utilise la collation de la colonne column1 Utilise la collation de 'A' Erreur
La fonction COERCIBILITY() peut tre utilise pour dterminer la coercibilit d'une chane :
mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci); -> 0 mysql> SELECT COERCIBILITY('A'); -> 3
494
Dans certaines cas, les expressions qui fonctionnaient avant MySQL 4.1 choueront en MySQL 4.1 si vous ne prenez pas en compte les collations et jeux de caractres. Par exemple, avant la version 4.1, cette commande fonctionnait comme :
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1); +-------------------------------+ | SUBSTRING_INDEX(USER(),'@',1) | +-------------------------------+ | root | +-------------------------------+
La raison cela est que les noms d'utilisateurs sont stockes en UTF8 (see Section 10.6, UTF8 pour les meta-donnes ). Par consquent, la fonction USER() et la chane littrale '@' ont des jeux de caractres diffrents et des collations diffrentes :
mysql> SELECT COLLATION(USER()), COLLATION('@'); +-------------------+-------------------+ | COLLATION(USER()) | COLLATION('@') | +-------------------+-------------------+ | utf8_general_ci | latin1_swedish_ci | +-------------------+-------------------+
Un moyen pour corriger cela est de dire MySQL qu'il doit interprter les chanes littrales avec le jeu de caractres sutf8 :
mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1); +------------------------------------+ | SUBSTRING_INDEX(USER(),_utf8'@',1) | +------------------------------------+ | root | +------------------------------------+
Un autre moyen est de changer le jeu de caractres et la collation de la connexion en utf8. Vous pouvez aussi utiliser la commande SET NAMES 'utf8' ou les variables systme character_set_connection et collation_connection.
Et supposons que les valeurs de la colonne soient rcupres en utilisant la commande suivante :
SELECT X FROM T ORDER BY X COLLATE collation_name;
495
L'ordre rsultant des valeurs pour diffrentes collations est montr dans cette table : latin1_swedish_ci Muffler MX Systems Mller MySQL latin1_german1_ci Muffler Mller MX Systems MySQL latin1_german2_ci Mller Muffler MX Systems MySQL
Cette table est un exemple qui montre quel effet cela aurait si l'on utilisait des collations diffrentes dans une clause ORDER BY. Le caractre qui pose problme dans cet exemple est le U avec deux points dessus. Les allemands l'appellent U-umlaut, mais nous l'appellerons U-trma. La premire colonne montre le rsultat de SELECT en utilisant la collation Sudoise/Finlandaise, qui dit que le u-trma est tri comme le Y La seconde colonne montre le rsultat de SELECT en utilisant la rgle German DIN-1, qui dit que le U-trma est tri comme le U. La troisime colonne montre le rsultat de SELECT en utilisant la rgle German DIN-2 qui dit que le u-trma est tri comme le UE. Trois collations diffrentes engendrent trois rsultats diffrents. MySQL est l pour grer cela. En utilisant la collation approprie, vous pouvez choisir l'ordre de tri que vous voulez.
496
CONVERT()
Pour des oprations qui convertissent vers des donnes caractres, le jeu de caractres de la chane rsultante et sa collation sont dans le jeu de caractres de connexion et ont la collation de connexion. Ceci s'applique : CHAR(), CAST(), CONV(), FORMAT(). HEX(), SPACE().
10.4.2. CONVERT()
CONVERT() fournit une mthode pour convertir des donnes entre diffrents jeux de caractres. La syntaxe est :
CONVERT(expr USING transcoding_name)
Avec MySQL, les nom de conversions sont les mmes que les noms des jeux caractres correspondants. Exemples :
SELECT CONVERT(_latin1'Mller' USING utf8); INSERT INTO utf8table (utf8column) SELECT CONVERT(latin1field USING utf8) FROM latin1table;
10.4.3. CAST()
Vous pouvez aussi utiliser CAST() pour convertir une chane dans un jeu de caractres diffrent. Le nouveau format est :
CAST ( character_string AS character_data_type CHARACTER SET character_set_name )
Exemple :
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);
Vous ne pouvez pas utiliser une clause COLLATE dans un CAST(), mais vous pouvez l'utiliser en dehors. Cela revient dire que CAST(... COLLATE ...) est interdit mais CAST(...) COLLATE ... est autoris. Exemple :
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
Si vous utilisez CAST() sans prciser CHARACTER SET, alors le jeu de caractres et la collation rsultants sont le jeu de caractres de la connexion et sa collation par dfaut. Si vous utilisez CAST() avec CHARACTER SET X, alors le jeu de caractres rsultant est X et la collation rsultante est la collation par dfaut de X.
497
Support de Unicode
+---------+-----------------------------+-------------------+--------+
See Section 13.5.3.1, Commande SHOW CHARACTER SET . Le rsultat de SHOW COLLATION inclut tous les jeux de caractres disponibles. Elle accepte la clause optionnelle LIKE qui indique quels nom de collation rechercher. Par exemple :
mysql> SHOW COLLATION LIKE 'latin1%'; +-------------------+---------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +-------------------+---------+----+---------+----------+---------+ | latin1_german1_ci | latin1 | 5 | | | 0 | | latin1_swedish_ci | latin1 | 8 | Yes | Yes | 0 | | latin1_danish_ci | latin1 | 15 | | | 0 | | latin1_german2_ci | latin1 | 31 | | Yes | 2 | | latin1_bin | latin1 | 47 | | Yes | 0 | | latin1_general_ci | latin1 | 48 | | | 0 | | latin1_general_cs | latin1 | 49 | | | 0 | | latin1_spanish_ci | latin1 | 94 | | | 0 | +-------------------+---------+----+---------+----------+---------+
See Section 13.5.3.2, Syntaxe de SHOW COLLATION . SHOW CREATE DATABASE affiche la commande CREATE DATABASE qui va crer la base de donnes. Le rsultat inclut toutes les options de bases de donnes. DEFAULT CHARACTER SET et COLLATE sont supports. Toutes les options sont stockes dans un fichier texte, appele db.opt qui peut tre trouv dans le fichier de base de donnes.
mysql> SHOW CREATE DATABASE a\G *************************** 1. row *************************** Database: a Create Database: CREATE DATABASE `a` /*!40100 DEFAULT CHARACTER SET macce */
See Section 13.5.3.4, Syntaxe de SHOW CREATE DATABASE . SHOW CREATE TABLE est similaire, mais affiche la commande CREATE TABLE pour crer une table donne. Les dfinitions de colonnes incluent maintenant toutes les spcifications de jeu de caractres, et les options de tables aussi. See Section 13.5.3.5, Syntaxe de SHOW CREATE TABLE . La commande SHOW COLUMNS affiche la collation des colonnes d'une table, lorsqu'elle est appele avec SHOW FULL COLUMNS. Les colonnes de type CHAR, VARCHAR et TEXT ont des collations de type non-NULL. Les valeurs numriques et non-caractres on des collations NULL. Par exemple :
mysql> SHOW FULL COLUMNS FROM t; +-------+---------+------------+------+-----+---------+-------+ | Field | Type | Collation | Null | Key | Default | Extra | +-------+---------+------------+------+-----+---------+-------+ | a | char(1) | latin1_bin | YES | | NULL | | | b | int(11) | NULL | YES | | NULL | | +-------+---------+------------+------+-----+---------+-------+
Le jeu de caractres ne fait pas partie de l'affichage. Le nom du jeu de caractre est li la collation. See Section 13.5.3.3, Syntaxe de SHOW COLUMNS .
498
En UCS-2 (binary Unicode representation) chaque caractre est reprsent par un code Unicode de deux octets avec l'octet le plus significatif en premier. Par exemple : "LATIN CAPITAL LETTER A" a le code 0x0041 et est stock comme une squence deux octets 0x00 0x41. "CYRILLIC SMALL LETTER YERU" (Unicode 0x044B) est stock comme une squence deux octets 0x04 0x4B. Pour les caractres Unicode et leurs codes veuillez consulter Unicode Home Page. Restriction temporaire : UCS-2 ne peut pas (encore) tre utilis comme jeu de caractres client. Cela signifie que SET NAMES ucs2 ne fonctionnera pas. Le jeu de caractres UTF8 (transform Unicode representation) est une alternative pour stocker les donnes Unicode. il est implment selon la RFC 2279. L'ide du jeu de caractres UTF-8 est que diffrents caractres Unicode soient reprsents par des squences de diffrentes longueurs. les lettres, chiffres et caractres de ponctuation latins de base utilisent un octet. La plupart des lettres europennes et moyen-orientales sont stockes avec une squence deux octets : les lettres latines tendues (avec les tildes, macrons, accents graves, aigus et autres accents), cyrilliques, grecques, armniennes, hbreues, arabes, syriaques et autres. Les idographes corens, chinois et japonais utilisent des squences trois octets. Actuellement, MySQL UTF8 ne supporte pas les squences 4 octets. Conseil : pour conomiser de l'espace avec UTF-8, utilisez VARCHAR au lieu de CHAR. Sinon, MySQL doit rserver 30 octets pour une colonne CHAR(10) CHARACTER SET utf8 parce que c'est la longueur maximale accepter.
Le stockage des mta-donnes utilisant Unicode ne signifie pas que les enttes et les rsultats de la fonction DESCRIBE seront dans le jeu de caractres character_set_system. Lorsque vous envoyez la commande SELECT column1 FROM t, le nom de la colonne column1 sera
499
retourn par le serveur vers le client dans le jeu de caractres dterminer par la commande SET NAMES. Plus spcifiquement, le jeu de caractres est dtermin par la valeur de la variable systme character_set_results. Si cette variable vaut NULL, aucune conversion n'est effectue, et le serveur retourne les donnes dans leur jeu de caractres original (tel qu'indiqu par character_set_system). Si vous voulez que le serveur affiche les rsultats des meta-donnes dans un jeu de caractres autre que UTF8, alors utilisez SET CHARACTER SET pour forcer le serveur faire la conversion (see Section 10.3.6, Jeux de caractres et collations de connexion ), ou configurez le client pour qu'il fasse la conversion. Il est toujours plus efficace de configurer le client pour qu'il fasse la conversion, mais ce choix ne sera pas toujours possible pour de nombreux clients jusqu' tard dans le cycle des produits MySQL 4.x. Si vous utilisez seulement, par exemple, la fonction USER() pour une comparaison ou une assignation dans une seule commande... ne vous inquitez pas. MySQL fera des conversions automatiques pour vous.
SELECT * FROM Table1 WHERE USER() = latin1_column;
Ceci fonctionnera, car le contenu de latin1_column est automatiquement converti en UTF8 avant la comparaison.
INSERT INTO Table1 (latin1_column) SELECT USER();
Ceci fonctionnera car le contenu de USER() est automatiquement converti en latin1 avant l'assignation. La conversion automatique n'est pas encore compltement implmente, mais devrait fonctionner correctement dans une version ultrieure. Bien que la conversion automatique ne soit pas un standard SQL, le document de standard SQL dit que chaque jeu de caractres est (en termes de caractres supports) un "sous-jeu" de l'Unicode. Comme c'est un principe bien connu que "ce qui s'applique un super-jeu peut s'appliquer un sousjeu", nous croyons que la collation d'Unicode peut s'appliquer des comparaisons avec des chanes non-Unicode.
de mme que :
500
VARCHAR(10) CHARACTER SET utf8 NATIONAL VARCHAR(10) NCHAR VARCHAR(10) NATIONAL CHARACTER VARYING(10) NATIONAL CHAR VARYING(10)
Vous pouvez utiliser N'literal' pour indiquer qu'une chane utilise le jeu de caractre national. Ces deux commandes sont quivalentes :
SELECT N'some text'; SELECT _utf8'some text';
Si vous utilisez mysql avec, par exemple, le jeux de caractres MySQL 4.0 danois, vous devez utiliser maintenant le jeu de caractres latin1 avec la collation latin1_danish_ci :
shell> ./configure --with-character-set=latin1 --with-collation=latin1_danish_ci shell> ./mysqld --default-character-set=latin1 --default-collation=latin1_danish_ci
Utilisez la table de la section Section 10.10.1, Jeux de caractres 4.0 et binmes de jeux de caractres/collations 4.1 correspondants pour retrouver les anciens jeux de caractres 4.0 et leur quivalent 4.1 en jeu de caractre et collation. Si vous avez des donnes non-latin1 qui sont stockes dans une table 4.0 latin1 et que vous voulez convertir la table pour que les dfinitions refltent le vritable jeu de caractres, utilisez les instructions de la section Section 10.10.2, Conversion de colonnes version 4.0 en version 4.1 .
501
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
czech dec8 dos german1 hp8 koi8_ru latin1 latin2 swe7 usa7 ujis sjis cp1251 danish hebrew win1251 tis620 euc_kr estonia hungarian koi8_ukr win1251ukr gb2312 greek win1250 croat gbk cp1257 latin5 latin1_de
latin2 dec8 cp850 latin1 hp8 koi8r latin1 latin2 swe7 ascii ujis sjis cp1251 latin1 hebrew (removed) tis620 euckr latin7 latin2 koi8u cp1251 gb2312 greek cp1250 latin2 gbk cp1257 latin5 latin1
latin2_czech_ci dec8_swedish_ci cp850_general_ci latin1_german1_ci hp8_english_ci koi8r_general_ci latin1_swedish_ci latin2_general_ci swe7_swedish_ci ascii_general_ci ujis_japanese_ci sjis_japanese_ci cp1251_bulgarian_ci latin1_danish_ci hebrew_general_ci (removed) tis620_thai_ci euckr_korean_ci latin7_estonian_ci latin2_hungarian_ci koi8u_ukrainian_ci cp1251_ukrainian_ci gb2312_chinese_ci greek_general_ci cp1250_general_ci latin2_croatian_ci gbk_chinese_ci cp1257_lithuanian_ci latin5_turkish_ci latin1_german2_ci
502
Aprs mise jour en MySQL version 4.1, vous pouvez convertir cette table pour qu'elle laisse intacte la colonne latin1_col mais modifie les colonnes latin2_col et utf8_col pour qu'elles utilisent les jeux de caractres latin2 et utf8. D'abord, sauvez votre table, puis convertissez les colonnes comme ceci :
ALTER ALTER ALTER ALTER TABLE TABLE TABLE TABLE t t t t MODIFY MODIFY MODIFY MODIFY latin2_col BINARY(100); utf8_col BINARY(150); latin2_col CHAR(100) CHARACTER SET latin2; utf8_col CHAR(150) CHARACTER SET utf8;
La premire commande ``supprime'' les informations de jeux de caractres des colonnes latin2_col et utf8_col. Les deux autres commandes assignent le bon jeu de caractre aux deux colonnes. Si vous voulez, vous pouvez combiner les deux conversions en une seule commande :
ALTER TABLE t MODIFY latin2_col BINARY(100), MODIFY utf8_col BINARY(150); ALTER TABLE t MODIFY latin2_col CHAR(100) CHARACTER SET latin2, MODIFY utf8_col CHAR(150) CHARACTER SET utf8;
503
Note : Tous les jeux de caractres sont une collation binaire. Nous n'avons pas inclus cette collation dans les descriptions qui suivent.
504
latin1_bin latin1_danish_ci latin1_general_ci latin1_general_cs latin1_german1_ci latin1_german2_ci latin1_spanish_ci latin1_swedish_ci (par dfaut) Le jeu de caractres latin1 est le jeu de caractres par dfaut. La collation latin1_swedish_ci est la collation par dfaut qui est probablement utilise par la majorit des clients de MySQL. Il est souvent dit que ceci est bas sur les rgles de collation sudoises/finlandaises mais vous trouverez des sudois et des finlandais qui ne sont pas d'accord avec cette affirmation. Les collations latin1_german1_ci et latin1_german2_ci sont bases sur les standards DIN-1 and DIN-2, o DIN signifie Deutsches Institut fr Normung (c'est la contrepartie allemande de ANSI). DIN-1 est appele la collation dictionnaire et DIN-2 est appele la collation annuaire. rgles latin1_german1_ci (dictionnaire) :
= A, = O, = U, = s
Dans la collation latin1_spanish_ci, (N-tilde) est une lettre spare entre N et O. Collations macroman (Mac West European) : macroman_bin macroman_general_ci (par dfaut) Collations swe7 (7 bits Swedish) : swe7_bin swe7_swedish_ci (par dfaut)
505
collations cp852 (DOS Central European) : cp852_bin cp852_general_ci (par dfaut) collations keybcs2 (DOS Kamenicky Czech-Slovak) : keybcs2_bin keybcs2_general_ci (par dfaut) collations latin2 (ISO 8859-2 Central European) : latin2_bin latin2_croatian_ci latin2_czech_ci latin2_general_ci (par dfaut) latin2_hungarian_ci collations macce (Mac Central European) : macce_bin macce_general_ci (par dfaut)
506
507
508
MySQL supporte un grand nombre de types de colonnes, qui peuvent tre rassembles en trois catgories : les types numriques, temporels et chanes. Cette section vous donne un aperu des types disponibles, et rsume les besoin de stockage de chaque colonne, puis fournit une description dtaille des proprits de chaque type de donnes. Cette prsentation est volontairement courte. Les descriptions dtailles peuvent tre consultes pour plus d'informations sur chaque type, comme les formats autoriss. MySQL 4.1 et plus rcente supporte des extensions pour grer les donnes gographiques. Des informations sur ces types sont disponibles dans la section Chapitre 18, Donnes spatiales avec MySQL. Plusieurs dfinitions de colonnes partagent la mme convention : M Indique la taille maximale d'affichage. La taille maximale lgale est de 255. D S'applique aux types virgule flottante, et indique le nombre de chiffres qui suivent la virgule dcimale. Le nombre maximal est de 30, mais ne devrait pas dpasser M-2. [] Les crochets ([ et ]) indiquent des spcifications qui sont optionnelles.
509
Si vous spcifiez l'option ZEROFILL pour une valeur numrique, MySQL va automatiquement ajouter l'attribut UNSIGNED la colonne. Attention : soyez conscient que lorsque vous utilisez la soustraction entre deux entier, dont l'un est de type UNSIGNED, le rsultat sera sans signe! See Section 12.7, Fonctions de transtypage . TINYINT[(M)] [UNSIGNED] [ZEROFILL] Un trs petit entier. L'intervalle de validit pour les entiers signs est de -128 127. L'intervalle de validit pour les entiers non-signs est 0 255. BIT, BOOL, BOOLEAN Ce sont des synonymes de TINYINT(1). Le synonyme BOOLEAN a t ajout en version 4.1.0 Un type boolen complet, qui sera introduit pour tre en accord avec la norme SQL-99. SMALLINT[(M)] [UNSIGNED] [ZEROFILL] Un petit entier. L'intervalle de validit pour les entiers signs est de -32768 32767. L'intervalle de validit pour les entiers non-signs est 0 65535. MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] Un entier. L'intervalle de validit pour les entiers signs est de -8388608 8388607. L'intervalle de validit pour les entiers non-signs est 0 16777215. INT[(M)] [UNSIGNED] [ZEROFILL] Un grand entier. L'intervalle de validit pour les entiers signs est de -2147483648 2147483647. L'intervalle de validit pour les entiers non-signs est 0 4294967295. INTEGER[(M)] [UNSIGNED] [ZEROFILL] Ceci est un synonyme INT. BIGINT[(M)] [UNSIGNED] [ZEROFILL] Un trs grand entier. L'intervalle de validit pour les entiers signs est de -9223372036854775808 9223372036854775807. L'intervalle de validit pour les entiers non-signs est 0 18446744073709551615. Quelques conseils suivre avec les colonnes de type BIGINT : Tous les calculs arithmtiques sont fait en utilisant des BIGINT signs ou des valeurs DOUBLE. Il est donc recommand de ne pas utiliser de grands entiers non-signs dont la taille dpasse 9223372036854775807 (63 bits), hormis avec les fonctions sur les bits! Si vous fates cela, les derniers chiffres du rsultats risquent d'tre faux, cause des erreurs d'arrondis lors de la conversion de BIGINT en DOUBLE. MySQL 4.0 peut grer des BIGINT dans les cas suivants : Utiliser des entiers pour stocker des grandes valeurs entires non signes, dans une colonne de type BIGINT. Avec MIN(big_int_column) et MAX(big_int_column). Avec les oprateurs (+, -, *, etc.) o tous les oprandes sont des entiers. Vous pouvez toujours stocker une valeur entire exacte BIGINT dans une colonne de type chane. Dans ce cas, MySQL fera des conversions chane / nombre, qui n'utilisera pas de reprsentation intermdiaire en nombre rels.
510
-, + et * utiliseront l'arithmtique entire des BIGINT lorsque les deux arguments sont des entiers. Cela signifie que si vous multipliez deux entiers (ou des rsultats de fonctions qui retournent des entiers), vous pourriez rencontrer des rsultats inattendus lorsque le rsultat est plus grand que 9223372036854775807. FLOAT(precision) [UNSIGNED] [ZEROFILL] Un nombre virgule flottante. precision peut valoir <=24 pour une prcision simple, et entre 25 et 53 pour une prcision double. Ces types sont identiques aux types FLOAT et DOUBLE, dcrit cidessous. FLOAT(X) a le mme intervalle de validit que FLOAT et DOUBLE, mais la taille d'affichage et le nombre de dcimales est indfini. En MySQL version 3.23, c'est un vritable nombre virgule flottante. Dans les versions antrieures, FLOAT(precision) avait toujours 2 dcimales. Notez qu'utiliser FLOAT peut vous donner des rsultats inattendus, car tous les calculs de MySQL sont fait en double prcision. See Section A.5.7, Rsoudre les problmes des lignes non retournes . Cette syntaxe est fournie pour assurer la compatibilit avec ODBC. Utiliser des FLOAT peut vous donner des rsultats inattendus, car les calculs sont fait en prcision double. See Section A.5.7, Rsoudre les problmes des lignes non retournes . FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] Un petit nombre virgule flottante, en prcision simple. Les valeurs possibles vont de -3.402823466E+38 -1.175494351E-38, 0, et 1.175494351E-38 3.402823466E+38. Si UNSIGNED est spcifi, les valeurs ngatives sont interdites. L'attribut M indique la taille de l'affichage, et D est le nombre de dcimales. FLOAT sans argument et FLOAT(X) (o X est dans l'intervalle 0 24) reprsente les nombres virgule flottante en prcision simple. DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] Un nombre virgule flottante, en prcision double. Les valeurs possibles vont de -1.7976931348623157E+308 -2.2250738585072014E-308, 0, et 2.2250738585072014E-308 1.7976931348623157E+308. Si UNSIGNED est spcifi, les valeurs ngatives sont interdites. L'attribut M indique la taille de l'affichage, et D est le nombre de dcimales. DOUBLE sans argument et FLOAT(X) (o X est dans l'intervale 25 to 53) reprsente les nombres virgule flottante en prcision double. DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL] Ce sont des synonymes pour DOUBLE. Exception : si le serveur SQL utilise l'option REAL_AS_FLOAT, REAL est alors un synonyme de FLOAT plutt que DOUBLE. DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] Un nombre virgule flottante littral. Il se comporte comme une colonne de type CHAR: ``littral'' (``unpacked'') signifie que le nombre est stock sous forme de chane : chaque caractre reprsente un chiffre. La virgule dcimale et le signe moins - des nombres ngatifs ne sont pas compts dans M (mais de l'espace leur est rserv). Si D vaut 0, les valeurs n'auront pas de virgule dcimale ou de partie dcimale. L'intervale de validit du type DECIMAL est le mme que DOUBLE, mais le vrai intervalle de validit de DECIMAL peut tre restreint par le choix de la valeur de M et D. Si UNSIGNED est spcifi, les valeurs ngatives sont interdites. Si D est omis, la valeur par dfaut est 0. Si M est omis, la valeur par dfaut est 10.
511
Avant MySQL Version 3.23, l'argument M devait inclure l'espace ncessaire pour la virgule et le signe moins. DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL] Ce sont des synonymes pour DECIMAL. L'alias FIXED a t ajout en version 4.1.0 pour assurer la compatibilit avec les autres serveurs.
512
YEAR[(2|4)] Une anne, au format 2 ou 4 chiffres (par dfaut, c'est 4 chiffres). Les valeurs possibles vont de 1901 2155 plus 0000 pour le format 4 chiffres, et de 1970 2069 si vous utilisez le format 2 chiffres. MySQL affiche les valeurs YEAR au format YYYY mais vous permet d'assigner des valeurs en utilisant des nombres ou des chanes. Le type YEAR n'est pas disponible avant la version 3.22.
Cette dfinition de table cre une colonne appele c1 dont le jeu de caractres est utf8 avec la collation par dfaut de ce jeu de caractres, et une colonne appele c2 qui a le jeu de caractres latin1 et la collation binaire du jeu de caractres. La collation binaire n'est pas sensible la casse. Le tri et les comparaisons de colonnes sont bass sur le jeu de caractres de la colonne. Avant MySQL 4.1, les tris et comparaisons taient fait avec la collation du jeu de caractres du serveur. Pour les colonnes CHAR et VARCHAR, vous pouvez dclarer la colonne avec l'attribut BINARY pour que le tri et la recherche soient insensibles la casse, utilisant le jeu de caractre sous-jacent, plutt qu'un ordre lexical. Pour plus de dtails, voyez Chapitre 10, Jeux de caractres et Unicode. De plus, depuis la version 4.1, MySQL interprte les spcifications de taille d'une colonne en terme de nombre de caractres. Les versions prcdentes interprtaient les tailles en nombre d'octets. [NATIONAL] CHAR(M) [BINARY | ASCII | UNICODE] Une chane de caractre de taille fixe, toujours complt droite par des espaces pour remplir l'espace de stockage. L'intervalle de M va de 0 255 (1 255 pour les versions antrieure la version 3.23). Les espaces terminaux sont supprims lorsque la valeur est relue. Les valeurs CHAR sont tries et compares sans tenir compte de la casse, en utilisant le jeu de caractres par dfaut, moins que le mot cl BINARY ne soit utilis. Note : les espaces terminaux sont supprimes lorsque la valeur est stocke. Depuis la version 4.1.0, si la valeur M est suprieure 255, Une colonne de type TEXT est cre. Ceci est une fonctionnalit de compatibilit. NATIONAL CHAR (sous son quivalent raccourciNCHAR) est le nom SQL-99 pour dfinir une colonne de type CHAR qui utilise le jeu de caractre par dfaut. C'est le comportement par dfaut de MySQL. CHAR est un raccourci pour CHARACTER. 513
Depuis la version 4.1.0, l'attribut ASCII peut tre spcifie avec, pour assigner le jeu de caractre latin1 une colonne de type CHAR. Depuis la version 4.1.1, l'attribut UNICODE peut tre spcifi pour assigner le jeu de caractres ucs2 une colonne CHAR. MySQL permet la cration d'une colonne de type CHAR(0). Ceci est principalement utile dans de vieille application, qui ont besoin de la colonne, mais n'ont pas besoin de la valeur. C'est aussi pratique pour avoir une colonne deux valeurs : un CHAR(0), qui n'est pas dfini comme NOT NULL, va occuper un bit, et prendre deux valeurs : NULL ou "". CHAR Ceci est un synonyme de CHAR(1). [NATIONAL] VARCHAR(M) [BINARY] Une chane de taille dynamique. M reprsente la taille maximale de la valeur dans une colonne. L'intervalle de M va de 0 255 caractres (1 255 avant MySQL 4.0.2). Note : les espaces terminaux sont supprimes lorsque la valeur est stocke (cela diffre des spcifications de SQL-99). Depuis la version 4.1.0, si la valeur M est suprieure 255, Une colonne de type TEXT est cre. Ceci est une fonctionnalit de compatibilit. Par exemple une colonne VARCHAR(500) est convertie en TEXT, et VARCHAR(200000) est convertie en MEDIUMTEXT. Attention, cette conversion affecte la suppression des espaces finaux... VARCHAR est un raccourci pour CHARACTER VARYING. TINYBLOB, TINYTEXT Une colonne TINYBLOB ou TINYTEXT peut contenir au maximum 255 (2^8 1) caractres. BLOB, TEXT Une colonne TEXT ou BLOB peut contenir au maximum 65535 (2^16 1) caractres. MEDIUMBLOB, MEDIUMTEXT Une colonne MEDIUMTEXT ou MEDIUMBLOB peut contenir au maximum 16777215 (2^24 1) caractres. LONGBLOB, LONGTEXT Une colonne LONGTEXT ou LONGBLOB peut contenir au maximum 4294967295 ou 4 Go (2^32 1) caractres. Jusqu'en version 3.23 le protocole client/serveur et les tables MyISAM avait une limite de 16 Mo par paquet de communication pour une ligne de table. Depuis les versions 4.x, la taille maximale d'un LONGTEXT ou LONGBLOB dpend de la taille maximal de paquet de communication pour le protocole de communication, et de la mmoire disponible. ENUM('value1','value2',...) Une numration. Un objet chane qui peut prendre une valeur, choisie parmi une liste de valeurs 'valeur1', 'valeur2', ..., NULL ou la valeur spciale d'erreur "". Une valeur ENUM peut avoir un maximum de 65535 valeurs distinctes. SET('value1','value2',...) Un ensemble. Un objet chane, qui peut prendre zro, une ou plusieurs valeurs, choisies parmi une liste de valeurs 'valeur1', 'valeur2', ... Une valeur SET peut avoir un maximum de 64 membres.
514
Types numriques
Dans cet exemple, 5 (prcision) reprsente le nombre de dcimales signifiantes qui seront stockes pour les valeurs, et 2 (chelle) reprsente le nombre de chiffres qui seront stocks aprs le point des dcimales. Les valeurs de type DECIMAL et NUMERIC sont stockes sous forme de chanes de caractres, plutt que comme des nombres virgule flottante, afin de prserver la prcision dcimale des valeurs. Un caractre est donc ncessaire pour chaque chiffre, plus la virgule (si scale > 0), et le signe moins - (pour les nombres ngatifs). Si scale vaut 0, les valeurs de type DECIMAL et NUMERIC ne comporteront pas de valeur dcimale, ni de virgule. Les standards SQL requirent que la colonne salary soit capable de stocker toute valeur de 5 chiffres et 2 dcimales. Dans ce cas, l'intervalle de valeur qui peut tre stocke dans la colonne salary va de -999.99 et 999.99. MySQL dvie de cette spcification de deux manires : A la limite suprieure de l'intervalle, la colonne peut stocker les nombres jusqu' 9999.99. Pour les nombres positifs, MySQL utilise l'octet rserv au signe pour tendre la limite suprieure. Les colonnes DECIMAL de MySQL avant 3.23 sont stocks diffremment et ne peuvent pas reprsenter toutes les valeurs requises par le standard SQL. Ceci est d au fait que pour DECIMAL(M,D), la valeur de M inclut les octets pour le signe et le point dcimal. L'intervalle de la colonne salary avant MySQL 3.23 serait de -9.99 99.99. Avec les standards SQL, la syntaxe DECIMAL(p) est quivalente DECIMAL(p,0). De manire similaire, la syntaxe DECIMAL est quivalente DECIMAL(p,0), o l'implmentation est autorise choisir la valeur de p. Depuis MySQL 3.23.6, ces deux variantes de DECIMAL et NUMERIC sont supportes. La valeur par dfaut de M est 10. Avant la version 3.23.6, M et D devaient tre spcifi explicitement. L'intervalle de validit maximal des valeurs de type DECIMAL et NUMERIC est le mme que pour le type DOUBLE, mais l'intervalle rel peut tre limit par le choix des paramtres prcision et scale. Lorsqu'une valeur ayant trop de dcimales est affecte une colonne, la valeur est arrondie scale dcimales. Lorsqu'une valeur est hors des limites de validit de la colonne DECIMAL ou NUMERIC, MySQL enregistre la plus grande valeur qu'il peut la place. En extension de la norme ANSI/ISO SQL92, MySQL supporte aussi les types entiers TINYINT, MEDIUMINT, et BIGINT, comme prsent ci-dessus. Un autre extension supporte par MySQL permet de spcifier optionnellement la taille d'affichage, sous la forme d'une valeur entire entre parenthses, juste aprs le mot cl spcifiant le type (par exemple, INT(4)). Cette spcification de taille est utilise pour remplir gauche, avec le caractre de remplissage par dfaut, les nombres dont la taille est infrieure celle spcifie mais uniquement l'affichage : cela ne rduit pas l'intervalle de validit des valeurs qui peuvent tre stockes dans la colonne. Lorsqu'elle est utilise avec l'attribut de colonne optionnel ZEROFILL, le caractre de remplissage par dfaut est remplac par le caractre zro. Par exemple, pour une colonne dont le type est INT(5) ZEROFILL, la valeur 4 sera lue 00004.
515
Notez que si vous stockez des nombres plus grands que la taille maximale d'affichage, vous pouvez rencontrer des problmes lors de jointures de tables particulirement compliques, surtout si MySQL gnre des tables temporaires : dans ce cas, MySQL pense que les donnes taient limites par l'affichage. Tous les types entiers ont un attribut optionnel (non-standard) UNSIGNED (non-sign, en franais). Les valeurs non-signes peuvent tre utilises pour n'autoriser que des valeurs positives dans une colonne, ou bien pour exploiter un intervalle de validit plus haut. Depuis la version 4.0.2 de MySQL, les nombres virgule flottante peuvent aussi tre UNSIGNED Comme avec les types entiers, cet attribut interdit les valeurs ngatives dans la colonne, mais n'lve pas l'intervalle de validit. Le type FLOAT est utilis pour reprsenter des donnes numriques approches. La norme ANSI/ ISO SQL92 permet la spcification optionnelle de la prcision (mais pas de l'intervalle de validit) en fournissant le nombre de dcimales voulues aprs la spcification de type, et entre parenthses. L'implmentation de MySQL supporte aussi le paramtrage de la prcision. Si le mot cl FLOAT est utilis pour une colonne sans prcision supplmentaire, MySQL utilise quatre octets pour stocker les valeurs. Une syntaxe alternative existe aussi, elle utilise deux paramtre optionnel aprs le mot cl FLOAT. Avec cette option, le premier nombre reprsente toujours la taille de stockage ncessaire pour la valeur, et le second nombre reprsente le nombre de chiffres stocker et afficher, aprs la virgule dcimale (comme pour les types DECIMAL et NUMERIC). Lorsque MySQL stocke un nombre pour une telle colonne, et que cette valeur a plus de dcimale que requis, la valeur est arrondie pour liminer les chiffres surnumraires. Les types REAL et DOUBLE PRECISION n'acceptent pas de paramtrage de la prcision. En extension du standard ANSI/ISO SQL92, MySQL reconnat DOUBLE comme un synonyme du type DOUBLE PRECISION. Contrairement la norme qui requiert que REAL soit plus petit que DOUBLE PRECISION, MySQL implmente ces deux types comme des nombres virgule flottante de 8 octets, en double prcision (lorsque le mode ``ANSI'' n'est pas activ). Pour une portabilit maximale, les applications rclamant le stockage de nombres approch doivent utiliser les types FLOAT ou DOUBLE PRECISION sans spcification de prcision ou de nombre de dcimales. Lorsque MySQL doit stocker une valeur qui est hors de l'intervalle de validit d'une colonne, il ramne la valeur la plus proche possible, et stocke cette valeur. Par exemple, l'intervalle de validit d'une colonne d'entiers INT va de -2147483648 2147483647. Si vous essayez d'insrer -9999999999 dans une colonne de ce type, la valeur sera ramene la plus proche possible, c'est dire -2147483648. De mme, si vous essayez d'insrer 9999999999, 2147483647 sera stock la place. Si la colonne INT possde l'attribut UNSIGNED, l'intervalle de validit est aussi large, mais les valeurs extrmes se dcalent vers 0 et 4294967295. Si vous essayez de stocker -9999999999 et 9999999999 dans cette colonne, vous obtiendrez respectivement 0 et 4294967296. Les dpassements de capacit entranant des troncatures sont affichs comme des alertes (``warnings'') lors de l'utilisation des commandes ALTER TABLE, LOAD DATA INFILE, UPDATE, et les insertions INSERT multiples. Type TINYINT SMALLINT MEDIUMINT INT BIGINT Octets 1 2 3 4 8 De -128 -32768 -8388608 -2147483648 -9223372036854775808 A 127 32767 8388607 2147483647 9223372036854775807
516
par exemple 1999-11-31. La raison est que nous pensons que la vrification des dates est faire niveau application. Pour acclrer les tests, MySQL vrifie juste que le mois est entre 0 et 12 et que le jour est entre 0 et 31. Les intervalles prcdentes sont dfinies de cette faon car MySQL vous permet d'enregistrer dans une colonne DATE ou DATETIME, des dates o le jour de la semaine ou le jour du mois est zro. C'est extrmement utile pour les applications o vous avez besoin d'enregistrer une date d'anniversaire pour laquelle vous n'avez pas la date exacte. Dans ce cas, vous enregistrez simplement la date comme 1999-00-00 ou 1999-01-00. (Vous ne devez pas vous attendre obtenir de valeurs correctes de fonctions tel que DATE_SUB() ou DATE_ADD pour des dates comme cela.) Voici quelques considrations garder l'esprit quand vous manipulerez ce type de champs : MySQL extrait les valeurs d'un champ date ou heure dans un format standard, mais essaye d'interprter une grande varits de format pour les valeurs que vous donnez (par exemple, quand vous essayez de comparer ou attribuer une valeur un champ de type date ou heure). Nanmoins, seul les formats dcrits dans les sections suivantes sont disponibles. Il est attendu que vous fournissiez des valeurs lgales et des erreurs imprvues peuvent survenir si vous utilisez d'autre formats. Mme si MySQL essaye d'interpreter les valeurs sous diffrents formats, il s'attend toujours ce que l'anne soit dans la partie gauche de la valeur. Les dates doivent tres donnes sous la forme anne-mois-jour (exemple : 98-09-04), au lieu de mois-jour-anne ou jour-mois-anne qui sont trs utiliss ailleurs (comme 09-04-98 ou '04-09-98'). Les dates reprsentes par deux chiffres pour les annes sont ambigues, car le sicle n'est pas connu. MySQL interprte les annes sur deux chiffres suivant les rgles suivantes : Si l'anne est dans l'intervalle 00-69, elle est convertie en 2000-2069. Si l'anne est dans l'intervalle 70-99, elle est convertie en 1970-1999. MySQL convertit automatiquement une date ou heure en nombre si la valeur est utilise dans un contexte numrique et vice versa. Lorsque MySQL rencontre une valeur hors d'intervalle pour un type date ou heure qui est donc illgale pour ce type (voir le dbut de cette section), il la convertit la valeur ``zro'' de ce type. (L'exception est que les valeurs hors intervalles pour les champs TIME sont coupes la limite approprie des valeurs de TIME.) Le tableau suivant prsente le format de la valeur ``zro'' de chaque type : Column type DATETIME DATE TIMESTAMP TIME YEAR valeur du ``zro'' '0000-00-00 00:00:00' '0000-00-00' 00000000000000 (la longueur dpend de la taille de l'affichage) '00:00:00' 0000
La valeur ``zro'' est spciale, mais vous pouvez l'enregistrer ou vous y rfrer explicitement en utilisant les valeurs contenues dans le tableau ci dessus. Vous pouvez aussi le faire en utilisant la valeur '0' ou 0 qui est plus facile manipuler. La date ou le temps ``Zro'' utilis avec MyODBC est automatiquement convertie en NULL partir de la version 2.50.12 de MyODBC, car ODBC ne peut manipuler de telles valeurs.
517
Le type DATETIME est prvu lorsque vous souhaitez stocker une date et une heure. MySQL affiche les valeurs de type DATETIME au format AAAA-MM-JJ HH:MM:SS. L'intervalle de validit va de 1000-01-01 00:00:00 9999-12-31 23:59:59. (``validit'' signifie que mme si d'autres valeurs plus anciennes peuvent tre manipules, il n'est pas garantit qu'elles le seront). Le type DATE est prvu lorsque vous souhaitez stocker une date. MySQL affiche les valeurs de type DATE au format AAAA-MM-JJ. L'intervalle de validit va de '1000-01-01' '9999-12-31'. La colonne TIMESTAMP a vu ses proprits et comportements voluer avec les versions de MySQL et le mode SQL du serveur. Vous pouvez spcifier les valeurs des colonnes DATETIME, DATE et TIMESTAMP, avec les formats communs suivants : Une chane au format 'AAAA-MM-JJ HH:MM:SS' ou 'AA-MM-JJ HH:MM:SS'. Une syntaxe plus souple est permise : tout caractre de ponctuation peut tre utilis comme dlimiteur entre les parties de temps ou heure. Par exemple, '98-12-31 11:30:45', '98.12.31 11+30+45', '98/12/31 11*30*45', et '98@12@31 11^30^45' sont quivalents. Une chane au format AAAA-MM-JJ ou AA-MM-JJ. Une syntaxe plus flexible est aussi accepte ici. Par exemple, 98-12-31, 98.12.31, 98/12/31, et 98@12@31 sont quivalent. Une chane sans aucun dlimiteurs sous la forme AAAAMMJJHHMMSS ou AAMMJJHHMMSS, en supposant qu'une telle chane ait un sens en terme de date. Par exemple 19970523091528 et 970523091528 sont interprts comme 1997-05-23 09:15:28, mais 971122129015 est invalide (les minutes ne sont pas valides) et devient alors '0000-00-00 00:00:00'. Une chane sans aucun dlimiteurs sous la forme AAAAMMJJ ou AAMMJJ, en supposant qu'une telle chane ait un sens en terme de date. Par exemple, 19970523 et 970523 sont interprts comme 1997-05-23, mais 971332 est invalide (les mois ne sont pas valides) et devient alors 0000-00-00. Un nombre au format AAAAMMJJHHMMSS ou AAMMJJHHMMSS, en supposant qu'un tel nombre ait un sens en terme de date. Par exemple, 19830905132800 et 830905132800 sont interprts comme 1983-09-05 13:28:00. Un nombre au format AAAAMMJJ ou AAMMJJ en supposant qu'un tel nombre ait un sens en terme de date. Par exemple, 19830905 et 830905 sont interprts comme 1983-09-05. Un rsultat de fonction qui retourne une valeur acceptable dans une colonne de type DATETIME, DATE, ou TIMESTAMP, tels que NOW() ou CURRENT_DATE. Les valeurs invalides DATETIME, DATE, ou TIMESTAMP sont remplaces par la date ``zro'' du type appropri (respectivement 0000-00-00 00:00:00, 0000-00-00, ou 00000000000000). Pour la valeurs spcifies sous forme de chanes avec des dlimiteurs de date, il n'est pas ncessaire de spcifier les deux chiffres pour les mois ou les dates qui sont infrieurs 10. Par exemple, 1979-6-9 est valide et est quivalent 1979-06-09. Similairement, pour les valeurs spcifies sous forme de chane avec des dlimiteurs d'heure, il n'est pas obligatoire de spcifier les deux chiffres des heures, minutes et secondes qui sont infrieures 10. 1979-10-30 1:2:3 est valide et est quivalent '1979-10-30 01:02:03'. Les valeurs spcifies sous forme de nombres doivent avoir 6, 8, 12, ou 14 chiffres de long. Si le nombre a 8 ou 14 chiffres, MySQL suppose que le format est AAAAMMJJ ou AAAAMMJJHHMMSS (respectivement) et que l'anne est reprsentes par les 4 premiers chiffres. Si le nombre a 6 ou 12 chiffres, MySQL suppose que le format est AAMMJJ ou AAMMJJHHMMSS (respectivement) et format et que l'anne est reprsentes par les 2 premiers chiffres. Les nombres qui ne sont pas d'une taille valide, sont complts avec des 0 jusqu' la taille lisible la plus proche. Les valeurs spcifies sous forme de chanes sans dlimiteurs sont interprts en fonction de leur taille. Si la chane 8 ou 14 caractres de long, l'anne est suppose avoir 4 chiffres. Sinon, l'anne
518
est suppose avoir 2 chiffres. La chane est interprte de gauche droite, en lisant successivement l'anne, le mois, la date, l'heure, les minutes et les secondes, tant qu'il y a des valeurs dans la chane. Cela signifie que vous ne devez pas utiliser de chanes qui ont moins de 6 caractres. Par exemple, si vous spcifiez 9903, en pensant qu'il reprsente Mars 1999, vous vous apercevrez que MySQL insre la place la date ``zro'' dans votre table. Cela est d au fait que si l'anne et le mois sont 99 et 03, la date est 0, ce qui en fait une date invalide, qui est rejete par MySQL. Dans une certaines mesure, vous pouvez assigner des valeurs d'une colonne une autre colonne d'un autre type. Cependant, vous devez vous attendre quelques altration ou pertes de valeurs durant la conversion : Si vous assignez une valeur DATE une colonne de type DATETIME ou TIMESTAMP, la partie reprsentant les heures vaudra 00:00:00, car les colonnes de type DATE ne contiennent pas d'information d'heure. Si vous assignez une valeur DATETIME ou TIMESTAMP une colonne de type DATE, la composante heure sera perdue, car les colonnes de type DATE ne contiennent pas d'information d'heure. N'oubliez pas que mme si les valeurs DATETIME, DATE, et TIMESTAMP peuvent tre spcifie avec diffrents formats, ces types n'ont pas les mmes intervalle de validit. Par exemple, les valeurs de type TIMESTAMP ne peuvent pas prendre de valeur antrieure 1970 ou postrieure 2037. Cela signifie qu'une date telle que 1968-01-01, est lgale dans les colonnes de type DATETIME, mais n'est pas valide pour les TIMESTAMP, et sera convertie en date zro (0) si elle est assigne une telle colonne. Attention certains piges concernant les spcifications de dates : La syntaxe dlimiteur libre peut tre une source de problme. Par exemple, une valeur telle que 10:11:12 ressemble une heure, cause du dlimiteur `:', mais avec une colonne de date, elle sera interprte comme la date 2010-11-12. La valeur 10:45:15 sera convertie en 0000-00-00 car 45 n'est pas un mois valide. Le serveur MySQL effectue seulement la vrification de base la validit d'une date : jours 00-31, mois 00-12, annes 1000-9999. N'importe quelle date qui n'est pas dans cette marge retournera 0000-00-00. Veuillez noter que ceci vous permet toujours de stocker les dates inadmissibles telles que 2002-04-31. Il permet des applications web de stocker des donnes d'une forme sans vrifier plus loin. Pour s'assurer qu'une date est valide, vous devrez effectuer un test dans votre application. Les annes spcifie avec deux chiffres seulement sont ambigus, car il manque le sicle. MySQL interprte les annes deux chiffres suivant ces rgles : Les annes de l'intervalle 00-69 sont converties en 2000-2069. Les annes de l'intervalle 70-99 sont converties en 1970-1999.
519
la colonne sera ignore, et la colonne TIMESTAMP ne sera pas modifie, car la ligne n'est pas proprement parle modifie. MySQL ignore alors ces modifications pour des raisons d'efficacit). Les autres colonnes de type TIMESTAMP, hormis la premire, peuvent aussi prendre la valeur courante. Affectez-lui alors la valeur NULL ou la fonction NOW(). Vous pouvez affecter n'importe quelle colonne de type TIMESTAMP une valeur diffrente de l'heure et la date courant en fournissant une valeur explicite. Cela s'applique aussi la premire colonne de type TIMESTAMP. Par exemple, si vous voulez affecter la date de cration d'une ligne une colonne de type TIMESTAMP, mais ne plus y toucher ultrieurement : Laissez MySQL donner la valeur de la colonne lors de la cration de la ligne. Cela va initialiser la colonne la date et heure courante. Lorsque vous faites des modifications ultrieures, affectez explicitement la colonne TIMESTAMP sa propre valeur.
UPDATE tbl_name SET timestamp_col = timestamp_col, other_col1 = new_value1, other_col2 = new_value2, ...
D'un autre cot, vous pouvez aussi facilement initialiser la colonne TIMESTAMP avec NOW() lors de sa cration, puis ne plus la modifier ultrieurement. L'intervalle de validit des valeurs TIMESTAMP va du dbut de l'anne 1970 jusque quelque part durant l'anne 2037, avec une prcision d'une seconde. Les valeurs sont affichs comme des nombres entiers. Le format d'affichage des valeurs TIMESTAMP dpend de la taille d'affichage, comme illustr cidessous. Le format total TIMESTAMP a 14 chiffres, mais les colonnes TIMESTAMP peuvent tre cres avec des formats plus courts : Type de colonne TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(10) TIMESTAMP(8) TIMESTAMP(6) TIMESTAMP(4) TIMESTAMP(2) Format d'affichage YYYYMMDDHHMMSS YYMMDDHHMMSS YYMMDDHHMM YYYYMMDD YYMMDD YYMM YY
Toutes les colonnes de type TIMESTAMP ont la mme taille de stockage, indpendamment de la taille d'affichage. Les formats les plus courants sont 6, 8, 12, et 14. Vous pouvez spcifier une taille arbitraire lors de la cration de la table, mais 0 et les valeurs suprieures 14 sont ramenes 14. Les valeurs impaires sont aussi ramenes au nombre pair suprieur. Les colonnes TIMESTAMP stockent une date valide, en utilisant la totalit de l'espace de stockage, quelque soit la valeur de l'affichage. Cela a les implication suivantes : Spcifiez toujours l'anne, le mois et le jour, mme si le type de colonne est TIMESTAMP(4) ou TIMESTAMP(2). Sinon, la valeur ne sera pas lgale et 0 sera stocke. Si vous utilisez la commande ALTER TABLE pour rduire la largeur d'une colonne TIMESTAMP, les informations qui taient affiches sont dsormais ``caches'', mais pas dtruites. Similairement, rduire une colonne de type TIMESTAMP ne cause aucune perte d'information, en dehors du fait que ces informations ne sont plus affiches.
520
Le type TIME
Bien que les valeurs TIMESTAMP soient stockes avec une prcision d'une seconde, la seule fonction qui travaille directement avec ces valeurs est la fonction UNIX_TIMESTAMP(). Les autres fonctions oprent sur des valeurs lues et formates. Cela signifie que vous ne pouvez pas utiliser de fonctions telles que HOUR() ou SECOND() a moins que le format d'affichage de la valeur TIMESTAMP ne prsente cette valeur. Par exemple, les heures ne sont jamais affiches dans une colonne de type TIMESTAMP moins que la taille d'affichage de la colonne ne soit d'au moins 10. L'utilisation de la fonction HOUR() sur une valeur ayant un format d'affichage plus court que 10 retournera un rsultat inutilisable.
Un client peut mettre le serveur en mode MAXDB pour sa propre connexion avec la commande suivante :
mysql> SET SESSION sql_mode=MAXDB;
521
Le type YEAR
SS, MMSS, HHMMSS et HHMMSS.fraction. Notez que MySQL ne stocke pas encore les fractions de secondes. Le rsultat d'une fonction qui retourne une valeur acceptable dans un contexte de valeurs TIME, comme CURRENT_TIME. Pour les valeurs TIME spcifies avec des dlimiteurs, il n'est pas ncessaire de prciser deux chiffres pour les valeurs infrieurs 10 pour les heures, minutes et secondes. '8:3:2' est la mme chose que '08:03:02'. Soyez soigneux lors de l'utilisation de valeurs ``courtes'' une colonne de type TIME. MySQL interprte les valeurs en supposant que les chiffres de droite reprsentent les secondes (MySQL interprte les valeurs TIME comme des dures et non comme des heures d'une journe). Par exemple, vous pouvez penser que les valeurs '11:12', '1112' et 1112 reprsentent '11:12:00' (12 minutes aprs 11 heures), mais MySQL les interprtera comme '00:11:12' (11 minutes, 12 secondes). Similairement, '12' et 12 reprsentent '00:00:12'. Les valeurs de TIME dclares avec des :, au contraire, sont toujours traits comme des heures de journe. '11:12' signifiera '11:12:00' et non pas 00:11:12 Les valeurs hors de l'intervalle de validit de TIME mais qui sont valides sont ramenes la valeur maximale stockable la plus proche. Par exemple, '-850:00:00' et '850:00:00' sont respectivement converties en '-838:59:59' et '838:59:59'. Les valeurs TIME non valides sont transformes en date zro '00:00:00'. Notez que comme '00:00:00' est elle-mme une valeur TIME valide, vous n'aurez pas le moyen de faire la diffrence entre une valeur '00:00:00' stocke en connaissance de cause, et '00:00:00' stocke cause d'une erreur.
522
chiffres pour reprsenter l'anne est ambigu, car le sicle n'est pas prcis. Ces valeurs doivent tre interprtes comme des valeurs 4 chiffres, car MySQL stocke les annes en interne en utilisant 4 chiffres. Pour les types DATETIME, DATE, TIMESTAMP, et YEAR, MySQL interprte les dates ambigus en se basant sur les rgles suivantes : Les valeurs d'annes comprises dans l'intervalle 00-69 sont converties en 2000-2069. Les valeurs d'annes comprises dans l'intervalle 70-99 sont converties en 1970-1999. Gardez bien l'esprit que ces rgles ne sont que la meilleure approximation possible d'une valeur. Si l'heuristique propose par MySQL ne fournit pas les valeurs attendues, vous devrez fournir une valeur sans ambigut. ( 4 chiffres) ORDER BY ordonnera correctement les types YEAR/DATE/DATETIME deux chiffres. Notez aussi que quelques fonctions comme MIN() et MAX() convertiront un TIMESTAMP/DATE en nombre. Cela signifie qu'un timestamp avec une anne deux chiffres ne donneront pas de rsultats corrects avec ces fonctions. Une solution dans ce cas est de convertir le TIMESTAMP/DATE en une anne 4 chiffres ou d'utiliser quelque chose comme MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).
'abcd' 'abcd'
523
Les valeurs lues dans les colonnes de type CHAR(4) et VARCHAR(4) seront les mmes dans tous les cas, car les espaces finaux sont retirs des valeurs issues de colonnes de type CHAR lors de la lecture. Les valeurs dans les colonnes CHAR et VARCHAR sont classes et compares sans tenir compte de la casse, moins que l'attribut BINARY n'ai t spcifi lors de la cration de la table. L'attribut BINARY signifie que les valeurs sont classes et tries en tenant compte de la casse, suivant l'ordre des caractres ASCII de la machine ou est install le serveur MySQL. BINARY n'affecte pas les mthodes de lecture et de stockage des valeurs. L'attribut BINARY se propage dans une expression : il suffit qu'une seule colonne, utilise dans une expression, ait l'attribut BINARY pour que toute l'expression ne tienne plus compte de la casse. MySQL peut changer automatiquement le type d'une colonne CHAR ou VARCHAR lors de la cration de la table. See Section 13.2.5.1, Modification automatique du type de colonnes .
524
Le type ENUM
Vous pouvez indexer les colonnes de type BLOB ou TEXT partir de la version 3.23.2 de MySQL. Les versions plus anciennes ne peuvent pas indexer ces colonnes. Pour les index des colonnes BLOB et TEXT, vous devez spcifier une taille d'index. Pour les colonnes de type CHAR et VARCHAR, la taille du prfixe est optionnelle. Il n'y a pas de suppression des espaces finaux lors du stockage de valeur dans des colonnes de type BLOB et TEXT, ce qui est le cas dans pour les colonnes de type VARCHAR. Les colonnes BLOB et TEXT ne peuvent avoir de valeur par dfaut. (DEFAULT)
MyODBC considre les valeurs BLOB comme des LONGVARBINARY et les valeurs TEXT comme des LONGVARCHAR. Vous pouvez rencontrer les problmes suivants, cause de la grande taille des colonnes de type BLOB et TEXT, lors de leur utilisation : Si vous voulez utiliser les commandes GROUP BY ou ORDER BY sur une colonne de type BLOB ou TEXT, vous devez d'abord la convertir en un objet de taille fixe. Le meilleur moyen est d'utiliser la fonction SUBSTRING. Par exemple :
mysql> SELECT comment FROM nom_de_table,SUBSTRING(comment,20) AS substr -> ORDER BY substr;
Si vous le ne faites pas, seuls les max_sort_length premiers octets de la colonne seront utiliss pour le tri. La valeur par dfaut de max_sort_length est 1024. Cette valeur peut tre modifie en utilisant l'option -O au dmarrage du serveur mysqld. Vous pouvez utiliser la commande GROUP BY sur une colonne de type BLOB ou TEXT en spcifiant la position de la colonne, ou avec un alias :
mysql> SELECT id,SUBSTRING(blob_col,1,100) FROM nom_de_table GROUP BY 2; mysql> SELECT id,SUBSTRING(blob_col,1,100) AS b FROM nom_de_table GROUP BY b;
La taille maximale d'un objet BLOB ou TEXT est dtermine par son type, mais la valeur la plus grande que vous pouvez transmettre au programme client est dtermine par la quantit de mmoire disponible sur le serveur et par les tailles des buffers de communication. Vous pouvez changer la taille des buffers de communication, mais vous devez le faire sur le serveur et le client en mme temps. See Section 7.5.2, Rglage des paramtres du serveur . Par exemple, mysql et mysqldump vous autorises tous les deux modifier la valeur cliente de max_allowed_packet. Voyez Section 7.5.2, Rglage des paramtres du serveur , Section 8.3, mysql, l'outil en ligne de commande et Section 8.8, mysqldump, sauvegarde des structures de tables et les donnes . Notez que chaque valeur BLOB ou TEXT est reprsente en interne par un objet allou sparment, contrairement tous les autres types de colonne, pour lesquels la place de stockage est alloue une fois pour chaque colonne, lorsque la table est ouverte.
525
Le type SET
Chaque lment de l'numration dispose d'un index : Les valeurs de la liste des valeurs autorises sont indexes partir de 1. L'index de la chane vide (cas d'erreur) est 0. Cela signifie que vous pouvez utiliser la slection suivante pour reprer les valeurs d'numration invalides :
mysql> SELECT * FROM nom_de_table WHERE enum_col=0;
L'index de la valeur NULL est NULL. Par exemple, une colonne cre comme ENUM("un", "deux", "trois") peut prendre n'importe quelle valeur ci-dessous. L'index de chaque valeur est aussi prsent : Valeur NULL "" "un" "deux" "trois" Index NULL 0 1 2 3
Une numration peut avoir un maximum de 65535 lments. A partir de la version 3.23.51, les espaces en dbut et fin de chane sont automatiquement supprims des lments de l'numration ENUM lorsque la table est cre. La casse des lettres est sans importance lors de l'assignation de valeurs dans une numration. Cependant, les valeurs lues dans la base auront la mme casse que celle spcifie lors de la cration de la table. Si vous lisez le contenu d'une numration dans un contexte numrique, l'index de la valeur ENUM sera retourne. Par exemple, vous pouvez lire des valeurs numriques comme ceci :
mysql> SELECT enum_col+0 FROM nom_de_table;
Si vous stockez un nombre dans une colonne de type ENUM, le nombre sera trait comme un index, et la valeur stocke sera celle de l'lment ayant cet index (Attention, cela ne fonctionnera pas avec les commandes LOAD DATA, car cette dernire traite toutes les valeurs comme des chanes). Il est dconseill de stocker des valeurs numriques dans un ENUM car cela engendre des confusions. Par exemple, la colonne suivante est une numration de chanes contenant les valeurs '0', '1' et '2', mais leur valeur numrique est 1, 2 et 3 :
numbers ENUM('0','1','2')
Les valeurs de type ENUM sont tries en fonction de l'ordre des lments, fix la cration de la table (en d'autres termes, les valeurs ENUM sont stockes en fonction de leur index). Par exemple, "a" prcde "b" dans l'numration ENUM("a", "b"), mais "b" prcde "a" dans l'numration ENUM("b", "a"). La chane vide prcde toujours les chanes non vides, et NULL prcde toutes les valeurs. Si vous voulez connatre toutes les valeurs possibles d'une colonne de type ENUM, pensez utiliser cette commande : SHOW COLUMNS FROM nom_de_table LIKE enum_column_name, puis analysez la dfinition de la colonne de type ENUM (deuxime colonne dans le rsultat).
526
Le type SET
plusieurs membres sont dfinies en sparant celles-ci avec des virgules (,). Ce qui fait que la valeur d'un membre de SET ne peut contenir lui mme de virgule. Par exemple, une colonne dfinie en tant que SET("un", "deux") NOT NULL peut avoir l'une de ces valeurs :
"" "un" "deux" "un,deux"
Un SET peut avoir au plus 64 membres. A partir de la version 3.23.51, les espaces en trop sont automatiquement effacs des membres de SET lorsque la table est cre. MySQL enregistre les valeurs de SET numriquement. Le bit de poids faible de la valeur correspond alors au premier lment de la liste. Si vous utilisez une valeur SET dans un contexte numrique, les bits des lments dans cet ensemble seront mis un, et les autres zro. Par exemple, vous pouvez obtenir un entier partir d'un ensemble comme ceci :
mysql> SELECT col_set+0 FROM nom_de_table;
Si un nombre est enregistr dans une colonne SET, les bits un un de ce nombre reprsenteront les lments placs dans cet ensemble. Supposons qu'une colonne est spcifie en tant que SET("a","b","c","d"), les membres ont alors les valeurs suivantes : SET membre a b c d Valeur dcimale 1 2 4 8 Valeur binaire 0001 0010 0100 1000
Si vous assignez 9 cette colonne, cela donne 1001 en binaire, ce qui fait que les valeurs du premier et quatrime membres "a" et "d" sont slectionns et la valeur rsultante est "a,d". Pour les valeurs se composant de plus d'un membre du SET, l'ordre des membres n'a pas d'importance lors des insertions. Le nombre d'occurrence d'un lment n'importe pas non plus. Lorsque la valeur sera lue ultrieurement, chaque lment n'apparatra qu'une seule fois, et dans l'ordre donn la dclaration de la colonne. Par exemple, si une colonne est spcifie comme SET("a","b","c","d"), alors "a,d", "d,a", et "d,a,a,d,d" seront tous reprsents par "a,d". Si vous spcifiez une valeur incorrecte dans une colonne SET, la valeur sera ignore. Les valeurs de SET sont tries numriquement. La valeur NULL prcde toutes les autres. Normalement, vous excuterez un SELECT sur une colonne SET en utilisant l'oprateur LIKE ou la fonction FIND_IN_SET() :
mysql> SELECT * FROM nom_de_table WHERE set_col LIKE '%value%'; mysql> SELECT * FROM nom_de_table WHERE FIND_IN_SET('value',set_col)>0;
La premire requte cherche les lignes qui correspondent exactement. La seconde ne cherche que les lignes contenant le premier membre du set.
527
Si vous voulez connatre toutes les valeurs possible d'une colonne SET, vous devez utiliser : SHOW COLUMNS FROM nom_de_table LIKE nom_colonne_set et tudier la dfinition du SET dans la seconde colonne.
Capacits de stockage des colonnes de temporelles Type de colonne DATE DATETIME TIMESTAMP TIME YEAR Espace requis 3 octets 8 octets 4 octets 3 octets 1 octet
Capacits de stockage des colonnes de texte Type de colonne CHAR(M) VARCHAR(M) TINYBLOB, TINYTEXT BLOB, TEXT MEDIUMBLOB, MEDIUMTEXT LONGBLOB, LONGTEXT Espace requis M octets, 1 <= M <= 255 L+1 octets, avec L <= M et 1 <= M <= 255 L+1 octets, avec L < 2^8 L+2 octets, avec L < 2^16 L+3 octets, avec L < 2^24 L+4 octets, avec L < 2^32
ENUM('valeur1','valeur2',...) 1 ou 2 octets, suivant le nombre d'lments de l'numration (65535 au maximum) SET('valeur1','valeur2',...) 1, 2, 3, 4 ou 8 octets, suivant le nombre de membres de l'ensemble (64 au maximum)
Les types VARCHAR, BLOB et TEXT sont de longueur variable, et l'espace disque requis dpend de la taille relle de la valeur prsente dans la colonne, (taille reprsente par L dans le tableau prcdent) et non pas de la taille maximale de la colonne. Par exemple une colonne VARCHAR(10) peut contenir une chane de 10 caractres. L'espace requis est dans ce cas l la longueur de la chane (L), plus 1
528
octet pour enregistrer la longueur de celle ci. Pour la chane 'abcd', L est gal 4 et l'espace requis est de 5 octets. Les types BLOB et TEXT requirent 1, 2, 3, ou 4 octets pour mmoriser la taille de la valeur dans la colonne, suivant la longueur maximale du type. See Section 11.4.3, Les types BLOB et TEXT . Si une table inclus au moins une colonne de taille variable, la ligne sera de taille variable. Notez que lorsqu'une table est cre, MySQL peut, dans certaines circonstances, changer automatiquement une colonne de taille variable en colonne taille fixe (et vice-versa). See Section 13.2.5.1, Modification automatique du type de colonnes . La taille d'un ENUM est dtermine par le nombre d'lments de l'numration. Un octet est ncessaire pour les numrations ayant jusqu' 255 valeurs possibles. Deux octets sont ncessaires pour les numrations ayant jusqu' 65535 valeurs possibles. See Section 11.4.4, Le type ENUM . La taille d'un SET est dtermin par le nombre de ses membres. Si il y en a N, l'objet occupe (N+7)/8 octets, arrondis 1, 2, 3, 4, or 8 octets. Un SET peut avoir au plus 64 membres. See Section 11.4.5, Le type SET . La taille maximale d'une ligne dans une table MyISAM est de 65534 octets. Les colonnes BLOB et TEXT acceptent jusqu' 5-9 octets en dessous de cette taille.
529
La conversion du type de colonnes s'effectue lors de la cration. Si vous crez une table avec des types issus d'un autre SGBDR puis que vous excutez la commande DESCRIBE nom_de_table, MySQL fournira la structure de la table en utilisant les types quivalents.
530
531
12.1.2. Parenthses
( ... ) Utilisez les parenthses pour forcer l'ordre des valuations dans une expression. Par exemple :
mysql> SELECT 1+2*3; -> 7 mysql> SELECT (1+2)*3; -> 9
532
Oprateurs de comparaison
Dans tous les autres cas, les arguments sont compars en tant que nombres dcimale flottante. (rels) Par dfaut, la comparaison des chanes s'effectue d'une faon insensible la casse en utilisant le jeu de caractres courant (ISO-8859-1 Latin1 par dfaut, qui fonctionne aussi trs bien pour l'anglais). Si vous comparez des chanes insensibles la chasse, avec les oprateurs standards (=, <>..., mais pas avec LIKE) les espaces terminaux seront ignors (espaces, tabulations et nouvelles lignes).
mysql> SELECT "a" ="A \n"; -> 1
Les exemples suivants, montrent la conversion des chanes en nombres pour les oprations de comparaison :
mysql> SELECT -> 0 mysql> SELECT -> 1 mysql> SELECT -> 0 mysql> SELECT -> 1 1 > '6x'; 7 > '6x'; 0 > 'x6'; 0 = 'x6';
= Egal :
mysql> SELECT -> 0 mysql> SELECT -> 1 mysql> SELECT -> 1 mysql> SELECT -> 0 mysql> SELECT -> 1 1 = 0; '0' = 0; '0.0' = 0; '0.01' = 0; '.01' = 0.01;
<=> Comparaison compatible avec NULL. Cet oprateur fait une comparaison d'galit comme l'oprateur =, mais retourne 1 plutt que NULL si les deux oprandes sont NULL, et 0 plutt que NULL si un oprande est NULL.
mysql> SELECT -> 1, mysql> SELECT -> 1, 1 <=> 1, NULL <=> NULL, 1 <=> NULL; 1, 0 1 = 1, NULL = NULL, 1 = NULL; NULL, NULL
533
Oprateurs de comparaison
IS NULL, IS NOT NULL Tester si une valeur est ou n'est pas NULL:
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0 0 1 mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1 1 0
Pour tre compatible avec les autres programmes, MySQL gre les appels qui utilisent IS NULL de la faon suivante : Vous pouvez trouver le dernier enregistrement insr en utilisant :
SELECT * FROM nom_de_table WHERE auto_col IS NULL
Cela peut tre interdit en mettant SQL_AUTO_IS_NULL=0. See Section 13.5.2.8, Syntaxe de SET . Pour les colonnes NOT NULL DATE et DATETIME, vous pouvez slectionner lignes ayant la date spciale 0000-00-00 avec :
SELECT * FROM nom_de_table WHERE date_column IS NULL
C'est une fonctionnalit ncessaire pour que certaines applications ODBC fonctionnent (car ODBC ne supporte pas les dates 0000-00-00) expression BETWEEN min AND max Si expression est suprieure ou gale min et expression est infrieure ou gale max, BETWEEN retourne 1, sinon 0. Ceci est quivalent l'expression (min <= expression AND expression <= max) si tous les arguments sont du mme type. Dans tous les autres cas, la conversion de type prends place, selon les rgles suivantes, mais applique aux trois arguments. Notez que avant la 4.0.5, les arguments taient convertis au type de expr.
mysql> SELECT -> 0 mysql> SELECT -> 1 mysql> SELECT -> 1 mysql> SELECT -> 0 1 BETWEEN 2 AND 3; 'b' BETWEEN 'a' AND 'c'; 2 BETWEEN 2 AND '3'; 2 BETWEEN 2 AND 'x-3';
534
Oprateurs de comparaison
Mme chose que NOT (expr BETWEEN min AND max). COALESCE(list) Retourne le premier lment non-NULL de la liste :
mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
GREATEST(value1,value2,...) Avec deux ou plusieurs arguments, retourne la valeur la plus grande. Les arguments sont compars en utilisant les mmes rgles que pour LEAST().
mysql> SELECT GREATEST(2,0); -> 2 mysql> SELECT GREATEST(34.0,3.0,5.0,767.0); -> 767.0 mysql> SELECT GREATEST('B','A','C'); -> 'C'
Avant MySQL 3.22.5, vous pouvez utiliser MAX() au lieu de GREATEST(). expr IN (valeur,...) Retourne 1 si expr est l'une des valeurs dans la liste IN, sinon retourne 0. Si toutes les valeurs sont des constantes, toutes les valeurs sont values avec le type de expr et tries. La recherche de l'lment est alors faite en utilisant la recherche binaire. Cela signifie que IN est trs rapide si les valeurs contenues dans la liste IN sont toutes des constantes. Si expr est une chane sensible la casse, la comparaison est faite dans un contexte sensible la casse :
mysql> SELECT 2 IN (0,3,5,'wefwf'); -> 0 mysql> SELECT 'wefwf' IN (0,3,5,'wefwf'); -> 1
Depuis MySQL version 4.1, une clause IN() peut aussi contenir une sous-requte. See Section 13.1.8.3, Sous-requtes avec les clauses ANY, IN et SOME . expr NOT IN (value,...) Mme chose que NOT (expr IN (valeur,...)). ISNULL(expr) Si expr est NULL, ISNULL() retourne 1, sinon il retourne 0:
mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1
Notez que la comparaison de deux valeurs NULL en utilisant = donnera toujours false ! INTERVAL(N,N1,N2,N3,...) Retourne 0 si N < N1, 1 si N < N2 etc... Tous les arguments sont traits en tant qu'entiers. Il est requis que N1 < N2 < N3 < ... < Nn pour que cette fonction fonctionne correctement. Cela est due la recherche binaire utilise (trs rapide) :
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
535
Oprateurs logiques
LEAST(value1,value2,...) Avec deux arguments ou plus, retourne la plus petite valeur. Les arguments sont compars avec les rgles suivantes : Si la valeur retourne est utilise dans un contexte INTEGER ou que tous les arguments sont des entiers, ils sont compars comme des entiers. Si la valeur retourne est utilise dans un contexte REAL ou que tous les arguments sont des entiers, ils sont compars comme des entiers. Si un des arguments est une chane sensible la casse, les arguments sont compars comme des chanes sensibles la casse. Dans les autres cas, les arguments sont compars comme des chanes insensibles la casse.
mysql> SELECT LEAST(2,0); -> 0 mysql> SELECT LEAST(34.0,3.0,5.0,767.0); -> 3.0 mysql> SELECT LEAST('B','A','C'); -> 'A'
Avant MySQL 3.22.5, vous pouvez utiliser MIN() au lieu de LEAST(). Notez que les conversions prcdentes peuvent produire des rsultats tranges dans certains cas limites :
mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED); -> -9223372036854775808
Cela arrive parce que MySQL lit 9223372036854775808.0 dans un contexte d'entier. La reprsentation entire n'est pas suffisante pour contenir la valeur, alors elle est transforme en entier sign.
Le dernier exemple donne 1 car l'expression est value comme (!1)+1. AND, &&
536
AND (ET) logique. Evalue 1 si toutes les oprandes sont diffrentes de zro et de NULL, 0 si l'une des oprandes est 0, dans les autres cas, NULL est retourn.
mysql> SELECT 1 && -> 1 mysql> SELECT 1 && -> 0 mysql> SELECT 1 && -> NULL mysql> SELECT 0 && -> 0 mysql> SELECT NULL -> 0 1; 0; NULL; NULL; && 0;
Notez que pour les versions antrieures la 4.0.5 l'valuation est interrompue lorsque NULL est rencontr, au lieu de continuer tester une ventuelle existence de 0. Cela signifie que dans ces versions, SELECT (NULL AND 0) retourne NULL au lieu de 0. En 4.0.5 le code a t revu pour que le rsultat rponde toujours au normes ANSI tout en optimisant le plus possible. OR, || OR (OU inclusif) logique. Evalue 1 si aucune oprande n'est nulle, NULL si l'une des oprandes est NULL, sinon 0 est retourn.
mysql> SELECT 1 -> 1 mysql> SELECT 1 -> 1 mysql> SELECT 0 -> 0 mysql> SELECT 0 -> NULL mysql> SELECT 1 -> 1 || 1; || 0; || 0; || NULL; || NULL;
XOR XOR (OU exclusif) logique. Retourne NULL si l'une des oprandes est NULL. Pour les oprandes non-NULL, value 1 si un nombre pair d'oprandes est non-nul, sinon 0 est retourn.
mysql> SELECT 1 -> 0 mysql> SELECT 1 -> 1 mysql> SELECT 1 -> NULL mysql> SELECT 1 -> 1 XOR 1; XOR 0; XOR NULL; XOR 1 XOR 1;
a XOR b est mathmatiquement gal (a AND (NOT b)) OR ((NOT a) and b).
537
-> 'oui'
En version 4.0.6 et plus rcent, le rsultat par dfaut de IFNULL(expr1,expr2) est le plus "gnral" des deux expressions, dans l'ordre de type STRING, REAL ou INTEGER. La diffrence avec les anciennes versions de MySQL ne seront notables que si vous crez une table base sur des expressions, ou si MySQL stocke en interne des valeurs issues de IFNULL() dans une table temporaire.
mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test; mysql> DESCRIBE tmp; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | test | varbinary(4) | NO | | | | +-------+--------------+------+-----+---------+-------+
Le type de la colonne test est VARBINARY(4) tandis que dans les versions plus anciennes, vous auriez obtenu un BIGINT. NULLIF(expr1,expr2) Si l'expression expr1 = expr2 est vrai, la fonction retourne NULL sinon elle retourne expr1. Cela revient faire CASE WHEN x = y THEN NULL ELSE x END:
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1
Notez que l'argument expr1 est valu deux fois dans MySQL si les arguments sont gaux. IF(expr1,expr2,expr3) Si l'argument expr1 vaut TRUE (expr1 <> 0 et expr1 <> NULL) alors la fonction IF() retourne l'argument expr2, sinon, elle retourne l'argument expr3. La fonction IF() retourne une valeur numrique ou une chane de caractres, suivant le contexte d'utilisation :
mysql> SELECT IF(1>2,2,3); -> 3 mysql> SELECT IF(1<2,'oui','non'); -> 'oui' mysql> SELECT IF(STRCMP('test','test1'),'non','oui'); -> 'non'
Si l'argument expr2 ou expr3 est explicitement NULL alors le type du rsultat de la fonction IF() est le type de la colonne non NULL. (Ce comportement est nouveau dans MySQL 4.0.3). L'argument expr1 est valu comme un entier, cela signifie que si vous testez un nombre virgule flottante ou une chane de caractres, vous devez utiliser une opration de comparaison :
mysql> SELECT IF(0.1,1,0); -> 0 mysql> SELECT IF(0.1<>0,1,0); -> 1
Dans le premier exemple ci-dessus, IF(0.1) retourne 0 parce que 0.1 est converti en une chane de caractres, ce qui revient tester IF(0). Ce n'est certainement pas ce que vous dsireriez. Dans le second exemple, la comparaison teste si le nombre virgule flottante est diffrent de zro. Le rsultat de cette comparaison sera un entier. Le type de la fonction IF() (ce qui peut tre important s'il est stock dans une table temporaire) est calcul, dans la Version 3.23 de MySQL, comme suit : Expression 538 Valeur retourne
expr2 ou expr3 retourne une chane expr2 ou expr3 retourne un nombre virgule expr2 ou expr3 retourne un entier
Si expr2 et expr3 sont des chanes de caractres, alors le rsultat est insensible la casse si les deux chanes de caractres sont insensibles la casse. (A partir de la version 3.23.51 de MySQL) CASE valeur WHEN [compare-value] THEN rsultat [WHEN [compare-value] THEN rsultat ...] [ELSE rsultat] END, CASE WHEN [condition] THEN rsultat [WHEN [condition] THEN rsultat ...] [ELSE rsultat] END La premire version retourne rsultat si valeur=compare-value. La seconde version retourne le rsultat de la premire condition qui se ralise. Si aucune des conditions n'est ralis, alors le rsultat de la clause ELSE est retourn. Si il n'y a pas de clause ELSE alors NULL est retourn :
mysql> SELECT CASE 1 WHEN 1 THEN "un" WHEN 2 THEN "deux" ELSE "plus" END; -> "un" mysql> SELECT CASE WHEN 1>0 THEN "vrai" ELSE "faux" END; -> "vrai" mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END; -> NULL
Le type de la valeur retourne (INTEGER, DOUBLE ou STRING) est de mme type que la premire valeur retourne (l'expression aprs le premier THEN).
Voir aussi la fonction ORD(). BIN(N) Retourne une chane de caractres reprsentant la valeur binaire de l'argument N, o l'argument N est un nombre de type BIGINT. Cette fonction est un quivalent de CONV(N,10,2). Retourne NULL si l'argument N est NULL.
mysql> SELECT BIN(12); -> '1100'
539
BIT_LENGTH() a t ajout en MySQL 4.0.2. CHAR(N,...) La fonction CHAR() interprte les arguments comme des entiers et retourne une chane de caractres, constitue des caractres, identifis par leur code ASCII. Les valeurs NULL sont ignores :
mysql> SELECT CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> SELECT CHAR(77,77.3,'77.3'); -> 'MMM'
CHAR_LENGTH(str) Retourne le nombre de caractres de la chane str: Un caractre multi-octets compte comme un seul caractre. Cela signifie que pour une chane contenant 5 caractres de 2 octets, LENGTH() retournera 10, alors que CHAR_LENGTH() retournera 5. CHARACTER_LENGTH(str) CHARACTER_LENGTH() est un synonyme de CHAR_LENGTH(). COMPRESS(string_to_compress) Compresse une chane. Cette fonction requiert la prsence de la bibliothque zlib. Sinon, la valeur retourne sera toujours NULL.
mysql> SELECT -> 21 mysql> SELECT -> 0 mysql> SELECT -> 13 mysql> SELECT -> 15 LENGTH(COMPRESS(REPEAT('a',1000))); LENGTH(COMPRESS('')); LENGTH(COMPRESS('a')); LENGTH(COMPRESS(REPEAT('a',16)));
La chane compresse est stocke de cette manire : Les chanes vides sont stockes comme des chanes vides. Les chanes non-vides sont stockes avec 4 octets de plus, indiquant la taille de la chane non compresse, suivie de la chane compresse. Si la chane se termine avec des espaces, un point supplmentaire . est ajout, pour viter que les espaces terminaux soient supprims de la chane. N'utilisez pas les types CHAR ou VARCHAR pour stocker des chanes compresse. Il est mieux d'utiliser un type BLOB. COMPRESS() a t ajout en MySQL 4.1.1. CONCAT(str1,str2,...) Retourne une chane reprsentant la concatnation des arguments. Retourne NULL si un des arguments est NULL. Cette fonction peut prendre plus de 2 arguments. Si un argument est un nombre, il sera converti en son quivalent sous forme de chane de caractres :
mysql> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> SELECT CONCAT('My', NULL, 'QL'); -> NULL mysql> SELECT CONCAT(14.3); -> '14.3'
540
La fonction CONCAT_WS() signifie CONCAT With Separator, c'est--dire "concatnation avec sparateur. Le premier argument est le sparateur utilis pour le reste des arguments. Le sparateur peut tre une chane de caractres, tout comme le reste des arguments. Si le sparateur est NULL, le rsultat sera NULL. Cette fonction ignorera tous les arguments de valeur NULL et vides, hormis le sparateur. Le sparateur sera ajout entre tous les arguments concatner :
mysql> SELECT CONCAT_WS(",","Premier nom","Deuxime nom","Dernier nom"); -> 'Premier nom,Deuxime nom,Dernier nom' mysql> SELECT CONCAT_WS(",","Premier nom",NULL,"Dernier nom"); -> 'Premier nom,Dernier nom'
CONV(N,from_base,to_base) Convertit des nombres entre diffrentes bases. Retourne une chane de caractres reprsentant le nombre N, convertit de la base from_base vers la base to_base. La fonction retourne NULL si un des arguments est NULL. L'argument N est interprt comme un entier, mais peut tre spcifi comme un entier ou une chane de caractres. Le minimum pour la base est 2 et son maximum est 36. Si to_base est un nombre ngatif, N sera considr comme un nombre sign. Dans le cas contraire, N sera trait comme un nombre non-sign. La fonction CONV travaille avec une prcision de 64 bits :
mysql> SELECT CONV("a",16,2); -> '1010' mysql> SELECT CONV("6E",18,8); -> '172' mysql> SELECT CONV(-17,10,-18); -> '-H' mysql> SELECT CONV(10+"10"+'10'+0xa,10,10); -> '40'
ELT(N,str1,str2,str3,...) Retourne str1 si N = 1, str2 si N = 2, et ainsi de suite. Retourne NULL si N est plus petit que 1 ou plus grand que le nombre d'arguments. La fonction ELT() est un complment de la fonction FIELD() :
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo'); -> 'ej' mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo'); -> 'foo'
EXPORT_SET(bits,on,off,[sparateur,[nombre_de_bits]]) Retourne une chane dont tous les bits 1 dans "bit" sont reprsents par la chane "on", et dont tous les bits 0 sont reprsents par la chane "off". Chaque chane est spare par 'sparateur' (par dfaut, une virgule ',') et seul "nombre_de_bits" (par dfaut, 64) "bits" est utilis :
mysql> SELECT EXPORT_SET(5,'Y','N',',',4) -> Y,N,Y,N
FIELD(str,str1,str2,str3,...) Retourne l'index de la chane str dans la liste str1, str2, str3, .... Retourne 0 si str n'est pas trouv. La fonction FIELD() est un complment de la fonction ELT():
mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 2 mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 0
FIND_IN_SET(str,strlist) Retourne une valeur de 1 N si la chane str se trouve dans la liste strlist constitue de N chanes. Une liste de chane est une chane compose de sous-chanes spares par une virgule ,. Si le premier argument est une chane constante et le second, une colonne de type SET, la
541
fonction FIND_IN_SET() est optimise pour utiliser une recherche binaire trs rapide. Retourne 0 si str n'est pas trouv dans la liste strlist ou si la liste strlist est une chane vide. Retourne NULL si l'un des arguments est NULL. Cette fonction ne fonctionne pas correctement si le premier argument contient une virgule , :
mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
HEX(N_or_S) Si l'argument N_OR_S est un nombre, cette fonction retournera une chane de caractre reprsentant la valeur hexadcimale de l'argument N, o l'argument N est de type BIGINT. Cette fonction est un quivalent de CONV(N,10,16). Si N_OR_S est une chane de caractres, cette fonction retournera une chane de caractres hexadcimale de N_OR_S o chaque caractre de N_OR_S est converti en 2 chiffres hexadcimaux. C'est l'inverse de la chane 0xff.
mysql> SELECT HEX(255); -> 'FF' mysql> SELECT HEX("abc"); -> 616263 mysql> SELECT 0x616263; -> "abc"
INSERT(str,pos,len,newstr) Retourne une chane de caractres str, aprs avoir remplac la portion de chane commenant la position pos et de longueur len caractres, par la chane newstr :
mysql> SELECT INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic'
Cette fonction gre les caractres multi-octets. INSTR(str,substr) Retourne la position de la premire occurrence de la chane substr dans la chane de caractres str. Cette fonction est exactement la mme que la fonction LOCATE(), la diffrence que ces arguments sont inverss :
mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0
Cette fonction gre les caractres multi-octets. Dans la version 3.23 de MySQL, cette fonction est sensible la casse, alors que dans la version 4.0 de MySQL, cette fonction sera sensible la casse si l'argument est une chane de caractres binaire. LCASE(str) LCASE() est un synonyme de LOWER(). LEFT(str,len) Retourne les len caractres les plus gauche de la chane de caractres str :
mysql> SELECT LEFT('foobarbar', 5); -> 'fooba'
Retourne la taille de la chane str, mesure en octets. Un caractre multi-octets compte comme un seul caractre. Cela signifie que pour une chane contenant 5 caractres de 2 octets, LENGTH() retournera 10, alors que CHAR_LENGTH() retournera 5.
mysql> SELECT LENGTH('text'); -> 4
LOAD_FILE(file_name) Lit le fichier file_name et retourne son contenu sous la forme d'une chane de caractres. Le fichier doit se trouver sur le serveur qui excute MySQL, vous devez spcifier le chemin absolu du fichier et vous devez avoir les droits en lecture sur celui-ci. Le fichier doit pouvoir tre lisible par tous et doit tre plus petit que max_allowed_packet. Si ce fichier n'existe pas ou ne peut pas tre lu pour diffrentes raisons, la fonction retourne NULL :
mysql> UPDATE tbl_name SET blob_column=LOAD_FILE("/tmp/picture") WHERE id=1;
Si vous n'utilisez pas la version 3.23 de MySQL, vous devez lire le fichier depuis votre application et crer ainsi votre requte INSERT vous-mme, pour mettre jour la base de donnes avec le contenu de ce fichier. Une des possibilits pour raliser ceci, si vous utilisez la bibliothque MySQL+ +, peut tre trouve http://www.mysql.com/documentation/mysql++/mysql++-examples.html. LOCATE(substr,str), LOCATE(substr,str,pos) Retourne la position de la premire occurrence de la chane substr dans la chane de caractres str. Retourne 0 si substr ne se trouve pas dans la chane de caractres str:
mysql> SELECT LOCATE('bar', 'foobarbar'); -> 4 mysql> SELECT LOCATE('xbar', 'foobar'); -> 0 mysql> SELECT LOCATE('bar', 'foobarbar',5); -> 7
Cette fonction gre les caractres multi-octets. Dans la version 3.23 de MySQL, cette fonction est sensible la casse, alors que dans la version 4.0 de MySQL, cette fonction sera sensible la casse si l'argument est une chane de caractres binaire. LOWER(str) Retourne la chane str avec tous les caractres en minuscules, en fonction du jeu de caractres courant (par dfaut, c'est le jeu ISO-8859-1 Latin1) :
mysql> SELECT LOWER('QUADRATIQUE'); -> 'quadratique'
Cette fonction gre les caractres multi-octets. LPAD(str,len,padstr) Retourne la chane de caractres str, complte gauche par la chane de caractres padstr jusqu' ce que la chane de caractres str atteigne len caractres de long. Si la chane de caractres str est plus longue que len' caractres, elle sera raccourcie de len caractres.
mysql> SELECT LPAD('hi',4,'??'); -> '??hi'
LTRIM(str) Retourne la chane de caractres str sans les espaces initiaux : 543
barbar');
MAKE_SET(bits,str1,str2,...) Retourne une liste (une chane contenant des sous-chanes spares par une virgule ,) constitue de chanes qui ont le bit correspondant dans la liste bits. str1 correspond au bit 0, str2 au bit 1, etc... Les chanes NULL dans les listes str1, str2, ... sont ignores :
mysql> SELECT MAKE_SET(1,'a','b','c'); -> 'a' mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); -> 'hello,world' mysql> SELECT MAKE_SET(0,'a','b','c'); -> ''
MID(str,pos,len) MID(str,pos,len) est un synonyme de SUBSTRING(str,pos,len). OCT(N) Retourne une chane de caractres reprsentant la valeur octal de l'argument N, o l'argument N est un nombre de type BIGINT. Cette fonction est un quivalent de CONV(N,10,8). Retourne NULL si l'argument N est NULL:
mysql> SELECT OCT(12); -> '14'
OCTET_LENGTH(str) OCTET_LENGTH() est un synonyme de LENGTH(). ORD(str) Si le premier caractre de la chane str est un caractre multi-octets, la fonction retourne le code de ce caractre, calcul partir du code ASCII retourn par cette formule :
(1st octet * 256) + (2nd octet * 256^2) + (3rd octet * 256^3) ...
Si le premier caractre n'est pas un caractre multi-octet, la fonction retournera la mme valeur que la fonction ASCII() :
mysql> SELECT ORD('2'); -> 50
POSITION(substr IN str) POSITION(substr IN str) est un synonyme de LOCATE(substr,str). QUOTE(str) Echappe les caractres d'une chane pour produire un rsultat qui sera exploitable dans une requte SQL. Les caractres suivants seront prcds d'un anti-slash dans la chane retourne : le guillemet simple ('), l'anti-slash (\), ASCII NUL, et le Contrle-Z. Si l'argument vaut NULL, la valeur retourne sera le mot ``NULL'' sans les guillemets simples. La fonction QUOTE a t ajoute en MySQL version 4.0.3.
mysql> SELECT QUOTE("Don't"); -> 'Don\'t!' mysql> SELECT QUOTE(NULL); -> NULL
544
REPEAT(str,count) Retourne une chane de caractres constitue de la rptition de count fois la chane str. Si count <= 0, retourne une chane vide. Retourne NULL si str ou count sont NULL :
mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
REPLACE(str,from_str,to_str) Retourne une chane de caractres str dont toutes les occurrences de la chane from_str sont remplaces par la chane to_str :
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com'
Cette fonction gre les caractres multi-octets. REVERSE(str) Retourne une chane dont l'ordre des caractres est l'inverse de la chane str :
mysql> SELECT REVERSE('abc'); -> 'cba'
Cette fonction gre les caractres multi-octets. RIGHT(str,len) Retourne les len caractres les plus droite de la chane de caractres str :
mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'
Cette fonction gre les caractres multi-octets. RPAD(str,len,padstr) Retourne la chane de caractres str, complte droite par la chane de caractres padstr jusqu' ce que la chane de caractres str atteigne len caractres de long. Si la chane de caractres str est plus longue que len' caractres, elle sera raccourcie de len caractres.
mysql> SELECT RPAD('hi',5,'?'); -> 'hi???'
Cette fonction gre les caractres multi-octets. SOUNDEX(str) Retourne la valeur Soundex de la chane de caractres str. Deux chanes qui ont des sonorits proches auront des valeurs soundex proches. Une chane Soundex standard possde 4 caractres, mais la fonction SOUNDEX() retourne une chane de longueur arbitraire. Vous pouvez utiliser la fonction SUBSTRING() sur ce rsultat pour obtenir une chane Soundex standard. Tout caractre non alpha-numrique sera ignor. Tous les caractres internationaux qui ne font pas partie de l'alphabet de base (A-Z) seront considrs comme des voyelles :
mysql> SELECT SOUNDEX('Hello'); -> 'H400' mysql> SELECT SOUNDEX('Quadratically');
545
-> 'Q36324'
Note : cette fonction implmente l'algorithme soundex original, et non la version populaire amliore (aussi dcrite par D. Knuth). La diffrence est que la version originale supprime les voyelles, puis les doublons, alors que la version amliore supprime les doublons d'abord, et ensuite, les voyelles. expr1 SOUNDS LIKE expr2 Identique SOUNDEX(expr1)=SOUNDEX(expr2) (disponible depuis la version 4.1). SPACE(N) Retourne une chane constitue de N espaces :
mysql> SELECT SPACE(6); -> ' '
SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len) Retourne une chane de len caractres de long de la chane str, partir de la position pos. La syntaxe ANSI SQL92 utilise une variante de la fonction FROM :
mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica'
Cette fonction gre les caractres multi-octets. SUBSTRING_INDEX(str,delim,count) Retourne une portion de la chane de caractres str, situe avant count occurrences du dlimiteur delim. Si l'argument count est positif, tout ce qui prcde le dlimiteur final sera retourn. Si l'argument count est ngatif, tout ce qui suit le dlimiteur final sera retourn :
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com'
Cette fonction gre les caractres multi-octets. TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) Retourne la chane de caractres str dont tous les prfixes et/ou suffixes remstr ont t supprims. Si aucun des spcificateurs BOTH, LEADING ou TRAILING sont fournis, BOTH est utilis comme valeur par dfaut. Si remstr n'est pas spcifi, les espaces sont supprims :
mysql> SELECT TRIM(' bar '); -> 'bar' mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); -> 'barxxx' mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); -> 'bar' mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); -> 'barx'
Cette fonction gre les caractres multi-octets. UCASE(str) UCASE() est un synonyme de UPPER(). 546
UNCOMPRESS(string_to_uncompress) Dcompresse une chane compresse avec COMPRESS(). Si l'argument n'est pas une valeur compresse, le rsultat est NULL. Cette fonction requiert la bibliothque zlib. Sinon, la valeur retourne est toujours NULL.
mysql> SELECT UNCOMPRESS(COMPRESS('any string')); -> 'any string' mysql> SELECT UNCOMPRESS('any string'); -> NULL
UNCOMPRESS() a t ajoute en MySQL 4.1.1. UNCOMPRESSED_LENGTH(compressed_string) Retourne la taille de la chane avant compression.
mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30))); -> 30
UNCOMPRESSED_LENGTH() a t ajoute en MySQL 4.1.1. UNHEX(str) Le contraire de HEX(string). C'est dire, chaque pair de chiffres hexadcimaux sont interprtes comme des nombres, et sont convertis en un caractre reprsent par le nombre. Le rsultat est retourne sous forme de chane binaire.
mysql> SELECT UNHEX('4D7953514C'); -> 'MySQL' mysql> SELECT 0x4D7953514C; -> 'MySQL' mysql> SELECT UNHEX(HEX('string')); -> 'string' mysql> SELECT HEX(UNHEX('1267')); -> '1267'
UNHEX() a t ajoute en MySQL 4.1.2. UPPER(str) Retourne la chane str en majuscules, en fonction du jeu de caractres courant. Par dfaut, c'est le jeu ISO-8859-1 Latin1 :
mysql> SELECT UPPER('Hey'); -> 'HEY'
Si vous devez convertir explicitement un nombre en chane, passez-le en argument de la fonction CONCAT().
mysql> SELECT 38.8, CAST(38.8 AS CHAR); -> 38.8, '38.8' mysql> SELECT 38.8, CONCAT(38.8); -> 38.8, '38.8'
547
Si une fonction de chane de caractres est donne comme chane binaire dans un argument d'une autre fonction, le rsultat sera aussi une chane binaire. Les nombres convertis en chanes sont traits comme des chanes binaires. Cela affecte les comparaisons. Normalement, si l'une des expressions dans une comparaison de chane est sensible la casse, la comparaison est excute en tenant compte de la casse. expr LIKE pat [ESCAPE 'escape-char'] La ralisation d'expression utilisant les expressions rgulires simples de comparaison de SQL. Retourne 1 (TRUE) ou 0 (FALSE). Avec LIKE, vous pouvez utiliser les deux jokers suivants :
Char % _
Description Remplace n'importe quel nombre de caractres, y compris aucun Remplace exactement un caractre
mysql> SELECT 'David!' LIKE 'David_'; -> 1 mysql> SELECT 'David!' LIKE '%D%v%'; -> 1
Pour tester la prsence littrale d'un joker, prcdez-le d'un caractre d'chappement. Si vous ne spcifiez pas le caractre d'chappement ESCAPE, le caractre \ sera utilis :
String \% \_
mysql> SELECT 'David!' LIKE 'David\_'; -> 0 mysql> SELECT 'David_' LIKE 'David\_'; -> 1
Les deux exemples suivants illustrent le fait que les comparaisons de chanes de caractres ne sont pas sensibles la casse moins qu'une des oprandes soit une chane binaire.
mysql> SELECT 'abc' LIKE 'ABC'; -> 1 mysql> SELECT 'abc' LIKE BINARY 'ABC'; -> 0
LIKE est galement autoris pour les expressions numriques. (C'est une extension MySQL la norme ANSI SQL LIKE.)
mysql> SELECT 10 LIKE '1%'; -> 1
Note : Comme MySQL utilise la syntaxe d'chappement de caractres du langage C dans les chanes (par exemple, \n), vous devez doubler tous les slash \ que vous utilisez dans les expressions LIKE. Par exemple, pour rechercher les nouvelles lignes (\n), vous devez le spcifier comme cela : \\n. Pour rechercher un anti-slash (\), vous devez le spcifier comme cela : \\\ \ (les anti-slash sont supprims une premire fois pas l'analyseur syntaxique, puis une deuxime fois par le moteur d'expression rgulires, ce qui ne laisse qu'un seul anti-slash la fin). 548 Note : actuellement, LIKE n'est pas compatible avec les caractres multi-octets. La comparaison est fate caractre par caractre.
Fonctions numriques
expr NOT LIKE pat [ESCAPE 'escape-char'] Equivalent NOT (expr LIKE pat [ESCAPE 'escape-char']). expr NOT REGEXP pat, expr NOT RLIKE pat Equivalent NOT (expr REGEXP pat). expr REGEXP pat, expr RLIKE pat Effectue une recherche de chane avec l'expression rgulire pat. Le masque peut tre une expression rgulire tendue. Voir la section Annexe F, Expressions rgulires MySQL. Retourne 1 si expr correspond au masque pat, sinon, retourne 0. RLIKE est un synonyme de REGEXP, fourni pour assurer la compatibilit avec mSQL. Note : Comme MySQL utilise la syntaxe d'chappement de caractres du langage C dans les chanes (par exemple, \n), vous devez doubler tous les antislash \ que vous utilisez dans les expressions REGEXP. A partir de la version 3.23.4 de MySQL, REGEXP est insensible la casse pour les comparaisons de chanes normales (non binaires) :
mysql> SELECT -> 0 mysql> SELECT -> 1 mysql> SELECT -> 1 mysql> SELECT -> 1 mysql> SELECT -> 1 'Monty!' REGEXP 'm%y%%'; 'Monty!' REGEXP '.*'; 'new*\n*line' REGEXP 'new\\*.\\*line'; 'a' REGEXP 'A', 'a' REGEXP BINARY 'A'; 0 'a' REGEXP '^[a-d]';
STRCMP(expr1,expr2) STRCMP() retourne 0 si les chanes sont identiques, -1 si la premire chane est plus petite que la seconde et 1 dans les autres cas :
mysql> SELECT STRCMP('text', 'text2'); -> -1 mysql> SELECT STRCMP('text2', 'text'); -> 1 mysql> SELECT STRCMP('text', 'text'); -> 0
Depuis MySQL 4.0, STRCMP() utilise le jeu de caractres courant pour effectuer des comparaisons. Cela fait que le comportement par dfaut est la comparaison insensible la casse, moins que l'un des deux oprandes soient une chane binaire. Avant MySQL 4.0, STRCMP() tait sensible la casse.
Soustraction :
549
Fonctions mathmatiques
Notez que si cet oprateur est utilis avec un BIGINT, la valeur retourne est un BIGINT! Cela signifie que vous devez viter d'utiliser - sur des entiers qui peuvent avoir une valeur de -2^63! * Multiplication :
mysql> SELECT 3*5; -> 15 mysql> SELECT 18014398509481984*18014398509481984.0; -> 324518553658426726783156020576256.0 mysql> SELECT 18014398509481984*18014398509481984; -> 0
Le rsultat du dernier calcul est incorrect car le rsultat de la multiplication des deux entiers dpass la capacit de calcul de BIGINT (64 bits). / Division :
mysql> SELECT 3/5; -> 0.60
Une division sera calcule en BIGINT seulement si elle est effectue dans un contexte o le rsultat est transform en entier. DIV Division entire. Similaire FLOOR() mais compatible avec les valeurs BIGINT.
mysql> SELECT 5 DIV 2; -> 2
Cette fonction est utilisable avec les valeurs issues des champs BIGINT.
550
Fonctions mathmatiques
ACOS(X) Retourne l'arccosinus de X, c'est dire, la valeur de l'angle dont X est la cosinus. Retourne NULL si X n'est pas dans l'intervalle -1 - 1.
mysql> SELECT ACOS(1); -> 0.000000 mysql> SELECT ACOS(1.0001); -> NULL mysql> SELECT ACOS(0); -> 1.570796
ASIN(X) Retourne l'arcsinus de X, c'est dire, la valeur de l'angle dont le sinus est X. Retourne NULL si X n'est pas dans l'intervalle -1 - 1 :
mysql> SELECT ASIN(0.2); -> 0.201358 mysql> SELECT ASIN('foo'); -> 0.000000
ATAN(X) Retourne l'arctangente de X, c'est dire, la valeur de l'angle dont la tangente est X.
mysql> SELECT ATAN(2); -> 1.107149 mysql> SELECT ATAN(-2); -> -1.107149
ATAN(Y,X), ATAN2(Y,X) Retourne l'arctangente des variables X et Y. Cela revient calculer l'arctangente de Y / X, except que les signes des deux arguments servent dterminer le quadrant du rsultat :
mysql> SELECT ATAN(-2,2); -> -0.785398 mysql> SELECT ATAN2(PI(),0); -> 1.570796
Notez que la valeur retourne sera de type BIGINT! COS(X) Retourne le cosinus de X, o X est donn en radians.
mysql> SELECT COS(PI()); -> -1.000000
551
Fonctions mathmatiques
CRC32(expr) Calcule la somme de contrle et retourne un entier 32 bits non-sign. Le rsultat est la valeur NULL si l'argument est NULL. L'argument attendu est une chane, et sera trait comme une chane s'il n'est pas du bon type.
mysql> SELECT CRC32('MySQL'); -> 3259397556
CRC32() est disponible en MySQL 4.1.0. DEGREES(X) Retourne l'argument X, convertit de radians en degrs.
mysql> SELECT DEGREES(PI()); -> 180.000000
EXP(X) Retourne la valeur de e (la base des logarithmes naturels) lev la puissance X.
mysql> SELECT EXP(2); -> 7.389056 mysql> SELECT EXP(-2); -> 0.135335
Notez que la valeur retourne sera de type BIGINT! LN(X) Retourne le logarithme naturel de X (nprien).
mysql> SELECT LN(2); -> 0.693147 mysql> SELECT LN(-2); -> NULL
Cette fonction a t ajoute MySQL partir de la version 4.0.3. C'est un synonyme de la fonction LOG(X). LOG(X), LOG(B,X) Appele avec un seul paramtre, cette fonction retourne le logarithme naturel (nprien) de X.
mysql> SELECT LOG(2); -> 0.693147 mysql> SELECT LOG(-2); -> NULL
Appele avec deux paramtres, cette fonction retourne le logarithme naturel de X pour une base B arbitraire :
mysql> SELECT LOG(2,65536); -> 16.000000 mysql> SELECT LOG(1,100); -> NULL
552
Fonctions mathmatiques
Cette base arbitraire a t ajoute MySQL partir de la version 4.0.3. LOG(B,X) est l'quivalent de LOG(X)/LOG(B). LOG2(X) Retourne le logarithme en base 2 de X.
mysql> SELECT LOG2(65536); -> 16.000000 mysql> SELECT LOG2(-100); -> NULL
LOG2() est utile pour trouver combien de bits sont ncessaires pour stocker un nombre. Cette fonction a t ajoute MySQL partir de la version 4.0.3. Dans les versions antrieures, vous pouvez utiliser LOG(X)/LOG(2) en remplacement. LOG10(X) Retourne le logarithme en base 10 de X.
mysql> SELECT LOG10(2); -> 0.301030 mysql> SELECT LOG10(100); -> 2.000000 mysql> SELECT LOG10(-100); -> NULL
MOD(N,M), N % M, N MOD M Modulo (quivalent de l'oprateur % dans le langage C). Retourne le reste de la division de N par M.
mysql> SELECT MOD(234, 10); -> 4 mysql> SELECT 253 % 7; -> 1 mysql> SELECT MOD(29,9); -> 2
Cette fonction ne pose pas de problmes avec les BIGINT. PI() Retourne la valeur de pi. Par dfaut, 5 dcimales sont retournes, mais MySQL utilise la double prcision pour pi.
mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793116
RAND(), RAND(N)
553
Fonctions mathmatiques
Retourne un nombre alatoire virgule flottante compris dans l'intervalle 0 - 1.0. Si l'argument entier N est spcifi, il est utilis comme initialisation du gnrateur de nombres alatoires.
mysql> SELECT RAND(); -> 0.9233482386203 mysql> SELECT RAND(20); -> 0.15888261251047 mysql> SELECT RAND(20); -> 0.15888261251047 mysql> SELECT RAND(); -> 0.63553050033332 mysql> SELECT RAND(); -> 0.70100469486881
Vous ne pouvez pas utiliser une colonne de valeur RAND() dans une clause ORDER BY, parce que ORDER BY va valuer la colonne plusieurs fois. Dans la version 3.23 de MySQL, vous pouvez, tout de mme, faire ceci :
mysql> SELECT * FROM tbl_name ORDER BY RAND();
Cette syntaxe est trs pratique pour faire une slection alatoire de lignes :
mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d -> ORDER BY RAND() LIMIT 1000;
Notez que la fonction RAND() dans une clause WHERE sera rvalue chaque fois que WHERE sera excut. RAND() n'est pas un gnrateur parfait de nombres alatoires, mais reste une manire rapide de produire des nombres alatoires portables selon les diffrentes plates-formes pour une mme version de MySQL. ROUND(X), ROUND(X,D) Retourne l'argument X, arrondi un nombre D dcimales. Avec deux arguments, la valeur est arrondie avec D dcimales. Si D vaut 0, le rsultat n'aura ni de partie dcimale, ni de sparateur de dcimal.
mysql> SELECT ROUND(-1.23); -> -1 mysql> SELECT ROUND(-1.58); -> -2 mysql> SELECT ROUND(1.58); -> 2 mysql> SELECT ROUND(1.298, 1); -> 1.3 mysql> SELECT ROUND(1.298, 0); -> 1 mysql> SELECT ROUND(23.298, -1); -> 20
Notez que le comportement de l'oprateur ROUND(), lorsque l'argument est exactement entre deux entiers, dpend de la bibliothque C active. Certaines arrondissent toujours l'entier pair le plus proche, toujours vers le haut, toujours vers le bas, ou toujours vers zro. Si vous avez besoin d'un certain type d'arrondissement, vous devez utiliser une fonction bien dfinie comme TRUNCATE() ou FLOOR(). SIGN(X) Retourne le signe de l'argument sous la forme -1, 0, ou 1, selon que X est ngatif, zro, ou positif.
mysql> SELECT SIGN(-32); -> -1 mysql> SELECT SIGN(0); -> 0
554
TRUNCATE(X,D) Retourne l'argument X, tronqu D dcimales. Si D vaut 0, le rsultat n'aura ni sparateur dcimal, ni partie dcimale.
mysql> SELECT TRUNCATE(1.223,1); -> 1.2 mysql> SELECT TRUNCATE(1.999,1); -> 1.9 mysql> SELECT TRUNCATE(1.999,0); -> 1 mysql> SELECT TRUNCATE(-1.999,1); -> -1.9
A partir de MySQL 3.23.51 tous les nombres sont arrondis vers zro. Notez que les nombres dcimaux ne sont pas stocks exactement comme les nombres entiers , mais comme des valeurs doubles. Vous pouvez tre dups par le rsultat suivant :
mysql> SELECT TRUNCATE(10.28*100,0); -> 1027
Ce rsultat est normal car 10.28 est actuellement stock comme cela 10.2799999999999999.
Notez que cette requte va aussi slectionner des lignes dont les dates sont dans le futur. Les fonctions qui utilisent des valeurs de date acceptent les valeurs de type DATETIME et ignore la partie horaire. Les fonctions qui attendent des heures acceptent les valeurs littrales et ignorent la partie de date.
555
Les fonctions qui retourne la date ou l'heure courante sont values une fois par requte, tout au dbut. Cela signifie que des rfrences multiples la fonction NOW() dans une mme requte produiront toujours le mme rsultat. Ce principe s'applique aussi CURDATE(), CURTIME(), UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP(), et leurs synonymes. Les intervalles de valeurs de retour des fonctions suivantes s'appliquent aux dates compltes. Si une date est une valeur ``zro'' ou une date incomplte, comme '2001-11-00', les fonctions qui extraient une partie d'une date retourneront 0. Par exemple, DAYOFMONTH('2001-11-00') retourne 0. ADDDATE(date,INTERVAL expr type), ADDDATE(expr,days) Lorsqu'elle est utilise avec la forme INTERVAL, ADDDATE() est un synonyme de DATE_ADD(). La fonction complmentaire SUBDATE() est un synonyme DATE_SUB().
mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY); -> '1998-02-02' mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY); -> '1998-02-02'
Depuis MySQL 4.1.1, la seconde syntaxe est utilise si expr est une expression de type DATE ou DATETIME, et que days est un nombre de jour ajouter expr.
mysql> SELECT ADDDATE('1998-01-02', 31); -> '1998-02-02'
ADDTIME(expr,expr2) ADDTIME() ajoute expr2 expr et retourne le rsultat. expr est une expression de type DATE ou DATETIME, et expr2 est une expression de type TIME.
mysql> SELECT ADDTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002"); -> '1998-01-02 01:01:01.000001' mysql> SELECT ADDTIME("01:00:00.999999", "02:00:00.999998"); -> '03:00:01.999997'
ADDTIME() a t ajout en MySQL 4.1.1. CURDATE(), CURRENT_DATE Retourne la date courante au format 'YYYY-MM-DD' ou YYYYMMDD, suivant le contexte numrique ou chane :
mysql> SELECT CURDATE(); -> '1997-12-15' mysql> SELECT CURDATE() + 0; -> 19971215
CURRENT_DATE, CURRENT_DATE() CURRENT_DATE et CURRENT_DATE() sont synonymes de CURDATE(). CURTIME() Retourne l'heure courante au format 'HH:MM:SS' or HHMMSS suivant le contexte numrique ou chane :
mysql> SELECT CURTIME(); -> '23:50:26' mysql> SELECT CURTIME() + 0; -> 235026
556
CURRENT_TIMESTAMP et CURRENT_TIMESTAMP() sont synonymes de NOW(). DATE(expr) Extrait la partie date de l'expression expr de type DATE ou DATETIME.
mysql> SELECT DATE('2003-12-31 01:02:03'); -> '2003-12-31'
DATE() est disponible depuis MySQL 4.1.1. DATEDIFF(expr,expr2) DATEDIFF() retourne le nombre de jours entre la date de dbut expr et la date de fin expr2. expr et expr2 sont des expressions de type DATE ou DATETIME. Seule la partie DATE est utilise dans le calcul.
mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30'); -> 1 mysql> SELECT DATEDIFF('1997-11-31 23:59:59','1997-12-31'); -> -30
DATEDIFF() est disponible depuis MySQL 4.1.1. DATE_ADD(date,INTERVAL expr type), DATE_SUB(date,INTERVAL expr type) Ces fonctions effectuent des calculs arithmtiques sur les dates. Depuis MySQL 3.23, INTERVAL expr type est autoris des deux cots de l'oprateur + si l'expression de l'autre cot est de type DATE ou DATETIME. Pour l'oprateur -, INTERVAL expr type est autoris uniquement du cot droit, car on ne peut pas soustraire une date d'un intervalle (voir les exemples ci-dessous). date est une valeur de type DATETIME ou DATE qui spcifie la date de dbut. expr est une expression qui spcifie une valeur d'intervalle ajouter ou soustraire de la date initiale. expr est une chane : elle peut commencer avec - pour les intervalles ngatifs. type est un mot-cl, indiquant comment l'expression doit tre interprte. La table suivante indique la signification des arguments type et expr : type Valeur MICROSECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND HOUR_MICROSECOND HOUR_SECOND Attendue expr Format MICROSECONDS SECONDS MINUTES HOURS DAYS WEEKS MONTHS QUARTERS YEARS 'SECONDS.MICROSECONDS' 'MINUTES.MICROSECONDS' 'MINUTES:SECONDS' 'HOURS.MICROSECONDS' 'HOURS:MINUTES:SECONDS' 557
Les valeurs de type DAY_MICROSECOND, HOUR_MICROSECOND, MINUTE_MICROSECOND, SECOND_MICROSECOND, et MICROSECOND ont t ajouts en MySQL 4.1.1. Les valeurs QUARTER et WEEK sont disponibles depuis MySQL 5.0.0. MySQL autorise tous les signes de ponctuation, comme dlimiteur dans le format de expr. Ceux qui sont affichs dans la table sont des suggestions. Si l'argument date est une valeur DATE et que vos calculs impliquent des parties YEAR, MONTH et DAY (c'est dire, sans partie horaire), le rsultat sera de type DATE. Sinon, le rsultat est de type DATETIME :
mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND; -> '1998-01-01 00:00:00' mysql> SELECT INTERVAL 1 DAY + '1997-12-31'; -> '1998-01-01' mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND; -> '1997-12-31 23:59:59' mysql> SELECT DATE_ADD('1997-12-31 23:59:59', -> INTERVAL 1 SECOND); -> '1998-01-01 00:00:00' mysql> SELECT DATE_ADD('1997-12-31 23:59:59', -> INTERVAL 1 DAY); -> '1998-01-01 23:59:59' mysql> SELECT DATE_ADD('1997-12-31 23:59:59', -> INTERVAL '1:1' MINUTE_SECOND); -> '1998-01-01 00:01:00' mysql> SELECT DATE_SUB('1998-01-01 00:00:00', -> INTERVAL '1 1:1:1' DAY_SECOND); -> '1997-12-30 22:58:59' mysql> SELECT DATE_ADD('1998-01-01 00:00:00', -> INTERVAL '-1 10' DAY_HOUR); -> '1997-12-30 14:00:00' mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02' mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', -> INTERVAL '1.999999' SECOND_MICROSECOND); -> '1993-01-01 00:00:01.000001'
Si vous spcifiez un intervalle qui est trop court (il n'inclut pas toutes les parties d'intervalle attendues par type), MySQL suppose que vous avez omis les valeurs de gauche. Par exemple, si vous spcifiez un type type de DAY_SECOND, la valeur expr devrait contenir des jours, heures, minutes et secondes. Si vous fournissez une valeur de la forme '1:10', MySQL suppose que les jours et heures manquent, et que la valeur reprsente des minutes et secondes. En d'autres termes, '1:10' DAY_SECOND est interprt comme '1:10' MINUTE_SECOND. C'est similaire au comportement de MySQL avec les valeurs de type TIME, qui reprsente des dures plutt que des horaires. Notez que si vous ajoutez ou soustrayez une valeur de type DATE des horaires, le rsultat sera automatiquement au format DATETIME :
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY); -> '1999-01-02' mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR); -> '1999-01-01 01:00:00'
Si vous utilisez des dates malformes, le rsultat sera NULL. Si vous ajoutez des MONTH, YEAR_MONTH ou YEAR, et que le rsultat a un jour du mois qui est au-del de ce qui est possible dans le mois, le jour sera adapt au plus grand jour possible du mois. Par exemple :
558
Notez que dans l'exemple prcdent, le mot cl INTERVAL et le spcificateur type sont insensibles la casse. DATE_FORMAT(date,format) Formate la date date avec le format format. Les spcificateurs suivants peuvent tre utilis dans la chane format :
Option %% %a %b %c %d %D %e %f %H %h %I %i %j %k %l %m %M %p %r %s %S %T %U %u %V %v %W %w %X %x
Description Un signe pourcentage littral %. Nom du jour de la semaine, en abrg et en anglais (Sun..Sat) Nom du mois, en abrg et en anglais (Jan..Dec) Mois, au format numrique (1..12) Jour du mois, au format numrique (00..31) Jour du mois, avec un suffixe anglais (1st, 2nd, 3rd, etc.) Jour du mois, au format numrique (0..31) Microsecondes (000000..999999) Heure (00..23) Heure (01..12) Heure (01..12) Minutes, au format numrique (00..59) Jour de l'anne (001..366) Heure (0..23) Heure (1..12) Mois, au format numrique (01..12) Nom du mois (January..December) AM ou PM Heures, au format 12 heures (hh:mm:ss [AP]M) Secondes (00..59) Secondes (00..59) Heures, au format 24 heures (hh:mm:ss) Numro de la semaine (00..53), o Dimanche est le premier jour de la semaine Numro de la semaine (00..53), o Lundi est le premier jour de la semaine Numro de la semaine (01..53), o Dimanche est le premier jour de la semaine, utilis avec '%X' Numro de la semaine (01..53), o Lundi est le premier jour de la semaine, utilis avec '%x' Nom du jour de la semaine (Sunday..Saturday) Numro du jour de la semaine (0=Sunday..6=Saturday) Anne, pour les semaines qui commencent le Dimanche, au format numrique, sur 4 chiffres, utilis avec '%V' Anne, pour les semaines qui commencent le Lundi, au format numrique, sur 4 chiffres, utilis avec '%v'
559
%y %Y
Anne, au format numrique, sur 2 chiffres Anne, au format numrique, sur 4 chiffres
Tous les autres caractres sont simplement copis dans le rsultat sans interprtation: Le format %f est disponible depuis MySQL 4.1.1. Depuis MySQL version 3.23, le caractre % est requis devant les caractres de format. Dans les versions antrieures de MySQL, % tait optionnel. La raison qui fait que les intervalles de mois et de jours commencent avec zro est que MySQL autorise les dates incompltes comme '2004-00-00', depuis MySQL 3.23.
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); -> 'Saturday October 1997' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j'); -> '4th 97 Sat 04 10 Oct 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52'
DAY(date) DAY() est un synonyme de DAYOFMONTH(). Cette fonction est disponible depuis MySQL 4.1.1. DAYNAME(date) Retourne le nom du jour de la semaine de date :
mysql> SELECT DAYNAME('1998-02-05'); -> 'Thursday'
DAYOFWEEK(date) Retourne l'index du jour de la semaine : pour date (1 = Dimanche, 2 = Lundi, ... 7 = Samedi). Ces index correspondent au standard ODBC :
mysql> SELECT DAYOFWEEK('1998-02-03'); -> 3
EXTRACT(type FROM date) La fonction EXTRACT() utilise les mmes types d'intervalles que la fonction DATE_ADD() ou la fonction DATE_SUB(), mais extrait des parties de date plutt que des oprations de date.
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02"); -> 1999
560
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); -> 20102 mysql> SELECT EXTRACT(MICROSECOND FROM "2003-01-02 10:30:00.00123"); -> 123
FROM_DAYS() n'est pas fait pour travailler avec des dates qui prcdent l'avnement du calendrier Grgorien (1582), car elle ne prend pas en compte les jours perdus lors du changement de calendrier. FROM_UNIXTIME(unix_timestamp) Retourne une reprsentation de l'argument unix_timestamp sous la forme 'YYYY-MM-DD HH:MM:SS' ou YYYYMMDDHHMMSS, suivant si la fonction est utilis dans un contexte numrique ou de chane.
mysql> SELECT FROM_UNIXTIME(875996580); -> '1997-10-04 22:23:00' mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300
Si format est donn, le rsultat est format en fonction de la chane format. format peut contenir les mmes options de format que celles utilises par DATE_FORMAT() :
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), -> '%Y %D %M %h:%i:%s %x'); -> '2003 6th August 06:22:58 2003'
GET_FORMAT(DATE | TIME | TIMESTAMP, 'EUR' | 'USA' | 'JIS' | 'ISO' | 'INTERNAL') Retourne une chane de format. Cette fonction est pratique lorsqu'elle est utilise avec les fonctions DATE_FORMAT() et STR_TO_DATE(). Les trois valeurs possibles pour le premier argument, et les cinq valeurs possible pour le second argument donnent 15 formats d'affichage (pour les options utilises, voyez la table de la fonction DATE_FORMAT()) : Appel fonction GET_FORMAT(DATE,'USA') GET_FORMAT(DATE,'JIS') GET_FORMAT(DATE,'ISO') GET_FORMAT(DATE,'EUR') GET_FORMAT(DATE,'INTERNAL') GET_FORMAT(TIMESTAMP,'USA') GET_FORMAT(TIMESTAMP,'JIS') GET_FORMAT(TIMESTAMP,'ISO') GET_FORMAT(TIMESTAMP,'EUR') GET_FORMAT(TIMESTAMP,'INTERNAL') GET_FORMAT(TIME,'USA') 561 Rsultat '%m.%d.%Y' '%Y-%m-%d' '%Y-%m-%d' '%d.%m.%Y' '%Y%m%d' '%Y-%m-%d-%H.%i.%s' '%Y-%m-%d %H:%i:%s' '%Y-%m-%d %H:%i:%s' '%Y-%m-%d-%H.%i.%s' '%Y%m%d%H%i%s' '%h:%i:%s %p'
GET_FORMAT() est disponible depuis MySQL 4.1.1. Voyez See Section 13.5.2.8, Syntaxe de SET . HOUR(time) Retourne le nombre d'heures pour l'heure time, dans un intervalle de 0 23 :
mysql> SELECT HOUR('10:05:03'); -> 10
Cependant, l'intervalle des valeurs TIME est bien plus grand, et donc, HOUR peut retourner des valeurs plus grandes que 23 :
mysql> SELECT HOUR('272:59:59'); -> 272
LAST_DAY(date) Prend une valeur de format DATE ou DATETIME, et retourne le dernier jour du mois correspondant. Retourne NULL si l'argument est invalide.
mysql> SELECT LAST_DAY('2003-02-05'), LAST_DAY('2004-02-05'); -> '2003-02-28', '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); -> '2004-01-31' mysql> SELECT LAST_DAY('2003-03-32'); -> NULL
LAST_DAY() est disponible depuis MySQL 4.1.1. LOCALTIME, LOCALTIME() LOCALTIME et LOCALTIME() sont synonymes de NOW(). LOCALTIMESTAMP, LOCALTIMESTAMP() LOCALTIMESTAMP et LOCALTIMESTAMP() sont synonymes de NOW(). MAKEDATE(year,dayofyear) Retourne une valeur de format DATE, partir d'une anne et du numro de jour. dayofyear doit tre plus grand que 0 ou le rsultat sera NULL.
mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32); -> '2001-01-31', '2001-02-01' mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365); -> '2001-12-31', '2004-12-30' mysql> SELECT MAKEDATE(2001,0); -> NULL
562
MAKEDATE() est disponible depuis MySQL 4.1.1. MAKETIME(hour,minute,second) Retourne une valeur de format TIME, calcule partir des arguments hour, minute et second.
mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'
MAKETIME() est disponible depuis MySQL 4.1.1. MICROSECOND(expr) Retourne le nombre de microsecondes dans l'expression de type TIME ou DATETIME expr, sous la forme d'un nombre entre 0 et 999999.
mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010'); -> 10
MICROSECOND() est disponible depuis MySQL 4.1.1. MINUTE(time) Retourne le nombre de minutes pour l'heure time, dans un intervalle de 0 59 :
mysql> SELECT MINUTE('98-02-03 10:05:03'); -> 5
NOW() Retourne la date courante au format 'YYYY-MM-DD HH:MM:SS' ou YYYYMMDDHHMMSS, suivant le contexte numrique ou chane :
mysql> SELECT NOW(); -> '1997-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 19971215235026
PERIOD_ADD(P,N) Ajoute N mois la priode P (au format YYMM ou YYYYMM). Retourne une valeur dans le format YYYYMM. Notez que l'argument P n'est pas de type date :
mysql> SELECT PERIOD_ADD(9801,2); -> 199803
PERIOD_DIFF(P1,P2) 563
Retourne le nombre de mois entre les priodes P1 et P2. P1 et P2 doivent tre au format YYMM ou YYYYMM. Notez que les arguments P1 et P2 ne sont pas de type date :
mysql> SELECT PERIOD_DIFF(9802,199703); -> 11
SEC_TO_TIME(seconds) Retourne l'argument seconds, convertit en heures, minutes et secondes au format 'HH:MM:SS' ou HHMMSS, suivant le contexte numrique ou chane :
mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
STR_TO_DATE(str,format) Cette fonction est l'inverse de la fonction DATE_FORMAT(). Elle prend la chane str, et une chane de format format, puis retourne une valeur DATETIME. Les valeurs de type DATE, TIME ou DATETIME contenues dans la chane str doivent tre au format format. Pour les options qui sont utilisables dans la chane format, voyez la table dans la description de la fonction DATE_FORMAT(). Tous les autres caractres sont utiliss littralement, et ne seront pas interprts. Si str contient une valeur illgale, STR_TO_DATE() retourne NULL.
mysql> SELECT STR_TO_DATE('03.10.2003 09.20', '%d.%m.%Y %H.%i') -> 2003-10-03 09:20:00 mysql> SELECT STR_TO_DATE('10rap', '%crap') -> 0000-10-00 00:00:00 mysql> SELECT STR_TO_DATE('2003-15-10 00:00:00', '%Y-%m-%d %H:%i:%s') -> NULL
STR_TO_DATE() est disponible depuis MySQL 4.1.1. SUBDATE(date,INTERVAL expr type), SUBDATE(expr,days) Lorsqu'elle est utilise avec la forme INTERVAL du second argument, SUBDATE() est synonyme DATE_SUB().
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02' mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02'
Depuis MySQL 4.1.1, la seconde syntaxe est autorise, o expr est une expression de type DATE ou DATETIME et days est le nombre de jour soustraire de l'expression expr.
564
SUBTIME(expr,expr2) SUBTIME() soustrait expr2 de expr et retourne le rsultat. expr est une expression de format DATE ou DATETIME et expr2 est une expression de type TIME.
mysql> SELECT SUBTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002"); -> '1997-12-30 22:58:58.999997' mysql> SELECT SUBTIME("01:00:00.999999", "02:00:00.999998"); -> '-00:59:59.999999'
SUBTIME() a t ajoute en MySQL 4.1.1. SYSDATE() SYSDATE() est un synonyme de NOW(). TIME(expr) Extrait la partie horaire de l'expression expr, de type TIME ou DATETIME.
mysql> SELECT TIME('2003-12-31 01:02:03'); -> '01:02:03' mysql> SELECT TIME('2003-12-31 01:02:03.000123'); -> '01:02:03.000123'
TIME() a t ajoute en MySQL 4.1.1. TIMEDIFF(expr,expr2) TIMEDIFF() retourne la dure entre l'heure de dbut expr et l'heure de fin expr2. expr et expr2 sont des expressions de type TIME ou DATETIME, et doivent tre de mme type.
mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001'); -> '-00:00:00.000001' mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001','1997-12-30 01:01:01.000002'); -> '46:58:57.999999'
TIMEDIFF() a t ajoute en MySQL 4.1.1. TIMESTAMP(expr), TIMESTAMP(expr,expr2) Avec un seul argument, retourne l'expression expr de type DATE ou DATETIME sous la forme d'une valeur DATETIME. Avec deux arguments, ajouter l'expression expr2 l'expression expr et retourne le rsultat au format DATETIME.
mysql> SELECT TIMESTAMP('2003-12-31'); -> '2003-12-31 00:00:00' mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00'); -> '2004-01-01 00:00:00'
TIMESTAMP() a t ajoute en MySQL 4.1.1. TIMESTAMPADD(interval,int_expr,datetime_expr) Ajoute l'expression entire int_expr l'expression datetime_expr au format DATE ou DATETIME. L'unit de int_expr est donne avec l'argument interval, qui peut tre l'une des valeurs suivantes : FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, ou YEAR. La valeur interval peut tre spcifie, en utilisant un des mots-cl cits, ou avec le prfixe SQL_TSI_. Par exemple, DAY et SQL_TSI_DAY sont tous les deux valides.
mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02'); -> '2003-01-02 00:01:00'
565
TIMESTAMPADD() a t ajoute en MySQL 5.0.0. TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) Retourne la diffrence entire entre les expressions datetime_expr1 et datetime_expr2, de format DATE et DATETIME. L'unit du rsultat est donn par l'argument interval. Les valeurs lgales de interval sont les mmes que pour la fonction TIMESTAMPADD().
mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); -> 3 mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); -> -1
TIMESTAMPDIFF() a t ajoute en MySQL 5.0.0. TIME_FORMAT(time,format) Cette fonction est utilise exactement comme la fonction DATE_FORMAT() ci-dessus, mais la chane format ne doit utiliser que des spcificateurs d'heures, qui grent les heures, minutes et secondes. Les autres spcificateurs gnreront la valeur NULL ou 0. Si la valeur time contient une valeur d'heure qui est plus grande que 23, les formats %H et %k produiront une valeur qui est hors de l'intervalle 0..23. L'autre format d'heure produira une heure modulo 12 :
mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
TO_DAYS() n'est pas fait pour travailler avec des dates qui prcdent l'avnement du calendrier Grgorien (1582), car elle ne prend pas en compte les jours perdus lors du changement de calendrier. N'oubliez pas que MySQL convertit les annes reprsentes sur deux chiffres en dates quatre chiffres, en utilisant les rgles de la section Section 11.3, Les types date et heure . Par exemple, '1997-10-07' et '97-10-07' sont identiques :
mysql> SELECT TO_DAYS('1997-10-07'), TO_DAYS('97-10-07'); -> 729669, 729669
Pour les dates antrieures 1582, les rsultats sont indfinis. UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) Lorsqu'elle est appel sans argument, cette fonction retourne un timestamp Unix (nombre de secondes depuis '1970-01-01 00:00:00' GMT). Si UNIX_TIMESTAMP() est appel avec un
566
argument date, elle retourne le timestamp correspondant cette date. date peut tre une chane de type DATE, DATETIME, TIMESTAMP, ou un nombre au format YYMMDD ou YYYYMMDD, en horaire local :
mysql> SELECT UNIX_TIMESTAMP(); -> 882226357 mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580
Lorsque UNIX_TIMESTAMP est utilis sur une colonne de type TIMESTAMP, la fonction reoit directement la valeur, sans conversion explicite. Si vous donnez UNIX_TIMESTAMP() une date hors de son intervalle de validit, elle retourne 0. Si vous voulez soustraire une colonne de type UNIX_TIMESTAMP(), vous devez srement vouloir un rsultat de type entier sign. See Section 12.7, Fonctions de transtypage . UTC_DATE, UTC_DATE() Retourne la date UTC courante au format 'YYYY-MM-DD' ou YYYYMMDD suivant le contexte numrique ou chane :
mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814
UTC_DATE() est disponible depuis MySQL 4.1.1. UTC_TIME, UTC_TIME() Retourne l'heure UTC courante au format 'HH:MM:SS' or HHMMSS suivant le contexte numrique ou chane :
mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753
UTC_TIME() est disponible depuis MySQL 4.1.1. UTC_TIMESTAMP, UTC_TIMESTAMP() Retourne l'heure et la date UTC courante au format 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS suivant le contexte numrique ou chane :
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2003-08-14 18:08:04', 20030814180804
UTC_TIMESTAMP() est disponible depuis MySQL 4.1.1. WEEK(date [,mode]) Avec un seul argument, retourne le numro de la semaine dans l'anne de la date date, dans un intervalle de 0 53 (oui, il peut y avoir un dbut de semaine numro 53), en considrant que Dimanche est le premier jour de la semaine. Avec deux arguments, la fonction WEEK() vous permet de spcifier si les semaines commencent le Dimanche ou le Lundi et la valeur retourne sera dans l'intervalle 0-53 ou bien 1-52. Lorsque l'argument mode est omis, la valeur de la variable default_week_format (ou 0 en MySQL 4.0 ou plus ancien) est utilis. See Section 13.5.2.8, Syntaxe de SET . Voici un tableau explicatif sur le fonctionnement du second argument : Valeur 0 Signification La semaine commence le Sunday;l'intervalle de valeur de retour va de 0 !2; la semaine 1 est la premire semaine de l'anne 567
La semaine commence le Monday;l'intervalle de valeur de retour va de 0 !2; la semaine 1 est la premire semaine de l'anne qui a plus de trois jours La semaine commence le Sunday;l'intervalle de valeur de retour va de 1 !2; la semaine 1 est la premire semaine de l'anne La semaine commence le Monday;l'intervalle de valeur de retour va de 1 !2; la semaine 1 est la premire semaine de l'anne qui a plus de trois jours La semaine commence le Sunday;l'intervalle de valeur de retour va de 0 !2; la semaine 1 est la premire semaine de l'anne qui a plus de trois jours La semaine commence le Monday;l'intervalle de valeur de retour va de 0 !2; la semaine 1 est la premire semaine de l'anne La semaine commence le Sunday;l'intervalle de valeur de retour va de 1 !2; la semaine 1 est la premire semaine de l'anne qui a plus de trois jours La semaine commence le Monday;l'intervalle de valeur de retour va de 1 !2; la semaine 1 est la premire semaine de l'anne
Le mode 3 est disponible depuis MySQL 4.0.5. Le mode 4 est disponible depuis MySQL 4.0.17.
mysql> SELECT -> 7 mysql> SELECT -> 7 mysql> SELECT -> 8 mysql> SELECT -> 53 WEEK('1998-02-20'); WEEK('1998-02-20',0); WEEK('1998-02-20',1); WEEK('1998-12-31',1);
Note : en version 4.0, WEEK(date,0) a t modifie pour correspondre au systme calendaire des USA. Avant cela, WEEK() tait calcul incorrectement, pour des dates amricaines : en effet, WEEK(date) et WEEK(date,0) taient incorrects. Si vous prfrez que le rsultat soit calcul en fonction de l'anne qui contient le premier jour de la semaine de la date utilise en argument, vous devriez utiliser les valeurs 2, 3, 6, or 7 de l'argument mode.
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0 mysql> SELECT WEEK('2000-01-01',2); -> 52
WEEKDAY(date) Retourne l'index du jour de la semaine, avec la conversion suivante : date (0 = Lundi, 1 = Mardi, ... 6 = Dimanche).
mysql> SELECT WEEKDAY('1997-10-04 22:23:00'); -> 5 mysql> SELECT WEEKDAY('1997-11-05');
568
-> 2
WEEKOFYEAR(date) Retourne le numro de semaine dans l'anne, sous forme d'un nombre compris entre 1 et 53.
mysql> SELECT WEEKOFYEAR('1998-02-20'); -> 8
WEEKOFYEAR() est disponible depuis MySQL 4.1.1. YEAR(date) Retourne l'anne de la date date, dans un intervalle de 1000 9999:
mysql> SELECT YEAR('98-02-03'); -> 1998 mysql> SELECT YEAR('98-02-03'); -> 1998
YEARWEEK(date), YEARWEEK(date,start) Retourne l'anne et la semaine d'une date. L'argument start fonctionne exactement comme l'argument start de la fonction WEEK(). Notez que l'anne dans le rsultat peut tre diffrente de l'anne passe en argument, pour la premire et la dernire semaine de l'anne.
mysql> SELECT YEARWEEK('1987-01-01'); -> 198653
Notez que le numro de semaine est diffrent de celui que la fonction WEEK() retourne (0) pour les arguments optionnels 0 ou 1, comme WEEK() puis retourne la semaine dans le contexte de l'anne.
569
-> (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'), -> (NULL,'MySQL Security', 'When configured properly, MySQL ...'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM articles -> WHERE MATCH (title,body) AGAINST ('database'); +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 5 | MySQL vs. YourSQL | In the following database comparison ... | | 1 | MySQL Tutorial | DBMS stands for DataBase ... | +----+-------------------+------------------------------------------+ 2 rows in set (0.00 sec)
La fonction MATCH() effectue la recherche d'une chane de caractres dans une liste de textes (et dans un groupe d'une ou plusieurs colonnes utilises pour l'index FULLTEXT). La chane recherche est donne en argument AGAINST(). La recherche est sans distinguer les majuscules des minuscules. Pour chaque ligne de la table, MATCH() retourne une valeur de pertinence, qui est une mesure de la ressemblance entre le chane recherche et le texte de la ligne dans le colonne donne dans la liste de MATCH(). Quand MATCH() est utilis comme condition de WHERE (voir l'exemple suivant) les lignes retournes sont automatiquement organises avec la pertinence la plus lev en premier. La pertinence est un nombre dcimal positif. La pertinence de zro signifie qu'il n'y a pas de similarit. La pertinence est calcul en fonction du nombre de mots dans la ligne, du nombre de mots uniques dans cette ligne, du nombre total de mots dans la liste, et du nombre de documents (lignes) qui contiennent un mot en particulier. Pour les recherches en texte intgral et en langage naturel, la technique impose que les colonnes utilises avec la fonction MATCH() doivent tre les mmes que les colonnes utilises dans un index FULLTEXT. Dans la requte prcdente, notez que les colonnes nommes dans la fonction MATCH() (title et body) sont les mmes que celles de la dfinition de la table article et son index FULLTEXT. Si vous voulez rechercher le titre title ou le corps body sparment, vous devrez crer un index FULLTEXT pour chaque colonne. Il est aussi possible d'excuter une recherche en mode boolen. Ceci est dcrit dans les sections Section 12.6.1, Boolens de recherches en texte intgral et Section 12.6.2, Recherche en texte intgral avec extension de requte . L'exemple prcdent est une illustration lmentaire qui montre comment on utilise la fonction MATCH(). Les lignes sont retournes par ordre dcroissant de pertinence. L'exemple suivant montre comment rcuprer la valeur de pertinence explicitement. Comme il n'y a pas de condition WHERE ni de condition ORDER BY les lignes retournes ne sont pas ordonnes.
mysql> SELECT id,MATCH (title,body) AGAINST ('Tutorial') FROM articles; +----+-----------------------------------------+ | id | MATCH (title,body) AGAINST ('Tutorial') | +----+-----------------------------------------+ | 1 | 0.64840710366884 | | 2 | 0 | | 3 | 0.66266459031789 | | 4 | 0 | | 5 | 0 | | 6 | 0 | +----+-----------------------------------------+ 6 rows in set (0.00 sec)
L'exemple suivant est plus complexe. La requte retourne la valeur de pertinence et organise les lignes par ordre dcroissant de pertinence. Pour obtenir ce rsultat, il faut spcifier MATCH() deux fois. Cela ne cause pas de surcharge car l'optimiseur de MySQL remarquera que les deux appels MATCH() sont identiques et appellent le code de recherche sur texte intgral une seule fois.
mysql> SELECT id, body, MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root') AS score
570
-> FROM articles WHERE MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root'); +----+-------------------------------------+-----------------+ | id | body | score | +----+-------------------------------------+-----------------+ | 4 | 1. Never run mysqld as root. 2. ... | 1.5055546709332 | | 6 | When configured properly, MySQL ... | 1.31140957288 | +----+-------------------------------------+-----------------+ 2 rows in set (0.00 sec)
MySQL utilise un filtre trs simple pour sparer le texte en mots. Un "mot" est n'importe quelle chane de caractres constitue de lettres, chiffres, ' et _. Tout "mot" prsent dans la liste des mots ignors ou qui est trop court (3 caractres ou moins) est ignor. Un mot trop court est ignor. La taille minimale pour un mot dans les recherches est de 4 lettres. Les mots de la liste sont ignors. Un mot banni est par exemple ``the'' ou ``some'', ``un'' or ``les'' en franais, qui sont considrs comme trop communs pour avoir une valeur intrinsque. Il y a une liste de mots bannis en anglais par dfaut. La taille minimale des mots et la liste de mots ignorer sont dcrites dans la section Section 12.6.4, Paramtrage prcis de la recherche en text intgral de MySQL . Tous les mots corrects de la liste et de la requte sont pondrs en fonction de leur importance dans la liste ou la requte. De cette faon, un mot prsent dans de nombreuses lignes aura un poids faible (et peut tre mme un poids nul), car il a peu d'importance dans cette requte particulire. Au contraire, si le mot est rare, il recevra un poids fort. Le poids des mots sont alors rassembls pour calculer la pertinence de la ligne. Une telle technique fonctionne plus efficacement sur de grands volumes de donnes (en fait, elle est optimise pour cela). Avec les toutes petites tables, la distribution des mots ne reflte par correctement leur valeur smantique et ce modle peut parfois produire des rsultats tranges.
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL'); Empty set (0.00 sec)
La recherche du mot MySQL ne donne aucun rsultat dans l'exemple prcdent, car il est prsent dans plus de la moiti des lignes. Ainsi, il est considr comme un mot ignorer (un mot avec une valeur smantique nulle). C'est le comportement le plus optimal : un langage de requtes ne doit pas retourner chaque ligne d'une table de 1 Go. Un mot qui est trouv dans la moiti des enregistrements d'une table n'est pas efficace pour trouver les document appropris. En fait, il trouvera srement beaucoup de documents inappropris la recherche. On sait tous que cela arrive souvent lorsqu'on recherche quelque chose sur internet en utilisant un moteur de recherche. C'est en suivant ce raisonnement que ces lignes se sont vues attribuer une valeur smantique trs basse dans ce cas particulier. Le seuil de 50% a un impact significatif lorsque vous commencez comprendre comment fonctionne l'index : si vous crez une table et insrez une ou deux lignes, chaque mot apparatra dans 50% des lignes. Rsultat, la recherche ne trouvera rien. Assurez-vous d'insrer au moins trois lignes, et mme plus.
571
| 3 | Optimizing MySQL | In this tutorial we will show ... | | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | | 6 | MySQL Security | When configured properly, MySQL ... | +----+-----------------------+-------------------------------------+
Cette requte recherche toute les lignes qui contiennent le mot ``MySQL'', mais qui ne contient pas le mot ``YourSQL''. Les recherches boolennes en texte intgral ont les caractristiques suivantes : Elle n'utilise pas le seuil de 50%. Elles ne trie pas automatiquement les lignes par ordre de pertinence dcroissante. Vous pouvez le voir dans l'exemple prcdent : la ligne ayant la plus grande pertinence est celle qui contient ``MySQL'' deux fois, mais elle est liste en dernier. Elles peuvent fonctionner sans l'index FULLTEXT, mme si c'est particulirement lent. Les recherches boolenne en texte intgral supporte les oprateurs suivants : + A signe + initial indique que le mot doit tre prsent dans la ligne retourne. Un signe - initial indique que le mot ne doit pas tre prsent dans la ligne retourne. (pas d'oprateur) Par dfaut, lorsque ni +, ni - n'est spcifi), le mot est optionnel, mais les lignes qui le contiennent seront mieux cotes. Cela imite le comportement de MATCH() ... AGAINST() sans l'option IN BOOLEAN MODE. > < Ces deux oprateurs servent changer la contribution d'un mot la pertinence. L'oprateur > accrot la contribution, et l'oprateur < la dcrot. Voir un exemple ci-dessous. ( ) Les parenthses servent grouper des mots en sous-expressions. Les groupes de parenthses peuvent tre imbriques. ~ Un signe tilde initial marque la ngation, et fait que la contribution du mot la pertinence sera ngative. Cet oprateur est pratique pour marquer les mots ambigus. Une ligne qui contient un tel mot sera classe bien plus bas, mais elle ne sera pas exclue, comme ce serait le cas avec -. * Un astrisque est l'oprateur de troncature. Contrairement aux autres oprateurs, il doit tre en suffixe et non pas en prfixe. " Une phrase entre guillemets double (") est recherche littralement, telle qu'elle a t saisie. Les exemples ci-dessous illustrent quelques rsultats de chanes de recherche avec les oprateurs : 'pomme banane' Recherche les lignes qui contiennent au moins un de ces mots.
572
'+pomme +jus' Recherche les lignes qui contiennent ces deux mots. '+pomme macintosh' Recherche les lignes qui contiennent le mot ``pomme'', mais classe plus haut les lignes qui contiennent aussi ``macintosh''. '+pomme -macintosh' Recherche les lignes qui contiennent ``pomme'' mais pas ``macintosh''. '+pomme +(>tatin <strudel)' Recherche les lignes qui contiennent les mots ``pomme'' et ``tatin'', ou ``pomme'' et ``strudel'' (dans n'importe quel ordre), mais classe ``pomme tatin'' plus haut que ``pomme strudel''. 'pomm*' Trouve les lignes qui contiennent des mots tels que ``pomme'', ``pommes'', ``pommier'', ou ``pommeau''. '"deux mots"' Recherche les lignes qui contiennent exactement la phrase ``deux mots'' (par exemple, les lignes qui contiennent ``deux mots d'amour'' mais pas ``le mot deux''). Notez que les caractres " qui entourent la phrase dlimitent la phrase. Ils ne dlimitent pas la chane.
573
Un autre exemple est la recherche de livres de Georges Simenon, de la srie Maigret, alors que l'utilisateur ne sais pas trop comment crire ``Maigret''. Alors que la recherche de ``Megre and the reluctant witnesses'' ne conduit qu' ``Maigret and the Reluctant Witnesses'' sans l'extension aveugle, la version avec extension aveugle va sortir la collection complte des livres avec le mot ``Maigret''. Note : comme l'extension aveugle augmente le niveau de bruit, en retournant des documents sans rapport, elle n'est utile que si la phrase de recherche est courte.
Puis, relancez le serveur et recompilez vos index FULLTEXT. La liste des mots rejets est dfinie dans la variable ft_stopword_file. See Section 13.5.3.18, Syntaxe de SHOW VARIABLES . Modifiez le selon vos gots, reconstruisez vos index FULLTEXT. Le taux de 50% est dtermin par la mthode de pondration choisie. Pour le dsactiver, il faut changer la ligne suivante dans myisam/ftdefs.h :
#define GWS_IN_USE GWS_PROB
Par la ligne:
#define GWS_IN_USE GWS_FREQ
574
Puis recompiler MySQL. Il n'est pas ncessaire de reconstruire les index dans ce cas. Note : en faisant ces modifications, vous diminuez normment les capacits de MySQL fournir des valeurs pertinentes pour la fonction MATCH(). Si vous avez rellement besoin de faire des recherches avec ces mots courants, il est prfrable de rechercher EN MODE BOOLEEN, lequel ne respecte pas le taux de 50%. Pour changer les oprateurs utiliss pour les recherches boolennes, modifiez la variable systme ft_boolean_syntax (disponible depuis MySQL 4.0.1). La variable peut aussi tre modifie durant le fonctionnement du serveur, mais vous devez avoir les droits de SUPER. La recompilation des index n'est pas possible. Section 5.2.3, Variables serveur systme dcrit les rgles de dfinition de cette variable. Si vous modifiez des variables d'indexation de textes qui affectent les index (les variables (ft_min_word_len, ft_max_word_len et ft_stopword_file), vous devez reconstruire les index FULLTEXT aprs avoir faire les modifications et relanc le serveur. Pour reconstruire les index, il est suffisant de faire une rparation QUICK :
mysql> REPAIR TABLE tbl_name QUICK;
Si vous utilisez spcifiquement les fonctionnalits IN BOOLEAN MODE, si vous mettez jour depuis MySQL 3.23 vers 4.0 ou plus rcent, il est ncessaire de remplacer aussi les enttes des index. Pour cela, utilisez l'opration de rparation USE_FRM :
mysql> REPAIR TABLE nom_de_table USE_FRM;
C'est ncessaire, car les recherches boolennes en texte plein requirent une option dans l'entte qui n'tait pas prsente en MySQL en version 3.23, et elle n'est pas ajoute si vous faites une rparation de type QUICK. Si vous tentez une recherche boolenne sans reconstruire l'index comme ceci, la recherche retournera des rsultats incorrects. Notez que si vous utilisez myisamchk pour effectuer une opration qui modifie les index de la table, pour une rparation ou une analyse, les index FULLTEXT sont reconstruits en utilisant la configuration par dfaut des index en texte plein, moins que vous ne les spcifiez autrement. Cela peut conduire des requtes qui chouent. Le problme survient car les valeurs de cette configuration n'est connue que du serveur. Elles ne sont pas stockes dans les fichiers d'index MyISAM. Pour viter ce problme si vous avez modifi la taille minimale ou maximale des mots, ou encore le fichier de mots interdits, spcifiez les options ft_min_word_len, ft_max_word_len et ft_stopword_file myisamchk, en donnant les mmes valeurs que pour mysqld. Par exemple, si vous avez donnez une taille minimale de mot de 3, vous pouvez rparer votre table avec myisamchk :
shell> myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
Pour vous assurer que le serveur et myisamchk utilisent les mmes valeurs pour les index, vous pouvez les placer dan s les sections [mysqld] et [myisamchk] du fichier d'options :
[mysqld] ft_min_word_len=3 [myisamchk] ft_min_word_len=3
Une alternative l'utilisation de myisamchk est l'utilisation de REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE ou ALTER TABLE. Ces commandes sont effectues par le serveur, qui connat la configuration des index en texte plein.
575
Fonctions de transtypage
Support de listes de mots toujours indexer ("always-index words"). Ceux ci pourraient tre n'importe quelle chane de caractres que l'utilisateur voudrais traiter comme des mots : par exemple "C++", "AS/400", "TCP/IP", etc. Support de la recherche full-text sur les tables MERGE. Support des jeux de caractres multi-octets. Rendre la liste des mots ignors dpendante de la langue des donnes. Stemming (dpendante de la langue des donnes, bien sr). Preprocesseur gnrique pour les UDF fournies par l'utilisateur. Rendre le modle plus flexible (en ajoutant des valeurs paramtrables pour FULLTEXT dans CREATE/ALTER TABLE).
La fonction de transtypage est trs pratique lorsque vous voulez crer une colonne avec un type spcifique dans une requte CREATE ... SELECT :
CREATE TABLE nouvelle_table SELECT CAST('2000-01-01' AS DATE);
Les fonctions peuvent aussi tre utilise pour trier des colonnes de type ENUM en ordre lexical. Normalement, le tri sur les colonnes ENUM est fait avec les valeurs numriques internes. Pour trier les valeurs avec l'ordre lexical CHAR :
576
Fonctions de transtypage
CAST(string AS BINARY) est l'quivalent de BINARY string. CAST(expr AS CHAR) traite l'expression comme une chane, avec le jeu de caractres par dfaut. Note : en MySQL 4.0 le CAST() en DATE, DATETIME ou TIME ne fait que marquer la colonne comme tant du type indiqu, mais n'en change pas la valeur. En MySQL 4.1.0, la valeur est convertie dans le type de colonne demand, puis il est envoy l'utilisateur. Cette fonctionnalit est une nouveaut du protocole 4.1, qui envoie les donnes au client :
mysql> SELECT CAST(NOW() AS DATE); -> 2003-05-26
Dans les prochaines versions de MySQL (probablement 4.1.2 ou 5.0) nous allons corriger CAST pour qu'elle modifie le rsultat si vous l'utilisez comme une partie d'une expression plus complexe, comme CONCAT("Date: ",CAST(NOW() AS DATE)). N'utilisez pas CAST() pour extraire des donnes dans diffrents formats, mais utilisez plutt LEFT ou EXTRACT(). See Section 12.5, Fonctions de dates et d'heures . Pour transformer une chane de caractres en une valeur numrique, vous ne devez rien faire de particulier ; juste utiliser la valeur de la chane en lieu et place de la valeur numrique :
mysql> SELECT 1+'1'; -> 2
Si vous utilisez un nombre dans un contexte de chane, le nombre sera automatiquement converti en une chane binaire.
mysql> SELECT concat("salut toi ",2); -> "salut toi 2"
Si vous utilisez un nombre dans un contexte de chane, le nombre sera automatiquement converti en chane binaire (BINARY).
mysql> SELECT CONCAT("Salut vous ",2); -> "Salut vous 2"
MySQL supporte l'arithmtique avec les valeurs 64 bits signes et non signes. Si vous utilisez une opration numrique (comme le signe +) et qu'un des oprandes est de type unsigned integer, alors, le rsultat sera une valeur non sign. Vous pouvez corriger cela en utilisant les oprateurs de transtypages SIGNED et UNSIGNED, qui transformeront l'opration respectivement en un entier sign sur 64 bits et un entier non sign sur 64 bits.
mysql> SELECT CAST(1-2 AS UNSIGNED) -> 18446744073709551615 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED); -> -1
Notez que si l'une ou l'autre opration est une valeur virgule flottante (Dans ce contexte, DECIMAL() est considr comme une valeur virgule flottante) le rsultat devrait tre une valeur virgule flottante et ne sera pas affect par la rgle ci-dessus.
mysql> SELECT CAST(1 AS UNSIGNED) -2.0 -> -1.0
Si vous utilisez une chane dans une opration arithmtique, elle sera converti en un nombre virgule flottante. Les fonctions CAST() et CONVERT() ont t ajoutes dans la version 4.0.2 de MySQL. L'affichage des valeurs non signes a t modifi dans la version 4.0 de MySQL pour pouvoir supporter correctement les valeurs de type BIGINT. Si vous voulez utiliser du code fonctionnant dans
577
Autres fonctions
la version 4.0 et la version 3.23 de MySQL (dans ce cas, vous ne pouvez probablement pas utiliser les fonctions de transtypage), vous pouvez utiliser l'astuce suivante pour avoir un rsultat sign lorsque vous soustrayez deux colonnes d'entier non sign :
SELECT (unsigned_column_1+0.0)-(unsigned_column_2+0.0);
L'ide est que les colonnes sont convertis en un point mobile avant de faire la soustraction. Si vous rencontrez un problme avec les colonnes UNSIGNED dans vos anciennes applications MySQL lorsque vous effectuez le port sous la version 4.0 de MySQL , vous pouvez utiliser l'option -sql-mode=NO_UNSIGNED_SUBTRACTION lorsque vous lancez mysqld. Notez cependant qu'aussi longtemps que vous employez ceci, vous ne serez pas capable d'utiliser efficacement les colonnes de type UNSIGNED BIGINT.
Le rsultat est un entier de 64 bits non sign. << Dcale les bits de l'entier (BIGINT) sur la gauche :
mysql> SELECT 1 << 2; -> 4
Le rsultat est un entier de 64 bits non sign. >> Dcale les bits de l'entier (BIGINT) sur la droite :
578
Fonctions de chiffrements
Le rsultat est un entier de 64 bits non sign. ~ Inverse tous les bits :
mysql> SELECT 5 & ~1; -> 4
Le rsultat est un entier de 64 bits non sign. BIT_COUNT(N) Retourne le nombre de bits non nuls de l'argument N :
mysql> SELECT BIT_COUNT(29); -> 4
Vous pouvez obtenir encore plus de scurit en vitant de transfrer la cl pour chaque requte, en la stockant dans une variable sur le serveur au moment de la connexion :
SELECT @password:="my password"; INSERT INTO t VALUES (1,AES_ENCRYPT("text",@password));
Les fonctions AES_ENCRYPT() et AES_DECRYPT() ont t ajoutes dans la version 4.0.2 de MySQL et peuvent tre considres comme tant les fonctions de cryptographie les plus sres disponibles actuellement dans MySQL. DECODE(crypt_str,pass_str) 579
Fonctions de chiffrements
Dchiffre la chane chiffre crypt_str en utilisant la cl pass_str. crypt_str doit tre une chane qui a t renvoye par la fonction ENCODE(). ENCODE(str,pass_str) Chiffre la chane str en utilisant la cl pass_str. Pour dchiffrer le rsultat, utilisez la fonction DECODE(). Le rsultat est une chane binaire de la mme longueur que string. Si vous voulez sauvegarder le rsultat dans une colonne, utilisez une colonne de type BLOB. DES_DECRYPT(crypt_str[,key_str]) Dchiffre une chane chiffre l'aide de la fonction DES_ENCRYPT(). Notez que cette fonction fonctionne uniquement si vous avez configur MySQL avec le support SSL. See Section 5.6.7, Utilisation des connexions scurises . Si l'argument key_string n'est pas donn, la fonction DES_DECRYPT() examine le premier bit de la chane chiffre pour dterminer le numro de cl DES utilis pour chiffrer la chane originale, alors la cl est lu dans le fichier des-key-file pour dchiffrer le message. Pour pouvoir utiliser cela, l'utilisateur doit avoir le privilge SUPER. Si vous pass l'argument key_string cette fonction, cette chane est utilise comme cl pour dchiffrer le message. Si la chane string_to_decrypt ne semble pas tre une chane chiffre, MySQL retournera la chane string_to_decrypt. Si une erreur survient, cette fonction retourne NULL. DES_ENCRYPT(str[,(key_num|key_str)]) Chiffre la chane avec la cl donne en utilisant l'algorithme DES. Notez que cette fonction fonctionne uniquement si vous avez configur MySQL avec le support SSL. See Section 5.6.7, Utilisation des connexions scurises . La cl de hachage utilise est choisie en suivant les recommandations suivantes : Argument Un seul argument Un numro de cl Une chane Description La premire cl de des-key-file est utilise. Le numro de la cl donne (0-9) de des-key-file est utilise. La chane donne key_string doit tre utilis pour chiffrer string_to_encrypt.
La chane retourne doit tre une chane binaire o le premier caractre doit tre CHAR(128 | key_number). Le nombre 128 a t ajout pour reconnatre facilement une cl de hachage. Si vous utilisez une chane comme cl, key_number doit tre 127. Si une erreur survient, la fonction retournera NULL. La longueur de la chane de rsultat doit tre : new_length= org_length + (8-(org_length % 8))+1. des-key-file a le format suivant :
key_number des_key_string
580
Fonctions de chiffrements
key_number des_key_string
Chaque key_number doit tre un nombre dans l'intervalle 0 9. Les lignes dans le fichier peuvent tre dans n'importe quel ordre. des_key_string est la chane qui permettra le chiffrage du message. Entre le nombre et la cl, il doit y avoir au moins un espace. La premire cl est la cl par dfaut qui sera utilis si vous ne spcifiez pas d'autres cls en arguments de la fonction DES_ENCRYPT(). Vous pouvez demander MySQL de lire de nouvelles valeurs de cl dans le fichier de cls avec la commande FLUSH DES_KEY_FILE. Cela require le privilge Reload_priv. Un des bnfices d'avoir une liste de cls par dfaut est que cela donne aux applications la possibilit de regarder l'existence de la valeur chiffre de la colonne, sans pour autant donner la possibilit l'utilisateur final de dchiffrer ces valeurs.
mysql> SELECT customer_address FROM customer_table WHERE crypted_credit_card = DES_ENCRYPT("credit_card_number");
ENCRYPT(str[,salt]) Chiffre la chane str en utilisant la fonction crypt(). L'argument salt doit tre une chane de deux caractres. (A partir de la version 3.22.16, l'argument salt peut tre plus long que deux caractres.) :
mysql> SELECT ENCRYPT("hello"); -> 'VxuFAJXVARROc'
Si la fonction crypt() n'est pas disponible sur votre systme, la fonction ENCRYPT() retournera toujours NULL. La fonction ENCRYPT() conserve uniquement les 8 premiers caractres de la chane str, au moins, sur certains systme. Le comportement exact est directement dtermin par la fonction systme crypt() sous-jacente. MD5(str) Calcul la somme de vrification MD5 de la chane string. La valeur retourne est un entier hexadcimal de 32 caractres qui peut tre utilis, par exemple, comme cl de hachage :
mysql> SELECT MD5("testing"); -> 'ae2b1fca515949e5d54fb22b8ed95575'
C'est l'algorithme RSA ("RSA Data Security, Inc. MD5 Message-Digest Algorithm"). OLD_PASSWORD(str) OLD_PASSWORD() est disponible depuis MySQL 4.1, lorsque l'implmentation de la fonction PASSWORD() a t modifie pour amliorer la scurit. OLD_PASSWORD() retourne la valeur pre-4.1 de PASSWORD(). Section 5.5.9, Hashage de mots de passe en MySQL 4.1 . PASSWORD(str) Calcule un mot de passe chiffr partir de la chane str. C'est cette fonction qui est utilis pour chiffrer les mots de passes MySQL pour tre stocks dans une colonne de type Password de la table user :
mysql> SELECT PASSWORD('badpwd'); -> '7f84554057dd964b'
Le chiffrage par PASSWORD() n'est pas rversible. PASSWORD() n'est pas un chiffrage comparable la fonction de chiffrage Unix. Voir ENCRYPT(). 581
Fonctions d'informations
Note : La fonction PASSWORD() est utilise durant l'identification au serveur MYSQL. Il est recommand de ne pas l'utiliser pour vos applications. Utilisez plutt MD5() ou SHA1(). Voyez aussi RFC-2195 pour plus d'informations sur comment grer les mots de passe et l'identification de votre systme. SHA1(str), SHA(str) Calcule la somme de vrification SHA1 160 bits de la chane string, comme dcrit dans la RFC 3174 (Secure Hash Algorithm). La valeur retourne est un entier hexadcimal de 40 caractres, ou bien NULL dans le cas o l'argument vaut NULL. Une des possibilits d'utilisation de cette fonction est le hachage de cl. Vous pouvez aussi l'utilis comme fonction de cryptographie sre pour stocker les mots de passe.
mysql> SELECT SHA1("abc"); -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
La fonction SHA1() a t ajoute dans la version 4.0.2 de MySQL et peut tre considre comme une mthode de cryptographie plus sre que la fonction MD5(). La fonction SHA() est un alias de la fonction SHA1().
Le temps affich est le temps ct client, et non pas les ressources processeurs consommes. il est conseill d'utiliser BENCHMARK() plusieurs fois de suite pour interprter un rsultat, en dehors de charges ponctuelles sur le serveur. CHARSET(str) Retourne le jeu de caractres de la chane argument.
mysql> SELECT CHARSET('abc'); -> 'latin1' mysql> SELECT CHARSET(CONVERT('abc' USING utf8)); -> 'utf8' mysql> SELECT CHARSET(USER()); -> 'utf8'
CHARSET() a t ajout en MySQL version 4.1.0. COERCIBILITY(str) Retourne la coercibilit de la collation de la chane argument.
mysql> SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci); -> 0 mysql> SELECT COERCIBILITY('abc'); -> 3 mysql> SELECT COERCIBILITY(USER()); -> 2
582
Fonctions d'informations
Les valeurs retournes possibles sont : Coercibilit 0 1 2 3 Signification Collation explicite Par de collation Collation implicite Coercible
Les valeurs les plus faibles ont la plus haute priorit. COERCIBILITY() a t ajout en MySQL version 4.1.1. COLLATION(str) Retourne la collation du jeu de caractres de la chane argument.
mysql> SELECT COLLATION('abc'); -> 'latin1_swedish_ci' mysql> SELECT COLLATION(_utf8'abc'); -> 'utf8_general_ci'
COLLATION() a t ajout en MySQL version 4.1.0. CONNECTION_ID() Retourne l'identifiant de connexion courant (thread_id). Chaque connexion a son propre identifiant unique.
mysql> SELECT CONNECTION_ID(); -> 23786
CONNECTION_ID() a t ajout en MySQL version 3.23.14. CURRENT_USER() Retourne le nom d'utilisateur et le nom d'hte de la session courante. Cette valeur correspond au compte qui a t utilis durant l'identification auprs du serveur. Cela peut tre diffrent des valeurs de USER().
mysql> SELECT USER(); -> 'davida@localhost' mysql> SELECT * FROM mysql.user; ERROR 1044: Access denied for user: '@localhost' to database 'mysql' mysql> SELECT CURRENT_USER(); -> '@localhost'
Cet exemple montre que mme si le client a indiqu le nom d'utilisateur davida (comme mentionn par la fonction USER()), le serveur a identifi le client comme un utilisateur anonyme (comme indiqu par la fonction CURRENT_USER()). Une situation qui arrive s'il n'y a aucun compte de list dans les tables de droits pour davida. CURRENT_USER() a t ajout en MySQL version 4.0.6. DATABASE() Retourne le nom de la base de donnes courante :
mysql> SELECT DATABASE(); -> 'test'
583
Fonctions d'informations
Si aucune base de donnes n'a t slectionne, DATABASE() retourne une chane vide. A partir de la version 4.1.1, elle retourne NULL. FOUND_ROWS() Une commande SELECT peut inclure une clause LIMIT pour restreindre le nombre de lignes qui sera retourne par le client. Dans certains cas, il est mieux de savoir combien de lignes une commande aurait retourn, sans la clause LIMIT, mais sans lancer nouveau le calcul. Pour cela, ajoutez l'option SQL_CALC_FOUND_ROWS dans la commande SELECT, puis appelez FOUND_ROWS() aprs :
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();
Le second SELECT retourne un nombre indiquant combien de lignes le premier SELECT aurait retourn s'il n'avait pas t crit avec une clauseLIMIT. Notez que si vous utilisez SELECT SQL_CALC_FOUND_ROWS ..., MySQL calcule toutes les lignes dans la liste des rsultats. Ainsi, c'est plus rapide si vous n'utilisez pas de clause LIMIT et que la liste des rsultats n'a pas besoin d'tre envoye au client. Si la commande SELECT prcdente n'inclut pas l'option SQL_CALC_FOUND_ROWS, alors FOUND_ROWS() pourrait retourner une valeur diffrente suivant que LIMIT est utilis ou pas. SQL_CALC_FOUND_ROWS et FOUND_ROWS() peuvent tre pratiques dans des situations o vous devez limiter le nombre de lignes que la requte retourne, mais que vous devez tout de mme connatre le nombre de ligne total, sans excuter une seconde requte. Un exemple classique est un script web qui prsente des rsultats de recherche. En utilisant FOUND_ROWS(), vous connatrez facilement le nombre de lignes de rsultat. L'utilisation de SQL_CALC_FOUND_ROWS et FOUND_ROWS() est plus complexe pour les requtes UNION que pour les commandes SELECT simples, car LIMIT peut intervenir plusieurs fois dans une commande UNION. Elle sera applique diffrentes commandes SELECT de la commande UNION, ou globalement l'UNION. Le but de SQL_CALC_FOUND_ROWS pour UNION est de retourner le nombre de lignes qui aurait t retourn sans la clause globale LIMIT. Les conditions d'utilisation de SQL_CALC_FOUND_ROWS avec UNION sont : Le mot cl SQL_CALC_FOUND_ROWS doit apparatre dans le premier SELECT de l'UNION. La valeur deFOUND_ROWS() est exactement la mme que si UNION ALL tait utilis. Si UNION sans ALL est utilis, des rductions de doublons surviendront, et la valeur de FOUND_ROWS() sera approximative. Si aucune clause LIMIT n'est prsente dans UNION, SQL_CALC_FOUND_ROWS est ignor et retourne le nombre de lignes dans la table temporaire cr durant le traitement de l'UNION. SQL_CALC_FOUND_ROWS et FOUND_ROWS() sont disponibles partir de la version 4.0.0 de MySQL. LAST_INSERT_ID(), LAST_INSERT_ID(expr) Retourne le dernier identifiant automatiquement gnr par une colonne AUTO_INCREMENT.
mysql> SELECT LAST_INSERT_ID(); -> 195
Le dernier ID gnr est conserv par le serveur pour chaque connexion. Un autre client ne la modifiera donc pas, mme s'ils gnrent une autre valeur AUTO_INCREMENT de leur cot. Ce comportement permet de s'assurer que les actions des autres clients ne perturbe pas les actions du client en cours.
584
Fonctions d'informations
La valeur de LAST_INSERT_ID() ne sera pas modifie non plus si vous modifiez directement la valeur d'une colonne AUTO_INCREMENT avec une valeur simple (c'est dire, une valeur qui n'est ni NULL, ni 0). Si vous insrez plusieurs lignes au mme moment avec une requte INSERT, LAST_INSERT_ID() retourne la valeur de la premire ligne insre. La raison cela est que cela rend possible la reproduction facilement la mme requte INSERT sur d'autres serveurs. Si vous utilisez une commande INSERT IGNORE et que la ligne est ignore, le compteur AUTO_INCREMENT sera malgr tout incrment, et LAST_INSERT_ID() retournera une nouvelle valeur. Si expr est donne en argument la fonction LAST_INSERT_ID(), alors la valeur de l'argument sera retourn par la fonction et sera enregistr comme tant la prochaine valeur retourne par LAST_INSERT_ID(). Cela peut tre utilis pour simuler des squences : Commencez par crer la table suivante :
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
Utilisez cette table pour gnrer des squences de nombre comme ceci :
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();
La commande UPDATE incrmente le compteur de squence, et fait que le prochain appel LAST_INSERT_ID() va retourner une valeur diffrente. La commande SELECT lit cette valeur. La fonction C mysql_insert_id() peut aussi tre utilise pour lire la valeur. See Section 24.2.3.33, mysql_insert_id() . Vous pouvez gnrer des squences sans appeler la fonction LAST_INSERT_ID(), mais l'utilit d'utiliser cette fonction cette fois si est que la valeur ID est gre par le serveur comme tant la dernire valeur gnre automatiquement. (scurit multi-utilisateur). Vous pouvez retrouver la nouvelle ID tout comme vous pouvez lire n'importe quelle valeur AUTO_INCREMENT dans MySQL. Par exemple, la fonction LAST_INSERT_ID() (sans argument) devrait retourner la nouvelle ID. La fonction C de l'API mysql_insert_id() peut tre galement utilise pour trouver cette valeur. Notez que la fonction mysql_insert_id() est incrmente uniquement aprs des requtes INSERT et UPDATE, donc, vous ne pouvez pas utiliser la fonction C de l'API pour trouver la valeur de LAST_INSERT_ID(expr) aprs avoir excut d'autres types de requtes, comme SELECT ou bien SET. SESSION_USER() SESSION_USER() est un synonyme de USER(). SYSTEM_USER() SYSTEM_USER() est un synonyme de USER(). USER() Retourne le nom d'utilisateur et le nom d'hte courant MySQL :
mysql> SELECT USER(); -> 'davida@localhost'
La valeur indique le nom d'utilisateur qui a t spcifi lors de l'identification avec le serveur MySQL, et l'hte client avec lequel il est connect.
585
Fonctions diverses
Avant la version 3.22.11, la fonction ne retournait pas le nom d'hte. Vous pouvez extraire le nom d'utilisateur sans l'hte avec la commande suivante :
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1); -> 'davida'
Depuis MySQL version 4.1, USER() retourne la valeur au format utf8. Assurez vous que la chane '@' est bien interprte dans ce jeu de caractres :
mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1); -> 'davida'
Notez que si votre version se termine par -log, cela signifie que le systme d'historique est actif.
GET_LOCK(str,timeout) Tente de poser un verrou nomm str, avec un dlai d'expiration (timeout) exprim en seconde. Retourne 1 si le verrou a t pos avec succs, 0 si il n'a pas pu tre pos avant l'expiration du dlai et NULL si une erreur est survenu (comme par exemple un manque de mmoire, ou la mort du thread lui-mme, par mysqladmin kill). Un verrou sera lev lorsque vous excuterez la commande RELEASE_LOCK(), GET_LOCK() ou si le thread se termine. Cette fonction peut tre utilise pour implmenter des verrous applicatifs ou pour simuler des verrous de lignes. Les requtes concurrentes des autres clients de mme nom seront bloques ; les clients qui s'entendent sur un nom de verrou peuvent les utiliser pour effectuer des verrouillages coopratifs :
mysql> SELECT GET_LOCK("lock1",10); -> 1 mysql> SELECT IS_FREE_LOCK("lock2"); -> 1 mysql> SELECT GET_LOCK("lock2",10); -> 1 mysql> SELECT RELEASE_LOCK("lock2"); -> 1 mysql> SELECT RELEASE_LOCK("lock1"); -> NULL
Notez que le deuxime appel RELEASE_LOCK() retourne NULL car le verrou "lock1" a t automatiquement libr par le deuxime appel GET_LOCK(). INET_ATON(expr) Retourne un entier qui reprsente l'expression numrique de l'adresse rseau. Les adresses peuvent tre des entiers de 4 ou 8 octets. 586
Fonctions diverses
Le nombre gnr est toujours dans l'ordre des octets rseau ; par exemple, le nombre prcdent est calcul comme ceci : 209*256^3 + 207*256^2 + 224*256 +40. Depuis MySQL 4.1.2, INET_ATON() comprend aussi les IP courtes :
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1'); -> 2130706433, 2130706433
INET_ATON() a t ajout en MySQL 3.23.15. INET_NTOA(expr) Retourne l'adresse rseau (4 ou 8 octets), de l'expression numrique exp :
mysql> SELECT INET_NTOA(3520061480); -> "209.207.224.40"
IS_FREE_LOCK(str) Regarde si le verrou nomm str peut tre librement utilis (i.e., non verrouill). Retourne 1 si le verrou est libre (personne ne l'utilise), 0 si le verrou est actuellement utilis et NULL si une erreur survient (comme un argument incorrect). IS_USED_LOCK(str) Vrifie si le verrou appel str est actuellement pos ou pas. Si c'est le cas, la fonction retourne l'identifiant de connexion qui a le verrou. Sinon, elle retourne NULL. IS_USED_LOCK() a t ajout en MySQL version 4.1.0. MASTER_POS_WAIT(log_name, log_pos) Bloque le matre jusqu' ce que l'esclave atteigne une position donne dans le fichier d'historique principal, durant une rplication. Si l'historique principal n'est pas initialis, retourne NULL. Si l'esclave n'est pas dmarr, le matre restera bloqu jusqu' ce que l'esclave soit dmarr et ai atteint la position demande. Si l'esclave a dj dpass cette position, la fonction se termine immdiatement. La valeur retourne est le nombre d'vnements qui a du tre trait pour atteindre la position demande, ou NULL en cas d'erreur. Cette fonction est trs utile pour contrler la synchronisation matre-esclave, mais elle a t initialement crite pour faciliter les tests de rplications. RELEASE_LOCK(str) Libre le verrou nomm str, obtenu par la fonction GET_LOCK(). Retourne 1 si le verrou a bien t libr, 0 si le verrou n'a pas t libr par le thread (dans ce cas, le verrou reste pos) et NULL si le nom du verrou n'existe pas. Le verrou n'existe pas si il n'a pas t obtenu par la fonction GET_LOCK() ou si il a dj t libr. La commande DO est utilisable avec RELEASE_LOCK(). See Section 13.1.2, Syntaxe de DO . UUID() Retourne un Universal Unique Identifier (UUID) gnr grce ``DCE 1.1: Remote Procedure Call'' (Appendix A) CAE (Common Applications Environment) Specifications, publi par le The Open Group en octobre 1997 (Document numro C706). Un UUID est conu comme un numro qui est globalement unique dans l'espace, et le temps. Deux appels UUID() sont supposs gnrer deux valeurs diffrentes, mme si ces appels sont faits sur deux ordinateurs spars, qui ne sont pas connects ensembles.
587
Un UUID est un nombre de 128 bits, reprsent par une chane de 5 nombres hexadcimaux, au format aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee : Les trois premiers nombres sont gnrs partir d'un timestamp. Le quatrime nombre prserver l'unicit temporelle si le timestamp perd sa monotonie (par exemple, cause du changement d'heure d'hiver/t). Le cinquime nombre est un nombre IEEE 802 qui fournit l'unicit. Un nombre alatoire est utilis la si ce dernier n'est pas disponible (par exemple, comme l'hte n'a pas de carte Ethernet, nous ne savons pas comment trouver une adresse matriel sur le systme d'exploitation). Dans ce cas, l'unicit spatiale ne peut tre garantie. Nanmoins, une collision aura une trs faible proprit. Actuellement, l'adresse MAC est une interface utilise sur FreeBSD et Linux. Sur les autres systmes d'exploitation, MySQL gnre un nombre alatoire de 48 bits.
mysql> SELECT UUID(); -> '6ccd780c-baba-1026-9564-0040f4311e29'
Notez que UUID() ne fonctionne pas encore avec la rplication. UUID() a t ajoute en MySQL 4.1.2.
BIT_AND(expr) Retourne la combinaison AND bit bit de expr. Le calcul est fait en prcision de 64 bits (BIGINT). Depuis MySQL 4.0.17, cette fonction retourne 18446744073709551615 s'il n'y avait pas de lignes. (C'est un entier BIGINT non-sign, dont tous les bits sont 1.) Avant 4.0.17, la fonction retournait -1 s'il n'y avait pas de ligne trouves. BIT_OR(expr) Retourne la combinaison OR bit bit de expr. Le calcul est fait en prcision de 64 bits (BIGINT). Cette fonction retourne 0 s'il n'y a pas de ligne traiter. BIT_XOR(expr) Retourne la combinaison XOR bit bit de expr. Le calcul est fait en prcision de 64 bits (BIGINT). Cette fonction retourne 0 s'il n'y a pas de ligne traiter. Cette fonction est disponible depuis MySQL 4.1.1. COUNT(expr) 588
Retourne le nombre de valeurs non-NULL dans les lignes lues par la commande SELECT :
mysql> SELECT student.student_name,COUNT(*) -> FROM student,course -> WHERE student.student_id=course.student_id -> GROUP BY student_name;
COUNT(*) est un peu diffrente dans son action, car elle retourne le nombre de lignes, mme si elles contiennent NULL. COUNT(*) est optimise pour retourner trs rapidement un rsultat si SELECT travaille sur une table, qu'aucune autre colonne n'est lue, et qu'il n'y a pas de clause WHERE. Par exemple :
mysql> SELECT COUNT(*) FROM student;
Cette optimisation s'applique uniquement pour les tables MyISAM et ISAM, car un compte exact du nombre de lignes est stock pour ces types de tables, et il peut tre lu trs rapidement. Pour les moteurs de tables transactionnels, (InnodB, BDB), le stockage de cette valeur est plus problmatique, car plusieurs transactions peuvent survenir en mme temps, et affecter toutes ce compte. COUNT(DISTINCT expr,[expr...]) Retourne le nombre de valeurs non-NULL distinctes :
mysql> SELECT COUNT(DISTINCT results) FROM student;
Avec MySQL, vous pouvez lire le nombre d'expression distinctes qui ne contiennent pas NULL, en plaant ici une liste d'expression. Avec SQL-99, vous devriez faire une concatnation de toutes les expressions dans COUNT(DISTINCT ...). GROUP_CONCAT(expr) Syntaxe complte :
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col ...]] [SEPARATOR str_val])
Cette fonction a t ajoute en MySQL version 4.1. Elle retourne la chane rsultant de la concatnation de toutes les valeurs du groupe :
mysql> SELECT student_name, -> GROUP_CONCAT(test_score) -> FROM student -> GROUP BY student_name;
ou :
mysql> SELECT student_name, -> GROUP_CONCAT(DISTINCT test_score -> ORDER BY test_score DESC SEPARATOR " ") -> FROM student -> GROUP BY student_name;
Avec MySQL, vous pouvez obtenir la concatnation d'une srie d'expressions. Vous pouvez liminer les doublons en utilisant DISTINCT. Si vous voulez trier les valeurs du rsultat, il faut utiliser ORDER BY. Pour trier en ordre inverse, ajoutez le mot cl DESC (descendant) au nom de la colonne que vous triez dans la clause ORDER BY. Par dfaut, l'ordre est ascendant. Cela peut tre spcifi explicitement avec le mot cl ASC. SEPARATOR est une chane qui sera insre entre chaque valeur du rsultat. La valeur par dfaut est une virgule ",". vous pouvez supprimer le sparateur en spcifiant la chane vide SEPARATOR "". 589
Options de GROUP BY
Vous pouvez donner une taille maximale la variable group_concat_max_len de votre configuration. La syntaxe pour faire cela durant l'excution est :
SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer;
Si une taille maximale a t atteinte, le rsultat sera tronqu cette taille maximale. Note : il y a encore de petites limitations pour GROUP_CONCAT() lorsqu'il faut utiliser des valeurs DISTINCT avec ORDER BY et et en utilisant les valeurs BLOB. Voyez Section 1.5.7.4, Bugs connus / limitations de MySQL . GROUP_CONCAT() a t ajoute en MySQL 4.1. MIN(expr), MAX(expr) Retourne le minimum ou le maximum de expr. MIN() et MAX() peuvent prendre des chanes comme argument : dans ce cas, elles retournent la valeur minimale ou maximale de la valeur de la chane. See Section 7.4.5, Comment MySQL utilise les index .
mysql> SELECT student_name, MIN(test_score), MAX(test_score) -> FROM student -> GROUP BY student_name;
Actuellement, MIN(), MAX() et d'autres fonctions d'agrgation MySQL, le serveur compare les valeurs de type ENUM et SET avec leur valeur de chane, et non pas leur position relative dans l'ensemble. Ce sera corrig. STD(expr), STDDEV(expr) Retourne la dviation standard de expr (la racine carre de la VARIANCE(). Ceci est une extension au standard SQL 99. La forme STDDEV() de cette fonction est fournie pour assurer la compatibilit Oracle. SUM(expr) Retourne la somme de expr. Notez que si le rsultat ne contient pas de ligne, cette fonction retournera NULL. VARIANCE(expr) Retourne la variance standard de l'expression expr (en considrant que les lignes forment une population totale, et non pas un chantillon. Le nombre de ligne est le dnominateur. C'est une extension la norme SQL-99 (disponible en version version 4.1 ou plus rcent).
590
Options de GROUP BY
Le contenu de cette table peut tre agrg par anne avec la clause GROUP BY :
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year; +------+-------------+ | year | SUM(profit) | +------+-------------+ | 2000 | 4525 | | 2001 | 3010 | +------+-------------+
Cette requte affiche le profit par anne, mais si vous voulez dterminer le profit total de toutes les annes, vous devez ajouter ces valeurs vous-mmes, ou faire une autre requte. Ou alors, vous pouvez utiliser la clause ROLLUP, qui fournit les deux niveaux d'analyse dans la mme requte. En ajoutant l'option WITH ROLLUP la clause GROUP BY, la requte va produire une autre ligne, avec le grand total de toutes les annes :
mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP; +------+-------------+ | year | SUM(profit) | +------+-------------+ | 2000 | 4525 | | 2001 | 3010 | | NULL | 7535 | +------+-------------+
La ligne du grand total est identifie par la valeur NULL dans la colonne year. ROLLUP a des effets plus complexes lorsqu'il y a plusieurs colonnes dans la clause GROUP BY. Dans ce cas, il a y un changement de valeur pour toutes sauf la dernire colonne de groupement, et la requte va produire les super-agrgats. Par exemple, sans la clause ROLLUP, le rsum des ventes de la table sales bas sur l'anne year, le pays country et le produit product peut ressembler ceci :
mysql> SELECT year, country, product, SUM(profit) -> FROM sales -> GROUP BY year, country, product; +------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2001 | Finland | Phone | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | +------+---------+------------+-------------+
Le rsultat indique les valeurs rsumes pour chaque triplet anne/pays/produit. Si nous ajoutons la clause ROLLUP, la requte produit plusieurs nouvelles lignes :
mysql> SELECT year, country, product, SUM(profit) -> FROM sales -> GROUP BY year, country, product WITH ROLLUP; +------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | India | NULL | 1350 |
591
Options de GROUP BY
| 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2000 | USA | NULL | 1575 | | 2000 | NULL | NULL | 4525 | | 2001 | Finland | Phone | 10 | | 2001 | Finland | NULL | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | | 2001 | USA | NULL | 3000 | | 2001 | NULL | NULL | 3010 | | NULL | NULL | NULL | 7535 | +------+---------+------------+-------------+
Pour cette requte, ajouter ROLLUP fait que la requte ajoute les rsums de quatre niveaux d'analyse, et non pas un seul. Voici comment interprter le rsultat de la clause ROLLUP : Aprs chaque jeu de ligne sur les produits, pour une anne et un pays donne, un rsum est ajout, indiquant le total de tous les produits. Ces lignes voient leur colonne product contenir la valeur NULL. Aprs chaque jeu de ligne couvrant une anne particulire, une nouvelle ligne est ajoute pour afficher le total de tous les pays et produits, pour cette anne la. Ces lignes voient leurs colonnes country et products contenir NULL. Finalement, suivant toutes les autres lignes, un rsum gnral est produit, avec le grand total de toutes les annes, pays et produits. Cette ligne contient la valeur NULL pour toutes les colonnes year, country et products. Autres considrations avec ROLLUP Voici quelques comportements spcifiques de MySQL et son implmentation de ROLLUP: Lorsque vous utilisez ROLLUP, vous ne pouvez pas utiliser de clause ORDER BY pour trier les rsultats. En d'autres termes, ROLLUP et ORDER BY sont mutuellement exclusives. Toutefois, vous avec toujours le contrle sur l'ordre de tri avec la clause GROUP BY. Vous pouvez utiliser explicitement les mots ASC et DESC avec les colonnes listes dans GROUP BY pour spcifier les ordres de tri des colonnes individuelles. Les lignes de rsums de ROLLUP apparaissent toujours aprs les lignes pour lesquelles ils sont calculs, quelque soit le tri. La clause LIMIT peut tre utilise pour restreindre le nombre de lignes retournes au client. LIMIT s'applique aprs ROLLUP, et la limite s'appliquera aux lignes ajoutes par ROLLUP. Par exemple :
mysql> SELECT year, country, product, SUM(profit) -> FROM sales -> GROUP BY year, country, product WITH ROLLUP -> LIMIT 5; +------+---------+------------+-------------+ | year | country | product | SUM(profit) | +------+---------+------------+-------------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | +------+---------+------------+-------------+
Notez qu'utiliser LIMIT avec ROLLUP peut conduire des rsultats plus difficiles interprter, car vous avez moins de contexte pour comprendre les rsums. Les indicateurs NULL de chaque super-agrgat sont produits lorsque la ligne est envoye au client. Le serveur recherche les colonnes cites dans la clause GROUP BY, en les prenant la plus gauche, dont la valeur change. Toute colonne du jeu de rsultat dont le nom ne correspond pas lexicalement un de ces noms, verra sa valeur tre NULL. Si vous spcifiez un groupement par numro de colonne, le serveur identifiera aussi les colonnes qui devront recevoir NULL.
592
Comme les valeurs NULL des rsums sont places dans le rsultat aussi tard durant le traitement de la requte, nous ne pouvons pas les tester comme tant des valeurs NULL provenant de la requte elle-mme. Par exemple, vous ne pourrez pas ajouter HAVING product IS NULL pour liminer certains rsums qui ne vous intressent pas. D'un autre cot, les valeurs NULL apparaissent comme des valeurs NULL du cot du client, et peuvent tre repres en tant que telles par le client MySQL.
En SQL standard, vous devriez ajouter la colonne customer.name la clause GROUP BY. Avec MySQL, ce nom est redondant si vous n'utilisez pas le mode ANSI. N'utilisez pas cette fonctionnalit si les colonnes que vous omettez dans la clause GROUP BY ne sont pas unique dans le groupe!! Vous auriez des rsultats inattendus! Dans certains cas, vous pouvez utiliser MIN() et MAX() pour obtenir une valeur spcifique d'une colonne, mme si cette valeur n'est pas unique. L'exemple suivant donne la valeur de la colonne column issue de la ligne contenant la plus petit valeur de la colonne sort :
SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)
See Section 3.6.4, La ligne contenant la plus grande valeur d'un certain champ par rapport un groupe . Notez que si vous utilisez MySQL version 3.22 ou plus ancien, ou si vous essayez de suivre la norme SQL-99, vous ne pouvez pas utiliser les expressions dans GROUP BY ou ORDER BY. Vous pouvez contourner cette limitation en utilisant un alias pour l'expression :
mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name -> GROUP BY id,val ORDER BY val;
593
594
Syntaxe multi-tables :
595
Syntaxe de DELETE
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...] FROM table-references [WHERE where_definition]
ou :
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name[.*] [, table_name[.*] ...] USING table-references [WHERE where_definition]
DELETE efface les enregistrements de nom_de_table qui satisfont la condition donne par clause_where, et retourne le nombre d'enregistrements effacs. Si vous excutez un DELETE sans clause WHERE, tous les enregistrements sont effacs. Si vous le faites en mode AUTOCOMMIT cela aura le mme effet qu'un TRUNCATE. See Section 13.1.9, Syntaxe de TRUNCATE . Avec MySQL 3.23, DELETE sans clause WHERE retournera zro comme nombre d'enregistrements affects. Si vous voulez vraiment savoir combien d'enregistrements ont t effacs quand vous videz une table, et que vous tes prts souffrir d'un lger ralentissement, vous pouvez utiliser une requte DELETE de ce genre :
mysql> DELETE FROM nom_de_table WHERE 1>0;
Notez que c'est plus lent que DELETE FROM nom_de_table sans clause WHERE, parce que cela efface un enregistrement la fois. Si vous effacez des lignes contenant la valeur maximum d'une colonne AUTO_INCREMENT, la valeur sera rutilise pour par une table ISAM ou BDB, mais pas pour une table MyISAM ou InnoDB. Si vous effacez toutes les lignes dans une table avec une commande DELETE FROM tbl_name (avec une clause WHERE) avec le mode AUTOCOMMIT, la squence redmarrer zro pour tous les types de table sauf InnoDB et, depuis MySQL 4.0, MyISAM. Il y a des exceptions ce comportement pour les tables InnoDB, qui sont prsentes dans la section Section 15.7.3, Comment les colonnes AUTO_INCREMENT fonctionnent avec InnoDB . Pour les tables MyISAM et BDB, vous pouvez spcifier une autre colonne AUTO_INCREMENT dans une cl multi-colonnes. Dans ce cas, la rutilisation des cls partir de la fin de la squence se fait aussi pour les tables MyISAM. See Section 3.6.9, Utiliser AUTO_INCREMENT . La commande DELETE supporte les clauses suivantes : Si vous spcifiez le mot cl LOW_PRIORITY, l'excution de la commande DELETE est repousse jusqu' ce qu'aucun client ne soit en train de lire la table. Pour les tables MyISAM, si vous spcifiez l'option QUICK, le moteur de stockage ne compacte pas les index durant l'effacement, ce qui peut acclrer certains effacements. L'option IGNORE fait que MySQL ignore les erreurs durant le traitement des lignes. Les erreurs rencontres durant la phase d'analyse sont traites comme d'habitude. Les erreurs qui sont ignores grce cette options sont listes comme des alertes. Cette option a t ajoute en MySQL 4.1.1. La vitesse d'excution des oprations de suppressions peut tre affectes par les facteurs prsents dans la section Section 7.2.16, Rapidit des requtes DELETE . Dans les tables de type MyISAM, les enregistrements effacs sont maintenus dans une liste lie et les requtes INSERT suivantes rutilisent les vieux emplacements. Pour recouvrir l'espace inutilis ou rduire la taille des fichiers, utilisez la commande OPTIMIZE TABLE ou l'utilitaire myisamchk pour rorganiser les tables. OPTIMIZE TABLE est plus simple, mais myisamchk est plus rapide. Voyez Section 13.5.2.5, Syntaxe de OPTIMIZE TABLE et Section 5.7.3.10, Optimisation de table . La clause spcifique MySQL LIMIT row_count de la commande DELETE indique au serveur le nombre maximal de ligne supprimer avant de rendre le contrle au client. Elle peut tre utilise pour
596
Syntaxe de DO
s'assurer qu'une commande DELETE ne prend pas trop de temps. Vous pouvez simplement rpter la commande DELETE jusqu' ce que le nombre de lignes effaces est infrieure la valeur de LIMIT. Si la commande DELETE inclut la clause ORDER BY, les lignes sont effaces dans l'ordre spcifie par cette clause. Elle n'est vraiment utilise que lorsqu'elle est couple avec la clause LIMIT. Par exemple, la commande suivante applique la condition WHERE, trie les lignes avec la colonne timestamp, et efface la ligne la plus ancienne :
DELETE FROM somelog WHERE user = 'jcole' ORDER BY timestamp LIMIT 1
ORDER BY peut tre utilise avec DELETE depuis MySQL version 4.0.0. Depuis MySQL version 4.0, vous pouvez spcifier plusieurs tables dans la commande DELETE, pour effacer des lignes dans plusieurs tables, en fonction d'une condition de liaison. Cependant, vous ne pouvez pas utiliser les clauses ORDER BY et LIMIT dans une suppression DELETE multi-tables. La premire syntaxe de DELETE multi-table est supporte depuis MySQL 4.0.0. La deuxime syntaxe de DELETE multi-table est supporte depuis MySQL 4.0.2. La partie table_references liste les tables impliques dans la jointure. Sa syntaxe est dcrite dans la section Section 13.1.7.1, Syntaxe de JOIN . L'ide est que seul les lignes concordante dans les tables numres avant le FROM ou avant la clause USING sont effacs. Le but est de pouvoir effacer des lignes de plusieurs tables en mme temps tout en ayant d'autres tables pour les recherches. Le code .* aprs les noms de tables n'est prsent que pour assurer la compatibilit avec Access :
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
ou :
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
Dans les cas prcdents, nous n'avons supprim les lignes correspondantes que dans les tables t1 et t2. Les exemples ci-dessus prsente des jointures internes, en utilisant l'oprateur virgule, mais les DELETE multi-tables peuvent utiliser n'importe quel type de jointure qu'une commande SELECT accepte, comme un LEFT JOIN. La syntaxe autorise .* aprs le nom de la table pour assurer la compatibilit avec Access. Si vous utilisez une commande DELETE multi-tables avec des tables InnoDB pour lesquelles il y a des contraintes de cls trangres, l'optimiseur MySQL risque de traiter les tables dans un ordre qui diffre de celui des relations parent/enfant de la cl. Dans ce cas, la commande chouera, et s'annulera. Pour rsoudre ce problme, effacez les lignes tables par table, et utilisez les fonctionnalits ON DELETE que InnoDB fournit pour que les autres tables soient correctement traites. Note : en MySQL 4.0, vous devez utiliser le vritable nom de table. En MySQL 4.1, vous devez utiliser l'alias ventuel, lorsque vous nommez la table : En MySQL 4.0 :
DELETE test FROM test AS t1, test2 WHERE ...
En MySQL 4.1 :
DELETE t1 FROM test AS t1, test2 WHERE ...
La raison qui nous a pouss ne pas faire ce changement en version 4.0, est la compatibilit ascendante avec les vieilles applications 4.0, qui utilisent la vieille syntaxe.
13.1.2. Syntaxe de DO
597
Syntaxe de HANDLER
Excute l'expression mais ne retourne aucun rsultat. C'est un alias de SELECT expression, expression, mais il a l'avantage d'tre plus rapide quand on n'a pas besoin du rsultat. Cela s'avre trs utile avec les fonctions qui ont des effets secondaires, comme RELEASE_LOCK.
La commande HANDLER fournit un accs direct l'interface de gestion de la table MyISAM. La premire forme de HANDLER ouvre la table, la rendant accessible via la requte HANDLER ... READ qui la suit. Cette objet table n'est pas partag par les autres threads et ne sera referm que si le thread appelle HANDLER nom_de_table CLOSE ou que celui ci se termine. La seconde forme rcupre une ligne (ou plus, spcifier dans la clause LIMIT) o l'index spcifi remplit les conditions et o la clause WHERE est rpondue. Si l'index se compose de plusieurs parties, (s'tend sur plusieurs colonnes) les valeurs sont spcifies dans une liste spare par des virgules, fournir des valeurs pour quelques premires colonnes est possible. Par exemple :
HANDLER ... index_name = (col_a_val,col_b_val,col_c_val) ... HANDLER ... index_name = (col_a_val,col_b_val) ... HANDLER ... index_name = (col_a_val) ...
La troisime forme rcupre une ligne (ou plus, spcifier dans la clause LIMIT) de la table dans l'ordre de l'index, qui rpond la clause WHERE. La quatrime forme (sans spcifications relatives l'index) rcupre une ligne (ou plus, spcifier dans la clause LIMIT) de la table dans un ordre naturel des lignes (comme stock dans le fichier de donnes) qui correspond la condition WHERE. C'est plus rapide que HANDLER nom_de_table READ nom_index quand une lecture entire de la table est requise. See Section 13.1.7, Syntaxe de SELECT . HANDLER ... CLOSE ferme une table qui a t ouverte avec HANDLER ... OPEN. Note : pour utiliser l'interface HANDLER avec la cl primaire d'une table PRIMARY KEY, utilisez l'identifiant entre guillemets obliques `PRIMARY` :
HANDLER tbl_name READ `PRIMARY` > (...);
HANDLER est en quelque sorte une commande bas-niveau. Par exemple, elle ne propose pas de consistance. En clair, HANDLER ... OPEN ne se base pas sur une image de la table, et ne verrouille pas la table. Cela signifie qu'aprs l'excution d'une requte HANDLER ... OPEN, les donnes de la table peuvent tre modifies (par ce ou un autre thread) et ces modifications peuvent apparatre partiellement dans les lectures de HANDLER ... NEXT ou HANDLER ... PREV. Les raisons d'utiliser cette interface plutt que les commandes MySQL usuelles sont : Plus rapide qu'un SELECT car : Un pointeur sur table ddi est allou au thread dans HANDLER open. Il y a moins de traitements. Pas de pertes de temps en optimisation ou vrifications de requtes. La table utilise n'a pas besoin d'tre verrouille entre deux requtes de gestion.
598
Syntaxe de INSERT
L'interface de gestion n'a pas fournir une vue consistante des donnes (par exemple, les lectures corrompues sont autorises), ce qui permet au gestionnaire d'effectuer des optimisations que SQL ne permet pas. Cela facilite le port des applications qui utilisent l'interface ISAM pour MySQL. Cela permet de traverse plus facilement la base de donnes qu'avec SQL (dans certains cas, cette opration est impossible avec SQL). L'interface de gestion amne une faon plus naturelle de manipuler les donnes lorsque vous travaillez avec des applications qui proposent une interface interactive entre l'utilisateur et la base de donnes.
ou :
INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
ou :
INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ...
INSERT insre une nouvelle ligne dans une table existante. La syntaxe INSERT ... VALUES insre une ligne partir de valeurs explicitement fournies. La syntaxe INSERT ... SELECT insre des valeurs partir d'une autre table. La syntaxe INSERT ... VALUES avec plusieurs valeurs est supportes partir de MySQL 3.22.5 ou suprieure. la syntaxe nom_colonne=expression est supporte partir de la version 3.22.10 de MySQL. INSERT ... SELECT est prsent plus en dtails : See Section 13.1.4.1, Syntaxe de INSERT ... SELECT . nom_de_table est le nom de la table dans laquelle les valeurs seront insres. La liste de noms de colonne ou la clause SET indiquent les colonnes qui seront affectes: La liste des noms de colonnes ou la clause SET indique explicitement les colonnes utilises. Si vous ne spcifiez pas de liste de colonnes avec INSERT ... VALUES ou INSERT ... SELECT, les valeurs pour toutes les colonnes doivent tre fournies dans la clause VALUES() ou par la commande SELECT. Si vous ne connaissez pas l'ordre des colonnes, utilisez la commande DESCRIBE nom_de_table pour le connatre. Les valeurs des colonnes peuvent tre spcifies de plusieurs faons : A chaque fois qu'on ne donne pas explicitement une valeur pour une colonne, celle prend la valeur par dfaut. Par exemple, si on dfinit une liste de colonnes qui ne compte pas toutes les colonnes de la tables, toutes les colonnes qui ne sont pas nommes prendront leur valeur par dfaut. La dfinition de la valeur par dfaut se fait avec Section 13.2.5, Syntaxe de CREATE TABLE . MySQL a toujours une valeur par dfaut pour chaque champs. C'est obligatoire pour MySQL pour pouvoir fonctionner aussi bien avec des tables supportant les transactions qu'avec des tables ne les supportant pas. Nous pensons que le contrle du contenu des champs devrait tre fait pas l'application et non par le serveur de base de donnes.
599
Syntaxe de INSERT
Note : si vous voulez que les commandes INSERT gnrent une erreur si vous ne spcifiez pas explicitement de valeur pour toutes les colonnes qui requirent des valeurs non-nulles (NULL), vous pouvez aussi configurer MySQL avec l'option DONT_USE_DEFAULT_FIELDS. Ce comportement n'est pas disponible si vous compilez MySQL depuis le source. See Section 2.4.2, Options habituelles de configure . Vous pouvez utiliser le mot cl DEFAULT pour donner explicitement une colonne sa valeur par dfaut. Cette fonctionnalit a t ajoute en MySQL version 4.0.3. Cela rend plus simple l'criture de commandes INSERT lors de l'assignation de quelques colonnes, sans crire de valeurs VALUES incompltes. Sinon, il faut crire la liste des colonnes utilises pour chaque valeur de la liste VALUES. Si la liste de colonnes et de valeurs VALUES sont vides, INSERT cre une ligne pour chaque colonne avec sa valeur par dfaut :
mysql> INSERT INTO tbl_name () VALUES();
Une expression peut faire rfrence n'importe quelle colonne qui a t dfinie prcdemment dans une liste de valeurs. Par exemple, on peut dire ceci :
mysql> INSERT INTO nom_de_table (col1,col2) VALUES(15,col1*2);
Mais vous ne pouvez pas faire cela, car la valeur de col1 fait rfrence col2, qui est assign aprs col1 :
mysql> INSERT INTO nom_de_table (col1,col2) VALUES(col2*2,15);
Les commandes INSERT supportent les options suivantes : Si vous spcifiez l'option DELAYED, le serveur met la ligne ou les lignes insrer dans un tampon, et le client qui a mis la commande INSERT DELAYED est immdiatement libr. Si la table est occupe, le serveur conserve les lignes. Lorsque la table se libre, il va insrer les lignes, tout en vrifiant priodiquement s'il n'y a pas de lectures dans la table. Si une lecture arrive, l'insertion est suspendue jusqu' la prochaine libration. See Section 13.1.4.2, Syntaxe de INSERT DELAYED . Si on spcifie le mot LOW_PRIORITY, l'excution de INSERT sera retard jusqu' ce qu'il n'y ait plus de clients qui lisent la table. Dans ce cas le client doit attendre jusqu' la fin de l'opration d'insertion, ce qui peut prendre beaucoup de temps si la table est frquemment accde. C'est la grande diffrence avec INSERT DELAYED, qui laisse le client continuer tout de suite. See Section 13.1.4.2, Syntaxe de INSERT DELAYED . On peut remarquer que, en principe, LOW_PRIORITY ne devrait pas tre utilis avec des tables de type MyISAM, tant donn que celles-ci n'autorisent pas les insertions simultanes. See Section 14.1, Le moteur de tables MyISAM . Si on spcifie le mot IGNORE dans un INSERT avec les valeurs de plusieurs lignes, chaque ligne qui qui ferait doublon avec une cl PRIMARY ou UNIQUE existante dans la table sera ignor et ne sera pas insre. Si on ne spcifie pas IGNORE, l'insertion est abandonne si quelque ligne que ce soit fait doublon avec une cl existante. La fonction mysql_info() de l'API C permet de savoir combien de lignes ont t insres dans la table. Si vous spcifiez la clause ON DUPLICATE KEY UPDATE (nouveau en MySQL 4.1.0), et qu'une ligne insre engendre un doublon pour une cl PRIMARY ou UNIQUE, une commande UPDATE sera faite la place de l'insertion. Par exemple, les commandes ont le mme effet :
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1; mysql> UPDATE table SET c=c+1 WHERE a=1;
Note : si la colonne b est aussi unique, la commande UPDATE sera rcrite telle que
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
600
Syntaxe de INSERT
Si a=1 OR b=2 trouve plusieurs lignes, uniquement une ligne sera mise jour! En gnral, il faut viter d'utiliser la clause ON DUPLICATE KEY sur des tables avec des cls UNIQUE multiples. Depuis MySQL version 4.1.1, on peut utiliser la fonction VALUES(col_name) pour faire rfrence la valeur de la colonne dans la clause INSERT d'une commande INSERT ... UPDATE : c'est la valeur qui sera insre s'il n'y a pas de conflit de cl. Cette valeur est particulirement utile dans les commandes INSERT ... UPDATE et retourne NULL sinon. Exemple :
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
Lors de l'utilisation de ON DUPLICATE KEY UPDATE, l'option DELAYED est ignore. Vous pouvez trouver la valeur utilise pour une colonne AUTO_INCREMENT en utilisant la fonction LAST_INSERT_ID(). Depuis l'interface C, utilisez la fonction mysql_insert_id(). Cependant, notez que les deux fonctions ne se comportement pas de la la mme faons dans toutes les circonstances. Le comportement des commandes INSERT avec les colonnes AUTO_INCREMENT sont dcrites dans la section Section 12.8.3, Fonctions d'informations et Section 24.2.3.33, mysql_insert_id() . Si vous utilisez une commande INSERT ... VALUES avec plusieurs listes de valeurs ou INSERT ... SELECT, la commande retourne les informations sous ce format :
Records: 100 Duplicates: 0 Warnings: 0
Records indique le nombre de ligne qui ont t traites par cette commande. Ce n'est pas forcment le nombre de ligne insres. Duplicates peut tre non-nulle. Duplicates indique le nombre de lignes qui n'ont pas peut tre insres pour cause de conflit avec une cl unique existante. Warnings indique le nombre de tentatives d'insertion de valeurs dans une colonne qui ont gnr des problmes. Les Warnings peuvent apparatre dans les conditions suivantes: Insertion de NULL dans une colonne dclare NOT NULL. Pour les commandes d'insertions multiples INSERT ou les commandes INSERT ... SELECT, la colonne prend la valeur par dfaut adapte au type de colonne. C'est 0 pour les types numriques, la chane vide pour les textes et la valeur ``zro'' pour les types temporels Enregistrement dans une colonne numrique d'une valeur qui dborde de la taille de la colonnes. Cette valeur a t tronque l'extrmit la plus adapte de la colonne. Attribution une colonne numrique d'une valeur telle que '10.34 a'. Celle valeur refuse est spare, et la partie numrique rsultante est insre. Si cette valeur n'a pas une valeur numrique sense, la valeur 0 est insre. L'insertion d'une chane dans une colonne CHAR, VARCHAR, TEXT, ou BLOB qui dpasse la taille maximale de la colonne. La valeur est tronque la taille maximale de la colonne. L'insertion d'une valeur illgale pour une colonne de type DATE ou TIME. La colonne est alors enregistre avec la valeur de zro approprie pour le type. Si vous utilisez l'interface C, la chane d'information peut tre obtenue en invoquant la fonction mysql_info(). See Section 24.2.3.31, mysql_info() .
601
Syntaxe de INSERT
La requte INSERT ... SELECT permet de rapidement insrer dans une table un grand nombre de lignes d'une ou plusieurs autres tables.
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;
Les conditions suivantes s'appliquent la requte INSERT ... SELECT: Avant MySQL version 4.0.1, INSERT ... SELECT oprait implicitement en mode IGNORE. Depuis MySQL version 4.0.1, vous devez spcifier le mode IGNORE explicitement, pour ignorer les lignes qui causeront des erreurs de doublons pour les index uniques. N'utilisez pas DELAYED avec INSERT ... SELECT. Avant MySQL version 4.0.14, la table de destination de la requte INSERT ne peut apparatre dans la clause FROM de la partie SELECT de la requte car il est interdit par le ANSI SQL de lire la table dans laquelle on est en train de faire un insert. (le problme est que le SELECT pourrait trouver des enregistrements qui aurait t insrs auparavant dans la mme excution. L'utilisation de "subselect" peut rendre la situation confuse !) Les colonnes AUTO_INCREMENT fonctionnent comme d'habitude. Pour s'assurer que les journaux des modifications ou les journaux binaires puissent tre utiliss pour re-crer les tables originales, MySQL n'autorise pas les inserts concurrents pendant INSERT ... SELECT. Il est bien sr possible d'utiliser REPLACE la place de INSERT pour remplacer les anciennes lignes.
L'option DELAYED de la commande INSERT est une option spcifique MySQL trs utile si vos clients ne peuvent pas attendre que INSERT se termine. C'est un problme frquent quand on utilise MySQL pour des logs, mais aussi quand on utilise souvent des commandes SELECT ou UPDATE qui prennent beaucoup de temps. DELAYED a t ajout MySQL dans la version 3.22.15. C'est une extension de MySQL au ANSI SQL 92. En utilisant INSERT DELAYED, le client reoit immdiatement un aquitement, et la ligne sera insre quand la table ne sera plus utilise par un autre thread. Un autre avantage de INSERT DELAYED est que les insertions des clients sont regroups, et crits d'un seul bloc. C'est beaucoup plus rapide que de faire des insertions spars. Il y a quelques contraintes l'utilisation de DELAYED : INSERT DELAYED ne fonctionne qu'avec les tables MyISAM et ISAM. Pour les tables MyISAM, s'il n'y a plus de blocs libres au milieu du fichier de donnes, les SELECT et INSERT simultans sont supports. Dans ces circonstances, vous n'aurez que trs rarement besoin de INSERT DELAYED avec MyISAM. See Section 14.1, Le moteur de tables MyISAM . INSERT DELAYED doit tre utilis uniquement avec les commandes INSERT qui spcifie une liste de valeur. C'est le cas depuis MySQL 4.0.18. Le serveur ignore DELAYED pour les commandes INSERT DELAYED ... SELECT. Le serveur ignore DELAYED dans les commandes INSERT DELAYED ... ON DUPLICATE UPDATE. Comme la commande s'excute immdiatement, sans que la ligne ne soit insre, vous ne pouvez pas utiliser LAST_INSERT_ID() pour lire la valeur que la colonne AUTO_INCREMENT va gnrer. Les lignes DELAYED ne sont visibles par les commandes SELECT que lorsqu'elles ont t rellement insres.
602
Syntaxe de INSERT
Actuellement, les lignes en attente sont uniquement stockes en mmoire tant qu'elle ne sont pas insres dans la table. Cela signifie que si on tue mysqld violemment, (kill -9) ou si mysqld meurt accidentellement, toutes les lignes en attente qui n'auront pas t crites sur le disque seront perdues ! Les paragraphes suivants dcrivent en dtail ce qu'il se passe quand on utilise l'option DELAYED dans une requte INSERT ou REPLACE. Dans cette description, ``thread'' est un thread qui reoit une commande INSERT DELAYED ans ``handler'' est un thread qui gre toutes les oprations de INSERT DELAYED pour une table donne. Quand un thread excute une opration DELAYED sur une table, un thread de gestion est cr pour excuter toutes les oprations DELAYED pour cette table - si ce thread de gestion n'existe pas. Le thread vrifie que a dj reu un verrou DELAYED; sinon, il dit au thread de gestion de le faire. le verrou DELAYED peut tre obtenu mme si d'autres threads ont des verrous READ ou WRITE sur la table. Cependant le gestionnaire attendra que tous les verrous ALTER TABLE ou FLUSH TABLES soient finis pour s'assurer que la structure de la table est jour. Le thread excute une opration INSERT, mais plutt que d'crire la ligne dans la table, il va placer une copie de la ligne finale dans une file d'attente gre par le thread de gestion. Le programme client est avertit de toutes les erreurs de syntaxe. Le client ne peut pas faire de rapport sur le nombre de duplicata ou sur la valeur de AUTO_INCREMENT de la ligne enregistre; il ne peut pas les obtenir du serveur, car le INSERT est valid avant que l'opration d'insert n'ait t effectue. Si vous utilisez l' API C, la fonction mysql_info() ne retourne pas de valeur intressante, pour la mme raison. Le journal de modification est mis jour par le thread de gestion au moment o la ligne est insre dans la table. Si plusieurs lignes sont insres en mme temps, le journal des modifications est mis jour quand la premire ligne est insre. Une fois que toutes les lignes delayed_insert_limit sont crites, le gestionnaire vrifie si des requtes SELECT sont en attente, et si c'est le cas, il leur permet de s'excuter avant de continuer. Quand le thread de gestion n'a plus de ligne dans sa file, la table est dverrouille. Si aucun INSERT DELAYED n'est reu avant delayed_insert_timeout secondes, le gestionnaire s'arrte. Si plus de delayed_queue_size lignes sont dj en attente d'un gestionnaire de file donn, le thread qui demande le INSERT DELAYED doit attendre qu'il y ait une place dans la file. Cela permet d'tre sr que mysqld n'utilisera pas toute la mmoire pour la mmoire des files d'attente d'insertions retards. Le thread de gestion apparatra dans la liste des processus de MySQL avec delayed_insert dans la colonne Command. Il sera tu si on excute une commande FLUSH TABLES ou si on le tue avec KILL thread_id. Cependant, il commencera par stocker toutes les lignes en attente dans la table avant de sortir. Pendant ce temps, il n'acceptera aucune commande INSERT d'aucun autre thread. Si on excute une commande INSERT DELAYED aprs cela, un nouveau thread de gestion sera cr. Il faut noter que les commandes INSERT DELAYED ont une plus grande priorit que les commandes INSERT normales si un gestionnaire de INSERT DELAYED existe dj! les autres commandes de modification devront attendre que la file d'attente de INSERT DELAYED soit vide, que quelqu'un tue le gestionnaire (avec KILL thread_id), ou que quelqu'un excute FLUSH TABLES.. Les variables suivantes fournissent des informations relatives la commande INSERT DELAYED : Variable Delayed_insert_threads Delayed_writes Not_flushed_delayed_rows Signification Nombre de threads de gestion Nombre de lignes crites avec INSERT DELAYED Nombre de lignes en attente d'tre crites.
603
On peut voir ces variables avec la commande SHOW STATUS ou en excutant la commande mysqladmin extended-status. Il faut noter que INSERT DELAYED est plus lent qu'un INSERT normal si la table n'est pas utilise. L'utilisation d'un thread de gestion spar pour chaque table sur lesquelles on utilise INSERT DELAYED rajoute galement une surcharge au serveur. Ce qui signifie qu'il vaut mieux utiliser INSERT DELAYED uniquement quand c'est vraiment ncessaire!
La commande LOAD DATA INFILE lit les lignes dans un fichier texte et les insre trs grande vitesse. Pour plus d'informations sur l'efficacit des commandes INSERT comparativement LOAD DATA INFILE et pour acclrer les commandes LOAD DATA INFILE, voyez Section 7.2.14, Vitesse des requtes INSERT . Vous pouvez aussi charger des fichiers de donnes en utilisant l'utilitaire mysqlimport; Il opre en envoyant la commande LOAD DATA INFILE au serveur. L'option --local fais que mysqlimport lit les fichiers de donnes chez le client. Vous pouvez spcifier l'option --compress pour avoir de meilleurs performances avec les connexions lentes si le client et le serveur supportent le protocole compress. See Section 8.10, mysqlimport, importer des donnes depuis des fichiers texte . Si vous spcifiez le mot clef LOW_PRIORITY, l'excution de la commande LOAD DATA est ajourne jusqu' ce qu'aucun client ne lise plus de la table. Si vous spcifiez le mot clef CONCURRENT avec un table au format MyISAM, les autres threads pourront accder la table durant l'excution de la commande LOAD DATA. L'utilisation de cette option ralentira un peu les performances de LOAD DATA mme si aucun thread n'utilise la table en mme si aucun autre thread n'accde la table en mme temps. Si le mot cl LOCAL est spcifi, il est interprt en suivant les rgles suivantes : Si LOCAL est spcifi, le fichier est lu par le programme client, et envoy vers l'hte. Si LOCAL n'est pas spcifie, le fichier doit tre sur le serveur hte, et sera lu directement par le serveur. LOCAL est disponible depuis MySQL 3.22.6 ou plus rcent. Pour des raisons de scurit, lorsque les fichiers sont lus sur le serveur, ils doivent se trouver dans le rpertoire de la base de donnes courante, ou bien tre lisible par tous. Pour utiliser la commande LOAD DATA INFILE sur des fichiers du serveur, vous devez avoir le droit de FILE sur le serveur. See Section 5.5.3, Droits fournis par MySQL . Utiliser LOCAL est plus lent que de laisser le serveur accder directement aux fichiers, car le contenu du fichier doit tre envoy via le rseau au serveur. D'un autre cot, vous n'aurez pas besoin de droits de FILE pour faire un chargement local. Depuis MySQL 3.23.49 et MySQL 4.0.2 (4.0.13 sur Windows), LOCAL fonctionne uniquement si votre serveur et votre client ont t configur pour. Par exemple, si mysqld a t lanc avec --local-
604
infile=0, LOCAL ne fonctionnera pas. See Section 5.4.4, Problmes de scurit avec LOAD DATA LOCAL . Si vous avez besoin de lire des donnes LOAD DATA depuis un pipe, vous devez utiliser la technique suivante :
mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat < /dev/tcp/10.1.1.12/4711 > /mysql/db/x/x mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
Si vous utilisez une version de MySQL plus ancienne que 3.23.25, vous pouvez uniquement utiliser cette technique avec LOAD DATA LOCAL INFILE. Si vous utilisez une version de MySQL antrieure la 3.23.24 vous ne pouvez lire partir d'un FIFO avec LOAD DATA INFILE. Si vous avez besoin de lire partir d'un FIFO (par exemple la sortie de gunzip), utilisez LOAD DATA LOCAL INFILE. Lorsque les fichiers de donnes sont sur le serveur, celui-ci utilise les rgles suivantes : Si un chemin absolu est fourni, le serveur utilise le chemin tel quel. Si un chemin relatif est fourni, avec un ou plusieurs lments de dossiers, le serveur recherche le fichier relativement son dossier de donnes. Si le fichier n'a pas d'lments de dossier, le serveur recherche les donnes dans le dossier de base de donnes courante. Notez que ces rgles font qu'un fichier tel que ./myfile.txt est lu dans le dossier de donnes du serveur, alors que s'il est nomm myfile.txt, il sera lu dans le dossier de base de donnes courante. Par exemple, la commande LOAD DATA suivante lit le fichier donnees.txt dans le dossier de la base db1 car db1 est la base de donnes courante, mme si la commande charge explicitement le fichier dans la base de donnes db2 :
mysql> USE db1; mysql> LOAD DATA INFILE "donnees.txt" INTO TABLE db2.ma_table;
Les mots rservs REPLACE et IGNORE contrlent la mthode d'insertion de lignes lorsque des doublons apparaissent pour les cls uniques. Si vous spcifiez REPLACE, les nouvelles lignes remplaceront les anciennes. See Section 13.1.6, Syntaxe de REPLACE . Si vous spcifiez IGNORE, les nouvelles lignes seront ignores. Si vous ne spcifiez pas cette option, une erreur sera gnre chaque doublon, et le reste du fichier sera ignor. Avec l'option LOCAL, le comportement par dfaut est le mme que si IGNORE est spcifi : ceci est d au fait que le serveur n'a pas moyen de stopper la transmission du fichier au milieu de l'opration. Si vous chargez un fichier sur votre machine client avec l'option LOCAL, le serveur ne peut pas interrompre la transmission du fichier au milieu de l'opration : par dfaut, il utilisera l'option IGNORE. Si vous voulez ignorer les cls trangres le temps du chargement du fichier, utilisez la commande SET FOREIGN_KEY_CHECKS=0 avant d'excuter LOAD DATA. Si vous utilisez LOAD DATA INFILE sur une table vide de type MyISAM, tous les index non-uniques seront crs dans un processus spar (tout comme REPAIR). Cela rend LOAD DATA INFILE beaucoup plus rapide si vous avez plusieurs index. See Section 5.7.3, Utilisation de myisamchk pour la maintenance des tables et leur recouvrement . LOAD DATA INFILE est le complmentaire de SELECT ... INTO OUTFILE. See Section 13.1.7, Syntaxe de SELECT . Pour crire des donnes depuis une table dans un fichier, utilisez SELECT ... INTO OUTFILE. Pour lire les donnes dans la table, utilisez LOAD DATA INFILE. La syntaxe des clauses FIELDS et LINES est la mme pour les deux commandes. Ces deux clauses sont optionnelles, mais FIELDS doit prcder LINES, si les deux sont spcifies.
605
Si vous spcifiez la clause FIELDS, les sous-clauses TERMINATED BY, [OPTIONALLY] ENCLOSED BY, et ESCAPED BY sont aussi optionnelles, mais vous devez en spcifier au moins une. Si vous ne spcifiez par de clause FIELDS, les valeurs par dfaut sont :
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
Si vous ne spcifiez par de clause LINES, les valeurs par dfaut sont :
LINES TERMINATED BY '\n'
En d'autres termes, les valeurs par dfaut font que LOAD DATA INFILE lit les donnes comme suit : Recherche des limites de lignes parmi les nouvelles lignes. Si LINES STARTING BY prefix est utilis, lit jusqu'au prfixe, et commence lire aprs le prfixe. Si la ligne n'inclut pas de prfixe, elle sera ignore. Scinde les lignes en champs avec les tabulations. Ne suppose pas que les champs sont entours de guillemets. Interprte les occurrences de tabulation, nouvelle ligne, '\' prcdes par '\' comme des caractres littraux qui font partie de la valeur d'un champs. A l'inverse, les valeurs par dfaut font que SELECT ... INTO OUTFILE crit les donnes comme ceci : Ecrivez des tabulations entre les champs. N'entourez pas les champs de guillemets. Utilisez \ pour chapper les occurrences de tabulation, nouvelle ligne, \ trouves dans les valeurs. Insre une nouvelle ligne entre les lignes. Notez que pour utiliser FIELDS ESCAPED BY '\\', vous devez spcifier deux anti-slash pour que cette valeur soit interprte comme un anti-slash simple. Note : si vous avez gnr le fichier sur Windows, vous devrez peut-tre utiliser LINES TERMINATED BY '\r\n' pour lire le fichier correctement, car les programmes Windows utilisent gnralement deux caractres comme fin de ligne. Certains programmes, comme WordPad, peuvent utiliser \r comme terminateur de ligne lors de l'criture. Pour lire ces fichiers, utilisez LINES TERMINATED BY '\r. L'option IGNORE nombre LINES sert ignorer une en-tte de fichier, telle que des noms de colonnes, qui dbutent parfois un fichier charger :
mysql> LOAD DATA INFILE "/tmp/nom_fichier" INTO TABLE test IGNORE 1 LINES;
Lorsque vous utilisez SELECT ... INTO OUTFILE conjointement avec LOAD DATA INFILE pour crire des donnes dans un fichier et les relire dans une table, les options de FIELDS et LINES doivent tre identiques. Sinon, LOAD DATA INFILE ne pourra pas interprter le contenu du fichier correctement. Supposez que la commande SELECT ... INTO OUTFILE ait crit un fichier dlimit par des virgules :
mysql> SELECT * INTO OUTFILE 'donnees.txt' -> FIELDS TERMINATED BY ',' -> FROM ...;
Si au contraire, vous essayez de lire le fichier avec la commande ci-dessous, cela ne fonctionnera pas, car la commande LOAD DATA INFILE essaie de lire des tabulations entre les champs :
mysql> LOAD DATA INFILE 'donnees.txt' INTO TABLE table2
606
->
Il est probable que chaque ligne d'entre sera interprte que comme un seul champ. La commande LOAD DATA INFILE peut tre utilise pour lire des donnes issues d'autres sources. Par exemple, un fichier au format dBASE prsente des champs spars par des virgules, et entours de guillemets doubles. Si les lignes sont termines par de nouvelles lignes, la commande ci-dessous illustre la relecture d'un tel fichier avec MySQL :
mysql> LOAD DATA INFILE 'donnees.txt' INTO TABLE nom_de_table -> FIELDS TERMINATED BY ',' ENCLOSED BY '"' -> LINES TERMINATED BY '\n';
Les clauses FIELDS et LINES peuvent prendre des chanes vides comme valeur. S'il la chane n'est pas vide, FIELDS [OPTIONALLY] ENCLOSED BY et FIELDS ESCAPED BY ne doivent avoir qu'un seul caractre. Les valeurs de FIELDS TERMINATED BY et LINES TERMINATED BY peuvent avoir plus d'un caractre. Par exemple, pour crire des lignes termines par le couple retour chariot/nouvelle ligne, ou pour lire un tel fichier, spcifiez la clause LINES TERMINATED BY '\r\n'. Par exemple, pour charger un fichier de blagues, qui sont spares par une ligne de %%, dans une table vous pouvez faire :
CREATE TABLE blagues ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, blague TEXT NOT NULL ); LOAD DATA INFILE "/tmp/blagues.txt" INTO TABLE blagues FIELDS TERMINATED BY "" LINES TERMINATED BY "\n%%\n" (blague);
FIELDS [OPTIONALLY] ENCLOSED BY contrle la mise entre guillemets des champs. Pour l'criture de fichier (SELECT ... INTO OUTFILE), si vous omettez le mot OPTIONALLY, tous les champs seront entours par le caractre spcifi dans la clause ENCLOSED BY. Par exemple, si la virgule est utilise comme sparateur de champs :
"1","une "2","une "3","une "4","une chane","100.20" chane contenant une , virgule","102.20" chane contenant un \" guillemet","102.20" chane contenant un \", guillemet et une virgule","102.20"
Si vous spcifiez OPTIONALLY, le caractre ENCLOSED BY n'est utilis que pour protger les colonnes de types CHAR et VARCHAR :
1,"une 2,"une 3,"une 4,"une chane",100.20 chane contenant une , virgule",102.20 chane contenant un \" guillemet",102.20 chane contenant un \", guillemet et une virgule",102.20
Notez que les occurrences du caractre ENCLOSED BY dans un champs sont chappe en les prfixant avec le caractre ESCAPED BY. Notez aussi que si vous spcifiez un caractre d'chappement vide, il n'est pas possible de garantir que les champs seront correctement relus par LOAD DATA INFILE. Par exemple, l'exemple ci-dessus apparatra comme montr ci-dessous. Notez que le second champ de la quatrime ligne comporte une virgule suivant un guillemet qui semble (mais c'est faux) terminer la ligne :
1,"une 2,"une 3,"une 4,"une chane",100.20 chane contenant une , virgule",102.20 chane contenant un " guillemet",102.20 chane contenant un ", guillemet et une virgule",102.20
Lors des lectures, le caractre ENCLOSED BY, s'il est prsent, est supprim des extrmits de la valeur du champ. (ce qui est vrai, qu'il y ait l'option OPTIONALLY ou pas). Les occurrences du caractre ENCLOSED BY, prcdes par le caractre ESCAPED BY sont interprtes comme faisant partie de la valeur du champ. Les caractres ENCLOSED BY doubles, apparaissant dans la chane, sont interprts comme le caractre ENCLOSED BY lui-mme. Par exemple, si ENCLOSED BY '"' est spcifi, les guillemets sont grs comme ceci :
"Le ""GRAND"" chef" -> Le "GRAND" chef
607
FIELDS ESCAPED BY contrle les caractres spciaux. Si le caractre FIELDS ESCAPED BY n'est pas vide, il est utilis pour prfixer les caractres suivants en criture : La caractre FIELDS ESCAPED BY Le caractre FIELDS [OPTIONALLY] ENCLOSED BY Le premier caractre des valeurs de FIELDS TERMINATED BY et LINES TERMINATED BY ASCII 0 (en fait, ce qui est crit aprs le caractre d'chappement est le caractre ASCII '0', et non pas le code ASCII de zro) Si le caractre FIELDS ESCAPED BY est vide, aucun caractre ne sera chapp. Ce n'est probablement pas une bonne ide de spcifier un caractre d'chappement vide, en particulier si les valeurs dans vos champs risquent d'utiliser l'un des caractres de la liste ci-dessus. En lecture, si le caractre FIELDS ESCAPED BY n'est pas vide, les occurrences de ce caractre sont supprimes, et le caractre suivant est lu littralement. Les exceptions cette rgle sont 0 ou N (par exemple, 0 ou \N si le caractre d'chappement est \). Ces squences sont interprtes comme l'octet nul (ASCII 0) et la valeur NULL. Voyez plus bas pour la gestion des valeurs NULL. Pour plus d'informations sur la syntaxe avec les caractres d'chappement \, consultez Section 9.1, Littraux : comment crire les chanes et les nombres . Dans certains cas, les options de FIELDS et LINES interfrent entre elles : Si le caractre de LINES TERMINATED BY est une chane vide et que celui de FIELDS TERMINATED BY ne l'est pas, ce dernier sera celui utilis pour LINES TERMINATED BY. Si les valeurs FIELDS TERMINATED BY et FIELDS ENCLOSED BY sont vides toutes les deux (''), un format taille de champ fixe est utilis. Avec ce format, aucun dlimiteur n'est utilis entre les champs. Au lieu de cela, les valeurs des colonnes sont crites avec leur configuration d'affichage. Par exemple, si une colonne a t dclare INT(7), la valeur de cette colonne sera crite avec 7 caractres. Lors de la relecture, la valeur de la colonne sera obtenue en lisant nouveau 7 caractres. Ce format taille fixe affecte la gestion de la valeur NULL; voyez plus loin pour cela. Notez que ce format ne fonctionne pas avec les jeux de caractres multi-octets. La gestion des valeurs NULL dpend des options FIELDS et LINES que vous utilisez : Pour les valeurs par dfaut de FIELDS et LINES, NULL est crit \N et \N est lu NULL (en supposant que le caractre d'chappement est \). Si FIELDS ENCLOSED BY n'est pas vide, un champ contenant le mot NULL comme valeur sera lu comme la valeur NULL (ce qui diffre du mot NULL, entour du caractre FIELDS ENCLOSED BY, qui sera lu comme le mot 'NULL'). Si FIELDS ESCAPED BY est vide, NULL est crit comme le mot 'NULL'. Avec le format taille fixe (ce qui arrive si FIELDS TERMINATED BY et FIELDS ENCLOSED BY sont tous les deux vides), les valeurs NULL sont crites sous forme de chane vide. Notez que cela fait que NULL et les chanes vides seront reprsentes par une valeur qui ne les distingue pas l'une de l'autre. Si vous avez besoin de diffrencier entre les deux, n'utilisez par ce format ! Certains cas ne sont pas supports par LOAD DATA INFILE: Lignes tailles fixes (FIELDS TERMINATED BY et FIELDS ENCLOSED BY sont tous les deux vides) et les types de colonne BLOB ou TEXT. Si vous spcifiez un sparateur qui est le mme qu'un autre prfixe, LOAD DATA INFILE ne sera pas capable de relire proprement le rsultat. Par exemple, la clause FIELDS suivante posera srement des problmes :
608
Si FIELDS ESCAPED BY est vide, une valeur de colonne qui contient une occurrence de FIELDS ENCLOSED BY ou de LINES TERMINATED BY suivi du caractre FIELDS TERMINATED BY interrompra la lecture de LOAD DATA INFILE trop tt. Cela est d au fait que LOAD DATA INFILE ne peut pas faire la diffrence entre la valeur dans le champ et la fin de la ligne. L'exemple suivant charge toutes les colonnes de la table persondata :
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
Aucun champ n'est spcifi, ce qui fait que LOAD DATA INFILE s'attend ce que les lignes lues contiennent le bon nombre de champs. Les valeurs par dfaut de FIELDS et LINES sont utilises. Si vous voulez charger uniquement quelques colonnes dans une table, spcifiez la liste des champs :
mysql> LOAD DATA INFILE 'persondata.txt' -> INTO TABLE persondata (col1,col2,...);
Vous devez aussi spcifier les champs si l'ordre dans lequel ils seront lus diffre de l'ordre des colonnes dans la table. Sinon, MySQL ne pourra pas savoir quelle colonne correspond une valeur. Si une ligne a trop peu de champs, les colonnes omises prendront leur valeur par dfaut. Les affectations de valeurs par dfaut sont dcrites dans Section 13.2.5, Syntaxe de CREATE TABLE . Une valeur de champs vide et un champ manquant ne seront pas interprts de la mme faon : Pour les types chane, la colonne est remplie avec la chane vide. Pour les types numriques, la colonne est mise 0. Pour les types dates et heures, la colonne est mise au zro appropri pour le type. See Section 11.3, Les types date et heure . Notez que vous obtiendrez le mme rsultat en assignant ces diffrents types de champs la chane vide dans une commande INSERT ou UPDATE. Les colonnes TIMESTAMP prendront la date et l'heure courante uniquement si on leur affecte la valeur NULL, ou (pour la premire colonne TIMESTAMP seulement) si la colonne TIMESTAMP est ignore de la liste des colonnes spcifie. Si une ligne d'entre comporte trop de colonnes, les champs en trop sont ignors, et le nombre d'alertes est incrment. LOAD DATA INFILE considre toutes les valeurs lues comme des chanes de caractres : vous ne pourrez donc pas utiliser la forme numrique des colonnes ENUM ou SET, comme d'habitude. Toutes les colonnes ENUM et SET doivent tre spcifie comme des chanes ! Si vous utilisez l'API C, vous pouvez obtenir des informations propos de la requte en utilisant la fonction mysql_info() quand LOAD DATA INFILE se termine. Le format de la chane d'informations est le suivant :
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
Les alertes sont gnres dans les mmes circonstances que pour la commande INSERT (see Section 13.1.4, Syntaxe de INSERT ), except que LOAD DATA INFILE gnre aussi des alertes s'il y a trop peu ou trop de champs dans une ligne. Les alertes ne sont pas stockes; le nombre d'alertes est la seule indication. Si vous recevez des alertes et vous voulez savoir exactement ce qui s'est pass, excutez une commande SELECT ... INTO OUTFILE dans un autre fichier et comparez le avec le fichier original. En MySQL version 4.1.1 vous pouvez utiliser SHOW WARNINGS pour obtenir la liste des premires max_error_count alertes. See Section 13.5.3.19, SHOW WARNINGS | ERRORS . Pour plus d'informations sur les performances de INSERT compares LOAD DATA INFILE et acclrer LOAD DATA INFILE : See Section 7.2.14, Vitesse des requtes INSERT .
609
Syntaxe de REPLACE
ou :
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
ou :
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ...
REPLACE fonctionne exactement comme INSERT, sauf que si une vieille ligne dans la table la mme valeur qu'une nouvelle pour un index UNIQUE ou une PRIMARY KEY, la vielle ligne sera efface avant que la nouvelle ne soit insre. See Section 13.1.4, Syntaxe de INSERT . En d'autres termes, vous ne pouvez pas accder aux valeurs de l'ancienne ligne partir d'une requte REPLACE. Dans quelques vieilles versions de MySQL, il apparat que c'tait possible, mais c'etait un dysfonctionnement qui a t corrig depuis. Pour utiliser REPLACE vous devez avoir les privilges INSERT et DELETE sur la table. Quand vous utilisez une commande REPLACE, mysql_affected_rows() retournera 2 si une nouvelle ligne en remplace une existante, et cela parce qu'il y aura eu une insertion puis une suppression. Cela aide savoir si REPLACE a ajout ou a remplac une ligne : Testez si le nombre de lignes affectes est gal 1 (ajout) ou s'il est gal 2 (remplacement). Notez que si vous n'utilisez pas un index UNIQUE ou une PRIMARY KEY, utiliser un REPLACE n'a pas de sens vu que cela revient utiliser un INSERT. Il devient quivalent INSERT, car il n'y a pas d'index utiliser pour dterminer si un nouvelle ligne est un double d'une autre. Voici quelques dtails sur l'algorithme utilis : Il est aussi utilis par LOAD DATA ... REPLACE. 1. Insertion de la ligne dans la table 2. Si une erreur de cl dupliqu ou de cl unique ou de cl primaire survient : a. Annuler les changements de cls b. Essayer nouveau d'insrer la cl primaire et unique dans la table
610
Syntaxe de SELECT
SELECT est utilis pour obtenir des enregistrements venant d'une ou plusieurs tables. Le support des commandes UNION et des sous-requtes est disponibles depuis MySQL 4.0 et 4.1, respectivement. Voir Section 13.1.7.2, Syntaxe de UNION et Section 13.1.8, Sous-slections (SubSELECT) . Chaque select_expr indique une colonne lire. table_references indique la ou les tables utiliser. La syntaxe est dcrite dans Section 13.1.7.1, Syntaxe de JOIN . where_definition indique les conditions que les lignes slectionnes doivent satisfaire. SELECT peut aussi tre utilise pour lire des lignes calcules, sans rfrence une table. Par exemple :
mysql> SELECT 1 + 1; -> 2
Tous les mots-cls utiliss doivent tre donns exactement dans le mme ordre que ci-dessus. Par exemple, une clause HAVING doit tre place aprs toute clause GROUP BY et avant toute clause ORDER BY. Une expression SELECT peut recevoir un alias en utilisant AS. L'alias est utilis de la mme faon que le nom du champ et peut tre employ avec des clauses ORDER BY ou HAVING. Par exemple :
mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name;
Le mot cl AS est optionnel lors de la cration d'un alias pour une expression SELECT. L'exemple prcdent aurait pu tre crit comme ceci :
mysql> SELECT CONCAT(last_name,', ',first_name) full_name FROM mytable ORDER BY full_name;
Comme AS est optionnel, un problme subtil peut survenir si vous oubliez une virgule entre deux expressions de SELECT : MySQL va interprter la seconde comme un alias de la premire. Par exemple, dans la commande suivante, columnb est trait comme un nom d'alias :
mysql> SELECT columna columnb FROM mytable;
Il n'est pas possible d'utiliser un alias de champ dans une clause WHERE, car la valeur du champ peut ne pas tre dfinie lorsque la clause WHERE est excute. See Section A.5.4, Problmes avec les alias . La clause FROM table_references indique les tables partir desquelles nous allons obtenir les enregistrements. Si vous indiquez le nom de plusieurs tables, vous faites une jointure. Pour davantage d'informations sur la syntaxe des jointures, consultez Section 13.1.7.1, Syntaxe de JOIN . Pour chaque table spcifie, vous pouvez ventuellement indiquer un alias.
tbl_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | [FORCE INDEX (key_list)]]
L'utilisation de USE INDEX, IGNORE INDEX, FORCE INDEX pour donner des conseils d'optimisation l'optimiseur d'index. Section 13.1.7.1, Syntaxe de JOIN . En MySQL 4.0.14, vous pouvez utiliser SET MAX_SEEKS_FOR_KEY=value comme une alternative pour forcer MySQL choisir un scan d'index, plutt qu'un scan de table. Vous pouvez faire rfrence une table avec nom_de_table (au sein de la base de donnes courante), ou avec dbname.nom_de_table pour expliciter le nom de la base de donnes. Vous pouvez vous rfrer un champ avec nom_de_colonne, nom_de_table.nom_de_colonne, ou db_name.nom_de_table.nom_de_colonne. Vous n'tes pas obligs d'indiquer de prfixe
611
Syntaxe de SELECT
nom_de_table ou db_name.nom_de_table pour une rfrence un champ dans un SELECT, moins que la rfrence ne soit ambigue. Consultez Section 9.2, Noms de bases, tables, index, colonnes et alias , pour des exemples d'ambiguts qui ncessitent des formes plus explicites de rfrence des champs. Depuis la version 4.1.0, vous tes autoriss spcifier DUAL comme nom de table, dans les situations ou aucune table n'est rfrenc. C'est une fonctionnalit pure de compatibilit, car certains autres serveurs requirent cette syntaxe.
mysql> SELECT 1 + 1 FROM DUAL; -> 2
Une rfrence une table peut tre aliase en utilisant nom_de_table [AS] alias_name :
mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 -> WHERE t1.name = t2.name; mysql> SELECT t1.name, t2.salary FROM employee t1, info t2 -> WHERE t1.name = t2.name;
Dans la clause WHERE, vous pouvez utiliser toutes les fonctions que MySQL supporte, hormis les fonctions d'agrgation. See Chapitre 12, Fonctions utiliser dans les clauses SELECT et WHERE. Les colonnes slectionnes dans le rsultat peuvent tre nommes dans les clauses ORDER BY et GROUP BY en utilisant leur nom de colonne, les alias ou leur position de colonne. Les positions commencent 1 :
mysql> SELECT college, region, seed FROM tournament -> ORDER BY region, seed; mysql> SELECT college, region AS r, seed AS s FROM tournament -> ORDER BY r, s; mysql> SELECT college, region, seed FROM tournament -> ORDER BY 2, 3;
Pour trier dans l'ordre inverse, ajoutez le mot-cl DESC (descendant) au nom du champ dans la clause ORDER BY qui vous permet de trier. Par dfaut, l'ordre ascendant est utilis; ceci peut tre indiqu de faon explicite en utilisant le mot-cl ASC. L'utilisation des positions de colonnes est obsolte, car la syntaxe a t supprime du SQL standard. Si vous utilisez GROUP BY, les lignes sont tries en fonction des colonnes GROUP BY comme si on avait ajout la clause ORDER BY pour ces colonnes. MySQL a amlior la clause GROUP BY depuis la version 3.23.34 pour que vous puissiez aussi spcifier ASC et DESC aprs le nom de la colonne :
SELECT a, COUNT(b) FROM test_table GROUP BY a DESC
MySQL amliore l'utilisation de GROUP BY en vous autorisant l'utiliser avec des champs qui ne sont pas mentionns dans la clause GROUP BY. Si vous n'obtenez pas les rsultats que vous attendiez, lisez la description de GROUP BY. See Section 12.9, Fonctions et options utiliser dans les clauses GROUP BY . Depuis MySQL 4.1.1, GROUP BY dispose de l'option WITH ROLLUP. See Section 12.9.2, Options de GROUP BY . La clause HAVING peut faire rfrence n'importe quel champs ou alias dfini dans select_expr. C'est valu en dernier lieu, juste avant que les lments ne soient envoys au client, sans aucune optimisation. N'utilisez pas HAVING pour des lments qui devraient tre dans la clause WHERE. Par exemple, n'crivez pas ceci :
mysql> SELECT nom_de_colonne FROM nom_de_table HAVING nom_de_colonne > 0;
612
Syntaxe de SELECT
Dans les versions 3.22.5 et suprieures de MySQL, vous pouvez aussi crire des requtes ainsi :
mysql> SELECT user,MAX(salary) FROM users -> GROUP BY user HAVING MAX(salary)>10;
Dans des versions plus anciennes de MySQL, vous pouvez crire la place :
mysql> SELECT user,MAX(salary) AS sum FROM users -> group by user HAVING sum>10;
La clause HAVING peut utiliser des fonctions d'agrgation, alors que la clause WHERE ne le peut pas :
mysql> SELECT user, MAX(salary) FROM users -> GROUP BY user HAVING MAX(salary)>10;
Cependant, cela ne fonctionne pas dans les anciennes versions du serveur MySQL, : avant la version 3.22.5. Au lieu de cela, ajoutez un alias de colonne dans la liste de colonnes, et faites rfrence cet alias dans la colonne HAVING :
mysql> SELECT user, MAX(salary) AS max_salary FROM users -> GROUP BY user HAVING max_salary>10;
La clause LIMIT peut tre utilise pour limiter le nombre d'enregistrements retourns par la commande SELECT. LIMIT accepte un ou deux arguments numriques. Ces arguments doivent tre des entiers constants. Avec un argument, la valeur spcifie le nombre de lignes retourner depuis le dbut du jeu de rsultat. Si deux arguments sont donns, le premier indique le dcalage du premier enregistrement retourner, le second donne le nombre maximum d'enregistrement retourner. Le dcalage du premier enregistrement est 0 (pas 1) : Pour tre compatible avec PostgreSQL, MySQL supporte aussi la syntaxe : LIMIT row_count OFFSET offset.
mysql> SELECT * FROM table LIMIT 5,10; # Retourne les enregistrements 6 15
Pour obtenir tous les enregistrement d'un certain dcalage jusqu' la fin du rsultat, vous pouvez utiliser de grands entier en tant que second paramtre :
mysql> SELECT * FROM table LIMIT 95,18446744073709551615; # Retourne les enregistrements de 96 jusqu'
Autrement dit, LIMIT n est quivalent LIMIT 0,n. La forme SELECT ... INTO OUTFILE 'nom_fichier' de SELECT crit les lignes slectionnes dans un fichier. Le fichier est cre sur le serveur et ne peut y tre dj prsent (cela permet entre autre d'viter la destruction des tables et de fichiers tel que /etc/passwd). Vous devez avoir le droit FILE sur le serveur pour utiliser cette forme de SELECT. SELECT ... INTO OUTFILE pour but principal de vous permettre de raliser des dumps rapides des tables sur la machine serveur. Si vous voulez crer le fichier sur une autre machine, vous ne pouvez utiliser SELECT ... INTO OUTFILE. Dans ce cas l, vous pouvez utiliser la place un programme client comme mysqldump --tab ou mysql -e "SELECT ..." > fichier pour gnrer le fichier. SELECT ... INTO OUTFILE est le complment de LOAD DATA INFILE; La syntaxe pour la partie export_options de la requte se compose des mmes clauses FIELDS et LINES que celles utilises avec la commande LOAD DATA INFILE. See Section 13.1.5, Syntaxe de LOAD DATA INFILE .
613
Syntaxe de SELECT
Dans le fichier rsultant, seul les caractres suivants sont protgs par le caractre ESCAPED BY : Le caractre ESCAPED BY Les premier caractre de FIELDS TERMINATED BY Les premier caractre de LINES TERMINATED BY ASCII 0 est convertit en ESCAPED BY suivi de 0 (ASCII 48). Si le caractre FIELDS ESCAPED BY est vide, aucun caractre n'est protg, et NULL vaut NULL, et non \N. Il est probable que ce ne soit pas une bonne ide de spcifier un caractre de protection vide, en particulier sir les valeurs de vos champs peuvent tre n'importe quoi. La raison de ce qui prcde est que vous devez imprativement protger chaque caractre FIELDS TERMINATED BY, ESCAPED BY, ou LINES TERMINATED BY pour assurer une relecture fiable du fichier. Le caractre ASCII 0 est chapp pour assurer la lisibilit sur certains clients. Comme le fichier rsultant ne se doit pas d'tre syntaxiquement conforme SQL, vous n'avez besoin d'chapper rien d'autre. Voila un exemple de relecture de fichier au format utilis par plusieurs anciens programmes.
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table;
Si vous utilisez INTO DUMPFILE au lieu de INTO OUTFILE, MySQL n'crira qu'une seule ligne dans le fichier, sans aucun caractre de fin de ligne ou de colonne, ni d'chappement. Cela est utile lorsque vous voulez enregistrer un BLOB dans un fichier. Note : notez que les fichiers cres par INTO OUTFILE et INTO DUMPFILE sera lisible par tout les utilisateurs ! La raison est que le serveur MySQL ne peut crer de fichier appartenant autre que l'utilisateur qui l'a mis en route. (vous devez viter d'excuter mysqld en tant que root), le fichier doit se composer de mot lisible pour que les donnes puissent tre rcupres. Une clause PROCEDURE indique une procdure qui doit traiter les lignes du jeu de rsultat. Pour un exemple, voyez Section 27.3.1, La procdure Analyse . Si vous utilisez la clause FOR UPDATE avec un gestionnaire de tables qui gre les verrous de lignes ou de pages, les lignes seront verrouilles. Aprs le mot SELECT, vous pouvez ajouter certaines options qui affectent le comportement de la commande. Les options DISTINCT, DISTINCTROW et ALL indiquent quels enregistrements avec doublons doivent tre retourns. Par dfaut, c'est (ALL), retournant ainsi tous les enregistrements. DISTINCT et DISTINCTROW sont synonymes et indique que les doublons doivent tre limins du rsultat. HIGH_PRIORITY, STRAIGHT_JOIN, et les options commenants par SQL_ sont des extensions MySQL au standard SQL. HIGH_PRIORITY donne une commande SELECT une plus grande priorit qu'une commande qui modifie une table. Vous devez l'utiliser seulement pour les requtes qui sont trs rapides et qui doivent tre effectues en premier lieu. Une requte SELECT HIGH_PRIORITY s'excutera sur une table verrouille en lecture mme si une commande de mise jour attend que la table soit libre. HIGH_PRIORITY ne peut tre utilise avec les commandes SELECT qui font partie d'une UNION. STRAIGHT_JOIN force l'optimiseur joindre les tables dans l'ordre dans lequel elles sont listes dans la clause FROM. Vous pouvez utiliser cela pour acclrer la requte, si les tables
614
Syntaxe de SELECT
sont rordonnes sub-optimalement par l'optimiseur. See Section 7.2.1, Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT) . STRAIGHT_JOIN peut aussi tre utilise dans la liste table_references. See Section 13.1.7.1, Syntaxe de JOIN . SQL_BIG_RESULT peut tre utilis avec GROUP BY ou DISTINCT pour indiquer l'optimiseur que le rsultat comportera beaucoup d'enregistrements. Dans ce cas, MySQL utilisera si besoin directement les bases temporaires stockes sur le disque. MySQL prfrera, dans ce cas, trier que d'obtenir une table temporaire avec une cl sur les lments du GROUP BY. SQL_BUFFER_RESULT forcera le rsultat tre stock dans une table temporaire. Ceci va aider MySQL librer plus tt les verrous des tables et aidera aussi dans les cas ou l'envoi du rsultat au client prend un temps assez consquent. SQL_SMALL_RESULT, une option spcifique MySQL, peut tre utilise avec GROUP BY ou DISTINCT pour indiquer l'optimiseur que le rsultat sera petit. Dans ce cas, MySQL utilise des tables temporaires rapides pour stocker la table rsultante plutt que d'utiliser le tri. Dans MySQL 3.23, ceci n'est normalement pas ncessaire. SQL_CALC_FOUND_ROWS (version 4.0.0 et suprieure) indique MySQL de calculer combien d'enregistrements seront dans le jeu de rsultats, indpendamment de n'importe quelle clause LIMIT. Le nombre d'enregistrements peut alors tre obtenu avec SELECT FOUND_ROWS(). See Section 12.8.4, Fonctions diverses . Avant MySQL 4.1.0, cette option ne fonctionne pas avec LIMIT 0, qui est optimise pour se terminer instantanment (le rsultat ne contiendra pas de lignes). See Section 7.2.12, Comment MySQL optimise LIMIT . SQL_CACHE demande MySQL de ne pas stocker le rsultat de la requte si vous utilisez query_cache_type avec la valeur 2 ou DEMAND. Pour une requte qui utilise UNION ou une sous-requte, cette option prend effet si elle est utilise dans n'importe quelle partie de la requte SELECT. See Section 5.11, Cache de requtes MySQL . SQL_CACHE indique MySQL de stocker le rsultat de la requte dans le cache de requtes si vous utilisez QUERY_CACHE_TYPE=2 (DEMAND). See Section 5.11, Cache de requtes MySQL . Pour les requtes qui utilisent UNION ou les sous-requtes, cette option aura un effet sur toutes les parties de la requte SELECT.
Gnralement, vous ne devez avoir aucune condition, dans la partie ON, qui soit utilise pour spcifier les lignes que vous voulez obtenir en rsultat. (il y a des exceptions cette rgle). Si vous voulez restreindre les lignes rsultantes, vous devez le faire dans la clause WHERE.
615
Syntaxe de SELECT
Notez que dans les versions antrieures la 3.23.17, INNER JOIN ne prenait pas en compte condition_jointure ! La dernire syntaxe de LEFT OUTER JOIN vue plus haut, n'existe que pour assurer la compatibilit avec ODBC : On peut crer un alias sur une rfrence de table en utilisant nom_de_table AS alias_name ou nom_de_table alias_name :
mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 -> WHERE t1.name = t2.name;
La condition ON est de la mme forme qu'une condition pouvant tre utilise dans la clause WHERE. Si aucune ligne ne correspond dans la table de droite dans la partie ON ou USING du LEFT JOIN, une ligne avec toutes les colonnes mises NULL est utilis en remplacement. Vous pouvez utiliser ce fait pour trouver les enregistrements dans une table qui n'ont pas de correspondances dans une autre :
mysql> SELECT table1.* FROM table1 -> LEFT JOIN table2 ON table1.id=table2.id -> WHERE table2.id IS NULL;
Cet exemple retourne toutes les lignes trouves dans table1 avec une valeur de id qui n'est pas prsente dans table2 (autrement dit, toutes les lignes de table1 sans correspondances dans la table table2). Cela demande que table2.id soit dclar NOT NULL, bien sur. See Section 7.2.9, Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN . La clause USING (column_list) recense la liste des colonnes qui doivent exister dans les deux tables. Les clauses USING suivantes sont identiques :
a LEFT JOIN b USING (c1,c2,c3) a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
La jointure de deux tables avec NATURAL [LEFT] JOIN est dfinie pour tre smantiquement quivalent un INNER JOIN ou un LEFT JOIN avec une clause USING qui nomme toutes les colonnes qui existent dans les deux tables. INNER JOIN et , (virgule) sont smantiquement quivalents. Les deux oprent une jointure totale sur les tables utilises. Normalement, vous spcifiez les conditions de jointure dans la clause WHERE. RIGHT JOIN fonctionne de faon analogue LEFT JOIN. Pour garder un code facilement portable, il est recommand d'utiliser les LEFT JOIN la place des RIGHT JOIN. STRAIGHT_JOIN est identique JOIN, sauf que la table de gauche est toujours lues avant celle de droite. Cela peut tre utilis dans les cas (rares) o l'optimiseur des jointures place les tables dans le mauvais ordre.
A partir de la version 3.23.12 de MySQL, vous pouvez donner des indications propos de l'index utiliser lors de la lecture d'informations d'une table. C'est utile si EXPLAIN montre que MySQL utilise un mauvais index de la liste de ceux disponibles. En spcifiant USE INDEX (liste_de_clefs), vous pouvez forcer MySQL utiliser un index spcifique pour trouver les enregistrements dans la table. Une alternative rside dans l'utilisation de IGNORE INDEX (liste_de_clefs) pour dire MySQL de ne pas utiliser certains index. En MySQL 4.0.9, vous pouvez aussi utiliser la clause FORCE INDEX. Elle se comporte comme USE INDEX (key_list) mais en supposant que les scan de tables seront trs coteux. En d'autres termes, les scans de tables seront utiliss que s'il n'y a pas d'autres mthodes pour trouver les lignes. USE/IGNORE KEY sont des synonymes de USE/IGNORE INDEX.
616
Syntaxe de SELECT
Note : USE INDEX, IGNORE INDEX et FORCE INDEX affectent uniquement les index qui sont utiliss lors du choix de la mthode de slection des lignes dans la table, et comment faire une jointure. Elles n'affectent pas l'utilisation finale de l'index dans les clauses ORDER BY ou GROUP BY. Quelques exemples :
mysql> mysql> mysql> mysql> -> mysql> -> mysql> -> SELECT SELECT SELECT SELECT FROM table1,table2 WHERE table1.id=table2.id; FROM table1 LEFT JOIN table2 ON table1.id=table2.id; FROM table1 LEFT JOIN table2 USING (id); FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id; SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3; SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3; * * * *
See Section 7.2.9, Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN .
UNION est implmente en MySQL 4.0.0. UNION est utilis pour combiner le rsultat de plusieurs requtes SELECT en un seul rsultat. Les colonnes listes dans la partie select_expression du SELECT doivent tre du mme type. Les noms de colonnes utiliss dans le premier SELECT seront utilis comme nom de champs pour les rsultats retourns. Les commandes SELECT sont des slections normales, mais avec les restrictions suivantes : Seule la dernire commande SELECT peut avoir une clause INTO OUTFILE. HIGH_PRIORITY ne peut tre utilise avec les commandes SELECT qui ne font pas partie de l'UNION. Si vous la spcifiez pour la premire commande SELECT, elle n'aura pas d'effet. Si vous la spcifiez pour toute autre commandes SELECT suivante, une erreur de syntaxe sera signale. Si vous n'utilisez pas le mot clef ALL pour l'UNION, toutes les lignes retournes seront uniques, comme si vous aviez fait un DISTINCT pour l'ensemble du rsultat. Si vous spcifiez ALL, vous aurez alors tout les rsultats retourns par toutes les commandes SELECT. Si vous voulez utiliser un ORDER BY pour le rsultat final de UNION, vous devez utiliser des parenthses :
(SELECT a FROM nom_de_table WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM nom_de_table WHERE a=11 AND B=2 ORDER BY a LIMIT 10) ORDER BY a;
Note : vous ne pouvez pas mlanger les clauses UNION ALL et UNION DISTINCT dans la mme requte. Si vous utilisez ALL dans une des UNION, alors elle devra tre utilise partout. Les types et longueurs des colonnes du jeu de rsultat de UNION prend en compte les valeurs lues dans tous les SELECT. Avant MySQL 4.1.1, une limitation de UNION est que seules les valeurs du premier SELECT taient utilise pour dterminer le type de rsultats, et leur taille. Cela peut conduire un raccourcissement de la valeur si, par exemple, le second SELECT trouvait des valeurs plus grandes que le premier SELECT :
mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10); +---------------+
617
Sous-slections (SubSELECT)
La requte externe (ou commande externe), et (SELECT column1 FROM t2) est la sous-requte. Nous disons que la sous-requte est imbrique dans la requte externe, et en fait, il est possible d'imbriquer des requtes dans des sous-requtes, avec d'autres commandes. Une sous-requte doit toujours tre entre parenthses. Depuis la version 4.1, MySQL supporte toutes les formes de sous-requtes et oprations que le standard SQL requiert, ainsi que quelques fonctionnalits spcifiques. Les avantages des sousrequtes sont : Elles permettent aux requtes d'tre structur pour que chaque partie puisse tre isole. Elles fournissent une mthode pour raliser des oprations qui seraient complexes, et impliqueraient des unions et jointures. Elles sont, au dire de nombreuses personnes, lisibles. En fait, c'est les sous-requtes qui ont donn aux inventeurs le nom original de SQL ``Structured Query Language''. Dans les versions plus anciennes de MySQL, il fallait trouver des palliatifs, et contourner les sousrequtes. Il est bien plus facile de se mettre aux sous-requtes. Voici un exemple de commande qui montre les principaux avantages des sous-requtes et de leur syntaxe, aussi bien pour celle qui est propose par le standard, que celle de MySQL.
DELETE FROM t1 WHERE s11 > ANY (SELECT COUNT(*) /* no hint */ FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE ROW(5*t2.s1,77)= (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM (SELECT * FROM t5) AS t5)));
Pour les versions de MySQL antrieure la version 4.1, la plupart des sous requtes peuvent tre rcrites avec des jointures et d'autres mthodes. See Section 13.1.8.11, Se passer des sousrequtes avec les premires versions de MySQL .
618
Sous-slections (SubSELECT)
CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL); SELECT (SELECT s2 FROM t1);
La sous-requte de la commande SELECT ci-dessus est de type CHAR, de longueur 5. Son jeu de caractres et sa collation sont ceux fournis par dfaut, et elle porte une marque de nullit. En fait, toutes les sous-requtes peuvent prendre la valeur NULL, car si la table est vide, la valeur de la sousrequte sera alors NULL. Il y a quelques restrictions : Une sous-requte peut tre utilise avec les commandes suivantes : SELECT, INSERT, UPDATE, DELETE, SET et DO. Une sous-requte peut contenir les mots-cl et les clauses qu'une commande SELECT peut contenir : DISTINCT, GROUP BY, ORDER BY, LIMIT, jointures, UNION, commentaires, fonctions, etc. Ainsi, lorsque vous lirez les exemples des sections suivantes qui utilisent la commande spartiate (SELECT column1 FROM t1), imaginez que votre code pourra contenir des commandes bien plus diverses et complexes. Par exemple, supposons que nous avons ces deux tables :
CREATE INSERT CREATE INSERT TABLE t1 (s1 INT); INTO t1 VALUES (1); TABLE t2 (s1 INT); INTO t2 VALUES (2);
Le rsultat sera 2 car il y a une ligne dans t2, dont la colonne s1 a une valeur de 2. La sous-requte peut faire partie d'une expression. Si c'est un oprande d'une fonction, n'oubliez pas les parenthses. Par exemple :
SELECT UPPER((SELECT s1 FROM t1)) FROM t2;
Par exemple :
... 'a' = (SELECT column1 FROM t1)
Il fut un temps o la seule place possible pour une sous-requte tait la droite de l'oprateur de comparaison, mais vous pourrez rencontrer de vieilles bases qui insisteront sur ce point. Voici un exemple de comparaison classiques, pour lequel vous ne pouvez pas utiliser de jointure : trouvez toutes les valeurs de la table t1 qui sont gales au maximum de la valeur dans la table t2.
SELECT column1 FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2);
Voici un autre exemple, qui est aussi impossible raliser avec une jointure, car elle impose l'agrgation de plusieurs tables : trouver toutes les lignes de la table t1 qui contiennent une valeur qui apparat deux fois.
619
Sous-slections (SubSELECT)
Le mot ANY, qui doit suivre immdiatement un oprateur de comparaison, signifie : ``retourne TRUE si la comparaison est TRUE pour UNE des lignes que la sous-requte retourne.'' Par exemple :
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
Supposons qu'il y ait une ligne dans la table t1 qui contienne {10}. L'expression est TRUE si la table t2 contient {21,14,7} car il y a une valeur de t2, 7, qui est infrieure 10. Cette expression est FALSE si la table t2 contient {20,10}, ou si la table t2 est vide. L'expression est UNKNOWN si la table t2 contient {NULL,NULL,NULL}. Le mot IN est un alias de = ANY. Les deux commandes suivantes sont identiques :
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
Le mot SOME est un alias de ANY. Les deux commandes suivantes sont identiques :
SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);
L'utilisation du mot SOME est rare, mais les exemples ci-dessus montrent pourquoi il peut tre utile. En langage parl, ``a n'est pas gal aucun b'' signifie pour la majorit des gens, ``il n'y a pas de b qui est gal a'' : ce n'est pas la signification de la syntaxe SQL. En utilisant <> SOME, vous pouvez vous assurer que tout le monde comprend le vritable sens de la commande.
Le mot ALL, qui doit suivre immdiatement l'oprateur de comparaison, signifie ``retourne TRUE si la comparaison est TRUE pour TOUTES les lignes que la sous-requte retourne''. Par exemple :
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
Supposons qu'il y ait une ligne dans la table t1 contenant {10}. L'expression est TRUE si la table t2 contient {-5,0,+5} car les trois valeurs de t2 sont infrieures 10. L'expression est FALSE si la table t2 contient {12,6,NULL,-100} car il y a une des valeurs de la table t2, ici 12, qui est plus grande que 10. L'expression est UNKNOWN si la table t2 contient {0,NULL,1}. Finalement, si la table t2 est vide, le rsultat est TRUE. Vous pouvez pensez que le rsultat doit tre indtermin (UNKNOWN), mais c'est bien TRUE. Ce qui fait que, bizarrement,
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
620
Sous-slections (SubSELECT)
est UNKNOWN si la table t2 est vide. En gnral, les tables avec des NULL et les tables vides sont des cas particuliers : lorsque vous crivez vos sous-requtes, pensez bien les prendre en compte.
Les requtes ci-dessus sont toutes les deux TRUE si la table t2 a une ligne o column1 = 1 et column2 = 2. L'expression (1,2) est parfois appele un constructeur de ligne et est valide dans d'autres contextes. Par exemple, les deux commandes suivantes sont smantiquement quivalentes, mme si la prcdente peut tre optimise :
SELECT * FROM t1 WHERE (column1,column2) = (1,1); SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
L'utilisation traditionnelle des constructeurs de ligne est lors des comparaisons avec des sous-requtes qui retournent plusieurs colonnes. Par exemple, cette requte rpond la question : ``trouve toutes les lignes de la table t1 qui sont dupliques dans la table t2'':
SELECT column1,column2,column3 FROM t1 WHERE (column1,column2,column3) IN (SELECT column1,column2,column3 FROM t2);
Traditionnellement, une sous-requte qui EXISTS commence avec SELECT * mais elle peut commencer aussi bien avec SELECT 5 ou SELECT column1 ou n'importe quoi d'autre encore : MySQL ignore la liste de colonnes du SELECT de cette requte, ce qui fait que cela n'a pas d'importance. Dans l'exemple ci-dessus, si la table t2 ne contient aucune ligne, mme pas de ligne avec uniquement des valeurs NULL, alors la condition EXISTS est TRUE. C'est un exemple plutt exceptionnel, car il y a presque toujours une sous-requte [NOT] EXISTS qui contiendra des corrlations. Voici des exemples plus concrets : Quel type de magasin est le plus frquent dans une ou plusieurs villes?
SELECT DISTINCT store_type FROM Stores WHERE EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type);
621
Sous-slections (SubSELECT)
SELECT DISTINCT store_type FROM Stores S1 WHERE NOT EXISTS ( SELECT * FROM Cities WHERE NOT EXISTS ( SELECT * FROM Cities_Stores WHERE Cities_Stores.city = Cities.city AND Cities_Stores.store_type = Stores.store_type));
Le dernier exemple est une double imbrication de requte NOT EXISTS : elle possde une clause NOT EXISTS l'intrieur de la clause NOT EXISTS. Formellement, elle rpond la question : ``Existe-t-il une ville avec un magasin qui n'est pas dans Stores?''. Mais il est plus facile de dire qu'une clause NOT EXISTS imbrique rpond la question ``est-ce que x est vrai pour tous les y?''.
Notez que dans notre exemple, la sous-requte contient une rfrence une colonne de la table t1, mme si la sous-requte de la clause FROM ne mentionne pas la table t1. MySQL recherche hors de la requte et trouve t1 dans la requte externe. Supposez que la table t1 contienne une ligne o column1 = 5 et column2 = 6; alors que la table t2 continue une ligne o column1 = 5 et column2 = 7. l'expression ... WHERE column1 = ANY (SELECT column1 FROM t2) sera alors TRUE, mais dans cet exemple, la clause WHERE de la sous-requte est FALSE (car 7 <> 5), et donc, toute la sous-requte est FALSE. Rgles de contexte : MySQL fait les valuations de l'intrieur vers l'extrieur. Par exemple :
SELECT column1 FROM t1 AS x WHERE x.column1 = (SELECT column1 FROM t2 AS x WHERE x.column1 = (SELECT column1 FROM t3 WHERE x.column2 = t3.column1));
Dans l'exemple ci-dessus, x.column2 doit tre une colonne de la table t2 car SELECT column1 FROM t2 AS x ... prend le nom de t2. ce n'est pas une colonne de la table t1 car SELECT column1 FROM t1 ... est une requte externe, qui est venir. Pour les sous-requtes places dans des clauses HAVING ou ORDER BY, MySQL recherche aussi les noms de colonnes dans la liste des slections externes. Dans certains cas, les sous-requtes corrles sont optimises. Par exemple :
val IN (SELECT key_val FROM tbl_name WHERE correlated_condition)
Sinon, elles sont inefficaces et plutt lentes. Rcrire une requte sous forme de jointure peut amliorer les performances.
La clause AS <name> est obligatoire, car les tables de la clause FROM doivent avoir un nom. Toutes les colonnes de la sous-requte <subquery> doivent avoir des noms distincts. Vous pourrez trouver cette syntaxe dcrite ailleurs dans ce manuel, sous le nom de ``tables drives''.
622
Sous-slections (SubSELECT)
Comment utiliser la fonctionnalit de sous-requtes dans la clause FROM, avec cette table d'exemple :
INSERT INTO t1 VALUES (1,'1',1.0); INSERT INTO t1 VALUES (2,'2',2.0); SELECT sb1,sb2,sb3 FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb WHERE sb1 > 1;
Rsultat : 2, '2', 4.0. Voici un autre exemple : supposons que vous voulez connatre la moyenne de la somme pour un groupe de table. Ceci ne fonctionnera pas :
SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1;
Notez que les colonnes sont nommes partir de la sous-requte : (sum_column1) est reconnue dans la requte externe. Actuellement, les sous-requtes en clause FROM ne peuvent pas tre corrles.
ne fonctionnera pas, mais uniquement dans certaines versions d'origines, comme MySQL 4.1.1.
ERROR 1240 (ER_CARDINALITY_COL) SQLSTATE = 21000 Message = "Operand should contain 1 column(s)"
Il est valide d'utiliser une sous-requte qui utilise plusieurs colonnes, dans le cadre d'une comparaison. See Section 13.1.8.5, Sous-requtes de ligne . Mais dans d'autres contextes, la sous-requte doit tre un oprande scalaire.
ERROR 1241 (ER_SUBSELECT_NO_1_ROW) SQLSTATE = 21000 Message = "Subquery returns more than 1 row"
623
Sous-slections (SubSELECT)
mais uniquement lorsque plus d'une ligne sont extraites de t2. Cela signifie que cette erreur peut survenir dans du code qui fonctionne depuis longtemps : quelqu'un vient de modifier le nombre de ligne que la requte retourne. N'oubliez pas que si votre but est de trouver un nombre arbitraire de lignes, et non pas juste une seule, la commande correcte aurait t :
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Message = "You can't specify target table 'x' for update in FROM clause"
Il est valide d'utiliser une sous-requte lors d'une affectation dans une commande UPDATE, car les sous-requtes sont valides avec les commandes UPDATE et DELETE, tout comme dans les commandes SELECT. Cependant, vous ne pouvez pas les utiliser sur la mme table, qui est ici t1, car cette table est alors la cible de la clause FROM et de la commande UPDATE. Gnralement, l'chec d'un sous-requte entrane l'chec de toute la commande.
au lieu de
SELECT DISTINCT t1.column1 FROM t1, t2 WHERE t1.column1 = t2.column1;
Dplacer une clause FROM externe dans une sous-requte, comme ceci :
SELECT * FROM t1 WHERE s1 IN (SELECT s1 FROM t1 UNION ALL SELECT s1 FROM t2);
au lieu de
SELECT * FROM t1 WHERE s1 IN (SELECT s1 FROM t1) OR s1 IN (SELECT s1 FROM t2);
Un autre exemple :
SELECT (SELECT column1 + 5 FROM t1) FROM t2;
au lieu de
SELECT (SELECT column1 FROM t1) + 5 FROM t2;
624
Sous-slections (SubSELECT)
au lieu de
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.column1=t1.column1 AND t2.column2=t1.column2);
Utiliser NOT (a = ANY (...)) au lieu de a <> ALL (...). Utiliser x = ANY (table containing {1,2}) plutt que x=1 OR x=2. Utiliser = ANY de prfrence EXISTS Le truc ci-dessus peut acclrer certains programmes, et en ralentir d'autres. En utilisant la fonction utilitaire BENCHMARK(), vous pouvez obtenir une ide de votre cas. Ne vous attardez pas trop transformer vos jointures, sauf si la compatibilit avec les anciennes versions est importante pour vous. Quelques optimisation que MySQL va prendre en charge lui-mme : MySQL va excuter les sous-requtes non corrles une seule fois (utilisez la commande EXPLAIN pour vous assurer que les requtes ne sont pas correlles). MySQL va transformer les sous-requtes IN/ALL/ANY/SOME pour essayer de profiter de la possibilit que les colonnes slectionnes dans la sous-requtes sont indexes. MySQL remplacera les sous-requtes de la forme
... IN (SELECT indexed_column FROM single_table ...)
par une recherche dans un index, que EXPLAIN dcrira comme une jointure de type spcial. MySQL va amliorer les expressions de la forme
valeur {ALL|ANY|SOME} {> | < | >= | <=} (sous-requte non-correlle)
avec une expression impliquant MIN ou MAX ( moins d'une valeur NULL ou d'ensembles SET vides). Par exemple,
WHERE 5 > ALL (SELECT x FROM t)
revient
WHERE 5 > (SELECT MAX(x) FROM t)
Il y a un chapitre intitul ``Comment MySQL adapte les sous-requtes'' dans les manuels internes de MySQL, que vous pouvez trouver en tlchargeant les sources de MySQL : il est dans un fichier appel internals.texi, dans le dossier Docs.
625
Syntaxe de TRUNCATE
Les requtes :
SELECT * FROM t1 WHERE id NOT IN (SELECT id FROM t2); SELECT * FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE t1.id=t2.id);
Une clause LEFT [OUTER] JOIN peut tre plus rapide qu'une sous-requte quivalent, car le serveur va pouvoir l'optimiser bien mieux : c'est un fait qui n'est pas spcifique MySQL. Avant SQL-92, les jointures externes n'existaient pas, et les sous-requtes taient la seule mthode pour rsoudre certains problmes. Aujourd'hui, le serveur MySQL et d'autres bases de donnes modernes offrent toute une gamme de jointures externes. Pour les sous-requtes plus complexes, vous pouvez simplement crer des tables temporaires pour contenir les rsultats intermdiaires. Dans certains cas, cela ne sera pas possible. C'est notamment le cas des commandes de type DELETE, pour lesquelles le standard SQL ne supporte pas les jointures, sauf pour les sous-requtes. Dans ces situations, trois solutions s'offrent vous : Passez en MySQL version 4.1. Utilisez un langage de programmation procdural, comme Perl ou PHP, pour envoyer la requte SELECT, lire les cls primaires effacer, et utiliser ces valeurs pour soumettre des requtes de type DELETE (DELETE FROM ... WHERE ... IN (key1, key2, ...)). La troisime option est d'utiliser le client interactif de mysql pour construire et excuter une liste de commande DELETE automatiquement, avec la fonction CONCAT() au lieu de l'oprateur ||. Par exemple :
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", tab1.pkid, "'", ';') FROM tab1, tab2 WHERE tab1.col1 = tab2.col2;
Vous pouvez placer cette requte dans un fichier de script, et rediriger son rsultat vers le client en ligne de commande mysql, pour que ce dernier lance une seconde instance de l'interprteur :
shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb
MySQL 4.0 supporte les commandes DELETE multi-tables qui peuvent tre utilises pour effacer des lignes dans une table en fonction d'informations qui sont dans une autre table, ou mme effacer des lignes simultanment dans plusieurs tables. Les commandes UPDATE multi-tables sont aussi supports depuis la version 4.0.
Dans la version 3.23, TRUNCATE TABLE est quivalent COMMIT ; DELETE FROM nom_de_table. See Section 13.1.1, Syntaxe de DELETE . TRUNCATE TABLE diffre de DELETE FROM ... des faons suivantes : Implmente comme une destruction/cration de table, ce qui acclre la suppression des enregistrements. Ne respecte pas les transactions. Vous aurez des erreurs si vous avez une transaction active ou une table protge en criture. Ne retourne pas le nombre de lignes effaces.
626
Syntaxe de UPDATE
Tant que le fichier de dfinition nom_de_table.frm est valide, la table peut tre recre, me si les donnes ou un index a t corrompu. Le gestionnaire de table ne se souvient pas de la dernire valeur AUTO_INCREMENT utilise, mais peut commencer compter depuis le dbut. C'est vrai pour les tables MyISAM, ISAM et BDB. TRUNCATE est une extension Oracle SQL. Cette commande a t ajoute en MySQL 3.23.28, mme si dans les versions 3.23.28 3.23.32, le mot cl TABLE devait tre omis.
Syntaxe multi-tables :
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...] SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
UPDATE met jour des enregistrements dans une tables avec de nouvelles valeurs. La clause SET indique les colonnes modifier et les valeurs leur donner. La clause WHERE, si fournie, spcifie les enregistrements mettre jour. Sinon, tous les enregistrements sont mis jour. Si la clause ORDER BY est fournie, les enregistrements seront mis jour dans l'ordre spcifi. La commande UPDATE accepte les options suivantes : Si vous spcifiez le mot clef LOW_PRIORITY, l'excution de l'UPDATE sera repouss jusqu' ce que aucun client ne lise plus de la table. Si vous spcifiez le mot clef IGNORE, la mise jour ne s'interrompra pas mme si on rencontre des problmes d'unicit de clefs durant l'opration. Les enregistrements posant problmes ne seront pas mis jour. Si vous accdez une colonne d'une table tbl_name dans une expression, UPDATE utilisera la valeur courante de la colonne. Par exemple, la requte suivante ajoute une anne l'ge actuel de tout le monde :
mysql> UPDATE persondata SET age=age+1;
Les requtes UPDATE sont values de gauche droite. Par exemple, la requte suivante double la valeur de la colonnes ge, puis l'incrmente :
mysql> UPDATE persondata SET age=age*2, age=age+1;
Si vous changez la valeur d'une colonne en lui spcifiant sa valeur actuelle, MySQL s'en aperoit et ne fait pas la mise jour. UPDATE retourne le nombre d'enregistrements ayant chang. Depuis la version 3.22 de MySQL, la fonction mysql_info() de l'API C retourne le nombre de colonnes qui correspondaient, le nombre de colonnes mises jour et le nombre d'erreurs gnres pendant l'UPDATE. Dans la version 3.23 de MySQL, vous pouvez utilisez le code LIMIT # pour vous assurer que seul un nombre d'enregistrements bien prcis est chang. Avant MySQL 4.0.13, LIMIT est une restrictions sur le nombre de lignes affectes. Cette clause stoppe ds que row_count ont t trouves par la clause WHERE. Depuis la version 4.0.13, LIMIT est une restriction sur le nombre de lignes trouves. La commande s'arrte une fois que row_count lignes ont t trouves par la clause WHERE, qu'elles ait t changes ou pas.
627
Ai une clause ORDER BY est utilise (disponible depuis MySQL version 4.0.0), les lignes seront modifies selon cet ordre. Ce n'est vraiment utile qu'en conjonction avec LIMIT. Depuis MySQL version 4.0.4, vous pouvez aussi faire des oprations de UPDATE qui couvrent plusieurs tables :
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;
L'exemple ci-dessus montre une jointure interne, en utilisant la virgule comme sparateur, mais une commande UPDATE multi-table peut utiliser n'importe quel type de jointure autorise dans une commande SELECT, tel qu'un LEFT JOIN. Note : vous ne pouvez pas utiliser ORDER BY ou LIMIT avec les UPDATE multi-table.
ALTER DATABASE vous permet de modifier les caractristiques gnrales d'une base de donnes. Ces caractristiques sont stockes dans le fichier db.opt du dossier de base. Pour utiliser ALTER DATABASE, vous avez besoin des droits de ALTER sur la base. La clause CHARACTER SET modifie le jeu de caractres par dfaut de la base. La clause COLLATE modifie la collation par dfaut de la base. Les noms de jeu de caractres et de collation sont prsents dans la section Chapitre 10, Jeux de caractres et Unicode. ALTER DATABASE a t ajoute MySQL 4.1.1.
628
| | | | |
CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] DISCARD TABLESPACE IMPORT TABLESPACE table_options
ALTER TABLE vous permet de changer la structure d'une table existante. Par exemple, vous pouvez ajouter ou supprimer des colonnes, des index, changer le type des colonnes existantes, renommer ces colonnes, ou la table elle-mme. Vous pouvez de mme changer le commentaire sur la table, ou le type de celle-ci. La syntaxe de nombreuses altrations est similaires aux clauses de la commande CREATE TABLE. See Section 13.2.5, Syntaxe de CREATE TABLE . Si vous utilisez ALTER TABLE pour modifier les spcifications d'une colonne mais que DESCRIBE nom_de_table vous indique que cette colonne n'a pas t modifie, il est possible que MySQL ait ignor vos modifications pour une des raisons dcrite dans Section 13.2.5.1, Modification automatique du type de colonnes . Par exemple, si vous essayez de changer une colonne de type VARCHAR en CHAR, MySQL continuera d'utiliser VARCHAR si la table contient d'autres colonnes de taille variable. ALTER TABLE effectue une copie temporaire de la table originale. Les modifications sont faites sur cette copie, puis l'original est efface, et enfin la copie est renomme pour remplacer l'originale. Cette mthode permet de rediriger toutes les commandes automatiquement vers la nouvelle table sans pertes. Durant l'excution de ALTER TABLE, la table originale est lisible par d'autres clients. Les modifications et insertions sont reportes jusqu' ce que la nouvelle table soit prte. Notez que si vous utilisez une autre option que RENAME avec ALTER TABLE, MySQL crera toujours une table temporaire, mme si les donnes n'ont pas besoin d'tre copies (comme quand vous changez le nom d'une colonne). Nous avons prvu de corriger cela dans les versions suivantes, mais comme la commande ALTER TABLE n'est pas utilise trs souvent, cette correction ne fait pas partie de nos priorits. Pour les tables MyISAM, vous pouvez acclrer la rindexation (qui est la partie la plus lente de la modification d'une table) en donnant la variable systme myisam_sort_buffer_size une valeur plus grande. Pour utiliser ALTER TABLE, vous devez avoir les droits ALTER, INSERT, et CREATE sur la table. IGNORE est une extension MySQL pour ANSI SQL92. Cette option contrle la faon dont ALTER TABLE fonctionne s'il y a des duplications sur une clef unique de la nouvelle table. Si IGNORE n'est pas spcifie, la copie est annule et la table originale est restaure. Si IGNORE est spcifie, les lignes contenant les lments doublons de la table seront effaces, hormis la premire, qui sera conserve. Vous pouvez effectuer plusieurs oprations de ADD, ALTER, DROP, et CHANGE dans une mme commande ALTER TABLE. C'est une extension de MySQL la norme ANSI SQL92, qui n'autorise qu'une seule modification par commande ALTER TABLE. CHANGE nom_colonne, DROP nom_colonne, et DROP INDEX sont des extensions de MySQL la norme ANSI SQL92. MODIFY est une extension Oracle ALTER TABLE. Le mot optionnel COLUMN est purement de la fioriture et peut tre ignor. Si vous utilisez ALTER TABLE nom_de_table RENAME TO nouveau_nom sans autre option, MySQL va simplement renommer les fichiers qui correspondent la table nom_de_table. Il n'y a pas de cration de fichier temporaire. See Section 13.2.9, Syntaxe de RENAME TABLE . La dfinition create_definition utilise la mme syntaxe pour les clauses ADD et CHANGE que dans CREATE TABLE. Notez que cette syntaxe inclut le nom de la colonne, et pas seulement son type See Section 13.2.5, Syntaxe de CREATE TABLE .
629
Vous pouvez renommer une colonne avec la syntaxe CHANGE ancien_nom_de_colonne create_definition. Pour cela, indiquez l'ancien nom de la colonne, puis le nouveau nom et son type courant. Par exemple, pour renommer une colonne de type INTEGER, de a en b, vous pouvez faire ceci :
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Si vous ne voulez changer que le type de la colonne, avec la clause CHANGE vous devrez redonner le nom de la colonne. Par exemple :
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
Cependant, partir de la version 3.22.16a de MySQL, vous pouvez aussi utiliser la clause MODIFY pour changer le type d'une colonne sans la renommer :
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
Si vous utilisez les clauses CHANGE ou MODIFY pour rduire la taille d'une colonne qui comportait un index sur une partie de la colonne (par exemple, si vous aviez un index sur 10 caractres d'une colonne de type VARCHAR), vous ne pouvez pas rendre la colonne plus petite que le nombre de caractres indexs. Quand vous changez le type d'une colonne avec CHANGE ou MODIFY, MySQL essaye de convertir les donnes au niveau type dans la mesure du possible. A partir de la version 3.22 de MySQL, vous pouvez utiliser FIRST ou ADD ... AFTER nom_colonne pour ajouter la colonne un endroit spcifique dans la table. Par dfaut, la colonne est ajoute la fin. A partir de la version 4.0.1, vous pouvez aussi utiliser les mots cls FIRST et AFTER avec CHANGE ou MODIFY. ALTER COLUMN spcifie une nouvelle valeur par dfaut pour une colonne ou enlve l'ancienne. si l'ancienne valeur est efface et que la colonne peut tre NULL, la nouvelle valeur par dfaut sera NULL. Si la colonne ne peut tre NULL, MySQL assigne une valeur par dfaut, comme dfini dans Section 13.2.5, Syntaxe de CREATE TABLE . DROP INDEX supprime un index. C'est une extension MySQL la norme ANSI SQL92. See Section 13.2.7, Syntaxe de DROP INDEX . Si des colonnes sont effaces d'une table, ces colonnes sont aussi supprims des index dont elles font partie. Si toutes les colonnes qui forment un index sont effaces, l'index lui mme est supprim. Si une table ne comporte qu'une seule colonne, La colonne ne peut tre supprime. Si vous voulez effacer la table, utilisez la commande DROP TABLE. DROP PRIMARY KEY supprime la clef primaire. Si cette clef n'existe pas, cette commande effacera le premier index UNIQUE de la table. (MySQL marque la premire clef UNIQUE en tant que PRIMARY KEY si aucune PRIMARY KEY n'a t spcifie explicitement.) Si vous ajoutez un UNIQUE INDEX ou PRIMARY KEY une table, c'est enregistr avant les index non-UNIQUE pour que MySQL puisse dtecter les valeurs dupliques aussi vite que possible. ORDER BY vous permet de crer une nouvelle table tout en ordonnant les lignes par dfaut. Notez que cet ordre ne sera pas conserv aprs les prochaines insertions et modifications. Dans certains cas, cela aide MySQL si les colonnes sont dans l'ordre dans lequel vous allez trier les valeurs. Cette option n'est vraiment utile que si vous savez l'avance dans quel ordre vous effectuerez les tris : vous y gagnerez alors en performances. Si vous utilisez ALTER TABLE sur une table MyISAM, tous les index non-uniques sont crs par des oprations spares. (comme dans REPAIR). Cela devrait rendre ALTER TABLE plus rapide quand vous avez beaucoup d'index. Depuis la version 4.0, la fonctionnalit ci-dessus peut tre active explicitement. ALTER TABLE ... DISABLE KEYS force MySQL ne plus mettre jour les index non-uniques pour les tables au
630
format MyISAM. ALTER TABLE ... ENABLE KEYS doit alors tre utilis pour recrer les index manquants. Comme MySQL le fait avec un algorithme spcial qui est plus rapide que le fait d'insrer les clefs une par une, dsactiver les clefs peut vous faire gagner en performances. Les clauses FOREIGN KEY et REFERENCES sont supportes par le moteur de tables InnoDB, qui implmente les clauses ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...). See Section 15.7.4, Contraintes de cls trangres FOREIGN KEY . Pour les autres moteurs de stockages, ces clauses sont lues mais ignores. La clause CHECK est analyse mais ignore par tous les moteurs de stockage. See Section 13.2.5, Syntaxe de CREATE TABLE . La raison pour accepter mais ignorer ces clauses est que cela renforce la compatibilit avec le code des autres serveurs SQL, et qu'il est possible de crer des tables avec des rfrences. See Section 1.5.5, Diffrences entre MySQL et le standard SQL-92 . Depuis MySQL 4.0.13, InnoDB supporte l'utilisation de ALTER TABLE pour effacer des cls trangres :
ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol
Pour plus d'informations, voyez Section 15.7.4, Contraintes de cls trangres FOREIGN KEY . ALTER TABLE ignore les options de tables DATA DIRECTORY et INDEX DIRECTORY. Depuis MySQL 4.1.2, si vous voulez changer dans toutes les colonnes de texte (CHAR, VARCHAR, TEXT) le jeu de caractres, vous pouvez utiliser la commande suivante :
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
C'est pratique lorsque vous passez de MySQL 4.0.x en 4.1.x. See Section 10.10, Prparer le passage de version 4.0 en 4.1 . Attention : l'opration prcdente va convertir les valeurs des colonnes entre les deux jeux de caractres. Ce n'est pas ce que vous souhaitez faire si une colonne est de type latin1 mais que les valeurs sont en fait dans un autre jeu de caractres (comme utf8). Dans ce cas, vous devez faire ceci avec une telle colonne :
ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
La raison est que dans ce cas, il n'y aura pas de conversion lorsque vous passer en type BLOB. Pour ne changer que le type de caractres par dfaut, utilisez cette commande :
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
Le mot DEFAULT est optionnel. Le jeu de caractres par dfaut est utilis si vous ne spcifiez pas le jeu de caractres de la colonne explicitement, lorsque vous ajoutez une nouvelle colonne : par exemple, avec ALTER TABLE ... ADD column. Attention : depuis MySQL 4.1.2 et plus rcent, ALTER TABLE ... DEFAULT CHARACTER SET et ALTER TABLE ... CHARACTER SET sont quivalent et ne changent que le jeu de caractres par dfaut. Dans les versions antrieures MySQL 4.1.2, ALTER TABLE ... DEFAULT CHARACTER SET changeait le jeu de caractres par dfaut, mais ALTER TABLE ... CHARACTER SET (sans DEFAULT) changeait le jeu de caractres par dfaut, et convertissaient les colonnes dans le nouveau jeu. Pour une table InnoDB qui a t cre avec son propre espace de tables dans un fichier .ibd, ce fichier peut tre supprim et import. Pour supprimer le fichier .ibd, utilisez la commande suivante :
ALTER TABLE tbl_name DISCARD TABLESPACE;
Elle efface le fichier .ibd courant, alors assurez vous que vous avez une copie de sauvegarde. Si vous tentez d'accder un espace de table sans ce fichier, vous obtiendrez une erreur.
631
Pour importer un fichier de sauvegarde .ibd dans la table, copiez le nouveau fichier dans le dossier de la base, et utilisez cette commande :
ALTER TABLE tbl_name IMPORT TABLESPACE;
See Section 15.7.6, Espaces de tables multiples : chaque table InnoDB a son fichier .ibd . Avec la fonction mysql_info() de l'API C, vous pouvez savoir combien d'enregistrements ont t copis, et (quand IGNORE est spcifi) combien d'enregistrements ont t effacs cause de la clef unique. See Section 24.2.3.31, mysql_info() . Voil un exemple qui montre quelques utilisations de ALTER TABLE. On commence par une table t1 cre comme suit :
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Pour changer une colonne a de INTEGER en TINYINT NOT NULL (en laissant le mme nom), et pour changer une colonne b de CHAR(10) CHAR(20) et la renommant de b en c :
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Pour ajouter un index sur une colonne d, et rendre la colonne a la clef primaire :
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Notez que nous avons index c, car les colonnes AUTO_INCREMENT doivent tre indexes, et que nous dfinissons aussi c en tant que NOT NULL, car les colonnes indexes ne peuvent tre NULL. Quand vous ajoutez une colonne AUTO_INCREMENT, les valeurs de la colonne sont remplies automatiquement pour vous. Vous pouvez choisir la valeur de dpart pour l'indexation en utilisant SET INSERT_ID=# avant ALTER TABLE ou en utilisant l'option AUTO_INCREMENT = # de la table. See Section 13.5.2.8, Syntaxe de SET . Avec les tables de type MyISAM, si vous ne changez pas la colonne AUTO_INCREMENT, l'indice d'autoincrmentation ne sera pas affect. Si vous effacez une colonne AUTO_INCREMENT puis en ajoutez une autre, l'indexation recommencera partir de 1. See Section A.7.1, Problmes avec ALTER TABLE. .
632
CREATE DATABASE cre une base de donnes avec le nom donn. Les rgles de nommage des bases de donne sont prsentes dans la section Section 9.2, Noms de bases, tables, index, colonnes et alias . Une erreur survient si une base de donnes de mme nom existe dj, si vous ne spcifiez pas l'option IF NOT EXISTS. Depuis MySQL 4.1.1, les options create_specification peuvent tre donnes pour spcifier des caractristiques de la base. Les caractristiques de la base sont stockes dans le fichier db.opt dans le dossier de la base. La clause CHARACTER SET spcifie le jeu de caractres par dfaut pour les tables de cette base. La clause COLLATE spcifie la collation par dfaut de la base de donnes. Les jeux de caractres et les collations sont prsentes dans la section Chapitre 10, Jeux de caractres et Unicode. Les bases de donnes MySQL sont implmentes comme des rpertoires contenant des fichiers qui correspondent aux tables dans les bases de donnes. Puisqu'il n'y a pas de tables dans une base de donnes lors de sa cration, la requte CREATE DATABASE crera seulement le dossier dans le rpertoire de donnes de MySQL (et le fichier db.opt, depuis MySQL 4.1.1). Vous pouvez aussi crer des bases de donnes avec mysqladmin. See Section 8.4, mysqladmin, administration d'un serveur MySQL .
La requte CREATE INDEX n'effectue aucune action sur les versions de MySQL antrieures la version 3.22. Dans les versions 3.22 et suprieures, CREATE INDEX est quivalent une requte ALTER TABLE pour crer des index. See Section 13.2.2, Syntaxe de ALTER TABLE . Normalement, tous les index sont crs en mme temps que la table elle mme avec CREATE TABLE. See Section 13.2.5, Syntaxe de CREATE TABLE . CREATE INDEX permet d'ajouter des index une table existante. Une liste de colonnes de la forme (col1,col2,...) cre un index multi-colonnes. Les valeurs de l'index sont cres en concatnant la valeur deux colonnes donnes. Pour les colonnes CHAR et VARCHAR, les index peut tre crs sur uniquement une partie de la colonne, avec la syntaxe col_name(length). Pour les colonnes BLOB et TEXT la longueur d'index est obligatoire. La requte suivante cre un index en utilisant les 10 premiers caractres de la colonne name :
mysql> CREATE INDEX part_of_name ON customer (name(10));
Comme la plupart des noms ont en gnral des diffrences dans les 10 premiers caractres, l'index ne devrait pas tre plus lent qu'un index cr partir de la colonne name en entier. Ainsi, en n'utilisant qu'une partie de la colonne pour les index, on peut rduire la taille du fichier d'index, ce qui peut permettre d'conomiser beaucoup d'espace disque, et peut aussi acclrer les oprations INSERT! Il est important de savoir qu'on peut indexer une colonne qui peut avoir la valeur NULL ou une colonne BLOB/TEXT que si on utilise une version 3.23.2 ou suprieure de MySQL et en utilisant le type MyISAM. Pour plus d'informations propos de l'utilisation des index dans MySQL, voir Section 7.4.5, Comment MySQL utilise les index .
633
Les index FULLTEXT ne peuvent indexer que des colonnes VARCHAR ou TEXT, et seulement dans les tables MyISAM. Les index FULLTEXT sont disponibles dans les versions 3.23.23 et suprieures de MySQL. Section 12.6, Recherche en texte intgral (Full-text) dans MySQL . Les index SPATIAL peuvent indexer les colonnes spatiales, et uniquement avec les tables MyISAM. Les index SPATIAL sont disponibles en MySQL 4.1 et plus rcent. Les colonnes spatiales sont prsentes dans section Chapitre 18, Donnes spatiales avec MySQL.
ou :
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(] LIKE old_tbl_name [)]; create_definition: column_definition | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) | KEY [index_name] [index_type] (index_col_name,...) | INDEX [index_name] [index_type] (index_col_name,...) | [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] [index_type] (index_col_name,...) | [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...) | [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] | CHECK (expr) column_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [reference_definition] type: TINYINT[(length)] [UNSIGNED] [ZEROFILL] | SMALLINT[(length)] [UNSIGNED] [ZEROFILL] | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] | INT[(length)] [UNSIGNED] [ZEROFILL] | INTEGER[(length)] [UNSIGNED] [ZEROFILL] | BIGINT[(length)] [UNSIGNED] [ZEROFILL] | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] | DATE | TIME | TIMESTAMP | DATETIME | CHAR(length) [BINARY | ASCII | UNICODE] | VARCHAR(length) [BINARY] | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT | ENUM(value1,value2,value3,...) | SET(value1,value2,value3,...) | spatial_type index_col_name: col_name [(length)] [ASC | DESC] reference_definition:
634
REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT table_options: table_option [table_option] ... table_option: {ENGINE|TYPE} = {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM} | AUTO_INCREMENT = value | AVG_ROW_LENGTH = value | CHECKSUM = {0 | 1} | COMMENT = 'string' | MAX_ROWS = value | MIN_ROWS = value | PACK_KEYS = {0 | 1 | DEFAULT} | PASSWORD = 'string' | DELAY_KEY_WRITE = {0 | 1} | ROW_FORMAT = { DEFAULT | DYNAMIC | FIXED | COMPRESSED } | RAID_TYPE = { 1 | STRIPED | RAID0 } RAID_CHUNKS = value RAID_CHUNKSIZE = value | UNION = (tbl_name[,tbl_name]...) | INSERT_METHOD = { NO | FIRST | LAST } | DATA DIRECTORY = 'absolute path to directory' | INDEX DIRECTORY = 'absolute path to directory' | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] select_statement: [IGNORE | REPLACE] [AS] SELECT ...
CREATE TABLE Cre une table avec le nom donn, dans la base de donnes courante. Vous avez besoin des droits de CREATE pour crer une table. Les rgles de nommage des tables sont disponibles dans Section 9.2, Noms de bases, tables, index, colonnes et alias . Par dfaut, une table est cre dans la base de donnes courante. Une erreur est affiche s'il n'y a pas de base courante, si la base de donnes n'existe pas ou si la table existe dj. En MySQL 3.22 et plus rcent, le nom de la table peut tre spcifi avec la syntaxe db_name.tbl_name, pour crer une table dans une base spcifique. Cela fonctionne mme s'il n'y a pas de base courante. Si vous utilisez les identifiants protgez, et mettez le nom de la base et de lui de la table entre guillemets, sparment. Par exemple, `madb`.`matbl` est valide, mais `madb.matbl` ne l'est pas. Depuis la version 3.22 de MySQL, vous pouvez utiliser le mot rserv TEMPORARY lorsque vous crez une table. Une table temporaire sera immdiatement efface ds que la connexion se termine. Cela signifie que vous pouvez utiliser le mme nom de table temporaire depuis deux connexions diffrentes sans risque de conflit entre les connexions. Vous pouvez aussi utiliser une table temporaire qui a le mme nom qu'une table existante (la table existante est alors cache tant que dure la table temporaire). En MySQL version 4.0.2 ou plus rcent, vous avez juste avoir le privilge CREATE TEMPORARY TABLES pour crer des tables temporaires. Depuis la version 3.23 de MySQL, vous pouvez utiliser le mot rserv IF NOT EXISTS, de faon ce qu'aucune erreur ne soit affich si la table que vous essayez de crer existe dj. Notez qu'il n'y a pas de comparaisons entre les structures de table lors du test d'existence. MySQL reprsente chaque table par un fichier de dfinition de table .frm, plac dans le dossier de la base de donnes. Le moteur de la table peut crer d'autres fichiers complmentaires. Dans le cas des tables MyISAM, le moteur de stockage utilise trois fichiers, avec le nom nom_de_table : Fichier nom_de_table.frm nom_de_table.MYD Rle Fichier de dfinition de la table Fichier de donnes
635
nom_de_table.MYI
Fichier d'index
Les fichiers crs par les moteurs de stockages pour reprsenter les tables sont dcrits dans la section Chapitre 14, Moteurs de tables MySQL et types de table. Pour des informations gnrales sur les proprits des diffrentes colonnes, voyez Chapitre 11, Types de colonnes. Pour des informations sur les types de donnes spatiaux, voyez Chapitre 18, Donnes spatiales avec MySQL. Si ni NULL, ni NOT NULL n'est spcifi, une colonne utilisera par dfaut l'attribut NULL (elle acceptera les valeurs NULL). Une colonne de nombre entier peut se voir attribuer l'attribut AUTO_INCREMENT. Lorsque vous insrez la valeur NULL (recommande) ou 0 dans une colonne AUTO_INCREMENT, la colonne prendra automatiquement la valeur de value+1, o value est la plus grande valeur positive courante dans cette colonne. La srie des valeurs AUTO_INCREMENT commence 1. See Section 24.2.3.33, mysql_insert_id() . Depuis MySQL 4.1.1, en spcifiant l'option NO_AUTO_VALUE_ON_ZERO pour le mode --sqlmode ou la variable serveur sql_mode permet de stocker la valeur 0 dans les colonnes de type AUTO_INCREMENT, au lieu de voir 0 prendre le prochain numro de squence. See Section 5.2.1, Options de ligne de commande de mysqld . Note : Il ne peut y avoir qu'une seule colonne de type AUTO_INCREMENT dans une table, et elle doit tre indexe. MySQL version 3.23 ne fonctionnera correctement que si cette colonne n'accueille que des valeurs positives. Insrer un nombre ngatif sera considr comme insrer un nombre de trs grande taille, mais positif. Ceci est fait pour viter les problmes de prcision lorsque les nombres passe de positif ngatif lorsqu'ils atteignent leur valeur maximale positive. C'est aussi pour viter qu'une colonne de type AUTO_INCREMENT ne contienne de valeur 0. Si vous effacez la ligne contenant la valeur maximale dans la colonne AUTO_INCREMENT, cette valeur sera rutilise dans les tables de type ISAM mais pas dans les tables de type MyISAM. Si vous effacez toutes les lignes dans la table avec la commande DELETE FROM nom_de_table (sans la clause WHERE) en mode AUTOCOMMIT, la srie des valeurs AUTO_INCREMENT recommencera 0. Avec les tables MyISAM et BDB, vous pouvez spcifier une colonne secondaire d'AUTO_INCREMENT dans une clef multi-colonnes. See Section 3.6.9, Utiliser AUTO_INCREMENT . Pour rendre MySQL avec certaines applications ODBC, vous pouvez retrouver la valeur de la dernire valeur automatiquement gnre avec la requte suivante :
SELECT * FROM nom_de_table WHERE auto_col IS NULL
Depuis MySQL 4.1, la dfinition des colonnes peut inclure un attribut CHARACTER SET pour spcifier le jeu de caractres, et ventuellement la collation de la colonne. Pour des dtails, voyez Chapitre 10, Jeux de caractres et Unicode.
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
Depuis la version 4.1 aussi, MySQL interprte les spcifications de longueur de colonne en caractres. Les anciennes versions l'interprte comme des octets. La valeur NULL est traite diffremment dans les colonnes de type TIMESTAMP. Vous ne pouvez pas stocker de valeur NULL littrale dans une colonne TIMESTAMP; insrer une valeur NULL dans une telle colonne revient insrer la date et l'heure courante. Car les colonnes TIMESTAMP ignorent les attributs NULL et NOT NULL. Cela facilite grandement l'utilisation des colonnes TIMESTAMP pour les clients MySQL : le serveur indique que ces colonnes peuvent se voir assigner une valeur NULL (ce qui est vrai), mme si les 636
colonnes TIMESTAMP ne contiendront jamais de valeur NULL. Vous pouvez le constater lorsque vous utiliser la commande DESCRIBE nom_de_table pour avoir une description de votre table. Notez qu'affecter la valeur 0 une colonne TIMESTAMP n'est pas la mme chose que lui affecter la valeur NULL, car 0 est une valeur TIMESTAMP valide. Une valeur DEFAULT doit tre une constante, a ne peut tre une fonction ou une expression. Cela signifie notamment que vous ne pouvez pas donner une valeur par dfaut une colonne de date, le rsultat de la fonction NOW() ou CURRENT_DATE. Si aucune valeur par dfaut (attribut DEFAULT) n'est spcifie, MySQL en assigne une automatiquement Si la colonne accepte les valeur NULL, la valeur par dfaut sera la valeur NULL. Si la colonne est dclare comme NOT NULL (non-nulle), la valeur par dfaut dpendra du type de colonne : Pour les types numriques sans l'attribut AUTO_INCREMENT, la valeur sera 0. Pour une colonne AUTO_INCREMENT, la valeur par dfaut sera la prochaine valeur de la srie. Pour les types dates et heures autres que TIMESTAMP, la valeur par dfaut est la date zro approprie. Pour les colonnes TIMESTAMP, la valeur par dfaut est la date et l'heure courante. See Section 11.3, Les types date et heure . Pour les types de chanes autres que ENUM, la valeur par dfaut est la chane vide. Pour ENUM, la valeur par dfaut est la premire valeur de l'numration. Les colonnes BLOB et TEXT ne peuvent pas recevoir de valeur par dfaut. Un commentaire pour une colonne peut tre spcifie avec COMMENT. Le commentaire est affich par la commande SHOW CREATE TABLE, et par SHOW FULL COLUMNS. Cette option est disponible depuis MySQL 4.1. Il tait autoris, mais ignor dans les anciennes versions. Depuis MySQL version 4.1.0, l'attribut SERIAL peut tre utilis comme alias pour les colonnes BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE. C'est une fonctionnalit de compatibilit. KEY est un synonyme de INDEX. Depuis la version 4.1, l'attribut de cl PRIMARY KEY peut aussi tre spcifi avec la clause KEY. Il a t implment pour assurer la compatibilit avec les autres bases. Avec MySQL, une cl UNIQUE peut avoir uniquement avoir deux valeurs distinctes. Une erreur surviendra si vous essayez d'ajouter une ligne dont la cl correspond une ligne existante. Une cl primaire (PRIMARY KEY) est un index UNIQUE avec la contrainte supplmentaire que les toutes les colonnes utilises doit avoir l'attribut NOT NULL. En MySQL, cette cl est dite PRIMARY. Une table ne peut avoir qu'une seule cl primaire. Si vous n'avez pas de PRIMARY KEY et que des applications demandent la PRIMARY KEY dans vos tables, MySQL retournera la premire cl UNIQUE, qui n'a aucune valeur NULL. Dans une table cre, la cl primaire PRIMARY KEY est place en premire, suivie de tous les index UNIQUE, et enfin, les index non-unique. Cela permet l'optimiseur MySQL d'utiliser en priorit les index, et de dtecter rapidement les doublons pour les cls UNIQUE. Une PRIMARY KEY peut tre multi-colonnes. Cependant, vous ne pouvez pas crer d'index multicolonnes avec l'attribut PRIMARY KEY dans une spcification de colonne. En faisant cela, le seul rsultat sera que cette seule colonne sera marque comme cl primaire. Vous devez absolument utiliser la syntaxe PRIMARY KEY (index_nom_de_colonne, ...).
637
Si une cl primaire (PRIMARY) ou unique (UNIQUE) est tablit sur une seule colonne, et que cette colonne est de type entier, vous pouvez aussi faire rfrence cette colonne sous le nom _rowid (nouveau en version 3.23.11). Avec MySQL, le nom de la cl primaire PRIMARY KEY est PRIMARY. Si vous ne donnez pas de nom un index, l'index prendra le nom de la premire colonne qui le compose, avec ventuellement un suffixe (_2, _3, ...) pour le rendre unique. Vous pouvez voir les noms des index avec la commande SHOW INDEX FROM tbl_name. See Section 13.5.3.6, Syntaxe de SHOW DATABASES . Depuis MySQL 4.1.0, certains moteurs de stockage vous permettent de spcifier un type d'index lors de la cration d'un index. La syntaxe de index_type est USING type_name. Les valeurs possibles de type_name qui sont supportes par les diffrents moteurs de stockages sont lists cidessous. Lorsque des index multiples sont lists, le premier rencontr est celui par dfaut, si aucun index_type n'est spcifi.
CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
TYPE type_name peut tre utilis comme synonyme de USING type_name, pour spcifier un type d'index. Cependant, USING est la forme recommande. De plus, le nom d'index qui prcde le type d'index dans la syntaxe de spcification n'est pas optionnelle avec TYPE. Ceci est d au fait que contrairement USING, TYPE n'est pas un mot rserv, et donc, il pourrait tre interprt comme un nom d'index. Si vous spcifiez un type d'index qui n'est pas lgal pour le moteur de stockage, mais qu'il y a un autre type d'index que le moteur peut utiliser sans affecter les rsultats de la requte, le moteur utilisera ce type en remplacement. Seuls, les formats de table MyISAM, InnoDB, et BDB supportent des index sur des colonnes qui peuvent contenir des valeurs NULL. Dans les autres situations, vous devez dclarer ces colonnes NOT NULL ou une erreur sera gnre.
Avec la syntaxe nom_de_colonne(longueur), vous pouvez spcifier un index qui n'utilise qu'une partie de la colonne CHAR ou VARCHAR. Cela peut rduire la taille des fichiers d'index. See Section 7.4.3, Index de colonnes . Le format de table MyISAM, et depuis la version MySQL 4.0.14, InnoDB, supportent l'indexation des colonnes BLOB et TEXT. Lorsque vous ajoutez un index une colonne BLOB ou TEXT, vous devez absolument spcifier une longueur d'index :
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
Le prfixe peut valoir jusqu' 255 octets de long (o 1000 octets pour les tables MyISAM et InnoDB depuis MySQL 4.1.2). Notez que le prfixe est mesur en octets, alors que la longueur du prfixe de CREATE TABLE est interprt comme un nombre de caractres. Prenez cela en compte lorsque vous spcifiez une longueur de prfixe pour une colonne dont le jeu de caractres est multi-octets. Une spcification index_col_name peut se terminer avec ASC ou DESC. Ces mots cls sont prvus pour des extensions futures qui permettront un stockage dans un ordre donn. Actuellement, ils sont reconnus mais ignors : les index sont stocks en ordre ascendant. 638
Lorsque vous utilisez une clause ORDER BY ou GROUP BY sur une colonne de type TEXT ou BLOB, seuls, les max_sort_longueur premiers octets seront lus. See Section 11.4.3, Les types BLOB et TEXT . En MySQL version 3.23.23 ou plus rcent, vous pouvez aussi crer des index spcial FULLTEXT. Ils sont utiliss pour faire des recherches en texte plein. Seul, le format de table MyISAM supporte les index FULLTEXT. Ils peuvent tre crs uniquement pour les colonnes de type VARCHAR et TEXT. L'indexation est alors excute sur toute la colonne, et les indexations partielles ne sont pas supportes. Voir Section 12.6, Recherche en texte intgral (Full-text) dans MySQL pour les dtails. En MySQL version 4.1 ou plus rcent, vous pouvez crer les index spciaux SPATIAL pour les colonnes gographiques. Les types spatiaux sont supports par les tables MyISAM, et les colonnes indexes doivent tre dclares comme NOT NULL. Voyez Chapitre 18, Donnes spatiales avec MySQL. En MySQL version 3.23.44 et plus rcent, les tables InnoDB supportent la vrification de cl trangres. See Chapitre 15, Le moteur de tables InnoDB. Notez que la syntaxe des cls trangres FOREIGN KEY de InnoDB est plus restrictive que la syntaxe prsente ci-dessus. InnoDB ne permet pas la spcification d'un index_name, et les colonnes de la table rfrence doivent tre explicitement nommes. Depuis la version 4.0.8, InnoDB supporte les clauses ON DELETE et ON UPDATE avec les cls trangres. Voyez le manuel InnoDB pour la syntaxe prcise. Section 15.7.4, Contraintes de cls trangres FOREIGN KEY . Pour les autres types de tables, le serveur MySQL n'analyse pas les clauses FOREIGN KEY, CHECK et REFERENCES dans les commandes CREATE TABLE, et aucune action n'est ralise. See Section 1.5.5.5, Les cls trangres . Pour les tables MyISAM et ISAM, chaque colonne NULL requiert un bit supplmentaire, arrondi l'octet suprieur le plus proche. La taille maximale d'enregistrement peut tre calcule comme ceci :
row longueur = + + + 1 (somme des longueurs de colonnes) (nombre de colonnes NULL + 7)/8 (nombre de colonnes taille variable)
delete_flag vaut 1 pour les tables avec un format fixe. Les tables format fixe utilisent un bit dans les lignes pour un marqueur, qui indique si la ligne a t efface. delete_flag vaut 0 pour les tables ligne dynamique, car le marquer est stock dans l'entte de la ligne. Ces calculs ne s'appliquent pas aux tables InnoDB, qui ne font pas la diffrente entre les colonnes NULL et les colonnes NOT NULL. Les options options_de_table et SELECT ne sont implmentes que dans MySQL version 3.23 et plus rcent. Les options ENGINE et TYPE spcifie le type de moteur de table. ENGINE a t ajout en MySQL 4.0.18, pour la srie des 4.0 et 4.1.2, pour la srie des 4.1. C'est le nom d'attribut recommand pour ces versions et TYPE est maintenant abandonn. TYPE sera support dans les sries 4.x, mais abandonne probablement en MySQL 5.1. Les diffrents types de tables sont : Table type ARCHIVE BDB Description Le moteur d'archivage. See Section 14.7, Le moteur de table ARCHIVE . Tables avec transactions. See Section 14.4, Tables BDB ou BerkeleyDB .
639
BerkeleyDB CSV EXAMPLE FEDERATED HEAP ISAM InnoDB MEMORY MERGE MRG_MyISAM MyISAM NDB NDBCLUSTER
Un alias de BDB. Tables qui stockent les lignes au format valeurs spares par des virgules. See Section 14.8, Le moteur CSV . Un moteur d'exemple. See Section 14.5, Le moteur de table EXAMPLE . Un moteur qui accde des tables distantes. See Section 14.6, Le moteur de table FEDERATED . Les donnes de ces tables ne sont stockes qu'en mmoire. See Section 14.3, Le moteur de table MEMORY (HEAP) . Le gestionnaire originel de tables. See Section 14.9, Tables ISAM . Tables transactionnelles avec verrou de lignes. See Chapitre 15, Le moteur de tables InnoDB. Un alias de HEAP. (En fait, depuis MySQL 4.1, MEMORY est le terme recommand.) Un ensemble de tables MyISAM utilises comme une seule et mme table. See Section 14.2, Tables assembles MERGE . Un synonyme pour les tables MERGE. Le nouveau gestionnaire de table binaire et portable. See Section 14.1, Le moteur de tables MyISAM . Alias de NDBCLUSTER. Tables en grappe et en mmoire, tolrantes aux pannes. See Chapitre 16, Introduction MySQL Cluster.
See Chapitre 14, Moteurs de tables MySQL et types de table. Si un type de table est demand, mais que ce type particulier n'est pas disponible, MySQL va choisir le type de table le plus proche de celui qui est spcifi. Par exemple, si TYPE=BDB est spcifi, et que la distribution de MySQL ne supporte pas les tables BDB, la table qui sera cre sera du type MyISAM. Les autres options de tables sont utilises pour optimiser le comportement de la table. Dans la plupart des cas, vous n'avez pas les spcifier. Les options fonctionnent pour tous les types de tables (sauf contre-indication) : AUTO_INCREMENT La prochaine valeur AUTO_INCREMENT de votre table (MyISAM). Ne fonctionne que pour les tables MyISAM. Pour donner la premire valeur une colonne AUTO_INCREMENT InnoDB, insrez une ligne bidon, avec la valeur dsire moins un, puis supprimez la ligne. AVG_ROW_LENGTH La taille moyenne approche des lignes de votre table. Vous ne devez fournir cette valeur que pour les tables taille de ligne variable, de trs grande taille. Lorsque vous crer une table MyISAM, MySQL utilise le produit des options MAX_ROWS et AVG_ROW_LENGTH pour dcider de la taille du rsultat. Si vous ne spcifiez aucune option, la taille maximale de la table sera de 4 Go (ou 2 Go si votre systme d'exploitation ne supporte que les tables de 2 Go). Ceci sert conserver la taille des pointeurs d'index petite, et rapide, si nous n'avez pas besoin de gros fichiers. Si vous voulez que vos tables dpassent 4 Go de taille, et que vous voulez garder les tables petites taille un peu plus lentes et grosses que ncessaire, vous pouvez augmenter la taille du pointeur d'index en modifiant la variable systme globale myisam_data_pointer_size, qui a t ajoute en MySQL 4.1.2. See Section 5.2.3, Variables serveur systme . CHECKSUM 640
Passez 1 si vous voulez que MySQL gnre une somme de vrification (ce qui facilite la recherche des lignes corrompues, mais ralentit les mises jour). La commande CHECKSUM TABLE rapporte cette somme. MyISAM uniquement. COMMENT Un commentaire pour votre table (60 caractres). MAX_ROWS Nombre de lignes maximum que vous pensez stocker dans la table. MIN_ROWS Nombre de minimum lignes que vous pensez stocker dans la table. PACK_KEYS Spcifiez 1 si vous voulez un index plus compact. Gnralement cela rend les mises jour plus lentes, mais les lectures plus rapides. Spcifier la valeur de 0 dsactive tout le compactage de cl. Spcifier la valeur DEFAULT (MySQL 4.0) indique au moteur de stockage de ne stocker que les colonnes CHAR/VARCHAR. (MyISAM et ISAM uniquement) Si vous n'utilisez pas PACK_KEYS, le comportement par dfaut est de ne stocker que les chanes, et non pas les nombres. Si vous utilisez PACK_KEYS=1, les nombres seront aussi compacts. Lors du compactage, MySQL utilise une compression de prfixe : Chaque cl requiert un octet de plus pour indiquer combien d'octets sont identiques dans la cl prcdente. Le pointeur de ligne est stock au format grand-octet-en-premier, directement aprs la cl, pour amliorer la compression. Cela signifie que si vous avez de nombreuses cls proches sur des lignes conscutives, les cls successives ``identiques'' ne prendront gnralement que deux octets (incluant le pointeur de ligne). Comparez cela la situation ordinaire, o les cls successives occupent taille_de_cle + taille_de_pointeur (o la taille du pointeur est gnralement de 4). En consquence, vous tirerez le meilleur parti de cette compression si vous avez plusieurs nombres identiques. Si toutes les cls sont totalement diffrentes, vous utiliserez un octet de plus par cl, si la cl n'accepte pas les valeurs NULL. Dans ce cas, la taille de la cl sera stocke dans le mme octet que celui qui indique que la cl est NULL.) PASSWORD Chiffre le fichier .frm avec un mot de passe. Cette option ne fait rien du tout pour la version standard de MySQL. DELAY_KEY_WRITE Spcifiez 1 si vous voulez attendre la fermeture de la table pour mettre jour les index. MyISAM uniquement. ROW_FORMAT Dfinit la mthode de stockage des lignes (rserv pour le futur). Actuellement, cette option fonctionne uniquement avec des tables MyISAM qui supportent le DYNAMIC et FIXED en format de ligne. See Section 14.1.3, Formats de table MyISAM . RAID_TYPE
641
L'option RAID_TYPE vous permet de dpasser la limite de 2 Go/4 Go de votre fichier de donnes MyISAM (mais pas le fichier d'index), pour les systmes d'exploitation qui ne supportent pas les grands fichiers. Cette option n'est pas recommande pour les systmes d'exploitation qui supportent les grands fichiers. Vous pouvez rduire les ralentissements d'E/S en plaant les dossiers RAID sur diffrents disques physiques. Actuellement, le seul type RAID_TYPE est STRIPED. 1 et RAID0 sont des alias de STRIPED. Si vous spcifiez l'option RAID_TYPE pour une table MyISAM, spcifiez les options RAID_CHUNKS et RAID_CHUNKSIZE en mme temps. La valeur maximale de RAID_CHUNKS est 255. MyISAM va crer RAID_CHUNKS sous-dossiers appels 00, 01, 02, ... 09, 0a, 0b, ... dans le dossier de donnes. Dans chaque dossier, MyISAM va crer un fichier tbl_name.MYD. Lors de l'criture dans le fichier de donnes, le gestionnaire RAID place les RAID_CHUNKSIZE*1024 premiers octets dans le premier fichier, les seconds RAID_CHUNKSIZE*1024 octets dans le fichier suivant, etc. RAID_TYPE fonctionne sur tous les systmes d'exploitation, tant que vous avez compil MySQL avec --with-raid, avec le script configure. Pour dterminer si votre serveur a le support des tables RAID, utilisez SHOW VARIABLES LIKE 'have_raid' pour voir si sa valeur vaut YES. UNION UNION sert lorsque vous voulez que plusieurs tables identiques se comporte comme une seule table. Cela fonctionne avec les tables MERGE. See Section 14.2, Tables assembles MERGE . Pour le moment, vous devez avoir les droits de SELECT, UPDATE et DELETE pour les tables intgres dans la table MERGE. Originalement, toutes les tables utilises devaient tre dans la mme base de donnes, que la table MERGE. Cette restriction a t leve depuis MySQL 4.1.1. INSERT_METHOD Si vous voulez insrer des donnes dans une table MERGE, vous devez spcifier la table d'insertion avec l'attribut INSERT_METHOD. L'option INSERT_METHOD est utilise uniquement avec les tables MERGE. Cette option a t introduite en MySQL 4.0.0. See Section 14.2, Tables assembles MERGE . DATA DIRECTORY, INDEX DIRECTORY En utilisant DATA DIRECTORY='directory' ou INDEX DIRECTORY='directory', vous pouvez spcifier o le moteur de stockage MyISAM doit placer les donnes de la table et le fichier d'index. Notez que vous devez donner un chemin absolu, et non un chemin relatif. Ces options ne fonctionnent que pour les tables MyISAM depuis MySQL 4.0, lorsque vous n'utilisez pas l'option --skip-symlink. Votre systme d'exploitation doit aussi disposer d'une fonction realpath() compatible avec les threads. See Section 7.6.1.2, Utiliser les liens symboliques avec les tables sous Unix . Depuis MySQL 3.23, vous pouvez crer une table partir d'une autre, en ajoutant une commande SELECT aprs la commande CREATE TABLE :
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
MySQL va crer une nouvelle colonne pour chaque colonne de rsultat de la commande SELECT. Par exemple :
mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (a), KEY(b)) -> TYPE=MyISAM SELECT b,c FROM test2;
Cela crer une table MyISAM avec trois colonnes a, b, et c. Notez que les colonnes de la commande SELECT sont ajoutes droite de la table, et non dans la liste des colonnes. Par exemple :
642
mysql> SELECT * FROM foo; +---+ | n | +---+ | 1 | +---+ mysql> CREATE TABLE bar (m INT) SELECT n FROM foo; Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM bar; +------+---+ | m | n | +------+---+ | NULL | 1 | +------+---+ 1 row in set (0.00 sec)
Pour chaque ligne de la table foo, une ligne est insre dans la colonne bar avec la valeur issue de foo et la valeur par dfaut pour les nouvelles colonnes. Si une erreur survient durant la copie de la table, la table est automatiquement efface. CREATE TABLE ... SELECT ne va pas crer automatiquement les index pour vous. Ceci est fait intentionnellement pour rendre la commande aussi souple que possible. Si vous voulez avoir les mmes index, vous devez les spcifier dans la commande avant le SELECT :
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Certaines conversions de type pourraient avoir lieu. Par exemple, l'attribut AUTO_INCREMENT n'est pas prserv, et les colonnes VARCHAR peuvent devenir des colonnes CHAR. Lors de la cration de la table avec CREATE ... SELECT, assurez vous de mettre un nom d'alias toutes les fonctions ou expression de la requte. Si vous ne le fates pas, la commande CREATE peut chouer ou donner des noms de colonnes inattendus.
CREATE TABLE artists_and_works SELECT artist.name, COUNT(work.artist_id) AS number_of_works FROM artist LEFT JOIN work ON artist.id = work.artist_id GROUP BY artist.id;
Depuis MySQL 4.1, vous pouvez spcifier explicitement le type de colonne gnr :
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
En MySQL 4.1, vous pouvez aussi utiliser la clause LIKE pour crer une table base sur la dfinition d'une autre table, y compris les attributs de colonnes et les index originaux :
CREATE TABLE new_tbl LIKE orig_tbl;
CREATE TABLE ... LIKE ne copie pas les options de tables DATA DIRECTORY et INDEX DIRECTORY qui taient spcifies dans la table originale. Vous pouvez faire prcder SELECT par IGNORE ou REPLACE pour indiquer comment grer les cls doublons. Avec IGNORE, les nouvelles lignes qui sont en double seront ignors. Avec REPLACE, les nouvelles lignes remplaceront les lignes prcdentes, qui avaient la mme valeur d'index. Si ni IGNORE, ni REPLACE ne sont spcifi, les doublons gnreront une erreur. Pour s'assurer que le log binaire peut tre rutilis pour recrer la table originale, MySQL ne permettra pas les insertions concurrentes durant une commande CREATE TABLE ... SELECT.
643
Les colonnes VARCHAR avec une taille infrieure quatre (4) sont changes en CHAR. Si l'une des colonnes d'une table est de taille variable, toute la ligne est, par consquent, de taille variable. Ainsi, si une ligne contient une colonne de taille variable (VARCHAR, TEXT ou BLOB) toutes les colonnes CHAR de plus de trois caractres sont transformes en VARCHAR. Cela ne change en rien la faon dont vous utilisez les colonnes. Pour MySQL, VARCHAR est simplement une autre faon de stocker les caractres. MySQL effectue cette conversion car cela conomise de la place, et rend les calculs sur les tables plus rapides. See Chapitre 14, Moteurs de tables MySQL et types de table. Depuis la version 4.1.0, si un champ CHAR ou VARCHAR est spcifi avec une taille suprieure 255, il est converti en TEXT. C'est une fonctionnalit de compatibilit. La taille d'affichage de TIMESTAMP doit tre un nombre pair et tre compris entre 2 et 14. (2, 4, 6, 8, 10, 12 ou 14). Si vous spcifiez une taille plus grande que 14, ou infrieure 2, celle-ci sera transforme en 14. Les valeurs impaires sont ramenes la valeur pair suprieure la plus proche. Vous ne pouvez pas stocker de valeur littrale NULL dans une colonne de type TIMESTAMP. Cette valeur sera remplace par la date et l'heure courante. De ce fait, les attributs NULL et NOT NULL n'ont pas de sens pour ces colonnes et sont ignors. DESCRIBE nom_de_table indiquera toujours que la colonne TIMESTAMP accepte les valeurs NULL. Les colonnes qui font partie d'une PRIMARY KEY ont l'attribut NOT NULL mme si elles ne sont pas dclares comme tel. Depuis MySQL 3.23.51, les espaces terminaux sont automatiquement supprims des valeurs ENUM et SET lors de la cration de la table. MySQL change certains type de colonnes utiliss par d'autres serveurs SQL en types MySQL. See Section 11.7, Utilisation des types de donnes issues d'autres SGBDR . Si vous utilisez une clause USING pour spcifier un type d'index qui n'est pas lgal pour un moteur de stockage, mais qu'un autre type d'index est disponible pour ce moteur sans affecter les rsultats, le moteur utilisera le type disponible. Si vous voulez voir si MySQL a utilis un autre type que celui que vous avez spcifi, utilisez la commande DESCRIBE nom_de_table, aprs votre cration ou modification de structure de table. Certain types de colonnes peuvent tre modifis si vous compressez une table en utilisant l'utilitaire myisampack. See Section 14.1.3.3, Caractristiques des tables compresses .
DROP DATABASE dtruit toutes les tables dans la base de donnes et l'efface elle mme. Soyez trs prudent avec cette commande! Pour utiliser la commande DROP DATABASE, vous avez besoin du droit de DROP sur cette base. Depuis la version 3.22 de MySQL, vous pouvez utiliser le mot clef IF EXISTS pour viter l'affichage d'erreur si la base n'existe pas. Si vous utilisez la commande DROP DATABASE sur un lien symbolique pointant sur la base de donnes, le lien et la base seront effacs. Depuis MySQL 4.1.2, DROP DATABASE retourne le nombre de tables qui ont t supprimes. Cela revient compter le nombre de fichiers .frm qui ont t supprimes. La commande DROP DATABASE efface tous les fichiers du dossier de la base de donnes, qui ont t crs par MySQL lui-mme, durant ses oprations normales : Tous les fichiers avec les extensions suivantes :
644
.ISD .MYD
Tous les sous-dossiers qui consistent de 2 chiffres hexadcimaux 00-ff. Ce sont des dossiers RAID) qui sont aussi supprims. Le fichier db.opt, s'il existe. Si d'autres fichiers ou dossiers restent dans le dossier de base aprs que MySQL ait supprims ceux lists ci-dessus, le dossier de base ne pourra pas tre supprim. Dans ce cas, vous devez supprimer manuellement les fichiers restant, et lancer nouveau la commande DROP DATABASE. Vous pouvez aussi supprimer des bases de donnes avec mysqladmin. See Section 8.4, mysqladmin, administration d'un serveur MySQL .
DROP INDEX supprime l'index nomm nom_de_l_index de la table nom_de_table. DROP INDEX ne fait rien avec la version 3.22 et les prcdentes. Depuis cette version, DROP INDEX est un alias d'ALTER TABLE supprimant l'index. See Section 13.2.2, Syntaxe de ALTER TABLE .
DROP TABLE supprime une ou plusieurs tables. Toutes les donnes et la structure de la tables sont perdues, alors soyez prudents avec cette commande ! Depuis la version 3.22 de MySQL, vous pouvez utiliser le mot rserv IF EXISTS pour viter l'affichage des erreurs pour les tables qui n'existent pas. See Section 13.5.3.19, SHOW WARNINGS | ERRORS . RESTRICT et CASCADE sont autoriss pour faciliter le port. Pour le moment, elles ne font rien. Note : DROP TABLE va automatiquement valider les transactions actives (hormis si vous utilisez la version 4.1 et le mot cl TEMPORARY). L'option TEMPORARY est ignore en 4.0. En 4.1, cette option fonctionne comme suit : Dtruit uniquement les tables temporaires. Ne termine pas les transactions en cours. Aucun droits d'accs n'est vrifi. TEMPORARY est pour le moment ignor; Dans un futur proche, il servira s'assurer qu'on efface vraiment une table temporaire.
645
Le changement de nom se fait atomiquement ce qui signifie qu'aucun autre processus ne peut accder la table tant que l'opration est en cours. Cela rend possible de remplacer une vielle table avec une table vide :
CREATE TABLE nouvelle_table (...); RENAME TABLE ancienne_table TO backup_table, nouvelle_table TO ancienne_table;
L'opration s'effectue de gauche droite ce qui signifie que si vous voulez changer deux noms de tables, vous devez :
RENAME TABLE ancienne_table TO backup_table, nouvelle_table TO ancienne_table, backup_table TO nouvelle_table;
Si les deux bases de donnes sont sur le mme disque, vous pouvez renommer travers les bases :
RENAME TABLE bdd_courante.nom_de_table TO autre_bdd.nom_de_table;
Quand vous excutez RENAME, vous ne pouvez avoir aucune transaction active ou une table protge en mode criture. Vous devez avoir les privilges ALTER et DROP sur l'ancienne table, et les privilges CREATE et INSERT sur la nouvelle. Si MySQL rencontre des erreurs dans un renommage multiple, il remettra les noms changs leurs valeurs d'origine pour revenir l'tat d'origine. RENAME TABLE a t ajout la version 3.23.23 de MySQL.
DESCRIBE fournit des informations propos des colonnes de la table. DESCRIBE est un raccourci de SHOW COLUMNS FROM. See Section 13.5.3.3, Syntaxe de SHOW COLUMNS . nom_de_colonne peut tre le nom d'une colonne ou une chane contenant les caractres spciaux SQL % et _. Il n'est pas ncessaire de placer la chane entre guillemets, hormis s'il y a des espaces ou d'autres caractres spciaux.
mysql> DESCRIBE city; +------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+----------------+ | Id | int(11) | | PRI | NULL | auto_increment | | Name | char(35) | | | | | | Country | char(3) | | UNI | | | | District | char(20) | YES | MUL | | | | Population | int(11) | | | 0 | | +------------+----------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
La colonne Null indique si la valeur NULL peut tre stocke dans la colonne. YES indique que c'est le cas. La colonne Key indique si un champ est index. La valeur PRI indique que le champ fait partie de la cl primaire de la table. UNI indique que le champ fait partie d'un index UNIQUE. La valeur MUL indique que plusieurs occurrences d'une valeur sont autorises dans le champ. Un champ peut tre dsign comme MUL mme si l'index UNIQUE est utilis, si les valeurs NULL sont autorises, car une colonne UNIQUE peut contenir plusieurs valeurs NULL si la colonne est dclare comme NOT NULL. Une autre cause pour MUL sur une colonne UNIQUE est lorsque deux colonnes
646
Syntaxe de USE
forment un couple UNIQUE : mme si la combinaison des deux colonnes est toujours unique, chaque colonne peut contenir des valeurs multiples. Notez que dans un index compos, seul le champ de gauche aura une entre dans la colonne Key. La colonne Default indique la valeur par dfaut assigne ce champ. La colonne Extra indique des informations supplmentaires, disponibles sur le champ. Dans notre exemple, la colonne Extra indique que la colonne Id porte l'attribut AUTO_INCREMENT. Si le type de colonne est diffrent de celui que vous pensiez avoir dfinit lors du CREATE TABLE, notez que MySQL change le type des colonnes de temps en temps. See Section 13.2.5.1, Modification automatique du type de colonnes . Cette instruction est fournie pour une meilleure compatibilit avec Oracle. L'instruction SHOW renvoie les mmes informations. See Section 13.5.3, Syntaxe de SHOW .
La commande USE db_name spcifie MySQL d'utiliser la base db_name comme base par dfaut pour les requtes ne les mentionnant pas. La base choisie reste la mme jusqu' la fermeture de la session ou un nouvel appel USE :
mysql> mysql> mysql> mysql> USE db1; SELECT COUNT(*) FROM ma_table; USE db2; SELECT COUNT(*) FROM ma_table; # slectionne partir de db1.ma_table # slectionne partir de db2.ma_table
Rendre une base de donnes la base courante (en utilisant USE) ne vous interdit pas l'accs d'autres tables dans d'autres bases. L'exemple suivant accde la table author de la base db1 et la table editor de la base db2 :
mysql> USE db1; mysql> SELECT author_name,editor_name FROM author,db2.editor -> WHERE author.editor_id = db2.editor.editor_id;
A partir de l, vous devez utiliser COMMIT pour enregistrer les modifications sur le disque ou ROLLBACK pour ignorer les modifications apportes depuis le dbut de la transaction. Si vous souhaitez sortir du mode AUTOCOMMIT pour une srie d'oprations, vous pouvez utiliser les commandes BEGIN ou BEGIN WORK :
START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summmary=@A WHERE type=1; COMMIT;
647
BEGIN et BEGIN WORK peuvent tre utilis la place de START TRANSACTION pour initialiser une transaction. START TRANSACTION a t ajout en MySQL 4.0.11; C'est une syntaxe SQL-99, et il est recommand de l'utiliser pour lancer une transaction. BEGIN et BEGIN WORK sont disponibles pour MySQL 3.23.17 et 3.23.19, respectivement. Notez que si vous n'utilisez pas de table transactionnelles, les modifications seront valides automatiquement, indpendamment du mode de validation. Si vous faites un ROLLBACK aprs avoir modifi une table non transactionnelle, vous obtiendrez (ER_WARNING_NOT_COMPLETE_ROLLBACK) comme message d'alerte. Toutes les tables supportant les transactions seront restaures, mais aucune des autres tables ne changera. Si vous utilisez START TRANSACTION ou SET AUTOCOMMIT=0, il est recommand d'utiliser les "binary log" de MySQL la place des anciens logs de modifications pour les sauvegardes. Les transactions sont stockes dans les logs binaires en un seul bloc, aprs COMMIT, pour tre sr que les transactions qui ont t annules ne soient pas enregistres. See Section 5.9.4, Le log binaire . Vous pouvez changer le niveau d'isolation des transactions avec SET TRANSACTION ISOLATION LEVEL .... See Section 13.4.6, Syntaxe de SET TRANSACTION .
UNLOCK TABLES termine aussi une transaction si toutes les tables courantes sont verrouilles. Avant MySQL version 4.0.13, CREATE TABLE terminait une transaction si le log binaire tait activ. Les transactions ne peuvent pas tre imbriques. C'est la consquence de cette validation COMMIT implicite pour toutes les transactions en cours, lorsque vous mettez une commande START TRANSACTION ou quivalent.
Cette commande pose un jalon de transaction dont le nom est identifier. Si la transaction courante a dj un jalon de ce nom, l'ancien jalon est effac, et le nouveau est cr la place. Cette commande annule la transaction jusqu'au jalon. Les modifications que cette transaction a fait aux lignes depuis le jalon sont annules, mais InnoDB ne libre pas les verrous poss en mmoire
648
aprs le jalon. Notez que pour une nouvelle ligne insre, l'information de verrou est conserve par l'identifiant de transaction de la ligne : le verrou n'est pas stock en mmoire. Dansa ce cas, le verrou sera lev par l'annulation. Les jalons qui ont t pos aprs celui-ci sont aussi annuls. Si la commande retourne l'erreur suivante, c'est qu'aucun jalon de ce nom n'a pu tre trouv.
ERROR 1181: Got error 153 during ROLLBACK
Tous les jalons de la transaction courante sont annuls si vous excutez les commandes COMMIT ou ROLLBACK, sans prciser de nom de jalon.
LOCK TABLES verrouille une table pour le thread courant. UNLOCK TABLES dverrouillera automatiquement tous les verrous poss par le thread courant. Toutes les tables verrouilles par le thread courant sont automatiquement dverrouilles quand ce thread utilise nouveau LOCK TABLES, ou quand la connexion au serveur est perdue. Note : LOCK TABLES n'est pas compatible avec les transactions, et valide automatiquement toute transaction active avant de verrouiller une table. L'utilisation de LOCK TABLES dans MySQL 4.0.2 ncessite le privilge LOCK TABLES global et un privilge de SELECT sur les tables impliques. Dans MySQL 3.23, il faut les privilges SELECT, INSERT, DELETE et UPDATE sur les tables. Les principales raisons d'utiliser LOCK TABLES sont l'mulation de transactions ou l'acclration des processus de modification de tables. Cela sera dtaill plus loin. Si un thread obtient un verrouillage READ sur une table, ce thread (et tous les autres threads) peuvent uniquement accder a cette table en lecture. Si un thread obtient un verrouillage WRITE sur une table, alors seul le thread qui a pos le verrou peut lire ou crire sur cette table. Tous les autres threads sont bloqus. La diffrence entre READ LOCAL et READ est que READ LOCAL autorise des requtes INSERT nonconflictuelles tre excutes alors que le verrou est pos. Ceci ne peut cependant pas tre utilis si vous souhaitez modifier les fichiers de la base de donnes en dehors de MySQL pendant que le verrou est pos. Quand vous utilisez LOCK TABLES, vous devez verrouiller toutes les tables que vous allez utiliser, et vous devez utiliser les mmes alias sur ce que vous utiliserez dans vos requtes ! Si vous utilisez une table a plusieurs reprises dans une requte (avec des alias), vous devez verrouiller chacun des alias ! Si vos requtes utilisent un alias pour une table, alors vous devez verrouiller la table avec l'alias. Le verrouillage ne fonctionnera pas si vous verrouillez la table sans spcifier l'alias :
mysql> LOCK TABLE t READ; mysql> SELECT * FROM t AS myalias; ERROR 1100: Table 'myalias' was not locked with LOCK TABLES
De mme, lorsque vous verrouillez une table avec un alias, vous devez utiliser le nom de l'alias dans vos requtes :
mysql> LOCK TABLE t AS myalias READ; mysql> SELECT * FROM t; ERROR 1100: Table 't' was not locked with LOCK TABLES mysql> SELECT * FROM t AS myalias;
Les verrous WRITE ont normalement des priorits suprieures aux verrous READ, afin de s'assurer que les modifications sont excutes au plus vite. Cela signifie que si un thread demande un verrou
649
READ et qu'un autre thread demande un verrou WRITE, la demande de verrou READ attendra que le thread WRITE ait abouti pour librer le verrou. Vous pouvez utiliser le verrou LOW_PRIORITY WRITE pour permettre d'autres threads d'obtenir des verrous READ pendant que le thread attend le verrou WRITE. Vous ne devriez utiliser les verrous LOW_PRIORITY WRITE que si vous tes sr qu'il y aura effectivement un moment o aucun thread ne posera de verrou READ. LOCK TABLES fonctionne de la manire suivante : 1. Trie toutes les tables verrouiller dans un ordre dfini par MySQL (l'utilisateur ne dfinit pas d'ordre). 2. Si une table est verrouille avec un verrou de lecture et un verrou d'criture, il pose le verrou de lecture avant celui d'criture. 3. Verrouille une table la fois jusqu' ce que le thread ait tous ses verrous. Cette politique garantit le bon verrouillage des tables. Il faut cependant connatre certaines choses sur ce schma : Si vous utilisez un verrou LOW_PRIORITY WRITE pour une table, cela signifie seulement que MySQL attendra, pour poser ce verrou, qu'aucun autre thread ne rclame de verrou READ. Quand le thread aura le verrou WRITE et qu'il attendra que les verrous soient poss sur les autres tables de la liste, tous les autres threads attendront que le verrou WRITE soit libr. Si cela devient un problme grave pour votre application, il est conseill de convertir des tables en tables supportant les transactions. Vous pouvez terminer un thread attendant un verrouillage de table en toute scurit avec KILL. See Section 13.5.4.3, Syntaxe de KILL . Il est dconseill de verrouiller des tables utilises avec INSERT DELAYED, car, dans ce cas, la requte INSERT est excute dans un autre thread. Normalement, vous n'avez pas besoin de verrouiller les tables puisque chaque requte UPDATE est atomique : aucun autre thread ne peut interfrer avec une autre requte active. Il existe cependant quelques cas o vous aurez besoin de verrouiller les tables : Si vous allez excuter plusieurs requtes sur plusieurs tables, il est prfrable, d'un point de vue rapidit, de verrouiller les tables dont vous aurez besoin. L'inconvnient, bien sur, est que les autres threads ne pourront pas intervenir sur ces tables durant vos oprations, ni en extraire des informations si la table est verrouille en WRITE. La raison pour laquelle les requtes sont plus rapides avec LOCK TABLES est que MySQL ne rafracht pas l'index des cls des tables verrouilles tant que UNLOCK TABLES n'est pas invoqu (normalement, le cache des cls est rafrachi aprs chaque requte SQL). Cela acclre les insertions, les modifications et les suppressions de donnes dans les tables MyISAM. Si vous utilisez un type de table dans MySQL qui ne supporte pas les transactions, vous devez utiliser LOCK TABLES pour vous assurez qu'aucun autre thread ne s'intercale entre un SELECT et un UPDATE. L'exemple suivant ncessite LOCK TABLES pour s'excuter en toute scurit :
mysql> mysql> mysql> -> mysql> LOCK TABLES trans READ, customer WRITE; SELECT SUM(value) FROM trans WHERE customer_id=some_id; UPDATE customer SET total_value=sum_from_previous_statement WHERE customer_id=some_id; UNLOCK TABLES;
Sans LOCK TABLES, Il est possible qu'un autre thread ait insr une nouvelle ligne dans la table trans entre l'excution du SELECT et l'excution de la requte UPDATE. L'utilisation de modifications incrmentales (UPDATE customer SET value=value +nouvelle_valeur) ou de la fonction LAST_INSERT_ID() permet de se passer de LOCK TABLES dans de nombreuses situations. See Section 1.5.5.3, Transactions et oprations atomiques . 650
Il est aussi possible de rsoudre de nombreux cas en utilisant un verrou utilisateur, avec les fonctions GET_LOCK() et RELEASE_LOCK(). Ces verrous sont stocks dans une table de hashage dans le serveur et utilisent les fonctions pthread_mutex_lock() et pthread_mutex_unlock() pour plus de vitesse. See Section 12.8.4, Fonctions diverses . Voir Section 7.3.1, Mthodes de verrouillage pour plus de dtails. Il est possible de verrouiller tous les tables de toutes les bases avec la commande FLUSH TABLES WITH READ LOCK. See Section 13.5.4.2, Syntaxe de FLUSH . C'est une mthode trs pratique pour effectuer des sauvegardes si vous utilisez un systme de fichiers qui, comme Veritas, permet de crer des instantans. Note : LOCK TABLES ne fonctionne pas avec les transactions et validera automatiquement toutes les transactions actives avant de poser verrouiller la table. See Section A.7.1, Problmes avec ALTER TABLE. .
Configuration du niveau d'isolation des transactions en gnral, pour la totalit de la session, ou pour la prochaine transaction. Le comportement par dfaut est de configurer le niveau d'isolation pour la transaction suivante (qui n'a pas encore t commence) En utilisant le paramtre GLOBAL, on configure le niveau par dfaut global pour toutes les nouvelles connections. Cette commande requiert les privilges SUPER. En utilisant le paramtre SESSION, on configure le niveau par dfaut pour toutes les prochaines transactions effectues durant la session actuelle. Pour une description de chaque niveau d'isolation de transaction InnoDB, voyez Section 15.11.2, InnoDB et SET ... TRANSACTION ISOLATION LEVEL ... . InnoDB supporte chacun des niveaux depuis MySQL 4.0.5. Le niveau par dfaut est REPEATABLE READ. On peut configurer le niveau d'isolation global des transactions pour mysqld avec --transactionisolation=.... See Section 4.3.1, Options de ligne de commande de mysqld .
La commande CREATE USER cre un nouveau compte MySQL. Pour l'utiliser, vous devez avoir les droits de CREATE USER ou les droits d'INSERT dans la table de droits de la base mysql. Pour chaque compte, CREATE USER cre un nouvel enregistrement dans la table mysql.user, sans aucun droit. Une erreur survient si le compte existe dj. Le compte peut recevoir un mot de passe avec la clause optionnelle IDENTIFIED BY. La valeur user et le mot de passe sont donnes de la mme manire que dans la commande GRANT. La commande CREATE USER a t ajoute en MySQL 5.0.2.
Cette commande a t ajoute en MySQL 4.1.1. Elle efface un utilisateur qui n'a aucun droits. Pour effacer un utilisateur dans MySQL, vous devriez utiliser l'une des procdures suivantes, dans cet ordre : 1. Vrifiez les droits de l'utilisateur avec la commande SHOW PRIVILEGES. See Section 13.5.3.13, SHOW PRIVILEGES . 2. Effacez tous les droits de l'utilisateur avec la commande REVOKE. See Section 13.5.1.3, Syntaxe de GRANT et REVOKE . 3. Effacez l'utilisateur avec DROP USER. Si vous utilisez une vieille version de MySQL, vous devriez commencer par effacer les droits, puis l'utilisateur avec :
DELETE FROM mysql.user WHERE user='username' and host='hostname'; FLUSH PRIVILEGES;
Les commandes GRANT et REVOKE permettent l'administrateur systme de crer et supprimer des comptes utilisateur et de leur donner ou retirer des droits. GRANT et REVOKE sont implmentes en MySQL 3.22.11 ou plus rcent. Pour les anciennes versions de MySQL, ces commandes ne font rien. Les informations sur les comptes MySQL sont stocks dans la base mysql. Cette base et son accs sont prsents en dtails dans la section Chapitre 5, Administration du serveur. Les droits sont donns 4 niveaux : Niveau global Les droits globaux s'appliquent toutes les bases de donnes d'un serveur. Ces droits sont stocks dans la table mysql.user. REVOKE ALL ON *.* retirera seulement les privilges globaux. Niveau base de donnes Les droits de niveau de base de donnes s'appliquent toutes les tables d'une base de donnes. Ces droits sont stocks dans les tables mysql.db et mysql.host. REVOKE ALL ON db.* retirera seulement les privilges de base de donnes.
652
Niveau table Les droits de table s'appliquent toutes les colonnes d'une table. Ces droits sont stocks dans la table mysql.tables_priv. REVOKE ALL ON db.table retirera seulement les privilges de table. Niveau colonne Les droits de niveau de colonnes s'appliquent des colonnes dans une table. Ces droits sont stocks dans la table mysql.columns_priv. Quand vous utilisez REVOKE vous devez spcifier les mmes colonnes qui s'taient vues accorder des privilges. Pour faciliter la suppression de tous les droits d'un utilisateur, MySQL 4.1.2 a ajout la syntaxe suivante, qui efface tous les droits de base, table et colonne pour un utilisateur donn :
REVOKE ALL PRIVILEGES,GRANT FROM user_name [, user_name ...]
Avant MySQL 4.1.2, tous les droits ne peuvent pas tre effacs d'un coup. Il faut deux commandes pour cela :
REVOKE ALL PRIVILEGES FROM user [, user] ... REVOKE GRANT OPTION FROM user [, user] ...
Pour les commandes GRANT et REVOKE, la clause priv_type peut tre spcifie par les constantes suivantes : Droit ALL [PRIVILEGES] ALTER CREATE CREATE TEMPORARY TABLES DELETE DROP EXECUTE FILE INDEX INSERT LOCK TABLES PROCESS REFERENCES RELOAD REPLICATION CLIENT REPLICATION SLAVE SELECT SHOW DATABASES SHUTDOWN SUPER Signification Tous les droits sauf WITH GRANT OPTION. Autorise l'utilisation de ALTER TABLE. Autorise l'utilisation de CREATE TABLE. Autorise l'utilisation de CREATE TEMPORARY TABLE. Autorise l'utilisation de DELETE. Autorise l'utilisation de DROP TABLE. Autorise l'utilisateur excuter des procdures stockes (pour MySQL 5.0). Autorise l'utilisation de SELECT ... INTO OUTFILE et LOAD DATA INFILE. Autorise l'utilisation de CREATE INDEX et DROP INDEX. Autorise l'utilisation de INSERT. Autorise l'utilisation de LOCK TABLES sur les tables pour lesquelles l'utilisateur a les droits de SELECT. Autorise l'utilisation de SHOW FULL PROCESSLIST. Rserv pour le futur. Autorise l'utilisation de FLUSH. Donne le droit l'utilisateur de savoir o sont les matres et esclaves. Ncessaire pour les esclaves de rplication (pour lire les historiques binaires du matre). Autorise l'utilisation de SELECT. SHOW DATABASES affiche toutes les bases de donnes. Autorise l'utilisation de mysqladmin shutdown. Autorise une connexion unique mme si max_connections est atteint, et l'excution des commandes CHANGE MASTER, KILL
653
thread, mysqladmin debug, PURGE MASTER LOGS et SET GLOBAL. UPDATE USAGE GRANT OPTION Autorise l'utilisation de UPDATE. Synonyme de ``pas de droits''. Synonyme pour WITH GRANT OPTION
USAGE peut tre utilis lorsque vous voulez crer 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 aprs mise jour en 4.0.2, vous devez excuter le script mysql_fix_privilege_tables. See Section 2.6.7, Mise jour des tables de droits . Dans les anciennes versions de MySQL, le droit de PROCESS donnait les mmes droits que le nouveau droit SUPER. 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 spcifiez ON * et que vous avez une base de donnes qui est dj slectionne, vous allez donner des droits pour la base de donnes courante. Attention : si vous spcifiez ON * et que vous n'avez pas de base courante, vous allez affecter les droits au niveau du serveur ! Les droits EXECUTION, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN et SUPER sont des droits d'administration, qui ne peuvent tre donns que globalement (avec la syntaxe ON *.*). Les autres droits peuvent tre donns globalement ou des niveaux plus spcifiques. Les seuls droits priv_type que vous pouvez donner au niveau d'une table sont SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION, INDEX et ALTER. Les seuls droits priv_type que vous pouvez donner au niveau d'une colonne (avec la clause column_list) sont SELECT, INSERT et UPDATE. GRANT ALL assigne des droits que vous possdez au niveau o vous le possdez. Par exemple, si vous utilisez GRANT ALL ON db_name.*, qui est un droit de niveau de base de donnes, aucun des droits globaux, comme FILE ne sera donn. MySQL vous permet de donner des droits au niveau d'une base de donnes, mme si la base de donnes n'existe pas, pour vous aider prparer l'utilisation de la base de donnes. Actuellement, MySQL ne vous permet pas de crer des droits pour une table si la table n'existe pas. MySQL ne supprime pas les droits lorsqu'un utilisateur efface une table ou une base. Notez bien : les caractres joker _ et % sont autoriss lors de la spcification de noms dans la commande GRANT. Cela signifie que si vous voulez utiliser par exemple le caractre littral _ comme nom de base, vous devez le spcifier sous la forme \_ dans la commande GRANT, pour viter l'utilisateur d'accder d'autres bases, dont le nom pourrait correspondre au masque d'expression rgulire ainsi cr. Utilisez plutt GRANT ... ON `foo\_bar`.* TO .... Afin de permettre l'identification des utilisateurs depuis des htes arbitraires, MySQL supporte la spcification du nom d'utilisateur nom_utilisateur sous la forme user@host. Si vous voulez spcifier un nom d'utilisateur user qui contient des caractres spciaux tels que -, ou une chane d'hte host qui contient des caractres joker (comme %), vous pouvez placer le nom de l'utilisateur ou de l'hte entre guillemets (par exemple, 'test-utilisateur'@'test-nomdhote'). Vous pouvez spcifier des caractres jokers dans le nom d'hte. Par exemple, user@'%.loc.gov' fait correspondre l'utilisateur user de n'importe quel hte du domaine loc.gov, et
654
user@'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 user@"%". MySQL ne supporte pas de caractres joker dans les noms d'utilisateur. Les utilisateurs anonymes sont dfinis par l'insertion de ligne avec User='' dans la table mysql.user, ou en crant un utilisateur avec un nom vide, grce la commande GRANT.
mysql> GRANT ALL ON test.* TO ''@'localhost' ...
Attention : si vous autorisez des utilisateurs anonymes se connecter votre serveur, vous devriez aussi donner ces droits tous les utilisateurs locaux user@localhost car sinon, la ligne dans la table mysql.user sera utilise lorsque l'utilisateur se connectera au serveur MySQL depuis la machine locale ! (Ce compte est cr durant l'installation de MySQL.) Vous pouvez vrifier si cela s'applique vous en excutant la requte suivante :
mysql> SELECT Host,User FROM mysql.user WHERE User='';
Si vous voulez effacer les utilisateurs anonymes d'un serveur, utilisez ces commandes :
mysql> DELETE FROM mysql.user WHERE Host='localhost' AND User=''; mysql> FLUSH PRIVILEGES;
Actuellement, la commande GRANT supporte uniquement les noms d'hte, colonne, table et bases de donnes d'au plus 60 caractres. Un nom d'utilisateur peut tre d'au plus 16 caractres. Les droits pour les tables et colonnes sont combins par OU logique, avec les quatre niveaux de droits. Par exemple, si la table mysql.user spcifie 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 calculs comme ceci :
droit global OR (droit de base de donnes ET droit d'hte) OR droit de table OR droit de colonne
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 complique. Le dtails de la procdure de vrification des droits et disponible dans Section 5.5, Rgles de scurit et droits d'accs au serveur MySQL . Si vous donnez des droits une paire utilisateur/hte qui n'existe pas dans la table mysql.user, une ligne sera cre et restera disponible jusqu' son effacement avec la commande DELETE. En d'autre termes, GRANT cre 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 rcent, 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 spcifi avec la clause IDENTIFIED BY, si elle est fournie. Si l'utilisateur a dj un mot de passe, il sera remplac par ce nouveau. Attention : si vous crez un nouvel utilisateur, mais ne spcifiez pas de clause IDENTIFIED BY, l'utilisateur n'aura pas de mot de passe. Ce n'est pas scuritaire. Les mots de passe peuvent aussi tre modifis avec la commande SET PASSWORD. See Section 13.5.1.5, Syntaxe de SET PASSWORD . Si vous ne voulez pas transmettre le mot de passe en texte clair, vous pouvez immdiatement utiliser l'option PASSWORD suivi du mot de passe dj chiffr avec la fonction PASSWORD() ou l'API C make_scrambled_password(char *to, const char *password).
655
Si vous donnez les droits de base, une ligne sera ajoute dans la table mysql.db. Lorsque les droits sur cette base seront supprims avec la commande REVOKE, cette ligne disparatra. Si un utilisateur n'a pas de droit sur une table, elle ne sera pas affiche lorsqu'il demandera la liste des tables avec la commande SHOW TABLES. Si un utilisateur n'a pas de droit dans une base, le nom de la base ne sera pas affich par SHOW DATABASES moins que l'utilisateur n'ai un droit de SHOW DATABASES. La clause WITH GRANT OPTION donne l'utilisateur le droit de donner les droits qu'il possde d'autres utilisateurs. La plus grande prudence est recommande pour cette commande, car il permettra terme deux utilisateurs de combiner les droits dont ils disposent. Vous ne pouvez pas donner un droit que vous ne possdez pas. le droit de GRANT OPTION ne vous donne le droit que de donner les droits que vous possdez. Sachez que si vous donnez quelqu'un le droit de GRANT OPTION, tous les droits que possde cet utilisateur seront distribuables. Supposez que vous donnez un utilisateur le droit d'INSERT dans une base de donnes. Si vous donnez le droit de SELECT sur une base, et spcifiez l'option WITH GRANT OPTION, l'utilisateur peut distribuer non seulement son droit de SELECT, mais aussi son droit de INSERT. Si vous donnez ensuite le droit de UPDATE, il pourra alors distribuer INSERT, SELECT et UPDATE. Il est recommand de ne pas donner de droits de ALTER un utilisateur normal. Si vous le fates, l'utilisateur pourra essayer de contourner le systme de droits en renommant des tables. 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 requtes et de modifications qu'un utilisateur peut rclamer dans une heure. Si # vaut 0 (valeur par dfaut), alors cela signifie qu'il n'y a pas de limitations pour cet utilisateur. See Section 5.6.4, Limiter les ressources utilisateurs . Note: pour spcifier l'une de ces options pour un utilisateur existant sans ajouter d'autres privilges additionnels, utilisez GRANT USAGE ... WITH MAX_.... MySQL peut vrifier les attributs X509 en plus des lments d'identifications habituels, comme le nom d'utilisateur et le mot de passe. Pour spcifier des options SSL pour un compte MySQL, utilisez la clause REQUIRE de la commande GRANT. Pour des informations gnrales sur SSL et MySQL, voyez Section 5.6.7, Utilisation des connexions scurises . Il y a diffrentes possibilits pour limiter le type de connexions d'un compte : Si un compte ne doit pas utiliser SSL ou X509, les connexions sont autorises si le mot de passe et le nom d'utilisateur sont valides. Cependant, les connexions non-chiffres peuvent aussi tre utilises par le client, si le client dispose des bons certificats et cls. L'option REQUIRE SSL limite le serveur aux connexions chiffres avec SSL. Notez que cette option peut tre omise s'il y a des lignes d'identifications qui autorisent les connexions non chiffres.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret' REQUIRE SSL;
REQUIRE X509 signifie que le client doit avoir un certificat valide, mais que le certificat exact, l'metteur et le sujet n'ont pas d'importance. La seule obligation est qu'il faut pouvoir vrifier la signature auprs d'une des autorits de certification.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret' REQUIRE X509;
REQUIRE ISSUER 'issuer' impose aux connexions l'utilisation d'un certificat X509 mis par l'autorit de certification 'issuer'. Si le client prsente un certificat d'une autre autorit, le serveur rejette la connexion. L'utilisation des certificats X509 implique toujours un chiffrement, ce qui fait que l'option SSL est inutile.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret'
656
Notez que la valeur de ISSUER doit tre saisie comme une seule chane. REQUIRE SUBJECT 'subject' impose la connexion la prsentation d'un certificat X509 avec le sujet 'subject'. Si le client prsente un certificat qui est valide, mais avec un autre sujet, le serveur rejette la connexion.
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@example.com';
Notez que la valeur de SUBJECT doit tre saisie comme une seule chane. REQUIRE CIPHER 'cipher' est ncessaire pour s'assurer que des tailles de cl et chiffrements suffisantes sont utilises. SSL peut tre faible si de vieux algorithmes avec des cls courtes sont utilises. En utilisant cette option, vous pouvez spcifier un chiffrement spcifique.
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' -> IDENTIFIED BY 'goodsecret' -> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
Les clauses SUBJECT, ISSUER et CIPHER peuvent tre combines 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@example.com' -> AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/ O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com' -> AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
Notez que les valeurs de SUBJECT et ISSUER doivent tre saisies comme une seule chane. Depuis MySQL 4.0.4, le mot cl AND est optionnel entre les clauses de REQUIRE. L'ordre des options est libre, mais les options doivent tre spcifies une seule fois. Notez que si vous utilisez des droits de niveau table ou colonne mme pour un utilisateur, le serveur vrifiera alors ces droits pour tous les utilisateurs, et cela ralentira MySQL un peu. Lorsque mysqld dmarre, tous les droits sont stocks en mmoire. Les droits de bases, tables et colonnes prennent aussitt effet, et les droits des utilisateurs prendront effet ds leur prochaine configuration. Les modifications sur les tables de droits que vous effectuez avec les commandes GRANT et REVOKE sont prises en compte immdiatement par le serveur. Si vous modifiez manuellement les tables (avec INSERT, UPDATE, etc...), vous devez excuter la commande FLUSH PRIVILEGES, ou la commande en ligne mysqladmin flush-privileges pour indiquer au serveur qu'il doit recharger les droits. See Section 5.5.7, Quand les modifications de privilges prennent-ils effets ? . Les diffrences notables entre l'ANSI SQL et MySQL pour la commande GRANT sont : Les droits MySQL sont donns pour une combinaison nom d'utilisateur + nom d'hte, et non pas pour un nom d'hte seulement. L'ANSI SQL n'a pas de droits globaux ou de niveau base de donnes, 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. MySQL ne supporte pas les droits standard SQL TRIGGER et UNDER.
657
Les droits ANSI SQL sont structurs de manire hirarchique. Si vous supprimez un utilisateur, tous les droits donns cet utilisateur seront supprims. Avec MySQL, les droits ne sont pas automatiquement supprims, 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 excuter des insertions. Les colonnes pour lesquelles vous n'avez pas de droit prendront alors leur valeur par dfaut. L'ANSI SQL vous impose d'avoir les droits d'INSERT sur toutes les colonnes. Lorsque vous dtruisez une table avec ANSI SQL, tous les droits lis la table sont supprims. Si vous supprimez un droit en ANSI SQL, tous les droits qui taient bass sur ce droit sont supprims. Avec MySQL, les droits peuvent tre abandonns explicitement avec la commande REVOKE, ou en manipulant les tables de droits de MySQL.
La commande RENAME USER renomme un compte MySQL existant. Pour l'utiliser, vous devez avoir les droits globaux de CREATE USER ou les droits de UPDATE dans la base mysql. Une erreur survient si l'ancien compte n'existe pas, ou que le nouveau compte existe dj. Les valeurs old_user et new_user sont donnes de la mme faon que dans la commande GRANT. La commande RENAME USER a t ajoute en MySQL 5.0.2.
La commande SET PASSWORD assigne un mot de passe un compte utilisateur existant. La premire syntaxe modifie le mot de passe de l'utilisateur courant. Tout client qui s'est connect avec un compte non-anonyme peut changer le mot de passe pour ce compte. La seconde syntaxe modifie le mot de passe pour un compte tiers, sur le serveur. Seuls les clients qui ont accs aux bases mysql peuvent faire cela. La valeur de user doit tre donne au format user_name@host_name, o user_name et host_name sont tels que lists dans les colonnes User et Host de la table mysql.user. Par exemple, si vous avez une ligne avec les champs User et Host qui valent 'bob' et '%.loc.gov', vous pouvez crire la commande suivante :
mysql> SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');
Cette commande analyse et stocke la cl de distribution de la table. Durant l'analyse, la table est verrouille 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 cls de distribution pour dcider dans quel ordre les tables doivent tre rassembles lors des jointures qui ne s'effectuent pas sur une constante.
658
La commande retourne une table avec les colonnes suivantes : Colonne Table Op Msg_type Msg_text Valeur Nom de la table ``analyze'' (toujours) Un des status, error, info ou warning. Le message.
Vous pouvez vrifier la cl de distribution stocke avec la commande SHOW INDEX. See Section 13.5.3.6, Syntaxe de SHOW DATABASES . Si la table n'a pas chang depuis la dernire commande ANALYZE TABLE, elle ne sera pas analyse nouveau.
Note : cette commande est obsolte. Nous travaillons une solution de remplacement amliore, qui proposera des sauvegardes chaud. Durant ce temps, le script mysqlhotcopy peut tre utilis. Cette commande copie le nombre minimal de fichiers de table dont en a besoin pour la restaurer vers le dossier de sauvegardes aprs avoir rafrachit les changements dans le disque. Cela ne fonctionne actuellement que pour les tables au format MyISAM. Pour les tables MyISAM, elle ne copie que les fichiers .frm (dfinition) et .MYD (donnes), le fichier d'index .MYD pouvant, lui, tre reconstruit partir des deux autres. Avant d'utiliser cette commande, merci de lire Section 5.7.1, Sauvegardes de base de donnes . 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 instantane de plusieurs table, vous devez d'abord excuter un LOCK TABLES obtenant un verrou de lecture pour chaque table concerne. La commande retourne une table avec les colonnes suivantes : Colonne Table Op Msg_type Msg_text Valeur Nom de la table Toujours ``backup'' status, error, info ou encore warning. Le message.
Notez que BACKUP TABLE n'est disponible en MySQL que depuis la version 3.23.25.
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 table. Par dfaut, l'option MEDIUM est utilise. Cette commande vrifie l'intgrit des tables. Pour les tables MyISAM, des statistiques importantes sont mises jour. La commande retourne les informations suivantes sur la table dans les colonnes suivantes :
659
Valeur Nom de la table. Toujours ``check''. Un des statut status, error, info ou warning. Le message.
Notez que vous pouvez obtenir de nombreuses lignes d'informations pour chaque table. La dernire ligne sera du type Msg_type status et doit tre normalement OK. Si vous n'obtenez pas de statut OK ou Not checked, il vous faudra excuter une rparation de la table. See Section 5.7.3, Utilisation de myisamchk pour la maintenance des tables et leur recouvrement . Not checked signifie que la table a indiqu qu'il n'y a pas de vrification faire. Les diffrents types de vrifications sont les suivants : Type QUICK FAST CHANGED MEDIUM Signification N'analyse pas les lignes pour vrifier les liens errons. Ne vrifie que les tables qui n'ont pas t correctement fermes. Ne vrifie que les tables qui ont changes depuis la dernire vrification, ou bien qui n'ont pas t correctement fermes. Analyse les lignes pour s'assurer que les liens effacs sont corrects. Cette option calcule aussi la somme de contrle des lignes, et la vrifie avec la somme de contrle des cls. Fait une vrification complte des liens pour chaque ligne. Cela vrifie que la table est totalement cohrente, mais cela peut prendre beaucoup de temps.
EXTENDED
Pour les tables format de dynamique de type MyISAM, une vrification de table sera toujours dmarre 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 vrification comme ceci :
CHECK TABLE test_table FAST QUICK;
L'exemple ci-dessus va simplement faire une vrification de la table, pour s'assurer qu'elle a t correctement ferme. Note : dans certains cas, CHECK TABLE va modifier la table! Cela arrive si la table a t marque comme "corrupted" et "not closed properly" mais CHECK TABLE n'a trouv aucun problme dans la table. Dans ce cas, CHECK TABLE va marquer la table comme correcte. Si une table est corrompue, il est probable que les problmes sont dans les fichiers d'index et non pas dans les donnes. Tous les types de vrifications prsents ci-dessus vrifient les index soigneusement, et ils devraient trouver la plupart des erreurs. Si vous voulez simplement vrifier une table que vous supposez correcte, vous pouvez n'utiliser aucune option, ou l'option QUICK. Cette dernire peut aussi tre utilise 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 donnes, pour un usage normal. Si cela arrive, alors la table est marque comme 'corrupted', auquel cas, la table ne pourra pas tre utilise tant qu'elle n'a pas t rpare). FAST et CHANGED sont surtout destines tre utilises depuis un script : par exemple, il peut tre excut depuis une tche cron, si vous voulez vrifier la table de temps en temps. Dans la plupart des cas, l'option FAST doit tre prfre CHANGED : le seul cas ou vous pourriez prfrez CHANGED est lorsque vous souponnez avoir trouv un bogue dans les tables MyISAM.
660
EXTENDED ne doit tre utilis qu'aprs une vrification 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 trs rare, si une vrification a russie). Certains problmes rapports par la commande CHECK TABLE, ne peuvent tre corrigs 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 crer une ligne o la colonne AUTO_INCREMENT vaut 0 en spcifiant explicitement la valeur 0 dans la colonne avec la commande UPDATE. Ce n'est pas une erreur en soit, mais cela peut poser des problmes si vous dcidez 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 rgles des colonnes de type AUTO_INCREMENT, qui vont causer un problme de cl doublon. Pour se dbarasser de cette alerte, vous devez utiliser une commande UPDATE sur la table, pour mettre une valeur diffrente de 0 dans cette colonne.
Calcule la somme de contrle de la table. Si QUICK est spcifi, la somme de contrle instantane est retourne, ou NULL si la table ne supporte pas les sommes de contrle instantanes. See Section 13.2.5, Syntaxe de CREATE TABLE . En mode EXTENDED, toute la table est lue, ligne par ligne, et la somme de contrle est calcule. Cela peut tre trs lent pour les tables de grande taille. Par dfaut, sans QUICK ni EXTENDED, MySQL retourne la somme de contrle si la table le supporte, et sinon, scanne la table. Cette commande a t ajoute en MySQL 4.1.1.
OPTIMIZE TABLE doit tre utilise si une grande partie de la base a t efface, ou si vous avez fait de nombreuses modifications dans une table format de ligne dynamique (des tables qui ont des colonnes de type VARCHAR, BLOB et TEXT). Les lignes effaces sont conserves dans une liste, et les prochaines oprations d'INSERT rutilisent les vieilles positions de lignes. Vous pouvez vous servir de la commande OPTIMIZE TABLE pour rcuprer l'espace utilis et dfragmenter le fichier de donnes. Dans la plupart des installations, vous n'avez pas utiliser OPTIMIZE TABLE. Mme si vous faites beaucoup de mises jour sur des colonnes taille dynamique, il n'est pas vident que vous ayez passer cette commande plus d'une fois par semaine ou par mois, et uniquement sur quelques tables. Pour 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 ANALYZE TABLE. See Section 13.5.2.1, Syntaxe de ANALYZE TABLE . Vous pouvez vous arranger pour que OPTIMIZE TABLE fonctionne sur d'autres types de tables, en dmarrant 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 :
661
1. Si la table contient des lignes effaces ou des lignes fragmentes, la table est compacte. 2. Si les pages d'index ne sont pas tries, OPTIMIZE TABLE les trie. 3. Si les statistiques ne sont pas jour (et que la table n'a pas pu effectuer de rparation en triant l'index), elles sont mises jour. Notez que la table est verrouille durant la commande OPTIMIZE TABLE. Avant MySQL 4.1.1, OPTIMIZE n'tait pas reporte dans le log binaire. Depuis MySQL 4.1.1 elles le sont, moins que l'attribut optionnel NO_WRITE_TO_BINLOG ou son alias LOCAL ne soit utilis.
REPAIR TABLE rpare une table possiblement corrompue. Par dfaut, elle a le mme effet que myisamchk --recover tbl_name sur une table. REPAIR TABLE fonctionne uniquement avec les tables MyISAM. Normalement, vous n'avez pas excuter cette commande, mais si une catastrophe vous frappe, vous tes presque assurs de retrouver vos donnes dans les tables MyISAM, avec la commande REPAIR TABLE. Si vos tables sont souvent corrompues, vous devrie toutefois rechercher la cause de ce problme! See Section A.4.2, Que faire si MySQL plante constamment ? . See Section 14.1.4, Problmes avec les tables MyISAM . REPAIR TABLE rpare autant que possible les tables corrompues. La commande retourne la table suivante : Colonne Table Op Msg_type Msg_text Valeur Nom de la table Toujours repair Un des statut status, error, info ou warning. Le message
La commande REPAIR TABLE pourrait afficher plusieurs messages pour chaque table. La dernire ligne doit tre du format Msg_type status et doit tre normalement OK. Si vous n'obtenez pas OK, vous devez essayer de rparer 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 rparer que le fichier d'index. Ce type de rparation est le mme que myisamchk --recover --quick. Si vous utilisez l'option EXTENDED, alors MySQL va essayer de crer l'index ligne par ligne, au lieu de crer un index la fois, par tri. C'est une mthode qui peut s'avrer plus efficace que de trier sur des cls de taille fixe, si vous avez des cls CHAR longues qui se compressent bien. Ce type de rparation 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 entte est corrompu. Avec ce mode, MySQL va recrer le fichier .MYI, en utilisant les informations du fichier .frm. Ce type de rparation ne peut pas tre fait avec myisamchk. Attention : si le serveur s'arrte durant l'opration REPAIR TABLE, il est important d'excuter nouveau la commande REPAIR TABLE aprs le redmarrage (il est bon de faire une sauvegarde de toutes manires). Dans le pire scnario, vous pourriez vous retrouver avec un nouvel index sans relation avec les donnes, et la prochaine opration risque d'craser le fichier de donnes. C'est peu probable, mais possible.
662
Avant MySQL 4.1.1, les commandes REPAIR TABLE n'taient pas crites dans le log binaire. Depuis MySQL 4.1.1, elles sont crites dans le log binaire moins que la clause NO_WRITE_TO_BINLOG ne soit utilise (aussi connue sous le nom de LOCAL).
Restaure la ou les tables partir d'une sauvegarde effectue avec BACKUP TABLE. Les tables existantes ne seront pas crases 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. Tout comme BACKUP TABLE, RESTORE TABLE fonctionne seulement avec les tables MyISAM. La sauvegarde de chaque table est constitue du fichier de format .frm et du fichier de donnes .MYD. L'opration de restauration restaure ces fichiers, puis les utilise pour reconstruire le fichier d'index .MYI. La restauration prend plus de temps que la sauvegarde, car il faut reconstituer l'index. Plus la table a d'index, plus cela prendra de temps. Cette commande retourne un tableau avec les colonnes suivantes : Colonne Table Op Msg_type Msg_text Valeur Nom de la table Toujours ``restore'' status, error, info ou encore warning. Le message.
SET permet de configurer plusieurs options qui affectent le comportement de votre serveur ou de votre client. En MySQL 4.0.3, nous avons ajout les options GLOBAL et SESSION et permis la modification des variables systmes les plus importantes dynamiquement, durant l'excution du serveur. Le systme de variables que vous pouvez utiliser est dcrit dans Section 5.2.3.1, Variables systme dynamiques . Dans les anciennes versions de MySQL, nous avions autoris l'utilisation de la syntaxe SET OPTION, mais elle est maintenant abandonne. Omettez simplement le mot OPTION. Les exemples suivants montrent les diffrentes syntaxes qu'on peut utiliser pour configurer des variables. Une variable utilisateur s'crit sous la forme @var_name et peut tre configure comme ceci :
SET @var_name = expr;
Plus d'informations sur les variables utilisateurs sont donnes dans Section 9.3, Variables utilisateur . Les variables systme peuvent tre identifies dans une commande SET sous la forme var_name. Le nom peut tre optionnellement prcd par GLOBAL ou @@global. pour indiquer que cette variable est globale, ou par SESSION, @@session., ou @@ pour indiquer que cette variable est une variable de session. LOCAL et @@local. son synonymes de SESSION et @@session.. Si aucune option n'est prsente, SET spcifie une variable de session.
663
La syntaxe @@var_name pour les variables systme est supporte pour rendre la syntaxe MySQL compatible avec les autres bases. Si vous configurez plusieurs variables sur une seule ligne de commande, le dernier mode GLOBAL | SESSION utilis est pris en compte.
SET SET SET SET SET sort_buffer_size=10000; @@local.sort_buffer_size=10000; GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000; @@sort_buffer_size=1000000; @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
Si vous utilisez SESSION (par dfaut) l'option que vous configurez garde son effet jusqu' ce que la session courante se termine, ou que vous modifiez nouveau cette option. Si vous utilisez GLOBAL, qui require le privilge SUPER, l'option est garde en mmoire et utilise pour les nouvelles connexion jusqu'au redmarrage du serveur. Si vous voulez qu'un changement reste permanent, vous devez l'effectuer dans l'un des fichiers d'options de MySQL. See Section 4.3.2, Fichier d'options my.cnf . Pour viter un mauvais usage, MySQL donnera une erreur si vous utilisez SET GLOBAL avec une variable qui ne peut tre inutilise que par SET SESSION ou si vous n'utilisez pas SET GLOBAL avec une variable globale. Si vous voulez configurer une variable SESSION une valeur GLOBAL ou une valeur GLOBAL la valeur par dfaut de MySQL, vous pouvez la configurer DEFAULT.
SET max_join_size=DEFAULT; SET @@session.max_join_size=@@global.max_join_size;
Vous pouvez obtenir une liste de la plupart des variables avec SHOW VARIABLES. See Section 13.5.3.18, Syntaxe de SHOW VARIABLES . Vous pouvez obtenir la valeur d'une variable spcifique avec la syntaxe @@[global.|local.]nom_variable :
SHOW VARIABLES LIKE 'max_join_size'; SHOW GLOBAL VARIABLES LIKE 'max_join_size';
Vous pouvez aussi obtenir une valeur spcifique d'une variable en utilisant la syntaxe @@[global.| local.]var_name avec SELECT :
SELECT @@max_join_size, @@global.max_join_size;
Lorsque vous lisez la valeur d'une variable avec la syntaxe SELECT @@var_name (c'est dire, sans spcifier global., session. ou local.), MySQL retourne la valeur de SESSION si elle existe, et la valeur GLOBAL sinon. Vous trouverez ici une description des variables qui utilisent une syntaxe non-standard de SET. Les dfinitions des autres variables peuvent tre trouves dans la section des Section 5.2.3, Variables serveur systme , avec les options de dmarrage ou dans la description de SHOW VARIABLES. Mme si ces variables ne sont pas affiches par SHOW VARIABLES, vous pouvez obtenir leur valeur avec la commande SELECT ( l'exception de CHARACTER SET). Par exemple :
mysql> SELECT @@AUTOCOMMIT; +--------------+ | @@autocommit | +--------------+ | 1 | +--------------+
AUTOCOMMIT= {0 | 1} Si dfinie 1 tous les changements dans une table se feront en une seule fois. Pour dmarrer une transaction multi-commandes, vous devez utiliser la commande BEGIN. See Section 13.4.1, Syntaxes de START TRANSACTION, COMMIT et ROLLBACK . Si dfinie 0 vous devez utiliser
664
COMMIT / ROLLBACK pour accepter/annuler cette transaction. Notez que quand vous passez du mode non AUTOCOMMIT vers le mode AUTOCOMMIT, MySQL fera un COMMIT automatique sur toutes les transactions en cours. BIG_TABLES = {0 | 1} Si dfinie 1, toutes les tables temporaires sont stockes sur le disque plutt qu'en mmoire. Cela sera un peu plus lent, mais vous n'obtiendrez jamais l'erreur The table nom_de_table is full pour les grands SELECT qui requirent une table temporaire. La valeur par dfaut pour une nouvelle connexion est 0 (qui est d'utiliser la mmoire pour les tables temporaires). Cette option se nommait avant SQL_BIG_TABLES. CHARACTER SET {charset_name | DEFAULT} Cela change le jeu de caractre dans toutes les chanes du et vers le client avec le jeu donn. Jusqu' maintenant, la seule option pour nom_jeu_de_caractres est cp1251_koi8, mais vous pouvez facilement ajouter d'autres possibilits en ditant le fichier sql/convert.cc dans la distribution des sources MySQL. Le jeu de caractres par dfaut peut tre restaur en utilisant la valeur DEFAULT de nom_jeu_de_caractres DEFAULT. Notez que la syntaxe pour configurer l'option CHARACTER SET diffre de la syntaxe pour configurer les autres options. FOREIGN_KEY_CHECKS = {0 | 1} Si cette option vaut 1 (par dfaut), les contraintes de cl trangres des tables InnoDB sont vrifies. Si cette option vaut 0, elles sont ignores. Dsactiver les cls trangres peut tre pratique pour recharger des tables InnoDB dans un ordre diffrent que celui qu'impose les relations de contraintes. Cette variable a t ajoute en MySQL 3.23.52. See Section 15.7.4, Contraintes de cls trangres FOREIGN KEY . IDENTITY = valeur Cette variable est un synonyme de la variable LAST_INSERT_ID. Elle existe pour des raisons de compatibilit avec les autres bases. Depuis MySQL 3.23.25, vous pouvez lire sa valeur avec SELECT @@IDENTITY. Depuis MySQL 4.0.3, vous pouvez aussi modifier cette valeur avec SET IDENTITY. INSERT_ID = valeur Configure la valeur utiliser par l'appel suivant la commande INSERT ou ALTER TABLE lors de l'insertion d'une valeur AUTO_INCREMENT. Cela est souvent utilis par le log des modifications. LAST_INSERT_ID = valeur Configure la valeur qui doit tre retourne par LAST_INSERT_ID(). C'est enregistr dans le log de mises jour quand vous utilisez LAST_INSERT_ID() dans une commande qui met jour une table. NAMES {'charset_name' | DEFAULT} SET NAMES spcifie les valeurs des trois variables systmes de session character_set_client, character_set_connection et character_set_results avec le jeu de caractres donn. La valeur par dfaut de ces variables peut tre rappele avec DEFAULT. Notez que la syntaxe de SET NAMES diffre en cela des autres options. Cette commande est disponible depuis MySQL 4.1.0. SQL_AUTO_IS_NULL = {0 | 1} Si dfinie 1 (par dfaut) alors on peut trouver la dernire ligne insre dans une table avec une colonne AUTO_INCREMENT avec la construction suivante :
665
Ceci est utilis par des programmes ODBC tel que Access. SQL_AUTO_IS_NULL a t ajout en MySQL 3.23.52. SQL_BIG_SELECTS = {0 | 1} Si configur 0, MySQL interrompra les requtes SELECT qui prendront probablement trop de temps. C'est utile lorsqu'une clause WHERE dconseille a t utilise. Une grosse requte est dfinie comme tant un SELECT qui devra probablement tudier plus de max_join_size lignes. La valeur par dfaut d'une nouvelle connexion est 1 (qui permet toutes les requtes SELECT). SQL_BUFFER_RESULT = {0 | 1} SQL_BUFFER_RESULT forcera les rsultats des requtes SELECT tre placs dans une table temporaire. Cela aidera MySQL librer les verrous sur table plus tt et amliorera les cas o le jeu de rsultats de la requte prend trop de temps tre envoye au client. SQL_LOG_BIN = {0 | 1} Si cette option vaut 0, aucun log n'est fait dans le log binaire du client, si le client a les droits de SUPER. SQL_LOG_OFF = {0 | 1} Si cette option vaut 1, aucun log n'est fait dans le log standard du client, si le client a les droits de SUPER. SQL_LOG_UPDATE = {0 | 1} Si dfinie 0, aucune trace des requtes ne sera garde dans le log des mises jour pour le client, si le client le privilge SUPER. Cette variable est abandonne depuis la version 5.0.0 et est remplace par SQL_LOG_BIN (see Section C.1.7, Changements de la version 5.0.0 (22 dcembre 2003 : Alpha) ). SQL_QUOTE_SHOW_CREATE = {0 | 1} Si vous le configurez 1, SHOW CREATE TABLE protgera les noms de tables et de colonnes. Ceci est activ par dfaut, pour que la rplication des tables avec des noms risques fonctionne. Section 13.5.3.5, Syntaxe de SHOW CREATE TABLE . SQL_SAFE_UPDATES = {0 | 1} Si dfinit 1, MySQL annulera si un UPDATE ou un DELETE est excut alors qu'il n'utilise pas de clef ou de LIMIT dans la clause WHERE. Cela permet de bloquer les requtes errones cres la main. SQL_SELECT_LIMIT = valeur | DEFAULT Le nombre maximal des enregistrements que doivent retourner les requtes SELECT. Si un SELECT possde une clause LIMIT, celle-ci est utilise. La valeur par dfaut pour une nouvelle connexion est ``illimite.'' Si vous avez chang la limite, la valeur par dfaut peut tre retrouve en utilisant la valeur DEFAULT avec SQL_SELECT_LIMIT. SQL_WARNINGS = {0 | 1} Cette variable contrle le fait que les insertion mono-ligne INSERT produisent une chane d'information si une alerte survient. La valeur par dfaut est 0. Donnez la valeur de 1 pour avoir un message d'information. Cette variable a t ajoute en MySQL 3.22.11. TIMESTAMP = valeur_timestamp | DEFAULT
666
Syntaxe de SHOW
Configure le temps pour ce client. C'est utilis pour obtenir le timestamp d'origine si vous utilisez le log de mises jour pour restaurer des lignes. valeur_timestamp doit tre un timestamp Unix, et non un timestamp MySQL. UNIQUE_CHECKS = {0 | 1} Si cette option vaut 1 (par dfaut), les tests d'unicit sur les index secondaires des tables InnoDB sont effectus. Si l'option vaut 0, aucun test d'unicit n'est fait. Cette variable a t ajout en MySQL 3.23.52. See Section 15.7.4, Contraintes de cls trangres FOREIGN KEY .
Si la syntaxe d'une commande SHOW inclut la clause LIKE 'pattern', 'pattern' est une expression rgulire qui peut contenir les jokers % et _. Ce expression est utile pour restreindre la commande une partie des valeurs normalement retournes. Notez qu'il y a d'autres formes pour ces commandes, dcrites d'autres endroits du manuel : La commande SET PASSWORD pour assigner un mot de passe un compte est prsente dans See Section 13.5.1.5, Syntaxe de SET PASSWORD . La commande SHOW a des formes pour afficher des informations sur la rplication, pour le matre et l'esclave :
SHOW SHOW SHOW SHOW SHOW BINLOG EVENTS MASTER LOGS MASTER STATUS SLAVE HOSTS SLAVE STATUS
Ces formes de SHOW sont dcrites dans Section 13.6, Commandes de rplication .
667
Syntaxe de SHOW
| Charset | Description | Default collation | Maxlen | +---------+-----------------------------+-------------------+--------+ | latin1 | ISO 8859-1 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | +---------+-----------------------------+-------------------+--------+ 4 rows in set (0.00 sec)
Remarques sur la liste prcdente : La colonne Maxlen affiche le nombre maximum d'octets utiliss pour stocker un caractre.
Le rsultat de SHOW COLLATION inclut tous les jeux de caractres disponibles. Vous pouvez utiliser optionnellement la clause LIKE pour limiter le nombre de rponses.
mysql> SHOW COLLATION LIKE 'latin1%'; +-------------------+---------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +-------------------+---------+----+---------+----------+---------+ | latin1_german1_ci | latin1 | 5 | | | 0 | | latin1_swedish_ci | latin1 | 8 | Yes | Yes | 0 | | latin1_danish_ci | latin1 | 15 | | | 0 | | latin1_german2_ci | latin1 | 31 | | Yes | 2 | | latin1_bin | latin1 | 47 | | Yes | 0 | | latin1_general_ci | latin1 | 48 | | | 0 | | latin1_general_cs | latin1 | 49 | | | 0 | | latin1_spanish_ci | latin1 | 94 | | | 0 | +-------------------+---------+----+---------+----------+---------+ 7 rows in set (0.00 sec)
La colonne Default indique si une collation est la collation par dfaut pour son jeu de caractres. Compiled indique si le jeu de caractres est compil dans le serveur ou non. Sortlen est en relation avec la quantit de mmoire ncessaire pour trier des chanes exprimes dans le jeu de caractres.
SHOW COLUMNS liste les colonnes de la table. Si les types de colonnes sont diffrents de ceux que vous avez utilis avec la commande CREATE TABLE, c'est que MySQL a modifi silencieusement le type lors de la cration. Les conditions de cette modification sont dcrites dans Section 13.2.5.1, Modification automatique du type de colonnes . Le mot cl FULL peut tre utilis depuis MySQL 3.23.32. Il fait afficher les droits dont vous disposez pour chaque colonne. Depuis MySQL 4.1, FULL affiche aussi les commentaires par colonne. Vous pouvez utiliser db_name.tbl_name comme syntaxe alternative tbl_name FROM db_name. Ces deux commandes sont quivalentes :
mysql> SHOW COLUMNS FROM mytable FROM mydb; mysql> SHOW COLUMNS FROM mydb.mytable;
SHOW FIELDS est un synonyme de SHOW COLUMNS. Vous pouvez aussi lister les colonnes d'une table avec la commande mysqlshow db_name tbl_name. La commande DESCRIBE fournit une information similaire SHOW COLUMNS. See Section 13.3.1, Syntaxe de DESCRIBE (obtenir des informations sur les colonnes) .
668
Syntaxe de SHOW
La requte suivante montre une commande CREATE DATABASE qui va crer une base de donne. Commande ajoute en MySQL 4.1.
mysql> SHOW CREATE DATABASE test\G *************************** 1. row *************************** Database: test Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET latin1 */
Affiche la commande CREATE TABLE ncessaire pour crer une table donne.
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 protger le nom de la table et des colonnes selon l'option SQL_QUOTE_SHOW_CREATE. Section 13.5.2.8, Syntaxe de SET .
SHOW DATABASES liste les bases de donnes disponible sur le serveur MySQL. Vous pouvez aussi obtenir cette liste avec l'utilitaire mysqlshow. Depuis MySQL 4.0.2, vous ne verrez que les bases pour lesquelles vous avez des droits, moins que vous n'ayez le droit de SHOW DATABASES. Si le serveur a t lanc avec l'option --skip-show-database, vous ne pouvez pas utiliser cette commande moins que vous n'ayez le droit de SHOW DATABASES. SHOW SCHEMAS est disponible depuis MySQL 5.0.2
SHOW ENGINES affiche les informations sur les moteurs de stockage du serveur. C'est particulirement utile pour connatre les moteurs supports par votre serveur, ou le moteur par dfaut. Cette commande a t ajoute en MySQL 4.1.2. SHOW TABLE TYPES est un synonyme, mais est abandonne.
mysql> SHOW ENGINES\G *************************** 1. row *************************** Type: MyISAM Support: DEFAULT Comment: Default type from 3.23 with great performance *************************** 2. row *************************** Type: HEAP Support: YES Comment: Hash based, stored in memory, useful for temporary tables *************************** 3. row *************************** Type: MEMORY Support: YES Comment: Alias for HEAP *************************** 4. row *************************** Type: MERGE Support: YES Comment: Collection of identical MyISAM tables *************************** 5. row *************************** Type: MRG_MYISAM
669
Syntaxe de SHOW
Support: YES Comment: Alias for MERGE *************************** 6. row *************************** Type: ISAM Support: NO Comment: Obsolete table type; Is replaced by MyISAM *************************** 7. row *************************** Type: MRG_ISAM Support: NO Comment: Obsolete table type; Is replaced by MRG_MYISAM *************************** 8. row *************************** Type: InnoDB Support: YES Comment: Supports transactions, row-level locking and foreign keys *************************** 9. row *************************** Type: INNOBASE Support: YES Comment: Alias for INNODB *************************** 10. row *************************** Type: BDB Support: YES Comment: Supports transactions and page-level locking *************************** 11. row *************************** Type: BERKELEYDB Support: YES Comment: Alias for BDB
La valeur Support indique que le moteur est support, et si le moteur est le moteur par dfaut. Par exemple, si le serveur est lanc avec l'option --default-table-type=InnoDB alors la valeur de la colonne Support de la ligne InnoDB contiendra DEFAULT.
Cette commande est similaire SHOW WARNINGS, hormis le fait qu'au lieu d'afficher les erreurs, alertes et notes, elle n'affiche que les erreurs. SHOW ERRORS est disponible depuis MySQL 4.1.0. La clause LIMIT a la mme syntaxe que celle de la commande SELECT. See Section 13.1.7, Syntaxe de SELECT . La commande SHOW COUNT(*) ERRORS affiche le nombre d'erreurs. Vous pouvez aussi connatre ce nombre en lisant la variable error_count :
SHOW COUNT(*) ERRORS; SELECT @@error_count;
SHOW GRANTS FOR user affiche la commande ncessaire pour donner les mme 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 | +---------------------------------------------------------------------+
Depuis MySQL 4.1.2, pour lister les droits de la session courante, vous pouvez connatre le nom d'utilisateur de la session avec ces commandes :
SHOW GRANTS; SHOW GRANTS FOR CURRENT_USER;
670
Syntaxe de SHOW
Avant MySQL 4.1.2, vous pouviez connatre le nom d'identification de l'utilisation avec la fonction CURRENT_USER() (nouveau en MySQL 4.0.6). Puis, utilisez cette valeur avec la commande SHOW GRANTS. See Section 12.8.3, Fonctions d'informations . SHOW GRANTS est disponible depuis MySQL 3.23.4.
SHOW INDEX retourne les informations sur les index de la table, dans un format proche de celui de SQLStatistics en ODBC. SHOW INDEX retourne les champs suivants : Table Le nom de la table. Non_unique 0 si l'index ne peut pas contenir de doublons, et 1 s'il le peut. Key_name Le nom de l'index. Seq_in_index Le numro de la colonne dans l'index, en commenant 1. Column_name Le nom de la colonne. Collation Comment la colonne est trie dans l'index. Avec MySQL, les valeurs peuvent tre A (Ascendant) ou NULL (non tri). Cardinality Le nombre de valeurs uniques dans l'index. C'est une valeur qui est mise jour avec la commande ANALYZE TABLE ou myisamchk -a. Cardinality est compt en se basant sur des statistiques entires : il n'est pas toujours exacte pour les petites tables. Sub_part Le nombre de caractres index si la colonne n'est que partiellement indexe. NULL si la colonne entire est indexe. Packed Indique comment la cl est compacte. NULL si elle ne l'est pas. Null Contient YES si la colonne contient NULL, '' sinon. Index_type La mthode d'indexation utilise (BTREE, FULLTEXT, HASH, RTREE).
671
Syntaxe de SHOW
Comment Diffrentes remarques. Avant MySQL 4.0.2 lorsque la colonne Index_type a t ajoute, Comment indiquait si un index tait FULLTEXT. Les colonnes Packed et Comment ont t ajoute en MySQL 3.23.0. Les colonnes Null et Index_type ont t ajoutes en MySQL 4.0.2. Vous pouvez utiliser la syntaxe db_name.tbl_name comme alternative tbl_name FROM db_name. Ces deux commandes sont quivalentes :
mysql> SHOW INDEX FROM mytable FROM mydb; mysql> SHOW INDEX FROM mydb.mytable;
SHOW KEYS est un synonyme SHOW INDEX. Vous pouvez aussi lister les index d'une table avec la commande en ligne mysqlshow -k db_name tbl_name.
Cette commente donne des informations exhaustives sur le moteur de stockage InnoDB.
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)
Cette commande est implmente en MySQL 4.1.0. SHOW PRIVILEGES affiche la liste des droits que le serveur MySQL supporte.
mysql> show privileges; +------------+--------------------------+-------------------------------------------------------+ | Privilege | Context | Comment | +------------+--------------------------+-------------------------------------------------------+ | Select | Tables | Lire des lignes d'une table | | Insert | Tables | Insrer des lignes dans une table | | Update | Tables | Modifier les lignes existantes | | Delete | Tables | Effacer des lignes existantes | | Index | Tables | Crer ou effacer des indexes | | Alter | Tables | Modifier la structure d'une table | | Create | Databases,Tables,Indexes | Crer une nouvelle base ou table | | Drop | Databases,Tables | Effacer une base ou table | | Grant | Databases,Tables | Donner d'autres les droits courants | | References | Databases,Tables | Avoir des rfrences sur les tables | | Reload | Server Admin | Rafrachir les droits, tables et logs | | Shutdown | Server Admin | Eteindre le serveurver | | Process | Server Admin | Voir la version texte des requtes en cours | | File | File access on server | Lire et crire des fichiers sur le serveur | +------------+--------------------------+-------------------------------------------------------+ 14 rows in set (0.00 sec)
672
Syntaxe de SHOW
SHOW [FULL] PROCESSLIST affiche la liste de processus qui sont en cours d'excution. 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. See Section 13.5.4.3, Syntaxe de KILL . Si vous n'utilisez pas l'option FULL, seuls les 100 premiers caractres de chaque requte seront affichs. Cette commande est trs pratique si vous obtenez trop d'erreurs too many connections et que vous voulez savoir ce qui se passe. MySQL rserve une connexion supplmentaire pour un client ayant les droits de SUPER, de faon ce qu'il y ait toujours la possibilit de se connecter et de vrifier le systme (en supposant que vous ne donnez pas ce droit tous vos utilisateurs). Certains tats sont souvent disponible dans le rsultat de mysqladmin processlist Checking table Le thread fait une vrification (automatique) de la table. Closing tables Le thread est en train d'crire les donnes modifies sur le disque, et il va fermer les tables. Cela doit tre une opration trs rapide. Si ce n'est pas le cas, vous devriez vrifier si vous n'avez pas un disque plein, ou que le disque est sous haute charge. Connect Out Connexion d'un esclave sur le matre. Copying to tmp table on disk Le rsultat temporaire tait plus grand que tmp_table_size et le thread passe d'une table en mmoire une table sur disque. Creating tmp table Le thread est en train de crer une table temporaire pour contenir le rsultat d'une requte. deleting from main table Lors de l'excution de la premire partie d'une requte d'effacement multi-table, et que MySQL n'a commenc effacer que dans la premire table. deleting from reference tables Lors de l'excution de la deuxime partie d'une requte d'effacement multi-table, et que MySQL a commenc effacer dans les autres tables. Flushing tables Le thread excute 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 vrifie l'option de kill. Cette option est vrifie dans chaque boucle majeure de MySQL, mais dans certains cas, il peut lui prendre un court instant avant de s'arrter. Si le thread est verrouill par un autre thread, l'arrt va prendre effet aussitt que l'autre thread lve son verrou. Sending data
673
Syntaxe de SHOW
Le thread traite des lignes pour une commande SELECT et il envoie les donnes 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 opration trs rapide, moins que quelque chose ne retarde l'ouverture. Par exemple, une commande ALTER TABLE ou LOCK TABLE peut empcher l'ouverture de table, jusqu' l'achvement de la commande. Removing duplicates La requte utilisait SELECT DISTINCT de telle manire que MySQL ne pouvait pas optimiser les lignes distinctes au dbut du traitement. A cause de cela, MySQL doit effectuer une opration de plus pour supprimer toutes les lignes en doubles, avant d'envoyer les lignes au client. Reopen table Le thread a reu un verrou pour une table, mais a not aprs l'avoir reu que la structure de la table a chang. Il a libr le verrou, ferm la table, et maintenant il essaie de la rouvrir. Repair by sorting Le thread rpare la table en utilisant la mthode de tri pour crer l'index. Repair with keycache Le thread rpare la table en utilisant la mthode de cration des cls partir du cache de cl. C'est bien plus lent que la rparation par tri. Searching rows for update Le thread effectue une premire phase pour trouver toutes les lignes qui satisfont les critres 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 mmes tables, vous pouvez dsactiver les verrous systmes avec l'option -skip-external-locking. Upgrading lock Le gestionnaire de INSERT DELAYED essaie d'obtenir un verrou pour insrer des lignes. Updating Le thread recherche des lignes pour les modifier. User Lock Le thread attend un GET_LOCK().
674
Syntaxe de SHOW
Waiting for tables Le thread a reu l'annonce que la structure de table a t modifie, et il doit rouvrir la table pour obtenir une nouvelle structure. Pour tre capable de rouvrir 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, appliques la table en question : FLUSH TABLES table_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE ou OPTIMIZE TABLE. waiting for handler insert Le gestionnaire de INSERT DELAYED a trait toutes insertions, et en attend de nouvelles. La plupart des tats sont des oprations trs rapides. Si le thread s'attarde dans un de ces tats pour plusieurs secondes, il doit y avoir un problme qui mrite d'tre tudi. Il existe encore d'autres tats qui ne sont pas mentionn ci-dessus, mais la majorit sont utiliss pour trouver des bogues dans mysqld.
SHOW STATUS affiche des informations sur le statut du serveur. Cette information est aussi accessible avec la commande la commande mysqladmin extended-status. Un rsultat partiel est prsent ci-dessous. La liste complte des variables dpend de votre serveur. Leur signification individuelle est prsente dans la section See Section 5.2.4, Variables de statut du serveur .
mysql> SHOW STATUS; +--------------------------+------------+ | 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 | ... | Open_tables | 1 | | Open_files | 2 | | Open_streams | 0 | | Opened_tables | 44600 | | Questions | 2026873 | ... | Table_locks_immediate | 1920382 | | Table_locks_waited | 0 | | Threads_cached | 0 | | Threads_created | 30022 | | Threads_connected | 1 | | Threads_running | 1 | | Uptime | 80380 | +--------------------------+------------+
Avec la clause LIKE, la commande peut limiter l'affichage des variables celles qui vrifient un masque :
mysql> SHOW STATUS LIKE 'Key%'; +--------------------+----------+
675
Syntaxe de SHOW
| Variable_name | Value | +--------------------+----------+ | Key_blocks_used | 14955 | | Key_read_requests | 96854827 | | Key_reads | 162040 | | Key_write_requests | 7589728 | | Key_writes | 3813196 | +--------------------+----------+
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 donnes suivantes sont retournes : Name Nom de la table. Type Type de table. See Chapitre 14, Moteurs de tables MySQL et types de table. 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 donnes. Max_data_length Taille maximale du fichier de donnes. Pour les formats de lignes fixe, c'est le nombre maximal de lignes dans la table. Pour les formats de lignes dynamique, c'est le nombre total d'octets qui peuvent tre stocks dans la table, avec le pointeur de donnes utilis. Index_length Taille du fichier d'index. Data_free Nombre d'octets allous mais non utiliss. Auto_increment Prochaine valeur d'auto_increment. Create_time Date de cration de la table. Update_time
676
Syntaxe de SHOW
Date de dernire modification de la table. Check_time Date de dernier entretien de la table. Collation Le jeu de caractres et la collation de la table (nouveau en 4.1.1) Checksum La somme de contrle en direct (si elle existe). (nouveau en 4.1.1) Create_options Options supplmentaires utilises avec CREATE TABLE. Comment Le commentaire utilis lors de la cration de la table (ou des informations sur pourquoi MySQL n'a pu accder aux informations de la table). Les tables InnoDB indiqueront l'espace disque libre dans le commentaire de table.
SHOW TABLES liste les tables permanentes (non TEMPORARY) dans une base de donnes. Vous pouvez obtenir cette liste avec la commande en ligne mysqlshow db_name. Note : Si vous n'avez pas les droits sur une table, la table n'apparatra pas dans le rsultat de SHOW TABLES et mysqlshow db_name. SHOW OPEN TABLES liste les tables qui sont actuellement ouvertes dans le cache de table. See Section 7.4.8, Quand MySQL ouvre et ferme les tables . Le champ Comment du rsultat indique le nombre d'ouverture de la table en cache (cached) et le nombre d'utilisation (in_use). OPEN est disponible depuis MySQL 3.23.33.
SHOW VARIABLES affiche les valeurs des variables systmes de MySQL. Vous pouvez aussi obtenir ces informations avec la commande mysqladmin variables. Les options GLOBAL et SESSION ont t ajoutes en MySQL 4.0.3. Avec GLOBAL, vous obtiendrez les valeurs qui seront utilises pour les nouvelles connexions au serveur MySQL. Avec SESSION, vous recevez les valeurs effectives pour la connexion en cours. Si vous ne prcisez ni l'une ni l'autre, la valeur par dfaut est SESSION. LOCAL est un synonyme de SESSION. Si les valeurs par dfaut ne vous conviennent pas, vous pouvez modifier la plupart de ces variables, en ligne de commande, lorsque mysqld est lanc. Voir Section 5.2.1, Options de ligne de commande de mysqld et Section 13.5.2.8, Syntaxe de SET . Voici un extrait du rsultat de la commande. La liste complte des variables et de leur valeur peut tre diffrente pour votre serveur. La signification de chaque variable est prsente dans See Section 5.2.3, Variables serveur systme . Des informations sur comment optimiser ces valeurs sont disponibles dans la section Section 7.5.2, Rglage des paramtres du serveur .
mysql> SHOW VARIABLES;
677
Syntaxe de SHOW
+---------------------------------+------------------------------+ | Variable_name | Value | +---------------------------------+------------------------------| | back_log | 50 | | basedir | /usr/local/mysql | | bdb_cache_size | 8388572 | | bdb_log_buffer_size | 32768 | | bdb_home | /usr/local/mysql | ... | max_connections | 100 | | max_connect_errors | 10 | | max_delayed_threads | 20 | | max_error_count | 64 | | max_heap_table_size | 16777216 | | max_join_size | 4294967295 | | max_relay_log_size | 0 | | max_sort_length | 1024 | ... | timezone | EEST | | tmp_table_size | 33554432 | | tmpdir | /tmp/:/mnt/hd2/tmp/ | | version | 4.0.4-beta | | wait_timeout | 28800 | +---------------------------------+------------------------------+
Avec la clause LIKE, la commande n'affichera que les variables qui vrifie le masque fourni :
mysql> SHOW VARIABLES LIKE 'have%'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | have_bdb | YES | | have_innodb | YES | | have_isam | YES | | have_raid | NO | | have_symlink | DISABLED | | have_openssl | YES | | have_query_cache | YES | +--------------------+----------+
Cette commande affiche les erreurs, alertes et notes qui ont t gnres par la dernire commande. Les erreurs et alertes sont remises zro pour chaque nouvelle commande qui utilisent une table. Cette commande a t implmente depuis MySQL 4.1.0. Une commande connexe, SHOW ERRORS, affiche uniquement les erreurs. See Section 13.5.3.8, Syntaxe de SHOW ERRORS . La liste de messages est remise zro au dbut de chaque commande qui utilise la table. La commande SHOW COUNT(*) WARNINGS affiche le nombre total d'erreurs, d'alertes et de notes. Vous pouvez aussi lire ce nombre avec la variable warning_count :
SHOW COUNT(*) WARNINGS; SELECT @@warning_count;
La valeur de warning_count peut tre plus grande que le nombre de messages affichs par SHOW WARNINGS si la variable systme max_error_count est configure assez bas pour que tous les messages ne soient pas stocks. Un exemple plus loin dans cette section montre ce qui arrive. La clause LIMIT a la mme syntaxe que la commande SELECT. See Section 13.1.7, Syntaxe de SELECT . Le serveur MySQL retourne le nombre total d'alertes et d'erreurs que vous avez obtenu lors de la dernire commande. Ils sont disponibles avec la fonction mysql_warning_count(). See Section 24.2.3.61, mysql_warning_count() .
678
Syntaxe de SHOW
Jusqu' max_error_count messages peuvent tre stocks (variable globale et spcifique aux threads). Vous pouvez lire le nombre d'erreurs dans @error_count et le nombre d'alertes dans @warning_count. SHOW WARNINGS affiche aussi toutes les erreurs, alertes et notes de la dernire commande, alors que SHOW ERRORS ne montre que les erreurs.
mysql> DROP TABLE IF EXISTS no_such_table; mysql> SHOW WARNINGS; +-------+------+-------------------------------+ | Level | Code | Message | +-------+------+-------------------------------+ | Note | 1051 | Unknown table 'no_such_table' | +-------+------+-------------------------------+
Notez que depuis MySQL 4.1.0, nous avons ajout un nouveau systme d'alertes, et peu de commandes MySQL gnre des alertes. 4.1.1 supporte toutes sortes d'alertes pour LOAD DATA INFILE et les commandes DML telles que INSERT, UPDATE et ALTER. Par exemple, voici une situation simple qui produit des alertes de conversions pour une commande d'insertion :
mysql> create table t1(a tinyint NOT NULL, b char(4)); Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(10,'mysql'),(NULL,'test'),(300,'open source'); Query OK, 3 rows affected, 4 warnings (0.15 sec) Records: 3 Duplicates: 0 Warnings: 4 mysql> show warnings; +---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1263 | Data truncated for column 'b' at row 1 | | Warning | 1261 | Data truncated, NULL supplied to NOT NULL column 'a' at row 2 | | Warning | 1262 | Data truncated, out of range for column 'a' at row 3 | | Warning | 1263 | Data truncated for column 'b' at row 3 | +---------+------+---------------------------------------------------------------+ 4 rows in set (0.00 sec)
Le nombre maximal d'alertes peut tre spcifi en utilisant la variable de serveur 'max_error_count', SET max_error_count=[count]; Par dfaut, c'est 64. Pour dsactiver les alertes, donnez simplement la valeur de 0 la variable. Si max_error_count vaut 0, alors le nombre d'alertes reprsente toujours le nombre d'alertes qui ont eu lieu, mais aucun message d'erreur n'est accessible. Par exemple, observez la commande ALTER suivante, pour l'exemple ci-dessus, qui retourne uniquement une alerte, mme si le nombre total d'alertes est de 3 lorsque 'max_error_count'=1.
mysql> show variables like 'max_error_count'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_error_count | 64 | +-----------------+-------+ 1 row in set (0.00 sec) mysql> set max_error_count=1; Query OK, 0 rows affected (0.00 sec) mysql> alter table t1 modify b char; Query OK, 3 rows affected, 3 warnings (0.00 sec) Records: 3 Duplicates: 0 Warnings: 3 mysql> show warnings;
679
+---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1263 | Data truncated for column 'b' at row 1 | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql>
La commande CACHE INDEX assigne un index de table un cache de cl spcifique. Cette commande est uniquement disponible pour les tables MyISAM. La commande suivante assigne les index des tables t1, t2 et t3 au cache de cl appel hot_cache :
mysql> CACHE INDEX t1, t2, t3 IN hot_cache; +---------+--------------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------+--------------------+----------+----------+ | test.t1 | assign_to_keycache | status | OK | | test.t2 | assign_to_keycache | status | OK | | test.t3 | assign_to_keycache | status | OK | +---------+--------------------+----------+----------+
La syntaxe de CACHE INDEX vous permet de spcifier des index particuliers un cache. Cependant, l'implmentation courante assigne tous les index de la table au cache, et il n'y a donc pas d'intrt spcifier autre chose que le nom de la table. Le cache de cl utilis dans une commande CACHE INDEX peut tre cr en lui donnant une taille avec une commande de configuration, ou la configuration du serveur. Par exemple :
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
Les paramtres du cache de cl sont accessibles depuis une variable systme structure. See Section 9.4.1, Variables systme structures . Un cache de cl doit exister avant que vous ne l'utilisiez :
mysql> CACHE INDEX t1 in non_existent_cache; ERROR 1283 (HY000): Unknown key cache 'non_existent_cache'
Par dfaut, les index de table sont assigne au cache de cl par dfaut, cr au moment du dmarrage du serveur. Lorsqu'un cache de cl est dtruit, tous les index qui lui taient assign sont transmis au cache par dfaut. Les assignations d'index affectent le serveur globalement : si un client assigne un index un cache donn, ce cache sera utilis pour tous les requtes, quelque soit le client qui met la requte. CACHE INDEX a t ajout en MySQL 4.1.1.
680
Vous devez utiliser la commande FLUSH si vous voulez effacer certains caches internes de MySQL. Pour excuter FLUSH, vous devez avoir le droit RELOAD. flush_option peut tre l'une des suivantes : HOSTS Vide le cache des htes. 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 hte, lors des connexions au serveur MySQL, MySQL suppose qu'il y a un problme, et interdit l'accs l'hte. See Section A.2.5, Erreur Host '...' is blocked . Vous pouvez dmarrer mysqld avec -O max_connect_errors=999999999 pour viter ce message. DES_KEY_FILE Recharge les cls DES depuis le fichier de stockage spcifi par --des-key-file lors du dmarrage du serveur. LOGS Ferme et rouvre tous les fichiers de log. Si vous avez spcifi un fichier de log de mise jour, ou un fichier de log binaire sans extension, le numro d'extension du fichier de log sera incrment d'une unit. Si vous avez utilis une extension dans le nom du fichier, MySQL va fermer et rouvrir le mme fichier. See Section 5.9.3, Le log de modification . Ceci est la mme chose que d'envoyer le signal SIGHUP au serveur mysqld. PRIVILEGES Recharge les privilges des tables de droits dans la base mysql. QUERY CACHE Dfragmente le cache des requtes pour mieux en utiliser la mmoire. Cette commande n'effacera aucune requte du cache, la diffrence de RESET QUERY CACHE. TABLES Ferme toutes les tables ouvertes, et force les tables utilises se refermer. Cela vide aussi le cache de requtes. [TABLE | TABLES] nom_de_table [,nom_de_table...] Vide du cache uniquement les tables nommes. TABLES WITH READ LOCK Ferme toutes les tables ouvertes, et verrouille en lecture toute les tables et bases, jusqu' ce que vous excutiez une commande UNLOCK TABLES. C'est trs pratique pour gnrer des sauvegardes, si vous avez un systme de fichiers comme Veritas, qui peut prendre des photos du systme. STATUS Remet la plupart des variables de statut zro. A n'utiliser que pour corriger une requte. See Section 1.4.1.3, Comment rapporter un bogue ou un problme . USER_RESOURCES Remet toutes les ressources zro. Cela va autoriser de nouveau les utilisateurs qui ont t bloqus. See Section 5.6.4, Limiter les ressources utilisateurs . Vous pouvez aussi accder toutes les commandes dcrites plus haut en les donnant en arguments mysqladmin (exemple : flush-hosts, flush-logs, reload, ou encore flush-tables).
681
Reportez-vous aussi la commande RESET avec la rplication. See Section 13.5.4.5, Syntaxe de la commande RESET .
Chaque connexion mysqld utilise un thread unique. Vous pouvez voir les threads en cours d'excution en utilisant la commande SHOW PROCESSLIST et en terminer un avec la commande KILL thread_id. Depuis MySQL 5.0.0, KILL autorise les options CONNECTION et QUERY : KILL CONNECTION est similaire KILL sans option : elle termine la connexion associe avec le thread thread_id. KILL QUERY termine la requte que la connexion est actuellement en train de traiter, mais laisse la connexion ouverte. 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. Note : vous ne pouvez actuellement pas utiliser KILL avec la bibliothque du serveur embarqu, car celui-ci utilise les threads de l'application hte, il ne cre pas ses propres threads. Quand vous excutez un KILL, un thread spcifique est cre 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 spcifiques. Pour les boucles de SELECT, ORDER BY et GROUP BY, le thread de terminaison est vrifi aprs avoir lu un enregistrement. S'il est activ, la requte est abandonne. Lors d'un ALTER TABLE le thread de terminaison est vrifi avant la lecture de chacune des colonnes de la table d'origine. S'il est activ, la commande est abandonne et la table temporaire efface. Lors d'un UPDATE ou d'un DELETE, le thread de terminaison est vrifi aprs chaque lecture de bloc et chaque mise jour ou suppression de ligne. S'il est activ, la requte est abandonne. 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 mmoire 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 libration d'espace disque lors d'un appel write, l'opration est avorte avec un message d'erreur indiquant que le disque est plein.
682
Commandes de rplication
La commande LOAD INDEX INTO CACHE prcharge un index dans un cache de cl, qui est explicitement nomm dans dans la commande CACHE INDEX, ou dans le cache par dfaut. LOAD INDEX INTO CACHE ne sert que pour les tables MyISAM. L'option IGNORE LEAVES fait que les blocs terminaux de l'index ne sont pas lus. La commande suivante prcharge les noeuds des tables t1 et t2 :
mysql> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES; +---------+--------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------+--------------+----------+----------+ | test.t1 | preload_keys | status | OK | | test.t2 | preload_keys | status | OK | +---------+--------------+----------+----------+
Cette commande charge tous les index de t1. Elle ne charge que les index non-terminaux de t2. La syntaxe de LOAD INDEX INTO CACHE vous permet de spcifier seulement des index particuliers charger dans la table. Cependant, l'implmentation courante charge tous les index : il n' y a pas de raison pour utiliser autre chose que le nom de la table. LOAD INDEX INTO CACHE a t ajout en MySQL 4.1.1.
La commande RESET sert remettre zro des donnes. C'est aussi une version plus puissante de la commande FLUSH. See Section 13.5.4.2, Syntaxe de FLUSH . Pour excuter la commande RESET, vous devez avoir les droits RELOAD. MASTER Efface tous les logs binaires lists dans le fichier d'index, et l'index binlog est vid. Dans les version antrieures la version 3.23.26, cette commande s'appelait FLUSH MASTER (Master) See Section 13.6.1, Requtes SQL pour contrler les matres de rplication . QUERY CACHE Supprime tous les rsultats de requtes du cache de requte. SLAVE Annule la position de rplication de l'esclave dans les historiques du matre. Dans les version antrieures la version 3.23.26, cette commande s'appelait FLUSH SLAVE(Slave)See Section 13.6.2, Commandes SQL de contrle des esclaves de rplication .
683
Efface tous les logs binaires lists dans l'index de logs, qui sont antrieurs la date ou au log indiqu. Les logs sont aussi supprims de cette liste : le log donn en paramtre devient alors le premier de la liste. Exemple :
PURGE MASTER LOGS TO 'mysql-bin.010'; PURGE MASTER LOGS BEFORE '2003-04-02 22:46:26';
La variante BEFORE est disponible en MySQL 4.1; son argument de date peut tre au format 'YYYYMM-DD hh:mm:ss'. MASTER et BINARY sont synonymes, mais BINARY ne peut tre utilis que depuis MySQL 4.1.1. Si vous avez un esclave actif qui est actuellement en train de lire l'un des logs que vous voulez effacer, la commande ne fera rien, et chouera avec une erreur. Cependant, si l'esclave est inactif, et que vous effacez un des logs qu'il utilisait, l'esclave sera incapable de reprendre la rplication. Cette commande peut tre utilise sans problme durant la rplication : vous n'avez pas besoin d'arrter les esclaves. Pour purger les logs, suivez cette procdure : 1. Sur chaque esclave, utilisez la commande SHOW SLAVE STATUS pour vrifier quel log est lu. 2. Faite une liste des logs sur le matre avec SHOW MASTER LOGS. 3. Dterminez le plus ancien log parmi ceux utiliss par les esclaves. C'est votre limite. Si vous les esclaves sont jour, alors ce sera le dernier log de la liste. 4. Faites une sauvegarde de tous les logs que vous allez effacer. Cette tape est optionnelle, mais c'est une bonne ide. 5. Purgez tous les logs jusqu' celui qui prcde votre limite.
Efface tous les fichiers de logs binaires dans le fichier d'index, et vide le fichier d'index des logs. Cette commande s'appelait FLUSH MASTER avant MySQL 3.23.26.
Inactive ou active le log binaire de la connexion courante (SQL_LOG_BIN est une variable de session), si le client se connecte avec un compte qui a les droits de SUPER. La commande est ignore si le client n'a pas de droits.
Affiche les vnements du log binaire. Si vous ne spcifiez pas 'log_name', le premier log binaire sera affich. La clause LIMIT a la mme syntaxe que celle de la commande SELECT. See Section 13.1.7, Syntaxe de SELECT . Cette commande est disponible en MySQL 4.0
Liste les logs binaires disponibles sur le matre. Vous devriez utiliser cette commande avant PURGE MASTER LOGS pour savoir jusqu'o vous pouvez aller.
Affiche la liste des esclaves actuellement enregistre sur le matre. Notez que les esclaves qui ne sont pas lanc avec l'option --report-host=nom_d_esclave ne seront pas visible dans cette liste.
Modifie les paramtres que l'esclave utilise pour se connecter et pour communiquer avec le serveur matre. Les valeurs possibles pour master_def sont prsentes ci-dessus. Les options de log de relais, RELAY_LOG_FILE et RELAY_LOG_POS, sont disponibles depuis MySQL 4.0. Les options SSL, MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY et MASTER_SSL_CIPHER, sont disponibles depuis MySQL 4.1.1. Vous pouvez changer ces options mme sur les esclaves qui sont compil sans le support SSL. Elles seront sauves dans le fichier master.info mais ignores jusqu' ce que le support SSL soit activ. Par exemple :
mysql> CHANGE MASTER TO -> MASTER_HOST='master2.mycompany.com', -> MASTER_USER='replication', -> MASTER_PASSWORD='bigs3cret', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='master2-bin.001', -> MASTER_LOG_POS=4,
685
MASTER_USER, MASTER_PASSWORD, MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY, et MASTER_SSL_CIPHER sont des informations qui permettent l'esclave de se connecter au matre. Si vous omettez certains paramtres, les paramtres omis conserveront leur ancienne valeur. Par exemple, si le mot de passe sur le matre a chang, il suffit de faire :
mysql> STOP SLAVE; -- if replication was running mysql> CHANGE MASTER TO MASTER_PASSWORD='new3cret'; mysql> START SLAVE; -- if you want to restart replication
pour indiquer l'esclave le nouveau mot de passe : il n'y a pas besoin de spcifier les informations qui n'ont pas chang, comme l'hte, le port, l'utilisateur, etc... MASTER_HOST, MASTER_PORT sont le nom d'hte ou l'adresse IP du matre, et son port TCP. Notez que si MASTER_HOST est gal localhost, alors, comme gnralement avec MySQL, le port sera ignor si les sockets Unix sont utilisables. Si vous spcifiez MASTER_HOST ou MASTER_PORT, l'esclave supposera que le serveur matre est diffrent du prcdent, mme si vous spcifier les mmes valeurs d'hte et de port que prcdemment. Dans ce cas, les anciennes valeurs et position de l'historique binaire ne sont plus valides. Ainsi, si vous ne spcifiez pas MASTER_LOG_FILE et MASTER_LOG_POS dans la commande, MASTER_LOG_FILE='' et MASTER_LOG_POS=4 sont ajouts silencieusement. MASTER_LOG_FILE et MASTER_LOG_POS sont les coordonnes auxquelles le thread d'I/O doit commencer lire chez le matre, lorsque le thread redmarrera. Si vous spcifiez l'un d'entre eux, vous ne pourrez pas spcifier RELAY_LOG_FILE ou RELAY_LOG_POS. Si MASTER_LOG_FILE, ni MASTER_LOG_POS n'ont t spcifis, alors les dernires coordonnes du thread esclave d'avant la commande CHANGE MASTER seront utilises. Cela assure que la rplication ne connat pas de discontinuit, mme si le thread esclave tait en retard sur le thread d'I/O, alors que vous ne voulez changer que le mot de passe. Ce comportement scuritaire a t introduit partir de MySQL versions 4.0.17 et 4.1.1. Avant ces versions, les coordonnes utilises celles du thread d'I/O, avant que la commande CHANGE MASTER soit mise, ce qui conduisait des pertes d'vnements au niveau du matre, et donc, la corruption de la rplication. CHANGE MASTER efface tous les logs de relais (et en dmarre de nouveaux), moins que vous ne spcifiez l'option RELAY_LOG_FILE ou RELAY_LOG_POS (dans ce cas, les logs de relais seront conservs; depuis MySQL 4.1.1 la variable globale RELAY_LOG_PURGE sera automatiquement mise 0). CHANGE MASTER TO modifie master.info et relay-log.info. CHANGE MASTER sert configurer un esclave lorsque vous avez une sauvegarde du matre, son log et la position qui correspond la sauvegarde du matre. Vous pouvez utiliser la commande CHANGE MASTER TO MASTER_LOG_FILE='log_name_on_master', MASTER_LOG_POS=log_offset_on_master sur l'esclave aprs la restauration de la sauvegarde. Le premier exemple ci-dessus (CHANGE MASTER TO MASTER_HOST='master2.mycompany.com' etc) modifie les coordonnes du matre et de son log binaire. Cela est utile lorsque vous voulez que l'esclave rplique le matre. Le second exemple, moins frquent, sert lorsque l'esclave a des logs de relais que vous voulez utiliser nouveau. Pour cela, le matre n'a pas besoin d'tre rejoint : il suffit d'utiliser la commande CHANGE MASTER TO et de lancer le thread SQL START SLAVE SQL_THREAD. Vous pouvez mme utiliser cela dans une configuration de rplication, sur un serveur indpendant, pour assurer la restauration aprs crash. Supposez que votre serveur soit plant, et que vous avez restaur la sauvegarde. Vous voulez que le serveur excute nouveau ses propres logs (non pas des logs de relais, mais ses logs binaires), qui sont par exemple, stocks sous le nom myhostbin.*. Tout d'abord, faite une copie des fichiers de log dans un entrept, au cas o une erreur de manipulation surviendrait, et que le serveur vide ses logs. Si vous utilisez MySQL 4.1.1 ou plus rcent, utilisez la commande suivante pour plus de scurit : SET GLOBAL RELAY_LOG_PURGE=0.
686
Puis, lancez le serveur sans log-bin, et avec un nouvel identifiant (diffrent du prcdent), avec l'option relay-log=myhost-bin (pour faire croire au serveur que ses propres logs sont des logs de relais), et skip-slave-start. Puis, envoyez cette commande :
mysql> CHANGE MASTER TO -> RELAY_LOG_FILE='myhost-bin.153', -> RELAY_LOG_POS=410, -> MASTER_HOST='some_dummy_string'; mysql> START SLAVE SQL_THREAD;
Le serveur va alors lire et excuter ses propres logs, et rattraper les donnes jusqu'au crash. Une fois la restauration finie, faites STOP SLAVE, teignez le serveur, supprimez master.info et relay-log.info, puis relancez le serveur avec ses options originales. Pour le moment, spcifier MASTER_HOST (mme avec une valeur insignifiante) est obligatoire pour que le serveur pense qu'il est un esclave. Donner au serveur un nouvel identifiant, diffrent du prcdent, est aussi obligatoire, car sinon, le serveur va voir des vnements avec son identifiant, et il va conclure que c'est une rplication circulaire, et il va les ignorer. Dans le futur, nous envisageons de nous dbarasser de ces petites contraintes.
Fait une sauvegarde du matre et la copie vers l'esclave. Met jour les valeurs de MASTER_LOG_FILE et MASTER_LOG_POS pour que la rplication reprennent la bonne position. Respecte les interdictions de rplications de tables et de bases spcifies par les options replicate-*. L'utilisation de cette commande est sujette aux conditions suivantes : Fonctionne avec les tables MyISAM. Pose un verrou global en lecture sur le matre durant la sauvegarde, qui empche les modifications sur le matre durant la phase de chargement. Dans le futur, il est prvu de faire que cette commande fonctionne avec les tables InnoDB, et qu'elle se passe du verrou global en utilisant des fonctionnalits de sauvegarde chaud non-bloquantes. Si vous chargez de trs grosses tables, pensez augmenter les valeurs des options net_read_timeout et net_write_timeout sur vos matre et esclave. See Section 5.2.3, Variables serveur systme . Notez que LOAD DATA FROM MASTER ne copie pas les tables de droits de la base mysql. C'est fait pour simplifier l'utilisation de droits et utilisateurs diffrents sur le matre et les esclaves. Cette commande requiert les droits de RELOAD et SUPER sur le matre, et le droit de SELECT sur toutes les tables du matre qui seront lues. Toutes les tables du matre sur lesquelles l'utilisateur n'a pas de droits de SELECT seront ignores par LOAD DATA FROM MASTER; ceci est d au fait que le matre va masquer ces tables l'utilisateur : LOAD DATA FROM MASTER utilise SHOW DATABASES pour connatre les tables charger, mais SHOW DATABASES ne retourne que les bases pour lesquelles l'utilisateur a des droits. Voyez Section 13.5.3.6, Syntaxe de SHOW DATABASES . Sur l'esclave, l'utilisateur qui envoie la commande LOAD DATA FROM MASTER doit avoir les droits de cration et d'effacement des tables et bases impliques.
Tlcharge une copie d'une table depuis le matre vers l'esclave. Cette commande est implmente pour dboguer la commande LOAD DATA FROM MASTER. Elle requiert un compte pour se connecter au matre, avec les droits de RELOAD et SUPER, ainsi que les droits de SELECT sur la table a charger. Cot esclave, l'utilisateur qui met la commande doit avoir les droits de LOAD TABLE FROM MASTER
687
pour crer et effacer les tables. Lisez les informations sur les problmes rseau dans LOAD DATA FROM MASTER; elles s'appliquent aussi ici. Notez aussi que les limitations de LOAD DATA FROM MASTER s'appliquent aussi (par exemple, LOAD TABLE FROM MASTER ne fonctionne que sur les tables de type MyISAM).
13.6.2.4. MASTER_POS_WAIT()
SELECT MASTER_POS_WAIT('master_log_file', master_log_pos)
C'est une fonction et non pas une commande. Elle sert s'assurer que l'esclave a atteint (lu et excut) les vnements du log binaire du matre jusqu' une certaine position. Voyez la section See Section 12.8.4, Fonctions diverses pour une description complte.
Force l'esclave a oublier toute les positions de rplications dans les logs du matre. Cette commande permet de faire un dmarrage propre : elle efface les fichiers master.info et relay-log.info, et les logs de relais, puis crer un nouveau log de relais. Note : tous les logs de relais sont effacs, mme si il n'ont pas t totalement excuts par le thread SQL. (C'est un tat qui est probable si l'esclave de rplication est fortement charg, ou si vous avez lanc une commande STOP SLAVE.) Les informations de connexions stockes dans le fichier master.info reprennent immdiatement les valeurs spcifies dans les options de dmarrage, si elles taient prcises. Ces informations incluent notamment le nom de l'hte matre, le port, l'utilisateur et le mot de passe. Si le thread esclave tait au milieu d'une rplication temporaire lorsqu'il a t arrt, et que RESET SLAVE a t mise, ces tables temporaires sont aussi effaces. Cette commande s'appelait FLUSH SLAVE avant MySQL 3.23.26.
Ignore les n prochains vnements du matre. C'est une commande pratique pour rattraper les arrts de rplications causs par une commande. Cette commande n'est valide que lorsque le thread esclave ne fonctionne pas. Sinon, elle produit une erreur. Avant MySQL 4.0, omettez le mot cl GLOBAL dans la commande.
Affiche des informations sur les paramtres essentiels des threads esclaves. Si vous utilisez cette commande avec le client mysql, vous pouvez utiliser le terminateur de commande \G plutt que le point-virgule pour avoir un format plus lisible :
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: localhost Master_User: root Master_Port: 3306 Connect_Retry: 3 Master_Log_File: gbichot-bin.005 Read_Master_Log_Pos: 79 Relay_Log_File: gbichot-relay-bin.005 Relay_Log_Pos: 548 Relay_Master_Log_File: gbichot-bin.005 Slave_IO_Running: Yes
688
Slave_SQL_Running: Replicate_Do_DB: Replicate_Ignore_DB: Last_Errno: Last_Error: Skip_Counter: Exec_Master_Log_Pos: Relay_Log_Space: Until_Condition: Until_Log_File: Until_Log_Pos: Master_SSL_Allowed: Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master:
Yes
0 0 79 552 None 0 No
Suivant votre version de MySQL, vous pourriez ne pas voir tous les champs qui sont dans cet exemple. Notamment, il y a plusieurs champs qui ne sont disponibles qu'avec MySQL 4.1.1. Les champs affichs par SHOW SLAVE STATUS ont les dfinitions suivantes : Slave_IO_State Une copie de la colonne State de la commande SHOW PROCESSLIST pour le thread d'I/O. Elle va vous indiquer si le thread essaye de se connecter au matre, attend des vnements, se reconnecte, etc. Les diffrents tats possibles sont lists dans la section Section 6.3, Dtails d'implmentation de la rplication . Etudier cette colonne est ncessaire, par exemple, car le thread peut fonctionner mais ne pas russir se connecter au matre : seule cette colonne vous indiquera ce type de problmes. D'un autre cot, l'tat du thread SQL n'est pas indiqu, car les problmes sont bien plus simples avec lui : soit il fonctionne, et il n'y a pas de problme; soit il ne fonctionne pas, et vous trouverez les messages d'erreur dans la colonne Last_Error, dcrite plus bas. Ce champ a t ajout en MySQL 4.1.1. Master_Host L'hte matre courant. Master_User Le nom de l'utilisateur utilis pour se connecter au matre. Master_Port Le port courant sur le matre. Connect_Retry La valeur courante de l'option master-connect-retry. Master_Log_File Le nom du fichier de log binaire que le thread d'I/O utilise sur le matre. Read_Master_Log_Pos La position que le thread d'I/O a atteint dans le fichier de log binaire du matre. Relay_Log_File Le nom du fichier de log de relais dans lequel le thread SQL est actuellement en train de lire et de travailler.
689
Relay_Log_Pos La position laquelle le thread SQL est en train de travailler. Relay_Master_Log_File Le nom du fichier de log binaire du matre qui contient le dernier vnement excut par le thread SQL. Slave_IO_Running Indique si le thread d'I/O est lanc ou pas. Slave_SQL_Running Indique si le thread SQL est lanc ou pas. Replicate_Do_DB, Replicate_Ignore_DB La liste des bases de donnes qui ont t spcifie dans l'option --replicate-do-db et -replicate-ignore-db, ventuellement. Replicate_Do_Table, Replicate_Ignore_Table, Replicate_Wild_Do_Table, Replicate_Wild_Ignore_Table La liste des tables qui ont t spcifies respectivement dans les options --replicate-dotable, --replicate-ignore-table, --replicate-wild-do-table et --replicatewild-ignore_table, ventuellement. Ces champs ont t ajouts en MySQL 4.1.1. Last_Errno, Last_Error Last_Errno est le numro d'erreur de la plus rcent requte excute. La valeur de 0 signifie ``pas d'erreur''. Last_Error est le message d'erreur de la plus rcent requte excute. Par exemple :
Last_Errno: 1051 Last_Error: error 'Unknown table 'z'' on query 'drop table z'
Le message indique que la table z existait sur le matre et a t efface, mais qu'elle n'existe pas sur l'esclave, et que DROP TABLE a chou sur l'esclave. Cela peut arriver si vous avez oubli de copier une table dans l'esclave avant de lancer la rplication. Une chane vide signifie ``pas d'erreur''. Si Last_Error n'tait pas vide, alors le mme message apparatra dans le log d'erreur de l'esclave. Skip_Counter La dernire valeur utilise par SQL_SLAVE_SKIP_COUNTER. Exec_Master_Log_Pos La position dans les logs binaires du matre (Relay_Master_Log_File) pour le dernier vnement excut par le thread SQL. ((Relay_Master_Log_File,Exec_Master_Log_Pos) dans le log binaire du matre correspond (Relay_Log_File,Relay_Log_Pos) dans le log de relais. Relay_Log_Space La taille combine de tous les logs de relais. Until_Condition, Until_Log_File, Until_Log_Pos Les valeurs spcifies dans la clause UNTIL de la commande START SLAVE.
690
Until_Condition peut prendre ces valeurs : None (aucune) si aucune clause UNTIL n'a t spcifie Master (matre), si l'esclave lit depuis une position donne, dans le log binaire du matre Relay (relais) si l'esclave lit dans une position donne dans le log de relais. Until_Log_File et Until_Log_Pos indique le nom du fichier de log et la position qui dfinissent le point o le thread SQL va s'arrter d'excuter. Ces champs ont t ajouts en MySQL 4.1.1. Master_SSL_Allowed, Master_SSL_CA_File, Master_SSL_CA_Path, Master_SSL_Cert, Master_SSL_Cipher, Master_SSL_Key Ces champs indiquent les paramtres SSL utiliss par l'esclave pour se connecter au matre, s'ils sont fournis. Master_SSL_Allowed prend ses valeurs : Yes (oui) si la connexion SSL au matre est autorise No (non) si la connexion SSL au matre est interdite Ignored (ignor) si la connexion SSL au matre est autorise par l'esclave mais que le support de SSL n'est pas l. Les valeurs des autres champs correspondent aux valeurs des options --master-ca, --mastercapath, --master-cert, --master-cipher et --master-key. Ces champs ont t ajouts en MySQL 4.1.1. Seconds_Behind_Master Le nombre de secondes qui se sont coules depuis le timestamp du dernier vnement matre excut par le thread SQL. Ce sera NULL si aucun vnement n'a t excut, ou aprs une commande CHANGE MASTER et RESET SLAVE. Cette colonne sert mesurer le retard de l'esclave sur le matre. Cela fonctionne mme si le matre et l'esclave on des horloges rgles diffremment. Ce champ a t ajout en MySQL 4.1.1.
START SLAVE, appel sans option, dmarre les deux threads esclaves. Le thread I/O lire les requtes du matre et les stocke dans le log de relais. Le thread SQL lire le log de relais, et excute les requtes. Notez que si START SLAVE russi lancer le thread esclave, elle se terminera sans erreur. Mais mme dans ce cas, il se peut que le thread esclave se lance, puis s'arrte (car il n'a pas pu se connecter au matre, ou lire le log binaire ou tout autre problme). START SLAVE ne vous prviendra pas de cet vnement. Vous devez vrifier le log d'erreur de l'esclave pour voir si des messages ont t gnrs, ou encore vrifier que tout fonctionne avec la commande SHOW SLAVE STATUS. Depuis MySQL 4.0.2, vous pouvez ajouter les options IO_THREAD ou SQL_THREAD la commande, pour nommer les threads que vous lancez.
691
Depuis MySQL 4.1.1, une clause UNTIL peut tre ajoute pour spcifier que l'esclave doit commencer un certain point dans le log binaire, ou dans le log de relais. Lorsque le thread SQL atteint ce point, il s'arrte. Si l'option SQL_THREAD est spcifie dans la commande, seule le thread SQL est lanc. Sinon, les deux threads sont lancs. Si le thread SQL est dj lanc, la clause UNTIL est ignore, et une alerte est mise. Avec la clause UNTIL, vous devez spcifier la fois un fichier de log et une position. Ne confondez pas les options du matre et celles du log de relais. Toute condition UNTIL est annule par une commande STOP SLAVE, ou une commande START SLAVE qui n'inclut pas de condition UNTIL, ou encore un redmarrage serveur. La clause UNTIL peut tre utile pour dboguer la rplication, ou pour vous assurer que la rplication s'effectue jusqu' un certain point. Par exemple, si une commande imprudente DROP TABLE a t excute sur le matre, vous pouvez utiliser la clause UNTIL pour dire l'esclave de s'excuter jusqu' ce moment, puis de s'arrter. Pour trouver cet vnement, utilisez l'utilitaire mysqlbinlog sur le log du matre, ou sur le log de relais, ou encore utilisez la commande SHOW BINLOG EVENTS. Si vous utilisez la clause UNTIL pour faire des rplications par portions, il est recommand de lancer l'esclave avec l'option --skip-slave-start pour viter que le thread SQL ne se lance lorsque l'esclave se lance. Il est probablement idale d'utiliser cette option dans un fichier d'options plutt qu'en ligne de commande, pour qu'un redmarrage intempestif ne l'oublie pas. La commande SHOW SLAVE STATUS affiche un champ qui indique la valeur courante de la clause UNTIL.
Arrte l'esclave. Tout comme START SLAVE, cette commande peut tre utilise avec les options IO_THREAD et SQL_THREAD pour identifier le thread par son nom. Cette commande s'appelait SLAVE STOP avant MySQL 4.0.5. Actuellement, SLAVE STOP est toujours disponible pour assurer la compatibilit ascendante, mais c'est une commande abandonne.
692
La syntaxe SQL pour les commandes prpares sert dans les situations suivantes : Vous voulez tester les commandes prpares avec votre application sans faire de codage. Ou bien, votre application a des problmes avec les commandes prpares, et vous voulez dterminer ce problme interactivement. Vous voulez crer un cas de test qui dcrit les problmes que vous avez avec les commandes prpares, pour pouvoir envoyer un rapport de bogue. Vous deve utiliser les commandes prpares, mais vous n'avez pas accs une interface qui les supporte. La syntaxe SQL pour les commandes prpares est base sur 3 commandes SQL :
PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @var_name] ...]; DEALLOCATE PREPARE stmt_name;
La commande PREPARE prpare la commande, lui assigne le nom stmt_name, qui sera utilis ultrieurement. preparable_stmt est soit une chane littrale, soit une variable utilisateur, qui contient le texte de la commande. Le texte doit reprsenter une seule commande SQL, et non pas plusieurs. Dans la commande, le caractre ? sert de variable de requte : ils indiquent que les valeurs seront fournies l'application ultrieurement. Le caractre ? ne doit pas tre plac entre guillemets, mme si vous voulez leur donner des valeurs de chanes de caractres. Si une commande prpare existe dj avec le mme nom, elle sera dtruite implicitement avant la prparation de la nouvelle commande. Cela signifie que si la nouvelle commande contient une erreur et ne peut pas tre prpare, une erreur sera retourne, et la commande aura simplement t dtruite. Le contexte d'une commande prpare est celui de la session client dans laquelle elle est cre. Les autres clients ne peuvent y accder. Aprs avoir prpar une commande, vous l'excutez avec la commande EXECUTE, qui fait rfrence au nom de la commande prpare. Si la commande prpare contient des variables, vous devez fournir leur valeur avec la clause USING qui liste les variables contenant les valeurs des paramtres. Les valeurs des paramtres doivent tre aussi nombreuses que les paramtres de la commande. Vous pouvez excuter une commande prpare plusieurs fois, en lui passant diffrentes valeurs, ou diffrentes variables. Pour dtruire une commande prpare, utilisez la commande DEALLOCATE PREPARE. Tenter d'excuter la commande prpare aprs destruction conduit une erreur. Si vous quittez la session client sans librer les commandes prpares, le serveur le fera pour vous. Les exemples suivants montre deux mthodes quivalentes pour prparer les commandes qui calculent l'hypothnuse d'un triangle partir de la taille de deux de ses cots. Le premier exemple montre comment crer la commande prpare avec une chane littrale :
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> SET @a = 3; mysql> SET @b = 4; mysql> EXECUTE stmt1 USING @a, @b; +------------+ | hypotenuse | +------------+ | 5 | +------------+ mysql> DEALLOCATE PREPARE stmt1;
Le second exexemple est similaire, mais fournit le texte de la commande dans une variable utilisateur :
693
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> PREPARE stmt2 FROM @s; mysql> SET @a = 6; mysql> SET @b = 8; mysql> EXECUTE stmt2 USING @a, @b; +------------+ | hypotenuse | +------------+ | 10 | +------------+ mysql> DEALLOCATE PREPARE stmt2;
La syntaxe SQL des commandes prpares syntax ne peut pas tre utilise par imbrication. C'est dire, une commande passe PREPARE ne peut pas excuter les commandes PREPARE, EXECUTE ou DEALLOCATE PREPARE. De plus, la syntaxe SQL pour les commandes prpares est distincte de l'API des commandes prpares. Par exemple, vous pouvez utiliser la fonction C mysql_stmt_prepare() pour prparer une commande PREPARE, EXECUTE, or DEALLOCATE PREPARE.
694
695
Lorsque vous crez une table, vous pouvez indiquer MySQL le type de table avec la clause ENGINE ou TYPE lors de la commande de CREATE TABLE :
CREATE TABLE t (i INT) ENGINE = INNODB; CREATE TABLE t (i INT) TYPE = MEMORY;
ENGINE est le terme recommand, mais il ne peut pas tre utilis avant MySQL 4.0.18. TYPE est disponible depuis MySQL 3.23.0, la premire version de MySQL qui dispose de plusieurs moteurs de tables. Si vous omettez l'option ENGINE ou TYPE, le type de table par dfaut sera utilis. C'est gnralement MyISAM. Cela peut tre chang en modifiant la variable systme table_type. Pour convertir une table d'un type l'autre, utilisez la commande ALTER TABLE, pour indiquer le nouveau type :
ALTER TABLE t ENGINE = MYISAM; ALTER TABLE t TYPE = BDB;
See Section 13.2.5, Syntaxe de CREATE TABLE and Section 13.2.2, Syntaxe de ALTER TABLE . Si vous essayez d'utiliser un moteur de stockage qui n'est pas compil ou qui est dsactiv, MySQL crera une table de type MyISAM. Ce comportement est pratique pour copier des tables entre serveurs MySQL qui supportent diffrents moteurs. Par exemple, dans une architecture de rplication, votre serveur matre supporte des tables transactionnelles, mais l'esclave n'utilise que des tables nontransactionnelles, pour amliorer la vitesse. Cette substitution automatique par une table de type MyISAM pour un type de moteur indisponible peut tre gnant pour un nouvel utilisateur MySQL. En MySQL 4.1 et plus rcent, une alerte est gnre lorsque le type de la table est modifi. MySQL cre toujours un fichier .frm pour stocker le type de la table et les informations de dfinition. Les donnes et les index de la table peuvent tre stocks ailleurs, en fonction du type de tables. Le serveur cre le fichier .frm par dessus le moteur de stockage. Les moteurs peuvent crer des fichiers supplmentaires, en fonction de leurs besoins. Les avantages des tables transactionnelles (TST) sont : Plus sr. Mme si MySQL crashe ou que vous avez un problme matriel, vous pouvez rcuprer vos donnes, soit par un recouvrement automatique, soit partir d'une sauvegarde combine avec le log des transactions. Vous pouvez combiner plusieurs commandes et les accepter toutes d'un seul coup avec la commande COMMIT. Vous pouvez utiliser ROLLBACK pour ignorer vos modifications (si vous n'tes pas en mode autocommit). Si une mise jour choue, tout vos changements seront annuls. (Avec les tables NTST tous les changements oprs sont permanents) Gre mieux les accs concurrents si la table reoit simultanment plusieurs lectures. Notez que pour utiliser le moteur InnoDB en MySQL 3.23, vous devez configurer au moins l'option de dmarrage innodb_data_file_path. En 4.0 et plus rcent, InnoDB utilise les valeurs par dfaut de la configuration, si vous ne les spcifiez pas. See Section 15.4, Configuration InnoDB . Avantages des tables non-transactionnelles (NTST) : Plus rapides
696
Utilisent moins d'espace disque Utilisent moins de mmoire pour excuter les mises jour. Vous pouvez combiner les tables TST et NTST dans la mme requte pour obtenir le meilleur des deux types. Cependant, dans une transaction sans auto-validation, les modifications une table nontransactionnelles seront toujours immdiatement enregistrs, et ne pourront pas tre annul.
Normalement, les options ENGINE et TYPE sont inutiles : MyISAM est le type par dfaut de table en MySQL, moins d'avoir t spcifi autrement. Vous pouvez vrifier ou rparer une table MyISAM avec l'utilitaire myisamchk. See Section 5.7.3.7, Utiliser myisamchk pour restaurer une table . Vous pouvez aussi compresser les tables MyISAM avec l'utilitaire myisampack pour rduire leur taille sur le disque. See Section 8.2, myisampack, le gnrateur de tables MySQL compresses en lecture seule . Voici les nouveauts des tables MyISAM : Toutes les cls numriques sont stockes avec l'octet de poids fort en premier, pour amliorer la compression. Cela rend les donnes indpendantes du systme d'exploitation et de la machine. La seule rgle pour assurer la portabilit binaire des fichiers est que la machine doit utiliser des entiers signs pour le complment 2 (c'est le cas de toutes les machines ces 20 dernires annes), et un format de nombre virgule flottante compatible IEEE (c'est aussi le format dominant). Le seul point o la portabilit n'est pas assure est les machine portables, qui ont des processeurs originaux. Il n'y a pas de cot spcifique stocker les donnes dans ce format. Les octets dans la table sont gnralement non-aligns, et cela ne prend pas longtemps d'aligner des octets. De plus, le code qui lit les valeurs des colonnes n'est pas critique par rapport au reste du code. Support des grands fichiers (63 bits) sur les systmes de fichiers et les systmes d'exploitation qui supportent les grands fichiers. Les lignes de taille dynamique sont bien moins fragmentes lors de l'utilisation d'insertion et d'effacement. Cela se fait en combinant automatiquement les blocs adjacent libres, et en tendant la taille des blocs avec le suivant s'il est vide. Le nombre maximal d'index par table est de 64 (32 avant MySQL 4.1.2). Cela peut tre chang en recompilant. Le nombre de colonnes maximal par index est 16. La taille maximale d'une cl est de 1000 octets (500 avant MySQL 4.1.2). Cela peut tre chang en recompilant MySQL. Dans le cas o la cl est plus longue que 250 octets, une taille de bloc de cl plus large est utilise, en remplacement des 1024 octets par dfaut. Les colonnes BLOB et TEXT peuvent tre indexes. Les valeurs NULL sont autorises dans une colonne indexe. Elles prennent 0 1 octets par cl.
697
Les valeurs numriques sont stockes avec l'octet de poids fort en premier, pour permettre une meilleure compression. Les fichiers d'index sont gnralement plus petits en MyISAM qu'en ISAM. Cela signifie que MyISAM va utiliser moins de ressources systmes que ISAM, mais il prendra plus de processeur lors de l'insertion de donnes dans un index compress. Lorsque les lignes sont insres dans un ordre tri (comme lorsque vous utilisez une colonne de type AUTO_INCREMENT), l'arbre des cl sera scind, pour que noeud principal ne contienne qu'une cl. Cela va amliorer l'utilisation d'espace dans l'arbre des cls. La gestion interne des colonnes AUTO_INCREMENT. MyISAM va automatiquement modifier cette valeur lors d'une insertion ou d'une modification. La valeur courante d'AUTO_INCREMENT peut tre modifie avec myisamchk. Cela va rendre les colonnes AUTO_INCREMENT plus rapide (au moins 10%) et les anciens nombres ne seront pas rutiliss, comme avec les vieilles tables ISAM. Notez que lorsque une cl AUTO_INCREMENT est dfinie la fin d'une cl multiple, l'ancien comportement est toujours prsent. Vous pouvez insrer de nouvelles lignes dans une table qui n'a aucun bloc vide dans le fichier de donnes, en mme temps que d'autres threads lisent le fichier de donnes (insertion simultane). Un bloc vide peut provenir d'une modification de ligne format dynamique (les donnes sont maintenant plus petites). Lorsque tous les blocs vide sont nouveau utiliss, les insertions suivantes peuvent tre simultanes. Vous pouvez placer les fichiers de donnes et d'index dans diffrents dossiers pour obtenir plus de vitesse avec les options de table DATA DIRECTORY et INDEX DIRECTORY, dans la commande CREATE TABLE. See Section 13.2.5, Syntaxe de CREATE TABLE . Depuis MySQL version 4.1, chaque colonne de caractres peut avoir un jeu de caractres distinct. Il y a un indicateur dans le fichier MyISAM qui indique si la table a t correctement ferme. Si mysqld est lanc avec l'option --myisam-recover, les tables MyISAM vont automatiquement tre vrifies et rpares, si elles n'ont pas t correctement refermes. myisamchk va marquer les tables comme vrifiz s'il est excut avec l'option --update-state. myisamchk --fast va uniquement vrifier les tables qui n'ont pas cette marque. myisamchk -a stocke les statistiques pour les parties de cls (et non plus pour les cls compltes, comme avec ISAM). myisampack peut compresser des colonnes BLOB et VARCHAR. pack_isam ne le peut pas. MyISAM supporte aussi les fonctionnalits suivantes, dont MySQL pourra profiter sous peu : Support du vrai type VARCHAR; une colonne VARCHAR commence avec une taille, stocke sur 2 octets. Les tables ayant des colonnes VARCHAR peuvent avoir un format de lignes fixe ou dynamique. VARCHAR et CHAR peuvent prendre jusqu' 64 ko. Un index de hashage peut tre utilis avec UNIQUE. Cela vous permettra d'avoir un index UNIQUE sur toute combinaison de colonnes de la table. Vous ne pourrez pas utiliser un index UNIQUE pour une recherche.
698
--delay-key-write=ALL N'crit pas les buffers de cls entre deux critures dans une table MyISAM. Note : Si vous fates cela, vous ne devez pas utiliser les tables MyISAM avec d'autres programmes (comme depuis un autre serveur MySQL ou avec myisamchk) lorsque la table est utilise. Sinon, vous allez obtenir une corruption d'index. Utiliser --external-locking n'aidera pas les tables qui utilisent --delay-key-write. See Section 5.2.1, Options de ligne de commande de mysqld . Les variables systmes suivantes affectent le comportement des tables MyISAM : bulk_insert_buffer_size La taille du cache d'index lors des insertions de masse. Note : c'est une limite par par thread! myisam_max_extra_sort_file_size Utilise pour aider MySQL dcider quand utiliser le cache de cl lent mais sr. Note : ce paramtre tait donn en megaoctets avant MySQL 4.0.3, et en octets depuis 4.0.3. myisam_max_sort_file_size N'utilise pas la mthode de tri rapide pour crer un index, si un fichier temporaire dpasserait cette taille. Note : ce paramtre tait donn en megaoctets avant MySQL 4.0.3, et en octets depuis 4.0.3. myisam_sort_buffer_size La taille du buffer lors de la restauration de table. See Section 5.2.3, Variables serveur systme . La restauration automatique est active si vous lancez mysqld avec l'option --myisam-recover. Dans ce cas, lorsque le serveur ouvre la table MyISAM, il vrifie si la table a t marque comme crashe ou si le compteur de tables ouvertes n'est pas zro ou si le serveur utilise --skipexternal-locking. Si une des conditions prcdente est vraie, il arrive ceci : La table est analyse pour rechercher des erreurs. Si le serveur trouve une erreur, il essaie de faire une rparation rapide (avec le tri, sans recrer de donnes). Si la rparation choue cause d'une erreur dans le fichier de donnes (par exemple, une erreur de cl), le serveur essaie nouveau, en re-crant le fichier de donnes. Si la rparation choue encore, le serveur essaie encore avec une ancienne mthode rparation (crire les lignes les unes aprs les autres, sans tri). Cette mthode devrait tre capable de rparer tout les types d'erreurs, et elle occupe peu de place sur le disque. Si la restauration n'est toujours pas capable de retrouver toutes les lignes, et que vous n'avez pas spcifi l'option FORCE dans la valeur de l'option --myisam-recover, la rparation automatique s'annule, avec le message d'erreur suivant :
Error: Couldn't repair table: test.g00pages
Si vous spcifiez la valeur FORCE, une alerte comme celle-ci sera crite dans les logs :
Warning: Found 344 of 354 rows when repairing ./test/g00pages
Notez que si la valeur de restauration automatique inclut BACKUP, le processus de restauration crera des fichiers avec des noms de la forme tbl_name-datetime.BAK. Vous devriez avoir une tche
699
rgulire avec cron pour supprimer automatiquement ces fichiers dans les bases de donnes pour nettoyer le volume.
700
N'a pas tre rorganis (avec myisamchk) sauf si un grand nombre de lignes est effac et que vous voulez retourner l'espace libr au systme d'exploitation. Require usuellement plus d'espace disque que les tables dynamiques.
Il y a un aussi un supplment de 6 octets pour chaque lien. Une ligne de format dynamique utilise un lien chaque fois qu'une modification cause un agrandissement de la ligne. Chaque nouveau bloc li fait au moins 20 octets, pour que le prochain agrandissement utilise aussi ce bloc. Si ce n'est pas le cas, un nouveau bloc sera li, avec un autre cot de 6 octets. Vous pouvez vrifier le nombre de liens dans une table avec la commande myisamchk -ed. Tous les liens sont supprims avec la commande myisamchk -r.
myisampack. Les tables compresses peuvent tre dcompresses avec myisamchk. Pour le moteur de stockage ISAM, les tables compresses peuvent tre compresses avec pack_isam et dcompresses avec isamchk. Les tables compresses ont les avantages suivants : Les tables compresses prennent trs peu d'espace disque. Cela rduit l'espace requis, ce qui est fort utile lors de l'utilisation de petits disques (comme les CD-ROM). Chaque ligne est compresse sparemment (optimisation des accs). L'entte d'un enregistrement est fix (1-3 octets) selon le plus grand enregistrement dans la table. Chaque colonne est compresse diffremment. Quelques un des types de compressions sont : Compression des espaces en suffixe. Compression des espaces en prfixe. Les nombres avec la valeur 0 sont stocks en utilisant 1 octet. Si les valeurs dans une colonne de type entier ont un petit intervalle, la colonne est stocke en utilisant le type le plus petit possible. Par exemple, une colonne BIGINT (8 octets) peut tre stock en tant que colonne TINYINT (1 octet) si toutes les valeurs sont entre 0 et 255. Si une colonne n'a qu'un petit ventail de valeurs, son type est chang en ENUM. Une colonne peut utiliser une combinaison des compressions prcdentes. Peut grer les enregistrements de tailles fixes ou variables.
pendant la slection de donnes partir de cette table. Les requtes ne trouvent pas de lignes dans la table ou retournent des donnes incompltes. Vous pouvez rparer une table corrompue avec REPAIR TABLE. Vous pouvez aussi rparer une table, lorsque mysqld ne fonctionne pas, avec la commande myisamchk. Lorsque mysqld est arrt, vous
702
pouvez vrifier une table avec la commande myisamchk. Voyez la section Section 13.5.2.3, Syntaxe de CHECK TABLE , Section 13.5.2.6, Syntaxe de REPAIR TABLE et Section 5.7.3.1, Syntaxe de l'utilitaire myisamchk . Si vos tables sont souvent corrompues, vous devez essayez de trouver d'o vient le problme ! Dans ce cas, la chose la plus importante savoir est, si la table est corrompue, si le serveur mysqld s'est interrompu. (cela peut tre facilement vrifi en regardant s'il y a une entre rcente restarted mysqld dans le fichier d'erreurs de mysqld). Si ce n'est pas le cas, vous devez essayer d'effectuer une srie de tests. Voyez Section A.4.2, Que faire si MySQL plante constamment ? et Section D.1.6, Faire une batterie de tests lorsque vous faites face un problme de table corrompue .
14.1.4.2. Des clients utilisent la table, ou bien elle n'a pas t ferme correctement
Chaque fichier MyISAM .MYI possde un compteur dans l'entte qui peut tre utilis pour savoir si une table a t ferme Proprement. Si vous obtenez l'avertissement suivant de la part de CHECK TABLE ou myisamchk :
# clients is using or hasn't closed the table properly
cela signifie que le compteur n'est plus synchrone. Cela ne signifie Pas que la table est corrompue, mais que vous devez au moins effectuer une vrification sur la table pour vous assurer de son bon fonctionnement. Le compteur fonctionne de la faon suivante : La premire fois qu'une table est mise jour dans MySQL, un compteur dans l'entte du fichier est incrment. Le compteur ne change pas pour les mises jours suivantes. Lors de la fermeture de la dernire instance d'une table ( cause d'un FLUSH ou qu'il n'y a plus de place dans le cache de la table) le compteur est dcrment si la table n'a pas t mise jour. Lorsque vous rparez la table ou vrifiez quel est en bon tat, le compteur est remis zro. Pour viter les problmes d'interactions avec d'autres processus qui peuvent vrifier la table, le compteur n'est pas dcrment la fermeture si sa valeur tait zro. En d'autres termes, les seuls moyens d'obtenir ce genre d'erreur sont : Les tables MyISAM sont copis sans LOCK et FLUSH TABLES. MySQL a plant entre une mise jour et la fermeture finale. (Notez que la table peut encore tre bonne, vu que MySQL crit toujours pour tout entre deux requtes.) quelqu'un a excut myisamchk --recover ou myisamchk --update-state sur une table qui tait utilise par mysqld. Plusieurs serveurs mysqld utilisent la table et l'un d'eux a excut dessus un REPAIR ou un CHECK pendant qu'elle tait utilise par un autre serveur. Dans ce cas l, l'utilisation de CHECK n'est pas trs grave (mme si vous obtiendrez des avertissements sur les autres serveurs), mais REPAIR doit tre vite vu qu'elle remplace actuellement le fichier de donnes part un nouveau, ce qui n'est pas signal aux autres serveurs. En gnral, c'est une mauvaise ide que de partager un dossier de donnes avec plusieurs serveurs. Voyez la section Section 5.10, Faire fonctionner plusieurs serveurs MySQL sur la mme machine pour plus de dtails.
Les tables MERGE ont t ajoute en MySQL version 3.23.25. Ce type de table est aussi connu sous le nom de MRG_MyISAM. Le code raisonnablement stable. Une table MERGE est un groupe de tables MyISAM identiques qui sont utilises comme une seule. ``Identique'' signifie que toutes les tables ont la mme structure de colonnes et d'index. Vous ne pouvez pas regrouper des tables qui ont des index dans un ordre diffrent. Toutefois, une ou plusieurs tables peuvent tre compresses avec myisampack. See Section 8.2, myisampack, le gnrateur de tables MySQL compresses en lecture seule . Lorsque vous crez une table MERGE, MySQL cre deux fichiers sur le disque. Les fichiers ont pour nom celui de la table, et ont un extension qui indique le type de fichiers. Le fichier .frm stocke la dfinition de la table, et le fichier .MRG contient les noms des tables qui doivent tre utilises. Originalement, toutes les tables utilises dans la mme table MERGE devaient tre dans la mme base que la table MERGE . Cette restriction a t leve en MySQL 4.1.1. Pour le moment, vous avez simplement besoin des droits de SELECT, UPDATE et DELETE sur les tables que vous avez rassembl dans la table MERGE. L'exemple suivant vous montre comme utiliser les tables MERGE :
mysql> -> -> mysql> -> -> mysql> mysql> mysql> -> -> -> CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)); INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1'); INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2'); CREATE TABLE total ( a INT NOT NULL AUTO_INCREMENT, message CHAR(20), INDEX(a)) TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Notez que la colonne a est indexe dans la table MERGE, mais elle n'est pas dclare comme PRIMARY KEY comme elle peut l'tre dans les tables MyISAM sous-jacente. C'est ncessaire car une table MERGE ne peut pas assurer l'unicit de valeurs travers les tables. Aprs la cration de la table MERGE, vous pouvez faire des commandes comme :
mysql> SELECT * FROM total; +---+---------+ | a | message | +---+---------+ | 1 | Testing | | 2 | table | | 3 | t1 | | 1 | Testing | | 2 | table | | 3 | t2 | +---+---------+
Pour redfinir une table MERGE avec un autre groupe de tables MyISAM, vous pouvez faire ceci : Notez que vous pouvez aussi manipuler le fichier .MRG directement, l'extrieur du serveur MySQL :
shell> cd /mysql-data-directory/current-database shell> ls -1 t1 t2 > total.MRG shell> mysqladmin flush-tables
Effacez la table avec la commande DROP, puis recrez la. Utilisez ALTER TABLE tbl_name UNION=(...) pour redfinir les tables regroupes. Modifiez le fichier .MRG et utilisez la commande FLUSH TABLE sur la table MERGE et toutes les tables sous-jacentes, pour forcer le gestionnaire relire la dfinition.
704
Les tables MERGE peuvent vous aider dans les situations suivantes : Grer facilement un jeu de tables d'historique. Par exemple, vous pourriez placer les donnes de chaque mois dans un fichier spar, en compresser certains avec myisampack puis crer une table MERGE pour les utiliser. Vous donner plus de vitesse. Vous pouvez rpartir les grandes tables en lecture seule dans diffrentes parties du disque. Une table MERGE btie de cette faon peut tre plus rapide qu'une grosse table (vous pouvez aussi et bien sr, utiliser un systme RAID pour arriver aux mmes avantages). Effectuer des recherches plus efficaces. Si vous savez exactement ce que vous recherchez, vous pouvez faire des recherches dans une seule des tables individuelles pour les recherches, et utiliser la table MERGE pour les autres oprations. Vous pouvez mme avoir de nombreuses tables MERGE actives, qui partagent les mme fichiers. Des rparations plus efficaces. Il est plus facile de rparer les fichiers individuels qui sont rassembls dans une table MERGE que de rparer une grande table. Fusion instantane de plusieurs tables en une seule. Une table MERGE utilise les index des tables individuelles. Il n'y a pas besoin de grer un seul index. Cela rend les tables MERGE trs rapides faire ou dfaire. Notez que vous devez spcifier les dfinitions de cls lorsque vous crez la table MERGE! Si vous avez un jeu de table que vous rassemblez dans une grande la demande ou pour un traitement batch, vous devriez utiliser une table MERGE. C'est bien plus rapide, et cela va vous faire conomiser de l'espace disque. Contourner les limitations de taille du systme d'exploitation. Vous pouvez crer un alias ou un synonyme pour une table, en utilisant simplement MERGE sur une seule. Il n'y a pas de cots particulier en performance (hormis quelques appels de fonctions indirects, et des memcpy() avant chaque lecture). Les inconvnients des tables de type MERGE sont : Vous devez utiliser des tables MyISAM identiques pour faire une table MERGE. MERGE utilise plus de pointeurs de fichiers. Si vous utilisez une table MERGE qui couvre 10 tables et que 10 utilisateurs l'utilisent, vous consommez 10*10 + 10 pointeurs de fichiers (10 fichiers de donnes, et 10 utilisateurs avec 10 fichiers d'index). Les lectures de cls sont plus lentes. Lorsque vous fates une lecture sur une cl, le gestionnaire MERGE doit faire une lecture dans tous les fichiers d'index des tables sous-jacentes, pour vrifier lequel est le plus proche de la valeur recherche. Si vous fates une lecture du type "lit le suivant", le gestionnaire de table assemble doit rechercher dans tous les buffers de cls pour la trouver. Uniquement lorsqu'un buffer cl est complet, doit il lire le prochain bloc. Cela rend l'accs aux cls MERGE bien plus lent que les recherches eq_ref, mais pas aussi lent que les recherches de type ref. Voyez la section Section 7.2.1, Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT) pour plus d'informations sur eq_ref et ref.
705
REPLACE ne fonctionne pas. Vous ne pouvez pas utiliser DROP TABLE, ALTER TABLE, DELETE FROM dans clause WHERE, REPAIR TABLE, TRUNCATE TABLE, OPTIMIZE TABLE, ou ANALYZE TABLE sur l'une des tables qui est dans une table MERGE ``ouverte''. Si vous fates cela, la table MERGE va utiliser la table originale, et vous obtiendrez des rsultats tranges. Le plus simple est d'utiliser la commande FLUSH TABLES pour s'assurer qu'aucune table MERGE ne reste ``ouverte.'' Une table MERGE peut pas pas supporter de contrainte de type UNIQUE sur toute la table. Lorsque vous faites une insertion, les donnes vont dans la premire ou la dernire table (suivant la mthode d'insertion INSERT_METHOD=xxx) et cette table MyISAM s'assure que les donnes sont uniques, mais rien n'est fait pour vrifier l'unicit auprs des autres tables MyISAM tables. Avant MySQL 3.23.49, DELETE FROM merge_table utilis sans clause WHERE va uniquement dtruire la table assemble, mais ne va pas toucher les tables sous-jacentes. En fait, le fichier .MRG est effac, mais pas les tables. RENAME TABLE utilis sur une table de type MERGE peut corrompre la table. Cela sera corrig en MySQL 4.1.x. La cration d'une table de type MERGE ne vrifie pas si les tables sous-jacentes sont compatibles. Si vous utilisez une table MERGE de cette faon, vous devriez rencontrer des problmes trs tranges. L'ordre des index dans la table MERGE et ses tables sous-jacentes doit tre le mme. Si vous utilisez la commande ALTER TABLE pour ajouter un index de type UNIQUE une table qui est utilise dans une table assemble MERGE, puis que vous utilisez ALTER TABLE pour ajouter un index normal dans la table MERGE, l'ordre des cl sera diffrent suivant les tables, si jamais il y avait une vieille cl non unique. Ceci est d au fait que ALTER TABLE place les cls UNIQUE avant les cls normales, pour tre capable de dtecter les doublons le plus tt possible. DROP TABLE sur une table qui est utilis par une table MERGE ne fonctionne pas sous Windows car le gestionnaire de MERGE garde les connexions vers les tables caches sous la couche MySQL. Comme Windows ne vous permet pas d'effacer une table qui est ouverte, vous devez d'abord fermer toute les tables MERGE (avec la commande FLUSH TABLES) ou effacer la table MERGE avant de pouvoir effacer la table dsire. Nous allons corriger lorsque nous introduirons les vues. VIEWs.
Les tables HEAP utilisent un index de hachage, et sont stockes en mmoire. Elles sont trs rapides, mais si MySQL plante, vous perdrez toutes vos donnes. La table continuera d'exister car leur dfinition est stocke sur le serveur, dans le fichier .frm mais le contenu sera perdu au redmarrage du serveur. Les tables HEAP sont trs pratiques pour tre des tables temporaires. Voici un exemple qui montre comment crer, utiliser et dtruire une table MEMORY :
mysql> CREATE TABLE test TYPE=MEMORY -> SELECT ip,SUM(downloads) AS down -> FROM log_table GROUP BY ip; mysql> SELECT COUNT(ip),AVG(down) FROM test; mysql> DROP TABLE test;
706
Les tables MEMORY ont les caractristiques suivantes : Les donnes pour les tables HEAP sont allous par petits blocs. Les tables sont 100% dynamiques (en insertion). Aucune zone de dbordement ou d'espace de cl supplmentaire n'est ncessaire. Les lignes effaces sont places dans une liste, prtes tre rutilises. Les tables MEMORY peuvent avoir jusqu' 32 index par table, 16 colonnes par index, et un maximum de 500 pour la tailles des cls. Avant MySQL 4.1, le moteur MEMORY n'implmentait que des index hash. Depuis MySQL 4.1, Les index hash sont le type par dfaut, mais vous pouvez spcifier explicitement que l'index MEMORY doit tre de type HASH ou BTREE en ajoutant la clause USING :
CREATE TABLE (id INT, ENGINE = CREATE TABLE (id INT, ENGINE = lookup INDEX USING HASH (id)) MEMORY; lookup INDEX USING BTREE (id)) MEMORY;
Les caractristiques gnrales des hash et B-tree sont dcrites dans la section Section 7.4.5, Comment MySQL utilise les index . Vous pouvez avoir des cls non-uniques dans une table MEMORY. (C'est une fonctionnalit rare pour les index hash). Si vous avez un index hash sur une table HEAP avec un haut degr de duplication (de nombreux valeurs d'index contiennent la mme valeur), les modifications dans cette table peuvent affecter les valeurs des cls et toutes les suppressions seront plus lentes. Le facteur de ralentissement est proportionnel au degr de duplication (ou inversement proportionnel la cardinalit). Depuis la version 4.1, MySQL supporte les index BTREE les tables HEAP, que vous pouvez utiliser pour viter le problme. Les tables HEAP utilisent un format de ligne fixe. HEAP ne supporte pas les colonnes de type BLOB/TEXT. HEAP ne supporte pas les colonnes de type AUTO_INCREMENT. Avant MySQL 4.0.2, HEAP ne supportait les index sur les valeurs NULL. Les tables HEAP sont partages entre tous les clients (comme une autre table). La caractristique des tables MEMORY qui fait que les tables sont stockes en mmoire est partage avec les tables internes que le serveur cre la vole lors du traitement des requtes. Cependant, les tables internes ont aussi la capacit d'tre converties en tables disques automatiquement, si elles deviennent trop grandes. La taille limite est dtermine par la valeur de tmp_table_size. Les tables MEMORY ne peuvent pas tre converties en tables disques. Pour vous assurer que vous ne fates rien de dangereux pour le serveur, vous pouvez utiliser la variable systme max_heap_table_size pour imposer une taille maximale aux tables MEMORY. Pour des tables individuelles, vous pouvez utiliser l'option de table MAX_ROWS avec la commande CREATE TABLE. Vous avez besoin de suffisamment de mmoire pour accepter toutes les tables HEAP que vous allez utiliser simultanment. Pour librer de la mmoire, vous devez excuter la commande DELETE FROM heap_table, TRUNCATE heap_table ou DROP TABLE heap_table. Si vous voulez remplir les tables MEMORY au lancement du serveur MySQL, vous pouvez utiliser l'option --init-file. Par exemple, vous pouvez mettre les commandes telles que INSERT INTO ... SELECT et LOAD DATA INFILE pour lire des donnes dans une source de donnes persistante. See Section 5.2.1, Options de ligne de commande de mysqld .
707
Si vous utilisez la rplication, les tables MEMORY du matre se vident l'extinction. Rependant, un esclave peut ne pas s'apercevoir que ces tables ont t vides, et il risque de retourner des donnes invalides si vous l'utilisez. Depuis MySQL 4.0.18, lorsqu'une table MEMORY est utilise sur le matre, il met une commande DELETE FROM automatiquement, pour synchroniser l'esclave et le matre. Notez que mme avec cette stratgie, l'esclave aura des donnes obsoltes entre le moment o le matre s'teint et celui o il est redmarr. Mais si vous utilisez l'option --init-file pour remplir la table MEMORY au lancement du serveur, elle s'assurera que cette intervalle est bien null. La mmoire ncessaire pour les tables HEAP sont :
SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2) + ALIGN(length_of_row+1, sizeof(char*))
ALIGN() reprsente un facteur d'arrondi, car la taille de la ligne doit faire exactement un multiple de la taille du pointeur de char. sizeof(char*) vaut 4 sur les machines 32 bits et 8 sur une machine 64 bits.
708
Installation de BDB
Linux 2.x Alpha Linux 2.x AMD64 Linux 2.x IA64 Linux 2.x s390 Max OS X Note : La liste ci-dessus n'est pas complte; nous la mettrons jour au fur et mesure que nous recevrons des informations ce propos. Si, aprs avoir compil MySQL avec le support des tables BDB tables, obtenez l'erreur suivante dans le fichier de logs quand vous dmarrez mysqld :
bdb: architecture lacks fast mutexes: applications cannot be threaded Can't init databases
Cela signifie que les tables BDB ne sont pas supportes par votre architecture. Dans ce cas, vous devez recompiler MySQL sans le support des tables BDB.
Pour plus d'informations, voyez Section 2.3, Installer MySQL sur d'autres systmes type Linux , Section 5.1.2, mysqld-max, la version tendue du serveur mysqld et See Section 2.4, Installation de MySQL avec une distribution source .
709
--bdb-shared-data Dmarrer Berkeley DB en mode multi-processus (Ne pas utiliser DB_PRIVATE lors de l'initialisation de Berkeley DB) --bdb-tmpdir=rpertoire Rpertoire des fichiers temporaires de Berkeley DB. --skip-bdb Dsactive l'utilisation des tables BDB. See Section 5.2.1, Options de ligne de commande de mysqld . Les variables systmes suivante affectent le comportement des tables BDB : bdb_max_lock Le nombre maximal de verrous actifs sur une table BDB. See Section 5.2.3, Variables serveur systme . Si vous utilisez --skip-bdb, MySQL n'initialisera pas la bibliothque Berkeley DB et cela conomisera beaucoup de mmoire. Bien sr, vous ne pouvez pas utiliser les table BDB si vous utilisez cette option. Si vous essayez de crer une table BDB, MySQL crera une table MyISAM la place. Normalement, vous devez dmarrer mysqld sans --bdb-no-recover si vous avez l'intention d'utiliser des tables BDB. Cela peut cependant vous poser des problmes si vous essayez de dmarrer mysqld alors que des fichiers de log BDB sont corrompus. See Section 2.5.2.3, Problmes de dmarrage du serveur MySQL . Vous pouvez spcifier le nombre maximal de verrous avec bdb_max_lock (10000 par dfaut) que vous pouvez activer sur une table BDB. Vous devez l'augmenter si vous obtenez des erreurs du type :
bdb: Lock table is out of available locks Got error 12 from ...
lorsque vous avez fait de longues transactions ou quand mysqld doit examiner beaucoup de lignes pour calculer la requte. Vous pouvez aussi changer les options binlog_cache_size et max_binlog_cache_size si vous utilisez de grandes transactions multi-lignes. See Section 5.9.4, Le log binaire .
BerkeleyDB est un synonyme de BDB pour les options ENGINE et TYPE. Le moteur de tables BDB fournit un modle transactionnel. La faon dont vous utilisez ces tables dpend du mode de validation : Si vous utilisez le mot d'auto-validation (ce qui est le mode par dfaut), les modifications dans les tables BDB sont valides immdiatement, et ne peuvent pas tre annules.
710
Si vous utilisez le mode de validation manuel, les modifications ne seront rendues permanentes que si vous envoyez la commande COMMIT. AU lieu de valider, vous pouvez aussi annuler avec la commande ROLLBACK pour dtruire les modifications. Vous pouvez dmarrer une transaction avec la commande BEGIN WORK pour suspendre le mode d'auto-validation, ou avec SET AUTOCOMMIT=0 pour le dsactiver explicitement. See Section 13.4.1, Syntaxes de START TRANSACTION, COMMIT et ROLLBACK . Le moteur de tables BDB a les caractristiques suivantes : Les tables BDB peuvent avoir jusqu' 31 index par table, 16 colonnes par index, et un taille maximale de 1024 octets par index (500 octets avant MySQL 4.0). MySQL requiert une cl PRIMARY KEY dans chaque table BDB pour tre capable de faire rfrence aux lignes prcdemment lues. Si vous n'en crez pas, MySQL va grer une telle cl de manire cache. La cl cache a une taille de 5 octets, et est incrmente chaque nouvelle insertion. La cl PRIMARY KEY sera plus rapide que n'importe quelle autre cl, car la PRIMARY KEY est stocke avec les donnes. Comme les autres cls sont stockes sous la forme donnes + PRIMARY KEY, il est important de garder une cl PRIMARY KEY aussi courte que possible pour conomiser de l'espace disque, et amliorer la vitesse. Ce comportement est similaire celui d'InnoDB, o des cls primaires courtes conomisent de l'espace pour la cl primaire et pour les index secondaire aussi. Si toutes les colonnes auxquelles vous accdez dans une table BDB font partie du mme index dans la cl primaire, alors MySQL peut excuter la requte sans avoir lire la ligne elle-mme. Dans une tableMyISAM, ce qui prcde n'est valable que si les colonnes font partie du mme index. Scanner squentiellement est plus lent qu'avec MyISAM car les tables BDB stockent les donnes dans un fichier B-tree et non pas dans un fichier spar. Les cls ne sont pas compresses avec les cls prcdentes, comme pour les tables ISAM et MyISAM. En d'autres termes, les informations de cls prennent un peu plus d'espace pour les tables BDB, comparativement aux tables MyISAM qui n'utilisent pas l'option PACK_KEYS=0. Il y a souvent des trous dans les tables BDB pour vous permettre d'insrer de nouvelles lignes au milieu de l'arbre de donnes. Cela rend les tables BDB un peu plus grandes que les tables MyISAM. SELECT COUNT(*) FROM table_name est trs lent, car les tables BDB ne maintiennent pas un compte de leur lignes dans la table. L'optimiseur a besoin de connatre une approximation du nombre de lignes dans la table. MySQL rsout ce problme en comptant les insertions et en conservant ce compte dans un segment spar pour chaque table BDB. Si vous ne faites pas souvent de DELETE ou ROLLBACK, ce nombre sera plutt prcis pour l'optimiseur MySQL, mais comme MySQL ne stocke ce nombre qu' la fermeture de la table, il peut tre incorrecte si MySQL s'interrompt inopinment. Cela ne doit pas tre fatal si ce nombre n'est pas 100% correct. Vous pouvez forcer la mise jour de ce nombre avec la commande ANALYZE TABLE ou OPTIMIZE TABLE. Section 13.5.2.1, Syntaxe de ANALYZE TABLE . Section 13.5.2.5, Syntaxe de OPTIMIZE TABLE . Le verrouillage interne des tables BDB est fait au niveau page. LOCK TABLES fonctionne avec les tables BDB sur les autres tables. Si vous n'utilisez pas le verrou LOCK TABLE, MySQL va poser un verrou interne multiple sur la table, pour s'assurer que la table est bien verrouille, si un autre thread tente de poser un verrou. Pour permettre les annulations de transaction, BDB gre un fichier de log. Pour maximiser les performances, vous devriez placer ces fichiers sur un autre disque que celui de votre base, en utilisant l'option --bdb-logdir.
711
MySQL fait un point de contrle chaque fois qu'un nouveau fichier de log BDB est dmarr, et supprime les fichiers de logs anciens qui ne sont pas utiles. Si vous excutez la commande FLUSH LOGS, vous placerez un nouveau point de contrle pour les tables Berkeley DB. Pour la restauration aprs crash, vous devez utiliser les sauvegardes et le log binaire de MySQL. See Section 5.7.1, Sauvegardes de base de donnes . Attention : si vous effacez les anciens fichiers de log qui sont en cours d'utilisation, BDB ne sera pas capable de faire la restauration et vous risquez de perdre des donnes. L'application doit toujours tre prte grer des cas o une modification sur une table BDB peut tre annule, ou une lecture abandonne pour cause de blocage de verrous. Si vous atteignez la capacit maximale du disque avec la table BDB, vous allez obtenir une erreur (probablement l'erreur 28), et la transaction va s'annuler. C'est un comportement diffrent des tables MyISAM et ISAM qui vont attendre que mysqld ait trouv de l'espace disque avant de continuer.
14.4.5. Ce que nous devons corriger dans BDB dans un futur proche :
Il est trs lent d'ouvrir de nombreuses tables BDB en mme temps. Si vous utilisez des tables BDB, il ne faut pas avoir un cache de table trop grand (par exemple, > 256) et vous devriez utiliser l'option --no-auto-rehash avec le client mysql. Nous envisageons de corriger cela en partie en version 4.0. SHOW TABLE STATUS ne fourni pas encore beaucoup d'informations pour les tables BDB tables. Optimiser les performances. Ne pas utiliser les verrous de pages lorsque l'on scanne les tables.
cela signifie que la nouvelle version de BDB ne supporte pas l'ancien format de log. Dans ce cas, vous devez effacer tous les logs BDB du dossier des donnes (les fichiers dont le nom est au format log.XXXXXXXXXX) et redmarrer mysqld. Nous vous recommandons aussi d'excuter un mysqldump --opt de vos vieilles tables BDB, de les effacer, puis de restaurer les copies. Si vous n'tes pas en mode auto-commit et que vous effacez une table qu'un autre thread utilise, vous obtiendrez le message d'erreur suivant dans le fichier d'erreurs de MySQL :
001119 23:43:56 bdb: Missing log fileid entry
712
001119 23:43:56
bdb:
Ce n'est pas une erreur trs grave mais nous ne vous recommandons pas d'effacer vos tables si vous n'tes pas en mode auto-commit, tant que ce problme n'est pas rsolu (la solution n'est pas triviale).
713
Avec le moteur de table MySQL FEDERATED, il n'y a pas de donnes locales pour la table : par exemple, il n'y a pas de fichier .MYD. Au lieu de cela, un serveur de base de donnes distant se charge de stocker les donnes de la table. Cela impose l'utilisation du protocole client MySQL pour lire, crire et effacer les donnes. La lecture des donnes est initie via la commande SQL SELECT * FROM tbl_name. Pour lire le rsultat, les lignes sont lues avec la fonction C mysql_fetch_row(), puis converties en colonnes tel que la commande SELECT l'attent, au format demand par le gestionnaire FEDERATED. Le processus de base est le suivant : 1. Les commandes SQL sont reues localement. 2. Les commandes sont passes au gestionnaire MySQL (au format du gestionnaire) 3. Les commandes sont passes l'API client MySQL (les donnes sont converties en appel SQL) 4. Les commandes seront recues par la base de donnes distante, via l'API client. 5. Les rsultats, s'il y en a, sont convertis au format du gestionnaire. 6. Les rsultats sont reus localement.
La table ENGINE peut utiliser n'importe quel moteur de stockage; la table n'est pas obligatoirement une table MyISAM. Ensuite, crez une table FEDERATED pour accder la table distante. Le serveur o vous crez la table FEDERATED est le ``client-serveur''. Sur ce serveur, crez une table comme ceci :
CREATE TABLE federated_table ( id int(20) NOT NULL auto_increment, name varchar(32) NOT NULL default '', other int(20) NOT NULL default '0', PRIMARY KEY (id), KEY name (name), KEY other_key (other) ) ENGINE=FEDERATED DEFAULT CHARSET=latin1 COMMENT='mysql://root@remote_host:9306/federated/test_table';
La structure de cette table doit tre exactement la mme que la table distante, hormis le moteur ENGINE qui doit valoir FEDERATED et l'option de table COMMENT qui contient la chane de connexion pour spcifier au moteur FEDERATED comment se connecter au serveur distant.
714
Le moteur FEDERATED ne cre que le fichier test_table.frm dans la base de donnes federated. Les informations d'hte distant reprsente le serveur sur lequel votre serveur se connecte en tant que ``client'', et les informations de tables et de bases qui reprsentent les ``donnes''. Dans l'exemple, le serveur distant va fonctionne en tant que remote_host sur le port 9306 : il est recommand de lancer ce serveur pour qu'il soit en attente sur le port 9306. La forme gnrale de la chane de connexion de l'option COMMENT est la suivante :
scheme://user_name[:password]@host_name[:port_num]:/db_name/tbl_name
Seul le protocole mysql est support comme valeur pour scheme actuellement, et le numro de port ainsi que le mot de passe sont optionnels. Voici quelques exemples de chanes de connexion :
COMMENT='mysql://username:password@hostname:port/database/tablename' COMMENT='mysql://username@hostname/database/tablename' COMMENT='mysql://username:password@hostname/database/tablename'
L'utilisation de COMMENT pour spcifier la chane de connexion n'est pas optimale, et nous allons probablement changer cela en MySQL 5.1. Gardez cela en tte que lorsque vous utilisez les tables FEDERATED, car cela vous obligera faire des modifications dans un avenir proche. De mme, comme le mot de passe est stock en texte clair dans la chane, il peut tre vu par un autre utilisateur avec un accs SHOW CREATE TABLE ou SHOW TABLE STATUS pour la table FEDERATED.
715
Si vous ouvrez le fichier test.CSV issu du dossier de donnes, aprs avoir excut les commande cidessus, vous trouverez le contenu suivant :
"1","record one" "2","record two"
716
Tables ISAM
obsolte. Depuis MySQL 4.1, il est inclus dans le source, mais pas activ dans les versions binaires. Il disparatra en MySQL 5.0. Les versions embarques de MySQL ne supportent pas les tables ISAM par dfaut. Etant donn l'obsolescence de ISAM, et comme MyISAM est une version amliore de ISAM, il est recommand de convertir les tables ISAM en MyISAM ds que possible. Pour convertir une table ISAM en MyISAM, utilisez la commande ALTER TABLE :
mysql> ALTER TABLE tbl_name TYPE = MYISAM;
Pour plus d'informations sur MyISAM, voyez Section 14.1, Le moteur de tables MyISAM . Chaque table ISAM est stocke dans trois fichiers. Les fichiers portent le nom de la table, et ont une extension qui indique leur type. Un fichier .frm stocke la dfinition de table. Le fichier de donnes a pour suffixe .ISD. Le fichier d'index a l'extension .ISM. ISAM utilise les index B-tree. Vous pouvez rparer ou vrifier une table ISAM avec l'utilitaire isamchk. See Section 5.7.3.7, Utiliser myisamchk pour restaurer une table . ISAM possde les fonctionnalits/proprits suivantes : Clefs compresses et de tailles fixes Enregistrements de taille fixe ou dynamique 16 clefs avec 16 parties de clefs/clefs Taille maximale de la clef 256 (dfaut) Les donnes sont enregistres au format machine; c'est rapide, mais c'est dpendant de la machine/ systme d'exploitation. La plupart des choses vraies pour les tables MyISAM le sont pour les tables ISAM. La diffrence majeure compares aux tables MyISAM sont : Les tables ISAM ne sont pas portables directement entre les plates-formes/systmes d'exploitation. Ne peut pas grer les tables de taille suprieure 4 Go. Ne supporte que la compression des prfixes sur les chanes de caractres. Limites de clefs plus basses. Les tables taille de ligne dynamique sont plus fragmentes. Ne supporte pas les tables MERGE. Les tables sont vrifies et rpares avec isamchk plutt que myisamchk. Les tables sont compresses avec pack_isam plutt que myisampack. Impossible d'utiliser les commandes BACKUP TABLE et RESTORE TABLE. Impossible d'utiliser les commandes d'entretien CHECK TABLE, REPAIR TABLE, OPTIMIZE TABLE et ANALYZE TABLE. Pas de support pour les index en texte plein ou spatiaux. Pas de support pour les jeux de caractres multiples. Les index ne peuvent pas tre assigns des caches de cls spcifiques.
717
718
719
720
Configuration InnoDB
Max ne diffrent qu'au niveau de ce programme. Voyez Section 2.3, Installer MySQL sur d'autres systmes type Linux et Section 5.1.2, mysqld-max, la version tendue du serveur mysqld . Pour compiler MySQL avec le support InnoDB, tlchargez MySQL MySQL-3.23.34a ou plus rcent sur le site de http://www.mysql.com/ et configurez MySQL avec l'option --with-innodb. Voyez le manuel MySQL pour les instructions d'installation de MySQL. See Section 2.4, Installation de MySQL avec une distribution source . Pour utiliser les tables InnoDB dans MySQL-Max version 3.23 vous devez spcifier des paramtres dans la section [mysqld] du fichier de configuration my.cnf, ou, sous Windows, dans my.ini. Si vous ne configurez pas InnoDB dans le fichier d'options, InnoDB ne dmarrera pas. Depuis MySQL 4.0, InnoDB utilise des valeurs par dfaut pour ces paramtres si vous n'en spcifiez pas. Cependant, il est recommand d'utiliser des valeurs appropries pour votre systme afin d'obtenir performances valables. Le paramtrage est dtaill dans la section Section 15.4, Configuration InnoDB .) Au minimum, en version 3.23, vous devez spcifier avec innodb_data_file_path o seront les fichiers de donnes, et les tailles de fichiers. Si vous ne mentionnez pas innodb_data_home_dir dans my.cnf, le comportement par dfaut est de crer ces fichiers dans le dossier de donnes datadir de MySQL. Si vous spcifiez innodb_data_home_dir comme une chane vide, vous pouvez donner des chemins absolus vos fichiers de donnes dans innodb_data_file_path. Le minimum est de modifier la section [mysqld] la ligne
innodb_data_file_path=ibdata:30M
Mais pour obtenir de bonnes performances, il est recommand de spcifier des options supplmentaires. See Section 15.5, Options de dmarrage InnoDB .
Par exemple, une configuration qui cre explicitement un espace de table, avec les mmes caractristiques que la configuration par dfaut de MySQL 4.0 est :
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend
721
Configuration InnoDB
Cette configuration cre un fichier de donnes de 10 Mo ibdata1, auto-croissant. Il n'y a pas de dossier de sauvegarde d'indiqu : par dfaut, c'est le dossier de donnes de MySQL. Les tailles sont spcifies avec les suffixes M et G pour indiquer des megaoctets et des gigaoctets. Une table contenant 50 Mo de donnes, appele ibdata1 et un fichier 50 Mo auto-croissant, appel ibdata2 dans le dossier de donnes est configur comme ceci :
[mysqld] innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
La syntaxe complte de la spcification de fichier de donnes inclut le nom du fichier, sa taille, et diffrents attributs :
file_name:file_size[:autoextend[:max:max_file_size]]
L'attribut autoextend et ceux qui le suivent peuvent tre utiliss uniquement pour le dernier fichier de donnes de la ligne innodb_data_file_path. autoextend est disponible depuis MySQL 3.23.50 et 4.0.2. Si vous spcifiez le dernier fichier avec l'option autoextend, InnoDB va augmenter la taille du dernier fichier de donnes jusqu' ce qu'il n'y ait plus de place dans l'espace de table. Les incrments se feront par bloc de 8 Mo. Si le disque est plein, vous aurez ajouter un autre fichier sur un autre disque. Les informations pour reconfigurer une table existante sont donnes dans la section Section 15.8, Ajouter et retirer des donnes et des logs InnoDB . InnoDB ne connat pas la taille maximale des fichiers sur votre systme : il faut donc tre prudent lorsque la taille des fichiers ne peut dpasser 2 Go. Pour spcifier la taille maximale des fichiers autocroissant, utilisez l'attribut max. La ligne de configuration suivante permet au fichier ibdata1 de crotre jusqu' 500 Mo :
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend:max:500M
InnoDB cre les fichiers de donnes dans le dossier de donnes de MySQL. Pour spcifier explicitement un dossier, utilisez l'option innodb_data_home_dir. Par exemple, pour crer deux fichiers appels ibdata1 et ibdata2 mais pour les placer dans le dossier /ibdata, configurez InnoDB comme ceci :
[mysqld] innodb_data_home_dir = /ibdata innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
Note : InnoDB ne cre pas les dossiers : assurez vous que /ibdata existe avant de lancer le serveur. C'est aussi vrai pour les fichiers de log. Utilisez la commande Unix et DOS mkdir pour crer les dossiers ncessaires. InnoDB forme le chemin de chaque fichier en concatnant textuellement la valeur de innodb_data_home_dir devant le nom du fichier, en ajoutant un slash si ncessaire. Si l'option innodb_data_home_dir n'est pas mentionne dans my.cnf, la valeur par dfaut est le dossier ``point'' ./, c'est dire le dossier de donnes de MySQL. Si vous spcifier l'option innodb_data_home_dir sous forme de chane vide, vous pouvez spcifier des noms de chemins absolus dans la valeur de innodb_data_file_path. L'exemple ci-dessous est quivalent au prcdent :
[mysqld] innodb_data_home_dir = innodb_data_file_path=/ibdata/ibdata1:50M;/ibdata/ibdata2:50M:autoextend
Exemple de fichier my.cnf simple Supposons que vous avez un serveur avec 128 Mo de RAM et un disque dur. Voici un exemple de configuration de fichier my.cnf ou my.ini pour InnoDB. Nous
722
Configuration InnoDB
supposons que vous excutez MySQL-Max-3.23.50 ou plus rcent, ou MySQL-4.0.2 ou plus rcent, qui utilisent l'attribut autoextend. Cet exemple devrait convenir une majorit d'utilisateurs, Unix et Windows, qui ne souhaitent pas rpartir leur fichiers de donnes InnoDB et leurs logs sur plusieurs disques. Cette configuration cre un fichier de donnes auto-croissant, appel ibdata1 et deux fichiers de log InnoDB ib_logfile0 et ib_logfile1 dans le dossier de donnes MySQL. De plus, le petit fichier d'archive InnoDB ib_arch_log_0000000000 sera plac dans datadir.
[mysqld] # Vous pouvez placer d'autres options MYSQL ici # ... # Le fichier de donnes doit contenir vos donnes et index. # Assurez vous que vous avez l'espace disque ncessaire. innodb_data_file_path = ibdata1:10M:autoextend # # Utilisez un buffer de taille 50 80 % de votre mmoire serveur set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=10M # # Utilisez un fichier de log de taille 25 % du buffer mmoire set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1
Vrifiez que le serveur MySQL a les droits de crer ces fichiers dans le datadir. Plus gnralement, le serveur doit avoir les droits d'accs dans les dossiers o il va crer des fichiers, de donnes ou de log. Notez que le fichier de donnes doit tre infrieure 2 Go sur certains systmes d'exploitation. La taille combine des fichiers de log doit tre infrieure 4 Go. La taille combine des fichiers de donnes doit tre infrieure 10 Go. Lorsque vous crez pour la premire fois une base de donnes InnoDB, il est mieux de lancer le serveur depuis la commande en ligne. InnoDB va afficher des informations sur la cration de la base, et vous verrez commence a se passe. Voyez la section plus bas, pour une illustration. Par exemple, sous Windows, vous pouvez dmarrer mysqld-max.exe, qui est stock dans C:\mysql\bin, vous pouvez le dmarrer comme ceci :
C:\> C:\mysql\bin\mysqld-max --console
Si vous n'envoyez par de donnes sur l'cran, vrifiez le fichier de log pour savoir ce que InnoDB a indiqu durant le lancement. Voyez Section 15.6, Crer des bases InnoDB pour un exemple des informations affiches par InnoDB. O mettre le fichier d'options sous Windows? Les rgles sous Windows sont les suivantes : Un seul des deux fichiers my.cnf ou my.ini doit tre cr. Le fichier my.cnf doit tre plac dans le dossier racine du disque C:. Le fichier my.ini doit tre plac dans le dossier WINDIR, e.g, C:\WINDOWS ou C:\WINNT. Vous pouvez utiliser la commande SET de MS-DOS pour afficher la valeur de WINDIR :
C:\> SET WINDIR windir=C:\WINNT
Si votre PC utilise un gestionnaire de dmarrage o le C: n'est pas votre disque de dmarrage, alors votre seule option est d'utilise le fichier my.ini. O placer les fichiers d'options sous Unix? Sous Unix, mysqld lit les options dans les fichiers suivants, s'ils existent, et dans cet ordre :
723
Configuration InnoDB
/etc/my.cnf Options globales. COMPILATION_DATADIR/my.cnf Options spcifiques au serveur. defaults-extra-file Le fichier spcifi avec --defaults-extra-file=.... ~/.my.cnf Options spcifiques l'utilisateur. COMPILATION_DATADIR est le dossier de donnes de MySQL qui a t spcifi lors de l'utilisation du script ./configure, avant la compilation de mysqld. (typiquement, /usr/local/mysql/data pour une installation binaire, ou /usr/local/var pour une installation source). Si vous voulez vous assurer que mysqld lit les options uniquement depuis un fichier spcifique, vous pouvez utiliser l'option --defaults-option comme premire option de ligne de commande, au dmarrage du serveur :
mysqld --defaults-file=your_path_to_my_cnf
Exemple de fichier my.cnf complexe : supposons que vous avez un serveur Linux avec 2 Go de RAM et trois disques de 60 Go (situs dans les dossiers /, /dr2 et /dr3. Voici ci-dessous un exemple de configuration possible pour my.cnf, de InnoDB.
[mysqld] # Vous pouvez placer d'autres options MYSQL ici # ... innodb_data_home_dir = # # Le fichier de donnes doivent contenir vos donnes et index. innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # # Utilisez un buffer de taille 50 80 % de votre mmoire serveur # mais assurez vous sous Linux que l'utilisation totale est infrieure 2 Go set-variable = innodb_buffer_pool_size=1G set-variable = innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # # innodb_log_arch_dir doit tre le mme que innodb_log_group_home_dir # (starting from 4.0.6, you can omit it) innodb_log_arch_dir = /dr3/iblogs set-variable = innodb_log_files_in_group=2 # # Utilisez un fichier de log de taille 15 % du buffer mmoire set-variable = innodb_log_file_size=250M set-variable = innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1 set-variable = innodb_lock_wait_timeout=50 # # Dcommentez les prochaines lignes, si vous voulez les utiliser #innodb_flush_method=fdatasync #set-variable = innodb_thread_concurrency=5
Notez que nous avons plac deux fichier de donnes sur des disques diffrents. InnoDB va remplir l'espace de tables jusqu'au maximum. Dans certains cas, les performances seront amliores si les donnes ne sont pas toutes places sur le mme disque physique. Placer les fichiers de log dans des disques spars est souvent une bonne chose. Vous pouvez aussi utiliser des partitions de disques brutes (raw devices) comme fichier de donnes. See Section 15.15.2, Utiliser les raw devices pour l'espace de tables . Attention : en Linux x86, vous devez tre trs prudent, et ne pas utiliser trop de mmoire. glibc va autoriser les processus dpasser la pile de thread, et votre systme va planter. Cela reprsente un risque rel si la valeur de 2 Go :
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
724
Chaque thread va utiliser une pile (souvent 2 Mo, mais les excutables MySQL uniquement 256 ko) et dans le pire des scnarios, sort_buffer + read_buffer_size de mmoire supplmentaire. Depuis MySQL 4.1, vous pouvez utiliser 64 Go de mmoire physique sur Windows 32 bits. Voyez la description de innodb_buffer_pool_awe_mem_mb dans Section 15.5, Options de dmarrage InnoDB . Comment optimiser d'autres paramtres du serveur mysqld? Les valeurs qui conviennent la majorit des utilisateurs sont :
[mysqld] skip-external-locking set-variable = max_connections=200 set-variable = read_buffer_size=1M set-variable = sort_buffer_size=1M # key_buffer vaut de 5 50% # de la RAM disponible, suivant l'utilisation des # tables MyISAM, mais gardez # key_buffer + InnoDB en dea de < 80% de votre RAM set-variable = key_buffer_size=...
725
d'exploitation qui supportent les grands fichiers. Vous pouvez aussi utiliser les partition raw. See Section 15.15.2, Utiliser les raw devices pour l'espace de tables . innodb_data_home_dir La partie commune du chemin de tous les fichiers de donnes InnoDB. Si vous ne mentionnez pas cette option, la valeur par dfaut sera celle du dossier de donnes MySQL. Vous pouvez aussi spcifier une chane vide, et dans ce cas, les chemins spcifis dans innodb_data_file_path seront des chemins absolus. innodb_fast_shutdown Par dfaut, InnoDB fait une purge complte et vide le buffer d'insertion avant une extinction. Ces oprations peuvent prendre beaucoup de temps. Si vous donnez ce paramtre la valeur de 1, InnoDB ignore ces oprations d'extinction. Cette option est valable depuis MySQL 3.23.44 et 4.0.1. Sa valeur par dfaut est 1 depuis la version 3.23.50. innodb_file_io_threads Nombre de pointeurs de fichier de InnoDB. Normalement, cette valeur doit tre de 4, mais sur des disques Windows, les accs peuvent tre amliors en augmentant cette valeur. innodb_file_per_table Cette option fait que InnoDB va stocker chaque table dans un fichier .ibd indpendant. Voyez la section sur les espaces de tables multiples.See Section 15.7.6, Espaces de tables multiples : chaque table InnoDB a son fichier .ibd . Cette option a t ajoute en MySQL 4.1.1. innodb_flush_log_at_trx_commit Normalement, cette option vaut 1, ce qui signifie que lors de la validation de la transaction, les logs sont crits sur le disque, et les modifications faites par la transaction deviennent permanentes, et survivront un crash de base. Si vous souhaitez rduire la scurit de vos donnes, et que vous excutez de petites transactions, vous pouvez donner une valeur de 0 cette option, pour rduire les accs disques. innodb_flush_method (Disponible depuis 3.23.40 et plus rcent) La valeur par dfaut pour cette option est fdatasync. Une autre option est O_DSYNC. innodb_force_recovery Attention : cette option ne doit tre dfinie que dans les cas o vous voulez exporter les donnes d'une base corrompue, dans une situation d'urgence. Les valeurs possibles de cette option vont de 1 6. La signification des valeurs est dcrite dans Section 15.9.1, Forcer la restauration . Par mesure de scurit, InnoDB empche les modifications de donnes si la valeur de cette option est suprieure 0. Cette option est disponible depuis MySQL 3.23.44. innodb_lock_wait_timeout Le dlai d'expiration des transactions InnoDB, en cas de blocage de verrou, avant d'annuler. InnoDB dtecte automatiquement les blocages de verrous et annule alors les transactions. Si vous utilisez la commande LOCK TABLES, ou un autre gestionnaire de table transactionnelles que InnoDB dans la mme transaction, un blocage de verrou peut survenir, et InnoDB ne pourra pas le dtecter. Ce dlai est donc pratique pour rsoudre ces situations. innodb_log_arch_dir Le dossier o les logs complts doivent tre archivs, si nous utilisons l'archivage de logs. La valeur de ce paramtre doit tre actuellement la mme que la valeur de innodb_log_group_home_dir.
726
innodb_log_archive Cette valeur doit tre actuellement de 0. Au moment de la restauration de donnes partir d'une sauvegarde, l'aide des log binaires de MySQL, il n'y a actuellement pas besoin d'archiver les fichiers de log InnoDB. innodb_log_buffer_size La taille du buffer que InnoDB utilise pour crire les log dans les fichiers de logs, sur le disque. Les valeurs utiles vont de 1 Mo 8 Mo. Un grand buffer de log permet aux grandes transactions de s'excuter sans avoir crire de donnes dans le fichier de log jusqu' la validation. Par consquent, si vous avez de grandes transactions, augmenter cette taille va rduire les accs disques. innodb_log_file_size Taille de chaque fichier de log dans un groupe de log, exprim en mga-octets. Les valeurs pratiques vont de 1Mo une fraction de la taille du buffer de log (1 / le nombre de logs, en fait). Plus la taille est grande, moins de points de contrles seront utiliss, rduisant les accs disques. La taille combine des logs doit tre infrieure 4 Go sur les systmes 32 bits. innodb_log_files_in_group Nombre de fichiers de logs dans le groupe de log. InnoDB crit dans ces fichiers de manire circulaire. Une valeur de 2 est recommande. C'est la valeur par dfaut. innodb_log_group_home_dir Le dossier pour les fichiers de logs. Il doit avoir la mme valeur que innodb_log_arch_dir. Si vous ne spcifiez pas de paramtre de log InnoDB, la configuration par dfaut va crer deux fichiers de logs de 5 Mo, appels ib_logfile0 et ib_logfile1 dans le dossier de donnes MySQL. innodb_max_dirty_pages_pct Cette entier va de 0 100. Par dfaut, il vaut 90. Le thread principal de InnoDB essaie de transmettre les pages au pool de buffer, pour qu'un pourcentage maximal de innodb_max_dirty_pages_pct soit encore en attente de flush. Cette option est disponible depuis 4.0.13 et 4.1.1. Si vous avez le droit de SUPER, ce pourcentage peut tre change durant l'excution du serveur :
SET GLOBAL innodb_max_dirty_pages_pct = value;
innodb_mirrored_log_groups Nombre de copies identiques de groupe de log que nous conservons. Actuellement, cette valeur doit tre au minimum de 1. innodb_open_files Ce n'est utile que si vous utilisez les espaces de tables multiples. Cette option spcifie que le nombre maximal de fichier .ibd que InnoDB peut garder ouvert simultanment. La valeur minimum est de 10. La valeur maximum est de 300. Disponible depuis MySQL version 4.1.1. Les pointeurs de fichiers utiliss par .ibd sont rservs pour InnoDB. Ils sont indpendants de ceux spcifis par --open-files-limit, et n'affectent pas les oprations de cache. innodb_thread_concurrency InnoDB essaie de garder le nombre de thread systme concurents infrieur la limite de ce paramtre. La valeur par dfaut est 8. Si vous avez des problmes de performances, et que SHOW INNODB STATUS revle que des threads attendent des smaphores, essayez de diminuer ou augmenter ce paramtre. Si vous avez un serveur avec de nombreux processeurs et disques, vous
727
pouvez essayer d'augmenter la valeur, pour utiliser au mieux les ressources disponibles. Une valeur recommande est la somme du nombre de processeurs et de disques que vous avez. Une valeur de 500 ou suprieur, supprime la vrification de concurence. Cette option a t ajoute depuis MySQL 3.23.44 et 4.0.1.
Une nouvelle base de donnes InnoDB a t cre. Vous pouvez vous connecter au serveur MySQL avec votre client MySQL habituel, comme mysql. Lorsque vous arrtez le serveur MySQL avec mysqladmin shutdown, InnoDB va afficher :
010321 18:33:34 010321 18:33:34 InnoDB: Starting InnoDB: Shutdown mysqld: Normal shutdown mysqld: Shutdown Complete shutdown... completed
Vous pouvez observer vos fichiers de donnes et de logs, et vous apercevrez les fichiers crs. Le dossier de log va aussi contenir un petit fichier appel ib_arch_log_0000000000. Ce fichier est le rsultat de la cration de base, partir duquel InnoDB a dsactiv l'archivage des logs. Lorsque MySQL va tre redmarr, l'affichage sera :
~/mysqlm/sql > mysqld InnoDB: Started mysqld: ready for connections
728
mysqld ne lit pas le bon fichier my.cnf ou my.ini, et donc ne voit pas les options que vous spcifiez. Le disque ou l'espace disque allou est plein. Vous avez cre un sous-dossier dont le nom est le mme que celui d'un fichier de donnes que vous avez spcifi. Il y a une erreur de syntaxe dans innodb_data_home_dir ou innodb_data_file_path. Si quelque chose se passe mal lors de la cration d'une base de donnes InnoDB, vous devez effacer tous les fichiers crs par InnoDB. Cela inclut tous les fichiers de donnes, tous les journaux, les archives. Dans le cas o vous avez dj cres des tables InnoDB, effacez aussi les fichiers .frm (et tous les fichiers .ibd si vous utilisez les espaces de tables multiples) concerns dans le dossier de donnes de MySQL. Vous pourrez alors essayer une nouvelle cration de base de donnes InnoDB.
Cette commande SQL va crer une table et un index sur la colonne A dans la base InnoDB constitue par les fichiers de donnes que vous avez spcifi dans le fichier de configuration my.cnf. De plus, MySQL va crer un fichier CUSTOMER.frm dans le dossier de donnes de MySQL test. En interne, InnoDB va ajouter une entre dans son propre dictionnaire de donnes une entre pour la table 'test/CUSTOMER'. De cette faon, vous pouvez crer plusieurs table avec le mme nom de CUSTOMER, mais dans d'autres bases MySQL, et les noms de seront pas en conflit avec InnoDB. Vous pouvez demander la quantit d'espace disponible dans l'espace de tables InnoDB avec la commande de statut de MySQL pour toutes les tables de type TYPE = InnoDB. La quantit d'espace disponible apparat dans la section de commentaire de la commande SHOW. Par exemple :
SHOW TABLE STATUS FROM test LIKE 'CUSTOMER'
Notez que les statistiques que SHOW vous donne sur les tables InnoDB ne sont que des approximations : elles sont utilises pour les optimisations SQL par MySQL. Les tailles rserves d'index et de table, exprimes en octets, sont prcises.
729
mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) mysql> SET AUTOCOMMIT=0; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO CUSTOMER VALUES (15, 'John'); Query OK, 1 row affected (0.00 sec) mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM CUSTOMER; +------+--------+ | A | B | +------+--------+ | 10 | Heikki | +------+--------+ 1 row in set (0.00 sec) mysql>
Avec des interfaces comme PHP, Perl DBI/DBD, JDBC, ODBC ou l'interface C, vous pouvez envoyer des commandes de contrle de transaction comme COMMIT au serveur sous la forme de chane, tout comme une autre commande SELECT et INSERT. Certaines interfaces proposent des fonctions spcifiques pour les validations et annulations de transactions.
Une fois que toutes les donnes ont t insres dans la table, vous pouvez la renommer. Durant la conversion des grosses tables, vous pouvez donner InnoDB un gros buffer pour rduire les accs disques. Ne le portez pas au-del de 80% de votre mmoire physique. Donnez aussi de gros fichiers de logs, et un buffer de log important. Assurez vous que vous n'allez pas manquer d'espace : les tables InnoDB prennent beaucoup plus d'espace que les tables MyISAM. Si la commande ALTER TABLE manque d'espace, elle va lancer une annulation, et cela peut prendre des heures sur un disque plein. Durant les insertions, InnoDB utiliser un buffer d'insertion pour rassembler les lignes d'index secondaires avec les index, en groupe. Cela conomise beaucoup d'accs disques. Durant l'annulation, ce mcanisme n'est pas utilis, et elle peut prendre jusqu' 30 fois plus de temps. Dans le cas d'un annulation immensment longue, si vous n'avez pas de donnes critiques dans votre base, il est mieux de tuer le processus, d'effacer tous les fichiers, et de recommencer, plutt
730
que d'attendre la fin de l'annulation. Pour la procdure complte, voyez Section 15.9.1, Forcer la restauration .
La valeur lue par la commande est incrment d'une unit, et assigne la colonne auto-incrment et au compteur de table. Si la table est vide, la valeur de 1 est assigne. Si le compteur n'est pas initialis et que l'utilisateur appelle la commande SHOW TABLE STATUS qui affiche les informations de la table T, le compteur est initialis mais pas incrment, et stock pour tre utilis ultrieurement. Notez que dant cette initialisation, nous posons un verrou exclusif en lecture sur la table, et le verrou durera jusqu' la fin de la transaction. InnoDB suit la mme procdure pour initialiser un compteur auto-increment avec une table frachement cre. Notez que si l'utilisateur spcifie la valeur NULL ou 0 pour la colonne AUTO_INCREMENT dans la commande INSERT, InnoDB traitera la ligne comme si aucune valeur n'avait t spcifie, et gnrera une nouvelle valeur. Aprs l'initialisation du compteur d'auto-incrmentation, si un utilisateur insre une ligne qui dfinit explicitement la valeur de la colonne, et que cette valeur est plus grande que la valeur courante du compteur, le compteur prend alors cette valeur. Si l'utilisateur ne spcifie pas de valeur, InnoDB incrmente le compteur d'une unit, et assigne une nouvelle valeur cette colonne. Lorsque vous accdez au compteur d'auto-incrmentation, InnoDB utilise un verrou de table spcial, AUTO-INC, qui reste actif jusqu' la fin de la commande SQL, et non pas la fin de la transaction. Le verrou spcial a t cr pour viter les accs concurrents dans la table qui contient la colonne AUTO_INCREMENT. Deux transactions ne peuvent pas avoir le mme verrou AUTO-INC simultanment. Notez que vous pourriez voir des trous dans la squence de valeur gnre par AUTO_INCREMENT si vous annulez des transactions aprs avoir obtenu une valeur automatiquement. Le comportement du mcanisme auto-increment n'est pas dfini si vous assignez une valeur ngative la colonne, ou si cette dernire dpasse la capacit de la colonne.
Les deux tables doivent tre de type InnoDB, dans la table, il doit y avoir un INDEX o les cls trangres sont listes comme premire colonne, dans le mme ordre, et dans la table rfrence, il doit y avoir un INDEX o les colonnes rfrences sont listes comme premires colonnes, dans le mme ordre. Les prfixes d'index ne sont pas supports pour les cls de contrainte.
731
InnoDB ne cre pas automatiquement les index ncessaires pour les cls trangres : vous devez ls crer vous-mme. Les index sont ncessaires pour acclrer les vrifications de contrainte, et viter un scan de table. Les colonnes correspondantes de la contrainte dans la table et la table de rfrence doivent avoir le mme type, pour viter les conversions lors des comparaisons. La taille et la prsente du signe pour les entiers doit tre les mmes. La taille des chanes doivent tre les mmes. Si vous spcifiez une action SET NULL, assurez vous que vous n'avez pas dclar les colonnes de la table fille NOT NULL. Si MySQL vous retourne une numro d'erreur 1005 lors de la commande CREATE TABLE, et un message d'erreur de numro 150, alors la cration de la table a chou cause de la contrainte de cl trangre, qui n'a pas t correctement formule. Similairement, si une commande ALTER TABLE choue et indique une erreur 150, c'est que la dfinition de la cl trangre est incorrectement formule dans la table modifie. Depuis la version 4.0.13, vous pouvez utiliser la commande SHOW INNODB STATUS pour avoir une explication dtaille de la dernire erreur de cl trangre InnoDB sur le serveur. Depuis la version 3.23.50, InnoDB ne vrifie pas la cl trangre pour les cls trangres ou les cls rfrences qui contienent des valeurs NULL. Une entorse aux standards : si dans la table parente, il y a plusieurs lignes qui ont la mme valeur de cl rfrence, alors InnoDB effectue les vrifications de cl trangres comme si les autres parents avec la mme valeur de cl n'existaient pas. Par exemple, si vous avez dfini une contrainte de type RESTRICT et qu'il y a une ligne fille avec plusieurs lignes parente, InnoDB n'acceptera pas l'effacement d'aucun des parents. Depuis la version 3.23.50, vous pouvez aussi associer la clause ON DELETE CASCADE ou ON DELETE SET NULL avec la contrainte de cl trangre. Les options correspondante ON UPDATE sont disponibles depuis la version 4.0.8. Si ON DELETE CASCADE est spcifie, et qu'une ligne de la table parente est efface, alors InnoDB va automatiquement effacer toute les lignes qui sont dans la table fille et dont les valeurs de cl trangre sont celles rfrences dans la ligne parente. Si ON DELETE SET NULL est spcifie, les lignes filles sont automatiquement modifie pour que la colonne de la cl trangre prenne la valeur de NULL. Une entorse aux standards : si ON UPDATE CASCADE ou ON UPDATE SET NULL cascade rcursivement jusqu' la mme table, elle agira comme pour un RESTRICT. Cela est fait pour viter les boucles infinies des modifications en cascade. Une clause ON DELETE SET NULL auto-rfrente, d'un autre cot, fonctionne depuis la version 4.0.13. La clause ON DELETE CASCADE auto-rfrente toujours fonctionn. Un exemle :
CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id) ) TYPE=INNODB; CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) TYPE=INNODB;
Voici un exemple plus complexe o la table product_order a des cls trangres sur deux tables. La premire cl est un index deux colonnes, dans la table product. Les autres cls sont monocolonnes, dans la table customer :
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) TYPE=INNODB; CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB; CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL,
732
customer_id INT NOT NULL, PRIMARY KEY(no), INDEX (product_category, product_id), FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), FOREIGN KEY (customer_id) REFERENCES customer(id)) TYPE=INNODB;
Depuis la version 3.23.50, InnoDB vous permet d'ajouter une nouvelle cl une table, grce la syntaxe
ALTER TABLE yourtablename ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}] [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
N'oubliez pas de commencer par crer les index ncessaires en premier!. Vous pouvez aussi ajouter des cls trangres reflexives, en utilisant la commande ALTER TABLE. Depuis la version 4.0.13, InnoDB supporte la syntaxe ALTER TABLE pour supprimer une cl trangre :
ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol
Si la clause FOREIGN KEY inclut un nom de contraite CONSTRAINT lors de la cration, vous pouvez utiliser ce nom pour effacer la cl. Les contraintes peuvent porter un nom depuis MySQL 4.0.18. SInon, la valeur fk_symbol est gnr en interne par InnoDB lorsque la cl trangre est cre. Pour savoir quel symbole utiliser pour effacer une cl trangre, utilisez la commande SHOW CREATE TABLE. Par exemple :
mysql> SHOW CREATE TABLE ibtest11c\G *************************** 1. row *************************** Table: ibtest11c Create Table: CREATE TABLE `ibtest11c` ( `A` int(11) NOT NULL auto_increment, `D` int(11) NOT NULL default '0', `B` varchar(200) NOT NULL default '', `C` varchar(175) default NULL, PRIMARY KEY (`A`,`D`,`B`), KEY `B` (`B`,`C`), KEY `C` (`C`), CONSTRAINT `0_38775` FOREIGN KEY (`A`, `D`) REFERENCES `ibtest11a` (`A`, `D`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `0_38776` FOREIGN KEY (`B`, `C`) REFERENCES `ibtest11a` (`B`, `C`) ON DELETE CASCADE ON UPDATE CASCADE ) TYPE=InnoDB CHARSET=latin1 1 row in set (0.01 sec) mysql> ALTER TABLE ibtest11c DROP FOREIGN KEY 0_38775;
Depuis MySQL version 3.23.50, l'analyseur InnoDB autorise l'utilisation des guillemets obliques autour des noms de tables et colonnes dans une clause FOREIGN KEY ... REFERENCES .... Depuis MySQL 4.0.5, l'analyseur InnoDB prend aussi en compte la variable systme lower_case_table_names. Dans InnoDB en versions < 3.23.50, ALTER TABLE et CREATE INDEX ne doivent pas tre utilis avec des tables qui ont des contraintes de cls trangres, ou qui sont rfrences dans des cls trangres : une commande ALTER TABLE supprime toutes les cls trangres qui sont dfinies pour cette table. Vous ne devriez pas utiliser ALTER TABLE sur la table rfrence, mais utiliser DROP TABLE puis CREATE TABLE pour modifier le schma. Lorsque MySQL excute la commande ALTER TABLE, il risque d'utiliser en interne la commande RENAME TABLE, et cela va poser des problmes
733
pour les cls trangres qui reposent sur cette table. Une commande CREATE INDEX est traite par MySQL comme une commande ALTER TABLE, et ces restrictions s'appliquent aussi. Lorsqu'il vrifie les cls trangres, InnoDB pose des verrous de lignes partages sur les lignes des tables qu'il utilise. InnoDB vrifie immdiatement les contraintes de cls trangres : la vrification n'attend pas la validation de la transaction. Si vous voulez ignorer les contraintes de cls trangres durant, par exemple, une opration de LOAD DATA, vous pouvez utiliser la commande SET FOREIGN_KEY_CHECKS=0. InnoDB vous permet d'effacer n'importe quelle table, mme si cela va casser les contraintes de cls trangres qui rfrence cette table. Lorsque vous supprimez une table, la contrainte de cl trangre qui y tait attache est aussi supprime. Si vous recrez une table qui a t supprime, sa dfinition doit se conformer aux contraintes des cls trangres qui la rfrencent. Elle doit avoir les bons types et noms de colonnes, et doit avoir les bonnes cls, comme indiqu ci-dessus. Si ces contraintes ne sont pas vrifies, MySQL vous gratifiera d'une erreur 1005, et vous enverra lire le message numro 150. Depuis la version 3.23.50 InnoDB retourne la dfinition de cl trangre lorsque vous utilisez la commande
SHOW CREATE TABLE tbl_name;
De plus, mysqldump produit aussi les dfinitions correctes de tables, sans oublier les cls trangres. Vous pouvez aussi lister les cls trangres d'une table T avec
SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'
Les contraintes de cls tragnres sont listes dans les commentaires de la table. Lors des vrifications des contraintes, InnoDB pose des verrous de lignes sur les lignes parents ou enfants qu'il utilise. InnoDB vrifie immdiatement les contraintes de cls : la vrification n'est pas reporte jusqu' la validation de la transaction. Pour simplifier l'importation de donnes dans des tables qui ont des contraintes, mysqldump ajoute automatiquement la commande qui met la variable FOREIGN_KEY_CHECKS 0, depuis MySQL version 4.1.1. Cela vite des problmes spcifiques avec les tables qui doivent tre charges dans un ordre particulier. Pour les versions antrieures, vous pouvez dsactiver manuellement la variable depuis mysql lors du chargement du fichier comme ceci :
mysql> SET FOREIGN_KEY_CHECKS = 0; mysql> SOURCE dump_file_name; mysql> SET FOREIGN_KEY_CHECKS = 1;
Cela vous permet de faire l'importation des donnes des tables dans n'importe quel ordre. Cela acclre aussi l'opration d'importation. FOREIGN_KEY_CHECKS est disponible depuis MySQL 3.23.52 et 4.0.3. Mettre FOREIGN_KEY_CHECKS 0 peut aussi tre utile pour les oprations de LOAD DATA. InnoDB permet l'effacement de n'importe quelle table, mme si cela casse les contraintes de cls trangres. Lorsque vous effacez une table, les contraintes dfinies sur cette table sont aussi effaces. Si vous recrez une table qui a t efface, elle doit avoir une dfinition qui est compatible avec les cls trangres qui l'utilise. Elle doit avoir les bonnes colonnes et les index. Si cela n'est pas vrai, MySQL retourne une erreur 1005, et fait rfrence un message d'erreur numro 150.
734
du matre. Par exemple, vous pouvez rpliquer les modifications d'une table InnoDB sur le matre dans une table MyISAM sur l'esclave. Pour configurer un nouvel esclave sur le matre, vous devez faire une copie de l'espace de table InnoDB, des fichiers de log, ainsi que les fichiers .frm des tables InnoDB, et les placer sur l'esclave. Pour une procdure suivre pour raliser cela, voyez Section 15.10, Transfrer une base de donnes InnoDB vers une autre machine . Si vous pouvez arrter le matre ou l'esclave, fates une sauvegarde l'arrt de l'espace de table InnoDB et des fichiers de logs, puis utilisez les pour redmarrer l'esclave. Pour faire un nouvel esclave sans arrter le serveur, utilisez le logiciel commercial InnoDB Hot Backup tool. Il y a des limitations mineures la rplication InnoDB : LOAD TABLE FROM MASTER ne fonctionne pas pour les tables InnoDB. Il y a des palliatifs : 1) exportez la table du matre, et envoyez la sur l'esclave, ou, 2) utilisez ALTER TABLE tbl_name TYPE=MyISAM sur le matre avant de configurer la rplication avec LOAD TABLE tbl_name FROM MASTER, et ensuite, ALTER TABLE pour remettre les tables en mode InnoDB aprs cela. Avant MySQL 4.0.6, SLAVE STOP ne respectait la limite de transaction. Une transaction incomplte tait annule, et la prochaine commande SLAVE START n'excutait que le reste de la transaction, ce qui conduisait un chec. Avant MySQL 4.0.6, un crash de l'esclave au milieu de d'une transaction multi-commande causait le mme problme que SLAVE STOP. Avant MySQL 4.0.11, la rplication de la commande SET FOREIGN_KEY_CHECKS=0 ne fonctionnait pas correctement. La plupart de ces limitations peuvent tre leves en utilisant un serveur rcent, pour lequel les limitations n'existent pas. Les transactions qui chouent sur le serveur n'affectent pas la rplication. La rplication MySQL est base sur le log binaire o MySQL crit les requtes SQL qui modifient des donnes. Un esclave lit le log binaire du matre, et excute les mmes commandes SQLO. Cependant, les commandes d'une transaction ne sont pas crite avant la fin de la transaction, o toutes les commandes sont crites d'un coup. Si une transaction choue, par exemple, cause d'une cl trangre, ou si la transaction est annule, aucune requte ne sera crite dans le log binaire, et la transaction ne sera pas du tout excute sur le serveur.
15.7.6. Espaces de tables multiples : chaque table InnoDB a son fichier .ibd
Depuis MySQL 4.1.1, vous pouvez stocker chaque table InnoDB et ses index dans son propre fichier. Cette fonctionnalit est appele ``espaces de tables multiples'', car chaque table dispose de son propre espace de table. Note importante : si vous passez en version InnoDB 4.1.1 ou plus rcent, il devient trs difficile de retourner en versions 4.0 ou 4.1.0! Ceci est d au fait que les versions antrieures de InnoDB ne sont pas compatibles avec les espaces de tables multiples. Si vous devez revenir une vieille version 4.0, vous devez faire des exports des tables, et recrer tout votre espace de tables InnoDB. Si vous n'avez pas cr de nouvelles tables sous InnoDB >= 4.1.1, et que vous devez revenir rapidement en arrire, vous pouvez passer directement en versions 4.0.18, ou plus rcent. Avant de faire un retour en arrire direct en versions 4.0, vous devez terminer toutes les connexions, et laisser mysqld vider les buffers d'insertion, jusqu' ce que SHOW INNODB STATUS indique que le thread principal soit dans un tat de waiting for server activity. Alors, vous pouvez teindre le serveur mysqld et dmarrer votre version 4.0.18 ou plus rcent. Un retour en arrire direct n'est pas recommand, car il n'a pas t totalement test.
735
Depuis MySQL version 4.1.1, vous pouvez stocker chaque table InnoDB et ses index dans son propre fichier. Cette fonctionnalit est appel espaces de tables multiples, car chaque table a son propre espace de table. Vous pouvez activer cette fonctionnalit en ajoutant une ligne dans le groupe [mysqld] du fichier my.cnf :
[mysqld] innodb_file_per_table
Aprs redmarrage du serveur, InnoDB va stocker chaque table dans son propre fichier tablename.ibd du dossier de donnes, o les tables sont stockes. C'est la mme mthode que MyISAM, mais si MySQL divise les tables en un fichier de donnes et un fichier d'index, tablename.MYD et tablename.MYI, InnoDB place les donnes et les index dans le mme fichier .ibd. Le fichier tbl_name.frm est toujours cr, comme d'habitude. Si vous supprimez la ligne innodb_file_per_table du fichier my.cnf, alors InnoDB crera les tables dans le fichier de donnes. innodb_file_per_table affecte seulement la cration de tables. Si vous dmarrez le serveur avec cette option, les nouvelles tables sont cres avec le fichier .ibd, mais vous pouvez toujours accder aux tables qui existent dans l'espace de table partages ibdata. Si vous supprimez cette option, les nouvelles tables seront cres dans l'espace de tables, mais vous pouvez toujours aux tables qui ont t cres indpendamment. InnoDB a toujours besoin du systme d'espace de tables, les fichiers .ibd ne sont pas suffisants. Le systme d'espaces de table est constitu des fichiers classiques ibdata. InnoDB y place son dictionnaire de donnes interne, et ses historiques d'annulation. Vous ne pouvez pas dplacer les fichiers .ibd librement, comme vous pouvez le faire avec les tables MyISAM. Ceci est d au fait que les dfinitions de tables sont stockes dans le systme d'espace de tables InnoDB, et aussi, parce que InnoDB doit prserver la cohrence des identifiants de transactions et les numros de squence des logs. Vous pouvez dplacer le fichier .ibd et la table associe d'une base l'autre (dans la mme installation MySQL/InnoDB) avec la classique commande RENAME :
RENAME TABLE old_db_name.tbl_name TO new_db_name.tbl_name;
Si vous avez une sauvegarde ``propre'' du fichier .ibd, vous pouvez restaurer l'installation MySQL comme ceci : 1. Utilisez cette commande ALTER TABLE :
ALTER TABLE tbl_name DISCARD TABLESPACE;
Attention : cette commande efface le fichier .ibd. 2. Placez le fichier de sauvegarde .ibd dans le bon dossier de base de donnes. 3. Utilisez cette commande ALTER TABLE :
ALTER TABLE tbl_name IMPORT TABLESPACE;
Dans ce contexte, un fichier .ibd ``propre'' signifie : Il n'y a pas de modifications non valides par des transactions dans le fichier .ibd file. Il n'y a pas de buffer d'insertion non intgrs dans le fichier .ibd. La purge a supprim toutes les lignes marques pour l'effacement dans le fichier .ibd. mysqld a envoy toute les pages modifies au fichier .ibd depuis le buffer de fichier.
736
Vous pouvez faire une sauvegarde propre du fichier .ibd en suivant la mthode : 1. Cessez toute activit sur le serveur mysqld et validez toutes les transactions. 2. Attendez que SHOW INNODB STATUS\G indique qu'il n'y a plus de transaction active dans la base, et que le thread principal de InnoDB est dans l'tat Waiting for server activity. Vous pouvez alors faire une copie du fichier .ibd. Une autre mthode (non libre) de faire une sauvegarde propre du fichier .ibd est de : 1. Utilisez InnoDB Hot Backup pour faire une sauvegarde de votre installation InnoDB. 2. Lancez un second serveur mysqld sur la sauvegarde, et laissez le nettoyer les fichiers .ibd de la sauvegarde. La liste de tche inclut la possibilit de dplacer les fichiers .ibd vers une autre installation MySQL/InnoDB. Cela impose la remise zro des numros de transactions et des squences de fichiers de log du fichier .ibd.
Supposons qu'au cours du temps, le fichier a atteint la taille de 988 Mo. Ci-dessous, la ligne de configuration va ajouter un autre fichier auto-croissant aprs celui qui existe.
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
Lorsque vous ajoutez un nouveau fichier de donnes, assurez vous qu'il n'existe pas, pour que InnoDB puisse le crer et l'initialiser, lorsque vous redmarrerez le serveur. Actuellement, vous ne pouvez pas supprimer de fichiers de donnes. Pour rduire la taille de votre espace de table, utilisez cette procdure : 1. Utilisez mysqldump pour exportez toutes vos tables InnoDB. 2. Stoppez le serveur.
737
3. Supprimez tous les fichiers de tables existants. 4. Configurez un nouvel espace de table. 5. Relancez le serveur. 6. Importez les fichiers de vos tables. Si vous voulez changer le nombre ou la taille de vos fichiers de log InnoDB, vous devez teindre le serveur MYSQL et vous assurer qu'il s'est arrt sans erreur. Puis, copiez les anciens fichiers de log dans une archive, car si vous rencontrez un problme ultrieurement, vous en aurez besoin pour restaurer votre base. Effacer les anciens fichiers de log du dossier de logs, ditez le fichier my.cnf, et redmarrez le serveur MySQL. InnoDB vous indiquera au dmarrage qu'il va crer de nouveaux fichiers de log.
Pour restaurer les donnes aprs un crash MySQL, la seule chose faire est de relancer le serveur. InnoDB va automatiquement vrifier les historiques, et reprendre toutes les oprations qui ont eu lieu jusqu' prsent. InnoDB va automatiquement annuler les transactions qui n'ont pas t acheves. Durant la restauration, InnoDB va afficher des squences semblables celle-ci :
~/mysqlm/sql > mysqld
738
Forcer la restauration
InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: ... InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: mysqld:
Database was not shut down normally. Starting recovery from log files... Starting log scan based on checkpoint at log sequence number 0 13674004 Doing recovery: scanned up to log sequence Doing recovery: scanned up to log sequence Doing recovery: scanned up to log sequence Doing recovery: scanned up to log sequence
0 0 0 0
Doing recovery: scanned up to log sequence number 0 20555264 Doing recovery: scanned up to log sequence number 0 20620800 Doing recovery: scanned up to log sequence number 0 20664692 1 uncommitted transaction(s) which must be rolled back Starting rollback of uncommitted transactions Rolling back trx no 16745 Rolling back of trx no 16745 completed Rollback of uncommitted transactions completed Starting an apply batch of log records to the database... Apply batch completed Started ready for connections
Si votre base ou vos disques se corrompent, vous devez faire la restauration partir de sauvegardes. En cas de corruption, vous devriez trouver une sauvegarde qui n'est pas corrompue. A partir de la sauvegarde, faites une restauration partir des fichiers de logs gnraux, en suivant les instructions du manuel.
Les autres possibilits pour innodb_force_recovery sont listes ci-dessous. La base ne doit pas tre utilise lorsque vous utilisez ces options. Comme mesure de scurit, InnoDB empchera un utilisateur de faire des commandes INSERT, UPDATE et DELETE lorsque cette option est suprieure 0. Depuis la version 3.23.53 et 4.0.4, vous tes autoriss utiliser les commandes DROP et CREATE sur une table, mme si la restauration force est active. Si vous savez qu'une table particulire vous pose des problmes, vous pouvez l'effacer. Vous pouvez aussi utiliser cette commande pour stopper une annulation sauvage, qui seraient cause par des importations de masse ou ALTER TABLE. Vous pouvez tuer le processu mysqld et utiliser l'option innodb_force_recovery=3 pour relancer votre base sans l'annulation. Alors, la suppression de la table avec DROP vous aidera. Un nombre plus grand signifie que toutes les prcautions des nombres infrieurs sont inclus. Si vous tes capables d'exporter vos tables avec une option au maximum de 4, alors vous tes sr que trs peu de donnes sont perdues. L'option 6 est plus dramatique, car les pages de la base de donnes sont laisses dans un tat obsolte, et cela va introduire encore plus de corruption dans les arbres Btree et les structures de la base. 1 (SRV_FORCE_IGNORE_CORRUPT) laisse le serveur fonctionner mme s'il dtecte une page corrompue. Essaie d'viter les index et pages avec SELECT * FROM table, ce qui aide l'export.
739
Points de contrle
2 (SRV_FORCE_NO_BACKGROUND) empche le thread principal de fonctionner. Si un crash survenait durant la purge, cela l'vitera. 3 (SRV_FORCE_NO_TRX_UNDO) ne lance pas les annulations de transactions aprs la restauration. 4 (SRV_FORCE_NO_IBUF_MERGE) empche les oprations de vidange du buffer d'insertion. Si ce sont eux qui causent le crash, il vaut mieux les ignorer. Ne recalcule pas les statisttiques de tables. 5 (SRV_FORCE_NO_UNDO_LOG_SCAN) ne regarde pas les logs d'annulations lors du lancement de la base. InnoDB va traiter les transactions, mme incompltes, comme valides. 6 (SRV_FORCE_NO_LOG_REDO) ne lance pas le rattrapage des oprations avec le log, aprs la restauration.
15.10. Transfrer une base de donnes InnoDB vers une autre machine
Sur Windows, InnoDB stocke les noms de bases et de tables en interne, et toujours en minuscules. Pour dplacer des bases au format binaire, entre Unix et Windows, ou le contraire, vous devez donner des noms en minuscules toutes vos bases et tables. Un moyen simple de faire cela sous Unix est d'ajouter la ligne suivante dans la section [mysqld] de votre fichier d'options my.cnf avant de dmarrer la cration de tables.
set-variable=lower_case_table_names=1
Sous Windows, cette option vaut 1 par dfaut. Les fichiers de donnes et de logs de InnoDB sont compatibles en mode binaire sur toutes les plates-formes si le format des nombre virgule flottante est le mme. Vous pouvez dplacer une base de donnes InnoDB en copiant tous les fichiers concerns, que nous avons dj lists dans la section Section 15.9, Sauver et restaurer une base InnoDB . Si les formats des nombres virgules flottantes sont diffrents mais que vous n'avez pas utilis les types de donnes FLOAT ou DOUBLE dans vos tables alors la procdure est l mme : copiez juste les fichiers concerns. Si les formats sont diffrents et que vous utilisez de tels types de donnes, vous devez utiliser mysqldump et mysqlimport pour transfrer les tables.
740
Un bon moyen d'avoir de bonnes performances est de couper le mode auto-commit quand vous importez des donnes dans votre base de donnes, en supposant que votre espace de tables possde assez d'espace pour la grande partie d'annulations (rollback) que la grande transaction importe gnre. Ne faites le commit qu'aprs avoir import une table entire, ou un segment de table.
Un utilisateur peut changer le niveau d'isolation d'une session ou des nouvelles connexion avec la commande SET TRANSACTION. La syntaxe est la suivante :
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
Notez qu'il n'y a pas de tiret dans les noms de niveaux de la syntaxe SQL. Le comportement par dfaut est de configurer le niveau d'isolation de la prochaine transaction non dmarre. Si vous utilisez le mot cl GLOBAL, la commande configure le niveau d'isolation globalement, pour toutes les nouvelles connexions, mais pas pour les connexions existantes. Vous devez avoir les droits de SUPER pour faire cela. En utilisant le mot cl SESSION, vous allez configurer le niveau d'isolation des prochaines transactions de la session courante. Tous les clients sont autoriss changer le niveau d'isolation de la session, mme au milieu d'une transaction, ainsi que le niveau d'isolation de la prochaine transaction. Dans les versions 3.23.50 et plus anciennes, SET TRANSACTION n'avait pas d'effet sur les tables InnoDB. Dans les versions < 4.0.5, seules REPEATABLE READ et SERIALIZABLE taient disponibles.
741
Vous pouvez connatre les niveaux d'isolation de transaction de session et global avec ces commandes :
SELECT @@global.tx_isolation; SELECT @@tx_isolation;
Pour le verrouillage de ligne, InnoDB utilise le systme dit de verrouillage de la prochaine cl. Cela signifie qu'en plus des lignes d'index, InnoDB peut aussi verrouiller le ``trou'' aprs une ligne d'index pour viter les insertions des autres utilisateurs. Un verrou de prochaine cl reprsente un verrou qui bloque la ligne d'index et le trou qui le prcde. Un verrou de trou reprsente un verrou qui ne bloque que le trou avant la ligne. Voici une description dtaille de chaque niveau d'isolation de InnoDB : READ UNCOMMITTED This is also called ``dirty read'' : Les commandes SELECT non-verrouillantes sont effectues sans rechercher de versions plus rcente de la ligne. Elles sont donc noncohrentes, sous ce niveau d'isolation. SInon, ce niveau fonctionne comme le niveau READ COMMITTED. READ COMMITTED Proche du niveau d'isolation d'Oracle. Toutes les commandes SELECT ... FOR UPDATE et SELECT ... LOCK IN SHARE MODE ne verrouille que les lignes d'index, et non pas les trous entre elles, ce qui permet l'insertion de nouvelles lignes, adjacentes aux lignes verrouilles. UPDATE et DELETE qui utilisent un seul index avec une condition de recherche unique ne verrouille que la ligne d'index trouve, par le trou qui la prcde. Mais, pour un intervalle de lignes traites par UPDATE et DELETE, InnoDB doit mler des verrous de prochaine cl ou des verrous de trous et bloquer les insertions des autres utilisateurs dans les espaces couvert par l'intervalle. Ceci est ncessaire car les ``lignes fantmes'' doivent tre bloques pour la rplication MySQL et la restauration. La lecture cohrente se comporte comme avec Oracle : chaque lecture cohrente, mme dans une transaction, lit et modifie son propre contexte. See Section 15.11.3, Lecture cohrente non-bloquante . REPEATABLE READ C'est le niveau d'isolation par dfaut d'InnoDB. Les commandes SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE et DELETE qui utilisent un index unique dans une condition de recherche, ne verrouille que la ligne d'index trouve, et non pas le trou prcdent. SInon, ces oprations utilisent le verrouillage de prochaine cl, en verrouillant l'intervalle utilis, et bloque les insertions des utilisateurs. Avec les lectures cohrentes il y a une importante diffrence avec le niveau d'isolation prcdent : dans ce mode, toutes les lectures cohrentes d'une mme transaction liront les mmes donnes, tablies par la premire lecture. Cette convention signifie que si vous mettez plusieurs commandes SELECT dans la mme transaction, ces SELECT seront cohrents les uns avec les autres. See Section 15.11.3, Lecture cohrente non-bloquante . SERIALIZABLE Ce niveau est identique au prcdent, mais toutes les lectures SELECT sont implicitement converties en SELECT ... LOCK IN SHARE MODE.
742
Verrous de lecture SELECT ... FOR UPDATE et SELECT ... LOCK IN SHARE MODE
aucun verrou sur les tables auxquelles elle accde, et par consquent, les autres utilisateurs peuvent librement modifier ces tables en mme temps qu'une lecture cohrente est excute.
15.11.4. Verrous de lecture SELECT ... FOR UPDATE et SELECT ... LOCK IN SHARE MODE
Une lecture cohrente n'est pas toujours pratique, dans certaines circonstances. Supposons que vous voulez ajouter une ligne dans votre table CHILD, et vous assurer que l'enfant a dj un parent dans la table PARENT. Supposez que vous utilisiez une lecture cohrente, pour lire la table PARENT, et que vous dcouvrez le parent de l'enfant dans cette table. Pouvez vous ajouter tranquillement la ligne fille dans la table CHILD? Non, car il peut arriver que durant ce temps, un autre utilisateur a effac la ligne parente dans la table PARENT, et vous n'en tes pas conscient. La solution est d'excuter la commande SELECT en mode verrouillage, avec LOCK IN SHARE MODE.
SELECT * FROM PARENT WHERE NAME = 'Jones' LOCK IN SHARE MODE;
Effectuer une lecture en mode partag signifie que vous allons lire les dernires donnes disponibles, et que nous allons poser un verrou sur les lignes que nous lisons. Si les dernires donnes appartiennent une transaction non valide d'un autre utilisateur, nous allons attendre que ce soit fait. Un verrou partag vite que les autres utilisateurs ne modifient ou n'effacent la ligne que nous lisons. Aprs que nous ayons obtenu le nom du parent, nous pouvons tranquillement ajouter le nom du fils dans la table CHILD, et valider notre transaction. Cet exemple montre comment implenter l'intgrit rfrentielle dans votre application. Ajoutons un autre exemple : nous avons un champs compteur dans la table CHILD_CODES que nous utilisons pour assigner un identifiant unique chaque enfant que nous ajoutons dans la table CHILD. Evidemment, en utilisant une lecture cohrente ou une lecture partage pour lire la valeur courante du compteur n'est pas une bonne ide, car deux utilisateurs de la base peuvent simultanment lire la mme valeur de compteur, et nous allons obtenir une erreur de cl doublon lorsque nous ajouterons le second des deux fils. Ici, LOCK IN SHARE MODE n'est pas une bonne solutionm, car si deux utilisateurs lisent le compteur en mme temps, au moins l'un des deux sera bloqu lorsqu'il tentera de modifier le compteur. Dans ce cas, il y a deux bonnes mthodes pour implmenter la lecture et l'incrmentation du compteur : (1) modifiez le compteur d'une unit, et lisez le aprs cela ou (2) lisez le compteur d'abord, avec un verrou en mode FOR UPDATE, puis incrmentez le :
SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE; UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;
Une commande SELECT ... FOR UPDATE va lire les dernires donnes disponibles pour chaque ligne, et pose un verrou dessus en mme tant qu'il lit. De cette faon, il pose le mme verrou que la commande UPDATE. Notez que la commande ci-dessus est simplement un exemple de fonctionnement de SELECT ... FOR UPDATE. En MySQL, la tche spcifique de cration d'un identifiant unique peut tre ralise avec un seul accs la table :
UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field + 1); SELECT LAST_INSERT_ID();
La comande SELECT ne fait que lire l'identifiant spcifique la connexion. Il ne fait aucun accs la table.
743
des verrous partags ou exclusifs sur les lignes d'index qu'il rencontre. Par consquent, les verrous de lignes sont plus exactement appels des verrous d'index. Les verrous que InnoDB posent affectent aussi l'espace qui le spare de la ligne suivante. Si un utilisateur a un verrou partag ou exclusif sur une ligne L dans un index, alors un autre utilisateur ne peut faire d'insertion immdiatement avant la ligne L, dans l'ordre de l'index. Ce verrouillage est fait pour viter le problme de la ligne fantme. Supposons que je veuille lire et verrouiller tous les enfants ayant un identifiant suprieur 100 dans la table CHILD, puis modifier certains champs des lignes ainsi identifies :
SELECT * FROM CHILD WHERE ID > 100 FOR UPDATE;
Supposons qu'il y ait un index sur la table CHILD, sur la colonne ID. Notre requte va scanner l'index partir de la premire ligne o ID est plus grand que 100. Maintenant, si le verrou pos sur les lignes d'index n'empche pas l'utilisation des intervalles entre les lignes d'index, un nouvel enfant peut tre insr dans la table durant la lecture. Et maintenant, si ma transaction excute la commande :
SELECT * FROM CHILD WHERE ID > 100 FOR UPDATE;
je vais trouver un nouvel enfant dans le rsultat de ma requte. Ceci va l'encontre du principe d'isolation des transactions : une transaction doit tre capable de s'excuter sans que les lectures soient affectes durant ce temps. Si vous considrons un intervalle de donnes, alors la nouvelle ligne 'fantme' va casser le principe d'isolation. Lorsque InnoDB scanne un index, il va aussi verrouille l'espace aprs la dernire ligne de l'index. C'est ce qui est arriv dans l'exemple ci-dessus : le verrou pos par InnoDB va viter qu'une insertion n'intervienne dans la table o ID serait plus grand que 100. Vous pouvez utiliser le verrouillage de la cl suivant pour implmenter des vrifications d'unicit dans votre application : si vous lisez des donnes en mode partag, et que vous ne voyez pas de duplicata de la ligne que vous allez insrer, alors vous pouvez l'insrer sans problme, en sachant que le verrou de cl suivante va vous garantir que durant ce temps, personne ne pourra insrer de ligne, qui dboucherait sur un duplicata de la votre. Le verrou de cl suivante permet de verrouiller aussi la nonexistence de ligne dans votre table.
744
De cette faon, A voir la ligne insre par B uniquement lorsque B a valid son insertion, et que A a valid sa propre transaction, de faon ce que la date jalon soit plus rcente que la validation de B. Si vous voulez avoir une vision aussi ``frache'' que possible de votre base, vous devez utiliser le verrou en lecture :
SELECT * FROM t LOCK IN SHARE MODE;
15.11.7. Les verrous poss par diffrentes requtes SQL avec InnoDB
Un verrou de lecture, une commande UPDATE ou DELETE pose gnralement des verrous sur toutes les lignes qui sont analyse durant l'opration. La prsence d'une clause WHERE n'a pas d'importance. InnoDB ne se souviens pas de la condition WHERE exacte, mais sait quel intervalles d'index ont t scanns. Les verrous sont du type 'prochaine cl', et cela empche aussi les insertions dans l'``espace'' immdiatement aprs la ligne. Si le verrou est exclusif, alors InnoDB essaie de lire les groupes d'index et de poser un verrou dessus. Si vous n'avez d'index valable pour votre requte, et que MySQL scanne toute la table, chaque ligne sera verrouille, et bloquera ainsi toutes les insertions. Il est important de bien configurer ses index, poru que les requtes ne fasse pas de scan de table inutiles. SELECT ... FROM ... : ceci est une lecture cohrente, qui lit un bilan de la base, et ne pose aucun verrou. SELECT ... FROM ... LOCK IN SHARE MODE : pose un verrou partag sur la prochaine cl sur tous les index que la lecture rencontre. SELECT ... FROM ... FOR UPDATE : pose un verrou exclusif sur la prochaine cl sur tous les index que la lecture rencontre. INSERT INTO ... VALUES (...) : pose un verrou exclusif sur la ligne insre. Notez que ce verrou n'est pas un verrou de cl, et il n'empche pas les autres utilisateurs d'insrer des lignes. Si une erreur de cl double apparat, un verrou sera pos partag sera pos sur la ligne doublon. Durant l'initialisation d'une colonne AUTO_INCREMENT dans une table, InnoDB pose un verrou exclusif la fin de l'index associ la colonne AUTO_INCREMENT. Lors de l'accession au compteur d'incrmentation, InnoDB utilise un verrou spcifique, en mode AUTO-INC o le verrou ne dure que jusqu' la fin de la requte SQL courante, au lieu de la fin de la transaction. See Section 15.11.1, InnoDB et AUTOCOMMIT . Avant MySQL 3.23.50, SHOW TABLE STATUS posait aussi un verrou exclusif sur les tables ayant une colonne AUTO_INCREMENT. Cela signifie que la commande SHOW TABLE STATUS pouvait aussi causer un blocage de verrou, ce qui surprenait beaucoup les utilisateurs. Depuis MySQL 3.23.50, InnoDB lit la valeur d'une table dont la colonne AUTO_INCREMENT a t initialise, sans poser de verrou. INSERT INTO T SELECT ... FROM S WHERE ... : pose un verrou exclusif sur chaque ligne insr dans T. Effectue la recherche sur S sous la forme d'une lecture cohrente, mais pose un verrou partag sur l'index de prochaine cl de S si MySQL a activ le log. InnoDB doit poser un verrou dans cette dernire situation, car en cas d'excution des instructions dans une phase de restauration, toutes les requtes doivent tre excutes dans le mme ordre. CREATE TABLE ... SELECT ... effectue une commande SELECT sous la forme d'une lecture cohrente, ou avec des verrous partags, comme prcdemment. REPLACE est similaire une insertion, si il n'y a pas de collision sur la cl unique. Sinon, une verrou exclusif sur l'index de prochaine cl est pos sur la ligne qui sera modifie.
745
UPDATE ... SET ... WHERE ... : pose un verrou exclusif sur l'index de prochaine cl, chaque ligne que la recherche trouve. DELETE FROM ... WHERE ... : pose un verrou exclusif sur l'index de prochaine cl chaque ligne que la recherche trouve. Si la contrainte de FOREIGN KEY est dfinie sur une table, toute insertion, modification ou effacement qui requiert la vrification de la contrainte va poser un verrou de ligne sur la ligne dont il doit vrifier la contrainte. De plus, dans certains cas o la contrainte choue, InnoDB pose ces verrous. LOCK TABLES ... : pose un verrou de table. L'implmentation de la couche MySQL pose ce verrou. La dtection automatique des blocages de InnoDB ne peut dtecter les blocages lorsque de tels verrous sont poss. Voyez la section suivante. See Section 15.11.9, Dtection des blocages et annulation . De plus, comme MySQL ne connat pas le verrouillage de lignes, il est possible que vous posiez un verrou sur une table o un autre utilisateur a dj pos un verrou. Mais cela ne pose pas de problme quant l'intgrit de la requte. See Section 15.17, Restrictions sur les tables InnoDB .
15.11.8. Quand est-ce que MySQL valide ou annule implicitement une transaction?
MySQL ouvre les connexions des clients en mode d'auto-validation, par dfaut. Lorsque l'autovalidation est active, MySQL fait une validation aprs chaque commande SQL, si la commande n'a pas retourn d'erreur. Si vous n'avez pas de mode d'auto-validation, et que vous fermez une connexion sans valider explicitement vos transactions, alors MySQL annule votre transaction. Si une erreur est retourne par une commande SQL, le comportement de la transaction dpend de l'erreur. See Section 15.16, Gestion des erreurs InnoDB . Les commandes SQL suivantes causent une validation implicite de la transaction courante : ALTER TABLE, BEGIN, CREATE INDEX, DROP DATABASE, DROP INDEX, DROP TABLE, LOAD MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION, TRUNCATE, UNLOCK TABLES. CREATE TABLE (elle valide uniquement avant MySQL 4.0.13 et si le log binaire MySQL est utilis). La commande CREATE TABLE de InnoDB est traite comme une seule transaction. Cela signifie qu'une commande ROLLBACK ne va pas annuler la commande CREATE TABLE qui a t faite dans la transaction.
746
Les verrous de niveau de table forcent les transactions se mettre en ligne, et les blocages sont vits. Notez que LOCK TABLES dmarre implicitement une transaction, tout comme BEGIN, et UNLOCK TABLES termine une transaction avec un COMMIT. Une dernire solution est de crer un smaphore auxiliaire sous la forme d'une table avec une seule ligne. Chaque transaction modifie cette table avant d'accder aux autres tables. Dans ce cas, toutes les transactions se font en ordre squentiel. Notez que dans cette configuration, mme l'algorithme InnoDB de dtection des blocages fonctionne, car le smaphore est un verrou de ligne. Avec les verrous de niveau de table de MySQL, nous devons nous rsoudre une mthode de dlai d'expiration pour rsoudre un verrou.
747
faites peut tre trop d'criture de transaction, ou le tampon de traitement ("buffer pool") est peut tre trop petit. Augmenter la taille du tampon peut aider, mais il ne faut pas qu'il dpasse 80% de la mmoire physique. Regrouper les modifications dans une seule transaction. InnoDB doit crire les donnes de log sur le disque chaque validation de transaction, si la transaction a fait des modifications dans la base. Comme la vitesse de rotation d'un disque est typiquement de 167 revolutions/seconde au mieux, cela rduit le nombre de validations 167 par seconde, si le disque ne veut pas induire le systme d'exploitation en erreur. Si vous pouvez accepter la perte des toutes dernires transactions valides, vous pouvez modifier dans le fichier my.cnf le paramtre innodb_flush_log_at_trx_commit 0. InnoDB essaie d'crire sur le disque au moins une fois par seconde, mais cette criture n'est plus garantie. Utilisez de gros fichiers de log, mme aussi grand que le pool de buffer. Lorsque InnoDB a crit les fichiers de log, il doit crire les contenus modifis du pool de buffer sur le disque, avec un jalon. Les fichiers de logs de petites tailles imposeront des critures inutiles. L'inconvnient d'un gros fichier de log est que le temps de restauration sera plus long. Le buffer de logs doit tre assez grand, au moins 8 Mo. Utilisez le type de colonne VARCHAR au lieu de CHAR si vous stockez des chanes de taille variable, ou si une colonne peut contenir plusieurs valeurs NULL. Une colonne CHAR(N) prend toujours N octets pour stocker les donnes, mme si la chane est plus petite, ou que sa valeur est NULL. Des tables plus petites rentrent plus facilement dans les buffers et rduisent les accs disques. (Valable depuis MySQL version 3.23.39 et plus rcent) Dans certaines versions de MySQL et Unix, l'criture des fichiers sur les disques avec fdatasync et d'autres commandes similaires sont tonnament lentes. La mthode par dfaut de InnoDB est la fonction fdatasync. Si vous n'tes pas satisfaits avec les performances en criture de la base, vous pouvez essayer d'utiliser l'option innodb_flush_method dans le fichier my.cnf avec la valeur O_DSYNC, mme si O_DSYNC semble tre la mthode la plus lente sur la plupart des systmes. Lors de l'importation de donnes avec InnoDB, assurez vous que MySQL n'a pas autocommit=1. Sinon, chaque insertion implique une criture sur le disque. Ajoutez cette commande dans votre fichier SQL d'import :
SET AUTOCOMMIT=0; /* commandes d'importation SQL ... */ COMMIT;
Si vous utilisez l'option --opt de l'utilitaire mysqldump, vous allez obtenir des fichiers d'export qui sont rapides importer dans une table InnoDB, mme sans utiliser l'astuce de la transaction cidessus : SET AUTOCOMMIT=0; ... COMMIT;. Attention aux annulations lors des insertions de masse : InnoDB utilise une buffer d'insertion pour viter les accs disques, mais la fonction d'annulation correspondante n'utilise pas ce mcanisme. Une annulation qui utilise beaucoup d'accs disque est environ 30 fois plus lente que l'insertion quivalent. Interrompre la base ne va pas aider, car l'annulation reprendra lors du redmarrage de la base. La seule solution pour ce dbarasser de cette annulation lnifiante est d'augmenter la taille du pool de buffer, pour que l'annulation soit limite par le processeur et non plus par le disque. Ou alors, effacez toute la base InnoDB. See Section 15.9.1, Forcer la restauration . Attention aux oprations qui ont de gros impacts sur le disque : utilisez DROP TABLE ou TRUNCATE depuis MySQL 4.0 et, pour vider une table, et non pas DELETE FROM votre_table. Utilisez les INSERT multiples pour rduire les communications entre le client et le serveur, si vous devez insrer plusieurs lignes :
INSERT INTO yourtable VALUES (1, 2), (5, 5);
Ce conseil est valable pour tous les types des tables, pas seulement InnoDB.
748
Le moniteur InnoDB
Si vous avez une contrainte UNIQUE sur les cls secondaires, depuis MySQL version 3.23.52 et 4.0.3, vous pouvez acclrer les imports de tables en dsactivant temporairement les vrifications d'unicit durant l'importation :
SET UNIQUE_CHECKS=0;
Pour les grandes tables, cela conomise de nombreux accs disques, car les tables InnoDB peuvent utiliser le buffer d'insertion pour crire des index secondaires par paquets. Si vous avez des contrantes FOREIGN KEY dans vos tables, depuis MySQL 3.23.52 et 4.0.3, vous pouvez acclrer les imports de tables en dsactivant temporairement les vrifications d'unicit durant l'importation :
SET FOREIGN_KEY_CHECKS=0;
Pour les grandes tables, cela conomise beaucoup d'accs disques. Si vous avez des requtes rcurrentes dans vos tables, qui ne sont pas modifies souvent, vous pouvez utiliser le cache de requtes depuis MySQL 4.0 :
[mysqld] query_cache_type = ON query_cache_size = 10M
En MySQL 4.0, le cache temporaire fonctionne uniquement si l'auto-commit est activ. Cette restriction a t leve depuis MySQL 4.1.1.
Une autre mthode pour utiliser le InnoDB Monitors est de le laisser crit continuellement des donnes dans la sortie de mysqld : (note : le client MySQL n'affichera rien). Lorsqu'il est activ, InnoDB peut afficher des donnes toutes les 15 secondes. Si vous utilisez mysqld comme dmon, alors ces donnes sont diriges vers le fichier de log .err dans le dossier datadir. Les donnes lue sont importantes pour les rglages de performances. Sous Windows, vous devez lancer mysqld-max depuis une fentre MS-DOS, avec l'option --console, si vous voulez voir le rsultat affich dans la fente. Il existe aussi innodb_lock_monitor qui affiche les mmes informations que innodb_monitor, mais qui indique aussi les verrous poss par les transactions. Les verrous de tables et de ligne de chaque transaction, les attentes de verrous par les transactions, Les attentes de smaphores pour les threads, les requtes en attente d'accs aux fichiers, les statistiques sur les buffers, et les statistiques sur les purges et buffers d'insertion sur le thread principal InnoDB. Vous pouvez dmarrer le moniteur InnoDB avec la commande SQL suivante :
CREATE TABLE innodb_monitor(a int) type = innodb;
749
Le moniteur InnoDB
et le stopper avec
DROP TABLE innodb_monitor;
La syntaxe CREATE TABLE est simplement un moyen de passer une commande une table InnoDB, via l'analyseur MySQL : la table cre n'est pas importante pour le moniteur InnoDB. Si vous interrompez le serveur lorsque le moniteur fonctionne, et que vous voulez redmarrer le moniteur, vous devez alors effacer la table avant de pouvoir excuter la mme commande CREATE TABLE pour dmarrer le moniteur. Cette syntaxe est susceptible de changer dans le futur. Un exemple de rsultat du moniteur InnoDB :
mysql> SHOW INNODB STATUS\G *************************** 1. row *************************** Status: ===================================== 030709 13:00:59 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 18 seconds ---------SEMAPHORES ---------OS WAIT ARRAY INFO: reservation count 413452, signal count 378357 --Thread 32782 has waited at btr0sea.c line 1477 for 0.00 seconds the semaphore: X-lock on RW-latch at 41a28668 created in file btr0sea.c line 135 a writer (thread id 32782) has reserved it in mode wait exclusive number of readers 1, waiters flag 1 Last time read locked in file btr0sea.c line 731 Last time write locked in file btr0sea.c line 1347 Mutex spin waits 0, rounds 0, OS waits 0 RW-shared spins 108462, OS waits 37964; RW-excl spins 681824, OS waits 375485 -----------------------LATEST FOREIGN KEY ERROR -----------------------030709 13:00:59 Transaction: TRANSACTION 0 290328284, ACTIVE 0 sec, process no 3195, OS thread id 34831 inser ting 15 lock struct(s), heap size 2496, undo log entries 9 MySQL thread id 25, query id 4668733 localhost heikki update insert into ibtest11a (D, B, C) values (5, 'khDk' ,'khDk') Foreign key constraint fails for table test/ibtest11a: , CONSTRAINT `0_219242` FOREIGN KEY (`A`, `D`) REFERENCES `ibtest11b` (`A`, `D`) ON DELETE CASCADE ON UPDATE CASCADE Trying to add in child table, in index PRIMARY tuple: 0: len 4; hex 80000101; asc ....;; 1: len 4; hex 80000005; asc ....;; 2: len 4; hex 6b68446b; asc khDk;; 3: len 6; hex 0000114e0edc; asc ...N..;; 4: len 7; hex 00000000c3e0a7; asc .......;; 5: len 4; hex 6b68446b; asc khDk;; But in parent table test/ibtest11b, in index PRIMARY, the closest match we can find is record: RECORD: info bits 0 0: len 4; hex 8000015b; asc ...[;; 1: len 4; hex 80000005; a sc ....;; 2: len 3; hex 6b6864; asc khd;; 3: len 6; hex 0000111ef3eb; asc ...... ;; 4: len 7; hex 800001001e0084; asc .......;; 5: len 3; hex 6b6864; asc khd;; -----------------------LATEST DETECTED DEADLOCK -----------------------030709 12:59:58 *** (1) TRANSACTION: TRANSACTION 0 290252780, ACTIVE 1 sec, process no 3185, OS thread id 30733 inser ting LOCK WAIT 3 lock struct(s), heap size 320, undo log entries 146 MySQL thread id 21, query id 4553379 localhost heikki update INSERT INTO alex1 VALUES(86, 86, 794,'aA35818','bb','c79166','d4766t','e187358f' ,'g84586','h794',date_format('2001-04-03 12:54:22','%Y-%m-%d %H:%i'),7 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 48310 n bits 568 table test/alex1 index symbole trx id 0 290252780 lock mode S waiting Record lock, heap no 324 RECORD: info bits 0 0: len 7; hex 61613335383138; asc a a35818;; 1: *** (2) TRANSACTION: TRANSACTION 0 290251546, ACTIVE 2 sec, process no 3190, OS thread id 32782 inser
750
Le moniteur InnoDB
ting 130 lock struct(s), heap size 11584, undo log entries 437 MySQL thread id 23, query id 4554396 localhost heikki update REPLACE INTO alex1 VALUES(NULL, 32, NULL,'aa3572','','c3572','d6012t','', NULL,' h396', NULL, NULL, 7.31,7.31,7.31,200) *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 0 page no 48310 n bits 568 table test/alex1 index symbole trx id 0 290251546 lock_mode X locks rec but not gap Record lock, heap no 324 RECORD: info bits 0 0: len 7; hex 61613335383138; asc a a35818;; 1: *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 48310 n bits 568 table test/alex1 index symbole trx id 0 290251546 lock_mode X locks gap before rec insert intention waiting Record lock, heap no 82 RECORD: info bits 0 0: len 7; hex 61613335373230; asc aa 35720;; 1: *** WE ROLL BACK TRANSACTION (1) -----------TRANSACTIONS -----------Trx id counter 0 290328385 Purge done for trx's n:o < 0 290315608 undo n:o < 0 17 Total number of lock structs in row lock hash table 70 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 0 0, not started, process no 3491, OS thread id 42002 MySQL thread id 32, query id 4668737 localhost heikki show innodb status ---TRANSACTION 0 290328384, ACTIVE 0 sec, process no 3205, OS thread id 38929 in serting 1 lock struct(s), heap size 320 MySQL thread id 29, query id 4668736 localhost heikki update insert into speedc values (1519229,1, 'hgjhjgghggjgjgjgjgjggjgjgjgjgjgggjgjgjlhh gghggggghhjhghgggggghjhghghghghghhhhghghghjhhjghjghjkghjghjghjghjfhjfh ---TRANSACTION 0 290328383, ACTIVE 0 sec, process no 3180, OS thread id 28684 co mmitting 1 lock struct(s), heap size 320, undo log entries 1 MySQL thread id 19, query id 4668734 localhost heikki update insert into speedcm values (1603393,1, 'hgjhjgghggjgjgjgjgjggjgjgjgjgjgggjgjgjlh hgghggggghhjhghgggggghjhghghghghghhhhghghghjhhjghjghjkghjghjghjghjfhjf ---TRANSACTION 0 290328327, ACTIVE 0 sec, process no 3200, OS thread id 36880 st arting index read LOCK WAIT 2 lock struct(s), heap size 320 MySQL thread id 27, query id 4668644 localhost heikki Searching rows for update update ibtest11a set B = 'kHdkkkk' where A = 89572 ------- TRX HAS BEEN WAITING 0 SEC FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 65556 n bits 232 table test/ibtest11a index PRIM ARY trx id 0 290328327 lock_mode X waiting Record lock, heap no 1 RECORD: info bits 0 0: len 9; hex 73757072656d756d00; asc supremum.;; --------------------TRANSACTION 0 290328284, ACTIVE 0 sec, process no 3195, OS thread id 34831 ro llback of SQL statement ROLLING BACK 14 lock struct(s), heap size 2496, undo log entries 9 MySQL thread id 25, query id 4668733 localhost heikki update insert into ibtest11a (D, B, C) values (5, 'khDk' ,'khDk') ---TRANSACTION 0 290327208, ACTIVE 1 sec, process no 3190, OS thread id 32782 58 lock struct(s), heap size 5504, undo log entries 159 MySQL thread id 23, query id 4668732 localhost heikki update REPLACE INTO alex1 VALUES(86, 46, 538,'aa95666','bb','c95666','d9486t','e200498f ','g86814','h538',date_format('2001-04-03 12:54:22','%Y-%m-%d %H:%i'), ---TRANSACTION 0 290323325, ACTIVE 3 sec, process no 3185, OS thread id 30733 in serting 4 lock struct(s), heap size 1024, undo log entries 165 MySQL thread id 21, query id 4668735 localhost heikki update INSERT INTO alex1 VALUES(NULL, 49, NULL,'aa42837','','c56319','d1719t','', NULL, 'h321', NULL, NULL, 7.31,7.31,7.31,200) -------FILE I/O -------I/O thread 0 state: waiting for i/o request (insert buffer thread) I/O thread 1 state: waiting for i/o request (log thread) I/O thread 2 state: waiting for i/o request (read thread) I/O thread 3 state: waiting for i/o request (write thread)
751
Implmentation du multi-versionnage
Pending normal aio reads: 0, aio writes: 0, ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0 Pending flushes (fsync) log: 0; buffer pool: 0 151671 OS file reads, 94747 OS file writes, 8750 OS fsyncs 25.44 reads/s, 18494 avg bytes/read, 17.55 writes/s, 2.33 fsyncs/s ------------------------------------INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------Ibuf for space 0: size 1, free list len 19, seg size 21, 85004 inserts, 85004 merged recs, 26669 merges Hash table size 207619, used cells 14461, node heap has 16 buffer(s) 1877.67 hash searches/s, 5121.10 non-hash searches/s --LOG --Log sequence number 18 1212842764 Log flushed up to 18 1212665295 Last checkpoint at 18 1135877290 0 pending log writes, 0 pending chkp writes 4341 log i/o's done, 1.22 log i/o's/second ---------------------BUFFER POOL AND MEMORY ---------------------Total memory allocated 84966343; in additional pool allocated 1402624 Buffer pool size 3200 Free buffers 110 Database pages 3074 Modified db pages 2674 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages read 171380, created 51968, written 194688 28.72 reads/s, 20.72 creates/s, 47.55 writes/s Buffer pool hit rate 999 / 1000 -------------ROW OPERATIONS -------------0 queries inside InnoDB, 0 queries in queue Main thread process no. 3004, id 7176, state: purging Number of rows inserted 3738558, updated 127415, deleted 33707, read 755779 1586.13 inserts/s, 50.89 updates/s, 28.44 deletes/s, 107.88 reads/s ---------------------------END OF INNODB MONITOR OUTPUT ============================ 1 row in set (0.05 sec)
Quelques notes sur le rsultat : Si la section TRANSACTIONS rapporte des attentes de verrous, alors votre application a des problmes de rtention de verrous. Le rapport peut vous aider trouver les blocages de verrous, et les transactions bloquantes. La section SEMAPHORES rapporte les threads en attente d'un smaphore, et les statistiques d'attentes pour un mutex ou un verrou en lecture/criture. Les longues attentes peuvent tre dues des requtes parallles, ou des problmes avec la programmation des threads. Donner la variable innodb_thread_concurrency une valeur plus petite que le 8 par dfaut peut rduire ce type de situations. La section BUFFER POOL AND MEMORY vous donne des statistiques sur les pages qui ont t lues et crites. Vous pouvez calculer depuis ces nombres combien d'accs disques vos requtes ralisent actuellement. La section ROW OPERATIONS montre ce que le thread principal fait.
752
En interne, InnoDB ajoute deux champs chaque ligne stocke dans la base. Un champ de 6 octets note l'identifiant de la dernire transaction qui a insr ou modifier la ligne. De plus, un effacement est trait en interne comme une modification, o un bit spcial dans la ligne sert marquer la ligne comme efface. Chaque ligne contient aussi une colonne de 7 octets appel un pointeur d'annulation. Ce pointeur fait rfrence une ligne dans un fichier d'annulation qui contient les informations ncessaires pour reconstruire le contenu de la ligne qui a t modifie. InnoDB utilise les informations dans le segment d'annulation pour effectuer les oprations d'annulation ncessaires dans une annulation de transaction. Il utilise aussi ces informations pour reconstruire les anciennes versions d'une ligne lors d'une lecture cohrente. Le log d'annulation dans le segment d'annulation est divis entre les insertions et les modifications. Le log d'insertion n'est ncessaire que lors des annulations de transactions, et peut tre vid ds que la requte est valide. Le log de modification est utilis lors des lectures cohrentes, et les informations y sont supprimes une fois que toutes les transactions qui font une lecture cohrente sont termines. Vous devez vous rappeler que valider vos transactions rgulirement, mme ces transactions qui ne font que des lectures cohrentes. Sinon, InnoDB ne peut pas vider le log de modification, et le segment d'annulation va grossir normment. La taille physique d'une ligne du log d'annulation dans le segment d'annulation est typiquement plus petite que la ligne correspondante insre ou modifie. Vous pouvez utiliser ces informations pour calculer l'espace ncessaire vos segments d'annulation. Dans nos schmas de multi-versionnage, une ligne n'est pas physiquement supprime de la table immdiatement lorsque vous l'effacez avec une requte SQL. Uniquement lorsque InnoDB va supprimer les lignes du log de modification, il vaut aussi supprimer physiquement la ligne, et les index. Cette opration d'effacement est appele une purge, et elle est plutt rapide, et aussi rapide que la requte SQL elle-mme.
753
754
Chaque ligne d'index secondaire contient aussi les champs dfinis pour la cl de l'index en grappe. Une ligne contient aussi un pointeur pour chaque champs de la ligne. Si la taille totale des champs reprsentent moins de 128 octets, alors le pointeur fait 1 octets, sinon 2. En interne, InnoDB stocke les colonnes de taille fixe comme CHAR(10) dans un format taille fixe. InnoDB supprime les espaces terminaux des colonnes VARCHAR. Notez que MySQL peut convertir en interne les colonnes CHAR en VARCHAR. See Section 13.2.5.1, Modification automatique du type de colonnes . Une valeur SQL NULL rserve 0 octets si elle est stocke dans une colonne taille variable. Dans une colonne taille fixe, elle utilise toute la largeur de la colonne. La raison de la rservation de toute la colonne pour les valeurs NULL est que lors de la mise jour de la colonne depuis la valeur NULL vers une valeur non-nulle, il n'y aura pas de fragementation sur le disque.
Lors de votre prochain redmararge du serveur, InnoDB remarque le mot newraw et initialise un nouvelle partition. Cependant, ne crez ou ne modifiez pas les tables InnoDB pour le moment. SInon, lors de votre prochain redmarrage serveur, InnoDB va reinitialiser la partition et vous aurez tout perdu. Depuis la version 3.23.44, par mesure de scurit, InnoDB empche les utilisateurs de modifier des donnes dans une partition newraw.
755
Une fois que InnoDB a inialis la nouvelle partition, stoppez le serveur, remplacez newraw dans le fichier d'options par raw :
[mysqld] innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:5Graw;/dev/hdd2:2Graw
Puis relancez le serveur et InnoDB va permettre les modifications dans cet espace de table. Sous Windows, depuis la version 4.1.1, vous pouvez allouer une partition de disque comme ceci :
[mysqld] innodb_data_home_dir= innodb_data_file_path=//./D::10Gnewraw
Le //./ correspond la syntaxe Windows de \\.\, pour accder aux disques physiques. Lorsque vous utilisez une partition raw disque, assurez vous que vous avez les permissions qui permettent de lire et crire avec le compte qui fait tourner le serveur.
756
proche de l'ordre alphabtique des enregistrements dans les pages, ou qu'il y a plusieurs pages nonutilises dans le bloc de 64 pages qui ont t alloues l'index. Une manire d'acclrer les index est d'extraire priodiquement les donnes de la table dans un fichier avec mysqldump, d'effacer la table puis de la recrer. Une autre manire de dfragmenter consiste excuter un ALTER sur le type de la table pour le changer en MyISAM puis de le repasser en InnoDB.
ALTER TABLE tbl_name TYPE=InnoDB
Cela fait que MySQL va reconstruire la table. Un autre moyen de raliser la dfragmentation est d'utiliser l'utilitaire mysqldump pour exporter la table vers un fichier texte, effacer la table, la recrer et importer le fichier de donnes. Si les insertions dans un index sont toujours ascendantes et que les lignes supprimes le sont la fin du fichier, alors l'algorithme de gestion de l'espace fichiers de InnoDB garantit qu'aucune fragmentation n'aura lieu dans l'index.
757
1205 (ER_LOCK_WAIT_TIMEOUT) Le dlai d'expiration du verrou a t dpass. La transaction a t annule. 1213 (ER_LOCK_DEADLOCK) Blocage de transactions. Vous devriez relancer la transaction. 1216 (ER_NO_REFERENCED_ROW) Vous essayez d'ajouter une ligne, mais il n'y a pas de ligne parente, et une contrainte de cl trangre choue. Vous devez ajouter le parent en premier. 1217 (ER_ROW_IS_REFERENCED) Vous essayez d'effacer une ligne parent qui a des enfants, et une contrainte de cl trangre choue. Vous devez effacer la ligne fille en premier.
758
No child processes 11 (EAGAIN) Try again 12 (ENOMEM) Out of memory 13 (EACCES) Permission denied 14 (EFAULT) Bad address 15 (ENOTBLK) Block device required 16 (EBUSY) Device or resource busy 17 (EEXIST) File exists 18 (EXDEV) Cross-device link 19 (ENODEV) No such device 20 (ENOTDIR) Not a directory 21 (EISDIR) Is a directory 22 (EINVAL) Invalid argument 23 (ENFILE) File table overflow 24 (EMFILE) Too many open files 25 (ENOTTY) Inappropriate ioctl for device 26 (ETXTBSY)
759
Text file busy 27 (EFBIG) File too large 28 (ENOSPC) No space left on device 29 (ESPIPE) Illegal seek 30 (EROFS) Read-only file system 31 (EMLINK) Too many links La table suivante fournit une liste de certains code d'erreur systme Windows. Pour une version complte, voyez Microsoft website. 1 (ERROR_INVALID_FUNCTION) Incorrect function. 2 (ERROR_FILE_NOT_FOUND) The system cannot find the file specified. 3 (ERROR_PATH_NOT_FOUND) The system cannot find the path specified. 4 (ERROR_TOO_MANY_OPEN_FILES) The system cannot open the file. 5 (ERROR_ACCESS_DENIED) Access is denied. 6 (ERROR_INVALID_HANDLE) The handle is invalid. 7 (ERROR_ARENA_TRASHED) The storage control blocks were destroyed. 8 (ERROR_NOT_ENOUGH_MEMORY) Not enough storage is available to process this command. 9 (ERROR_INVALID_BLOCK) The storage control block address is invalid. 10 (ERROR_BAD_ENVIRONMENT) The environment is incorrect.
760
11 (ERROR_BAD_FORMAT) An attempt was made to load a program with an incorrect format. 12 (ERROR_INVALID_ACCESS) The access code is invalid. 13 (ERROR_INVALID_DATA) The data is invalid. 14 (ERROR_OUTOFMEMORY) Not enough storage is available to complete this operation. 15 (ERROR_INVALID_DRIVE) The system cannot find the drive specified. 16 (ERROR_CURRENT_DIRECTORY) The directory cannot be removed. 17 (ERROR_NOT_SAME_DEVICE) The system cannot move the file to a different disk drive. 18 (ERROR_NO_MORE_FILES) There are no more files. 19 (ERROR_WRITE_PROTECT) The media is write protected. 20 (ERROR_BAD_UNIT) The system cannot find the device specified. 21 (ERROR_NOT_READY) The device is not ready. 22 (ERROR_BAD_COMMAND) The device does not recognize the command. 23 (ERROR_CRC) Data error (cyclic redundancy check). 24 (ERROR_BAD_LENGTH) The program issued a command but the command length is incorrect. 25 (ERROR_SEEK) The drive cannot locate a specific area or track on the disk. 26 (ERROR_NOT_DOS_DISK) The specified disk or diskette cannot be accessed. 27 (ERROR_SECTOR_NOT_FOUND)
761
The drive cannot find the sector requested. 28 (ERROR_OUT_OF_PAPER) The printer is out of paper. 29 (ERROR_WRITE_FAULT) The system cannot write to the specified device. 30 (ERROR_READ_FAULT) The system cannot read from the specified device. 31 (ERROR_GEN_FAILURE) A device attached to the system is not functioning. 32 (ERROR_SHARING_VIOLATION) The process cannot access the file because it is being used by another process. 33 (ERROR_LOCK_VIOLATION) The process cannot access the file because another process has locked a portion of the file. 34 (ERROR_WRONG_DISK) The wrong diskette is in the drive. Insert %2 (Volume Serial Number: %3) into drive %1. 36 (ERROR_SHARING_BUFFER_EXCEEDED) Too many files opened for sharing. 38 (ERROR_HANDLE_EOF) Reached the end of the file. 39 (ERROR_HANDLE_DISK_FULL) The disk is full. 112 (ERROR_DISK_FULL) The disk is full. 123 (ERROR_INVALID_NAME) The filename, directory name, or volume label syntax is incorrect. 1450 (ERROR_NO_SYSTEM_RESOURCES) Insufficient system resources exist to complete the requested service.
762
d'environs 8000 octets. Les colonnes LONGBLOB et LONGTEXT doivent tre un peut plus petite que 4Go, et la taille totale d'une ligne, incluant les colonnes BLOB et TEXT doivent tre de 4 Go. InnoDB stocke les 512 premiers octets des valeurs BLOB et TEXT dans la ligne, et le reste dans une page spare. Sur certains systmes d'exploitation, le fichier de donnes est limit 2 Go. La taille combine des fichiers de log doit tre infrieure 4 Go. La taille minimale d'un espace de tables est de 10Mo. La taille maximale d'un espace de tables est de 4 milliards de pages de bases (64To). C'est aussi la taille maximal d'une table. Les tables InnoDB ne supportent pas les index FULLTEXT. Sous Windows, InnoDB stocke les noms de bases de donnes et les noms de tables en interne, et en minuscule. Pour passer une base au format binaire de Unix Windows, ou le contraire, vous devez crer toutes vos bases et tables en minuscules. Attention : NE convertissez PAS les tables de droits du format MyISAM en InnoDB! Cela n'est pas support. Si vous fates cela, MySQL ne va pas redmarrer jusqu' ce que vous restauriez vos donnes avec une vieille sauvegarde, ou que vous regnriez ces tables avec le script mysql_install_db. InnoDB ne conserve pas de compte interne de ligne pour une table. Cela serait en fait compliqu, cause du multi-versionnage. Pour traiter une commande SELECT COUNT(*) FROM T, InnoDB doit scanner l'index de la table, ce qui prendra du temps si la table n'est pas enregistre dans le buffer. Pour acclrer le compte, vous devez crer un compteur de table vous-mme, et votre application le modifiera chaque ajout ou suppression. Si votre table ne change pas souvent, l'utilisation du cache sera une bonne solution. SHOW TABLE STATUS peut aussi tre utilis pour obtenir un dcompte approximatif des lignes. See Section 15.12, Conseils pour l'amlioration des performances InnoDB . Pour une colonne AUTO_INCREMENT, vous devez toujours dfinir un index pour la table, et cet index doit contenir uniquement la colonne AUTO_INCREMENT. Dans les tables MyISAM, la colonne AUTO_INCREMENT peut faire partie d'un index multi-colonne. InnoDB ne supporte pas l'option de configuration initiale des colonnes AUTO_INCREMENT dans les commandes CREATE TABLE ou ALTER TABLE. Pour configurer cette valeur avec une table InnoDB, insrez une ligne avec une valeur infrieure d'une unit votre valeur de dpart, ou bien insrez la premire ligne en spcifiant la premire valeur. Lorsque vous redmarrez le serveur MySQL, InnoDB peut rutiliser une ancienne valeur de la squence AUTO_INCREMENT (c'est dire, une valeur qui a t assigne une transaction annule). Lorsque la colonne AUTO_INCREMENT n'a plus de valeurs, InnoDB passe le BIGINT -9223372036854775808 et les BIGINT UNSIGNED 1. Cependant, les valeurs BIGINT sont codes sur 64 bits, alors mme si vous insrez 1 million lignes par seconde, cela vous prendra un million d'annes avant d'atteindre la limite des BIGINT. Avec les autres types de colonnes, une erreur de cl doublon sera mise. C'est identique au fonctionnement des tables MyISAM, le comportement gnrale de MySQL, et ce n'est pas caractristique d'un moteur spcifique. DELETE FROM TABLE ne regnre pas la table, mais au lieu de cela, il efface les lignes une une, ce qui est bien plus lent. Dans les prochaines versions, MySQL va pouvoir utiliser la commande TRUNCATE qui est trs rapide. TRUNCATE tbl_name est synonyme de DELETE FROM tbl_name pour InnoDB et ne remet pas zro le compteur de AUTO_INCREMENT. SHOW TABLE STATUS ne donne pas de statistiques exactes pour les tables InnoDB, hormis pour la taille physique rserve par la table. Le nombre de lignes n'est qu'une estimation utilise pour les optimisations SQL.
763
Si vous essayez de crer un index unique sur un prfixe d'une colonne, vous allez obtenir une erreur :
CREATE TABLE T (A CHAR(20), B INT, UNIQUE (A(5))) TYPE = InnoDB;
Si vous crez un index non-unique sur un prfixe de colonne, InnoDB va crer un index pour toute la colonne. Ces restrictions sont leves depuis les versions 4.0.14 et 4.1.1. INSERT DELAYED n'est pas supports par les tables InnoDB. La commande MySQL LOCK TABLES ne reconnait pas le verrouillage de ligne InnoDB ralis dans les commandes SQL acheves : cela signifie que vous pouvez poser un verrou sur une table mme si il existe une transaction qui a t pose par un autre utilisateur. Par consquent, votre opration doit attendre que les autres tables soient libres, et elle peut aussi entrer en conflit avec une autre requte. De plus, un blocage de verrous est possible mais il ne met pas en danger l'intgrit des transactions, car le verrou de ligne pos par InnoDB se charge toujours de l'intgrit. Enfin, un verrou de table vite aux autre transactions de poser un verrou de ligne (en conflit avec le mode de verrous) sur la table. Avant MySQL 3.23.52, la rplication fonctionnait toujours en mode d'auto-validation. Par consquent, les lectures cohrentes de l'esclaves voyait aussi les transactions partiellement traites, et la cohrence n'tait pas assure. Cette restriction a t leve en MySQL 3.23.52. La commande LOAD TABLE FROM MASTER de configuration de la rplication ne fonctionne pas pour les tables InnoDB. Un palliatif consiste modifier la table en MyISAM sur le matre, faire la configuration, puis repasser la table en format InnoDB. La taille par dfaut d'une page de base avec InnoDB est de 16Ko. En recompilant le code, vous pouvez donner une valeur allant de 8Ko 64Ko. Vous mettre jour les valeurs des constantes UNIV_PAGE_SIZE et UNIV_PAGE_SIZE_SHIFT dans le fichier univ.i.
764
anciennes, ou si le serveur crashe au milieu d'une opration dans le dictionnaire de donnes, le fichier .frm peut tre dconnect du dictionnaire de donnes interne InnoDB. Un symptme de ce dphasage est que les commandes CREATE TABLE chouent. Si cela arrive, vous devez lire le fichier de log d'erreurs. Si le fichier de log dit que la table existe dj dans le dictionnaire interne d'InnoDB, vous avez un fichier de table orphelin dans l'espace de table InnoDB, qui n'a plus de fichier .frm correspondant. Le message d'erreur ressemble ceci :
InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: InnoDB: Error: table test/parent already exists in InnoDB internal data dictionary. Have you deleted the .frm file and not used DROP TABLE? Have you used DROP DATABASE for InnoDB tables in MySQL version <= 3.23.43? See the Restrictions section of the InnoDB manual. You can drop the orphaned table inside InnoDB by creating an InnoDB table with the same name in another database and moving the .frm file to the current database. Then MySQL thinks the table exists, and DROP TABLE will succeed.
Vous pouvez effacer le fichier orphelin en suivant les instructions du message d'erreur. Un autre symptme de dphasage st que MySQL affiche MySQL une erreur qui dit qu'il ne peut pas ouvrir le fichier .InnoDB :
ERROR 1016: Can't open file: 'child2.InnoDB'. (errno: 1)
Cela signifie qu'il y a un fichier .frm orphelin sans table correspondante dans les donnes InnoDB. Vous pouvez effacer simplement le fichier orphelin .frm. Si MySQL crashe au milieu d'une opration ALTER TABLE, vous pouvez vous retrouver avec un fichier temporaire de table, orphelin, dans le code InnoDB. Avec innodb_table_monitor vous pouvez voir une table dont le nom est #sql..., mais comme MySQL ne vous permet pas d'accder une table avec un tel nom vous ne pouvez ni l'effacer, ni la dtruire. La solution est d'utiliser un mcanisme spcial, disponible depuis MySQL 3.23.48. Lorsque vous avez une table orpheline #sql_id dans un espace de table, vous pouvez faire que InnoDB le renomme en rsql_id_recover_innodb_tmp_table avec la commande :
CREATE TABLE `rsql_id_recover_innodb_tmp_table`(...) TYPE=InnoDB;
Les guillemets obliques autour du nom de table sont ncessaires car une table temporaire contient un tiret -. La dfinition de la table doit tre similaire celle de la table temporaire. Si vous ne connaissez pas la dfinition de la table temporire, vous pouvez utiliser une dfinition arbitraire dans la commande CREATE TABLE prcdente, et ensuite, remplacer le fichier rsql_id.frm par le fichier #sql_id.frm de la table temporaire. Notez que pour copier ou pour renommer un fichier dans le shell, vous devez mettre le nom du fichier entre guillemets, car le nom du fichier contient #. Alors, vous pouvez exporter et effacer la table renomme.
765
766
767
Tous ces programmes fonctionnent ensemble pour former un Cluster MySQL. Lorsque les donnes sont stockes dans le moteur NDBCluster, les tables sont rparties sur les noeuds NDBCluster. Ces tables sont directement accessibles depuis tous les autres serveurs MySQL faisant partie du Cluster. Par consquent, si une application met jour une ligne, tous les autres serveurs le verront immdiatement. Les donnes stockes dans le moteur de table de MySQL Cluster peut tre dupliques, et sont capables de grer une indisponibilit d'un noeud sans autre impact que l'annulation des transactions qui utilisaient ces donnes. Cela ne devrait pas tre un problme, cas les applications transactionnelles sont crites pour grer les checs de transaction. En plaant MySQL Cluster en Open Source, MySQL rend les hautes performances, haute disponibilit et grands trafics accessibles tous ceux qui en ont besoin.
768
Hypothses de base Ce guide part des hypothses suivantes : 1. Nous allons configurer un clusteur de quatre noeuds, chacun sur un hte distinct, et chacun des htes tant reli au rseau avec une adresse IP fixe, via une carte Ethernet classique, comme ceci : Noeud Noeud de gestion (MGM) Serveur MySQL (SQL) Serveur de stockage (NDBD) "A" Serveur de stockage (NDBD) "B" Cela est peut-tre plus clair sur le schma suivant : Adresse IP 192.168.0.10 192.168.0.20 192.168.0.30 192.168.0.40
Note : par souci de simplicity et de robustesse, nous allons utiliser les adresses IP numriques dans ce guide. Cependant, si la rsolution DNS est disponible sur votre rseau, il est aussi possible d'utiliser les noms d'htes plutt que les IP lors de la configuration du cluster. Alternativement, vous
769
pouvez aussi utiliser le fichier /etc/hosts de votre systme d'exploitation ou son quivalent pour fournir un systme de rsolution de noms. 2. Chaque hte est un ordinateur de bureau Intel, avec une distribution gnrique LInux sur le disque, dans une configuration standard, et sans aucun service inutile. Le coeur du systme et une client standard TCP / IP doivent tre suffisants. De mme, par souci de simplicit, nous allons suppposer que les systmes de fichiers des htes sont tous identiques. Dans le cas o il ne le sont pas, vous devrez adapter les instructions en fonctions des situations. 3. Des cartes 100 megabits ou gigabits Ethernet sont installes sur chaque machine, avec les bons pilotes pour les cartes, et chaque hte est connect au rseau via un routeur standard, comme un switch. Toutes les machines doivent utiliser des cartes avec le mme dbit, c'est dire que toutes les machines du cluster sont en 100 megabits, or bien en gigabit. Le cluster MySQL fonctionnera sur un rseau 100 megabits, mais les cartes gigabit fourniront de meilleures performances. Notez que le cluster MySQL n'est pas prvu pour fonctionner sur un rseau avec une connectivit infrieure 100 megabits. Pour cette raison, entre autres, faire fonctionner un cluster MySQL sur un rseau public ou via Internet risque de ne pas russier, et n'est pas recommand. 4. Pour les donnes de tests, nous allons utiliser la base de donnes world qui est disponible en tlchargement sur le site de MySQL AB. Comme cette base de donnes prend peut d'espace, nous pouvons fonctionner avec des machines ayant 256 Mo de RAM, ce qui doit tre suffisant pour le systme d'exploitation, les processus NDB et le stockage dans les noeuds. Mme si nous faisons rfrence Linux comme systme d'exploitation dans ce guide, les instructions et les procdures sont faciles adapter pour Solaris ou Mac OS X. Nous supposons aussi que vous savez faire une installation minimale et la configuration du systme d'exploitation en rseau, ou que vous disposez d'assistance pour ce faire. Nous allons prsenter les besoins en matriel, logiciels et rseau pour le cluster MySQL dans la prochaine section. Voyez Section 16.3.1, Matriel, logiciels et rseau .
770
Installation
Cluster MySQL soit plac derrire un pare-feu, et non pas dans la zone dmilitarise (DMZ) ou ailleurs. Efficacit : configurer un Cluster MySQL sur un rseau priv ou protg donne au Cluster MySQL l'exclusivit de la bande passante. En utilisant un switch ddi au Cluster MySQL aide la protection contre les accs non autoriss, et il protge les noeuds des interfrences causes par les autres machines sur le rseau. Pour une stabilit accrue, vous pouvez utiliser des switchs redondants et des cartes rseau doubles pour supprimer du rseau les points de panne : de nombreux pilotes rseau savent s'adapter si une panne survient sur un brin de rseau. Il est aussi possible d'utiliser l'interface SCI (Scalable Coherent Interface haute vitesse, avec le Cluster MySQL, mais ce n'est pas ncessaire. Voyez Section 16.7, Utilisation d'interconnexions haute vitesse avec MySQL Cluster pour plus d'informations sur ce protocole et ses utilisation avec Cluster MySQL.
16.3.2. Installation
Chaque hte du cluster MySQL qui hberge un noeud de stockage ou un noeud SQL doit tre install avec MySQL-max. Pour les noeuds de gestion, il n'est pas ncessaire d'installer un serveur MySQL, mais vous devez installer un dmon MGM et les clients ndb_mgmd et ndb_mgm, respectivement. Dans cette section, nous allons voir les tapes ncessaires pour installer correctement chaque serveur pour un noeud du cluster. Au moment de l'criture de cette section, les versions les plus rcentes taient MySQL 4.1.10a; si une version plus rcente est dinsponible, il est recommande de l'installer et d'utiliser ce numro de version dans tout le reste de la section. MySQL fournit des serveurs prcompils, et il n'y a gnralement pas besoin de compiler par vous-mme. Si vous voulez faire une compilation personnalise, voyez Section 2.4.3, Installer partir de l'arbre source de dveloppement . Par consquent, la premire tape de l'installation de chaque hte du cluster est de tlcharger le fichier mysql-max-4.1.10apc-linux-gnu-i686.tar.gz depuis MySQL downloads area. Nous supposons que vous l'avez fait, et install dans le dossier /var/tmp de chaque machine. Des RPM sont aussi disponibles pour les plate-formes 32 et 62 bits; depuis MySQL 4.1.10a, les serveurs MySQL-max installs via RPM supportent les clusters NDB. Si vous choisissez d'utiliser ces outils plutt que les fichiers binaires, assurez-vous d'installer la fois les paquets -server et -max sur toutes les machines qui hbergent des noeuds du cluster. Voyez Linux pour plus d'informations sur l'installation de MySQL en RPM. Aprs l'installation des RPM, nous devez toujours configurer le cluster, tel que prsent dans Section 16.3.3, Configuration . Note! : aprs l'installation, ne lancez pas encore les logiciels. Nous allons vous montrer comment le faire, alors suivez d'abord la configuration des noeuds. Installation des noeuds de stockage et SQL Pour chacune des machines dsignes pour tre des htes de stockage ou des htes SQL, suivez les tapes suivantes, en tant que super utilisateur : 1. Vrifiez vos fichiers /etc/passwd et /etc/group ou utilisez les outils systmes dont vous disposez pour grer les groupes et utilisateurs pour vrifier si vous avez un groupe mysql et un utilisateur mysql sur votre systme : certaines distributions les crent automatiquement lors de leur installation. Si ces comptes n'existent pas, alors crez un groupe mysql et un utilisateur mysql, comme ceci :
groupadd mysql useradd -g mysql mysql
2. Placez-vous dans le dossier qui contient le fichier tlcharg; dcompressez l'archive; crez un lien symbolique vers l'excutable mysql-max :
cd /var/tmp tar -xzvf -C /usr/local/bin mysql-max-4.1.10a-pc-linux-gnu-i686.tar.gz ln -s /usr/local/bin/mysql-max-4.1.10a-pc-linux-gnu-i686 mysql
771
Configuration
3. Placez vous dans le dossier mysql, et excutez le script fournit pour la cration des bases de donnes systme :
cd mysql scripts/mysql_install_db --user=mysql
Notez que le dossier de donnes de chaque machine qui hberge un noeud de stockage est / usr/local/mysql/data. Nous allons utiliser cette information lors de la configuration du noeud de gestion. Voyez Section 16.3.3, Configuration . 5. Copiez le script de dmarrage MySQL dans le dossier appropri, rendez-le excutable, et configurez-le pour qu'il s'excute lorsque le systme d'exploitation dmarre :
cp support-files/mysql.server /etc/rc.d/init.d/ chmod +x /etc/rc.d/init.d/mysql.server chkconfig --add mysql.server
Ici, nous utilisons la commande de Red Hat chkconfig pour crer les liens vers les scripts de dmarrage; utilisez les moyens appropris pour faire la mme chose sur votre systme d'exploitation, tel que update-rc.d sur Debian. N'oubliez pas que ces listes d'instructions doivent tre excutes sparement sur chaque machine qui sera un noeud de stockage ou un noeud SQL. Installation du noeud de gestion Pour le noeud MGM (serveur de gestion), il n'est pas ncessaire d'installer mysqld, mais seulement le serveur MGM et les clients, qui sont disponibles dans l'archive -max. Encore une fois, nous supposons que vous avez plac de fichier dans le dossier /var/tmp. En tant que root (c'est dire, aprs avoir excut la commande su root ou l'quivalent sur votre systme pour se faire attribuer les droits de super utilisateur), effectuez les commandes suivantes pour installer ndb_mgmd et ndb_mgm sur l'hte de gestion : 1. Allez dans le dossier /var/tmp et dcompressez ndb_mgm et ndb_mgmd de l'archive, dans un dossier appropri, comme /usr/local/bin :
cd /var/tmp tar -zxvf mysql-max-4.1.10a-pc-linux-gnu-i686.tar.gz /usr/local/bin '*/bin/ndb_mgm*'
2. Placez-vous dans le dossier o vous avez dcompress les fichiers, puis rendez-les tous les deux excutables :
cd /usr/local/bin chmod +x ndb_mgm*
Dans Section 16.3.3, Configuration , nous allons crer et configurer les fichiers pour tous les noeuds du cluster d'exemple.
16.3.3. Configuration
Pour notre MySQL Cluster de quatre noeuds et quatre htes, nous auront besoin de prparer quatres fichiers de configuration, un par hte/noeud. Chaque noeud de stockage ou noeud SQL a besoin d'un fichier my.cnf qui fournit 2 informations : une chane connectstring qui indique au noeud o trouver le noeud MGM, et une ligne indiquant au serveur MySQL de cet hte de fonctionner en mode NDB. Pour plus d'informations sur les chanes de connexion, voyez Section 16.4.4.2, La chane connectstring du Cluster MySQL .
772
Configuration
Le noeud degestion a besoin d'un fichier config.ini qui indique combien de rquliques doivent tre gres, combien de mmoire allouer pour les donnes et les index sur chaque noeud de stockage, o trouver les noeuds de stockage, o les donnes seront sauves sur le disque, et o trouver les noeuds SQL. Configurer les noeuds de stockage et SQL Le fichier my.cnf destin aux noeuds de stockage est plutt simple. Le fichier de configuration doivent tre plac dans le dossier /etc et peut tre dit ou cr avec n'importe quel diteur fichier. Par exemple :
vi /etc/my.cnf
Pour chaque noeud de stockage et chaque noeud SQL de notre exemple, le fichier my.cnf doit ressembler ceci :
[MYSQLD] ndbcluster ndb-connectstring=192.168.0.10 [MYSQL_CLUSTER] ndb-connectstring=192.168.0.10 # Options du processus mysqld # Fonctionne en mode NDB # Situation du noeud MGM # Options pour le processus ndbd # Situation du noeud MGM
Aprs la saisie des donnes ci-dessus, sauvez ce fichier et quittez l'diteur de texte. Faites cela pour les noeuds de stockages "A" et "B", et le noeud SQL. Configuration du noeud de gestion La premire tape de configuration du noeud MGM est la cration du dossier dans lequel le fichier de configuration sera plac, et d'y crer le fichier lui-mme. Par exemple, lors d'un fonctionnement root :
mkdir /var/lib/mysql-cluster cd /var/lib/mysql-cluster vi config.ini
Nous prsentons ici la commande vi utilise pour crer le fichier, mais n'importe quel autre diteur texte fonctionnement aussi bien. Pour notre configuration d'exemple, config.ini doit contenir les informations suivantes :
[NDBD DEFAULT] NoOfReplicas=2 DataMemory=80M IndexMemory=52M # # # # # # # # Options affectant les processus ndbd processes sur tous les noeuds Nombre de rpliques Mmoire allouer pour le stockage des donnes Mmoire allouer pour le stockage des index Pour DataMemory et IndexMemory, nous avons utilis les valeurs par dfault. Comme la base de donnes "world" ne prend que 500KB, cela devrait tre suffisant pour notre exemple de Cluster
[TCP DEFAULT] # Options TCP/IP portnumber=2202 # Ceci est la valeur par dfaut. Cependant, nous pourrions # utiliser un port libre pour les autres htes du cluster. # Note : il est recommand avec MySQL 5.0 de ne pas spcifier # de port, et de laisser la valeur par dfaut. [NDB_MGMD] hostname=192.168.0.10 datadir=/var/lib/mysql-cluster [NDBD] hostname=192.168.0.30 datadir=/usr/local/mysql/data [NDBD] hostname=192.168.0.40 datadir=/usr/local/mysql/data [MYSQLD] # Options de gestion des processus : # Nom d'hte ou adresse IP du noeud MGM # Dossier des fichiers de logs du noeud MGM # # # # Options pour le stockage du noeud "A" : (une section [NDBD] par noeud de stockage) Nom d'hte ou adresse IP Dossier pour les fichiers de donnes du noeud
# Options pour le stockage du noeud "B" : # Nom d'hte ou adresse IP # Dossier pour les fichiers de donnes du noeud # Options des noeuds SQL :
773
Dmarrage initial
hostname=192.168.0.20
# # # #
Nom d'hte ou adresse IP (Les connexions mysqld supplmentaires peuvent tre spcifies pour ce noeud pour diffrents objectifs, comme l'excution de ndb_restore)
NOTE : la base de donnes "world" peut tre tlcharge sur le site http://dev.mysql.com/doc/, rang dans la section d'exemples : Examples. Une fois que tous les fichiers de configuration ont t crs et que ces options minimales ont t spcifies, vous tes prts lancer le cluster MySQL et vrifier que les processus fonctionnent. La prsentation de cette tape est fate dans Section 16.3.4, Dmarrage initial . Pour plus de dtails sur les paramtres de configuration du cluster MySQL, voyez Section 16.4.4, Fichier de configuration et Section 16.4, Configuration de MySQL Cluster . Pour la configuration du Cluster MySQL au sujet des sauvegardes, voyez Section 16.6.4.4, Configuration pour la sauvegarde du Cluster . Note : le port par dfaut pour le noeud de gestion du Cluster MySQL est le 1186; le port par dfaut pour les noeuds de stockage est 2202.
Notez que ndb_mgmd doit recevoir le nom et chemin du fichier de configuration, avec l'option -f ou --config-file. Voyez Section 16.5.3, ndb_mgmd, le serveur de gestion pour plus de dtails. 2. Sur chaque hte de stockage, excutez cette commande pour lancer les processus NDBD :
shell> ndbd --initial
Notez qu'il est trs important d'utiliser le paramtre --initial uniquement lors du premier dmarrage de ndbd, ou lors du redmarrage aprs une opration de restauration des donnes ou de modification de configuration. En effet, ce paramtre va forcer le noeud effacer les fichiers cr par les anciennes instances de ndbd, y compris les fichiers de log. 3. Sur les htes SQL, excutez une commande mysqld classique :
shell> mysqld &
Si tout se passe bien, et que le cluster a t correctement configur, il devrait tre oprationnel nouveau. Vous pouvez tester cela en utilisant la commande ndb_mgm, c'est dire le client de gestion; le rsultat devrait tre similaire celui-ci :
shell> ndb_mgm -- NDB Cluster -- Management Client -ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------[ndbd(NDB)] 2 node(s) id=2 @192.168.0.30 (Version: 4.1.11, Nodegroup: 0, Master) id=3 @192.168.0.40 (Version: 4.1.11, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.10 (Version: 4.1.11) [mysqld(SQL)] 1 node(s)
774
id=4
(Version: 4.1.11)
Vous pouvez rencontrer diverses adaptations en fonction des versions exactes de MySQL que vous utilisez. Note : si vous utilisez une ancienne version de MySQL, vous pourriez voir les noeuds SQL rfrencs sous le nom [mysqld(API)]. C'est une ancienne pratique qui n'a plus court. Vous tes maintenant prts utiliser vos bases de donnes, vos tables et vos donnes dans le cluster MySQL. Voyez Section 16.3.5, Charger les donnes d'exemple et excuter des requtes pour aller plus loin.
Le rsultat du fichier city_table.sql contient la commande de cration de la table et les commandes d'insertion INSERT pour importer les donnes dans la table :
DROP TABLE IF EXISTS City; CREATE TABLE City ( ID int(11) NOT NULL auto_increment, Name char(35) NOT NULL default '', CountryCode char(3) NOT NULL default '', District char(20) NOT NULL default '', Population int(11) NOT NULL default '0', PRIMARY KEY (ID) ) TYPE=MyISAM; INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); # (remaining INSERT statements omitted)
Vous devez vous assurer que MySQL utilise le moteur NBD pour cette table. Il y a deux moyens pour le faire. L'un deux, avant l'importation des donnes dans la table, consiste modifier la dfinition de la table pour qu'elle corresponde ceci (toujours en utilisant la table City) :
DROP TABLE IF EXISTS City; CREATE TABLE City ( ID int(11) NOT NULL auto_increment, Name char(35) NOT NULL default '', CountryCode char(3) NOT NULL default '', District char(20) NOT NULL default '', Population int(11) NOT NULL default '0', PRIMARY KEY (ID) ) ENGINE=NDBCLUSTER; INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); # (etc.)
775
Cela doit tre fait pour la dfinition de chaque table qui fait partie de la base de donnes en cluster. Le plus simple pour faire cela est de faire un rechercher-remplacer dans le fichier world.sql et de remplacer toutes les instances de TYPE=MyISAM par ENGINE=NDBCLUSTER. Si vous ne voulez pas modifier ce fichier, vous pouvez aussi utiliser la commande ALTER TABLE; voyez plus bas pour les spcificits. En supposant que vous ave dj cr la base de donnes appele world sur le noeud SQL du cluster, vous pouvez utiliser l'utilitaire de ligne de commande mysql pour lire le fichier city_table.sql, et crer puis remplir la table, comme ceci :
shell> mysql world < city_table.sql
Il est trs important de garder en tte que lest commandes ci-dessus doivent tre excutes sur l'hte o le noeud SQL tourne : dans ce cas, sur la machine avec l'adresse IP 192.168.0.20. Pour crer une copie de la base de donnes world sur le noeud SQL, sauvez le fichier dans /usr/ local/mysql/data, puis excutez ces commandes :
shell> cd /usr/local/mysql/data shell> mysql world < world.sql
Bien sur, le script SQL doit tre lisible par l'utilisateur mysql. Si vous sauvez le fichier un autre endroit, ajustez les chemins dans les commandes ci-dessus. Excuter les commandes SELECT sur un noeud SQL n'est pas diffrent de les excuter sur une autre instance de serveur MySQL. Pour excuter les requtes SQL en ligne de commande, vous devez vous identifier sur le serveur, comme d'habitude :
shell> mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 4.1.9-max Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
Si vous n'avez pas modifi les clauses ENGINE= dans les dfinitions de tables, vous pouvez alors utiliser ces commandes :
mysql> mysql> mysql> mysql> USE world; ALTER TABLE City ENGINE=NDBCLUSTER; ALTER TABLE Country ENGINE=NDBCLUSTER; ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;
Notez que nous avons simplement utilis le compte d'administrateur par dfaut, sans mot de passe. Bien entendu, dans un environnement de production, il est recommand de toujours suivre les prcautions de scurit, y compris l'utilisation d'un mot de passe robuste pour le super utilisateur, et la cration d'un compte spcifique, avec uniquement les droits ncessaires aux tches incombantes. Pour plus de dtails, voyez la section Section 5.5, Rgles de scurit et droits d'accs au serveur MySQL . Il est noter que les noeuds du cluster n'utilisent pas les droits d'accs MySQL lorsqu'ils se connectent l'un l'autre : modifier ces droits n'a pas d'effet sur les communications entre les noeuds. Slectionner la base de dones et excuter une requte SELECT sur une table se fait comme d'habitude :
mysql> USE world; mysql> SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5; +-----------+------------+ | Name | Population | +-----------+------------+
776
| Bombay | 10500000 | | Seoul | 9981619 | | So Paulo | 9968485 | | Shanghai | 9696300 | | Jakarta | 9604900 | +-----------+------------+ 5 rows in set (0.34 sec) mysql> \q Bye shell>
Les applications qui reposent sur MySQL peuvent utiliser l'API standard. Il est important de penser ce que votre application doit se connecter un noeud SQL, et non pas aux noeuds de stockage ou au serveur de gestion. Cet exemple montre comment vous ourriez excuter une requte en utilisant l'extension mysqli de PHP 5, sur un serveur Web :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Slection de donnes avec mysqli</title> </head> <body> <?php # Connexion au noeud SQL : $link = new mysqli('192.168.0.20', 'root', '', 'world'); # Les paramtres pour le constructeur mysqli sont : # hote, utilisateur, mot de passe, base de donnes if( mysqli_connect_errno() ) { die("Connexion choue : " . mysqli_connect_error()); } $query = "SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5"; # s'il n'y a pas d'erreur if( $result = $link->query($query) ) { ?> <table border="1" width="40%" cellpadding="4" cellspacing ="1"> <tbody> <tr> <th width="10%">Ville</th> <th>Population</th> </tr> <?php // Affichage du rsultat while($row = $result->fetch_object()) printf(<tr>\n <td align=\"center\">%s</td><td>%d</td>\n</tr>\n", $row->Name, $row->Population); ?> </tbody </table> <?php // Vrification du nombre de ligne lues printf("<p>Lignes affectes : %d</p>\n", $link->affected_rows); } else # Sinon, affichage de l'erreur echo mysqli_error(); // Libration du rsultat et de l'objet de connexion $result->close(); $link->close();
777
Nous supposons que le processus du serveur Web peut atteindre l'IP du noeud SQL. De manire similaire, vous pouvez utiliser l'API C de MySQL, ou les interface Perl-DBI, Pythonmysql ou encore les connecteurs de MySQL AB pour effectuer les tches de dfinition de donnes et de manipulations, comme vous le fates habituellement avec un serveur MySQL. N'oubliez pas que toutes les tables NDB doivent avoir une cl primaire. Si aucune cl primaire n'est dfinie par l'utilisateur lors de la cration de la table, le moteur de stockage NDB va en gnrer une automatiquement. Note : cette cl cach prend de l'espace, comme tout autre indexe. Il n'est pas rare de rencontrer des problmes de mmoire lorsque vous devez prendre en compte ces cls automatiques.
Cela va forcer les processus ndb_mgm, ndb_mgm et ndbd s'arrter proprement. Tous les noeuds SQL peuvent alors tre arrt avec la commande mysqladmin shutdown classiques ou par d'autres moyens. Pour relancer le cluster, lancez simplement ces commandes : Sur l'hte de gestion (192.168.0.10 dans notre cas) :
shell> ndb_mgmd -f /var/lib/mysql-cluster/config.ini
N'oubliez pas d'invoquer cette commande avec l'option --initial lorsque vous redmarrez un noeud NDBD normalement. Et les htes SQL (192.168.0.20) :
shell> mysqld &
Pour des informations sur les sauvegardes, voyez Section 16.6.4.2, Utilisation du serveur de gestion pour une sauvegarde de cluster . Pour restaurer le cluster partir de sauvegardes, il faut utiliser la commande ndb_restore. Vous pouvez vous informer la dessus sur Section 16.6.4.3, Comment restaurer une sauvegarde du cluster . Plus d'information sur la configuration du cluster MySQL est disponible dans Section 16.4, Configuration de MySQL Cluster .
778
Compilation du cluster
De plus, comme le serveur MySQL est une partie du cluster, il doit savoir comment accder au noeud MGM, pour connatre la configuration du cluster. Il y a un comportement par dfaut qui recherche le noeud MGM sur le serveur local. Mais si vous devez le placer ailleurs, vous pouvez le en ligne de commande ou bien dans le fichier my.cnf. Avant que le moteur de stockage NDB ne soit utilis, un noeud MGM est une base de noeud doit tre active et accessible. Le seul noeud MGM est suffisant pour dmarrer.
Dans ce dossier, crez un fichier config.ini avec le contenu suivant. Remplacez HostName et DataDir par les valeurs de votre installation.
# file "config.ini" - showing minimal setup consisting of 1 DB node, # 1 management server, and 3 MySQL servers. # The empty default sections are not needed, and are shown only for clarity. # Storage nodes are required to provide a host name but MySQL Servers # are not. Thus the configuration can be dynamic as to setting up the # MySQL Servers. # If you don't know the host name of your machine, use localhost. # The DataDir parameter also has a default value, but it is recommended to # set it explicitly. # NDBD, MYSQLD, and NDB_MGMD are aliases for DB, API, and MGM respectively # [NDBD DEFAULT] NoOfReplicas= 1 [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] [NDB_MGMD] HostName= myhost.example.com
779
Puis, lancez un noeud de base, grce au programme ndbd. Si c'est la toute premire fois que vous lancez ndbd, utilisez l'option --initial :
shell> ndbd --initial
Par dfaut, ndbd va rechercher le serveur de gestion sur localhost, port 2200. Notez que si vous avez install une distribution binaire, vous aurez besoin de spcifier explicitement le chemin des commandes ndb_mgmd et ndbd. Ils se trouvent dans le dossier /usr/local/mysql/ bin. Finalement, allez dans le dossier de donnes MySQL (il sera probablement dans /var/lib/mysql ou /usr/local/mysql/data). Assurez-vous que le fichier my.cnf contient les options ncessaires pour activer le moteur NDB Cluster :
[mysqld] ndbcluster
Attendez un moment, et assurez-vous que le serveur fonctionne correctement. Si vous voyez un message ``mysql ended'', vrifiez le fichier d'erreur du serveur .err pour savoir ce qui se passe. Si tout est bien all, vous pouvez lancer le cluster :
shell> mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 4.1.7-gamma Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SHOW STORAGE ENGINES; +------------+---------+------------------------------------------------------------+ | Engine | Support | Comment | +------------+---------+------------------------------------------------------------+ ... | NDBCLUSTER | DEFAULT | Clustered, fault-tolerant, memory-based tables | | NDB | YES | Alias for NDBCLUSTER | ... mysql> USE test; Database changed mysql> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER; Query OK, 0 rows affected (0.09 sec) mysql> show create table ctest \G *************************** 1. row *************************** Table: ctest Create Table: CREATE TABLE `ctest` ( `i` int(11) default NULL ) ENGINE=ndbcluster DEFAULT CHARSET=latin1
780
Fichier de configuration
Si vous voulez vrifier que vos noeuds ont t correctement configurs, vous pouvez lancer le client de gestion :
shell> ndb_mgm
781
Fichier de configuration
[NDB_MGMD] Hostname= ndb_mgmd.mysql.com DataDir= /var/lib/mysql-cluster [NDBD] HostName= ndbd_2.mysql.com [NDBD] HostName= ndbd_3.mysql.com [MYSQLD] [MYSQLD] HostName= mysqld_5.mysql.com
Il y a ici 6 sections dans le fichier. [COMPUTER] dfinit les ordinateurs du cluster. [API|MYSQLD] dfinit les noeuds de serveur MySQL du cluster. [MGM|NDB_MGMD] dfinit le serveur de gestion du cluster. [TCP] dfinit les connexions TCP/IP entre les noeuds du cluster, TCP/IP est le mcanisme de connexion par dfaut entre deux noeuds. [SHM] dfinit les connexions par mmoire partage entre les noeuds. Ce n'est possible que si les noeuds ont t compil avec l'option --with-ndb-shm. Pour chaque section, il est possible de dfinir un comportement par dfaut, DEFAULT. Les paramtres sont insensibles la casse depuis MySQL 4.1.5.
<id> est un entier plus grand que 1 qui identifie un noeud dans le fichier config.ini. <port> est un entier qui reprsente le port Unix. <host> est une chane qui est une adresse valide d'hte Internet.
example 1 (long): example 2 (short): "nodeid=2,myhost1:1100,myhost2:1100,192.168.0.3:1200" "myhost1"
Tous les noeuds vont utiliser localhost:1186 comme chane par dfaut, si elle n'est pas spcifi. Si <port> est omis dans la chane, le port par dfaut est 1186. (Note : avant MySQL 4.1.8, le port par dfaut tait 2200). Ce port doit toujours tre disponible sur le rseau, car il a t assign par l'IANA pour cela (voyez http://www.iana.org/assignments/port-numbers pour les dtails). En listant plusieurs valeurs <host-specification>, il est possible de dsigner plusieurs serveurs de gestion redondants. Un noeud de cluster va tenter de contacter successivement chaque serveur, dans l'ordre spcifi, jusqu' ce qu'une connexion soit tablie. Il y existe plusieurs moyens de spcifier la chane connectstring : Chaque programme a sa propre option de ligne de commande qui permet de spcifier le serveur de gestion au dmarrage. Voyez la documentation respective de chaque programme. Depuis MySQL 4.1.8, il est aussi possible de configurer connectstring pour chaque noeud du cluster en plaant une section [mysql_cluster] dans le fichier de configuration du serveur de gestion my.cnf. Pour la compatibilit ascendante, deux autres options sont disponibles en utilisant la mme syntaxe : 1. Configurer la variable d'environnement NDB_CONNECTSTRING pour qu'elle contienne connectstring. 2. Placez la chane connectstring pour chaque programme dans un fichier texte appel Ndb.cfg et placez de fichier dans le dossier de dmarrage.
782
Fichier de configuration
La mthode recommande pour spcifier la chane connectstring est de passer par la ligne de commande ou par le fichier my.cnf.
SYSLOG correspond l'envoi log systme. Il est ncessaire d'indiquer une mthode ici. Les mthodes possibles sont : auth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, syslog, user, uucp, local0, local1, local2, local3, local4, local5, local6, local7. Notez que toutes ces options ne sont pas forcment supportes par tous les systmes d'exploitation.
SYSLOG:facility=syslog
FILE reprsente un fichier standard sur la machine. Il est ncesaire de spcifier un nom de fichier, la taille maximale du fichier avant l'ouverture d'un nouveau fichier. L'ancien sera alors renomm avec l'extension .x o x est le prochain nombre libre. Il est aussi ncessaire de spcifier le nombre maximal de fichiers utiliss.
FILE:filename=cluster.log,maxsize=1000000,maxfiles=6
783
Fichier de configuration
CONSOLE;SYSLOG:facility=local0;FILE:filename=/var/log/mgmd
La valeur par dfaut de ce paramtre est FILE:filename=cluster.log,maxsize=1000000,maxfiles=6. [MGM]ArbitrationRank Ce paramtre est utilis pour dfinir les noeuds qui servent d'arbitre. Les noeuds de gestion MGM et les noeuds API peuvent tre utiliss comme arbitre. 0 signifie que le noeud n'est pas utilis comme arbitre, 1 est la priorit haute, et 2 la priorit basse. Une configuration normale utilisent les serveurs de gestion comme arbitre avec ArbitrationRank 1 (c'est la valeur par dfaut) et les noeuds d'API 0 (ce n'est pas le dfaut en MySQL 4.1.3). [MGM]ArbitrationDelay Si vous donnez une valeur diffrente de 0 cette option, cela signifie que le serveur de gestion retarde ses rponses d'autant, lorsqu'il reoit des demandes d'arbitrage. Par dfaut, il n'y a pas de dlai, et c'est trs bien comme ca. [MGM]DataDir C'est le dossier o les fichiers de rsultats du serveur de gestion seront placs. Ces fichiers sont les fichiers de log, les affichages de processus et le PID pour le dmon.
784
Fichier de configuration
[DB]NoOfReplicas Ce paramtre ne peut tre configur que dans la section [DB DEFAULT] car c'est un paramtre global. Il dfinit le nombre de rpliques de chaque table stocke dans le cluster. Ce paramtre spcifie aussi la taille du groupe de noeuds. Un groupe de noeud est un ensemble de noeuds qui stockent les mmes informations. Les groupes de noeuds sont forms implicitement. Le premier groupe est form par les noeuds de stockage avec les identits les plus petites, puis par ordre d'identit croissante. Par exemple, supposons que nous avons 4 noeuds de stockage et que NoOfReplicas vaut 2. Les quatres noeuds de stockage ont les identifiants 2, 3, 4 et 5. Le premier groupe de noeud sera form par les noeuds 2 et 3, et le second groupe sera form de 4 et 5. Il est important de configurer le cluster pour que les noeuds d'un mme groupe ne soit pas plac sur le mme ordinateur. Sinon, cela pourrait conduire avoir un point de faiblesse : un seul ordinateur peut planter le cluster. Si aucune identit n'est spcifie, alors l'ordre des noeuds de stockage va tre le facteur dterminant du groupe de noeuds. Le groupe de noeud ainsi gnr peut tre affich avec la commande SHOW dans le client de gestion. Il n'y a pas de valeur par dfaut, et la valeur maximale est 4. [DB]DataDir Ce paramtre spcifie le dossier o les fichiers de traces, les fichiers de log, et les fichiers d'erreurs sont rangs. [DB]FileSystemPath Ce paramtre spcifie le dossier o tous les fichiers crs pour stocker les meta-donnes, les logs de REDO, les logs de UNDO et les fichiers de donnes sont rangs. La valeur par dfaut est DataDir. Le dossier doit tre cr avant de lancer le processus ndbd. Si vous utilisez la hierarchie de dossiers recommande, vous utiliserez le dossier /var/lib/ mysql-cluster. Sous ce dossier, un autre dossier ndb_2_fs sera cr (si l'identifiant de noeud est 2), pour servir de fichier systme pour le noeud. [DB]BackupDataDir Il est possible de spcifier le dossier o les sauvegardes seront places. Par dfaut, le dossier FileSystemPath/BACKUP sera utilis. DataMemory et IndexMemory sont les paramtrs qui spcifient le taille des segments de mmoire utiliss pour stocker les lignes et leur index. Il est important de comprendre comment DataMemory et IndexMemory sont utiliss pour comprendre comment choisir ces paramtres. Pour la majorit des cas, ils doivent tre mis jour pour reflter leur utilisation dans le cluster. [DB]DataMemory Ce paramtre est l'un des paramtres les plus importants, car il dfinit l'espace disponible pour stocker les lignes dans la bases de donnes. Tout l'espace DataMemory sera allou en mmoire : il est donc important que la machine contienne assez de mmoire pour stocker DataMemory. DataMemory sert stocker deux choses. Il stocke les lignes de donnes. Chaque ligne est de taille fixe. Les colonnes VARCHAR sont stockes sous forme de colonnes taille fixe. De plus, chaque enregistrement est stock dans une page de 32 ko avec 128 octets d'entte. Il y a donc un peu de pertes pour chaque page, car chaque ligne n'est stocke que sur une seule page. La taille maximale d'une colonne est actuellement de 8052 octets. DataMemory sert aussi stocker les index ordonns. Les index ordonnes prennent environs 10 octets par ligne. Chaque ligne dans une table est reprsente par un index ordonn. 785
Fichier de configuration
DataMemory est constitus de pages de 32ko. Ces pages sont alloues comme partitions pour les tables. Chaque table est gnralement rpartie en autant de partition qu'il y a de noeud dans le cluster. Par consquent, il y a le mme nombre de partition (fragments) que la valeur de NoOfReplicas. Une fois qu'une page a t alloue, n'est pas possible actuellement de la librer. La mthode pour rcuprer cet espace est d'effacer la table. Effecter une restauration de noeud va aussi compresser la partition, car toutes les lignes seront insres dans une partition vide, depuis un autre noeud. Un autre aspect important est que DataMemory contient aussi les informations de UNDO (annulation) pour chaque ligne. Pour chaque modification d'une ligne, une copie de la ligne est faite dans l'espace DataMemory. De plus, chaque copie va aussi avoir une instance dans l'index ordonn. Les index Hash unique sont modifi uniquement lorsque les colonnes uniques sont modifies dans dans ce cas, une nouvelle entre est insre dans la table. Au moment de l'archivage (commit), l'ancienne valeur est efface. Il est donc ncessaire de pouvoir allouer la mmoire ncessaire pour grer les plus grosses transactions effectue dans le cluster. Effectuer une transaction de grande taille n'a pas d'autre intrt avec le Cluster MySQL que la cohrence, ce qui est la base des transactions. Les transactions ne sont pas plus rapides, et consomment beaucoup de mmoire. La taille par dfaut de DataMemory est 80MB. La taille minimum est de 1MB. Il n'y a pas de taille maximum, mais en ralit, il faut adapter la valeur pour viter que le systme n'utilise la mmoire sur le disque, par ce que la mmoire physique a t dpasse. [DB]IndexMemory IndexMemory est le paramtre qui contrle la quantit d'espace utilise pour les index hash de MySQL Cluster. Les index hash sont toujours utilis pour les cls primaires, les index uniques et les contraintes d'unicit. En fait, lors de la dfinition d'une cl primaire et d'une cl unique, deux index distincts seront crs par MySQL CLuster. Un index sera un hash utilis pour les accs aux lignes, et pour le verrouillage. Il est aussi utilis pour les contraintes d'unicit. La taille d'un index hash est de 25 octets plus la taille de la cl primaire. Pour les cls primaires dont la taille dpasse 32 octets, ajoutez un autre 8 octets pour des rfrences internes. Par exemple, observons la table suivante.
CREATE TABLE example ( a INT NOT NULL, b INT NOT NULL, c INT NOT NULL, PRIMARY KEY(a), UNIQUE(b) ) ENGINE=NDBCLUSTER;
Nous avons ici 12 octets d'entte (puisque des colonnes non nulles conomisent 4 octets), plus 12 octets par ligne. De plus, nous avons deux index ordonns sur les colonnes a et b, qui utilisent chacun 10 octets par ligne. Nous aurons aussi une cl primaire hash avec environ 29 octets par ligne. La contrainte unique est implmente par une table spare, avec b comme cl primaire et a comme colonne. Cette table va donc consommer encore 29 autres octets en mmoire par ligne, plus 12 octets d'entete et 8 octets pour les donnes. Pour une table d'un million de lignes, nous aurons besoin de 58 Mo de mmoire pour grer les index en mmoire, la cl primaire et la contrainte d'unicit. Pour DataMemory, nous aurons besoin de 64Mo de mmoire, pour grer les lignes de la table de base et celles de la table d'index, plus les deux tables d'index ordonns.
786
Fichier de configuration
En conclusion, les index hash consomment beaucoup d'espace en mmoire vive, mais fournissent un accs acclr aux donnes. Ils sont aussi utilis dans les cluster MySQL pour grer les contraintes d'unicit. Actuellement, les seuls algorithmes de partitionnement sont le hashage et les index ordonns, qui sont locaux chaque noeud, et ne peuvent pas prendre en compte les contraintes d'unicit en gnral. Un point important pour les deux options IndexMemory et DataMemory est que le total de la base de donnes est la taille de DataMemory et IndexMemory dans chaque groupe. Chaque groupe est utilis pour stocker les informations rpliques, ce qui fait que si vous avez 4 noeuds avec 2 rpliques, cela fait 2 groupes de noeuds, et le total de DataMemory disponible est 2*DataMemory dans chaque noeud. Un autre aspect important est les modifications de DataMemory et IndexMemory. Tout d'abord, il est fortement recommand d'avoir la mme quantit de DataMemory et IndexMemory sur tous les noeuds. Comme les donnes sont distribues quitablement entre les noeuds du cluster, l'espace disponible n'est pas suprieure la plus petite quantit d'espace disponible sur un des noeuds du cluster, multipli par le nombre de groupe de noeuds. DataMemory et IndexMemory peuvent tre modifis, mais il est dangeureux de le rduire, car cela peut conduire des problmes de redmarrage pour un noeud, ou mme pour le cluster, car il n'y aura plus assez de mmoire pour restaurer les tables. Accroitre les valeurs doit tre facile faire, mais il est recommand, pour ce type de mise jour, de faire une modification comparable une mise jour du logiciel : modification du fichier du fichier de configuration, puis redmarrage du serveur de gestion, et chaque serveur est relanc manuellement, un la fois. IndexMemory n'est pas utilis cause des modifications mais cause des insertions : ces dernires sont insres immdiatement, alors que les effacements ne sont pris en compte que lorsque la transaction est archive. La valeur par dfaut de IndexMemory est 18Mo. La taille minimale est de 1Mo. Les trois paramtres suivants sont importants car ils affectent le nombre de transactions simultanes et la taille des transactions qui peuvent tre gre par le systme. MaxNoOfConcurrentTransactions fixe le nombre de transactions simultanes dans un noeud, et MaxNoOfConcurrentOperations fixe le nombre de ligne qui peuvent tre en phase de modification ou de verrouillage simultanment. Ces deux paramtres, et particulirement MaxNoOfConcurrentOperations seront tudies de prs par les utilisateurs qui choisissent des valeurs particulires, et vitent les valeurs par dfaut. La valeur par dfaut est configure pour les systmes ayant de petites transaction, et s'assure que la mmoire n'es pas trop sollicite. [DB]MaxNoOfConcurrentTransactions Pour chaque transaction active dans le cluster, il y a besoin d'une ligne de transaction dans l'un des noeuds du cluster. Le rle de cette coordination de transaction est rparti entre tous les noeuds et ainsi, le nombre de lignes de transactions dans le cluster est le nombre de noeuds dans le cluster. En fait, les lignes de transactions sont alloues aux serveurs MySQL. Normalement, il y a au moins une ligne de transaction alloue dans le cluster par connexion qui utilise ou a utilis une table dans le cluster. Par consquent, il faut s'assurer qu'il y a plus de lignes de transaction dans le cluster qu'il n'y a de connexions simultanes tous les serveurs du cluster MySQL. Ce paramtre doit tre le mme pour tous les noeuds du serveur. Modifier ce paramtre n'est jamais facile, et peut conduire un crash du systme. Lorsqu'un noeud crashe, le noeud le plus ancien va prendre en charge l'tat des transactions qui avaient lieu dans le
787
Fichier de configuration
noeud perdu. Il est donc important que ce noeud ait autant de lignes de transactions que le noeud perdu. La valeur par dfaut pour ce paramtre est 4096. [DB]MaxNoOfConcurrentOperations Ce paramtre est sujet modifications par les utilisateurs. Les utilisateurs qui effectuent des transactions courtes et rapides n'ont pas besoin de lui donner une valeur trop haute. Les applications qui veulent utiliser des transactions de grande taille, impliquant de nombreuses lignes devront accrotre sa valeur. Pour chaque transaction qui modifie des donnes dans le cluster, il faut allouer des lignes d'opration. Il y a des lignes d'opration au niveau de la coordination de transaction, et dans les noeuds o les transformations ont lieu. Les lignes d'opration contiennent des informations d'tat qui doivent tre capables de retrouver des lignes d'annulation, des files de verrous et toutes les autres informations d'tat. Pour dimensionner le cluster afin de grer des transactions o un million de lignes doivent tre mises jours simultanment, il faut donner ce paramtre la valeur d'un million divis par le nombre de noeuds. Pour un cluster ayant 4 noeuds de stockage, la valeur sera donc de 250000. De plus, les lectures qui posent des verrous utilisent aussi des lignes d'opration. De la mmoire supplmentaire est alloue dans les noeuds locaux pour grer les cas o la distribution n'est pas parfaite entre les noeuds. Lorsqu'une requte impose l'utilisation d'un index hash unique, il y aura automatiquement 2 lignes d'opration pour chaque ligne de la transaction. La premire reprsente la lecture dans la table d'index, et la seconde gre l'opration dans la table de base. La valeur par dfaut pour ce paramtre est 32768. Ce paramtre gre en fait 2 aspects qui peuvent tre configurs sparment. Le premier aspect spcifie le nombre de lignes d'oprations qui peuvent tre placs dans la coordination de transaction. Le second aspect spcifie le nombre de lignes d'oprations qui seront utilises dans la base de donnes locale. Si une trs grande transaction est effectue sur un cluster de 8 noeuds, elle aura besoin d'autant de lignes d'opration pour la coordination de transaction qu'il y a de lecture, modification et effacement impliques dans la transaction. La transaction va rpartir les lignes d'opration entre les 8 noeuds. Par consquent, s'il est ncessaire de configuer le systme pour une grosse transaction, il est recommand de configurer les noeuds sparment. MaxNoOfConcurrentOperations va toujours tre utilis pour calculer le nombre de lignes d'oprations dans la coordination de transaction. Il est aussi important d'avoir une ide des contraintes de mmoire pour ces lignes d'opration. En MySQL 4.1.5, les lignes d'opration consomment 1Ko par ligne. Ce chiffre est appel rduire dans les versions 5.x. [DB]MaxNoOfLocalOperations Par dfaut, ce paramtre est calcul comme 1,1 fois MaxNoOfConcurrentOperations ce qui est bon pour les systmes avec de nombreuses requtes simultanes, de petite taille. Si la configuration doit grer une trs grande transaction une fois de temps en temps, et qu'il y a de beaucoup de noeuds, il est alors recommand de configurer cette valeur sparment. Le jeu de paramtres suivants sont utiliss pour le stockage temporaire durant l'excution d'une requte dans le cluster. Toute cette mmoire sera libre lorsque la requte sera termine, et que la transaction attendra l'archivage ou l'annulation. 788
Fichier de configuration
La plupart des valeurs par dfaut de ces paramtres sera valables pour la plupart des utilisateurs. Certains utilisateurs exigeants pourront augmenter ces valeurs pour amliorer le paralellisme du systme, et les utilisateurs plus contraintes pourront rduire les valeurs pour conomiser de la mmoire. [DB]MaxNoOfConcurrentIndexOperations Pour les requtes utilisant un index unique hash, un autre jeu de lignes d'opration sont temporairement utilises durant la phase d'excution de la requte. Ce paramtre configure la taille de la file qui acceuille ces lignes. Par consquent, cette mmoire n'est utilise que lors de l'excution d'une requte, et ds la fin de l'excution, les lignes sont libres. L'tat ncessaire pour grer les annulations et archivages est gr par les lignes d'oprations permanantes, o la taille de la file est gre par MaxNoOfConcurrentOperations. La valeur par dfaut pour ce paramtre est 8192. Seuls les situations o un trs haut niveau de paralellisme utilisant des index uniques hash doivent augmenter cette valeur. La rduction de cette valeur permet d'conomiser de la mmoire, si l'administrateur est certains que le paralellisme reste rare dans le cluster. [DB]MaxNoOfFiredTriggers La valeur par dfaut pour MaxNoOfFiredTriggers est 4000. Normalement, cette valeur doit tre suffisante pour la plupart des systmes. Dans certains cas, il est possible de rduire cette valeur si le paralellismen n'est pas trop haut dans le cluster. Cette option est utilise lorsqu'une opration est effectue, et affecte un index hash unique. Modifier une colonne qui fait partie d'un index unique hash ou insrer/effacer une ligne dans une table avec un index unique hash va dclencher une insertion ou un effacement dans l'index de la table. Cette ligne est utilise durant l'attente de la fin de l'excution de cette opration. C'est une ligne qui ne dure pas longtemps, mais elle peut malgr tout rclamer plusieurs lignes pour des situations temporaires d'critures paralelles sur la table de base, contenant les index uniques. [DB]TransactionBufferMemory Ce paramtre est aussi utilis pour lister les oprations de modifications d'index. Elle garde les informations de cl et colonne de l'opration en cours. Il doit tre exceptionnel de modifier ce paramtre. De plus, les oprations de lecture et criture utilisent un buffer similaire. Ce buffer est encore plus temporaire dans son utilisation, ce qui fait que c'est un paramtre de compilation, qui vaut 4000*128 octets (500Ko). Le paramtre st ZATTRBUF_FILESIZE dans Dbtc.hpp. Un buffer similaire pour les informations de cl, qui reprsente 4000*16 octets, soit 62.5ko d'espace. Ce paramtre est ZDATABUF_FILESIZE dans Dbtc.hpp. Dbtc est le module qui gre la coordination de transaction. Des paramtres similaires existents dans le module Dblqh pour grer les lectures et modifications lorsque les donnes ont t localises. Dans Dblqh.hpp avec ZATTRINBUF_FILESIZE qui vaut 10000*128 octets (1250ko) et ZDATABUF_FILE_SIZE, qui vaut 10000*16 octets (environ 156ko). Nous n'avons aucune connaissance de situation qui soient limites par ces valeurs. La valeur par dfaut de TransactionBufferMemory est 1Mo. [DB]MaxNoOfConcurrentScans Ce paramtre est utilis pour contrler la quantit de scans paralelles qui sont effectus dans le cluster. Chaque coordination de transaction peut grer un certain nombre de scan de tables simultanment, et ce nombre est limit par cette option. Chaque partition va utiliser une ligne de scan dans le noeud o la partition est situe. Le nombre de lignes est la taille de ce paramtre multipli par le nombre de noeuds, ce qui fait que le cluster peut supporter le nombre maximal de scan, multipli par le nombre de noeuds du cluster. 789
Fichier de configuration
Les scans sont effectus dans deux situations. La premire est lorsqu'aucun index hash ou ordonn n'a pu tre trouv pour grer la requte. Dans ce cas, la requte est excute avec un scan de table. La seconde est lorsqu'il n'y a pas d'index hash, mais seulement un index ordonn. Utiliser l'index ordonn, revient faire un scan de table paralelle. Comme l'ordre n'est conserv que dans les partitions locales, il est ncessaire de faire le scan dans toutes les partitions. La valeur par dfaut de MaxNoOfConcurrentScans est 256. La valeur maximale est de 500. Ce paramtre va toujours spcifier le nombre de scans possibles dans la coordination de transaction. Si le nombre local de scan n'est pas fournit, il est calcul comme le produit de MaxNoOfConcurrentScans et du nombre de noeuds de stockages du systme. [DB]MaxNoOfLocalScans Il est possible de spcifier le nombre de lignes de scan locaux, si les scans ne sont pas totalement paralelles. [DB]BatchSizePerLocalScan Ce paramtre est utilis pour calculer le nombre de lignes de verrous qui est ncessaire pour grer les oprations de scans courantes. La valeur par dfaut est 64 et cette valeur est trs lie au paramtre ScanBatchSize dfini dans l'interface des noeuds. [DB]LongMessageBuffer Ceci est un buffer interne utilis pour passer des messages au noeuds, et entre les noeuds. Il est hautement improbable que quiconque veuille modifier cette valeur, mais il est malgr tout disponible. Par dfaut, ce paramtre vaut 1Mo. [DB]NoOfFragmentLogFiles Ceci est un paramtre important qui indique la taille du fichier de log de REDO. Les logs REDO sont organiss en boucle, et il est important que la fin et le dbut ne se chevauchent pas. Lorsque la queue et la tte se rapprochent dangeureusement l'un de l'autre, le noeud va commencer annuler les modifications, car il n'y a plus de place pour les lignes de modifications. Le log de REDO n'est pas supprims jusqu' ce que trois jalons locaux soient passs depuis l'insertion dans le log. La vitesse d'apparition d'un jalon est contrle par un jeu de paramtres : tous ces paramtres sont donc lis.
La valeur par dfaut de ce paramtre est 8, ce qui signifie que 8 jeux de 4*16Mo fichiers. Cela reprsente un total de 512Mo. L'unit de stockage est de 64Mo pour le log de REDO. Dans les serveurs a fort taux de modification, il faut augmenter considrablement cette valeur. Nous avons vu des cas de test o il a fallu mettre cette valeur plus de 300. Si les jalons sont lents venir, et qu'il y a tellement d'critre dans la base que les fichiers de logs sont remplis, que le fichier de log de queue ne peut pas tre supprim pour assurer la restauration, les transactions de modification seront interrompues avec une erreur interne 410, qui sera transforme en message : Out of log file space temporarily. Cette condition restera en place jusqu' ce qu'un jalon soit atteint, et que la queue du log puisse avancer.
[DB]MaxNoOfSavedMessages
790
Fichier de configuration
Ce paramtre limite le nombre de fichiers de trace qui seront conservs sur le serveur, avant de remplacer un ancien fichier de trace. Les fichiers de trace sont gnrs lorsque le noeud crash pour une raison donne. La valeur par dfaut est de 25 fichiers de trace. Le jeu de paramtres suivant dfini la taille du buffer de d'objets de meta-donnes. Il est ncessaire de dfinir le nombre maximal d'objets, d'attributs, d'index et d'objets triggers utiliss par les index, les vnements, et la rplication entre clusters. [DB]MaxNoOfAttributes Ce paramtre dfinit le nombre d'attributs qui peuvent tre dfinis dans le cluster. La valeur par dfaut pour ce paramtre est 1000. La valeur minimale est 32 et il n'y a pas de maximum. Chaque attribut consomme environ 200 octets d'espace, car les meta-donnes sont totalement rpliqus entre les noeuds. [DB]MaxNoOfTables Un objet de table est allou pour chaque table, pour chaque index hash unique et pour chaque index ordonn. Ce paramtre fixe le nombre maximal d'objet de table qui soit allou. Pour chaque attribut qui contient un type de donnes BLOB, une autre table est utilise pour stocker la partie principale des donnes BLOB. Ces tables doivent aussi tr prises en compte lorsque vous dfinissez les tables. La valeur par dfaut pour ce paramtre est 128. La valeur minimale est de 8, et il n'y a pas de maximum. Il y a des limitations internes, qui empchent d'aller au dela de 1600. Chaque objet de table consomme environs 20ko de mmoire par noeud. [DB]MaxNoOfOrderedIndexes Pour chaque index ordonne dans le cluster, des objets sont allous pour dcrire ce qu'ils indexent et leurs stockage. Par dfaut, chaque index dfini aura un index ordonn associ. Les index uniques et les cls primaires ont tous deux un index ordonn et un index hash. La valeur par dfaut pour ce paramtre est 128. Chaque objet consomme environ 10ko par noeud. [DB]MaxNoOfUniqueHashIndexes Pour chaque index unique (pas pour les index primaires), un table spciale est alloue pour assurer la correspondance entre la cl primaire et la cl unique de la table indexe. Par dfaut, il y aura un index ordonn de dfini pour chaque index unique. Pour viter cela, utilisez l'option USING HASH. La valeur par dfaut de 64. Chaque index va consommer environ 15ko par noeud. [DB]MaxNoOfTriggers Pour chaque index hash unique, un trigger interne de modification, insertion ou effacement est allou. Cela fait 3 triggers pour chaque index hash unique. Les index ordonnes utilisent un seul objet trigger. Les sauvegardes utilisent aussi trois objets trigger pour chaque table normale dans le cluster. Lorsque la rplication entre cluster est supporte, elle va aussi utiliser un trigger interne. Ce paramtre limite le nombre d'objet trigger dans le cluster. La valeur par dfaut pour ce paramtre est 768. [DB]MaxNoOfIndexes
791
Fichier de configuration
Ce paramtre est abandonne depuis MySQL 4.1.5. Il faut dsormais utiliser MaxNoOfOrderedIndexes et MaxNoOfUniqueHashIndexes la place. Ce parmtre ne sert que pour les index hash unique. Il faut une ligne dans ce buffer pour chaque index hash unique dfini dans le cluster. La valeur par dfaut pour ce paramtre est 128. Il y a un jeu de paramtre boolens qui affectent le comportement des noeuds de stockage. Les paramtres boolens peuvent tre spcifis true avec Y (pour Yes, c'est--dire oui) ou 1, et false avec N (pour non) ou 0. [DB]LockPagesInMainMemory Pour certains systmes d'explications tels que Solaris et Linux, il est possible de verrouiller un processus en mmoire et viter les problmes de swap. C'est une fonctionnalit important pour amliorer le temps rel du cluster. Par dfaut, cette fonctionnalit n'est pas active. [DB]StopOnError Ce paramtre indique si le processus doit s'arrter sur une erreur, ou s'il doit faire un redmarrage automatique. Par dfaut, cette fonctionnalit est active. [DB]Diskless Dans les interfaces internes, il est possible de configurer les tables comme sans disque (littralement, diskless), ce qui signifie que les tables ne sont pas enregistres sur le disque, et qu'aucun log n'est fait. Ces tables existent uniquement en mmoire. Ces tables existeront encore aprs un crash, mais pas leur contenu. Cette fonctionnalit fait que le cluster entier devient Diskless, ce qui fait le les tables n'existent plus aprs un crash. Activer cette fonctionnalit de fait avec Y ou 1. Lorsque cette fonctionnalit est active, les sauvegardes sont faites, mais elles ne seront pas stockes car il n'y a pas de disque. Dans les versions futures, il est probable que les sauvegardes sans disques soient une option spare. Par dfaut, cette fonctionnalit n'est pas active. [DB]RestartOnErrorInsert Cette fonctionnalit n'est possible que lorsque la version de dboguage a t compile, pour pouvoir insrer des erreurs diffrents points de l'excution, afin de tester les cas d'erreurs. Par dfaut, cette fonctionnalit n'est pas active. Il y a plusieurs paramtres pour tester les dlais d'expirations et les interfavalles entre diffrentes actions des noeuds de stockage. Plusieurs dlais d'expiration sont spcifis en millisecondes, quelques exceptions qui sont explicitement indiques. [DB]TimeBetweenWatchDogCheck Pour s'assurer que le thread principal ne reste back ternellement bloqu dans une boucle infinie, il existe un garde-fou qui vrifie le fonctionnement de ce thread. Ce paramtre indique le nombre de millisecondes entre deux vrifications. Aprs trois essais o le processus est dans le mme tat, le thread est arrt par le garde-fou. 792
Fichier de configuration
Ce paramtre peut tre facilement modifi, et peut diffrer de noeud en noeud, mme s'il y a peu de raison pour faire des traitements diffrents. La dure par dfaut est de 4000 millisecondes (4 secondes). [DB]StartPartialTimeout Ce paramtre spcifie le temps durant lequel le cluster attend les noeuds de stockage avant que l'algorithme de cluster soit appel. Cette dure est appele pour viter de dmarrer un cluster partiel. La valeur par dfaut de 30000 millisecondes (30 secondes). 0 signifie l'ternit, c'est dire que tous les noeuds doivent tre l pour dmarrer. [DB]StartPartitionedTimeout Si le cluster est prt dmarrer aprs avoir attendu StartPartialTimeout mais qu'il est possible qu'il soit dans un tat de partionnement, alors le cluster attend encore ce dlai supplmentaire. Le dlai par dfaut est de 60000 millisecondes (60 secondes). [DB]StartFailureTimeout Si le dmarrage n'est pas ralis dans le dlai spcifi par ce paramtre, le dmarrage du noeud chouera. En donnant la valeur de 0 ce paramtre, il n'y au pas de dlai appliqu. La valeur par dfaut de 60000 millisecondes (60 secondes). Pour les noeuds de stockage avec de grandes bases de donnes, il faut augmenter cette valeur car le noeud peut demander jusqu' 15 minutes pour effectuer le dmarrage de plusieurs gigaoctets de donnes. [DB]HeartbeatIntervalDbDb Une des mthodes qui permet de dcouvrir les noeuds morts est la tachycardie (littralement, heartbeats, battement de coeur). Ce paramtre indique le nombre de signaux qui sont envoys, et la frquence suppose de reception. Aprs avoir saut 3 intervalles de signaux d'affile, le noeud est dclar mort. Par consquent, le temps maximal de dtection d'un noeud est de 4 battements. L'intervalle par dfaut est de 1500 millisecondes (1.5 secondes). Ce paramtre ne doit pas tre modifi de trop. Si vous utilisez 5000 millisecondes et que le noeud observ utiliser une valeur de 1000 millisecondes alors ce dernier sera rapidement dclar mort. Ce paramtre peut tre modifi progressivement, mais pas trop d'un coup. [DB]HeartbeatIntervalDbApi Similairement, chaque noeud de stockage met des signaux de vie pour chaque serveur MySQL connect, pour s'assurer qu'ils fonctionnent correctement. Si un serveur MySQL ne renvoie pas un signal dans le temps escompt, avec le mme algorithme que pour la surveillance des noeuds de stockage, il est alors dclar mort, et les transactions sont alors termines, les ressources libres, et le serveur ne pourra pas se reconnecter avant la fin des oprations de nettoyage. La valeur par dfaut pour cet intervalle est 1500 millisecondes. Cet interval peut tre diffrent pour le noeud de stockage, car chaque noed de stockage fonctionne indpendamment des autres noeuds de stockage qui surveille le serveur connect. [DB]TimeBetweenLocalCheckpoints Ce paramtre est une exception, en ce send qu'il ne dfinit pas un dlai avant de poser un jalon local. Ce paramtre sert s'assurer que dans un cluster, le niveau de modification des tables n'est pas trop faible pour empcher la pose de jalon. Dans la plupart des clusters avec un taux de modification important, il est probable que les jalons locaux soient poss immdiatement aprs la fin du prcdent. 793
Fichier de configuration
La taille de toutes les oprations d'criture excutes depuis le dbut du jalon prcdent est somme. Ce paramtreset spcifi comme le logarithme du nombre de mots. Par exemple, la valeur par dfaut de 20 signifie que 4Mo d'oprations d'criture ont t faites; 21 reprsente 8Mo, et ainsi de suite. La valeur maximale de 31 reprsente 8Go d'oprations. Toutes les oprations d'critures dans le cluster sont additionnes ensemble. En lui donnant une valeur de 6 ou moins, cela va forcer les critures de jalons continuellement, sans aucune attente entre deux jalons, et indpendemment de la charge du cluster. [DB]TimeBetweenGlobalCheckpoints Lorsqu'une transaction est archive, elle est place en mmoire principale de tous les noeuds o des donnes miroirs existent. Les lignes de logs de la transaction ne sont pas forces sur le disque lors de l'archivage. L'ide ici est que pour que la transaction soit archiv sans problme, il faut qu'elle soit archive dans 2 noeuds indpendants. Dans le mme temps, il est important de s'assurer que dans le pire cas de crash, le cluster se comporte correctement. Pour s'assurer que les transactions dans un intervalle de temps donn sont places dans un jalon global. Un groupe entier de transaction est envoy sur le disque. Par consquent, la transaction a t place dans un groupe de jalon, en tant que partie d'un archivage. Ultrieurement, ce groupe de log sera plac sur le disque , et le groupe entier de transaction sera archiv sur tous les serveurs. Ce paramtre spcifie l'intervalle entre les jalons globaux. La valeur par dfaut est de 2000 millisecondes. [DB]TimeBetweenInactiveTransactionAbortCheck Un dlai d'expiration est appliqu pour chaque transaction en fonction de ce paramtre. Par consquent, si ce paramtre vaut 1000 millisecondes, alors chaque transaction sera vrife une fois par seconde. La valeur par dfaut pour ce paramtre est 1000 millisecondes (1 seconde). [DB]TransactionInactiveTimeout Si la transaction n'est pas en excution de requte, mais attend d'autres donnes, ce paramtre spcifie le temps maximum d'attente des donnes avant d'annuler la transaction. Par dfaut, ce paramtre ne limite pas l'arrive des donnes. Pour des cluster en production, qui doivent s'assurer qu'aucune transaction ne bloque le serveur durant trop longtemp, il faut utiliser une valeur basse. L'unit est la millisecondes. [DB]TransactionDeadlockDetectionTimeout Lorsqu'une transactioon est implique dans l'excution d'une requte, elle attend les autres noeuds. Si les autres noeuds ne rpondent pas, il peut se passer 3 choses. Premirement, le noeud peut tre mort; deuximent, l'opration peut tre place dans une file d'attente de verrou; troisimement, le noeud impliqu peut tre surcharg. Ce paramtre limite la dure de l'attente avant d'annuler la transaction. Ce paramtre est important pour la dtection d'chec de noeud et le blocage de verrou. En le configurant trop haut, il est possible de laisser passer des blocages. La dure par dfaut est de 1200 millisecondes (1.2 secondes). [DB]NoOfDiskPagesToDiskAfterRestartTUP Lors de l'excution d'un jalon local, l'algorithme envoie toutes les pages de donnes au disque. Les envoyer aussi rapidement que possible cause des charges inutiles sur le processeur, le rseau et 794
Fichier de configuration
le disque. Cette option contrle le nombre de page crire par 100 millisecondes. Une page est dfinie ici comme faisant 8ko. C'est l'unit de ce paramtre est de 80ko par seconde. En lui donnant la valeur de 20, cela reprsente 1.6Mo de donnes envoyes sur le disque par seconde, durant un jalon local. De plus, l'criture des log de UNDO est inclus dans cette somme. L'criture des pages d'index (voir IndexMemory pour comprendre comment les pages d'index sont utilises), et leur logs d'UNDO sont gres par le paramtre NoOfDiskPagesToDiskAfterRestartACC. Ce paramtre paramtre gre les limitations d'criture de DataMemory. Ainsi, ce paramtre spcifie la vitesse d'criture des jalons. Ce paramtre est important et est corrl NoOfFragmentLogFiles, DataMemory, IndexMemory.
La valeur par dfaut de 40 (3.2Mo de pages de donnes par seconde). [DB]NoOfDiskPagesToDiskAfterRestartACC Ce paramtre a la mme unit que NoOfDiskPagesToDiskAfterRestartTUP mais limite la vitesse d'criture des pages d'index depuis IndexMemory. La valeur par dfaut pour ce paramtre est 20 (1.6Mo par seconde). [DB]NoOfDiskPagesToDiskDuringRestartTUP Ce paramtre spcifie les mmes limitations que NoOfDiskPagesToDiskAfterRestartTUP et NoOfDiskPagesToDiskAfterRestartACC, mais s'appliquent aux jalons locaux, excuts sur un noeud comme une partie de jalon lors du redmarrage. Faisant partie du redmarrage, un jalon local est toujours effectu. Il est possible d'utiliser une vitesse accrue durant le redmarrage du noeud, car les activits sont alors limites sur le serveur. Ce paramtre gre la partie de DataMemory. La valeur par dfaut de 40 (3.2Mo par seconde). [DB]NoOfDiskPagesToDiskDuringRestartACC Durant le redmarrage de la partie local de IndexMemory pour un jalon local. La valeur par dfaut de 20 (1.6Mo par seconde). [DB]ArbitrationTimeout Ce paramtre spcifie le temps que le noeud de stockage va attendre un message de l'arbitre lors d'un fractionnement du rseau. La valeur par dfaut de 1000 millisecondes (1 seconde). De nombreux nouveaux paramtres de configuration ont t introduits en MySQL 4.1.5. Ils correspondent des valeurs qui taient auparavant configures durant la compilation. La raison principale cela est qu'elles permettent aux utilisateurs experts de contrler la taille du processus et d'ajuster les diffrentes tailles de buffer, en fonction de ses besoins. Tous ces buffers sont utiliss comme interface avec le systme de fichiers lors de l'criture des lignes de log sur le disque. Si le noeud fonctionne en mode sans disque, ces paramtres peuvent prendre leur valeur minimale, car les criture sur le disques sont simules et toujours valides par la couche d'abstraction du moteur NDB. [DB]UndoIndexBuffer Ce buffer est utilis durant les jalons locaux. Le moteur de stockage NDB utilise un mcanisme de restauration bas sur des jalons cohrents avec le log de REDO. Afin de produit un jalon valide sans bloquer le systme l'enregistrement des UNDO est fait durant l'xcution des jalons locaux. Le log 795
Fichier de configuration
de UNDO n'est activ que pour un fragment de table chaque fois. Cette optimisation est rendue possible car les tables sont entirement stockes en mmoire principale. Ce buffer est utilis pour les modification dans les index hash de cl primaire. Les insertions et les effacement rarrange les index hash, et le moteur NDB crit les log d'UNDO qui associent les modifications physiquesw avec un index de page pour qu'ils puissent tre appliqus mme aprs un redmarrage. Toutes les insertions actives sont aussi enregistres au dbut d'un jalon local, pour chaqu fragment. Les lectures et modifications ne font que poser des bits de verrouillages, et altrent un entte dans la ligne d'index. Ces modifications sont gres par l'algorithme d'criture des pages, pour s'assurer que ces oprations n'ont pas besoin du log d'UNDO. Ce buffer vaut 2Mo par dfaut. La valeur minimale est 1Mo. Pour la plupart des applications, c'est suffisant. Les applications qui font beaucoup d'insertions et d'effacement avec de grandes transactions en exploitant intensivement leurs cls primaires devront agrandir ce buffer. Si le buffer est trop petit, le moteur NDB met une erreur de code 677 qui se traduit pas "Index UNDO buffers overloaded". [DB]UndoDataBuffer Ce buffer a exactement le mme role que UndoIndexBuffer mais est utilise pour les donnes. Ce buffer est utilis durant l'excution d'un jalon local pour un fragment de table, et les insertions, les effacements et les modifications utilisent ce buffer. Comme les lignes du log d'UNDO tendent tre plus grandes et que plus d'informations sont stockes, ce buffer doit tre aussi de plus grande taille. Par dfaut, il vaut 16Mo. Pour certaines applications, cela peut tre sur-dimensionn, et il est alors recommand de rduire cette valeur. La taille minimale est de 1Mo. Il sera rare d'avoir augmenter cette valeir. Si cette valeur doit tre augmente, commencez par vrifier vos disques et leurs performances. Si ce sont les disques qui limitent le dbit, le buffer sera alors bien dimensionn. Si ce buffer est trop petit et se remplit, le moteur NDB met une erreur de code 891 qui se traduit par "Data UNDO buffers overloaded". [DB]RedoBuffer Toutes les activits de modification doivent tre enregistres. Cela permet de repasser ces oprations au redmarrage du systme. L'algorithme de restauration utilise un jalon cohrent, produit par un jalon "flou" produit par les donnes couples aux pages de log d'UNDO. Puis, le log de REDO est appliqu pour rejouer toutes les modifications qui ont eu lieu depuis le redmarrage du systme. Ce buffer fait 8Mo par dfaut. Sa taille minimale est de 1Mo. Si ce buffer est trop etit, le moteur NDB met une erreur de code 1221 qui se traduit par : "REDO log buffers overloaded". Pour la gestion du cluster, il est important de pouvoir contrler la quantit de message de log qui sont envoy stdout par les diffrents vnements qui surviennent. Les vnements seront bientt lists dans ce manuel. Il y a 16 niveaux possibles, allant de 0 15. En utilisant un niveau de rapport d'erreur de 15, toutes les erreurs seront rapportes. Un niveau de rapport d'erreur nul (0) bloquera toutes les erreurs. La raison qui fait que la plupart des valeurs par dfaut sont 0, et qu'elles ne causent aucun affichage sur est que le mme message est envoy au log du cluster sur le serveur de gestion. Seul le message de dmarrage est envoy stdout. Un jeu de niveau d'erreur similaire peut tre configur dans le client de gestion, pour dfinir les niveaux d'erreurs qui doivent rejoindre le log du cluster.
796
Fichier de configuration
[DB]LogLevelStartup Evenements gnrs durant le dmarrage du processus. Le niveau par dfaut est 1. [DB]LogLevelShutdown Evenements gnrs durant l'extinction programme d'un noeud. Le niveau par dfaut est 0. [DB]LogLevelStatistic Evenements statistiques tels que le nombre de cls primaires lues, le nombre d'insertions, modifications et de nombreuses autres informations statistiques sur l'utilisation des buffer. Le niveau par dfaut est 0. [DB]LogLevelCheckpoint Evenements gnrs par les jalons locaux et globaux. Le niveau par dfaut est 0. [DB]LogLevelNodeRestart Evenements gnrs par un redmarrage de noeud. Le niveau par dfaut est 0. [DB]LogLevelConnection Evenements gnrs par les connexions entre les noeuds dans le cluster. Le niveau par dfaut est 0. [DB]LogLevelError Evenements gnrs par les erreurs et alertes dans le cluster. Ces erreurs ne sont pas causes par un chec de noeud, mais sont suffisamment importantes pour tre rapportes. Le niveau par dfaut est 0. [DB]LogLevelInfo Evenements gnrs pour informer sur l'tat du cluster. Le niveau par dfaut est 0. Il existe un jeux de paramtres qui dfinissent les buffers mmoire qui sont utiliss pour l'excution des sauvegardes en ligne. [DB]BackupDataBufferSize Lors de l'excution d'un sauvegarde, il y a deux buffers utiliss pour envoyer des donnes au disque. Ce buffer sert rassembler des donnes obtenues par le scan des tables du noeud. Lorsque le regroupement atteint un certain niveau, ces pages sont envoyes au disque. Ce niveau est spcifi par le paramtre BackupWriteSize. Lors de l'envoi des donnes sur le disque, la sauvegarde continue de remplir ce buffer, jusqu' ce qu'il n'y ait plus de place. Lorsque la place manque, la sauvegarde marque une pause, et attent que l'criture ait libr de la mmoire avant de poursuivre. La valeur par dfaut de 2Mo.
797
Fichier de configuration
[DB]BackupLogBufferSize Ce paramtre a un rle similaire mais sert crire un log de toutes les critures dans la table durant l'excution de la sauvegarde. Le mme principe s'applique l'criture de ces pages que pour BackupDataBufferSize, hormis le fait que lorsque la place manque, la sauvegarde choue par manque de place. Par consquent, la taille de ce buffer doit tre assez grande pour encaisser la charge cause par les activits d'criture durant l'excution de la sauvegarde. La valeur par dfaut de ce paramtre doit tre assez grande. En fait, il est plus probable qu'une erreur de sauvegarde soit cause par le disque qui ne peut suivre la vitesse d'criture. Si le disque est sous-dimensionn pour cette opration, le cluster aura du mal satisfaire les besoins des autres oprations. Il est important de dimensionner les noeuds pour que les processeurs deviennent les facteurs limitants, bien plus que les disques ou le rseau. La valeur par dfaut de 2Mo. [DB]BackupMemory Ce paramtre est simplement la somme des deux prcdents : BackupDataBufferSize et BackupLogBufferSize. La valeur par dfaut de 4Mo. [DB]BackupWriteSize Ce paramtre spcifie la taille des messages d'criture sur le disque, pour le log, ainsi que le buffer utilis pour les sauvegardes. La valeur par dfaut de 32ko.
Fichier de configuration
Pour les requtes qui deviennent des analyses compltes de table ou des analyses d'intervalle, il est important pour les performances de lire les lignes par groupe. Il est possible de configurer la taille de ce groupe en terme de nombre de lignes et de taille de donnes (en octets). La taille relle du groupe sera limit par les deux paramtres. La vitesse des requtes peut varier de prs de 40% en fonction de la valeur de ce paramtre. Dans les versions futures, le serveur MySQL fera les estimations ncessaires pour configurer ces paramtres lui-mme. Ce paramtre est mesur en octets, et par dfaut, il vaut 32KB. [API]BatchSize Ce paramtre est le nombre de lignes et il vaut par dfaut 64. La valeur maximale est 992. [API]MaxScanBatchSize La taille du groupe est la taille de chaque groupe envoy par chaque noeud de stockage. La plupart des analyses sont effectues en paralelle : pour protger le serveur MySQL d'un afflux monstrueux de donnes, ce paramtre permet de limiter le nombre total de groupe sur tous les noeuds. La valeur par dfaut de ce paramtre est de 256Ko. Sa taille maximale est 16Mo.
799
Fichier de configuration
[TCP]PortNumber Ceci est le numro de port utiliser pour attendre les connexions des autres noeuds. Ce pot doit tre spcifi dans la section [TCP DEFAULT]. Ce paramtre ne doit plus tre utilis. Utilisez plutt le paramtre ServerPort sur les noeuds de stockage. [TCP]ReceiveBufferMemory Ce paramtre spcifie le taille du buffer utilis lors de la reception des donnes dans la socket TCP/ IP. Il y a peu de raison pour modifier ce paramtre, dont la valeur par dfaut est 64ko. Il permettrait uniquement d'conomiser de la mmoire.
16.4.4.8. Dfinition des connexions par mmoire partage dans un cluster MySQL
Les segments de mmoire partages sont supportes uniquement pour certaines compilations spcifiques du cluster MySQL, avec l'option de configure --with-ndb-shm. Son implmentation va srement voluer. Lorsque vous dfinissez un segment de mmoire partage, il est ncessaire de dfinir au moins NodeId1, NodeId2 et ShmKey. Tous les autres paramtres ont des valeurs par dfaut qui fonctionneront dans la plupart des cas. [SHM]NodeId1, [SHM]NodeId2 Pour identifier une connexion entre deux noeuds, il est ncessaire de fournir l'identitit des deux noeuds dans NodeId1 et NodeId2. [SHM]ShmKey Lors de la configuration de segments de mmoire partage, un identifiant est utilis pour dfinir de manire unique le segment utiliser pour les communications. C'est un entier qui n'a pas de valeur par dfaut. [SHM]ShmSize Chaque connexion a un segment de mmoire o les messages ont t stocks par l'envoyeur, et lus par le lecteur. Ce segment a une taille dfini par ce paramtre. Par dfaut, il vaut 1Mo. [SHM]SendSignalId Pour tre capable de suivre le diagramme de message distribu, il est ncessaire d'identifier chaque message avec un marqueur. En activant ce paramtre, le marqueur sera aussi transfr sur le rseau. Cette fonctionnalit n'est pas active par dfaut. [SCI]Checksum Ce paramtre est aussi une paramtre Y/N (oui/non), qui n'est pas activ par dfaut. Lorsqu'il est activ, tous les messages sont munis d'une somme de contrle avant d'tre envoys au buffer. Les vrifications contre les corruptions sont aussi renforces.
800
[SCI]NodeId1, [SCI]NodeId2 Pour indentifier une connexion entre deux noeuds, il est ncessaire de fournir un identifiant de noeud pour chacun d'entre eux dans NodeId1 et NodeId2. [SCI]Host1SciId0 Identifie le noeud SCI du premier noeud identifi par NodeId1. [SCI]Host1SciId1 Il est possible de configurer les transporteurs SCI avec reprise sur incident entre deux cartes SCI qui utilisent deux rseaux distincts. Ce paramtre identifie l'identifiant de noeud et la seconde carte utiliser sur le premier noeud. [SCI]Host2SciId0 Identifie le noeud SCI du premier noeud identifi par NodeId2. [SCI]Host2SciId1 Il est possible de configurer les transporteurs SCI avec reprise sur incident entre deux cartes SCI qui utilisent deux rseaux distincts. Ce paramtre identifie l'identifiant de noeud et la seconde carte utiliser sur le second noeud. [SCI]SharedBufferSize Chaque transporteur dispose d'un segment de mmoire partage entre deux noeuds. Avec ce segment de taille par dfaut 1Mo, la plupart des applications seront satisfaites. Les tailles infrieures, vers 256 ko posent des problmes pour les insertions simultanes. Si le buffer est trop petit, il peut conduire des crash de ndbd. [SCI]SendLimit Un petit buffer devant le media SCI temporise les messages avant de les envoyer sur le rseau SCI. Par dfaut, sa taille est de 8 ko. La plupart des tests de vitesse montrent que l'amlioration de vitesse est la meilleure 64 ko mais que 16ko arrive presque au mme rsultat : il n'y avait plus de difrence mesurable aprs 8ko au niveau du Cluster. [SCI]SendSignalId Pour tre capable de suivre le diagramme de message distribu, il est ncessaire d'identifier chaque message avec un marqueur. En activant ce paramtre, le marqueur sera aussi transfr sur le rseau. Cette fonctionnalit n'est pas active par dfaut. [SCI]Checksum Ce paramtre est aussi une paramtre Y/N (oui/non), qui n'est pas activ par dfaut. Lorsqu'il est activ, tous les messages sont munis d'une somme de contrle avant d'tre envoys au buffer. Les vrifications contre les corruptions sont aussi renforces.
801
Pour activer le moteur NDB, il y a deux mthodes. Soit vous utilisez l'option --ndbcluster au dmarrage, lorsque vous utilisez la commande mysqld ou bien, insrez une ligne avec ndbcluster dans la section [mysqld] de votre fichier my.cnf. Un moyen facile pour vrifier que votre serveur supporte le moteur NDB Cluster est d'utiliser la commande SHOW ENGINES depuis un client mysql. Vous devriez voir la valeur YES dans la ligne de NDBCLUSTER. Si vous voyez NO, c'est que vous n'utilisez pas le programme mysqld compil avec le support de NDB Cluster. Si vous voyez DISABLED, alors vous devez simplement activer le moteur dans votre fichier de configuration my.cnf. Le serveur MySQL doit savoir comment lire la configuration du cluster. Pour accder cette configuration, il doit connatre 3 choses : Son propre numro d'identifiant de noeud dans le cluster. Le nom d'hte ou l'adresse IP o le serveur de gestion rside. Le port sur lequel se connecter au serveur de gestion. L'identifiant peut tre omis en MySQL version 4.1.5 et plus rcent, car les identifiants de noeuds sont dynamiquement allous. Il y a actuellement trois moyens pour donner ces informations au processus mysqld. La mthode recommande est de spcifier la chane de connexion de mysqld appele ndb-connectstring, soit au dmarrage de mysqld ou dans le fichier my.cnf. Vous pouvez aussi inclure cette information dans un fichier appel Ndb.cfg. Ce fichier doit rsider dans le dossier de donnes de MySQL. Une autre solution est de configurer la variable d'environnement appele NDB_CONNECTSTRING. La chane sera la mme dans tous les cas : "[nodeid=<id>;][host=]<host>:<port>". Si aucune information n'est fournie, cette chane vaudra par dfaut "host=localhost:2200".
shell> mysqld --ndb-connectstring=ndb_mgmd.mysql.com:2200
ndb_mgmd.mysql.com est l'hte o le serveur de gestion rside : il attend sur le port 2200. Avec cette configuration, le serveur MySQL sera partie prenant du cluster MySQL, et accdera la liste complte de tous les noeuds du cluster ainsi que leur statut. Il va se connecter tous les noeuds de stockage, et sera capable d'utiliser chacun d'entre eux comme coordonnateur de transaction, ainsi que pour accder aux donnes.
802
Date/Time: Saturday 31 January 2004 - 00:20:01 Type of error: error Message: Internal program error (failed ndbrequire) Fault ID: 2341 Problem data: DbtupFixAlloc.cpp Object of reference: DBTUP (Line: 173) ProgramName: NDB Kernel ProcessID: 14909 TraceFile: ndb_2_trace.log.2 ***EOM***
ndb_2_trace.log.1 (anciennement NDB_TraceFile_1.trace en version 4.1.3) est un fichie de trace, dcrivant exactement ce qui est arriv avant l'erreur. Cette information est utile pour l'quipe d'administration du cluster MySQL. Les informations de ce fichier sont dcrites dans la section MySQL Cluster Troubleshooting. Le nombre de fichier de trace est configurable, de manire a matriser l'crasement des anciens fichiers par les nouveaux. 1, dans ce contexte, est le numro du fichier de trace. ndb_2_trace.log.next (anciennement NextTraceFileNo.log en version 4.1.3) est le fichier qui garde trace du prochain numro de fichier de trace. ndb_2_out.log est le fichier qui contient les donnes affiches par le processus ndbd. 2, dans ce contexte, est l'identifiant de noeued. Ce fichier n'existe que si ndbd est lanc en mode dmon, ce qui est le dfaut en 4.1.5; anciennement node2.out en version 4.1.3) ndb_2.pid est le fichier qui contient l'identifiant de processus lorsque ndbd est lanc en mode dmon (c'est le comportement par dfaut depuis la version 4.1.5 et s'appellait node2.pid en version 4.1.3). Il fonctionne aussi comme un verrou, pour viter de lancer des noeuds avec le mme identifiant. ndb_2_signal.log (anciennement Signal.log en version 4.1.3) est le fichier qui ne sert que pour les versions de dguage de ndbd : il est alors possible de suivre les messages entrants, sortants et internes dans le processus ndbd. Il est recommand de ne pas utiliser de dossier mont en NFS car dans certains environnement, il y a des problmes de verrouillages sur le fichier de PID, mme si le processus s'est arrt. De mme, lorsque vous lancez le processus ndbd, il peut tre ncessaire de spcifier le nom d'hte du serveur de gestion ainsi que son port. Optionnellement, il faut aussi ajouter le numro d'identification de noeud. Encore une fois, il y a trois faons de spcifier ces informations. Soit une chane de connexion qui doit tre stocke dans le fichier Ndb.cfg, et ce fichier doit tre stock dans le dossier de dmarrage de ndbd. La seconde option est de configurer la variable d'environnement NDB_CONNECTSTRING avant le dmarrage du processus. La troisime option est d'utiliser la ligne de commande et l'option ci-dessous. Voyez les sections prcdentes pour connatre le format exact de la chane.
shell> ndbd --connect-string="nodeid=2;host=ndb_mgmd.mysql.com:2200"
Lorsque ndbd se lance, il va lancer en fait 2 processus. Le processus de lancement s'appelle "angel" et sa seule tche est de surveiller la fin du processus d'excution, et de relancer le processus ndbd s'il est configur pour cela. Par consquent, si vous tentez de terminer ndbd avec la commande kill d'Unix, il sera ncessaire de terminer les deux processus. Une solution plus lgante pour grer la terminaison des processus ndbd est d'utiliser le client de gestion et d'arrter les processus depuis ce client. Le processus d'excution utilise un thread pour toute ses activits de lecture, criture et analyse des donnes, ainsi que pour ses autres activits. Ce thread est conu pour tre asynchrone, et grer facilement des milliers d'actions simultanes. En plus, il y a un garde-fou qui supervise le thread d'excution, pour s'assurer que ce dernier ne se bloque pas dans une boucle infinie ou dans un autre problme du mme genre. Il y a un pool de thread qui assurent les entres/sorties. Chaque thread gre un fichier. En plus, d'autres threads peuvent tre utiliss pour les activits de transport
803
du processus ndbd. Par consquent, un processus qui effectue un grand nombre d'activits, verra le processus ndbd utiliser 2 processeurs, s'il en a la possibilit. Sur une machine avec de nombreux processeurs, il est recommand d'utiliser plusieurs processus ndbd, qui seront configurs pour reprsente diffrents groupes de noeuds.
804
Si le binaire supporte le moteur de table NDB Cluster, le comportement par dfaut est de dsactiver son support. Vous pouvez changer ce comportement avec cette option. Utiliser le moteur NDB Cluster est obligatoire pour pouvoir utiliser MySQL Cluster. --skip-ndbcluster Dsactive le moteur de table NDB Cluster. C'est le comportement par dfaut pour les applications o il est inclut. Cette option peut s'appliquer uniquement si le serveur a t configur pour utiliser le moteur de table NDB Cluster. --ndb-connectstring=connect_string Lorsque de l'utilisation du moteur de table NDB, il est possible de dsigner le serveur de gestion qui distribue les configurations du cluster en lui assignant une chane de connexion.
-d, --daemon Indique ndbd qu'il doit s'excuter comme dmon. Depuis MySQL version 4.1.5, c'est le comportement par dfaut. --nodaemon Indique ndbd qu'il ne doit pas se lancer comme un dmon. C'est pratique lors du dboguage de ndbd et que vous voulez avoir l'affichage des rsultats du programme. --initial Demande ndbd de faire un dmarrage initial. Un dmarrage initial efface tous les fichiers crs par d'anciens ndbd durant la restauration. Il va aussi crer le fichier de log de restauration, ce qui peut prendre beaucoup de temps sur certains systmes d'exploitation. Un dmarrage initial ne sert qu'au tout premier dmarrage du processus ndbd. Il supprime tous les fichiers du systme de fichiers, et cre tous les fichiers de log REDO. Lorsque vous faites une mise jour logicielle qui modifie le contenu de ces fichiers, il est aussi ncessaire d'utiliser cette option au redmarrage de ndbd. Enfin, cette option peut tre utile en dernier recours, si votre systme d'arrive pas redmarrer. Dans ce cas, soyez conscients que dtruire le contenu du systme de fichiers signifie que ce noeud ne peut plus tre utilis pour restaurer des donnes. Cette option n'affecte pas les fichiers de sauvegarde crs. L'ancienne fonctionnalit reprsente par -i pour cette option a t supprime pour s'assurer qu'elle n'est pas confondue avec celle-ci par mgarde. --nostart Indique ndbd de ne pas dmarrer automatiquement. ndbd va se connecter au serveur de gestion, obtiendra le fichier de configuration, et initialisera les communications avec les noeuds. Mais il ne va pas lancer le moteur d'excution jusqu' ce qu'il en reoive l'ordre manuel du serveur de gestion. Le serveur de gestion peut mettre cette commande sur ordre du client de gestion.
805
-v, --version Affiche le numro de version du processus ndbd. Le numro de version est celui du cluster MySQL. Il est important car au momment du lancement du cluster, MySQL vrifie si les versions des serveurs des noeuds peuvent cohabiter dans le cluster. Il est aussi important durant les mises jour logicielles du cluster (voyez la section Software Upgrade of MySQL Cluster). --debug=options Cette option peut tre utilise avec les versions compiles en mode dboguage. Elle sert activer l'affichage des appels de dboguage, de la mme manire que pour mysqld. -? --usage Affiche une dscription rapide des options disponibles.
Si la connexion au serveur de gestion se perd, il est possible de spcifier le nombre de tentatives avant de conclure une erreur. Par dfaut, le client va ressayer toutes les 5 secondes jusqu' ce qu'il russisse.
807
QUIT Quitte le client de gestion du cluster. SHUTDOWN Arrte tous les noeuds du cluster, hormis les serveurs MySQL, puis s'arrte. Les commandes des logs d'vnements sont listes dans la prochaine section, et les commandes de sauvegarde sont donnes dans une section spare.
808
Notez que les vnements sont rapports pour chaque noeud de base de donnes, et que les seuils peuvent tre diffrents sur chaque noeud. Catgorie STARTUP SHUTDOWN STATISTICS CHECKPOINT NODERESTART CONNECTION ERROR INFO seuil par dfaut (toutes les bases) 7 7 7 7 7 7 15 7
Un seuil permet de filtrer les vnements par catgorie. Par exemple, un vnement STARTUP avec une priorit de 3 n'est jamais mis moins que le seuil de STARTUP ne soit chang 3 ou plus bas. Seuls les vnements avec des priorits de 3 ou plus bas sont mis si le seuil est de 3. Les svrit d'vnements correspondent aux niveaux du log systme d'UNIX. Ce sont : 1 ALERT Un problme qui doit tre corrig immdiatement, comme une base de donnes corrompue CRITICAL Problmes critiques, comme une erreur de volume ou un manque de ressources ERROR Problme qui doivent tre corrigs, comme un problme de configuration WARNING Problmes qui ne sont pas des erreurs, mais requiert un traitement INFO Message d'information DEBUG Messages pour le dveloppement de NDB Cluster
2 3 4 5 6
Les niveaux syslog de LOG_EMERG et LOG_NOTICE ne sont pas utiliss. Les svrits d'vnements peuvent tre actives ou pas. Si la svrit est active, alors tous les vnements avec une priorit infrieure ou gale au seuil seront enregistrs. Si la svrit est teinte, alors aucun vnement de cette svrit ne sera enregistr. Les commandes suivantes sont lies au log du noeud : <id> LOGLEVEL <levelnumber> Active le niveau de log pour le processus de base de donnes id, avec le niveau <levelnumber>.
16.6.2.2. Evnements
Tous les vnements rapports sont lists ici. Evnements DB nodes connected Communication closed Catgorie Priorit Sverit Description INFO INFO INFO INFO Connexion aux noeuds API & DB ferme Connexion aux noeuds API & DB ferme
CONNECTION 8 CONNECTION 8
809
CHECKPOINT 9 CHECKPOINT 10
Dbut de GCP, i.e., le log REDO est crit sur le disque GCP termin Dbut d'une vrification de jalon local, i.e., les donnes sont crites sur le disque. LCP Id et GCI Id LCP termin LCP arrt! Un LCP sur un fragment a t termin Le log d'annulation est bloqu car le buffer est presque plein NDB Cluster dmarre NDB Cluster dmarr Signal intern pour bloquer la reception aprs la fin du redmarrage La phase de dmarrage est finie Le noeud prsident, le noeud courant et l'identifiant dynamique sont affichs
Local checkpoint completed LCP stopped in calc keep GCI Local checkpoint fragment completed
Report undo log blocked CHECKPOINT 7 DB node start phases initiated STARTUP 1 1 15 4 3
DB node all start phases STARTUP completed Internal start signal received STTORRY DB node start phase X completed Node has been successfully included into the cluster Node has been refused to be included into the cluster DB node neighbours DB node shutdown initiated DB node shutdown aborted New REDO log started New log started Undo records executed Completed copying of dictionary information Completed copying distribution information Starting to copy fragments Completed copying a fragment STARTUP STARTUP STARTUP
STARTUP
INFO
8 1 1 10 10 15
INFO INFO INFO INFO INFO INFO INFO INFO INFO INFO
GCI garde X, dernier jalon accessible GCI Y Log termine X, dmarre MB Y, stoppe MB Z
810
Completed copying all fragments Node failure phase completed Node has failed, node state was X
INFO ALERT ALERT INFO Indique un chec de noeud Indique qu'un noeud a chou 7 rsultats diffrents - Prsident relance le thread d'arbitrage [state=X] - Prparation de l'arbitrage, noeud X [ticket=Y] - Reoit l'arbitrage, noeud X [ticket=Y] - Dmarre l'arbitrage X [ticket=Y] - Perte de l'arbitrage, noeud X - echec de traitement [state=Y] - Perte de l'arbitrage, noeud X - fin de traitement [state=Y] - Perte de l'arbitrage, noeud X <error msg>[state=Y]
ALERT
8 rsultats diffrents - Arbitrage perdu - moins de la moiti des noeuds dispo - Arbitrage gagn - majorit du groupe de noeuds - Arbitrage perdu - plus de groupe de noeuds - Partage du rseau - arbitrage demand - Arbitrage gagn - rponse positive du noeud X - Arbitrage persu - rponse ngative du noeud X - Partage du rseau - pas d'arbitre disponible - Partage du rseau - par d'arbitre configur
GCP take over started GCP take over completed LCP take over started LCP take completed (state = X) Report transaction statistics
INFO INFO INFO INFO INFO nombre de transactions, archivages, lectures, lectures simples, critures, oprations simultanes, attributs, annulations nombre d'oprations
Report operations
STATISTICS
INFO
811
Report table create Report job scheduling statistics Sent # of bytes Received # of bytes Memory usage
7 9 9 9 5
INFO INFO INFO INFO INFO Statistiques internes de programmation de tches Moyenne de nombre d'octets envoys au noeud X Moyenne de nombre d'octets reus au noeud X Utilisation de la mmoire pour les donnes et les index(80%, 90% et 100%)
Transporter errors Transporter warnings Missed heartbeats Dead due to missed heartbeat Sent heartbeat Create log bytes General info events
2 8 8 8 2 12 11 2
ERROR WARNING WARNING Le noeud X a rat une pulsation # Y ALERT Le noeud X est dclar mort cause des pulsations manques Pulsation envoye au noeud X Partie de log, fichier de log, taille
Aprs avoir excut cette commande, et aprs que le cluster soit entre en mode d'utilisateur unique, le noeud d'API d'identifiant 5 devient le seul utilisateur du cluster. Le noeud spcifi dans la commande ci-dessus doive tre un noeud MySQL. Toute tentative de spcifier un autre type de noeud sera rejete. Note : si le noeud avec l'identifiant 5 est excut avec le mode ENTER SINGLE USER MODE 5, toutes les transactions du noeud 5 seront annules, les connexions fermes et le serveur devra redmarrer. La commande EXIT SINGLE USER MODE fait passer le cluster de mode ``single user mode'' ``started''. Les serveur MySQL en attente de connexion seront autoriss se connecter. Le serveur identifi comme utilisateur unique sera autoris continuer durant et aprs la phase de transition. Exemple :
EXIT SINGLE USER MODE
La meilleure pratique dans le cas des incidents de noeuds en mode d'utilisateur unique est de :
812
1. Finir toutes les transactions d'utilisateur unique 2. Quitter le mode d'utilisateur unique 3. Redmarrer les noeuds de bases de donnes Ou redmarrer les noeuds de bases avant de passer en mode utilisateur unique.
813
1. Lancez le serveur de gestion. 2. Excutez la commande START BACKUP. 3. Le serveur de gestion vous indiquera ``Start of backup ordered''. Cela signifie que le serveur de gestion a envoy la requte au cluster, mais qu'il n'a pas encore reu de rponse. 4. Le serveur de gestion va indiquer ``Backup <BackupId> started'', o <BackupId> est l'identifiant de la sauvegarde. Cette information sera aussi enregistre dans le log du gluster ( moins que cela ne soit configur autrement). Cela signifie que le serveur a reu des rponses, et que la sauvegarde a t faite. Cela ne signifie pas que la sauvegarde est complte. 5. Le serveur de gestion va indiquer que la sauvegarde est finie avec le message ``Backup <BackupId> completed''. Utilisation du serveur pour annuler une sauvegarde : 1. Lancez le serveur de gestion. 2. Excutez la commande ABORT BACKUP <BACKUPID>. Le numro <BackupId> est l'identifiant de la sauvegarde, qui est inclut dans la rponse du serveur de gestion au moment de la cration de la sauvegarde : ``Backup <BackupId> started''. L'identifiant est aussi sauv dans le log du cluster (cluster.log). 3. Le serveur de gestion rpond ``Abort of backup <BackupId> ordered''. Cela signifie qu'il a envoy la requte au cluster, mais n'a pas encore reu de rponse. 4. Le serveur de gestion rpond ``Backup <BackupId> has been aborted reason XYZ''. Cela signifie que le cluster a annul la sauvegarde, et supprim toutes les ressources relies, y compris les fichiers. Notez que s'il n'y a pas de sauvegarde en cours avec l'identifiant <BackupId> lors de l'annulsation, le serveur de gestion ne rpondra rien du tout. Cependant, une ligne sera enregistre dans le log du cluster mentionnant ``invalid''.
814
BackupDataBufferSize La quantit de mmoire utilise pour les buffer avant que les donnes soient crites sur le disque. BackupLogBufferSize La quantit de mmoire utilise pour les buffers de logs, avant qu'ils ne soient crits sur le disque. BackupMemory La quantit totale de mmoire alloue pour effectuer les sauvegardes. Cela doit tre la somme des deux options prcdentes. BackupWriteSize La taille des blocs crits sur le disque. Cela s'applique aussi bien aux buffers de donnes qu'aux buffers de log.
815
supportes que sur les noyaux Linux 2.4 et 2.6 pour le moment. Les transporteurs SCI fonctionnent sur d'autres systmes d'exploitation, mme si seul Linux 2.4 a t vrifi. Il y a essentiellement 4 choses ncessaires pour activer les sockets SCI. La premire est de compiler les bibliothques de sockets SCI. La seconde est d'installer les bibliothques SCI dans le noyau. La troisime est d'installer les fichiers de configuration. Enfin, la bibliothque SCI du noyau doit tre active pour toute la machine, ou pour le shell d'o le cluster MySQL est lanc. Ce processus doit tre rpt pour chaque machine du cluster qui utilisera les sockets SCI pour communiquer. Deux paquets doivent tre installs pour faire fonctionner les sockets SCI. Le premier paquet compile les bibliothques avec lesquelles les bibliothques SCI sont compiles. Actuellement, la distribution est uniquement au format code source. Les dernires versions de ces paquets sont actuellement disponibles :
http://www.dolphinics.no/support/downloads.html http://www.dolphinics.no/ftp/source/DIS_GPL_2_5_0_SEP_10_2004.tar.gz http://www.dolphinics.no/ftp/source/SCI_SOCKET_2_3_0_OKT_01_2004.tar.gz
La prochaine tape est de dcompresser ces dossiers. Les sockets SCI sont dcompresses sous le code DIS. Puis, le code de base est compil. L'exemple ci-dessous montre les commandes utilises sur Linux/x86 pour ce faire.
shell> shell> shell> shell> shell> tar xzf DIS_GPL_2_5_0_SEP_10_2004.tar.gz cd DIS_GPL_2_5_0_SEP_10_2004/src/ tar xzf ../../SCI_SOCKET_2_3_0_OKT_01_2004.tar.gz cd ../adm/bin/Linux_pkgs ./make_PSB_66_release
Si la compilation se passe sur une machine Opteron, et doit utiliser l'exention 64 bits, alors utilisez make_PSB_66_X86_64_release la place. Si la compilation a lieu sur Itanium, utilisez make_PSB_66_IA64_release. Les variantes X86-64 devraient fonctionner pour les architectures Intel EM64T mais aucun test n'est connu pour cela. Aprs avoir compil le code de base, il est plac dans une archive compresse. Il est temps d'installer le paquet au bon endroit. Dans cet exemple, nous allons placer l'installation dans le dossier /opt/DIS. Ces actions vous imposerons de vous identifier comme super-utilisateur.
shell> shell> shell> shell> cp DIS_Linux_2.4.20-8_181004.tar.gz /opt/ cd /opt tar xzf DIS_Linux_2.4.20-8_181004.tar.gz mv DIS_Linux_2.4.20-8_181004 DIS
Maintenant que les bibliothques et les binaires sont en place, nous devons nous assurer que les cartes SCI recoivent les bons identifiants de noeuds dans l'espace SCI. Comme SCI est un lment rseau, nous devons commencer par dcider de la structure du rseau. Il y a trois types de structure de rseau : la premire est un simple anneau unidimensionnel, le second utilise les hub SCI, avec un anneau par hub, et finalement, il y a des tores 2D et 3D. Chaque type a sa technique pour attribuer les identifiants. Un anneau simple utilise des identifiant espacs de 4 :
4, 8, 12, ....
La deuxime mthode utilise des hubs. Le hub SCI a 8 ports. Sur chaque port, il est possible de placer un anneau. Il est ncessaire de s'assurer que les anneaux des hubs utilisent des espaces d'identifiants diffrents. Le premier port utilisera les identifiants infrieurs 64, et les 64 identifiants suivants seront attribus au prochain port, etc.
4,8, 12, ... , 60 Anneau du premier port 68, 72, .... , 124 Anneau du deuxime port 132, 136, ..., 188 Anneau du troisime port ..
816
Les structures de rseaux en tore 2D/3D prennent en compte la position de chaque noeud dans chaque dimension. La premire dimension est incrmente de 4, la deuxime de 64 et la troisime de 1024. Regardez dans le dauphin pour plus d'informations dessus. Durant nos tests, nous avons utiliss des hubs. La majorit des trs gros cluster utilisent des installations Tore 2D/3D. La fonctionnalit supplmentaire que permet les hubs est qu'avec des doubles cartes SCI, nous pouvons facilement construire un rseau redondant, o les erreurs de rseau sont aussitt reprises en 100 microsecondes. Cette fonctionnalit est supporte par le transporteur SCI, et est actuellement en dveloppement pour les sockets SCI. La reprise sur chec est aussi possible avec les tores 2D/3D, mais elle impose l'envoie de nouveaux index de routages tous les noeuds. Cela prend environ 100 milliseconds et sera probablement acceptable pour les situations de haute disponibilit. En agenceant correctement les noeuds NDB dans l'architecture, il est possible d'utiliser deux hubs pour monter une architecture de 16 ordinateurs interconnects, sans aucun point d'interruption. Avec 32 ordinateurs et 2 hubs, il est possible de configurer le cluster de telle manire qu'un incident ne perturbera pas plus de 2 noeuds, et dans ce cas, on saura mme quelle paire sera touche. Par consquent, en plaant ces serveurs dans des groupes NDB spars, il est possible de construire un cluster MySQL scuris. Nous n'entreront pas dans les dtails de cette architecture, car seuls ceux qui le souhaitent auront la patience de lire de niveau de dtails. Pour configurer l'identifiant de noeud sur une carte SCI, utilisez l'une des commandes disponibles dans le dossier /opt/DIS/sbin. -c 1 fait rfrence la carte SCI, o 1 est son numro s'il y a une seule carte sur la machine. Dans ce cas, utilisez toujours l'adapteur 0 (avec -a 0). 68 est l'identifiant de noeud choisi comme exemple :
shell> ./sciconfig -c 1 -a 0 -n 68
Dans ce cas, nous avons plusieurs cartes SCI dans notre machine, et la seule solution scuritaire pour savoir quelle carte est dans quel emplacement, est d'utiliser la commande suivante :
shell> ./sciconfig -c 1 -gsn
Elle vous retournera le numro de srie de la carte, qui peut tre trouve sur sont dos. Rptez cette manipulation avec -c 2, etc, en fonction du nombre de cartes que vous avez sur la machine. Vous pourrez ainsi identifier les cartes de la machine. Maintenant, nous avons install les bibliothques et les excutables. Nous avons aussi configur les identifiants de noeuds. L'tape d'aprs est d'effectuer le plan de noms ou d'adresses IP pour les noeuds SCI. Le fichier de configuration des sockets SCI doit tre plac dans le fichier /etc/sci/scisock.conf. Ce fichier contient la carte des noms d'htes et leur correspondance avec les noeuds SCI. L'identifiant de noeud SCI correspond avec un autre via la carte SCI. Ci-dessous, voici un fichier de configuration trs simple :
#host alpha beta 192.168.10.20 #nodeId 8 12 16
Il est aussi possible de limiter cette configuration pour qu'elle ne s'applique qu' une sous-partie des ports des htes. Pour cela, une autre configuration est utilise, et place dans /etc/sci/ scisock_opt.conf.
#-key EnablePortsByDefault EnablePort DisablePort EnablePortRange DisablePortRange -type yes tcp tcp tcp tcp -values 2200 2201 2202 2219 2220 2231
817
Maintenant, nous sommes prts installer les pilotes. Nous devons installer d'abord les pilotes basniveau, puis les pilotes SCI sockets.
shell> cd DIS/sbin/ shell> ./drv-install add PSB66 shell> ./scisocket-install add
Si vous voulez, vous pouvez maintenant tester votre installation en appelant le script qui teste tous les noeuds SCI.
shell> cd /opt/DIS/sbin/ shell> ./status.sh
Si vous rencontrez une erreur et que vous devez changer les fichiers de configuration SCI, alors il faudra utiliser le programme ksocketconfig pour adapter les configurations.
shell> cd /opt/DIS/util shell> ./ksocketconfig -f
Pour vrifier que les sockets SCI sont fonctionnelles, vous pouvez utiliser le programme latency_bench qui a besoin d'un composant serveur et d'un client qui se connecte au serveur, pour tester les dlais : l'activation de SCI est vidente en lisant les dlais de latence. Avant d'utiliser ces programmes, vous devrez configurer la variable LD_PRELOAD tel que ci-dessous. To set up a server use the command
shell> cd /opt/DIS/bin/socket shell> ./latency_bench -server
Maintenant, la configuration des sockets SCI est complte. Le cluster MySQL est prt s'excuter avec les sockets SCI et le transporteur SCI, document dans Section 16.4.4.9, Dfinition d'un transporteur SCI dans un cluster . La prochaine tape est de lancer le cluster MysQL. Pour activer l'utilisation des sockets SCI, il est ncessaire de configurer la variable d'environnement LD_PRELOAD avant de lancer ndbd, mysqld et ndb_mgmd. La variable LD_PRELOAD doit pointer sur la bibliothque du noyau qui supporte les sockets SCI. Voici un exemple pour lancer ndbd depuis un bash :
bash-shell> export LD_PRELOAD=/opt/DIS/lib/libkscisock.so bash-shell> ndbd
Depuis un environnement tcsh, la mme chose se fait avec les commandes suivantes :
tcsh-shell> setenv LD_PRELOAD=/opt/DIS/lib/libkscisock.so tcsh-shell> ndbd
Notez bien que le cluster MysQL ne peut utiliser que les variantes du noyau des sockets SCI.
818
contexte sont pris en charge par celle seule opration. Dans un mode par lots, o les cls primaires sont distribues par groupe de 32, chaque groupe va partager le cot des messages TCP/IP et les cots de changement de contexte (si les messages sont destins diffrents noeuds, il faudra construire les messages ncessaires). Accs par cl unique Les accs par cl unique sont trs similaires aux accs par cl primaire, hormis le fait qu'ils sont excuts sous forme de lecture de l'index, suivi par un accs de cl primaire. Cependant, une seule requte est envoye par le serveur MySQL, et la lecture de l'index est gre par le processus ndbd. Par consquent, ces requtes gagnent tre ralises en groupe. Analyse complte de table Lorsqu'aucun index n'existe pour une table, cette dernire est entirement analyse. C'est une seule requte qui est envoye au processus ndbd, qui la divise en analyses paralelles dans les noeuds du cluster. Dans les futures versions du cluster, MySQL sera capable de filtrer un peu mieux ces analyses. Analyse d'intervalle avec un index ordonn Lorsqu'un index ordonn est utilis, il va faire une analyse de la mme manire qu'une analyse de table, mais il ne traitera que les lignes qui sont dans l'intervalle indiqu par la requte. Dans les futures versions, une optimisation spciale aura lieu pour s'assurer que tous les attributs de l'index qui sont lis incluent les attributs de la cl, pour que seule une partie de l'index soit analyse, et non pas analyse en paralelle. Pour vrifier les performances de base de ces mthodes d'accs, nous avons dvelopp un jeu de tests. Un des test, testReadPerf, effectue des accs via cl primaire, cl unique, en batch ou non. Les tests mesurent aussi le cot des analyses par intervalles, en effectuant des tests qui retournent une seule ligne, et finalement, des variantes qui utilisent des analyses d'intervalle pour lire des groupes de lignes. Dans cette manire, il est possible de mesurer le cot d'un accs une cl, et le cot de l'analyse d'une ligne, puis de mesurer l'impact des mdias de communication. Nous avons excut ces tests avec des sockets TCP/IP classiques et des sockets SCI. Les chiffres indiqus ci-dessous correspondent des petits accs de 20 lignes par accs aux donnes. La diffrence entre les accs de srie et par groupe diminue d'un facteur de 3-4 lorsque les lignes font 2 ko. Les sockets SCI ne sont pas testes pour les lignes de 2ko. Les tests ont t effectus sur des clusters de 2 noeuds, avec des machines bi-processeurs, quipes de AMD 1900+.
type d'accs: Serial pk access: Batched pk access: Serial uk access: Batched uk access: Indexed eq-bound: Index range: Sockets TCP/IP 400 microsecondes 28 microsecondes 500 microsecondes 70 microsecondes 1250 microsecondes 24 microsecondes Sockets SCI 160 microsecondes 22 microsecondes 250 microsecondes 36 microsecondes 750 microsecondes 12 microsecondes
Nous avons aussi un autre jeu de test pour comparer les performances des sockets SCI, en utilisant le transport SCI ou le transport TCP/IP. Ces tests utilisent des accs par cl primaire, en srie, multithread ou multi-thread en groupe, simultanment. Presque tous les tests ont montrs que les sockets SCI sont 100% plus rapides que les sockets TCP/ IP. Le transporteur SCI tait plus rapide dans la plupart des cas, compars aux sockets SCI. Un cas notable : les multi-threads ont montr que le transporteur SCI pouvait se comporter de trs mauvaise manire, s'il est utilis dans le processus mysqld. Dans l'ensemble, notre conclusion est que pour les tests de performances, les sockets SCI ont amliors la vitesse de 100% par rapport aux sockets TCP/IP, sauf sauf dans les rares cas o les 819
performances ne sont pas un problme comme lors des analyses par filtres qui prennent beaucoup de temps, o lorsque de trs grands groupes de cl primaires sont en jeu. Dans ce cas, le temps de calcul processeur de ndbd prend une forte part du temps de calcul. Utiliser le transporteur SCI au lieu des sockets SCI ne sert vraiment qu'entre les processus ndbd. Utiliser le transporteur SCI ne sert que si un processeur peut tre ddi un processus ndbd, car le transporteur SCI s'assure que le processus ndbd ne reste pas inactif. Il est aussi important de s'assurer que le processus ndbd a une priorit suffisament haute pour ne pas tre rtrograd s'il fonctionne durant un long moment (comme cela se fait en verrouillant les processus sur un processeur en Linux 2.6). Si c'est possible, alors le processus ndbd gagnera 10 70% de performances, par rapport aux sockets SCI : les gains les plus importants interviennent lors des modifications, et probablement sur les analyses paralelles). Il y a d'autres implmentations de sockets optimises pour les clusters, indiques dans diffrents articles. Elles incluent les sockets optimises pour Myrinet, Gigabit Ethernet, Infiniband et interfaces VIA. Nous n'avons test le cluster MySQL qu'avec les sockets SCI, et nous incluons aussi la documentation ci-dessus sur comment configurer les sockets SCI en utilisant une configuration TCP/IP ordinaire sur un cluster MySQL.
820
give rise to errors. Database names and table names can total maximum of 122 characters. (That is, the maximum length for an NDB Cluster table name is 122 characters less the number of characters in the name of the database of which that table is a part.) In MySQL 4.1 and 5.0, all Cluster table rows are of fixed length. This means (for example) that if a table has one or more VARCHAR fields containing only relatively small values, more memory and disk space will be required when using the NDB storage engine than would be for the same table and data using the MyISAM engine. We are working to rectify this issue in MySQL 5.1. The maximum number of metadata objects is limited to 1600, including database tables, system tables, indexes and BLOBs. The maximum number of attributes per table is limited to 128. The maximum permitted size of any one row is 8k, not including data stored in BLOB columns. The maximum number of attributes per key is 32. Unsupported features (do not cause errors, but are not supported or enforced): The foreign key construct is ignored, just as it is in MyISAM tables. Savepoints and rollbacks to savepoints are ignored as in MyISAM. Performance and limitation-related issues: The query cache is disabled, since it is not invalidated if an update occurs on a different MySQL server. There are query performance issues due to sequential access to the NDB storage engine; it is also relatively more expensive to do many range scans than it is with either MyISAM or InnoDB. The Records in range statistic is not supported, resulting in non-optimal query plans in some cases. Employ USE INDEX or FORCE INDEX as a workaround. Unique hash indexes created with USING HASH cannot be used for accessing a table if NULL is given as part of the key. Missing features: The only supported isolation level is READ_COMMITTED. (InnoDB supports READ_COMMITTED, REPEATABLE_READ, and SERIALIZABLE.) See MySQL Cluster Backup Troubleshooting for information on how this can effect backup/restore of Cluster databases. No durable commits on disk. Commits are replicated, but there is no guarantee that logs are flushed to disk on commit. Problems relating to multiple MySQL servers (not relating to MyISAM or InnoDB): ALTER TABLE is not fully locking when running multiple MySQL servers (no distributed table lock). MySQL replication will not work correctly off if updates are done on multiple MySQL servers. However, if the database partitioning scheme done at the application level, and no transactions take place across these partitions, then replication can be made to work. Autodiscovery of databases is not supported for multiple MySQL servers accessing the same MySQL Cluster. However, autodiscovery of tables is supported in such cases. What this means is that after a database named db_name is created or imported using one MySQL server, you should issue a CREATE DATABASE db_name; statement on each additional MySQL server that access the same MySQL Cluster. (As of MySQL 5.0.2 you may also use CREATE SCHEMA db_name;.) Once this has been done for a given MySQL server, that server should be able to detect the database tables without error.
821
Issues exclusive to MySQL Cluster (not related to MyISAM or InnoDB): All machines used in the cluster must have the same architecture; that is, all machines hosting nodes must be either big-endian or little-endian, and you cannot use a mixture of both. For example, you cannot have a management node running on a PPC which directs a storage node that is running on an x86 machine. This restriction does not apply to machines simply running mysql or other clients that may be accessing the cluster's SQL nodes. It is not possible to make online schema changes such as those accomplished using ALTER TABLE or CREATE INDEX. (However, you can import or create a table that uses a different storage engine, then convert it to NDB using ALTER TABLE tbl_name ENGINE=NDBCLUSTER;.) Online adding or dropping nodes is not possible (the cluster must be restarted in such cases). When using multiple management servers one must give nodes explicit IDs in connectstrings since automatic allocation of node IDs does not work across multiple management servers. When using multiple management servers one must take extreme care to have the same configurations for all management servers. No special checks for this are performed by the cluster. The maximum number of storage nodes is 48. The total maximum number of nodes in a MySQL Cluster is 63. This number includes all MySQL Servers (SQL nodes), storage nodes, and management servers. This listing is intended to be complete with respect to the conditions set forth at the beginning of this section. You can report any discrepancies that you encounter to the MySQL bugs database at http:// bugs.mysql.com/. If we do not plan to fix the problem in MySQL 4.1, we will add it to the list above.
va utiliser un scan de table complet, et la condition sera value dans chaque noeud du cluster. Par consquent, il n'est pas ncessaire d'envoyer les lignes travers le rseau pour qu'elles soient values : on utilise le transport de fonctions, et non pas le transport de donnes. Pour ce type de
822
requte, la vitesse d'excution s'amliore d'un facteur de 5 10. Notez que ce type de fonctionnalit est actuellement dsactiv par dfaut, en attente de plus de tests, mais il devrait fonctionner dans la plupart des cas. Cette fonctionnalit peut tre active via la commande SET engine-conditionpushdown=On;. Autrement, vous pouvez excuter le serveur mysqld avec cette fonctionnalit active par dfaut en lanant le logiciel avec l'option de dmarrage --engine-condition-pushdown. Vous pouvez utiliser EXPLAIN pour savoir si ces conditions sont remplies. Un avantage majeure de cette modification est que les requtes sont maintenant excutes en paralelle. Cela signifie que les requtes effectues sur des colonnes non-indexes s'excute 5 10 fois, multipli par le nombre de noeud de stockages, plus vite que prcdemment, car plusieurs processeurs sont utiliss en paralelle. conomie de IndexMemory : en MySQL 5.0, chaque enregistrement consomme environs 25 octets en mmoire d'index, et chaque index unique utilise 25 octets par ligne en mmoire, en plus de la mmoire ncessaire au stockage dans une table spare. Ceci est li au fait qu'il n'y a pas de stockage de la cl primaire dans la mmoire de l'index. Activation du cache de requte pour MySQL Cluster : voyez Section 5.11, Cache de requtes MySQL pour des informations sur la configuration et l'utilisation du cache de requte. Nouvelles optimisations : une optimisation qui mrite l'attention est que l'interface de lectures en groupe est maintenant utilise dans certaines requtes. Par exemple, observez la requte suivante :
SELECT * FROM t1 WHERE primary_key IN (1,2,3,4,5,6,7,8,9,10);
Cette requte sera excute 2 3 fois plus vite que dans les versions prcdentes du MySQL Cluster, car les recherches d'index sont envoyes en groupe et non plus de manire unitaire.
823
means that if the master fails, it is possible that the slave might not have recorded the last few transactions. If a transaction-safe engine such as InnoDB is being used, then a transaction will either be complete on the slave or not applied at all, but replication does not guarantee that all data on the master and the slave will be consistent at all times. In MySQL Cluster, all storage nodes are kept in synch, and a transaction committed by any one storage node is committed for all storage nodes. In the event of a storage node failure, all remaining storage nodes will remain in a consistent state. In short, whereas MySQL replication is asynchronous, MySQL Cluster is synchronous. Do I need to do any special networking to run Cluster? (How do computers in a cluster communicate?) MySQL Cluster is intended to be used in a high-bandwidth environment, with computers connecting via TCP/IP. Its performance depends directly upon the connection speed between the cluster's computers. The minimum connectivity requirements for Cluster include a typical 100-megabit Ethernet network or the equivalent. We recommend you use gigabit Ethernet whenever available. The faster SCI protocol is also supported, but requires special hardware. See MySQL Cluster Interconnects for more information about SCI. How many computers do I need to run a cluster, and why? A minimum of three computers is required to run a viable cluster. However, the minimum recommended number of computers in a MySQL Cluster is four: one each to run the management and SQL nodes, and two computers to serve as storage nodes. The purpose of the two storage nodes is to provide redundancy; the management node must run on a separate machine in order to guarantee continued arbitration services in the event that one of the storage nodes fails. What do the different computers do in a cluster? A MySQL Cluster has both a physical and logical organisation, with computers being the physical elements. The logical or functional elements of a cluster are referred to as nodes, and a computer housing a cluster node is sometimes referred to as a cluster host. Ideally, there will be one node per cluster host, although it is possible to run multiple nodes on a single host. There are three types of nodes, each corresponding to a specific role within the cluster. These are: 1. management node (MGM node): Provides management services for the cluster as a whole, including startup, shutdown, backups, and configuration data for the other nodes. The management node server is implemented as the application ndb_mgmd; the management client used to control MySQL Cluster via the MGM node is ndb_mgm. 2. storage node (data node): Stores and replicates data. Storage node functionality is handled by an instance of the NDB storage node process ndbd. 3. SQL node: This is simply an instance of MySQL Server (mysqld) started with the --ndbcluster option. With which operating systems can I use Cluster? As of MySQL 4.1.10, MySQL Cluster is officially supported on Linux, Mac OS X, and Solaris. We are working to add Cluster support for other platforms, including Windows (Windows support expected in MySQL 5.0), and our goal is eventually to offer Cluster on all platforms for which MySQL itself is supported. It may be possible to run Cluster processes on other operating systems (including Windows), but Cluster on any but the three mentioned here should be considered alpha software and not for production use. What are the hardware requirements for running MySQL Cluster?
824
Cluster should run on any platform for which NDB-enabled binaries are available. Naturally, faster CPUs and more memory will improve performance, and 64-bit CPUs will likely be more effective than 32-bit processors. There must be sufficent memory on machines used for storage nodes to hold each node's share of the database (see How much RAM does Cluster require? for more info). Nodes can communicate via a standard TCP/IP network and hardware. For SCI support, special networking hardware is required. Since MySQL Cluster uses TCP/IP, does that mean I can run it over the Internet, with one or more nodes in a remote location? It is important to keep in mind that communications between the nodes in a MySQL Cluster are not secure; they are neither encrypted nor safeguarded by any other protective mechanism. The most secure configuration for a cluster is in a private network behind a firewall, with no direct access to any Cluster data or management nodes from outside. It is very doubtful in any case that a cluster would perform reliably under such conditions, as MySQL Cluster was designed and implemented with the assumption that it would be run under conditions guaranteeing dedicated high-speed connectivity such as that found in a LAN setting using 100 Mbps or gigabit Ethernet. We neither test nor warrant its performance using anything slower. Do I have to learn a new programming or query language to use Cluster? No. While some specialised commands are used to manage and configure the cluster itself, only standard (My)SQL queries and commands are required for: creating, altering, and dropping tables inserting, updating, and deleting table data creating, changing, and dropping primary and unique indexes configuring and managing SQL nodes (MySQL servers) How do I find out what an error or warning message means when using Cluster? There are two ways in which this can be done: 1. From within the MySQL Monitor, use SHOW ERRORS or SHOW WARNINGS immediately upon being notified of the error or warning condition. These can also be displayed in MySQL Query Browser. 2. From a system shell prompt, use perror --ndb error-code. Is MySQL Cluster transaction-safe? What table types does Cluster support? Yes. MySQL Cluster is enabled for tables created with the NDB storage engine, which supports transactions. NDB is the only MySQL storage engine which supports clustering. What does "NDB" mean? This stands for "Network Database". Which version(s) of the MySQL software support Cluster? Do I have to compile from source? Cluster is supported in the MySQL-max binaries from version 4.1.3 onwards. You can determine whether or not your server binary has NDB support using either of the commands SHOW VARIABLES LIKE 'have_%'; or SHOW ENGINES;. (See Section 5.1.2, mysqld-max, la version tendue du serveur mysqld for more information.) Linux users, please note that NDB is not included in the RPMs; you should use the binaries supplied as .tar.gz archives in the MySQL Downloads area instead. You can also obtain NDB support
825
by compiling the -max binaries from source, but it is not necessary to do so simply to use MySQL Cluster. How much RAM do I need? Is it possible to use disk memory at all? Currently, Cluster is in-memory only. This means that all table data (including indexes) is stored in RAM. Therefore, if your data takes up 1 gigabyte of space and you wish to replicate it once in the cluster, you'll need 2 gigabytes of memory to do so. This in addition to the memory required by the operating system and any applications running on the cluster computers. You can use the following formula for obtaining a rough estimate of how much RAM is needed for each storage node in the cluster:
(SizeofDatabase * NumberOfReplicas * 1.1 ) / NumberOfStorageNodes
To calculate the memory requirements more exactly requires determining, for each table in the cluster database, the storage space required per row (see Section 11.5, Capacits des colonnes for details), and multiplying this by the number of rows. You must also remember to account for any column indexes as follows: In MySQL 4.1, each primary key or hash index created for an NDBCluster table requires 25 bytes storage, plus the size of the key, per record. In MySQL 5.0, this amount is reduced to 21-25 bytes per record. These indexes use IndexMemory. Each ordered index requires 10 bytes storage per record, using DataMemory. Creating a primary key or unique index also creates an ordered index, unless this index is created with USING HASH. In other words, if created without USING HASH, a primary key or unique index on a Cluster table will take up 35 bytes (plus the size of the key) per record in MySQL 4.1, and 31-35 bytes per record in MySQL 5.0. Note that creating MySQL Cluster tables with USING HASH for all primary keys and unique indexes will generally cause table updates to run more quickly. This is due to the fact that less memory is required (since no ordered indexes are created), and that less CPU must be utilised (since fewer indexes must be read and possibly updated). It is especially important to keep in mind that every MySQL Cluster table must have a primary key, that the NDB storage engine will create a primary key automatically if none is defined, and that this primary key is created without USING HASH. We often see questions from users who report that, when they're trying to populate a Cluster database, the loading process terminates prematurely and an error message like this one is observed:
ERROR 1114: The table 'my_cluster_table' is full
When this occurs, the cause is very likely to be that your setup does not provide sufficient RAM for all table data and all indexes, including the primary key required by NDB. It is also worth noting that all storage nodes should have the same amount of RAM, as no storage node in a cluster can use more memory than the least amount available to any individual storage node. In other words, if there are three computers hosting Cluster storage nodes, with two of these having three gigabytes of RAM available to store Cluster data, and one having only one GB RAM, then each storage node can devote only one GB for Cluster. In the event of a catstrophic failure - say, for instance, the whole city lost power AND my UPS failed would I lose all my data?
826
All committed transactions are logged. Therefore, while it is possible that some data could be lost in the event of a catastrophe, this should be quite limited. Data loss can be further reduced by minimising the number of operations per transaction. Is it possible to use FULLTEXT indexes with Cluster? FULLTEXT indexing is not currently (MySQL 4.1.9) supported by the NDB storage engine. We are working to add this capability in a future release. Can I run multiple nodes on a single computer? It is possible but not advisable. One of the chief reasons to run a cluster is to provide redundancy; in order to enjoy the full benefits of this redundancy, each node should reside on a separate machine. If you place multiple nodes on a single machine and that machine fails, you lose all of those nodes. Given that MySQL Cluster can be run on commodity hardware loaded with a low-cost or even no-cost operating system, it is well worth the expense of an extra machine or two in order to safeguard mission-critical data. It also worth noting that the requirements for a cluster host running a management node are minimal; this task can be accomplished with a 200 MHz Pentium CPU and sufficient RAM for the operating system plus a small amount of overhead for the ndb_mgmd and ndb_mgm processes. Can I add nodes to a cluster without restarting it? Not at present. A simple restart is all that is required for adding new MGM or SQL nodes to a Cluster. When adding storage nodes the process is more complex and requires the following steps: Making a complete backup of all Cluster data Complete shutting down the cluster and all cluster node processes Restarting the cluster, using the --initial startup option Restoring all cluster data from the backup In future, we hope to implement "hot" reconfiguration capability for MySQL Cluster in order to minimize if not eliminate requirements for restarting the cluster when adding new nodes. Are there any limitations that I should be aware of when using Cluster? NDB tables in MySQL 4.1 are subject to the following limitations: Not all character sets and collations are supported. (For a complete listing of those that are supported, see Section C.10.6, MySQL Cluster-4.1.6, 10 octobre 2004 ). FULLTEXT indexes and prefix indexes are not supported. Only complete columns may be indexed. Chapitre 18, Donnes spatiales avec MySQL are not supported. Only complete rollbacks for transactions are supported. Partial rollbacks and rollbacks to save points are not supported. The maximum number of attributes allowed per table is 128, and attribute names cannot be any longer than 31 characters. For each table, the maximum combined length of the table and database names is 122 characters. The maximum size for a table row is 8 kilobytes, not counting BLOBs. There is no set limit for the number of rows per table; table size limits depend on a number of factors, in particular on the amount of RAM available to each data node. The NDB engine does not support foreign key constraints. As with MyISAM tables, these are ignored.
827
Query caching is not supported. We expect to lift many of these restrictions in MySQL 5.0. For additional information on current limitations, see Section 16.8, Cluster Limitations in MySQL 4.1 . How do I import an existing MySQL database into a cluster? You can import databases into MySQL Cluster much as you would with any other version of MySQL. Other than the limitation mentioned in the previous question, the only other special requirement is that any tables to be included in the cluster must use the NDB storage engine. This means that the tables must be created with the option ENGINE=NDB or ENGINE=NDBCLUSTER. How do cluster nodes communicate with one another? Cluster nodes can communicate via any of three different protocols: TCP/IP, SHM (shared memory), and SCI (Scalable Coherent Interface). Where available, SHM is used by default between nodes residing on the same cluster host. SCI is a high-speed (1 gigabit per second and higher), highavailability protocol used in building scalable multi-processor systems; it requires special hardware and drivers. See Section 16.7, Utilisation d'interconnexions haute vitesse avec MySQL Cluster for more about using SCI as a transport mechanism in MySQL Cluster. What is an arbitrator? If one or more nodes in a cluster fail, it is possible that not all cluster nodes will not be able to "see" one another. In fact, it is possible that two sets of nodes might become isolated from one another in a network partitioning, also known as a "split brain" scenario. This type of situation is undesirable because each set of nodes tries to behave as though it is the entire cluster. When cluster nodes go down, there are two possibilities. If more than 50% of the remaining nodes can communicate with each other, then we have what is sometimes called a "majority rules" situation, and this set of nodes is considered to be the cluster. The arbitrator comes into play when there is an even number of nodes: in such a case, the set of nodes to which the arbitrator belongs is considered to be the cluster, and nodes not belonging to this set are shut down. The above is somewhat simplified; a more complete explanation taking into account node groups follows below: When all nodes in at least one node group are alive, network partitioning is not an issue, because no one portion of the cluster can form a functional cluster. The real problem arises when no single node group has all its nodes alive, in which case network partitioning (the "split-brain" scenario) becomes possible. Then an arbitrator is required. All cluster nodes recognise the same node as the arbitrator, which is normally the management server; however, it is possible to configure any of the MySQL Servers in the cluster to act as the arbirtrator instead. The arbitrator accepts the first set of cluster nodes to contact it, and tells the remaining set to die. Arbitrator selection is controlled by the ArbitrationRank configuration parameter for MySQL Server and management server nodes. (See Section 16.4.4.4, Dfinition du serveur de gestion du cluster for details.) It should also be noted that the role of arbitrator does not in and of itself impose any heavy demands upon the host so designated, and thus the artitrator host does not need to be particularly fast or to have extra memory especially for this purpose. What column types are supported by MySQL Cluster? MySQL Cluster supports all of the usual MySQL column types, with the exception of those associated with MySQL's Chapitre 18, Donnes spatiales avec MySQL. In addition, there are some differences with regard to indexes when used with NDB tables. Note: In MySQL 4.1 and 5.0, Cluster tables (that is, tables created with ENGINE=NDBCLUSTER) have only fixed-width rows. This means that (for example) each record containing a VARCHAR(255) column will will require 256 bytes of storage for that column, regardless of the size of the data stored therein. This issue is expected to be fixed in MySQL 5.1. 828
See Section 16.8, Cluster Limitations in MySQL 4.1 for more information about these issues. How do I start and stop MySQL Cluster? It is necessary to start each node in the cluster separately, in the following order: 1. Start the management node with the ndb_mgmd command. 2. Start each storage node with the ndbd command. 3. Start each MySQL server (SQL node) using mysqld_safe --user=mysql &. Each of these commands must be run from a shell on the machine housing the affected node. You can verify the the cluster is running by starting the MGM management client ndb_mgm on the machine housing the MGM node. What happens to cluster data when the cluster is shut down? The data held in memory by the cluster's storage nodes is written to disk, and is reloaded in memory the next time that the cluster is started. To shut down the cluster, enter the following in a shell on the machine hosting the MGM node:
shell> ndb_mgm -e shutdown
This will cause the ndb_mgm, ndb_mgm, and any ndbd processes to terminate gracefully. MySQL servers running as Cluster SQL nodes can be stopped using mysqladmin shutdown. For more information, see Section 16.6.1, Commandes du client de gestion du Cluster and Section 16.3.6, Arrt et redmarrage du cluster . Is it helpful to have more than one management node for a cluster? It can be helpful as a fail-safe. Only one MGM node controls the cluster at any given time, but it is possible to configure one MGM as primary, and one or more additional management nodes to take over in the evnt that the primary MGM node fails. Can I mix different kinds of hardware and operating systems in a Cluster? Yes, so long as all machines and operating systems are the same endian. It is also possible to use different MySQL Cluster releases on different nodes (for example, 4.1.8 on some nodes and 4.1.9 on others); however, we recommend this be done only as part of a rolling upgrade procedure. Can I run two storage nodes on a single host? Two SQL nodes? Yes, it is possible to do this. In the case of multiple storage nodes, each node must use a different data directory. If you want to run multiple SQL nodes on one machine, then each instance of mysqld must use a different TCP/IP port. Can I use hostnames with MySQL Cluster? Yes, it's possible to use DNS and DHCP for cluster hosts. However, if your application requires "five nines" availability, we recommend using fixed IP addresses. This is because making communication between Cluster hosts dependent on such services introduces additional points of failure, and the fewer of these, the better.
Cluster: In its generic sense, a cluster is a set of computers functioning as a unit and working together to accomplish a single task. NDB Cluster is the storage engine used by MySQL to implement data storage, retrieval, and management distributed amongst several computers. MySQL Cluster refers to a group of computers working together using the NDB engine to support a distributed MySQL database in a shared-nothing architecture using in-memory storage. Configuration files: Text files containing directives and information regarding the cluster, its hosts, and its nodes. These are read by the cluster's management nodes when the cluster is started. See Section 16.4.4, Fichier de configuration for details. Backup: A complete copy of all cluster data, transactions and logs, saved to disk or other long-term storage. Restore: Returning the cluster to a previous state as stored in a backup. Checkpoint: Generally speaking, when data is saved to disk, it is said that a checkpoint has been reached. More specific to Cluster, it is a point in time where all committed transactions are stored on disk. With regard to the NDB storage engine, there are two sorts of checkpoints which work together to ensure that a consistent view of the cluster's data is maintained: Local Checkpoint (LCP): This is a checkpoint that is specific to a single node; however, LCP's take place for all nodes in the cluster more or less concurrently. An LCP involves saving all of a node's data to disk, and so usually occurs every few minutes. The precise interval varies, and depends upon the amount of data stored by the node, the level of cluster activity, and other factors. Global Checkpoint (GCP): A GCP occurs every few seconds, when transactions for all nodes are synchronised and the redo-log is flushed to disk. Cluster host: A computer making up part of a MySQL Cluster. A cluster has both a physical structure and a logical structure. Physically, the cluster consists of a number of computers, known as cluster hosts (or more simply as hosts). See also Node, Node group. Node: This refers to a logical or functional unit of MySQL Cluster, sometimes also referred to as a cluster node. In the context of MySQl Cluster, we use the term node to indicate a process rather than a physical component of the cluster. There are three node types required to implement a working MySQL Cluster. These are: Management (MGM) nodes: Manages the other nodes within the MySQL Cluster. It provides configuration data to the other nodes; starts and stops nodes; handles network partitioning; creates backups and restores from them, and so forth. SQL (MySQL server) nodes: Instances of MySQL Server which serve as front ends to data kept in the cluster's storage nodes. Clients desiring to store, retrieve, or update data can access an SQL node just as they would any other MySQL Server, employing the usual authentication methods and API's; the underlying distribution of data between node groups is transparent to users and applications. SQL nodes access the cluster's databases as a whole without regard to the data's distribution across different storage nodes or cluster hosts. Data nodes (also referred to as storage nodes): These nodes store the actual data. Table data fragments are stored in a set of node groups; each node group stores a different subset of the table data. Each of the nodes making up a node group stores a replica of the fragment for which that node group is responsible. Currently a single cluster can support a total of up to 48 data nodes. It is possible for more than one node to co-exist on a single machine. (In fact, it is even possible to set up a complete cluster on one machine, although one would almost certainly not want to do this in a production environment.) It may be helpful to remember that, when working with MySQL Cluster, host refers to a physical component of the cluster whereas a node is a logical or functional component (that is, a process).
830
Note Regarding Obsolete Terms: In older versions of the MySQL Cluster documentation, data nodes were sometimes referred to as "Database nodes" or "DB nodes". In addition, SQL nodes were sometimes known as "client nodes" or "API nodes". This older terminology has been deprecated in order to minimize confusion, and for these reasons should be avoided. Node group: A set of data nodes. All data nodes in a node group contain the same data (fragments), and all nodes in a single group should reside on different hosts. It is possible to control which nodes belong to which node groups. Node failure: MySQL Cluster is not solely dependent upon the functioning of any single node making up the cluster; the cluster can continue to run if one or more nodes fail. The precise number of node failures that the cluster can tolerate depends upon the number of nodes and the cluster's configuration. Node restart: The process of restarting a failed cluster node. Initial node restart: The process of starting a cluster node with its filesystem removed. This is sometimes used in the course of software upgrades and in other special circumstances. System crash (or system failure): This can occur when so many cluster nodes have failed that the cluster's state can no longer be guaranteed. System restart: The process of restarting the cluster and reinitialising its state from disk logs and checkpoints. This is required after either a planned or an unplanned shutdown of the cluster. Fragment: A portion of a database table; in the NDB storage engine, a table is broken up into and stored as a number of fragments. A fragment is sometimes also called a partition; however, "fragment" is the preferred term. Tables are fragmented in MySQL Cluster in order to facilitate load balancing between machines and nodes. Replica: Under the NDB storage engine, each table fragment has number of replicas stored on other storage nodes in order to provide redundancy. Currently there may be up 4 replicas per fragment. Transporter: A protocol providing data transfer between nodes. MySQL Cluster currently supports 4 different types of transporter connections: TCP/IP (local), TCP/IP (remote), SCI, and SHM (experimental in MySQL 4.1). TCP/IP is, of course, the familiar network protocol that underlies HTTP, FTP, etc., on the Internet. SCI (Scalable Coherent Interface) is a high-speed protocol used in building multiprocessor systems and parallel-processing applications. Use of SCI with MySQL Cluster requires specialised hardware and is discussed in Section 16.7.1, Configurer le cluster MySQL avec les sockets SCI . For a basic introduction to SCI, see this essay at dolphinics.com. SHM stands for Unix-style shared memory segments. Where supported, SHM is used automatically to connect nodes running on the same host. This is experimental in MySQL 4.1, but we intend to enable it fully in MySQL 5.0. The Unix man page for shmop(2) is a good place to begin obtaining additional information about this topic. Note: The cluster transporter is internal to the cluster. Applications using MySQL Cluster communicate with SQL nodes just as they do with any other version of MySQL Server (via TCP/IP or Windows named pipes/Unix sockets). Queries can be sent and results retrieved using the standard APIs. NDB: Refers to the storage engine used to enable MySQL Cluster. The NDB storage engine supports all the usual MySQL column types and SQL statements, and is ACID-compliant. This engine also provides full support for transactions (commits and rollbacks). "NDB" stands for Network Database. Share-nothing architecture: The ideal architecture for a MySQL Cluster. In a true share-nothing setup, each node runs on a separate host. The advantage such an arrangement is that there no
831
single host or node can act as single point of failure or as a performance bottle neck for the system as a whole. In-memory storage: All data stored in each data node is kept in memory on the node's host computer. For each data node in the cluster, you must have available an amount of RAM equal to the size of the database times the number of replicas, divided by the number of data nodes. Thus, if the database takes up 1 gigabyte of memory, and you wish to set up the cluster with 4 replicas and 8 data nodes, a minimum of 500 MB memory will be required per node. Note that this is in addition to any requirements for the operating system and any applications running on the host. Table: As is usual in the context of a relational database, the term "table" denotes an ordered set of identically structured records. In MySQL Cluster, a database table is stored in a data node as a set of fragments, each of which is replicated on additional data nodes. The set of data nodes replicating the same fragment or set of fragments is referred to as a node group. Cluster programs: These are command-line programs used in running, configuring and administering MySQL Cluster. They include both server daemons: ndbd: The data node daemon (runs a data node process) ndb_mgmd: The management server daemon (runs a management server process) and client programs: ndb_mgm: The management client (provides an interface for executing management commands) ndb_waiter: Used to verify status of all nodes in a cluster ndb_restore: Restores cluster data from backup For more about these programs and their uses, see Section 16.5, Serveur de gestion du cluster MySQL . Event log: MySQL Cluster logs events by category (startup, shutdown, errors, checkpoints, etc.), priority, and severity. A complete listing of all reportable events may be found in Section 16.6.2, Rapport d'vnements gnrs par le cluster MySQL . Event logs are of two types: Cluster log: Keeps a record of all desired reportable events for the cluster as a whole. Node log: A separate log is also kept for each individual node. Under normal circumstances, it is necessary and sufficient to keep and examine only the cluster log. The node logs need be comsulted only for application development and debugging purposes.
832
MaxDB est une base de donne au niveau de l'entreprise. MaxDB est le nouveau nom d'un systme de gestion de bases de donnes, anciennement appel SAP DB.
833
manuellement. Les outils d'administration de base de donnes sont fournis la fois en version native Windows et en version navigateur web.
834
Si une telle quivalence existe, la signification avec MySQL peut tre identique ou diffrente par certains aspects. L'objectif principal est de montrer dans quelle mesure MaxDB diffre de MySQL; par consquent cette liste n'est pas complte. Pour la liste de mots rservs dans MySQL, consultez Section 9.6, Cas des mots rservs MySQL . Rserv par MaxDB @ ADDDATE() ADDTIME() ALPHA ARRAY ASCII() AUTOCOMMIT BOOLEAN Contexte d'utilisation dans quivalent MySQL MaxDB Peut tre prfixe un identifiant, comme ``@table'' fonction SQL fonction SQL fonction SQL Type de donne fonction SQL Transactions; ON par dfaut Non autoris ADDDATE(); nouveau en MySQL version 4.1.1 ADDTIME(); nouveau en MySQL version 4.1.1 Rien de comparable Non implment ASCII(), mais implment avec une signification diffrente Transactions; OFF par dfaut
types colonne; BOOLEAN BOOLEAN a t ajout en MySQL version 4.1.0; n'accepte comme valeur que c'est un synonyme de BOOL qui quivaut TRUE, FALSE, et NULL TINYINT(1). Il accepte les valeurs entires dans la mme plage que TINYINT ainsi que la valeur NULL. TRUE et FALSE peuvent tre utiliss comme alias de 1 et 0. CHECK TABLE type colonne fonction SQL Des validations implicites de transactions se produisent quand les requtes de dfinition de donnes sont publies fonction SQL fonction SQL SQL, langage de dfinition des donnes fonction SQL CHECK TABLE; similaire mais utilisation diffrente COLUMN; mot parasite CHAR(); syntaxe identique ; similaire, utilisation diffrente Des validations implicites de transactions se produisent quand les requtes de dfinition de donnes sont publies mais aussi avec d'autres commandes Rien de comparable COT(); syntaxe et implmentation identiques CREATE DATABASE(); DATABASE est utilis dans un contexte diffrent, par exemple CREATE DATABASE CURRENT_DATE DATEDIFF(); nouveau en MySQL version 4.1.1 rien de comparable DAYOFWEEK(); le premier jour (1) par dfaut est lundi avec MaxDB, et dimanche avec MySQL DISTINCT; mais utilis dans un contexte diffrent : SELECT DISTINCT DROP INDEX; similaire mais utilisation diffrente Rien de comparable Rien de comparable
fonction SQL fonction SQL fonction SQL fonction SQL fonctions SQL AVG, MAX, MIN, SUM alias de DROP INDEX fonction SQL fonction SQL
835
Optimisation fonction SQL fonction SQL fonction SQL fonction SQL USE INDEX, IGNORE INDEX et des optimisations similaires sont utilises juste aprs SELECT, comme SELECT ... USE INDEX fonction SQL fonction SQL fonction SQL Comparaisons
EXPLAIN; similaire mais utilisation diffrente rien de comparable Rien de comparable HEX(); similaire mais utilisation diffrente INSTR() ou LOCATE(); similaire mais syntaxe et signification diffrentes USE INDEX, IGNORE INDEX et des optimisations similaires sont utilises dans la clause FROM d'une requte SELECT, comme dans SELECT ... FROM ... USE INDEX Rien de comparable LENGTH(); syntaxe identique mais implmentation lgrement diffrente Rien de comparable LIKE; mais LIKE que MaxDB fournit se rapproche plutt du REGEX de MySQL
MaxDB supporte ``%'', MySQL supporte ``%'', et ``_'' comme caractres ``_'', ``contrle+soulign'', de remplacement dans une comparaison LIKE ``contrle+flche vers le haut'', ``*'', et ``?'' comme caractres de remplacement dans une comparaison LIKE fonction SQL fonction SQL fonction SQL fonction SQL fonction SQL fonction SQL fonction SQL types colonnes; comparaisons LPAD(); implmentation lgrement diffrente LTRIM(); implmentation lgrement diffrente MAKEDATE(); nouveau en MySQL version 4.1.1 MAKETIME(); nouveau en MySQL version 4.1.1 Rien de comparable MICROSECOND(); nouveau en MySQL version 4.1.1 Rien de comparable NULL; MaxDB supporte les valeurs spciales NULL qui sont renvoyes par des oprations arithmtiques lors de dpassement de capacit ou lors des divisions par zro; MySQL ne supporte pas de telles valeurs spciales PI(); syntaxe et implmentation identiques, mais les parenthses sont obligatoires Rien de comparable Rien de comparable Similaire la clause LIMIT RPAD(); implmentation lgrement diffrente RTRIM(); implmentation lgrement diffrente AUTO_INCREMENT; concept similaire mais implmentation diffrente Rien de comparable
fonction SQL type de donne fonction SQL Prdicat dans la clause WHERE fonction SQL fonction SQL CREATE SEQUENCE, DROP SEQUENCE fonction SQL
836
fonction SQL UPDATE STATISTICS fonction SQL fonction SQL langage de dfinition de donnes: CREATE [PUBLIC] SYNONYM, RENAME SYNONYM, DROP SYNONYM fonction SQL fonction SQL fonction SQL fonction SQL
SOUNDEX(); syntaxe lgrement diffrente ANALYZE; concept similaire, mais implmentation diffrente SUBSTRING(); implmentation lgrement diffrente SUBTIME(); nouveau en MySQL version 4.1.1 Rien de comparable
Rien de comparable CURRENT_TIME TIMEDIFF(); nouveau en MySQL version 4.1.1 TIMESTAMP(); nouveau en MySQL version 4.1.1 Rien de comparable
TIMESTAMP() fonction SQL comme argument de DAYOFMONTH() et DAYOFYEAR() TIMEZONE() TRANSACTION() TRANSLATE() TRIM() TRUNC() USE USER fonction SQL Renvoie l'identit de la transaction en cours fonction SQL fonction SQL fonction SQL mysql interface en ligne de commande fonction SQL
Rien de comparable Rien de comparable REPLACE(); syntaxe et implmentation identiques TRIM(); implmentation lgrement diffrente TRUNCATE(); syntaxe et implmentation lgrement diffrentes USE USER(); syntaxe identique, mais implmentation lgrement diffrente, et les parenthses sont obligatoires UTC_DATE(); fournit un moyen de calculer le rsultat de UTC_DIFF() COALESCE(); syntaxe et implmentation identiques Rien de comparable WEEKOFYEAR(); nouveau en MySQL version 4.1.1
fonction SQL fonction SQL, alias pour COALESCE() fonction SQL fonction SQL
837
838
839
Introduction GIS
840
Classe Geometry
LineString (instanciable) Line LinearRing Surface (non-instanciable) Polygon (instanciable) GeometryCollection (instanciable) MultiPoint (instanciable) MultiCurve (non-instanciable) MultiLineString (instanciable) MultiSurface (non-instanciable) MultiPolygon (instanciable) Certaines classes sont abstraites et non-instanciables. C'est dire, il n'est pas possible de crer un objet de cette classe. Les autres classes sont instanciables, et on peut en crer des objets. Chaque classe a des proprits, et les classes instanciables ont des assertions (des rgles qui dfinissent des instances valides). Geometry est la classe de base. C'est une classe abstraite. Les sous-classes instanciables de Geometry sont limites des objets de zro, une ou deux dimensions, qui existent dans un espace bidimensionnel. Toutes les classes gomtriques instanciables sont dfinies de faon ce que les instances valides d'une classe gomtrique soient topologiquement fermes (c'est dire que l'objet gomtrique inclut ses frontires). La classe Geometry a les sous-classes de Point, Curve, Surface et GeometryCollection : Point reprsente un objet sans dimension. Curve reprsente un objet une dimension, et a pour sous-classe LineString, avec les sousclasses Line et LinearRing. Surface reprsente les objets bidimensionnels, et a pour sous-classe Polygon. GeometryCollection dispose des classes de regroupement MultiPoint, MultiLineString et MultiPolygon, destines aux groupes d'objets de zro, une ou deux dimensions. Elle permet de modliser les groupes de points Points, de lignes LineStrings et de polygones Polygons, respectivement. MultiCurve et MultiSurface sont prsentes comme des super-classes abstraites, qui gnralisent les interfaces de regroupements, pour grer les courbes Curves et les surfaces Surfaces. Geometry, Curve, Surface, MultiCurve, et MultiSurface sont dfinies comme noninstanciables. Elles dfinissent un jeu de mthodes communes leurs sous-classes, et sont inclues ici pour des raisons d'extensibilit. Point, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString et MultiPolygon sont des classes instanciables.
841
Classe Point
proprits de la classe Geometry Un objet Geometry a les proprits suivantes : Son type. Chaque objet Geometry appartient une des classes instanciables de la hirarchie. Son SRID, ou identifiant de rfrence spatiale : Spatial Reference Identifier. Cette valeur spcifie le systme de rfrence spatial (Spatial Reference System), qui dcrit l'espace de coordonnes dans lequel l'objet est dfini. Ses coordonnes coordinates dans le systme de rfrence spatial, reprsentes par des nombres virgule flottante en double prcision (8 octets). Tous les objets non-vides contiennent au moins une paire de coordonnes (X,Y). Les formes gomtriques vides ne contiennent pas de coordonnes. Les coordonnes sont relatives au SRID. Par exemple, dans diffrents systmes de coordonnes, la distance entre deux objets peut varier mme si les objets ont les mmes coordonnes, car les distances planes et les distances gocentriques (systme de coordonnes la surface de la Terre) suivent deux gomtries diffrentes. Son intrieur interior, sa frontire boundary et son extrieur exterior. Toutes les formes gomtriques occupe une position dans l'espace. L'extrieur de la forme est l'espace qui n'est pas occup par la forme. L'intrieur de la gomtrie est l'espace occup par la gomtrie. La frontire est l'interface entre l'extrieur de la forme et son intrieur. Son MBR (Rectangle minimal d'enveloppe, Minimum Bounding Rectangle), appel aussi enveloppe. C'est la forme gomtrique la plus petite, forme par les coordonnes minimales et maximales (X,Y) :
((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
L'attribut simple ou non-simple. Les objets gomtriques de certains types, comme LineString, MultiPoint, MultiLineString sont simple ou non-simple. Chaque type dispose de ses propres assertions. L'attribut ferm (closed) ou non-ferm (not closed). Les objets gomtriques de certains types, comme LineString, MultiString sont ferms ou non-ferms. Chaque type dispose de ses propres assertions. L'attribut vide (empty) ou non-vide(not empty). Une forme est vide si elle ne contient aucun point. L'extrieur, l'intrieur et la frontire d'une forme vide ne sont pas dfinis (ils sont reprsents par la valeur NULL). Une forme vide est toujours simple, et a une surface de 0. Sa dimension. Une forme a une dimension de 1, 0, 1, ou 2 : 1 reprsente une forme vide. 0 reprsente les formes sans surface ni dimension. 1 reprsente les formes avec une dimension non nulle, mais sans surface. 2 reprsente les formes avec une dimension et une surface non-nulles. Les Point sont de dimension zro. Les lignes LineString sont de dimension un. Les polygones Polygon sont de dimension deux. Les dimensions des objets MultiPoint, MultiLineString et MultiPolygon sont les mmes que les dimensions des objets dont ils sont composs.
Classe Curve
Exemples de Point Imaginez une carte grande chelle, avec de nombreuses villes. Un point reprsentera une ville. Sur une carte de ville, un point peut reprsenter un arrt de bus. Proprit du Point Abscisse, ou coordonnes X. Ordonne, ou coordonne Y. Un point Point est dfini comme une forme avec zro dimension. Le rectangle d'encadrement d'un Point est un rectangle vide.
843
Classe Polygon
Les spcifications OpenGIS dfinissent un objet Surface comme une forme gomtrique simple si elle est d'un seul tenant, qui est associ avec un seul extrieur, et aucune frontire intrieure. La frontire d'un objet Surface est l'ensemble des courbes fermes qui correspondent ses frontires extrieures et intrieures.
844
Classe MultiCurve
Proprits de MultiPoint Un objet MultiPoint est un objet sans dimension. Un objet MultiPoint est simple si tous les points Point sont tous distincts (les paires de coordonnes sont toutes distinctes). La frontire d'un objet MultiPoint est vide.
845
Les frontires de deux objets Polygon qui sont lments d'un objet MultiPolygon ne peuvent que se toucher en un nombre fini de points, et non pas se recouvrir. Le recouvrement est dj interdit par l'assertion prcdente. Un objet MultiPolygon ne peut pas avoir de lignes coupes, d'extrusions ou de trous. Un objet MultiPolygon est un ensemble de point rgulier, et ferm. L'intrieur d'un objet MultiPolygon compos de plus d'un objet Polygon n'est pas connect. Le nombre de composants connects de l'intrieur d'un objet MultiPolygon est gal au nombre d'objets Polygon dans l'objet MultiPolygon. Proprits MultiPolygon Un objet MultiPolygon est dfini comme une forme gomtrique deux dimensions. La frontire d'un objet MultiPolygon est un ensemble de courbes fermes (des objets LineString) correspondants aux limites de ses objets Polygon composants. Chaque objet Curve de la frontire de l'objet MultiPolygon est dans la frontire d'un seul objet Polygon. Chaque objet Curve de la frontire d'un lment Polygon est dans la frontire de l'objet MultiPolygon.
Notez que les coordonnes du point n'ont pas de sparateur virgule. Une ligne LineString de quatre points :
LINESTRING(0 0, 10 10, 20 25, 50 60)
846
Une grammaire Backus-Naur qui spcifie les rgles de gnrations formelles pour crire des valeurs WKT est disponible dans les spcifications OGC, qui sont rfrences au dbut de ce chapitre.
Voici le dtail des composants : L'ordre des octets peut tre 0 ou 1, pour indiquer un stockage little-endian ou big-endian. Les ordres little-endian et big-endian sont aussi connus sous le nom de Network Data Representation (NDR) et External Data Representation (XDR), respectivement. Le type WKB est un code qui indique le type gomtrique. Les valeurs de 1 7 indiquent : Point, Ligne LineString, Polygone Polygon, Plusieurs points MultiPoint, Plusieurs lignes MultiLineString, Plusieurs polygones MultiPolygon, et Groupe gomtrique GeometryCollection. Une valeur Point a des coordonnes X et Y, reprsentes par un nombre virgule flottante, en double prcision. Les valeurs WKB des formes gomtriques plus complexes sont reprsentes par des structures biens plus complexes, comme prsent dans les spcifications OpenGIS.
847
GEOMETRY POINT LINESTRING POLYGON GEOMETRY est le type le plus gnral. Il peut stocker une forme gomtrique de n'importe quel type. Les autres types se restreignent a un type particulier de forme. Les autres types de donnes permettent de grer les groupes de formes gomtriques : MULTIPOINT MULTILINESTRING MULTIPOLYGON GEOMETRYCOLLECTION GEOMETRYCOLLECTION peut stocker un groupe quelconque de formes gomtriques. Les autres types se restreignent des formes gomtriques particulires.
MPointFromText(wkt[,srid]), MultiPointFromText(wkt[,srid])
848
GeomCollFromText(wkt[,srid]), GeometryCollectionFromText(wkt[,srid]) Construit un objet GEOMETRYCOLLECTION partir de sa reprsentation WKT et du SRID. Les spcifications OpenGIS dcrivent aussi des fonctions optionnelles pour construire des Polygon et MultiPolygon bases sur les reprsentations WKT d'une collection d'anneaux ou d'objets LineString ferms. Ces objets peuvent avoir des intersections non vides. MySQL ne supporte pas encore ces fonctions : BdPolyFromText(wkt,srid) Construit un objet Polygon partir de la reprsentation WKT d'un objet MultiLineString, contenant un ensemble d'objets LineString ferms. BdMPolyFromText(wkt,srid) Construit un objet MultiPolygon partir de la reprsentation WKT d'un objet MultiLineString, contenant un ensemble d'objets LineString ferms.
849
GeomCollFromWKB(wkb[,srid]), GeometryCollectionFromWKB(wkt[,srid]) Construit un objet GEOMETRYCOLLECTION partir de sa reprsentation WKB et du SRID. Les spcifications OpenGIS dcrivent aussi des fonctions optionnelles pour construire des Polygon et MultiPolygon bases sur les reprsentations WKB d'une collection d'anneaux ou d'objets LineString ferms. Ces objets peuvent avoir des intersections non vides. MySQL ne supporte pas encore ces fonctions : BdPolyFromWKB(wkb,srid) Construit un objet Polygon partir de la reprsentation WKB d'un objet MultiLineString, contenant un ensemble d'objets LineString ferms. BdMPolyFromWKB(wkb,srid) Construit un objet MultiPolygon partir de la reprsentation WKB d'un objet MultiLineString, contenant un ensemble d'objets LineString ferms.
MultiPoint(pt1,pt2,...) Construit un objet MultiPoint au format WKB, en utilisant les arguments Point WKB. Si aucun argument n'est au format WKBPoint, la valeur retourne est NULL.
850
LineString(pt1,pt2,...) Construit un objet LineString au format WKB, partir d'arguments Point WKB. Si aucun argument n'est au format WKBPoint, la valeur retourne est NULL. Si moins de deux arguments est fourni, la valeur retourne est NULL.
MultiLineString(ls1,ls2,...) Construit un objet MultiLineString au format WKB, en utilisant les objets LineString WBK. Si aucun argument n'est de classe LineString, la valeur retourne alors NULL.
Polygon(ls1,ls2,...) Construit un objet Polygon au format WKB, en utilisant les objets LineString WBK. Si aucun argument n'est de classe LinearRing, (c'est dire, un objet LineString ferm et simple), la valeur retourne alors NULL.
MultiPolygon(poly1,poly2,...) Construit un objet MultiPolygon au format WKB, en utilisant les objets Polygon WBK. Si aucun argument n'est de classe Polygon, la valeur retourne alors NULL.
GeometryCollection(g1,g2,...) Construit un objet GeometryCollection au format WKB. Si aucun argument n'est au format valide WBK, la valeur retourne alors NULL.
Utilisez la commande ALTER TABLE pour ajouter ou effacer une colonne gomtrique dans une table existante :
mysql> ALTER TABLE geom ADD pt POINT; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE geom DROP pt; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
851
Les valeurs doivent tre stockes dans un format gomtrique interne, mais vous pouvez les convertir ce format partir des formats Well-Known Text (WKT) et Well-Known Binary (WKB). Les exemples suivants vous montre comment insrer des valeurs gomtriques dans une table, en convertissant des valeurs WKT en un format gomtrique. Vous pouvez faire la conversion directement avec la commande INSERT :
INSERT INTO geom VALUES (GeomFromText('POINT(1 1)')); SET @g = 'POINT(1 1)'; INSERT INTO geom VALUES (GeomFromText(@g));
Les exemples suivants illustre l'insertion de donnes plus complexes dans la table :
SET @g = 'LINESTRING(0 0,1 1,2 2)'; INSERT INTO geom VALUES (GeomFromText(@g)); SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))'; INSERT INTO geom VALUES (GeomFromText(@g)); SET @g = 'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))'; INSERT INTO geom VALUES (GeomFromText(@g));
Les exemples prcdents utilisent tous la fonction GeomFromText() pour crer des valeurs gomtriques. Vous pouvez aussi utiliser des fonctions spcifiques chaque forme gomtrique :
SET @g = 'POINT(1 1)'; INSERT INTO geom VALUES (PointFromText(@g)); SET @g = 'LINESTRING(0 0,1 1,2 2)'; INSERT INTO geom VALUES (LineStringFromText(@g)); SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))'; INSERT INTO geom VALUES (PolygonFromText(@g)); SET @g = 'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))'; INSERT INTO geom VALUES (GeomCollFromText(@g));
Notez que si une application cliente veut utiliser des reprsentations WKB de valeur gomtrique, elle est responsable d'envoyer des requtes avec des valeurs WKB valides au serveur. Sinon, il y a de nombreux moyens de passer cette contrainte. Par exemple : Insertion d'un point POINT(1 1) avec sa valeur littrale hxadcimale :
mysql> INSERT INTO geom VALUES -> (GeomFromWKB(0x0101000000000000000000F03F000000000000F03F));
Une application ODBC veut envoyer une reprsentation WKB, en l'associant une variable de requte en utilisant un argument de type BLOB :
INSERT INTO geom VALUES (GeomFromWKB(?))
D'autres interfaces de programmation peuvent supporter des mcanismes similaires. Dans un programme C, vous pouvez protger les valeurs binaires en utilisant la fonction mysql_real_escape_string() et inclure le rsultat dans une chane de requte, qui sera envoye au serveur. See Section 24.2.3.47, mysql_real_escape_string() .
852
853
Convertit une chane au format WKB vers le format interne, et retourne le rsultat. Des fonctions adaptes au type sont supportes comme PointFromWKB() et LineFromWKB(); voyez Section 18.4.2.2, Crer des objets gomtriques avec les fonctions WKB .
AsText(g) Convertit une chane au format interne vers le format WKT, et retourne le rsultat.
mysql> SET @g = 'LineString(1 1,2 2,3 3)'; mysql> SELECT AsText(GeomFromText(@g)); +--------------------------+ | AsText(GeomFromText(@G)) | +--------------------------+ | LINESTRING(1 1,2 2,3 3) | +--------------------------+
AsBinary(g) Convertit une chane au format interne vers le format WKB, et retourne le rsultat.
Dimension(g) Retourne le nombre de dimensions de l'objet g. Le rsultat peut tre 1, 0, 1 ou 2. La signification de ces valeurs est expliqu dans la section Section 18.2.2, Classe Geometry .
mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)')); +------------------------------------------------+ | Dimension(GeomFromText('LineString(1 1,2 2)')) | +------------------------------------------------+ | 1 |
854
+------------------------------------------------+
Envelope(g) Retourne le rectangle enveloppe (Minimum Bounding Rectangle, ou MBR) de la forme g. Le rsultat est retourn sous forme de polygone.
mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))); +-------------------------------------------------------+ | AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) | +-------------------------------------------------------+ | POLYGON((1 1,2 1,2 2,1 2,1 1)) | +-------------------------------------------------------+
Les spcifications OpenGIS dfinissent les fonctions suivantes, que MySQL n'implmente pas : Boundary(g) Retourne une forme qui reprsente la frontire de g.
IsEmpty(g) Retourne 1 si la forme g est vide, et 0 si elle n'est pas vide. Elle retourne 1 si l'argument est NULL. Si la forme est vide, elle reprsente un ensemble de points vide.
IsSimple(g) Actuellement, cette fonction est un inutilisable et ne doit pas tre employe. Lorsqu'elle sera fonctionnelle, elle suivra la dfinition du prochain paragraphe. Retourne 1 si la forme gomtrique g n'au aucune anomalie gomtrique, telle que l'autointersection ou l'auto-tangence. IsSimple() retourne 0 si l'argument n'est pas simple, 1 si l'objet est NULL. La description de chaque classe gomtrique instanciable est donne plus tt dans ce chapitre, et inclut les conditions qui font qu'une forme est considre comme simple ou pas.
855
X(p) Retourne l'absisse du point p sous forme d'un nombre virgule en double prcision.
mysql> SELECT X(GeomFromText('Point(56.7 53.34)')); +--------------------------------------+ | X(GeomFromText('Point(56.7 53.34)')) | +--------------------------------------+ | 56.7 | +--------------------------------------+
Y(p) Retourne l'ordonne du point p sous forme d'un nombre virgule en double prcision.
mysql> SELECT Y(GeomFromText('Point(56.7 53.34)')); +--------------------------------------+ | Y(GeomFromText('Point(56.7 53.34)')) | +--------------------------------------+ | 53.34 | +--------------------------------------+
GLength(ls) Retourne la longueur de la ligne ls sous forme d'un nombre virgule et double prcision.
mysql> SELECT GLength(GeomFromText('LineString(1 1,2 2,3 3)')); +--------------------------------------------------+ | GLength(GeomFromText('LineString(1 1,2 2,3 3)')) | +--------------------------------------------------+ | 2.8284271247462 | +--------------------------------------------------+
IsClosed(ls) Retourne 1 si ls est ferme : c'est dire si StartPoint() et EndPoint() sont identiques. Retourne 0 si ls n'est pas ferme, et 1 si l'argument pass est NULL.
mysql> SELECT IsClosed(GeomFromText('LineString(1 1,2 2,3 3)')); +---------------------------------------------------+
856
PointN(ls,n) Retourne le n-ime point de la ligne ls. La numrotation des points commence 1.
mysql> SELECT AsText(PointN(GeomFromText('LineString(1 1,2 2,3 3)'),2)); +-----------------------------------------------------------+ | AsText(PointN(GeomFromText('LineString(1 1,2 2,3 3)'),2)) | +-----------------------------------------------------------+ | POINT(2 2) | +-----------------------------------------------------------+
Les spcifications OpenGIS dfinissent aussi les fonctions suivantes, que MySQL n'implmente pas encore : IsRing(ls) Retourne 1 si ls est un anneau : il faut que ls soit ferme (c'est dire que StartPoint() et EndPoint() sont identiques), et qu'elle soit simple (ne passe pas par le mme point plusieurs fois). Retourne 0 si ls n'est pas un anneau, et 1 si elle vaut NULL.
857
IsClosed(mls) Retourne 1 si mls est ferme (c'est dire que StartPoint() et EndPoint() sont identique pour chaque objet LineString de mls). Retourne 0 si mls n'est pas ferme et 1 si l'objet est NULL.
mysql> SELECT IsClosed(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))')); +--------------------------------------------------------------------+ | IsClosed(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))')) | +--------------------------------------------------------------------+ | 0 | +--------------------------------------------------------------------+
InteriorRingN(poly,n) Retourne le n-ime anneau intrieur de l'objet Polygon poly sous forme d'un objet LineString. Ring numbers begin at 1.
mysql> SET @poly = -> 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'; mysql> SELECT AsText(InteriorRingN(GeomFromText(@poly),1)); +----------------------------------------------+ | AsText(InteriorRingN(GeomFromText(@poly),1)) | +----------------------------------------------+ | LINESTRING(1 1,1 2,2 2,2 1,1 1) | +----------------------------------------------+
InteriorRingN(poly,n)
858
Les spcifications OpenGIS dfinissent aussi les fonctions suivantes, que MySQL n'implmente pas encore : Centroid(mpoly) Retourne le centre mathmatique de l'objet MultiPolygon mpoly, sous la forme d'un Point. Le rsultat n'est pas forcment dans l'objet MultiPolygon. PointOnSurface(mpoly) Retourne un point Point qui est dans l'objet MultiPolygon mpoly.
GeometryN(gc,n) Retourne le n-ime objet constituant l'objet GeometryCollection gc. La numrotation commence 1.
mysql> SELECT AsText(GeometryN(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))'),1) +------------------------------------------------------------------------------------------+ | AsText(GeometryN(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))'),1)) | +------------------------------------------------------------------------------------------+ | POINT(1 1) | +------------------------------------------------------------------------------------------+
859
18.5.3. Fonctions qui gnrent des formes gomtriques partir d'autres formes
18.5.3.1. Fonctions gomtriques qui gnrent de nouvelles formes
Dans la section Section 18.5.2, Fonction d'analyse des proprits des formes Geometry , nous avons dj discut de certaines fonctions qui gnrent de nouvelles formes partir de formes existantes : Envelope(g) StartPoint(ls) EndPoint(ls) PointN(ls,n) ExteriorRing(poly) InteriorRingN(poly,n) GeometryN(gc,n)
860
MBRDisjoint(g1,g2) Retourne 1 ou 0 pour indiquer les rectangles enveloppe de g1 et g2 sont disjoints (ils n'ont pas d'intersection).
MBREquals(g1,g2) Retourne 1 ou 0 pour indiquer le rectangle enveloppe de g1 est le mme que celui de g2.
MBRIntersects(g1,g2) Retourne 1 ou 0 pour indiquer le rectangle enveloppe de g1 et celui de g2 ont une intersection non vide.
MBROverlaps(g1,g2) Retourne 1 ou 0 pour indiquer le rectangle enveloppe de g1 recouvre une partie de celui de g2.
18.5.6. Fonctions qui testent les relations gomtriques entre les formes
Les spcifications OpenGIS dfinissent les fonctions suivantes, que MySQL n'implmente pas encore. Elles devraient apparatre prochainement, dans les prochaines versions. Lorsqu'elles seront
861
implmentes, elles fourniront le support complet des fonctions d'analyse spatiales, et non pas un simple support de la gomtrie des enveloppes. Ces fonctions oprent toujours sur deux formes gomtriques g1 et g2. Contains(g1,g2) Retourne 1 ou 0 suivant que g1 contient compltement g2 ou pas.
Crosses(g1,g2) Retourne 1 si g1 rencontre g2. Retourne NULL si g1 est un Polygon ou un MultiPolygon, ou si g2 est un Point ou un groupe MultiPoint. Otherwise, returns 0. ''rencontre'' indique une relation entre deux formes, ayant les proprits suivantes : Les deux formes ont une intersection non vide. Leur intersection est une forme gomtrique qui a une dimension de moins que le nombre maximum de dimensions des deux formes g1 et g2. L'intersection n'est pas gale g1 ou g2.
Equals(g1,g2) Retourne 1 ou 0 pour indiquer que g1 est gomtriquement gal g2, ou non.
Intersects(g1,g2) Retourne 1 ou 0, pour indiquer si g1 a une intersection non vide avec g2 ou pas.
Overlaps(g1,g2) Retourne 1 ou 0 pour indiquer sir g1 recouvre g2 ou pas. Le terme recouvre signifie que deux formes gomtriques ont une intersection de mme dimension que les formes initiales, mais diffrentes de ces formes.
Touches(g1,g2) Retourne 1 ou 0 pour indiquer si g1 touche g2 ou pas. Deux formes se touchent si leurs intrieurs ont une intersection vide, mais que l'une des deux frontires a une intersection non vide avec la frontire ou l'intrieur de l'autre.
862
Distance(g1,g2) Retourne la distance la plus faible entre deux points des deux formes, sous forme d'un nombre virgule et double prcision. Related(g1,g2,pattern_matrix) Retourne 1 ou 0, pour indiquer si la relation gomtrique spcifie par pattern_matrix existe entre les formes g1 et g2. Retourne 1 si les arguments sont NULL. Le paramtre pattern_matrix est une chane. Ses spcifications seront dtailles lorsque la fonction sera code.
Pour effacer un index gomtrique, utilisez ALTER TABLE ou DROP INDEX: Avec ALTER TABLE:
mysql> ALTER TABLE geom DROP INDEX g;
Exemple : supposons que la table geom contient plus de 32000 formes, qui sont stockes dans la colonne g, avec le type GEOMETRY. La table dispose aussi d'une colonne d'identifiant fid, de type AUTO_INCREMENT pour stocker des identifiants d'objet.
mysql> SHOW FIELDS FROM geom;
863
+-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | fid | int(11) | | PRI | NULL | auto_increment | | g | geometry | | | | | +-------+----------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) mysql> SELECT COUNT(*) FROM geom; +----------+ | count(*) | +----------+ | 32376 | +----------+ 1 row in set (0.00 sec)
mysql> SELECT fid,AsText(g) FROM geom WHERE mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g +-----+-----------------------------------------------------------------------------+ | fid | AsText(g) | +-----+-----------------------------------------------------------------------------+ | 21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30333.8 15828.8) | | 22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8,30334 15871.4) | | 23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4,30334 15914.2) | | 24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4,30273.4 15823) | | 25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882.4,30274.8 15866.2) | | 26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4,30275 15918.2) | | 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946.8,30320.4 15938.4) | | 1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136.4,30240 15127.2) | | 2 | LINESTRING(30220.2 15122.8,30217.2 15137.8,30207.6 15136,30210.4 15121) | | 3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,30169 15113) | | 4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30157 15111.6) | | 5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4,30194.2 15075.2) | | 6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,30244.6 15077) | | 7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8,30201.2 15049.4) | | 10 | LINESTRING(30179.6 15017.8,30181 15002.8,30190.8 15003.6,30189.6 15019) | | 11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2,30151.2 15009.8) | | 13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,30114.6 15067.8) | | 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30278 15134) | | 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30259 15083.4) | | 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4,30128.8 15001) | +-----+-----------------------------------------------------------------------------+ 20 rows in set (0.00 sec)
Maintenant, vrifions comment cette requte est excute, avec la commande EXPLAIN :
mysql> EXPLAIN SELECT fid,AsText(g) FROM geom WHERE mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000))'),g +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | geom | range | g | g | 32 | NULL | 50 | Using where | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 1 row in set (0.00 sec)
864
mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000)) +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | geom | ALL | NULL | NULL | NULL | NULL | 32376 | Using where | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 1 row in set (0.00 sec)
mysql> SELECT fid,AsText(g) FROM geom IGNORE INDEX (g) WHERE mysql> MBRContains(GeomFromText('Polygon((30000 15000,31000 15000,31000 16000,30000 16000,30000 15000)) +-----+-----------------------------------------------------------------------------+ | fid | AsText(g) | +-----+-----------------------------------------------------------------------------+ | 1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136.4,30240 15127.2) | | 2 | LINESTRING(30220.2 15122.8,30217.2 15137.8,30207.6 15136,30210.4 15121) | | 3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,30169 15113) | | 4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30157 15111.6) | | 5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4,30194.2 15075.2) | | 6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,30244.6 15077) | | 7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8,30201.2 15049.4) | | 10 | LINESTRING(30179.6 15017.8,30181 15002.8,30190.8 15003.6,30189.6 15019) | | 11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2,30151.2 15009.8) | | 13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,30114.6 15067.8) | | 21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30333.8 15828.8) | | 22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8,30334 15871.4) | | 23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4,30334 15914.2) | | 24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4,30273.4 15823) | | 25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882.4,30274.8 15866.2) | | 26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4,30275 15918.2) | | 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30278 15134) | | 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30259 15083.4) | | 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4,30128.8 15001) | | 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946.8,30320.4 15938.4) | +-----+-----------------------------------------------------------------------------+ 20 rows in set (0.46 sec)
Lorsque l'index n'est pas utilis, le temps d'excution de la requte passe de 0.00 seconde 0.46 second. Dans les prochaines versions, les index spatiaux seront aussi utiliss pour optimiser d'autres fonctions. See Section 18.5.4, Fonctions de tests des relations gomtriques entre les formes .
865
Les fonctions OpenGIS Length() sur les LineString et MultiLineString sont appeles GLength() en MySQL Le problme est que ce nom est en conflit avec la fonction SQL existante Length() qui calcule la taille d'une chane de caractres, et il n'est pas possible de faire la diffrence entre le contexte gographique ou textuel. Nous devons rsoudre ce problme, ou trouver un autre nom cette fonction.
866
Les procdures stockes et les fonctions sont de nouvelles fonctionnalits de MySQL version 5.0. Une procdure stockes est un jeu de commandes SQL qui rside sur le serveur. Une fois qu'elle sont enregistres, les clients n'ont pas besoin de soumettre chaque commande individuellement, mais peuvent les lancer d'un seul coup. Les procdures stockes fournissent un gain de performances, car moins d'informations sont changes entre le serveur et le client. En change, cela augmente la charge du serveur, car ce dernier doit raliser plus de travail. Souvent, il y a de nombreux clients, mais peut de serveurs. Les procdures stockes permettent aussi l'utilisation de bibliothques et de fonctions sur le serveur. Les langages de programmation modernes ont dj intgr ce type de concept, et l'utilisation de ces langages de programmation externes reste valable et utile, en dehors de la base de donnes. Quelques situations o les procdures stockes sont utiles : Lorsque plusieurs applications clientes sont crites dans diffrents langages sur diffrentes platesformes, et utilisent le serveur comme point d'interaction. Lorsque la scurit est prioritaire. Les banques, par exemple, utilisent les procdures stockes pour toutes les oprations standards. Cela conduit un environnement cohrent et scuris, car les procdures assurent que les oprations sont correctement fates et enregistres. Dans une telle configuration, les applications et les utilisateurs n'ont aucun accs direct aux tables, mais passent par des procdures stockes pre-dfinies. MySQL suit la syntaxe de la norme SQL:2003 pour les procdures stockes, qui est aussi utilise par IBM dans DB2. La compatibilit avec les autres langages de procdures stockes, comme PL/SQL ou T-SQL sera ajout ultrieurement. L'implmentation des procdures stockes de MySQL est en cours de dveloppement. Toutes les syntaxes dcrites dans ce chapitre sont supportes, et les limitations ou extensions sont documents lorsque c'est ncessaire. Les procdures stockes requirent la table proc dans la base mysql. Cette table est cre durant l'installation de MySQL 5.0. Si vous passez MySQL 5.0 depuis une ancienne version, assurez-vous de bien mettre jour vos tables de droits, et que la table proc existe. See Section 2.6.7, Mise jour des tables de droits .
867
868
characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | SQL SECURITY {DEFINER | INVOKER} | COMMENT string routine_body : Commande(s) SQL valide(s)
La clause RETURNS peut tre spcifie uniquement pour une FUNCTION. Elle sert indiquer le type de retour de la fonction, et le corps de la fonction doit contenir une instruction RETURN value. La liste de paramtre entre parenthses est obligatoire. S'il n'y a pas de paramtre, une liste vide sous la forme () doit tre utilise. Chaque paramtre est un paramtre de type IN par dfaut. Pour spcifier un autre type, utilisez les mots OUT ou INOUT avant le nom du paramtre. Spcifier IN, OUT ou INOUT n'est valable que pour une PROCEDURE. L'instruction CREATE FUNCTION est utilise dans les anciennes versions de MySQL pour crer des UDF (User Defined Functions, fonctions utilisateur). See Section 27.2, Ajouter des fonctions MySQL . Les UDF sont toujours supportes, mme avec la prsence des procdures stockes. Une UDF peut tre considre comme une fonction stocke. Cependant, notez que les UDF et les fonctions stockes partagent le mme espace de noms. Un framework pour dvelopper des procdures stockes externes sera prochainement prsent. Il permettra d'crire des procdures stockes dans d'autres langages que SQL. Il est probable que l'un des premiers langages supports sera PHP, car le moteur PHP est compact, compatible avec les threads et peut tre facilement intgr. Comme ce framework sera public, il est probable que bien d'autres langages soient supports. Une fonction est considre comme ``dterministe'' si elle retourne toujours le mme rsultat pour les mmes paramtres d'entre. Sinon, elle est considre comme ``non dterministe''. L'optimiseur peut utiliser cette proprit. Actuellement, l'attribut DETERMINISTIC est accept, mais il n'est pas encore utilis. L'attribut SQL SECURITY peut tre utilis pour spcifier si la routine doit tre excute avec les droits de l'utilisateur qui l'a cr ou avec ceux de celui qui appelle la fonction. La valeur par dfaut est DEFINER. Cette fonctionnalit est nouvelle en SQL:2003. MySQL n'utilise pas le droit GRANT EXECUTE. Pour le moment, si une procdure p1() utilise la table t1, l'appelant doit avoir les droits sur la table t1 afin que la procdure p1() puisse russir. MySQL stocke la configuration SQL_MODE en effet au moment de la cration de la procdure, et l'utilisera toujours lors de l'excution de la procdure. La clause COMMENT est une extension MySQL, et peut servir dcrire la procdure stocke. Cette information est affiche par les commandes SHOW CREATE PROCEDURE et SHOW CREATE FUNCTION. MySQL permet aux routines de contenir des commandes DDL, telle que CREATE et DROP, et des transactions SQL, comme COMMIT. Ce n'est pas obligatoire selon le standard et c'est donc une extension spcifique. Note : Actuellement, les fonctions stockes FUNCTIONs ne doivent pas contenir de rfrences aux tables. Notez que cela inclut aussi les commandes SET, mais pas les commandes SELECT. Cette limitation sera supprime aussitt que possible. L'exemple suivant est une procdure stocke simple, qui utilise un paramtre de sortie OUT. L'exemple utilise la commande delimiter du client mysql pour modifier le dlimiteur de commande avant de dfinir la procdure. Cela permet au dlimiteur ; d'tre utilis dans le corps de la procdure, plutt que d'tre interprt par le client mysql.
mysql> delimiter |
869
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END -> | Query OK, 0 rows affected (0.00 sec) mysql> CALL simpleproc(@a)| Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a| +------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec)
L'exemple suivant est une fonction qui prend un paramtre, effectue une opration avec une fonction SQL, et retourne le rsultat :
mysql> delimiter | mysql> CREATE FUNCTION bonjour (s CHAR(20)) RETURNS CHAR(50) -> RETURN CONCAT('Bonjour, ',s,'!'); -> | Query OK, 0 rows affected (0.00 sec) mysql> SELECT bonjour('le monde')| +---------------------+ | bonjour('le monde') | +---------------------+ | Bonjour, le monde! | +---------------------+ 1 row in set (0.00 sec)
Cette commande peut tre utilise pour renommer une procdure stocke ou une fonction, et pour en changer les caractristiques. Plusieurs modifications peut tre spcifies dans une commande ALTER PROCEDURE et ALTER FUNCTION.
Cette commande sert effacer une procdure stocke ou une fonction. C'est dire que la routine spcifie est supprime du serveur. La clause IF EXISTS est une extension de MySQL. Elle permet d'viter une erreur si la routine n'existe pas. Une alerte est alors produite, et peut tre lue avec SHOW WARNINGS.
Cette commande est une extension MySQL. Similaire SHOW CREATE TABLE, elle retourne la chane exacte qui permet de recrer la procdure.
mysql> SHOW CREATE FUNCTION test.hello\G
870
*************************** 1. row *************************** Function: hello sql_mode: Create Function: CREATE FUNCTION `test`.`hello`(s CHAR(20)) RETURNS CHAR(50) RETURN CONCAT('Hello, ',s,'!')
Cette commande est une extension MySQL. Elle retourne les caractristiques de la routine, comme son nom, type, crateur, ainsi que les dates de cration et de modification. Si le paramtre pattern n'est pas fourni, les informations sur toutes les procdures stockes ou fonctions sont listes, en fonction de la commande exacte que vous utilisez.
mysql> SHOW FUNCTION STATUS LIKE 'hello'\G *************************** 1. row *************************** Db: test Name: hello Type: FUNCTION Definer: testuser@localhost Modified: 2004-08-03 15:29:37 Created: 2004-08-03 15:29:37 Security_type: DEFINER Comment:
Vous pouvez aussi vous reporter aux informations sur les procdures stockes dans la table ROUTINES, de la base INFORMATION_SCHEMA. See Section 22.1.14, La table INFORMATION_SCHEMA ROUTINES .
19.2.6. CALL
CALL sp_name([parameter[,...]])
La commande CALL sert appeler une routine qui a t dfinie prcdemment avec CREATE PROCEDURE.
Les routines peuvent contenir des commandes multiples, en utilisant le bloc de commande BEGIN ... END. begin_label et end_label doivent tre identiques, s'ils sont spcifis. Notez bien que la clause optionnelle [NOT] ATOMIC n'est pas encore supporte. Cela signifie qu'il n'y a pas de dbut de transaction au dbut du bloc, et que la clause BEGIN sera utilis sans affect la transaction courante. Les commandes multiples requirent un client capable d'envoyer des requtes contenant le caractre ;. C'est gr dans le client en ligne de commande mysql, avec la commande delimiter. En changeant le caractre de fin de requte ; pour le remplacer par | permet ; d'tre utilis dans le corps de la routine.
871
DECLARE ne peut tre utilis dans un bloc BEGIN ... END, et doit intervenir au dbut de la routine, avant tout autre commande.
Cette commande sert dclarer des variables locales. Le scope des variables est le bloc BEGIN ... END.
La commande SET des procdures stockes est une version tendue de la commande SET classique. Les variables rfrences peuvent tre dclares dans le contexte de la routine ou comme variables globales. La commande SET des procdures stockes est implmente comme une sous-partie de la syntaxe SET. Cela permet la syntaxe tendue SET a=x, b=y, ..., o plusieurs types de variables (locales, serveur, globale ou session) sont mlanges. Cela permet aussi la combinaison de variables locales et d'option systme qui n'ont de sens qu'au niveau global du serveur : dans ce cas, les options sont acceptes mais ignores.
Cette syntaxe de SELECT stocke les colonnes slectionnes dans des variables. Par consquent, une seule ligne doit tre lue. Cette commande est aussi extrmement utile lorsqu'elle est utilise avec des curseurs.
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
Cette commande spcifie les conditions qui demandent une gestion spcifique. Elle associe un nom avec une erreur spcifique. Ce nom peut tre utilis ultrieurement dans une commande DECLARE HANDLER. See Section 19.2.10.2, DECLARE un gestionnaire . En plus des valeurs SQLSTATE, les codes d'erreur MySQL sont aussi supports.
872
Curseurs
| EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
Cette commande spcifie les gestionnaires qui vont traiter une ou plusieurs conditions. Si une de ces conditions survient, le gestionnaire associ est appel. Pour un gestionnaire CONTINUE, l'excution de la routine courante continue aprs l'excution du gestionnaire. Pour un gestionnaire EXIT, l'excution de la routine est termine. Le gestionnaire UNDO n'est pas encore support. Actuellement, UNDO se comporte comme CONTINUE. SQLWARNING est un raccourci pour toutes les codes SQLSTATE qui commencent par 01. NOT FOUND est un raccourci pour toutes les codes SQLSTATE qui commencent par 02. EXCEPTION est un raccourci pour toutes les codes SQLSTATE qui ne sont pas reprsent par SQLWARNING ou NOT FOUND. En plus des valeurs SQLSTATE, les codes d'erreur MySQL sont aussi supports. Par exemple :
mysql> CREATE TABLE test.t (s1 int,primary key (s1)); Query OK, 0 rows affected (0.00 sec) mysql> delimiter | mysql> CREATE PROCEDURE handlerdemo () -> BEGIN -> DECLARE CONTINUE HANDLER FOR '23000' SET @x2 = 1; -> set @x = 1; -> INSERT INTO test.t VALUES (1); -> set @x = 2; -> INSERT INTO test.t VALUES (1); -> SET @x = 3; -> END; -> | Query OK, 0 rows affected (0.00 sec) mysql> CALL handlerdemo()| Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x| +------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec)
Notez que @x vaut 3, ce qui signifie que MySQL a excut la procdure jusqu' la fin. Si la ligne DECLARE CONTINUE HANDLER FOR '23000' SET @x2 = 1; tait absente, MySQL aurait pris le chemin par dfaut (EXIT) aprs l'chec du second INSERT, d la contrainte de PRIMARY KEY, et SELECT @x aurait retourn 2.
19.2.11. Curseurs
Des curseurs simples sont supports dans les routines. La syntaxe est la mme que dans le SQL intgr. Les curseurs sont actuellement assensible, sans scroll et en lecture seule. Les curseurs assensibles signifie que le curseur peut ou pas faire une copie de la table de rsultat.
873
Instructions de contrle
Par exemple :
CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT 0; DECLARE a CHAR(16); DECLARE b,c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cur1; OPEN cur2; REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; UNTIL done END REPEAT; CLOSE cur1; CLOSE cur2; END
Plusieurs curseurs peuvent tre dfinit dans une routine, mais chacun doit avoir un nom distinct.
Cette commande lit la prochaine ligne (si elle existe), en utilisant un curseur ouvert, et avance le pointeur de curseur.
19.2.12.1. Commande IF
IF search_condition THEN statement(s)
874
Instructions de contrle
IF implmente une instruction de condition simple. Si search_condition est vrai, la commande SQL correspondante est excute. Si search_condition est faux, la commande dans la clause ELSE est excute. Notez aussi qu'il y a une fonction IF(). See Section 12.2, Les fonctions de contrle .
ou :
CASE WHEN search_condition THEN statement [WHEN search_condition THEN statement ...] [ELSE statement] END CASE
CASE implmente une structure conditionnelle complexe. Si un des conditions search_condition est vraie, la commande SQL correspondante est excute. Si aucune condition n'est vrifie, la commande SQL de la clause ELSE est excut. Note : la syntaxe de la commande CASE l'intrieure d'une procdure stocke diffre lgrement de l'expression SQL CASE. La commande CASE ne peut pas avoir de clause ELSE NULL, et l'instruction se termine avec END CASE au lieu de END. See Section 12.2, Les fonctions de contrle .
LOOP implmente une boucle, permettant l'excution rpte d'un groupe de commande. Les commandes l'intrieure de la boucle sont excute jusqu' ce que la boucle se termine, gnralement lorsqu'elle atteint la commande LEAVE. begin_label et end_label doivent tre identiques, si les deux sont spcifis.
ITERATE ne peut tre utilise qu' l'intrieur d'une boucle LOOP, REPEAT ou WHILE. ITERATE signifie ``excute encore une fois la boucle.'' Par exemple :
CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP
875
Instructions de contrle
SET p1 = p1 + 1; IF p1 < 10 THEN ITERATE label1; END IF; LEAVE label1; END LOOP label1; SET @x = p1; END
Les commandese l'intrieur d'une commande REPEAT sont rptes jusqu' ce que la condition search_condition soit vraie. begin_label et end_label doivent tre identiques, s'ils sont fournis. Par exemple :
mysql> delimiter | mysql> CREATE PROCEDURE dorepeat(p1 INT) -> BEGIN -> SET @x = 0; -> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; -> END -> | Query OK, 0 rows affected (0.00 sec) mysql> CALL dorepeat(1000)| Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x| +------+ | @x | +------+ | 1001 | +------+ 1 row in set (0.00 sec)
Les commandes dans l'instruction WHILE sont rptes tant que la condition search_condition est vraie. begin_label et end_label doivent tre identiques, s'ils sont spcifis. Par exemple :
CREATE PROCEDURE dowhile() BEGIN DECLARE v1 INT DEFAULT 5; WHILE v1 > 0 DO ... SET v1 = v1 - 1; END WHILE; END
876
Ce chapitre dcrit la syntaxe pour crer et dtruire des dclencheurs, et quelques exemples pour les utiliser.
Un dclencheur est un objet de base de donnes associ une table, qui s'active lorsqu'un vnement particulier survient. Le dclencheur est associ la table appele tbl_name. tbl_name doit faire rfrence une table permanente. Vous ne pouvez pas associer un dclencheur avec une table TEMPORARY ou une vue. trigger_time est le moment d'action du dclencheur. Il peut tre BEFORE (avant) ou AFTER (aprs), pour indiquer que le dlencheur s'active avant ou aprs la commande qui le dclenche. trigger_event indique le type de commande qui active le dclencheur. Il peut valoir INSERT, UPDATE ou DELETE. Par exemple, un dclencheur BEFORE pour une commande INSERT peut tre utilis pour vrifier les valeurs avant leur insertion dans la table. Il ne peut pas y avoir deux dclencheurs pour une mme table avec les mmes configurations de moment et de commande. Par exemple, vous ne pouvez pas avor deux dclencheurs BEFORE UPDATE pour la mme table. Mais vous pouvez avoir un dclencheur BEFORE UPDATE et un dclencheur BEFORE INSERT, ou un dclencheur BEFORE UPDATE et un dclencheur AFTER UPDATE. trigger_stmt est la commande a excuter lorsque le dclencheur s'active. Si vous voulez utiliser plusieurs commandes, utilisez les agrgateurs BEGIN ... END. Cela vous permet aussi d'utiliser les mmes codes que ceux utiliss dans des procdures stockes. See Section 19.2.7, La commande compose BEGIN ... END . Note : actuellement, les dclencheurs ont les mmes limitations que les procdures stockes : ils ne peuvent pas contenir de rfrences directes aux tables via leur nom. Cette limitation sera leve ds que possible. Cependant, dans la commande d'activation d'un dclencheur, vous pouvez faire rfrence aux colonnes dan la table associe au dclencheur en utilisant les mots OLD et NEW. OLD.col_name faire rfrence une colonne d'une ligne existante avant sa modification ou son effacement. NEW.col_name faire rfrence une colonne d'une ligne aprs insertion ou modification.
877
L'utilisation de SET NEW.col_name = value requiert le droit de UPDATE sur la colonne. L'utilisation de SET value = NEW.col_name requiert le droit de SELECT sur la colonne. La commande CREATE TRIGGER requiert le droit de SUPER. Elle a t ajoute en MySQL 5.0.2.
Supprime un dclencheur. Le nom du dclencheur doit inclure le nom de la table, car chaque dclencheur est associ une table particulire. La commande DROP TRIGGER requiert le droit de SUPER. Il a t ajout en MySQL 5.0.2.
La commande CREATE TRIGGER cre un dclencheur appel ins_sum qui est associ avec la table account. Il inclut aussi des clauses pour spcifier le moment d'activation, l'vnement et l'action du dclencheur : Le mot rserv BEFORE (avant, en anglais) indique le moment d'activation. Dans ce cas, le dclencheur sera activ avant l'insertion des lignes dans la table. L'autre mot rserv est AFTER (Aprs, en anglais). Le mot rserv INSERT indique l'vnement qui active le dclencheur. Dans l'exemple, le dclencheur s'active lors des commandes INSERT. Vous pouvez crer des dclencheur pour les commandes DELETE et UPDATE. La commande qui suit le mot cl FOR EACH ROW dfinit la commande excuter chaque fois que le dclencheur s'active, ce qui arrive ds qu'une ligne est insre. Dans l'exemple, la commande du dclencheur est un simple SET qui accumule la somme des valeurs insres dans les colonnes amount. La commande utiliser la valeur de la colonne avec la syntaxe NEW.amount (en anglais, nouvelle.montant) ce qui signifie ``la valeur de la colonne amount qui va tre insre''.
878
Pour utiliser le dclencheur, initialis l'accumulateur zro, puis excutez une commande INSERT et voyez la valeur finale de l'accumulateur :
mysql> SET @sum = 0; mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00); mysql> SELECT @sum AS 'Total amount inserted'; +-----------------------+ | Total amount inserted | +-----------------------+ | 1852.48 | +-----------------------+
Dans ce cas, la valeur de @sum aprs la commande INSERT est 14.98 + 1937.50 - 100 soit 1852.48. Pour dtruire un dclencheur, utilisez la commande DROP TRIGGER. Le nom du dclencheur doit inclure le nom de la table :
mysql> DROP TRIGGER account.ins_sum;
Comme le dclencheur est associ avec une table, vous ne pouvez pas avoir plusieurs dclencheurs sur une mme table qui portent le mme nom. Soyez aussi conscients que l'espace de noms des dclencheurs risque de changer l'avenir. C'est dire que l'unicit des noms de dclencheurs par table risque d'tre tendu l'unicit de dclencheurs au niveau du serveur. Pour faciliter la compatibilit ascendante, essayez d'utiliser des noms de dclencheurs qui soient uniques dans toute la base. En plus du fait que les noms de dclencheurs doivent tre uniques pour une table, il y a d'autres limitations sur le type de dclencheurs que vous pouvez mettre en place. En particulier, vous ne pouvez pas avoir deux dclencheurs qui ont le mme moment d'activation et le mme vnement d'activation. Par exemple, vous ne pouvez pas dfinir deux dclencheurs BEFORE INSERT et deux dclencheurs AFTER UPDATE pour la mme table. Ce n'est probablement pas une limitation importate, car il est possible de dfinir un dclencheur qui excute plusieurs commandes en utilisant une commande complexe, encadre par les mots BEGIN END, aprs le mot cl FOR EACH ROW. Un exemple vous est prsent ultrieurement dans cette section. Il y a aussi des limitations dans ce qui peut apparatre dans la commande que le dclencheur peut xecuter lorsqu'il est activ : Le dclencheur ne peut pas faire rfrence directe aux tables par leur nom, y compris la table laquelle il est associ. Par contre, vous pouvez utiliser les mots cls OLD (ancien en anglais) et NEW (nouveau en anglais). OLD fait rfrence la ligne existante avant la modification ou l'effacement. NEW faire rfrence la nouvelle ligne insre ou la ligne modifie. Le dclencheur ne peut pas excuter de procdures avec la commande CALL. Cela signifie que vous ne pouvez pas contourner le problmes des noms de tables en appelant une procdure stocke qui utilise les noms de tables. Le dclencheur ne peut pas utiliser de commande qui ouvre ou ferme une transaction avec START TRANSACTION, COMMIT ou ROLLBACK. Les mots cl OLD et NEW vous permette d'accder aux colonnes dans les lignes affectes par le dclencheur. OLD et NEW ne sont pas sensibles la casse. Dans un dclencheur INSERT, seul NEW.col_name peut tre utilise : il n'y a pas d'ancienne ligne. Dans un dclencheur DELETE, seul la valeur OLD.col_name peut tre utilise : il n'y a pas de nouvelle ligne. Dans un dclencheur UPDATE, vous pouvez utiliser OLD.col_name pour faire rfrence aux colonnes dans leur tat avant la modification, et NEW.col_name pour faire rfrence la valeur aprs la modification. Une colonne identifie par OLD est en lecture seule. Vous pouvez lire sa valeur mais vous ne pouvez pas la modifier. Une colonne identifie avec la valeur NEW peut tre lue si vous avez les droits de SELECT dessus. Dans un dclencheur BEFORE, vous pouvez aussi changer la valeur avec la commande SET NEW.col_name = value si vous avez les droits de UPDATE. Cela signifie que
879
vous pouvez utiliser un dclencheur pour modifier les valeurs insres dans une nouvelle ligne ou les valeurs modifies. Dans un dclencheur BEFORE, la valeur NEW d'une colonne AUTO_INCREMENT vaut 0, et non pas le nombre squentiel automatiquement gnr car ce nombre sera gnr lorsque la ligne sera rellement insre. OLD et NEW sont des extensions de MySQL aux dclencheurs. En utilisant la syntaxe BEGIN END, vous pouvez dfinir un dclencheur qui excute plusieurs commandes. l'intrieur d'un bloc BEGIN, vous pouvez aussi utiliser les autres syntaxes autorises dans les routines stockes, telles que les conditions et les boucles. Cependant, tout comme pour les procdures stockes, lorsque vous dfinissez un dclencheur qui s'exctue sur plusieurs commandes, il est ncessaire de redfinir le dlimiteur de commande si vous saisissez le dclencheur l'aide d'un utilisatier en ligne de commande tel que mysql pour que vous puissiez utiliser le caractre ; l'intrieur de la dfinition. L'exemple ci-dessous illustre ces points. Il dfinit un dclencheur UPDATE qui vrifie la valeur d'une ligne avant sa modification, et s'arrange pour que les valeurs soient dans l'intervalle de 0 100. Cela doit tre fait avant (BEFORE) la modification, pour que la valeur soit vrifi avant d'tre utilise :
mysql> mysql> -> -> -> -> -> -> -> -> mysql> delimiter // CREATE TRIGGER upd_check BEFORE UPDATE ON account FOR EACH ROW BEGIN IF NEW.amount < 0 THEN SET NEW.amount = 0; ELSEIF NEW.amount > 100 THEN SET NEW.amount = 100; END IF; END// delimiter ;
Il vous viendra surement l'esprit qu'il serait plus facile de dfinir une procdure stocke sparment, pour l'invoquer depuis le dclencheur grce un simple appel CALL. Cela serait surement avantageux si vous voulez appeler la mme routine depuis plusieurs dclencheurs. Cependant, les dclencheurs ne peuvent pas utiliser la commande CALL. Vous devez absolument rcrire les commandes composes de chaque commande CREATE TRIGGER que vous voulez utiliser.
880
Les vues (y compris les vues modifiables) sont implmentes en version 5 de MySQL. Les vues sont disponibles dans les versions binaires depuis la version 5.0.1 et plus rcent. Ce chpatire prsente les sujets suivants : Cration ou modification de vues avec les commandes CREATE VIEW ou ALTER VIEW Destruction de vues avec DROP VIEW Affichage des mta-donnes de vues avec SHOW CREATE VIEW Pour utiliser les vues, lorsque vous tes passs en version 5.0.1 depuis une ancienne version, il faut mettre aussi jour la table de droits, car elles contiennent des informations destines aux vues. See Section 2.6.7, Mise jour des tables de droits .
Cette commande modifie la dfinition d'une vue. select_statement est le mme que pour CREATE VIEW. See Section 21.2, Syntaxe de CREATE VIEW . Cette commande a t ajoute en MySQL 5.0.1.
881
+------+-------+-------+
Par dfaut, la vue est place dans la base de donnes par dfaut. Pour crer une vue explicitement dans une base de donnes, spcifiez le nom de la base de donnes lors de la cration : db_name.view_name.
mysql> CREATE VIEW test.v AS SELECT * FROM t;
DROP VIEW supprime une ou plusieurs vues. Vous devez avoir les droits de DROP pour chaque vue. Vous pouvez utiliser le mot cl IF EXISTS pour viter l'affichage d'un message d'alerte lorsque les vues n'existent pas. Lorsque cette clause est utilise, une NOTE est gnre pour chaque vue inexistante. See Section 13.5.3.19, SHOW WARNINGS | ERRORS . RESTRICT et CASCADE, si utiliss, sont analyss mais ignors. Cette commande a t ajoute en MySQL 5.0.1.
Cette commande montre la commande CREATE VIEW qui crera la vue spcifie.
mysql> SHOW CREATE VIEW v; +-------+----------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------+ | v | CREATE VIEW `test`.`v` AS select 1 AS `a`,2 AS `b` | +-------+----------------------------------------------------+
882
Le support de la base INFORMATION_SCHEMA est disponible en MySQL 5.0.2 et plus rcent. Il fournit un accs aux mtadonnes sur les bases de donnes. Les ``mtadonnes'' sont des informations sur les donnes, telles que le nom des bases de donnes, des tables, le type de donnes des colonnes ou les droits d'accs. On appelle aussi ces donnes le ``dictionnaire de donnes'' ou le ``catalogue systme''. Voici un exemple :
mysql> SELECT table_name, table_type, engine -> FROM information_schema.tables -> WHERE table_schema = 'db5' -> ORDER BY table_name DESC; +------------+------------+--------+ | table_name | table_type | engine | +------------+------------+--------+ | v56 | VIEW | NULL | | v3 | VIEW | NULL | | v2 | VIEW | NULL | | v | VIEW | NULL | | tables | BASE TABLE | MyISAM | | t7 | BASE TABLE | MyISAM | | t3 | BASE TABLE | MyISAM | | t2 | BASE TABLE | MyISAM | | t | BASE TABLE | MyISAM | | pk | BASE TABLE | InnoDB | | loop | BASE TABLE | MyISAM | | kurs | BASE TABLE | MyISAM | | k | BASE TABLE | MyISAM | | into | BASE TABLE | MyISAM | | goto | BASE TABLE | MyISAM | | fk2 | BASE TABLE | InnoDB | | fk | BASE TABLE | InnoDB | +------------+------------+--------+ 17 rows in set (0.01 sec)
883
Expliquation : la commande requiert la liste de toutes les tables de la base de donnes db5, en ordre anti-alphabtique, avec trois informations : le nom de la table, son type et le moteur de table. INFORMATION_SCHEMA est la ``base de donnes d'informations'', la base qui stocke les informations propos des autres bases que le serveur MySQL entretient. Dans INFORMATION_SCHEMA, il existe plusieurs tables en lecture seule. Ce sont en fait des vues, et non pas des tables, ce qui fait que vous ne verrez pas de fichiers associs. Chaque utilisateur MySQL a le droit d'accder ces tables, mais seules les lignes concernant des objets pour lesquels il a des droits seront visibles. Avantages de SELECT La commande SELECT ... FROM INFORMATION_SCHEMA a pour but d'tre une mthode cohrente d'accder aux informations fournies par les diffrentes commandes SHOW que MySQL supporte (SHOW DATABASES, SHOW TABLES, etc). En utilisant SELECT, vous avez plusieurs avantages compars SHOW : Il est conforme aux rgles de Codd. C'est dire que tous les accs sont fait sur des tables. Personne n'a besoin d'apprendre une nouvelle syntaxe. Comme tout le monde connait dj les commandes SELECT, il suffit d'apprendre les noms des objets. L'implmenteeur n'a pas besoin d'ajouter de nouveaux mots-cl. Il y a des millions de formats de rsultats possibles, au lieu d'un seul. Cela apporte de la flexibilit aux applications qui ont des spcifications variables sur les mtadonnes qu'elles recherchent. La migration est plus facile, car toutes les autres bases de donnes fonctionnent sur ce schma. Cependant, comme SHOW est une commande populaire auprs des employs et utilisateurs de MySQL, et que cela mettrait la pagaille si cette dernire venait disparatre, les avantages de cette convention ne sont pas suffisants pour supprimer SHOW. En fait, il y a des amliorations la commande SHOW en MySQL 5.0. Ils sont prsents dans la section Section 22.2, Extensions la commande SHOW . Standards L'implmentation des structures des tables de la base INFORMATION_SCHEMA suivent le standard ANSI/ISO SQL:2003 standard Part 11 ``Schemata''. Notre intention est d'atteindre une compatibilit partielle avec SQL:2003 core feature F021 ``Basic information schema''. Les utilisateurs de SQL Server 2000 (qui suit aussi ce standard) noteront une similarit importante. Cependant, MySQL a omis certaines colonnes qui ne sont pas pertinente dans notre implmentation, et a ajout des colonnes qui lui sont spcifique. Par exemple, la colonne de moteur de stockage pour les tables dans la table INFORMATION_SCHEMA.TABLES. Mme si les autres serveurs de base de donnes utilisent diffrents noms, comme syscat ou system, le nom standard est INFORMATION_SCHEMA. En effet, nous avons une nouvelle ``base de donnes'' appele information_schema, mme s'il n'y a pas besoin de faire un fichier qui porte ce nom. Il est possible de slectionner la base INFORMATION_SCHEMA comme base par dfaut avec la commande USE, mais la seule solution pour accder au contenu de ces tables est la commande SELECT. Vous ne pouvez pas insrer de donnes ou modifier le contenu des tables. Droits Il n'y pas de diffrence entre les prrequis de droits actuels pour la commande SHOW et les commandes SELECT. Dans chaque cas, vous avez les mmes droits sur un objet, et vous en aurez besoin pour accder aux informations le concernant.
884
SHOW name -
885
Remarques NULL
omis omis omis omis omis omis Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL
886
887
IDENTITY_MAXIMUM IDENTITY_MINIMUM IDENTITY_CYCLE IS_GENERATED GENERATION_EXPRESSION COLUMN_KEY EXTRA COLUMN_COMMENT Notes : Key Extra Comment
omis omis omis omis omis extension MySQL extension MySQL extension MySQL
Dans SHOW, la colonne Type inclut les valeurs de diffrentes colonnes COLUMNS. ORDINAL_POSITION est obligatoire, car il faudra peut-tre un jour indiquer ORDER BY ORDINAL_POSITION. Contrairement SHOW, SELECT n'a pas de classement par dfaut. CHARACTER_OCTET_LENGTH doit tre le mme que CHARACTER_MAXIMUM_LENGTH, sauf pour les jeux de caractres multi-octets. CHARACTER_SET_NAME peut tre driv de Collation. Par exemple, si vous indiquez SHOW FULL COLUMNS FROM t, et que vous pouvez voir dans la colonne Collation la valeur latin1_swedish_ci, alors le jeu de caractres est la partie place avant le premier caractre soulign : latin1. Les commandes suivantes sont presque quivalentes :
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tbl_name' [AND table_schema = 'db_name'] [AND column_name LIKE 'wild'] SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
888
FILTER_CONDITION SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT Notes : Sub_part Packed Null Index_type Comment
omis extension MySQL extension MySQL extension MySQL extension MySQL extension MySQL
Il n'y a pas de table standard pour les index. La liste prcdente est similaire au rsultat que retourn SQL Server 2000 pour sp_statistics, mais nous avons remplac le nom QUALIFIER par CATALOG et nous avons remplacl le nom OWNER par SCHEMA. En fait, la table prcdente est le rsultat de SHOW INDEX sont drivs du mme parent. La correlation est trs bonne. Les commandes suivantes sont quivalentes :
SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name = 'tbl_name' [AND schema_name = 'db_name' SHOW INDEX FROM tbl_name [FROM db_name]
889
Ceci est une table non-standard. Elle prend ses valeurs dans la table mysql.db.
Nom SHOW
omit
PRIVILEGE_TYPE peut contenir l'une des valeurs suivantes : SELECT, INSERT, UPDATE, REFERENCES, ALTER, INDEX, DROP et CREATE VIEW.
890
Nom SHOW
Charset omis omis omis omis omis Default collation Description Maxlen Extension MySQL Extension MySQL
891
Nous avons ajout 5 colonnes non standard qui correspondent au Charset, Id, Default, Compiled et Sortlen dans le rsultat de SHOW COLLATION. Les commandes suivantes sont quivalentes :
SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATIONS [WHERE collation_name LIKE 'wild'] SHOW COLLATION [LIKE 'wild']
892
La colonne CONSTRAINT_TYPE peut contenir l'une de ces valeurs : UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK. C'est une colonne de type CHAR et non pas ENUM. La valeur de CHECK n'est pas valable jusqu' ce que nous supportions CHECK.
Nom SHOW
Remarques NULL
Pour ces deux tables, la table KEY_COLUMN_USAGE a deux lignes : Une ligne avec CONSTRAINT_NAME='PRIMARY', TABLE_NAME='t1', COLUMN_NAME='s3', ORDINAL_POSITION=1, POSITION_IN_UNIQUE_CONSTRAINT=NULL. Une ligne avec CONSTRAINT_NAME='CO', TABLE_NAME='t3', COLUMN_NAME='s2', ORDINAL_POSITION=1, POSITION_IN_UNIQUE_CONSTRAINT=1.
La table ROUTINES fournit des informations sur les procdures stockes (sur les procdures et les fonctions). La table ROUTINES n'inclut pas les fonctions utilisateurs (dites UDF) actuellement. La colonne appele ``mysql.proc name'' indique la colonne de la table mysql.proc qui correspond la colonne de la table INFORMATION_SCHEMA.ROUTINES, si elle existe. Nom standard SPECIFIC_CATALOG SPECIFIC_SCHEMA SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME MODULE_CATALOG MODULE_SCHEMA MODULE_NAME USER_DEFINED_TYPE_CATALOG USER_DEFINED_TYPE_SCHEMA USER_DEFINED_TYPE_NAME ROUTINE_TYPE DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS IS_NULL_CALL SQL_PATH SCHEMA_LEVEL_ROUTINE MAX_DYNAMIC_RESULT_SETS IS_USER_DEFINED_CAST IS_IMPLICITLY_INVOCABLE SECURITY_TYPE TO_SQL_SPECIFIC_CATALOG TO_SQL_SPECIFIC_SCHEMA TO_SQL_SPECIFIC_NAME AS_LOCATOR CREATED LAST_ALTERED NEW_SAVEPOINT_LEVEL IS_UDT_DEPENDENT RESULT_CAST_FROM_DTD_IDENTIFIER created modified omis omis omis security_type omis omis omis omis is_deterministic sql_data_access omis NULL omis omis omis omis language body NULL NULL SQL type db name omis omis omis omis omis omis {PROCEDURE|FUNCTION} (data type descriptor) SQL db specific_name NULL Nom mysql.proc Remarques omis omis
894
RESULT_CAST_AS_LOCATOR SQL_MODE ROUTINE_COMMENT DEFINER Notes : MySQL calcule EXTERNAL_LANGUAGE comme suit : sql_mode comment definer
Si mysql.proc.language='SQL', alors EXTERNAL_LANGUAGE vaut NULL Sinon, EXTERNAL_LANGUAGE prend la valeur de mysql.proc.language. Cependant, nous n'avons pas de langage externe pour le momemnt, ce qui fait que cette valeur est toujours NULL.
SHOW
Remarques NULL
omit
La colonne CHECK_OPTION contient toujours la valeur NONE. La colonne IS_UPDATABLE vaut YES si la vue est modifiable, et NO dans le cas contraire.
Plusieurs extensions de la SHOW accompagnent l'implmentation de la base INFORMATION_SCHEMA : SHOW peut tre utilis pour lire des informations sur la structure de la base INFORMATION_SCHEMA elle-mme. Plusieurs commandes SHOW acceptent une clause WHERE qui fournit plus de souplesse pour spcifier les lignes afficher. Ces extensions sont disponibles depuis MySQL 5.0.3. INFORMATION_SCHEMA est une base de donnes d'informations, ce qui fait que son nom est inclus dans le rsultat de SHOW DATABASES. Similairement, SHOW TABLES peut servir avec INFORMATION_SCHEMA pour lire la liste des tables disponibles :
mysql> SHOW TABLES FROM INFORMATION_SCHEMA; +---------------------------------------+ | Tables_in_information_schema | +---------------------------------------+ | SCHEMATA | | TABLES | | COLUMNS | | CHARACTER_SETS | | COLLATIONS | | COLLATION_CHARACTER_SET_APPLICABILITY | | ROUTINES | | STATISTICS | | VIEWS | | USER_PRIVILEGES | | SCHEMA_PRIVILEGES | | TABLE_PRIVILEGES | | COLUMN_PRIVILEGES | | TABLE_CONSTRAINTS | | KEY_COLUMN_USAGE | +---------------------------------------+
SHOW COLUMNS and DESCRIBE can display information about the columns in individual INFORMATION_SCHEMA tables. Plusieurs commandes SHOW ont t tendues avec la clause WHERE :
SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW SHOW CHARACTER SET COLLATION COLUMNS DATABASES FUNCTION STATUS KEYS OPEN TABLES PROCEDURE STATUS STATUS TABLE STATUS TABLES VARIABLES
La clause WHERE, lorsqu'elle est disponible, utilise le nom des colonnes de l'affichage de la commande SHOW. Par exemple, la commande SHOW COLLATION produit ces colonnes :
mysql> SHOW CHARACTER SET; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 | | latin1 | ISO 8859-1 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
896
...
Pour utiliser la clause WHERE avec la commande SHOW CHARACTER SET, il faut utiliser les noms de ces colonnes. Par exemple, la commande suivante affiche les informations sur les jeux de caractres dont ls collation par dfaut contient la chane "japanese" :
mysql> SHOW CHARACTER SET WHERE `Default collation` LIKE '%japanese%'; +---------+---------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+---------------------------+---------------------+--------+ | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | +---------+---------------------------+---------------------+--------+
897
898
MySQL 5 introduit un module de mathmatiques de prcision, c'est dire des oprations arithmtiques avec une prcision accrue et un contrle suprieur sur les erreurs, par rapport aux versions prcdentes. Les nouvelles mathmatiques sont bass sur deux changements dans l'implmentation : L'introduction de nouveau modes SQL en MySQL 5.0.2 qui contrlent la svrit du serveur lors de l'analyse des donnes. L'introduction en MySQL 5.0.3 de la bibliothque d'arithmtique. Ces changements ont plusieurs implications au niveau des oprations numriques : Plus grande prcision dans les calculs. Pour les nombres exacts, les calculs n'introduisent plus d'erreur de dcimale. La prcision totale est alors utilise. Par exemple, un nombre tel que 0,0001 est trait comme une valeur exacte, et non plus comme une valeur approche. Si vous l'additionnez lui-mme 10 000 fois (dix mille), vous obtiendrez la valeur de 1, et non pas une valeur proche de 1. Arrondissement des valeurs matris. Pour les nombres exacts, le rsultat de ROUND() dpend de l'argument, et non plus d'lments comme la bibliothque C sous-jacente. Amlioration de la portabilit. Les oprations sur les nombres exacts sont exactement les mmes, quelque soit la plate-forme utilise, Windows ou Unix. Contrle sur la gestion des valeurs invalides. Les dpassements de capacit et les divisions par zro sont dtectables, et peuvent tre traites comme des erreurs. Par exemple, vous pouvez traiter une erreur trop grande pour une colonne comme une erreur au lieu de la tronquer la valeur valide la plus proche. De mme, vous pouvez traiter la division par zro comme une erreur plutt que de produire une valeur de type NULL. Le choix de l'approche revient alors configurer la variable systme sql_mode. Une consquence importante de ces changements est que MySQL est maintenant bien plus compatible avec les standards SQL. Le chapitre suivant couvre diffrents aspects des mcanismes mathmatiques, y compris les incompatibilits avec les anciennes applications. la fin, des exemples illustrent le fonctionnement de MySQL 5.
899
Les valeurs littrales exactes ont une partie entire ou une partie dcimale, ou les deux. Elles peuvent tre pourvues d'un signe. Par exemple : 1, .2, 3.4, -5, -6.78, +9.10. Les valeurs littrales approximatives sont reprsentes en notation scientifique, avec une mantisse et un exposant. Les deux parties de cette reprsentation peuvent tre pourvus d'un signe ou non. Par exemple : 1.2E3, 1.2E-3, -1.2E3, -1.2E-3. Des nombres qui se ressemblent n'ont pas forcment le mme type de donnes, exact ou approximatif. Par exemple, 2.34 est une valeur exacte (virgule fixe), alors que 2.34E0 est une valeur approximative (virgule flottante). Le type de donnes DECIMAL est un type virgule fixe, et les calculs qui s'y rattachent sont exacts. Pour MySQL, DECIMAL a plusieurs synonymes : NUMERIC, DEC et FIXED. Les types entiers sont aussi des valeurs exactes. Les types de donnes FLOAT et DOUBLE sont des types virgule flottante, et les calculs qui s'y rattachent sont des approximations. Pour MySQL, les types synonymes de FLOAT ou DOUBLE sont DOUBLE PRECISION et REAL.
900
Reste Chiffres 0 1 2 3 4 5 6 7 8 9
Nombre d'octets 0 1 1 2 2 3 3 4 4 4
Une consquence du changement de chane en format binaire de DECIMAL est que les colonnes DECIMAL ne peuvent plus stocker le caractre + initial ou les 0 initiaux. Avant MySQL 5.0.3, si vous insriez '+0003.1' dans une colonne DECIMAL(5,1), le nombre aurait t stock sous forme de +0003.1. Depuis MySQL 5.0.3, il est stock sous forme de 3.1. Les applications qui exploitent le vieux comportement doivent tre modifies pour prendre en compte ce changement. Le changemenet de format de stockage signifie que les colonnes DECIMAL ne supportent plus les extensions non standard qui permettait aux valeurs trop grandes d'tre stockes. Pour les valeurs positives qui ne requierent pas de signe, MySQL permettait l'ajout d'un chiffre de plus. Par exemple, dans une colonne DECIMAL(3,0), l'intervale de validit tait de -999 999, mais MySQL permettait le stockage de valeurs de 1000 9999, en utilisant l'octet de signe pour stocker les valeurs supplmentaires. Cette extension de la valeur maximale des colonnes DECIMAL n'est plus autorise. En MySQL 5.0.3 et plus rcent, une colonne DECIMAL(M,D) autorise le stockage d'au plus MD chiffres gauche de la virgule dcimale. Cela peut engendrer des incompatibilits si une application exploitait cette tolrance de MySQL. Le standard SQL requiert que la prcision des valeurs NUMERIC(M,D) soit exactement de M. Pour DECIMAL(M,D), le standard requiert une prcsion d'au moins M mais en autorise plus. Avec MySQL, DECIMAL(M,D) et NUMERIC(M,D) sont les mmes, et les deux ont la mme prcision de M chiffres exactement. Rsum des incompatibilits : La liste suivante rsume les incompatibilits qui rsultent des modifications des comportements des colonnes DECIMAL. Vous pouvez l'utiliser pour vrifier votre anciennes applications et les migrer vers MySQL 5.0.3. Pour DECIMAL(M,D), la valeur maximale de M est 64, et non plus 254. Les calculs impliquant des valeurs dcimales exactes ont 64 chiffres de prcision. C'est infrieur au nombre maximal de chiffre prcdemment autoris avant MySQL 5.0.3 (254 chiffres), mais la prcision est malgr tout amlior. Les calculs taient fait en double prcision, ce qui reprsente 52 bits ou 15 chiffres. L'extension non standard MySQL de la limite suprieur de stockage des colonnes DECIMAL n'est plus supporte. Les caractres initiaux + et 0 ne sont plus stocks.
901
SQL strict, lors d'une commande INSERT dans une colonne avec un type exact, tel que DECIMAL ou entier, un nombre est insr avec sa valeur exacte s'il est contenu dans l'intervale de validit de la colonne. Lorsqu'il est lu, sa valeur est la mme que lors de l'insertion. Hors du mode strict, les arrondissements sur INSERT sont autoriss. La gestion des expressions numriques dpends du type de valeurs qui sont manipules : Si une valeur approximative est implique, l'expression sera approximative, et sera value avec l'arithmtique des nombres virgule flottante. Si aucune valeur approximative n'est implique, l'expression ne contient que des valeurs exactes. Si aucune valeur ne contient de partie dcimale, l'expression sera value avec avec l'arithmtique exacte DECIMAL et la prcision sera de 64 chiffres. "Exact" est soumis aux limitations des reprsentations binaires. 1.0/3.0 peut tre reprsent par .333... avec un nombre infini de chiffre, mais jamais "exactement" comme un tiers, et (1.0/3.0)*3.0 ne vaudra jamais exactement "1.0." Sinon, l'expression ne contient que des entiers. L'expression est exacte, et est value avec l'arithmtique entire, et la prcision est celle d'un BIGINT (64 bits). Si une expression numrique contient des chanes de caractres, elles sont converties en valeur dcimale de prcision double, et l'expression sera une approximation. Les insertions dans les colonnes numriques sont affectes par le mode SQL, qui est contrl par la variable systme sql_mode. Voyez see Section 1.5.2, Slectionner les modes SQL . La prsentation suivante mentionne le mode strict, slectionn par les valeurs STRICT_ALL_TABLES ou STRICT_TRANS_TABLES mode values et ERROR_FOR_DIVISION_BY_ZERO. Pour dsactiver ces contraintes, vous pouvez utiliser simplement le mode TRADITIONAL, qui inclut le mode strict et ERROR_FOR_DIVISION_BY_ZERO :
mysql> SET sql_mode='TRADITIONAL';
Si un nombre est insr dans une colonne de type exact (DECIMAL ou entier), il sera insr comme valeur exacte s'il est dans l'intervale de validit de la colonne. Si la valeur a trop de chiffres dcimaux, un arrondissement surviend et une alerte est gnre. L'arrondissement se fait tel que dcrit par le "Comportement d'arrondissement". Si la valeur a trop de chiffres dans la partie entire, la valeur est alors trop grande, et elle est traite comme ceci : Si le mode strict n'est pas activ, la valeur est coupe la premire valeur valide, et une alerte est gnre. Si le mode strict est activ, une erreur de dpassement de capacit survient. Les valeurs trop petites pour tre stockes ne sont pas dtectes, et aucune erreur ne survient dans ce cas : le comportement est indfini. Par dfaut, la division par zro produit le rsultat de NULL et aucune alerte. Avec le mode SQL ERROR_FOR_DIVISION_BY_ZERO, MySQL gre les divisions par zro diffremment : Si le mode strict n'est pas activ, une alerte survient. Si le mode strict est activ, les insertions et modifications qui manipulent des divisions par zro sont interdites et une erreur survient. En d'autres mots, les insertions et modifications qui impliquent des divisions par zro peuvent tre traites comme des erreurs, mais cela requiert le mode SQL ERROR_FOR_DIVISION_BY_ZERO en plus du mode strict. Supposez que nous ayons la commande suivante :
902
Arrondissement de valeurs
Voici ce qui arrive dans diffrentes combinaisons du mode strict et de ERROR_FOR_DIVISION_BY_ZERO : sql_mode Value '' strict ERROR_FOR_DIVISION_BY_ZERO strict,ERROR_FOR_DIVISION_BY_ZERO Result Aucune alerte, aucune erreur, i prend la valeur de NULL Aucune alerte, aucune erreur, i vaut NULL Alerte, pas d'erreur, i vaut NULL Erreur, pas d'insertion.
Pour les inserionts de lignes dans une colonne numrique, la conversion de chane en valeur numrique est gr comme ceci : Une chane qui ne commence pas par un nombre, ne peut pas tre utilise comme nombre et produit une erreur en mode strict, ou une alerte sinon. Cela vaut aussi pour les chanes vides. Une chane qui commence avec un nombre peut tre convertie, mais la partie non numrique sera tronque. Cela produit une erreur en mode strict et une alerte sinon.
Pour les insertions dans les colonnes de type DECIMAL, la cible est une valeur exacte, ce qui fait que l'arrondissement se fait l'entier le plus proche, indpendamment de la nature de la valeur insre, approche ou exacte :
mysql> CREATE TABLE t (d DECIMAL(10,0)); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t VALUES(2.5),(2.5E0); Query OK, 2 rows affected, 2 warnings (0.00 sec) Records: 2 Duplicates: 0 Warnings: 2 mysql> SELECT d FROM t; +------+ | d | +------+
903
| 3 | | 3 | +------+
Depuis MySQL 5.0.3, les nombres sont utiliss tels que spcifis, tant que possible :
mysql> SELECT .1 + .2 = .3; +--------------+ | .1 + .2 = .3 | +--------------+ | 1 | +--------------+
Cependant, pour les valeurs dcimales, les erreurs de prcision existent toujours :
mysql> SELECT .1E0 + .2E0 = .3E0; +--------------------+ | .1E0 + .2E0 = .3E0 | +--------------------+ | 0 | +--------------------+
Un autre moyen de voir la diffrence entre les valeurs exactes et les approximations est d'ajouter un grand nombre de fois des petites valeurs. Considrez la procdure stocke suivante quie ajoute .0001 mille fois une variable.
CREATE PROCEDURE p () BEGIN DECLARE i INT DEFAULT 0; DECLARE d DECIMAL(10,4) DEFAULT 0; DECLARE f FLOAT DEFAULT 0; WHILE i < 10000 DO SET d = d + .0001; SET f = f + .0001E0; SET i = i + 1; END WHILE; SELECT d, f; END;
La somme de d et f vaut logiquement 1, mais ce n'est vrai que pour le calcul dcimal. Les calculs dcimaux introduisent une erreur :
+--------+------------------+ | d | f | +--------+------------------+ | 1.0000 | 0.99999999999991 | +--------+------------------+
Exemple 2 La multiplication est faite avec l'chelle impose par le standard SQL. C'est dire que pour deux nombres X1 et X2 qui ont pour chelle respective S1 et S2, le rsultat du produit est l'chelle S1 + S2.
904
La valeur affiche est incorrecte. La valeur a t calcule correctement dans cette situation, mais n'est pas affiche avec l'chelle ncessaire. Pour afficher la valeur correcte, il faut utiliser ceci :
mysql> SELECT .01 * .01 + .0000; +-------------------+ | .01 * .01 + .0000 | +-------------------+ | 0.0001 | +-------------------+
Exemple 3 L'arrondissement est bien matris. Avant MySQL 5.0.3, l'arrondissement (par exemple, avec ROUND()) tait li l'implmentation de la bibliothque C sous-jacente. Cela conduisait des incohrences entre les plates-formes. Par exemple, cela arrivait si vous essayiez de faire le mme calcul sur Windows et sur Linux, ou sur diffrentes architectures telles que des x86 ou des PowerPC. Depuis MySQL 5.0.3, l'arrondissement se fait comme ceci : l'arrondit des colonnes DECIMAL des valeurs exactes utilisent la rgle du ``arrondi la valeur suprieure''. Les valeurs ayant une partie dcimale suprieure ou gale .5 sont arrondies au prochain entier, comme ceci :
mysql> SELECT ROUND(2.5), ROUND(-2.5); +------------+-------------+ | ROUND(2.5) | ROUND(-2.5) | +------------+-------------+ | 3 | -3 | +------------+-------------+
L'arrondit des valeurs dcimales utilise toujours la bibliothque C, qui applique la rgle de l'arrondit l'entier le plus proche :
mysql> SELECT ROUND(2.5E0), ROUND(-2.5E0); +--------------+---------------+ | ROUND(2.5E0) | ROUND(-2.5E0) | +--------------+---------------+ | 2 | -2 | +--------------+---------------+
Exemple 4 Pour les insertions dans les tables, une valeur trop grande qui engendre un dpassement de capacit cause maintenant une erreur, et non plus la troncation de la valeur. Pour cela, il faut tre en mode strict : Avant MySQL 5.0.2, la troncation se faisait la valeur valide la plus proche :
mysql> CREATE TABLE t (i TINYINT); Query OK, 0 rows affected (0.00 sec)
905
mysql> INSERT INTO t SET i = 128; Query OK, 1 row affected, 1 warning (0.01 sec) mysql> SELECT i FROM t; +------+ | i | +------+ | 127 | +------+ 1 row in set (0.00 sec)
Depuis MySQL 5.0.2, le dpassement de capacit intervient ds que le mode strict est actif :
mysql> CREATE TABLE t (i TINYINT); Query OK, 0 rows affected (0.01 sec) mysql> SET sql_mode='STRICT_ALL_TABLES'; Query OK, 0 rows affected (0.10 sec) mysql> INSERT INTO t SET i = 128; ERROR 1264 (22003): Out of range value adjusted for column 'i' at row 1 mysql> SELECT i FROM t; Empty set (0.00 sec)
Exemple 5 Lors des insertions dans les tables, les divisions par zro causent des erreur, et non plus des insertions de valeur NULL. Il faut utiliser le mot script et l'option ERROR_FOR_DIVISION_BY_ZERO. Avant MySQL 5.0.2, la division par zro conduisait un NULL :
mysql> CREATE TABLE t (i TINYINT); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO t SET i = 1 / 0; Query OK, 1 row affected (0.06 sec) mysql> SELECT i FROM t; +------+ | i | +------+ | NULL | +------+ 1 row in set (0.01 sec)
Depuis MySQL 5.0.2, la division par zro est une erreur si le bon mode SQL est actif :
mysql> CREATE TABLE t (i TINYINT); Query OK, 0 rows affected (0.00 sec) mysql> SET sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO'; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t SET i = 1 / 0; ERROR 1365 (22012): Division by 0 mysql> SELECT i FROM t; Empty set (0.01 sec)
Exemple 6 En MySQL 4, les valeurs litrales exactes et approximatives sont converties en nombres dcimaux en double prcision :
mysql> CREATE TABLE t SELECT 2.5 AS a, 25E-1 AS b; mysql> DESCRIBE t; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | a | double(3,1) | | | 0.0 | | | b | double | | | 0 | |
906
+-------+-------------+------+-----+---------+-------+
En MySQL 5, la nombre dcimaux approximative sont toujours convertis en nombres dcimaux en prcision double, mais les valeurs exactes sont gres comme des nombres dcimaux en prcision simple DECIMAL :
mysql> CREATE TABLE t SELECT 2.5 AS a, 25E-1 AS b; mysql> DESCRIBE t; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | a | decimal(3,1) | NO | | 0.0 | | | b | double | NO | | 0 | | +-------+--------------+------+-----+---------+-------+
Exemple 7 Si un argument d'une fonction d'agrgation est une valeur exacte, le rsultat sera aussi exact, avec une chelle au moins gale cet argument. Le rsultat ne sera pas un nombre dcimal de prcision double. Considrez les commandes suivantes :
mysql> CREATE TABLE t (i INT, d DECIMAL, f FLOAT); mysql> INSERT INTO t VALUES(1,1,1); mysql> CREATE TABLE y SELECT AVG(i), AVG(d), AVG(f) FROM t;
Le rsultat est un nombre dcimal en prcision double, quel que soit le type des arguments. Le rsultat depuis MySQL 5.0.3 :
mysql> DESCRIBE y; +--------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+---------------+------+-----+---------+-------+ | AVG(i) | decimal(64,0) | YES | | NULL | | | AVG(d) | decimal(64,0) | YES | | NULL | | | AVG(f) | double | YES | | NULL | | +--------+---------------+------+-----+---------+-------+
Le rsultat est un nombre dcimal en prcision double pour les arguments de type nombre dcimal. Le rsultat est une valeur exacte pour les arguments exacts.
907
908
Ce chapitre dcrit les interfaces disponibles pour MySQL, o les trouver, et comment les utiliser. L'API C est celle qui est couverte le plus en dtail, puisqu'elle est dveloppe par l'quipe MySQL, et sert de base toutes les autres API.
909
L'utilitaire msql2mysql fait cette conversion, et transforme les appels C mSQL en leurs quivalents MYSQL. msql2mysql convertit le fichier sur place : il est recommand de faire une copie avant de lancer la conversion. Par exemple, utilisez msql2mysql comme ceci :
shell> cp client-prog.c client-prog.c.orig shell> msql2mysql client-prog.c client-prog.c converted
Puis, examinez le fichier client-prog.c et faites toutes les modifications post-conversion ncessaires. msql2mysql utilise l'utilitaire replace pour faire les substitutions. See Section 8.13, L'utilitaire de remplacement de chanes replace .
910
API MySQL C
--libs
[-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib -lssl -lcrypto] --libs_r [-L/usr/local/mysql/lib/mysql -lmysqlclient_r -lpthread -lz -lcrypt -lnsl -lm -lpthread] --socket [/tmp/mysql.sock] --port [3306] --version [4.0.16] --libmysqld-libs [-L/usr/local/mysql/lib/mysql -lmysqld -lpthread -lz -lcrypt -lnsl -lm -lpthread -lrt]
Vous pouvez utiliser mysql_config dans une ligne de commande pour inclure la valeur qui sera affiche par une option. Par exemple, pour compiler un client MySQL, utilisez mysql_config comme ceci :
CFG=/usr/local/mysql/bin/mysql_config sh -c "gcc -o progname `$CFG --cflags` progname.c `$CFG --libs`"
Lorsque vous utilisez mysql_config de cette manire, assurez vous de l'invoquer entre des guillemets obliques (`). Cela indique que le Shell doit excuter cette expression, et remplacer le rsultat dans la commande.
911
Cette structure reprsente un gestionnaire de connexion la base de donnes. Elle est utilise dans la plupart des fonctions MySQL. MYSQL_RES Cette structure reprsente le rsultat d'une requte qui retourne des lignes (SELECT, SHOW, DESCRIBE, EXPLAIN). L'information retourne par une requte est appele jeu de rsultats dans le reste de cette section. MYSQL_ROW C'est une reprsentation sre pour les types d'une ligne de donnes. Elle est actuellement implmente en tant que tableau de chane octets compts. (Vous ne pouvez la traiter en tant que chane termine par une valeur nulle si les valeurs du champ peuvent contenir des donnes binaires, car de telles valeurs peuvent contenir elles-mmes des octets nuls.) Les lignes sont obtenues en appelant mysql_fetch_row(). MYSQL_FIELD Cette structure contient des informations propos du champ, tel que son nom, son type, et sa taille. Ses membres sont dcrit en plus de dtails ici. Vous pouvez obtenir une structure MYSQL_FIELD pour chaque champ en appelant plusieurs fois mysql_fetch_field(). Les valeurs des champs ne font pas partie de la structure; elles sont contenues dans une structure MYSQL_ROW. MYSQL_FIELD_OFFSET C'est une reprsentation sre des types pour les index dans une liste de champs MySQL. (Utiliss par mysql_field_seek().) Les index sont des numros de champs, dans une ligne, commenant zro.
my_ulonglong Le type utilis pour le nombre de lignes et pour mysql_affected_rows(), mysql_num_rows(), et mysql_insert_id(). Ce type fournit une chelle allant de 0 1.84e19. Sur quelques systmes, essayer d'crire la valeur d'un type my_ulonglong ne fonctionnera pas. Pour crire une telle valeur, convertissez l en unsigned long et utilisez un format d'impression %lu. Exemple :
printf ("Nombre de lignes : %lu\n", (unsigned long) mysql_num_rows(result));
La structure MYSQL_FIELD contient les membres lists ici : char * name Le nom du champ, une chane termine par une valeur nulle. char * table Le nom de la table contenant ce champ, s'il n'est pas calcul. Pour les champs calculs, la valeur de table est une chane vide. char * def La valeur par dfaut de ce champ, en tant que chane termine par une valeur nulle. Ce n'est dfinit que si vous utilisez mysql_list_fields(). enum enum_field_types type Le type du champ. La valeur de type peut tre l'une des suivantes :
912
Valeur de type FIELD_TYPE_TINY FIELD_TYPE_SHORT FIELD_TYPE_LONG FIELD_TYPE_INT24 FIELD_TYPE_LONGLONG FIELD_TYPE_DECIMAL FIELD_TYPE_FLOAT FIELD_TYPE_DOUBLE FIELD_TYPE_TIMESTAMP FIELD_TYPE_DATE FIELD_TYPE_TIME FIELD_TYPE_DATETIME FIELD_TYPE_YEAR FIELD_TYPE_STRING FIELD_TYPE_VAR_STRING FIELD_TYPE_BLOB FIELD_TYPE_SET FIELD_TYPE_ENUM FIELD_TYPE_NULL FIELD_TYPE_CHAR
Description du type Champ TINYINT Champ SMALLINT Champ INTEGER Champ MEDIUMINT Champ BIGINT Champ DECIMAL ou NUMERIC Champ FLOAT Champ DOUBLE ou REAL Champ TIMESTAMP Champ DATE Champ TIME Champ DATETIME Champ YEAR Champ chane de caractres (CHAR ou VARCHAR) Champ VARCHAR Champ BLOB ou TEXT (utilisez max_length pour dterminer la taille maximale) Champ SET Champ ENUM Champ de type NULL Dsapprouv, utilisez FIELD_TYPE_TINY la place
Vous pouvez utiliser la macro IS_NUM() pour tester si un champ est de type numrique ou non. Passez la valeur de type IS_NUM() et elle sera value TRUE si le champ est numrique :
if (IS_NUM(field->type)) printf("Le champ est numrique\n");
unsigned int length La taille du champ, comme spcifi dans la dfinition de la table. unsigned int max_length La longueur maximale du champ pour le jeu de rsultats (la taille de la plus longue valeur de champ actuellement dans le jeu de rsultat). Si vous utilisez mysql_store_result() ou mysql_list_fields(), cela contient la longueur maximale pour le champ. Si vous utilisez mysql_use_result(), la valeur de cette variable est zro. unsigned int flags Les diffrents attributs sous forme de bits pour le champ. La valeur de flags peut avoir zro ou plusieurs de ces bits suivants activs : Valeur d'attribut NOT_NULL_FLAG PRI_KEY_FLAG UNIQUE_KEY_FLAG Description d'attribut Le champ ne peut tre NULL Le champ fait parti d'une clef primaire Le champ fait parti d'une clef unique
913
Le champ fait parti d'une clef non-unique Le champ possde l'attribut UNSIGNED Le champ possde l'attribut ZEROFILL Le champ possde l'attribut BINARY Le champ possde l'attribut AUTO_INCREMENT Le champ est un ENUM (dsapprouv) Le champ est un SET (dsapprouv) Le champ est un BLOB ou TEXT (dsapprouv) Le champ est un TIMESTAMP (dsapprouv)
L'utilisation des attributs BLOB_FLAG, ENUM_FLAG, SET_FLAG, et TIMESTAMP_FLAG est dsapprouv car ils indiquent un type de champ plutt qu'un attribut de type de champ. Il est prfrable de tester field->type avec FIELD_TYPE_BLOB, FIELD_TYPE_ENUM, FIELD_TYPE_SET, ou FIELD_TYPE_TIMESTAMP la place. L'exemple suivant illustre une utilisation typique de la valeur de flags :
if (field->flags & NOT_NULL_FLAG) printf("Le champ ne peut tre nul\n");
Vous pouvez utiliser les diffrentes macros ci-dessous pour dterminer le statut boolen de la valeur de l'attribut : Statut de l'attribut IS_NOT_NULL(flags) IS_PRI_KEY(flags) IS_BLOB(flags) Description Vrai si le champ est dfini en tant que NOT NULL Vrai si le champ est une clef primaire Vrai si le champ est un BLOB ou TEXT (dsapprouv; tester plutt field->type)
mysql_character_set_name() Retourne le nom du jeu de caractre de la connexion. mysql_close() mysql_connect() mysql_create_db() mysql_data_seek() mysql_debug()
914
Supprime une base de donnes. Cette fonction est dsapprouve, utilisez plutt la commande SQL DROP DATABASE. Demande au serveur d'crire les informations de dbogage dans un fichier de log. Dtermine si la dernire ligne du jeu de rsultats a t lue ou non. Cette fonction est dsapprouve, vous pouvez utiliser mysql_errno() ou mysql_error() la place. Retourne le numro de l'erreur de la fonction appele en dernier. Retourne le message d'erreur de la dernire fonction MySQL appele. Protge une chane en chappant les caractres spciaux. Retourne le type du champ suivant dans la table. Retourne le type d'une colonne, tant donn un numro de champ. Retourne un tableau avec toutes les structures de champs. Retourne la longueur de toutes les colonnes dans la ligne suivante. Rcupre la ligne suivante dans le jeu de rsultats. Place le curseur de colonne sur une colonne prcise. Retourne le nombre de colonnes dans le rsultat pour la requte la plus rcente. Retourne la position du curseur de champs utilis pour le dernier appel mysql_fetch_field(). Libre la mmoire utilise par un jeu de rsultats. Retourne la version du client sous forme de chane. Retourne la version du client sous forme d'entier. Retourne une chane dcrivant la connexion. Retourne le numro de version du serveur sous forme d'entier (nouveau en 4.1). Retourne la version du protocole utilis par la connexion. Retourne la version du serveur. Retourne des informations propos de la requte la plus rcente. Rcupre ou initialise une structure MYSQL. Retourne l'identifi gnr pour une colonne AUTO_INCREMENT par la dernire requte. Termine un processus donn. Retourne les noms des bases de donnes rpondant une expression rgulire simple. Retourne les noms des champs rpondants une expression rgulire simple. Retourne une liste des processus courants du serveur. Retourne les noms des tables rpondants une expression rgulire simple. Retourne le nombre de colonnes dans un jeu de rsultats. Retourne le nombre de lignes dans le jeu de rsultats. Configure les options de connexion pour mysql_connect().
mysql_errno() mysql_error() mysql_escape_string() mysql_fetch_field() mysql_fetch_field_direct() mysql_fetch_fields() mysql_fetch_lengths() mysql_fetch_row() mysql_field_seek() mysql_field_count() mysql_field_tell() mysql_free_result() mysql_get_client_info() mysql_get_client_version() mysql_get_host_info() mysql_get_server_version() mysql_get_proto_info() mysql_get_server_info() mysql_info() mysql_init() mysql_insert_id() mysql_kill() mysql_list_dbs() mysql_list_fields() mysql_list_processes() mysql_list_tables() mysql_num_fields() mysql_num_rows() mysql_options()
915
Vrifie si la connexion au serveur a toujours lieu. Reconnecte si besoin. Excute une requte SQL spcifie en tant que chane termine par un caractre nul. Connecte un serveur MySQL. Protge les caractres spciaux dans une chane utilisable dans une requte SQL, en prenant en compte le jeu de caractres courant de la connexion. Excute une requte SQL spcifie en tant que chane compte. Demande au serveur de recharger la table des droits. Dplace le pointeur vers un ligne dans le jeu de rsultats, en utilisant une valeur retourne par mysql_row_tell(). Retourne la position du curseur de lignes. Slectionne une base de donnes. Spcifie la valeur d'une option pour la connexion (comme multistatements). Retourne l'erreur SQLSTATE de la dernire erreur. Termine le serveur de base de donnes. Retourne le statut du serveur dans une chane. Rcupre le jeu de rsultats complet dans le client. Retourne l'identifiant du thread courant. Retourne 1 si le client est compil avec la scurit thread. Initialise une rcupration ligne par ligne des rsultats. Retourne le nombre d'alertes gnres par la dernire commande SQL. Valide une transaction (nouveau en 4.1). Annule une transaction (nouveau en 4.1). Active et dsactive le mode d'auto validation (nouveau en 4.1). Vrifie si il n'y a plus de rsultats (nouveau en 4.1). Retourne/initie le prochain rsultat dans une commande multirequte (nouveau en 4.1).
mysql_real_query() mysql_reload() mysql_row_seek() mysql_row_tell() mysql_select_db() mysql_set_server_option() mysql_sqlstate() mysql_shutdown() mysql_stat() mysql_store_result() mysql_thread_id() mysql_thread_safe() mysql_use_result() mysql_warning_count() mysql_commit() mysql_rollback() mysql_autocommit() mysql_more_results() mysql_next_result()
Pour vous connecter au serveur, appelez mysql_init() pour initialiser un gestionnaire de connexion, puis appelez mysql_real_connect() avec ce gestionnaire (avec d'autres informations tel que l'hte, l'utilisateur et le mot de passe). Lors de la connexion, mysql_real_connect() dfinit l'option reconnect (quit fait partie de la structure MYSQL) 1. Cette option indique, dans le cas o une requte ne peut tre excute cause d'une perte de connexion, d'essayer de se reconnecter au serveur avant d'abandonner. Lorsque vous n'avez plus besoin de la connexion, appelez mysql_close() pour la clore. Tant qu'une connexion est active, le client envoi des requtes SQL au serveur l'aide de mysql_query() ou mysql_real_query(). La diffrence entre les deux est que mysql_query() s'attend ce que la requte soit spcifie en tant que chane termine par la chane nulle, tandis que mysql_real_query() attend une chane de longueur connue. Si la chane contient des donnes binaires (incluant l'octet nul), vous devez utiliser mysql_real_query(). Pour chaque requte non-slective (par exemple, INSERT, UPDATE, DELETE), vous pouvez trouver combien de lignes ont t mises jour (affectes) en appelant mysql_affected_rows().
916
Pour les requtes SELECT, vous rcuprez les lignes slectionnes dans un jeu de rsultat. (Notez que quelques commandes ont le mme comportement que SELECT, dans le sens o elle renvoient des lignes. Cela inclut SHOW, DESCRIBE, et EXPLAIN. Elles doivent tre traites de la mme faon que les requtes SELECT.) Il y a deux faons pour un client de grer les jeux de rsultats. Une mthode consiste rcuprer le jeu de rsultat en entier et en une seule fois en appelant mysql_store_result(). Cette fonction obtient toutes les lignes retournes par la requte et les stocke dans le client. La seconde mthode consiste initialiser une rcupration ligne par ligne du jeu de rsultats en appelant mysql_use_result(). Cette fonction initie la rcupration, mais ne rcupre actuellement aucune ligne partir du serveur. Dans les deux cas, vous accdez aux ligne en appelant mysql_fetch_row(). Avec mysql_store_result(), mysql_fetch_row() accde aux lignes qui ont dj t rcupres partir du serveur. Avec mysql_use_result(), mysql_fetch_row() rcupre actuellement la ligne partir du serveur. Les informations propos de la taille des donnes dans chaque ligne est disponible en appelant mysql_fetch_lengths(). Aprs avoir fini de traiter le jeu de rsultats, appelez mysql_free_result() pour librer la mmoire utilise. Les deux mcanismes de rcupration sont complmentaires. Les programmes clients doivent utiliser l'approche qui leur convient le mieux. En pratique, les clients tendent plus utiliser mysql_store_result(). Un avantage de mysql_store_result() est que puisque toutes les lignes ont t rcupres dans le client, vous ne pouvez pas que accder aux lignes squentiellement, vous pouvez revenir en arrire ou avancer dans le jeu de rsultats en utilisant mysql_data_seek() ou mysql_row_seek() pour changer la position de la ligne courante dans le jeu de rsultats. Vous pouvez aussi trouver le nombre total des lignes en appelant mysql_num_rows(). D'un autre ct, les besoins en mmoire de mysql_store_result() peuvent tre trs grands pour les grands jeux de rsultats et vous aurez des chances d'obtenir un manque de mmoire. Un avantage de mysql_use_result() est que le client a besoin de moins de mmoire pour le jeu de rsultats car il utilise une ligne la fois (et puisque il y a moins de pertes de mmoire, mysql_use_result() peut tre plus rapide). Les inconvnients sont que vous devez rcuprer chaque ligne rapidement pour viter de bloquer le serveur, vous n'avez pas d'accs alatoires aux lignes dans le jeu de rsultats (vous ne pouvez accder aux lignes que squentiellement), et vous ne savez pas combien de lignes comporte le jeu de rsultats tant que vous ne les avez pas toutes rcupres. De plus, vous devez rcuprer toutes les lignes mme si vous trouvez entre-temps l'informations que vous cherchiez. L'API permet aux clients de grer correctement les requtes (rcuprant les lignes seulement en cas de besoin) sans savoir si la requte tait un SELECT ou non. Vous pouvez faire cela en appelant mysql_store_result() aprs chaque mysql_query() (ou mysql_real_query()). Si l'appel au jeu de rsultats russi, la requte tait un SELECT et vous pouvez lire les lignes. Sinon, appelez mysql_field_count() pour vrifier si un rsultat aurait du tre retourn. Si mysql_field_count() retourne zro, la requte n'a pas retourn de donnes (cela indique que c'tait un INSERT, UPDATE, DELETE, etc.), et ne devait pas retourner de lignes. Si mysql_field_count() est non-nul, la requte aurait du retourner des lignes, mais ne l'a pas fait. Cela indique que la requte tait un SELECT qui a chou. Reportez vous la description de mysql_field_count() pour un exemple d'utilisation. mysql_store_result() et mysql_use_result() vous permettent d'obtenir des informations propos des champs qui constituent le jeu de rsultat (le nombre de champs, leurs noms et types, etc.). Vous pouvez accder aux informations du champ squentiellement dans une ligne en appelant plusieurs fois mysql_fetch_field(), ou avec le numro du champ dans la ligne en appelant mysql_fetch_field_direct(). La position courante du pointeur de champ peut tre change en appelant mysql_field_seek(). Changer le pointeur de champ affecte les appels suivants mysql_fetch_field(). Vous pouvez aussi obtenir en une seule fois les informations sur les champs en appelant mysql_fetch_fields().
917
Pour dtecter les erreurs, MySQL fournit un accs aux informations des erreurs via les fonctions mysql_errno() et mysql_error(). Elles retournent le code de l'erreur et le message pour la dernire fonction invoque qui aurait pu russir ou chouer, vous permettant ainsi de dterminer les erreurs et leurs causes.
/* incorrect */
/* incorrect */
Lorsqu'une fonction retourne une erreur, la section Erreurs du descriptif de la fonction liste les types d'erreurs possibles. Vous pouvez trouver celle qui est arrive en appelant mysql_errno(). Une chane de caractres reprsentant l'erreur peut tre obtenue en appelant mysql_error().
24.2.3.1. mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql) Description Retourne le nombre de lignes modifies par la dernire commande UPDATE, supprimes par la dernire commande DELETE ou insre par la dernire commande INSERT. Peut tre appele immdiatement aprs mysql_query() pour les commandes UPDATE, DELETE, ou INSERT. Pour la commande SELECT, mysql_affected_rows() fonctionne comme mysql_num_rows(). Valeur de retour Un entier suprieur zro indique le nombre de lignes affectes ou slectionnes. Zro indique qu'aucun enregistrement n'a t mis jour pour une requte UPDATE, qu'aucune lignes n'a correspondu la clause WHERE dans la requte ou que celle ci n'a pas encore t excute. 1 indique que la requte a renvoy une erreur ou que, pour une requte SELECT, mysql_affected_rows() a t appele avant mysql_store_result(). Comme mysql_affected_rows() retourne une valeur non signe, vous pouvez comparer avec 1 en comparant la valeur retourne par (my_ulonglong)-1 (ou par (my_ulonglong)~0, ce qui est la mme chose). Erreurs Aucune. Exemple
mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"); printf("%ld produits mis jour",(long) mysql_affected_rows(&mysql));
Si on spcifie l'option CLIENT_FOUND_ROWS en se connectant mysqld, mysql_affected_rows() retournera le nombre d'enregistrements correspondants la clause WHERE pour une requte UPDATE.
918
Notez que quand on utilise une commande REPLACE, mysql_affected_rows() retournera 2 si le nouvel enregistrement en a remplac un ancien. 2 en retour car dans ce cas, l'ancienne ligne a t supprim puis la nouvelle insre.
24.2.3.2. mysql_change_user()
my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db) Description Change l'utilisateur et dfinit la base de donnes spcifie par db en tant que base de donnes par dfaut (courante) dans la connexion spcifie par mysql. Pour les requtes suivantes, cette base de donnes sera celle utilise pour les rfrences aux tables ne spcifiant pas explicitement une base de donnes. Cette fonction a t introduite la version 3.23.3 de MySQL. mysql_change_user() choue si l'utilisateur ne peut tre authentifi ou s'il n'a pas le droit d'utiliser cette base de donnes. Dans ce cas, l'utilisateur et la base de donnes ne sont pas changs. Le paramtre db peut tre mis NULL si vous ne voulez pas avoir de base de donnes par dfaut. Valeur de retour Zro en cas de succs. Diffrent de zro si une erreur se produit. Erreurs Les mmes que vous pouvez obtenir avec mysql_real_connect(). CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite. ER_UNKNOWN_COM_ERROR Le serveur MySQL n'implmente pas cette commande (probablement un ancien serveur) ER_ACCESS_DENIED_ERROR L'utilisateur ou le mot de passe taient errons. ER_BAD_DB_ERROR La base de donnes n'existe pas. ER_DBACCESS_DENIED_ERROR L'utilisateur n'a pas le droit d'accder la base de donnes. 919
24.2.3.3. mysql_character_set_name()
const char *mysql_character_set_name(MYSQL *mysql) Description Retourne le jeu de caractres par dfaut de la connexion courante. Valeur de retour Le jeu de caractres par dfaut Erreurs Aucune.
24.2.3.4. mysql_close()
void mysql_close(MYSQL *mysql) Description Ferme la connexion ouverte prcdemment. mysql_close() libre aussi le pointeur de connexion mysql, si celui-ci avait t allou dynamiquement par mysql_init() ou mysql_connect(). Valeur de retour Aucune. Erreurs Aucune.
24.2.3.5. mysql_connect()
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd) Description Cette fonction est dsapprouve. Il est prfrable d'utiliser mysql_real_connect() la place. mysql_connect() essaye d'tablir une connexion un serveur MySQL lanc sur host. mysql_connect() doit s'achever avec succs avant que vous ne puissiez excuter l'une des autres fonctions de l'API, l'exception de mysql_get_client_info(). La signification des paramtres est la mme que pour ceux de la fonction mysql_real_connect() la diffrence que le paramtre de connexion peut tre NULL. Dans ce cas, l'API C alloue automatiquement une mmoire pour la structure de connexion et la libre quand vous appelez mysql_close(). Le dsavantage de cette approche est que vous ne pouvez pas rcuprer les messages d'erreur si la connexion choue. (Pour obtenir des informations sur les erreurs partir de mysql_errno() ou mysql_error(), vous devez fournir un pointeur MYSQL valide.)
920
Valeur de retour La mme que pour mysql_real_connect(). Erreurs Les mmes que pour mysql_real_connect().
24.2.3.6. mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db) Description Cre la base de donnes nomme avec le paramtre db. Cette fonction est dsapprouve. Il est prfrable d'utiliser mysql_query() pour gnrer une requte SQL CREATE DATABASE la place. Valeur de retour Zro si la base t cre avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite. Exemple
if(mysql_create_db(&mysql, "ma_base")) { fprintf(stderr, "Impossible de crer une nouvelle base de donnes. Erreur : %s\n", mysql_error(&mysql)); }
24.2.3.7. mysql_data_seek()
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset) Description Se dplace vers une ligne arbitraire d'un jeu de rsultat de requte. Cela ncessite que la structure du jeu de rsultat contienne la totalit du rsultat de la requte, de ce fait mysql_data_seek() peut tre utilise en conjonction avec mysql_store_result(), mais pas avec mysql_use_result(). L'index de la ligne doit tre compris entre 0 et mysql_num_rows(result)-1. Valeur de retour Aucune.
921
Erreurs Aucune.
24.2.3.8. mysql_debug()
void mysql_debug(const char *debug) Description Provoque un DBUG_PUSH avec la chane donne. mysql_debug() utilises la bibliothque de dbogage Fred Fish. Pour utiliser cette fonction vous devez compiler la bibliothque client avec le support dbogage. See Section D.1, Dboguer un serveur MySQL . See Section D.2, Dbogage un client MySQL . Valeur de retour Aucune. Erreurs Aucune. Exemple L'appel montr ici fais gnrer la bibliothque du client un fichier de trace dans /tmp/ client.trace sur la machine du client :
mysql_debug("d:t:O,/tmp/client.trace");
24.2.3.9. mysql_drop_db()
int mysql_drop_db(MYSQL *mysql, const char *db) Description Supprime la base de donnes nomme avec le paramtre db. Cette fonction est dsapprouve. Il est prfrable d'utiliser mysql_query() pour gnrer une requte SQL DROP DATABASE la place. Valeur de retour Zro si la base t efface avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite. Exemple
922
if(mysql_drop_db(&mysql, "ma_base")) fprintf(stderr, "Impossible de supprimer la base de donnes. Erreur : %s\n", mysql_error(&mysql));
24.2.3.10. mysql_dump_debug_info()
int mysql_dump_debug_info(MYSQL *mysql) Description Demande au serveur d'crire quelques informations de dbogage dans le log. Pour que cela fonctionne, il faut que l'utilisateur ait le droit SUPER. Valeur de retour Zro si la commande a t effectue avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.11. mysql_eof()
my_bool mysql_eof(MYSQL_RES *result) Description Cette fonction est dsapprouve. Vous pouvez utiliser mysql_errno() ou mysql_error() la place. mysql_eof() dtermine si la dernire ligne d'un jeu de rsultats a t lue. Si vous obtenez un jeu de rsultats suite un appel mysql_store_result(), le client reois le jeu entier en une seule opration. Dans ce cas, un retour NULL de la fonction mysql_fetch_row() signifie toujours que la fin du jeu de rsultat a t atteinte et il n'est donc pas ncessaire d'appeler mysql_eof(). Lors d'une utilisation avec mysql_store_result(), mysql_eof() retournera toujours true. D'un autre ct, si vous utilisez mysql_use_result() pour initialiser la rcupration d'un jeu de rsultats, les lignes sont obtenues du serveur une par une lors des appels successifs de mysql_fetch_row(). Puisque une erreur peut survenir la connexion durant ce processus, une valeur de retour NULL de la part de mysql_fetch_row() ne signifie pas ncessairement que la fin du jeu de rsultats a t atteinte normalement. Dans ce cas, vous pouvez utiliser mysql_eof() pour dterminer ce qui est arriv. mysql_eof() retourne une valeur non-nulle si la fin du jeu de rsultats a t atteinte et zro en cas d'erreur. Historiquement, mysql_eof() a vu le jour avant les fonctions d'erreurs standards de MySQL mysql_errno() et mysql_error(). Puisque ces fonctions fournissent les mmes informations, leur
923
utilisation est prfre mysql_eof(), qui est maintenant dsapprouve. (En fait, elles fournissent plus d'informations, car mysql_eof() ne retourne que des valeurs boolennes alors que les fonctions d'erreurs indiquent les raisons des erreurs lorsqu'elles surviennent.) Valeur de retour Zro si aucune erreur n'est survenue. Autre chose dans le cas contraire. Erreurs Aucune. Exemple L'exemple suivant vous montre comment vous devez utiliser mysql_eof():
mysql_query(&mysql,"SELECT * FROM une_table"); result = mysql_use_result(&mysql); while((row = mysql_fetch_row(result))) { // traite les donnes } if(!mysql_eof(result)) // mysql_fetch_row() failed due to an error { fprintf(stderr, "Erreur : %s\n", mysql_error(&mysql)); }
Vous pouvez reproduire la mme chose avec les fonctions d'erreurs de MySQL :
mysql_query(&mysql,"SELECT * FROM une_table"); result = mysql_use_result(&mysql); while((row = mysql_fetch_row(result))) { // traite les donnes } if(mysql_errno(&mysql)) // mysql_fetch_row() ne marche pas cause d'une erreur { fprintf(stderr, "Erreur : %s\n", mysql_error(&mysql)); }
24.2.3.12. mysql_errno()
unsigned int mysql_errno(MYSQL *mysql) Description Pour la connexion spcifie par mysql, mysql_errno() retourne le code de l'erreur pour l'appel le plus rcent une fonction de l'API qui peut russir ou chouer. Un zro en valeur de retour signifie qu'aucune erreur ne s'est produite. Les codes erreur du client sont lists dans le fichier d'entte MySQL (errmsg.h). Les codes erreur du serveur sont lists dans le fichier mysqld_error.h. Dans les sources de la distribution MySQL vous pouvez trouver la liste complte des messages d'erreur et le code qui leur est associ dans le fichier Docs/mysqld_error.txt. Les codes d'erreur serveurs sont lists dans Chapitre 26, Gestion des erreurs avec MySQL. Notez que certaines fonctions comme mysql_fetch_row() ne donne pas de valeur mysql_errno() si elles russissent. En gnral, les fonctions qui doivent interroger le serveur pour obtenir des informations vont remettre zro mysql_errno() si elles russisent. Valeur de retour Un code d'erreur. Zro si aucune erreur n'est survenue. Erreurs
924
Aucune.
24.2.3.13. mysql_error()
char *mysql_error(MYSQL *mysql) Description Pour la connexion spcifie par mysql, mysql_error() retourne le message d'erreur pour l'appel le plus rcent une fonction de l'API qui peut russir ou chouer. Une chane vide ("") est retourne si aucune erreur n'est survenue. Cela signifie que les deux tests suivants sont quivalents :
if(mysql_errno(&mysql)) { // une erreur est survenue } if(mysql_error(&mysql)[0] != '\0') { // une erreur est survenue }
La langue des messages d'erreurs peut tre change en recompilant la bibliothque du client MySQL. Actuellement, vous pouvez choisir les messages d'erreur parmi un choix de plusieurs langues. See Section 5.8.2, Langue des messages d'erreurs . Valeur de retour Une chane de caractres qui dcrit l'erreur. Une chane vide si aucune erreur n'est survenue. Erreurs Aucune.
24.2.3.14. mysql_escape_string()
Vous devez utiliser la fonction mysql_real_escape_string() la place de celle ci ! Cette fonction est identique mysql_real_escape_string() l'exception faite que mysql_real_escape_string() prends deux identifiants de connexion comme premiers arguments et chappe la chane en se basant que le jeu de caractres courant. mysql_escape_string() ne prends pas d'identifiant de connexion et ne respecte pas le jeu de caractres courant.
24.2.3.15. mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result) Description Retourne la dfinition d'une colonne d'un jeu de rsultats en tant que structure MYSQL_FIELD. Appelez cette fonction plusieurs fois pour obtenir des informations propos de toutes les colonnes dans le jeu de rsultat. mysql_fetch_field() retourne NULL quand il ne reste plus de champs. mysql_fetch_field() est mis zro pour retourner des informations propos du premier champ chaque fois que vous excutez une nouvelle requte SELECT. Le champ retourn par mysql_fetch_field() est aussi affect par les appels mysql_field_seek(). Si vous avez appel mysql_query() pour excuter un SELECT sur une table mais n'avez pas appel mysql_store_result(), MySQL retourne la longueur par dfaut du BLOB (8 ko octets) si vous avez appel mysql_fetch_field() pour obtenir la longueur d'un champ BLOB. (La taille 8K est choisie car MySQL ne connat pas la longueur maximale du BLOB. Cela devrait tre un jour paramtrable.) Une fois que vous avez rcupr le jeu de rsultats, field->max_length contient la longueur de la plus grande valeur de cette colonne dans la requte spcifie.
925
Valeur de retour La structure MYSQL_FIELD de la colonne courante. NULL s'il ne reste plus de colonnes. Erreurs Aucune. Exemple
MYSQL_FIELD *field; while((field = mysql_fetch_field(result))) { printf("nom du champ : %s\n", field->name); }
24.2.3.16. mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) Description Retourne un tableau de toutes les structures MYSQL_FIELD dans un jeu de rsultats. Chaque structure fournit la dfinition de champ d'une colonne dans le jeu de rsultats. Valeur de retour Un tableau de structures MYSQL_FIELD pour toutes les colonnes dans le jeu de rsultat. Erreurs Aucune. Exemple
unsigned int num_fields; unsigned int i; MYSQL_FIELD *fields; num_fields = mysql_num_fields(result); fields = mysql_fetch_fields(result); for(i = 0; i < num_fields; i++) { printf("Le champ %u est %s\n", i, fields[i].name); }
24.2.3.17. mysql_fetch_field_direct()
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr) Description Etant donn un numro de champ fieldnr pour une colonne dans un jeu de rsultats, cette fonction retourne la dfinition de ce champ en tant que structure MYSQL_FIELD. Vous pouvez utiliser cette fonction pour obtenir la dfinition d'une colonne choisie arbitrairement. La valeur de fieldnr doit varier entre 0 et mysql_num_fields(result)-1. Valeur de retour La structure MYSQL_FIELD pour la colonne spcifie. Erreurs Aucune.
926
Exemple
unsigned int num_fields; unsigned int i; MYSQL_FIELD *field; num_fields = mysql_num_fields(result); for(i = 0; i < num_fields; i++) { field = mysql_fetch_field_direct(result, i); printf("La champ %u est %s\n", i, field->name); }
24.2.3.18. mysql_fetch_lengths()
unsigned long *mysql_fetch_lengths(MYSQL_RES *result) Description Retourne les longueurs des colonnes de la ligne courante dans le jeu de rsultats. Si vous voulez copier les valeurs des champs, cette information sur la longueur est trs utile pour l'optimisation, car vous pouvez viter les appels strlen(). De plus, si le jeu de rsultat contient des donnes binaires, vous devez cette fonction pour dterminer la longueur des donnes, car strlen() retourne des rsultats incorrects pour les champs contenant des caractres nuls. La longueur des colonnes vides et des colonnes contenant la valeur NULL est zro. Pour savoir comment distinguer ces cas, voyez la description de mysql_fetch_row(). Valeur de retour Un tableau d'entiers longs non-signs reprsentant la taille de chaque colonne (n'incluant pas la caractre nul de terminaison). NULL si une erreur se produit. Erreurs mysql_fetch_lengths() n'st valide que pour la ligne courante du jeu de rsultats. Cette fonction retourne NULL si vous l'appelez avant d'appeler mysql_fetch_row() ou aprs avoir rcupr toutes les lignes du rsultat. Exemple
MYSQL_ROW row; unsigned long *lengths; unsigned int num_fields; unsigned int i; row = mysql_fetch_row(result); if (row) { num_fields = mysql_num_fields(result); lengths = mysql_fetch_lengths(result); for(i = 0; i < num_fields; i++) { printf("La colonne %u a %l octets de longueur.\n", i, lengths[i]); } }
24.2.3.19. mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) Description Rcupre la ligne suivante d'un jeu de rsultats. Lorsqu'elle est utilise aprs mysql_store_result(), mysql_fetch_row() retourne NULL quand il n'y a plus de lignes a
927
rcuprer. Lorsqu'elle est utilise aprs mysql_use_result(), mysql_fetch_row() retourne NULL quand il n'y a plus de lignes a rcuprer ou qu'une erreur est rencontre. Le nombre de valeurs dans la ligne est donn par mysql_num_fields(result). Si row contient la valeur de retour d'un appel mysql_fetch_row(), les pointeurs sur les valeurs sont accdes de row[0] row[mysql_num_fields(result)-1]. Les valeurs NULL de la ligne sont indiques par des pointeurs NULL. La longueur de la valeur du champ dans la ligne peut tre obtenue en appelant mysql_fetch_lengths(). Les champs vides et les champs contenant NULL ont tous deux une longueur gale zro; vous pouvez les distinguer en vrifiant le pointeur sur la valeur du champ. Si le pointeur est NULL, le champ est NULL; sinon, le champ est vide. Valeur de retour Une structure MYSQL_ROW pour la prochaine ligne. NULL s'il n'y a plus de lignes a rcuprer ou qu'une erreur survient. Erreurs CR_SERVER_LOST La connexion au serveur a t perdue durant la requte. CR_UNKNOWN_ERROR Une erreur inconnue est survenue. Exemple
MYSQL_ROW row; unsigned int num_fields; unsigned int i; num_fields = mysql_num_fields(result); while ((row = mysql_fetch_row(result))) { unsigned long *lengths; lengths = mysql_fetch_lengths(result); for(i = 0; i < num_fields; i++) { printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL"); } printf("\n"); }
24.2.3.20. mysql_field_count()
unsigned int mysql_field_count(MYSQL *mysql) Si vous utilisez une version de MySQL plus ancienne que la 3.22.24, vous devez utiliser unsigned int mysql_num_fields(MYSQL *mysql). Description Retourne le nombre de colonnes pour la requte la plus rcente de la connexion. L'utilisation normale de cette fonction est lorsque mysql_store_result() a retourn NULL (et que vous n'avez donc pas de pointeur sur jeu de rsultats). Dans ce cas, vous pouvez appeler mysql_field_count() pour dterminer si mysql_store_result() aurait d produire un rsultat non-vide. Cela permet au programme client d'entreprendre les bonnes actions sans savoir si la requte tait un SELECT (ou quivalent). L'exemple suivant illustre comment cela peut tre fait. See Section 24.2.13.1, Pourquoi est-ce que mysql_store_result() retourne parfois NULL aprs que mysql_query() ait russi .
928
Valeur de retour Un entier non-sign reprsentant le nombre de champs dans un jeu de rsultats. Erreurs Aucune. Exemple
MYSQL_RES *result; unsigned int num_fields; unsigned int num_rows; if (mysql_query(&mysql,query_string)) { // erreur } else // requte bonne, traitons les donnes qu'elle renvoit { result = mysql_store_result(&mysql); if (result) // il y a des lignes { num_fields = mysql_num_fields(result); // rcupre les lignes, puis appele mysql_free_result(result) } else // mysql_store_result() n'a rien retourn; est-ce normal ? { if(mysql_field_count(&mysql) == 0) { // la requte ne retourne aucune donne // (ce n'tait pas un SELECT) num_rows = mysql_affected_rows(&mysql); } else // mysql_store_result() aurait du retourner des donnes { fprintf(stderr, "Erreur : %s\n", mysql_error(&mysql)); } } }
Une alternative est de remplacer l'appel mysql_field_count(&mysql) par mysql_errno(&mysql). Dans ce cas, vous vrifiez directement les erreurs partir de mysql_store_result() plutt qu' partir de mysql_field_count() si la requte tait un SELECT.
24.2.3.21. mysql_field_seek()
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset) Description Place le pointeur de champs la position donne. Le prochain appel mysql_fetch_field() rcuprera la dfinition du champ de la colonne associe cet index. Pour vous placer au dbut d'une ligne, passez 0 comme valeur d'offset. Valeur de retour La dernire valeur de l'index de champ. Erreurs Aucune.
24.2.3.22. mysql_field_tell()
929
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result) Description Retourne la position du curseur de champ utilis pour le dernier appel mysql_fetch_field(). Cette valeur peut tre utilise en argument de mysql_field_seek(). Valeur de retour L'indice courant du curseur de champ. Erreurs Aucune.
24.2.3.23. mysql_free_result()
void mysql_free_result(MYSQL_RES *result) Description Libre la mmoire allou un rsultat avec mysql_store_result(), mysql_use_result(), mysql_list_dbs(), etc. Quand vous n'avez plus besoin d'un jeu de rsultat, vous devez librer la mmoire qu'il occupe en appelant mysql_free_result(). Valeur de retour Aucune. Erreurs Aucune.
24.2.3.24. mysql_get_client_info()
char *mysql_get_client_info(void) Description Retourne une chane reprsentant la version de la bibliothque du client. Valeur de retour Une chane de caractres reprsentant la version de la bibliothque du client. Erreurs Aucune.
24.2.3.25. mysql_get_client_version()
unsigned long mysql_get_client_version(void) Description Retourne un entier qui reprsente la version de la bibliothque cliente. Cette valeur est au format XYYZZ o X est la version majeure, YY est la version publie, et ZZ est le numro de version de la version publie. Par exemple, la valeur 40102 reprsente la version 4.1.2. Valeur retourne Un entier qui reprsente la version de la bibliothque cliente MySQL.
930
Erreurs Aucune.
24.2.3.26. mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql) Description Retourne une chane de caractres dcrivant le type de connexion actuellement utilis, incluant le nom du serveur. Valeur de retour Une chane de caractres reprsentant le nom du serveur et le type de connexion. Erreurs Aucune.
24.2.3.27. mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql) Description Retourne la version du protocole utilis par la connexion courante. Valeur de retour Un entier non sign reprsentant la version du protocole utilis par la connexion courante. Erreurs Aucune.
24.2.3.28. mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql) Description Retourne une chane reprsentant le numro de version du serveur. Valeur de retour Une chane de caractres reprsentant le numro de version du serveur. Erreurs Aucune.
24.2.3.29. mysql_get_server_version()
unsigned long mysql_get_server_version(MYSQL *mysql) Description Retourne le numro de version du serveur, sous la forme d'un entier (nouveau en 4.1). Valeurs retournes
931
Par exemple, 4.1.0 est retourne comme ceci : 40100. Ceci est pratique pour dterminer rapidement le numro de version d'un serveur, dans un client, et connatre ainsi ses fonctionnalits. Erreurs Aucune.
24.2.3.30. mysql_hex_string()
unsigned long mysql_hex_string(char *to, const char *from, unsigned long length) Description Cette fonction sert crer une chane SQL valide que vous pouvez utiliser dans une requte SQL. See Section 9.1.1, Chanes . La chane de l'argument from est encode au format hexadcimal, et chaque caractre prend alors deux chiffres hexadcimaux. Le rsultat est plac dans le paramtre to et un caractre nul termine la chane. La chane pointe par from doit faire length octets de long. Vous devez allouer le buffer to au moins longueur * 2 + 1 de long. Lorsque mysql_hex_string() se termine, le contenu de to est une chane termine par un caractre nul. La valeur de retour est la taille de la chane encode, sans compter le caractre nul. La valeur retourne peut tre place dans une commande SQL en utilisant le format 0xvalue ou X'value'. Cependant, la valeur de retour n'inclut pas les lments de syntaxe 0x ou X'...'. Le code appelant doit fournir les lments dont il a besoin. mysql_hex_string() a t ajout en MySQL 4.0.23 et 4.1.8. Exemple
char query[1000],*end; end = strmov(query,"INSERT INTO test_table values("); end = strmov(end,"0x"); end += mysql_hex_string(end,"What's this",11); end = strmov(end,",0x"); end += mysql_hex_string(end,"binary data: \0\r\n",16); *end++ = ')'; if (mysql_real_query(&mysql,query,(unsigned int) (end - query))) { fprintf(stderr, "Failed to insert row, Error: %s\n", mysql_error(&mysql)); }
La fonction strmov() utilise dans l'exemple est incluse dans la bibliothque cliente mysqlclient et fonctionne comme strcpy() mais retourne un pointeur sur le caractre nul final du premier paramtre. Valeur retourne La taille de la valeur place dans to, hormis le caractre nul final. Erreurs
932
Aucune.
24.2.3.31. mysql_info()
char *mysql_info(MYSQL *mysql) Description Rcupre une chane de caractres fournissant des informations propos de la requte excute le plus rcemment, mais seulement pour celles listes ici. Pour les autres requtes, mysql_info() retournera NULL. Le format de la chane varie selon le type de requte, comme dcrit ici. Les nombres prsents sont des exemples; la chane retourne contiendra les informations correspondantes vos requtes. INSERT INTO ... SELECT ... Chane retourne : Records: 100 Duplicates: 0 Warnings: 0 INSERT INTO ... VALUES (...),(...),(...)... Chane retourne : Records: 3 Duplicates: 0 Warnings: 0 LOAD DATA INFILE ... Chane retourne : Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 ALTER TABLE Chane retourne : Records: 3 Duplicates: 0 Warnings: 0 UPDATE Chane retourne : Rows matched: 40 Changed: 40 Warnings: 0 Notez que mysql_info() retourne une valeur non-nulle (NULL) pour les requtes INSERT ... VALUES seulement si une liste de valeurs multiples est fournie la requte. Valeur de retour Une chane de caractres reprsentant des informations additionnelles propos de la dernire requte excute. NULL si aucune information n'est disponible pour la requte. Erreurs Aucune.
24.2.3.32. mysql_init()
MYSQL *mysql_init(MYSQL *mysql) Description Alloue ou initialise un objet MYSQL convenable pour mysql_real_connect(). Si mysql est un pointeur NULL, la fonction alloue, initialise et retourne un nouvel objet. Sinon, l'objet est initialis et son adresse est retourne. Si mysql_init() alloue un nouvel objet, il sera libr quand mysql_close() sera appele pour clore la connexion. Valeur de retour Un gestionnaire MYSQL* initialis. NULL s'il n'y avait pas assez de mmoire pour allouer le nouvel objet.
933
24.2.3.33. mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql) Description Retourne l'identifiant gnr pour une colonne AUTO_INCREMENT par la dernire requte. Utilisez cette commande aprs avoir excut une requte INSERT sur une table qui contient un champ AUTO_INCREMENT. Plus prcisment, mysql_insert_id() est mis jour dans ces conditions : Les commandes INSERT qui stockent une valeur dans une colonne de type AUTO_INCREMENT. C'est vrai si la valeur est automatiquement gnre suivant le stockage de NULL ou 0 dans la colonne, ou une valeur explicite non-spciale. Dans le cas des INSERT multiples, mysql_insert_id() retourne la premire valeur AUTO_INCREMENT automatiquement gnre : si aucune valeur n'est gnre, elle retourne la dernire valeur explicitement insre dans la colonne AUTO_INCREMENT. Les commandes INSERT qui gnre une valeur AUTO_INCREMENT en insrant l'expression LAST_INSERT_ID(expr) dans une colonne. Les commandes INSERT qui gnrent une valeur AUTO_INCREMENT qui donne la valeur de LAST_INSERT_ID(expr) une colonne. La valeur de mysql_insert_id() n'est pas affecte par les commandes telles que les commandes SELECT qui ne retournent pas de rsultat. Si la commande prcdent a retourn une erreur, la valeur de mysql_insert_id() est indfinie. Notez que mysql_insert_id() retourne 0 si la dernire requte n'a pas gnr de valeur AUTO_INCREMENT. Si vous voulez garder cette valeur pour plus tard, assurez vous d'appeler mysql_insert_id() immdiatement aprs la requte ayant gnr cette valeur. mysql_insert_id() est mis jour aprs l'excution de requtes INSERT et UPDATE qui gnrent une valeur AUTO_INCREMENT ou qui dfinissent la valeur d'une colonne LAST_INSERT_ID(expr). See Section 12.8.4, Fonctions diverses . Notez aussi que la valeur de retour de la fonction SQL LAST_INSERT_ID() contient toujours la valeur d'AUTO_INCREMENT la plus jour. Cette valeur n'est pas remise zro lors de l'excution d'autre requtes car elle est maintenue pour le serveur. Valeur de retour La valeur de la colonne AUTO_INCREMENT qui a t mise jour par la dernire requte. Retourne zro si aucune requte n'avait eu lieu durant la connexion, ou si la dernire requte n'a pas mis jour la valeur de la colonne AUTO_INCREMENT. Erreurs Aucune.
24.2.3.34. mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid) Description
934
Demande au serveur de terminer le thread spcifi par pid. Valeur de retour Zro si la commande a t effectue avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.35. mysql_library_end()
int mysql_library_init(int argc, char **argv, char **groups) Description Ceci est un synonyme de la fonction mysql_server_init(). Il a t ajout en MySQL 4.1.10 et 5.0.3. Voyez Section 24.2.2, Vue d'ensemble des fonctions de l'API C pour connatre son utilisation.
24.2.3.36. mysql_library_end()
void mysql_library_end(void) Description Ceci est un synonyme de la fonction mysql_server_end(). Il a t ajout en MySQL 4.1.10 et 5.0.3. Voyez Section 24.2.2, Vue d'ensemble des fonctions de l'API C pour connatre son utilisation.
24.2.3.37. mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild) Description Retourne une jeu de rsultats se composant des noms des bases de donnes localises sur le serveur qui correspondent l'expression rgulire spcifi par le paramtre wild. wild peut contenir les caractres spciaux % ou _, ou peut tre un pointeur NULL pour obtenir la liste de toutes les bases de donnes. Utiliser mysql_list_dbs() reviens excuter la requte SHOW databases [LIKE wild]. Vous devez librer le rsultat avec mysql_free_result(). Valeur de retour Un jeu de rsultats MYSQL_RES en cas de succs. NULL si une erreur est survenue.
935
Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_OUT_OF_MEMORY Plus de mmoire. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.38. mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) Description Retourne un jeu de rsultats consistant des noms de champs dans une table qui correspondent l'expression rgulire simple spcifie par la paramtre wild. wild peut contenir les caractres spciaux % ou _, ou peut tre un pointeur NULL pour correspondre tous les champs. Utiliser mysql_list_fields() revient excuter la requte SHOW COLUMNS FROM nom_de_table [LIKE wild]. Notez qu'il est recommand d'utiliser SHOW COLUMNS FROM nom_de_table au lieu de /mysql_list_fields(). Vous devez librer le rsultat avec mysql_free_result(). Valeur de retour Un jeu de rsultats MYSQL_RES en cas de succs. NULL sinon. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.39. mysql_list_processes()
936
MYSQL_RES *mysql_list_processes(MYSQL *mysql) Description Retourne un jeu de rsultat dcrivant les threads courants du serveur. C'est le mme genre d'informations renvoy par mysqladmin processlist ou une requte SHOW PROCESSLIST. Vous devez librer le jeu de rsultat avec mysql_free_result(). Valeur de retour Un jeu de rsultat MYSQL_RES en cas de succs. NULL si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.40. mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild) Description Retourne un jeu de rsultats consistant des noms de tables dans la base de donnes courante qui concordent avec l'expression rgulire spcifi par le paramtre wild. wild peut contenir les caractres spciaux % ou _, ou peut tre un pointeur NULL pour obtenir toutes les tables. Faire appel mysql_list_tables() revient excuter la requte SHOW tables [LIKE wild]. Vous devez librer le jeu de rsultats avec mysql_free_result(). Valeur de retour Un jeu d'enregistrements MYSQL_RES en cas de succs. NULL en cas d'erreurs. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR
937
24.2.3.41. mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result) ou unsigned int mysql_num_fields(MYSQL *mysql) La seconde forme ne fonctionne plus partir de la version 3.22.24 de MySQL. Pour passer un argument MYSQL*, vous devez utiliser la fonction unsigned int mysql_field_count(MYSQL *mysql) la place. Description Retourne le nombre de colonnes dans un jeu de rsultats. Notez que vous pouvez obtenir le nombre de colonnes soit partir d'un pointeur sur rsultat, soit d'un pointeur de connexion. Vous utiliserez le pointeur de connexion si mysql_store_result() ou mysql_use_result() ont retourns NULL (et que donc, vous n'avez pas de pointeur sur rsultat). Dans ce cas, vous pouvez appeler mysql_field_count() pour dterminer si mysql_store_result() aurait du retourner un rsultat non-vide. Cela permet au client d'effectuer les bonnes actions sans savoir si la requte tait un SELECT (ou quivalent). L'exemple ci-dessous montre comment cela doit tre utilis. See Section 24.2.13.1, Pourquoi est-ce que mysql_store_result() retourne parfois NULL aprs que mysql_query() ait russi . Valeur de retour Un entier non-sign reprsentant le nombre de champs dans un jeu de rsultats. Erreurs Aucune. Exemple
MYSQL_RES *result; unsigned int num_fields; unsigned int num_rows; if (mysql_query(&mysql,query_string)) { // erreur } else // la requte fonctionne, on s'occupe des donnes { result = mysql_store_result(&mysql); if (result) // il y a des lignes { num_fields = mysql_num_fields(result); // recuprer les lignes, puis appeler mysql_free_result(result) } else // mysql_store_result() n'a rien retourn ! pourquoi ? { if (mysql_errno(&mysql)) { fprintf(stderr, "Erreur : %s\n", mysql_error(&mysql)); } else if (mysql_field_count(&mysql) == 0) { // la requte ne retourne pas de donnes // (ce n'etait pas un SELECT)
938
num_rows = mysql_affected_rows(&mysql); } } }
Une alternative (si vous savez que votre requte aurait du retourner des rsultats) est de remplacer l'appel mysql_errno(&mysql) par un test sur la nullit de mysql_field_count(&mysql). Cela n'arrive que si un problme a t rencontr.
24.2.3.42. mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result) Description Retourne le nombre de lignes prsentes dans le rsultat. L'utilisation de mysql_num_rows() dpend de si vous utilisez mysql_store_result() ou mysql_use_result() pour retourner le jeu rsultat. Si vous utilisez mysql_store_result(), mysql_num_rows() peut tre appel immdiatement. Si vous utilisez mysql_use_result(), mysql_num_rows() ne retournera pas la valeur correcte tant que toutes les lignes du rsultat n'auront pas t rcupres. Valeur de retour Le nombre de lignes dans le rsultat. Erreurs Aucune.
24.2.3.43. mysql_options()
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg) Description Cette fonction peut tre utilise pour spcifier des options de connexion et modifier le comportement de la session courante. Cette fonction peut tre appele plusieurs fois pour dfinir plusieurs options. mysql_options() doit tre appele aprs mysql_init() et avant mysql_connect() ou mysql_real_connect(). L'argument option est l'option que vous voulez configurer; l'argument arg est la valeur pour cette option. Si l'option est un entier, arg doit pointer sur la valeur d'un entier. Les valeurs possibles pour les options sont : Option MYSQL_OPT_CONNECT_TIMEOUT MYSQL_OPT_READ_TIMEOUT Type de l'argument Fonction
unsigned int * Dlai d'inactivit maximal permis. unsigned int * Dlai d'expiration pour les lectures depuis le serveur (fonctionne uniquement sur Windows sur les connexions TCP/IP) unsigned int * Dlai pour les critures sur le serveur (fonctionne uniquement sur Windows sur les connexions TCP/IP) Non utilis Utiliser le protocole compress client/ serveur.
MYSQL_OPT_WRITE_TIMEOUT
MYSQL_OPT_COMPRESS
939
MYSQL_OPT_LOCAL_INFILE
Si aucun pointeur n'est donn, ou que celui-ci pointe sur un unsigned int != 0 la commande LOAD LOCAL INFILE est active. Utiliser les pipes nomms pour se connecter au serveur MySQL sur NT. Commande excuter lors de la connexion au serveur MySQL. Sera automatiquement re-excute lors des reconnexions. Lit les options partir du fichier d'options nomm plutt que de my.cnf. Lit les options partir du groupe spcifi dans le fichier d'options my.cnfou le fichier spcifi par MYSQL_READ_DEFAULT_FILE.
MYSQL_OPT_NAMED_PIPE MYSQL_INIT_COMMAND
MYSQL_READ_DEFAULT_FILE
char *
MYSQL_READ_DEFAULT_GROUP
char *
MYSQL_OPT_PROTOCOL
unsigned int * Type de protocole utiliser. Doit tre une des valeurs de mysql_protocol_type dfinies dans mysql.h. char* Nom d'un objet de mmoire partage pour communiquer avec le serveur. Doit tre le mme que l'option shared-memory-base-name utilis pour le serveur mysqld auquel vous voulez vous connecter.
MYSQL_SHARED_MEMORY_BASE_NAME
Notez que le groupe client est toujours lu si vous utilisez MYSQL_READ_DEFAULT_FILE ou MYSQL_READ_DEFAULT_GROUP. Le groupe spcifi dans le fichier des options peut contenir les options suivantes : Option connect-timeout compress database debug disable-local-infile host init-command interactive-timeout Description Dlai d'inactivit maximal permis en secondes. Sous Linux, ce dlai est aussi utilis lors de l'attente de la premire rponse du serveur. Utiliser le protocole compress client/serveur. Se connecter cette base de donnes si aucune base n'a t slectionne la connexion. Options de dbogage. Interdit l'utilisation de LOAD DATA LOCAL. Nom d'hte par dfaut. Commande lors de la connexion au serveur MySQL. Sera automatiquement re-excute lors des reconnexions. Revient spcifier CLIENT_INTERACTIVE mysql_real_connect(). See Section 24.2.3.46, mysql_real_connect() . Si aucun argument, ou argument != 0, on permet alors l'utilisation de LOAD DATA LOCAL. Taille maximale de paquet que le client peut lire du serveur. Mot de passe par dfaut.
940
pipe protocol=(TCP | SOCKET | PIPE | MEMORY) port return-found-rows shared-memory-basename=name socket user
Utiliser les tunnels nomms pour se connecter MySQL sur NT. Le protocole utilis lors de la connexion au serveur (nouveau en version 4.1). Port par dfaut. Demande mysql_info() de retourner les lignes trouves au lieu des lignes mises jour lors de l'utilisation de UPDATE. Nom de l'objet en mmoire partage utiliser pour se connecter au serveur (par dfaut, c'est "MySQL"). Nouveau en MySQL 4.1. Numro de socket par dfaut. Utilisateur par dfaut.
Notez que timeout a t remplac par connect-timeout, mais que timeout fonctionne encore pour le moment. Pour plus d'informations sur les fichiers d'options, reportez vous Section 4.3.2, Fichier d'options my.cnf . Valeur de retour Zro si la commande a t effectue avec succs. Diffrente de zro si une erreur est survenue. Exemple
MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql,MYSQL_OPT_COMPRESS,0); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc"); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)) { fprintf(stderr, "Impossible de se connecter la base de donnes. Erreur : %s\n", mysql_error(&mysql)); }
Ce qui prcde demande au client d'utiliser le protocole compress client/serveur et lit les options optionnelles de la section odbc dans le fichier my.cnf.
24.2.3.44. mysql_ping()
int mysql_ping(MYSQL *mysql) Description Vrifie si la connexion au serveur est encore assure. Si ce n'est pas le cas, une re-connexion automatique est tente. Cette fonction peut tre utilise par les clients qui restent inactifs longtemps, pour vrifier que le serveur n'a pas ferm la connexion et se re-connecter si ncessaire. Valeur de retour Zro si le serveur rpond. Autre que zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR
941
Le serveur MySQL ne rponds pas. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.45. mysql_query()
int mysql_query(MYSQL *mysql, const char *query) Description Excute la requte SQL pointe par la chane termine par null query. La requte doit se composer d'une seule opration. Vous ne devez pas ajouter de caractre de terminaison (;) ou \g la fin de la requte. mysql_query() ne peut tre utilise pour les requtes contenant des donnes bianaires, vous devez utiliser mysql_real_query() la place. (LEs donnes binaires peuvent contenir le caractre \0, qui est interprt comme la fin de la chane requte.) Si vous voulez savoir si la requte doit retourner un jeu de rsultat ou non, vous pouvez utiliser mysql_field_count() pour vrifier. See Section 24.2.3.20, mysql_field_count() . Valeur de retour Zro si la requte a t effectue avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.46. mysql_real_connect()
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) Description mysql_real_connect() essaye de se connecter une base de donnes MySQL tournant sur l'hte. mysql_real_connect() doit se terminer correctement avant que vous ne puissiez aucune autre fonction de l'API, l'exception de mysql_get_client_info(). Les paramtres sont spcifis comme suit : Le premier paramtre doit tre l'adresse d'une structure MYSQL existante. Avant d'appeler mysql_real_connect() vous devez appeler mysql_init() pour initialiser la structure MYSQL.
942
Vous pouvez changer un tas d'options de connexion en appelant mysql_options(). See Section 24.2.3.43, mysql_options() . La valeur de host peut tre un nom de domaine ou une adresse IP. Si host est NULL ou gal la chane "localhost", une connexion la machine local est essaye. Si le systme supporte les sockets (Unix) ou les tunnels nomms (Windows), elles sont utilises au lieu de TCP/IP pour se connecter au serveur. La paramtre user contient l'identifiant MySQL de l'utilisateur. Si user est NULL, l'utilisateur courant est sous-entendu. Avec Unix c'est l'utilisateur courant. Avec Windows ODBC, le nom de l'utilisateur courant doit tre spcifi explicitement. See Section 25.1.9.2, Configuration du DSN MyODBC sur Windows . La paramtre passwd contient le mot de passe de user. Si passwd est NULL, seules les entres de la table user pour l'utilisateur ayant un champ vide seront testes. Cela permet l'administrateur de mettre en place le systme de privilges MySQL de faon ce que les utilisateurs aient divers privilges selon qu'ils aient spcifi ou pas de mot de passe. Note : N'essayez pas d'encrypter le mot de passe avant l'appel mysql_real_connect(); l'encryptage du mot de passe est gre automatiquement par l'API du client. db est le nom de la base de donnes. Si db n'est pas NULL, la connexion changera la base par dfaut en cette valeur. Si port est diffrent de 0, sa valeur sera utilis comme port de connexion TCP/IP. Notez que le paramtre host dtermine le type de la connexion. Si unix_socket n'est pas NULL, la chane spcifie la socket ou le tunnel nomm utiliser. Notez que le paramtre host dtermine le type de la connexion. La valeur de client_flag est habituellement 0, mais peut tre la combinaison des options suivantes dans des circonstances trs spciales : Nom de l'option CLIENT_COMPRESS CLIENT_FOUND_ROWS CLIENT_IGNORE_SPACE CLIENT_INTERACTIVE Description Utilise le protocole compress. Retourne le nombre de lignes trouves, et non de lignes affectes. Autorise les espaces aprs les noms de fonctions. Rend tous les noms de fonctions des mots rservs. Autorise interactive_timeout secondes (au lieu de wait_timeout secondes) d'innactivit avant de fermer la connexion. Active le support de LOAD DATA LOCAL.
CLIENT_LOCAL_FILES
CLIENT_MULTI_STATEMENTS Indique au serveur que le client peut envoyer des requtes multiples (spares par des ;). Si cette option n'est pas configure, les commandes multiples sont dsactives. Nouveau en 4.1. CLIENT_MULTI_RESULTS Indique au serveru que le client peut grer des jeux de rsultats multiples, issus de commandes multiples, ou de procdures stockes. C'est automatique si l'option CLIENT_MULTI_STATEMENTS est active. Nouveau en 4.1. N'autorise pas la syntaxe db_name.tbl_name.col_name. Cela est fait pour ODBC. Il fait gnrer une erreur l'analyseur si vous utilisez cette syntaxe, ce qui peut se rveler fort utile pour la chasse aux bogues dans les programmes ODBC. Le client est un client ODBC. Cela rend mysqld plus accueillant vis vis de ODBC.
CLIENT_NO_SCHEMA
CLIENT_ODBC
943
Un gestionnaire de connexion MYSQL* si la connexion a russi, NULL si elle a chou. Pour une connexion succs, la valeur de retour est la mme que la valeur du premier paramtre. Erreurs CR_CONN_HOST_ERROR Impossible de se connecter au serveur MySQL. CR_CONNECTION_ERROR Impossible de se connecter au serveur MySQL local. CR_IPSOCK_ERROR Impossible de crer une socket IP. CR_OUT_OF_MEMORY Plus de mmoire. CR_SOCKET_CREATE_ERROR Impossible de crer une socket UNIX. CR_UNKNOWN_HOST Impossible de trouver l'adresse IP de l'hte. CR_VERSION_ERROR Une disparit de protocole a rsult de la tentative de connexion un serveur avec une bibliothque de client qui utilise une version diffrente du protocole. Cela peut arriver si vous utilisez une trs vieille bibliothque cliente pour vous connecter un serveur qui n'a pas t dmarr avec l'option -old-protocol. CR_NAMEDPIPEOPEN_ERROR Impossible de crer un tunnel nomm sur Windows. CR_NAMEDPIPEWAIT_ERROR Impossible d'attendre un tunnel nomm sur Windows. CR_NAMEDPIPESETSTATE_ERROR Impossible d'obtenir un gestionnaire de tunnel sur Windows. CR_SERVER_LOST Si connect_timeout > 0 et qu'il a fallu plus de connect_timeout secondes pour se connecter au serveur, ou que celui-ci n'a plus rpondu durant l'excution de init-command. Exemple
MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name"); if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
944
En utilisant mysql_options() la bibliothque MySQL lira les sections [client] et [your_prog_name] dans le fichier my.cnf ce qui assurera le bon fonctionnement de votre programme, mme si quelqu'un a configur MySQL d'une faon non-standard. Notez que pendant la connexion, mysql_real_connect() configure l'option reconnect (partie de la structure MYSQL) 1. Cette option indique, dans le cas o une requte ne peut tre excute cause d'une dconnexion, d'essayer de se reconnecter au serveur avant d'abandonner.
24.2.3.47. mysql_real_escape_string()
unsigned long mysql_real_escape_string(MYSQL *mysql, char *en, const char *de, unsigned long longueur) Description Cette fonction est utilise pour crer une requte SQL lgale que vous pouvez utiliser dans une commande SQL. See Section 9.1.1, Chanes . La string dans de est encode en chane chapp SQL, prenom en compte le jeu de caractres de la connexion. Le rsultat est plac dans en et un octet nul de terminaison est ajout la fin de celui-ci. Les caractres encods sont NUL (ASCII 0), \n, \r, \, ', ", et Ctrl-Z (see Section 9.1, Littraux : comment crire les chanes et les nombres ). (En fait, MySQL a seulement besoin que l'anti-slash et le guillemet utilis pour entourer la chane soient chapps. Cette fonction chappe les autre caractres pour les rendre plus facile lire dans les fichiers de log.) La chane pointe par de doit avoir une taille de longueur octets. Vous devez allouer l'espace de en au moins longueur*2+1 octets. (Dans le pire des cas, chaque caractre devra tre encod en utilisant deux octets, et vous avez besoin de place pour l'octet nul de terminaison.) Lorsque mysql_escape_string() retourne un rsultat, le contenu de en sera une chane termine par un caractre nul. La valeur de retour est la longueur de la chane encode, n'incluant pas le caractre nul de terminaison. Exemple
char query[1000],*end; end = strmov(query,"INSERT INTO test_table values("); *end++ = '\''; end += mysql_real_escape_string(&mysql, end,"C'est quoi a",11); *end++ = '\''; *end++ = ','; *end++ = '\''; end += mysql_real_escape_string(&mysql, end,"donne binaire : \0\r\n",16); *end++ = '\''; *end++ = ')'; if (mysql_real_query(&mysql,query,(unsigned int) (end - query))) { fprintf(stderr, "Impossible d'insrer la ligne, erreur : %s\n", mysql_error(&mysql)); }
La fonction strmov() utilise dans cet exemple est inclue dans la bibliothque mysqlclient et fonctionne comme strcpy() mais retourne un pointeur sur le nul de fin du premier paramtre. Valeur de retour La longueur de la valeur passe dans to, n'incluant pas la caractre nul de fin de chane. Erreurs
945
Aucune.
24.2.3.48. mysql_real_query()
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length) Description Excute la requte SQL pointe par query, qui doit tre une chane de caractres de length octets de longueur. La requte ne doit contenir qu'une seule commande. Vous ne devez pas ajouter de point virgule (;) ou \g la fin de la requte. Vous devez utiliser mysql_real_query() au lieu de mysql_query() pour les requtes qui continent des donnes binaires, car celles-ci peuvent contenir le caractre\0. De plus, mysql_real_query() est plus rapide que mysql_query() car elle n'invoque pas strlen() sur la chane contenant la requte. Si vous voulez savoir si la requte est cense retourner un jeu de rsultat ou non, vous pouvez utiliser mysql_field_count() pour vrifier cela. See Section 24.2.3.20, mysql_field_count() . Valeur de retour Zro si la requte a t effectue avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.49. mysql_reload()
int mysql_reload(MYSQL *mysql) Description Demande au serveur MySQL de recharger les tables de droits. L'utilisateur soit avoir les droits RELOAD. Cette fonction est dconseille. Il est prfrable d'utiliser mysql_query() pour excuter une requte FLUSH PRIVILEGES la place. Valeur retourne Zro si la commande a t effectue avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre.
946
CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.50. mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset) Description Dplace le curseur de ligne vers une ligne arbitraire dans un jeu de rsultats de requte. Cela ncessite que le jeu de rsultats contienne la totalit des lignes retourne par la requte, et donc, mysql_row_seek() ne peut tre utilise qu'en conjonction avec mysql_store_result(), et non avec mysql_use_result(). La position doit tre une valeur retourne par un appel mysql_row_tell() ou mysql_row_seek(). Cette valeur n'est pas un simple numro de ligne; si vous voulez vous dplacer dans un jeu de rsultats en utilisant le numro d'une ligne, utilisez mysql_data_seek(). Valeur de retour La position prcdente du curseur de ligne. Cette valeur peut tre passe mysql_row_seek(). Erreurs Aucune.
24.2.3.51. mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result) Description Retourne la position courante du pointeur de lignes pour le dernier appel mysql_fetch_row(). Cette valeur peut tre utilise comme argument de mysql_row_seek(). Vous ne devez utiliser mysql_row_tell() qu'aprs mysql_store_result(), et non aprs mysql_use_result(). Valeur de retour La position courante du pointeur de ligne. Erreurs Aucune.
24.2.3.52. mysql_select_db()
int mysql_select_db(MYSQL *mysql, const char *db) Description Rend la base de donnes spcifie par db la base par dfaut (courante) pour la connexion spcifie par mysql. Pour les requtes suivantes, cette base de donnes sera utilise comme rfrence pour les tables dont la base de donnes n'a pas t spcifie explicitement.
947
mysql_select_db() choue si l'utilisateur ne peut tre reconnu ayant droit d'accs la base de donnes. Valeur de retour Zro si la commande a t effectue avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.53. mysql_set_server_option()
int mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option) Description Active ou dsactive une option de connexion. Le paramtre option peut prendre l'une des valeurs suivantes : MYSQL_OPTION_MULTI_STATEMENTS_ON Active le support des commandes multiples. MYSQL_OPTION_MULTI_STATEMENTS_OFF Dsactive le support des commandes multiples. Valeur retourne Zro en cas de succes. Non nul si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes ont t excutes dans un ordre invalide. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. ER_UNKNOWN_COM_ERROR Le serveur ne supporte pas mysql_set_server_option() (ce qui peut tre le cas d'un serveur antrieur la version 4.1.1) ou le serveur ne supporte pas l'option qui a t utilise.
24.2.3.54. mysql_shutdown()
int mysql_shutdown(MYSQL *mysql)
948
Description Demande au serveur de base de donnes de se terminer. L'utilisateur connect doit avoir le droit SHUTDOWN. Valeur de retour Zro si la commande a t effectue avec succs. Diffrente de zro si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.55. mysql_sqlstate()
const char *mysql_sqlstate(MYSQL *mysql) Description Retourne une chane termine par null, contenant le code d'erreur SQLSTATE de la dernire erreur. Le code d'erreur est constitu de 5 caractres. '00000' signifie ``pas d'erreur''. Les valeurs sont spcifies par les normes ANSI SQL et ODBC. Pour une liste des valeurs possibles, voyez Chapitre 26, Gestion des erreurs avec MySQL. Notez que les erreurs MySQL ne sont pas toutes associes une erreur SQLSTATE. La valeur 'HY000' (erreur gnrale) est utilise pour ces erreurs. Cette fonction a t ajoute en MySQL 4.1.1. Valeur retourne Une chane termine par null, qui contient le code d'erreur SQLSTATE. Voir aussi See Section 24.2.3.12, mysql_errno() . See Section 24.2.3.13, mysql_error() . See Section 24.2.7.26, mysql_stmt_sqlstate() .
24.2.3.56. mysql_ssl_set()
int mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher) Description mysql_ssl_set() sert tablire des connexions scurises par SSL. Elle doit tre appele avec mysql_real_connect(). mysql_ssl_set() ne fait rien moins que le support OpenSSL est activ dans la bibliothque cliente.
949
mysql est un gestionnaire de connexion, retourn par mysql_init(). Les autres paramtre sont les suivants : key est le chemin jusqu'au fichier de cl. cert est le chemin jusqu'au fichier de certificat. ca est le chemin jusqu'au fichier d'autorit de certification. capath est le chemin jusqu'au dossier qui contient les autorits de certifications SSL reconnus, au format PEM. cipher est une liste de chiffrements autoriss avec SSL. Tous les paramtres SSL inutiliss doivent tre fournis avec la valeur NULL. Valeur retourne Cette fonction retourne toujours 0. Si la configuration SSL est incorrecte, mysql_real_connect() va retourner une erreur lors de la tentative de connexion.
24.2.3.57. mysql_stat()
char *mysql_stat(MYSQL *mysql) Description Retourne une chane de caractres contenant des informations similaires celle fournies par la commande mysqladmin status. Cela inclus le temps de fonctionnement en secondes et le nombre de threads en cours d'excution, questions, rechargement, et tables ouvertes. Valeur de retour Une chane de caractres dcrivant l'tat du serveur. NULL si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.58. mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql) Description Vous devez appeler mysql_store_result() ou mysql_use_result() pour chaque requte qui rcupre des donnes avec succs (SELECT, SHOW, DESCRIBE, EXPLAIN). Vous n'avez pas appeler mysql_store_result() ou mysql_use_result() pour d'autres requtes, mais cela ne posera pas de problmes ou ne ralentira pas vos scripts si vous appelez
950
mysql_store_result() en tout cas. Vous pouvez savoir si la requte n'a pas renvoy de rsultat en vrifiant si mysql_store_result() retourne 0 (nous verrons cela plus tard). Si vous voulez savoir si la requte devrait renvoyer un jeu de rsultats ou non, vous pouvez utiliser mysql_field_count() pour vrifier. See Section 24.2.3.20, mysql_field_count() . mysql_store_result() lit le rsultat en entier et le stocke dans le client, alloue une structure MYSQL_RES, et place le rsultat dans cette structure. mysql_store_result() retourne un pointeur nul si la requte n'a pas retourn un jeu de rsultats (si la requte tait, par exemple, un INSERT). mysql_store_result() retourne aussi un pointeur nul si la lecture partir du jeu de rsultats choue. Vous pouvez vrifier la prsence d'erreurs en regardant si mysql_error() ne retourne pas de pointeur nul, si mysql_errno() retourne <> 0, ou si mysql_field_count() retourne <> 0. Un jeu de rsultat vide est retourn si aucune ligne n'est retourne. (Un jeu de rsultats vide diffre d'un pointeur nul en tant que valeur de retour.) Une fois que vous avez appel mysql_store_result() et obtenu un rsultat qui n'est pas un pointeur nul, vous devez appeler mysql_num_rows() pour trouver combien de lignes contient le jeu de rsultats. Vous pouvez appeler mysql_fetch_row() pour rcuprer des lignes partir du jeu de rsultats, ou mysql_row_seek() et mysql_row_tell() pour obtenir ou changer la ligne courante dans le jeu de rsultats. Vous devez appeler mysql_free_result() une fois que vous n'avez plus besoin du rsultat. See Section 24.2.13.1, Pourquoi est-ce que mysql_store_result() retourne parfois NULL aprs que mysql_query() ait russi . Valeur de retour Une structure de rsultat MYSQL_RES. NULL si une erreur survient. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_OUT_OF_MEMORY Plus de mmoire. CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.59. mysql_thread_id()
unsigned long mysql_thread_id(MYSQL *mysql) Description
951
Retourne l'identifiant du thread de la connexion courante. Cette valeur peut tre utilise comme argument de mysql_kill() pour terminer ce thread. Si la connexion est perdue et que vous vous reconnectez via mysql_ping(), l'identifiant du thread changera. Cela signifie que cela ne sert rien de rcuprer l'identifiant du thread et de le sauvegarder pour l'utiliser plus tard. Vous devez le rcuprer quand vous en avez besoin. Valeur de retour L'identifiant du thread de la connexion courante. Erreurs Aucune.
24.2.3.60. mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql) Description Vous devez appeler mysql_store_result() ou mysql_use_result() pour chaque requte qui rcupre des donnes avec succs (SELECT, SHOW, DESCRIBE, EXPLAIN). mysql_use_result() initialise un jeu de rsultats mais ne l'enregistre pas dans le client comme le fait mysql_store_result(). A la place, chaque ligne doit tre rcupr manuellement l'aide de la commande mysql_fetch_row(). Cela lit le rsultat directement partir du serveur sans l'enregistrer dans une table temporaire ou un tampon local, ce qui est plus rapide et utilise moins de mmoire que mysql_store_result(). Le client n'allouera de la mmoire que pour la ligne courante et un tampon de communication qui peut aller jusqu' max_allowed_packet octets. D'une autre ct, vous ne devez pas utiliser mysql_use_result() si vous faites beaucoup de traitements pour chaque ligne ct client, ou que le rsultat est envoy un cran o l'utilisateur peut entrer ^S (arrt dfilement). Cela bloquera le serveur et empchera les autres threads de mettre jour n'importe quelle table partir de laquelle les donnes sont lues. Lors de l'utilisation de mysql_use_result(), vous devez excuter mysql_fetch_row() jusqu' ce que NULL soit retourn, sinon, les lignes non retourne seront inclues dans le jeu de rsultat de votre prochaine requte. L'API C donnera l'erreur Commands out of sync; you can't run this command now si vous oubliez de le faire ! Vous ne devez pas utiliser mysql_data_seek(), mysql_row_seek(), mysql_row_tell(), mysql_num_rows(), ou mysql_affected_rows() avec un rsultat retourn par mysql_use_result(), de mme, vous ne devez pas excuter d'autres requtes tant que la commande mysql_use_result() n'est pas termine. (Toutefois, aprs avoir rcupr toutes les lignes, mysql_num_rows() retournera correctement le nombre de lignes rcupres.) Vous devez appeler mysql_free_result() lorsque vous n'avez plus besoin du jeu de rsultats. Valeur de retour Une structure de rsultat MYSQL_RES. NULL si une erreur survient. Erreurs CR_COMMANDS_OUT_OF_SYNC Les commandes n'ont pas t excutes dans le bon ordre. CR_OUT_OF_MEMORY Plus de mmoire.
952
CR_SERVER_GONE_ERROR Le serveur MySQL ne rponds pas. CR_SERVER_LOST La connexion au serveur a t perdue au cours la requte. CR_UNKNOWN_ERROR Une erreur inconnue s'est produite.
24.2.3.61. mysql_warning_count()
unsigned int mysql_warning_count(MYSQL *mysql) Description Retourne le nombre l'alertes gnres durant l'excution de la dernire commande SQL. Disponible depuis MySQL 4.1. Valeur retourne Le nombre d'alertes. Erreurs Aucune.
24.2.3.62. mysql_commit()
my_bool mysql_commit(MYSQL *mysql) Description Valide la transaction courante. Disponible depuis MySQL 4.1 Valeurs retournes Zro si la fonction russit; non-nul si une erreur survient. Erreurs Aucune
24.2.3.63. mysql_rollback()
my_bool mysql_rollback(MYSQL *mysql) Description Annule la transaction courante. Disponible avec MySQL 4.1 Valeurs retournes Zro si l'annulation a russi, et non-nul si une erreur est survenue. Erreurs Aucune.
24.2.3.64. mysql_autocommit()
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
953
Description Active ou dsactive le mode d'auto-validation (autocommit). Si le paramtre mode vaut 1, l'autovalidation est active. Dans le cas o il vaut 0, l'auto-validation est dsactive. Disponible depuis MySQL 4.1 Valeurs retournes Zro si la fonction russit. Non nul si une erreur survient. Erreurs Aucune.
24.2.3.65. mysql_more_results()
my_bool mysql_more_results(MYSQL *mysql) Description Retourne TRUE si il y a d'autre rsultats disponibles pour la requte courante, et si l'application doit appeler mysql_next_result() pour lire ces rsultats. Disponible en MySQL 4.1 Valeurs retournes TRUE si d'autres rsultats existent. FALSE si il n'y a plus d'autres rsultats disponibles. Notez que dans la plupart des cas, vous pouvez appeler mysql_next_result() pour voir s'il existe plus d'un rsultat, et initier le prochain jeu de rsultat si c'est le cas. See Section 24.2.9, Gestion des commandes multiples avec l'interface C . See Section 24.2.3.66, mysql_next_result() . Erreurs Aucune.
24.2.3.66. mysql_next_result()
int mysql_next_result(MYSQL *mysql) Description S'il existe des rsultats disponibles, mysql_next_result() va lire la prochaine ligne, et retourne son statut l'application. Disponible depuis MySQL 4.1 Notez que vous devez appeler mysql_free_result() pour la prcdente requte, si elle retournait un jeu de rsultat. Aprs avoir appel mysql_next_result() l'tat de la connexion est le mme que si vous aviez appel mysql_real_query() pour la requte suivante. Cela signifie que vous pouvez maintenant appeler mysql_store_result(), mysql_warning_count(), mysql_affected_rows(), etc. sur la connexion. Si mysql_next_result() retourne une erreur, aucune autre commande ne pourra tre excut, et il n'y a pas d'autres rsultats lire. See Section 24.2.9, Gestion des commandes multiples avec l'interface C . Valeurs retournes Valeur retourne 0 Description Requte russie et il reste des rsultats
954
-1 >0 Erreurs
CR_COMMANDS_OUT_OF_SYNC Les commandes ont t excutes dans un ordre invalide. Par exemple, si vous n'avez pas appel mysql_use_result() avec un rsultat prcdent. CR_SERVER_GONE_ERROR Le serveur MySQL s'est teint. CR_SERVER_LOST La connexion au serveur a t perdue durant la requte. CR_UNKNOWN_ERROR Une erreur inconnue est survenue.
955
MYSQL_BIND Cette structure est utilise pour lier les paramtres avec des buffers, avec mysql_bind_param(), pour utilisation avec mysql_execute(), ainsi que pour lier les rsultats avec des buffers via mysql_bind_result()m, lors de la lecture de donnes avec mysql_fetch(). La structure MYSQL_BIND contient les membres suivants : Chacun est utilis pour la lecture et l'criture, mais leur objectifs et parfois diffrent, en fonction du sens de communication. enum enum_field_types buffer_type Le type de buffer. Les valeurs possibles pour buffer_type sont listes plus loin dans cette section. Pour l'envoi, buffer_type indique le type de valeur que vous allez fournir, lors de l'association de paramtres. Pour la rception, cela indique le type de valeur que vous pouvez lire dans le buffer de rsultat. void *buffer Pour l'envoi, c'est un pointeur sur le buffer o sont stockes les valeurs du paramtre de la requte. Pour la rception, c'est un pointeur sur la valeur retourne. Pour les types numriques, buffer pointe sur une variable avec le bon type C. Si vous associez la variable avec une colonne qui a un attribut UNSIGNED, la variable doit tre de type C unsigned. Pour les colonnes de type date, buffer doit pointer sur une structure MYSQL_TIME. Pour les caractres et les chanes binaires, buffer doit pointer sur un buffer de caractres. unsigned long buffer_length La taille de *buffer en octets. Pour les caractres et les donnes binaires C, buffer_length spcifie la taille de *buffer utiliser comme paramtre si il est utilis avec mysql_bind_param(), ou la taille lue dans le rsultat si il est utilis avec mysql_bind_result(). long *length Un pointeur sur une variable unsigned long qui indique le nombre rel d'octets stocks dans *buffer. length est utilis pour les donnes de type caractres ou binaires. Pour l'envoi de donnes, length point sur une variable unsigned long qui indique la taille des valeurs des paramtres stocks dans *buffer; cette valeur est utilise par mysql_execute(). Si length est un pointeur null, le protocole suppose que les donnes caractres ou binaires sont termines par null. Pour la lecture, mysql_fetch() place la taille de la valeur de la colonne retourne dans la variable length. length est ignore pour les valeurs numriques et temporelles, car la taille de ces valeurs sont dtermines par la valeur de buffer_type. my_bool *is_null Ce membre pointe sur une variable my_bool qui est true si la valeur est NULL, et false si elle n'est pas NULL. Pour l'envoi, donnez *is_null la valeur de true pour indiquer que la valeur que vous mettez est NULL. Pour la rception, cette valeur sera true aprs avoir lu une ligne si le rsultat est NULL. MYSQL_TIME Cette structure est utilise pour crire et lire des donnes de type DATE, TIME et TIMESTAMP, directement avec le serveur. Cela se fait en donnant au membre buffer_type d'une structure MYSQL_BIND un des types temporels, et en donnant au membre buffer un pointeur sur une structure MYSQL_TIME. La structure MYSQL_TIME contient les membres suivants :
956
unsigned int year L'anne. unsigned int month Le mois de l'anne. unsigned int day Le jour du mois. unsigned int hour L'heure du jour. unsigned int minute La minute de l'heure. unsigned int second La seconde de la minute. my_bool neg Un boolen pour indiquer que le temps est ngatif. unsigned long second_part La partie dcimale de la seconde. Ce membre est actuellement inutilis.
Seuls les membres d'une structure MYSQL_TIME qui s'appliquent une valeur sont utiliss : les lments year, month et day sont utiliss pour les types DATE, DATETIME et TIMESTAMP; les lments hour, minute et second sont utiliss pour les types TIME, DATETIME et TIMESTAMP. See Section 24.2.10, Gestion des dates et horaires avec l'interface C . La table suivante montre les valeurs permises, qui peuvent tre spcifies dans le membre buffer_type des structures MYSQL_BIND. La table montre aussi les types SQL qui correspondent chaque type de buffer_type, et, pour les types numriques et temporels, le type C correspondant. buffer_type Valeur MYSQL_TYPE_TINY MYSQL_TYPE_SHORT MYSQL_TYPE_LONG MYSQL_TYPE_LONGLONG MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE MYSQL_TYPE_TIME MYSQL_TYPE_DATE MYSQL_TYPE_DATETIME MYSQL_TYPE_TIMESTAMP MYSQL_TYPE_STRING Type SQL TINYINT SMALLINT INT BIGINT FLOAT DOUBLE TIME DATE DATETIME TIMESTAMP CHAR Type C char short int long int long long int float double MYSQL_TIME MYSQL_TIME MYSQL_TIME MYSQL_TIME
957
Des conversions implicites de type peuvent survenir dans les deux directions de communication.
mysql_stmt_bind_param() Associe un buffer avec une variable de requtes, dans une commande prpare. mysql_stmt_bind_result() Lie les buffers de l'application avec les colonnes d'un rsultat. mysql_stmt_execute() mysql_stmt_fetch() Excute une commande prpare. Lit la prochaine ligne de donnes dans le rsultat, et retourne toutes les donnes des colonnes lies.
mysql_stmt_fetch_column() Lit les donnes d'une seule colonne, dans le rsultat. mysql_stmt_result_metadata() Retourne les meta-donnes de la commande prpare, sous forme d'un jeu de rsultat. mysql_stmt_param_count() Retourne le nombre de paramtres d'une commande prpare. mysql_stmt_param_metadata() Retourne les meta-donnes des paramtres, sous forme d'un jeu de rsultat. mysql_stmt_prepare() Prpare une chane SQL pour l'excution. mysql_stmt_send_long_data() Envoie de grandes donnes par parties. mysql_stmt_affected_rows() Retourne le nombre de lignes modifies, effaces ou insre dans la dernire requte UPDATE, DELETE ou INSERT. mysql_stmt_insert_id() mysql_stmt_close() mysql_stmt_data_seek() mysql_stmt_errno() mysql_stmt_error() Retourne l'identifiant gnr par la colonne AUTO_INCREMENT de la dernire commande prpare. Libre une commande prpare de la mmoire. Se place une numro de ligne arbitraire dans un jeu de rsultat. Retourne le numro d'erreur de la dernire requte. Retourne le message d'erreur de la dernire requte. Retourne le nombre total de lignes dans un jeu de rsultat bufferis. Remet zro les buffers de la commande, sur le serveur. Se place un numro de ligne, dans un rsultat de commande, en utilisant la valeur retourne par mysql_stmt_row_tell(). Retourne la position du curseur de ligne de la commande.
mysql_stmt_free_result() Libre les ressources alloues pour la commande. mysql_stmt_num_rows() mysql_stmt_reset() mysql_stmt_row_seek() mysql_stmt_row_tell()
958
mysql_stmt_sqlstate()
Retourne le code d'erreur SQLSTATE de la dernire opration. Modifie un attribut d'une commande prpare. Lit la valeur d'un attribut d'une commande prpare.
Appelez mysql_prepare() pour prparer et initialiser la commande, puis appelez mysql_bind_param() pour fournir les donnes des paramtres, enfin appelez mysql_execute() pour excuter la requte. Vous pouvez rpter mysql_execute() en modifiant les valeurs des paramtres des buffers respectifs via mysql_bind_param(). Dans le cas o la requte est une commande SELECT, ou toute autre commande qui retourne un rsultat, alors mysql_prepare() va aussi retourner les mta donnes de rsultat sous la forme d'une structure MYSQL_RES avec mysql_prepare_result(). Vous pouvez fournir les buffers de rsultat avec mysql_bind_result(), pour que mysql_fetch() lise automatiquement les rsultats dans les buffers. Cela est fait ligne par ligne. Vous pouvez aussi envoyer le texte ou les donnes binaires au serveur en utilisant la fonction mysql_stmt_send_long_data(). See Section 24.2.7.25, mysql_stmt_send_long_data() . Une fois que l'excution de la commande est termine, elle doit tre supprime avec mysql_stmt_close pour que toute les ressources alloues soient dtruites. Etapes d'excution : Pour prparer et excuter une commande, l'application : 1. appelle mysql_prepare() et passe une chane contenant la commande SQL. Si la prparation russi, mysql_prepare() retourne un pointeur de commande valide. 2. Si la requte a un rsultat, alors mysql_prepare_result retourne les mta informations de rsultat. 3. spcifie les valeurs de tous les paramtres de mysql_bind_param. Tous les paramtres doivent tre fournis, sinon, cela gnrera une erreur, ou engendrera des rsultats inattendus. 4. appelle mysql_execute() pour excuter la requte. 5. Rpte les tapes 2 et 3 autant que ncessaire, en modifiant les valeurs des paramtres, et en excutant nouveau la commande. 6. Lie les buffers de donnes aux lignes de rsultat, si la commande gnre un rsultat, en utilisant mysql_bind_result(). 7. Lit les donnes dans les buffers, ligne par ligne, en appelant mysql_fetch() jusqu' ce qu'il n'y ait plus de lignes. Lorsque mysql_prepare() est appel, dans le protocole client/serveur MySQL : Le serveur analyse la requte et envoie le statut OK au client en lui assignant un identifiant de commande. Il renvoie aussi le nombre total de paramtres, le nombre de colonnes et des metainformations si un rsultat est attendu. La syntaxe et la smantique de la requte sont vrifis durant cet appel. Le client utilise cet identifiant de commande pour les excutions ultrieures, pour que le serveur identifie la commande dans le pool de commandes. Dsormais, le client alloue un pointeur de commande avec cet identifiant, et le retourne l'application. Lorsque mysql_execute() est appel, avec le protocole client/serveur MySQL : Le client utilise le pointeur de commande et envoie les paramtres au serveur.
959
Le serveur identifie la commande en utilisant l'identifiant, et remplace les marqueurs de paramtres par leur valeur, puis il excute la requte. Si cela conduit un rsultat, il est retourn au client, ou bien un statut OK, indiquant le nombre total de ligne affect est retourn. Lorsque mysql_fetch() est appel, dans le protocole client/serveur MySQL : Le client lit les donnes dans le paquet, ligne par ligne, et les place dans les buffers de donnes, avec les conversions ncessaires. Si le type de buffer de l'application est le mme que le type de champs, alors les conversions sont immdiates. Vous pouvez lire les codes et messages d'erreur, ansi que les codes d'erreur SQLSTATE avec les fonctions mysql_stmt_errno(), mysql_stmt_error() et mysql_stmt_sqlstate(), respectivement.
mysql_send_long_data() mysql_stmt_send_long_data() Toutes les fonctions qui utilisent une structure MYSQL_STMT sont prfixes par mysql_stmt_. De plus, en version 4.1.2, la signature de la fonction mysql_stmt_prepare() a chang en int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length). Pour crer un pointeur MYSQL_STMT, utilisez la fonction mysql_stmt_init().
24.2.7.1. mysql_stmt_affected_rows()
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt) Description Retourne le nombre total de ligne modifies par la dernire commande. Cette fonction peut tre appele immdiatement aprs la fonction mysql_execute() pour les commandes UPDATE, DELETE ou INSERT. Pour les commandes SELECT, mysql_stmt_affected() fonctionne comme mysql_num_rows(). Valeurs retournes Un entier suprieur zro indique le nombre de ligne affectes ou lues. Zro indique qu'aucune ligne n'a t modifies durant une commande UPDATE, ou qu'aucune ligne n'a vrifi la clause WHERE dans la requte, ou qu'aucune requte n'a t excut. 1 indique que la requte a retourn une erreur, ou que, pour une requte SELECT, mysql_stmt_affected_rows() a t appel avant
960
mysql_fetch(). Comme mysql_stmt_affected_rows() retourne une valeur non signe, vous pouvez surveiller la valeur 1 en analysant la valeur retourne par (my_ulonglong)-1 (ou to (my_ulonglong)~0, qui est quivalent). Erreurs Aucune. Exemple Plus une illustration de mysql_stmt_affected_rows() voyez l'exemple de Section 24.2.7.10, mysql_stmt_execute() .
24.2.7.2. mysql_stmt_attr_get()
int mysql_stmt_attr_get(MYSQL_STMT *stmt, enum enum_stmt_attr_type option, void *arg) Description Sert lire la valeur courante pour un attribut de commande. L'argument option est le nom de l'option que vous voulez lire; le pointeur arg doit pointer sur une variable qui contient la valeur de l'option. Si l'option est un entier, alors arg doit tre un pointeur. Voyez mysql_stmt_attr_set pour avoir la liste des options et leur type. See Section 24.2.7.3, mysql_stmt_attr_set() . Valeur retourne 0 si tout va bien. 1 si attr_type est inconnu. Erreurs aucune
24.2.7.3. mysql_stmt_attr_set()
int mysql_stmt_attr_set(MYSQL_STMT *stmt, enum enum_stmt_attr_type option, const void *arg) Description Sert modifier le comportement d'une commande. Cette fonction peut tre appele plusieurs fois. L'argument option est le nom de l'option que vous voulez modifier; le pointeur arg doit pointer sur une variable qui contient la valeur de l'option. Si l'option est un entier, alors arg doit tre un pointeur. Valeurs possibles pour les options : Option STMT_ATTR_UPDATE_MAX_LENGTH Type d'argument my_bool * Fonction Si la valeur est 1 : modifie les meta-donnes MYSQL_FIELD>max_length dans mysql_stmt_store_result().
961
24.2.7.4. mysql_stmt_bind_param()
my_bool mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind) Description mysql_stmt_bind_param() sert lire des donnes aux variables de requtes dans une commande SQL, prpare avec mysql_stmt_prepare(). Elle utilise les structures MYSQL_BIND pour fournir les donnes. bind est l'adresse d'un tableau de structures MYSQL_BIND. La bibliothque cliente attend un tableau contenant un lment pour chaque variable de requte ? qui est prsent dans la requte. Supposez que vous ayez prpar la commande suivante :
INSERT INTO mytbl VALUES(?,?,?)
Lorsque vous liez les paramtres, le tableau de structures MYSQL_BIND doit contenir trois lments, et peut tre dclar comme ceci :
MYSQL_BIND bind[3];
Les membres de chaque structure MYSQL_BIND doit tre configur comme dcrit dans la section Section 24.2.5, Types de donnes de l'API C . Return Values Zro, si l'association a russi. Non-nul si une erreur est survenue. Erreurs CR_INVALID_BUFFER_USE Indique si les donnes seront fournies par bloc et si le type de buffer n'est pas chane, ou binaire. CR_UNSUPPORTED_PARAM_TYPE La conversion n'est pas supporte. Eventuellement, la valeur de buffer_type est invalide, ou n'est pas d'un type support. CR_OUT_OF_MEMORY Plus de mmoire. CR_UNKNOWN_ERROR Une erreur inconnue est survenue. Exemple Pour une exemple avec mysql_stmt_bind_param(), voyez l'exemple de la fonction Section 24.2.7.10, mysql_stmt_execute() .
24.2.7.5. mysql_stmt_bind_result()
my_bool mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind) Description mysql_stmt_bind_result() is used to associate (bind) columns in the result set to data buffers and length buffers. When mysql_stmt_fetch() is called to fetch data, the MySQL client/server protocol places the data for the bound columns into the specified buffers. All columns must be bound to buffers prior to calling mysql_stmt_fetch(). bind is the address of an array of MYSQL_BIND structures. The client library expects the array to contain an element for each
962
column of the result set. Otherwise, mysql_stmt_fetch() simply ignores the data fetch. Also, the buffers should be large enough to hold the data values, because the protocol doesn't return data values in chunks. A column can be bound or rebound at any time, even after a result set has been partially retrieved. The new binding takes effect the next time mysql_stmt_fetch() is called. Suppose that an application binds the columns in a result set and calls mysql_stmt_fetch(). The client/server protocol returns data in the bound buffers. Then suppose the application binds the columns to a different set of buffers. The protocol does not place data into the newly bound buffers until the next call to mysql_stmt_fetch() occurs. To bind a column, an application calls mysql_stmt_bind_result() and passes the type, address, and the address of the length buffer. The members of each MYSQL_BIND element that should be set are described in Section 24.2.5, Types de donnes de l'API C . Return Values Zero if the bind was successful. Non-zero if an error occurred. Errors CR_UNSUPPORTED_PARAM_TYPE The conversion is not supported. Possibly the buffer_type value is illegal or is not one of the supported types. CR_OUT_OF_MEMORY Out of memory. CR_UNKNOWN_ERROR An unknown error occurred. Example For the usage of mysql_stmt_bind_result(), refer to the Example from Section 24.2.7.13, mysql_stmt_fetch() .
24.2.7.6. mysql_stmt_close()
my_bool mysql_stmt_close(MYSQL_STMT *) Description Termine la commande prpare. mysql_stmt_close() va aussi dsallouer le pointeur de commande allou par stmt. Si les rsultats de la requte courante sont en attente, ou non lus, ils seront annuls. Le prochain appel pourra donc tre excut. Valeur retourne Zro si la commande a pu tre termine. Une valeur non nulle si une erreur est survenue. Erreurs CR_SERVER_GONE_ERROR The MySQL server has gone away CR_UNKNOWN_ERROR
963
An unknown error occurred Exemple Pour une illustration de la fonction mysql_stmt_close() voyez un exemple avec Section 24.2.7.10, mysql_stmt_execute() .
24.2.7.7. mysql_stmt_data_seek()
void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset) Description Place le pointeur de rsultat une ligne arbitraire. La valeur de offset est un numro de ligne, et doit tre dans l'intervalle 0 mysql_stmt_num_rows(stmt)-1. Cette fonction impose que la structure du jeu de rsultat soit entirement tlcharge : mysql_stmt_data_seek() ne peut tre utilise qu'avec mysql_stmt_store_result(). Valeurs retournes Aucune. Erreurs Aucune.
24.2.7.8. mysql_stmt_errno()
unsigned int mysql_stmt_errno(MYSQL_STMT *stmt) Description Pour la commande spcifie par stmt, mysql_stmt_errno() retourne le code d'erreur de la plus rcente fonction d'API appele, qu'elle ait russi ou chou. Une valeur de zro indique qu'il n'y a pas eu d'erreur. Les numros d'erreurs clients sont lists dans le fichier d'enttes errmsg.h. Les messages d'erreurs serveurs sont lists dans le fichier d'enttes mysqld_error.h. Dans la distribution source de MySQLm vous pouvez trouver une liste complte des messages d'erreurs et de leur numro, dans le fichier Docs/mysqld_error.txt. Les codes d'erreur du serveur sont aussi listes dans Chapitre 26, Gestion des erreurs avec MySQL. Valeurs retournes Une valeur reprsentant un code d'erreur. Zro reprsente l'absence d'erreur. Erreurs Aucune
24.2.7.9. mysql_stmt_error()
char *mysql_stmt_error(MYSQL_STMT *stmt) Description Pour la commande spcifie par stmt, mysql_stmt_error() retourne le message d'erreur de la fonction d'API la plus rcemment appele, qu'elle ait russi ou pas. Une chane vide ("") est retourne si aucune erreur n'est survenue. Cela signifie que les instructions suivantes sont identiques :
if (mysql_stmt_errno(stmt)) { // une erreur est survenue
964
La langue utilise pour les messages d'erreurs du client MySQL peuvent tre modifies la compilation de la bibliothque cliente MySQL. Actuellement, vous pouvez choisir les message d'erreur dans plusieurs langues. Valeurs retournes Une chane de caractres qui dcrit l'erreur. Une chane vide signifie qu'il n'y a pas eu d'erreur. Erreurs Aucune
24.2.7.10. mysql_stmt_execute()
int mysql_stmt_execute(MYSQL_STMT *stmt) Description mysql_stmt_execute() excute la requte prpare, associe avec le pointeur 'stmt'. Les valeurs des marqueurs de paramtres seront envoyes au serveur durant cet appel, pour que le serveur remplace les marqueurs avec les nouvelles valeurs. Si la commande est UPDATE, DELETE ou INSERT, le nombre total de lignes changes, modifies ou insres est accessible avec la fonction mysql_stmt_affected_rows. Si la requte retourne un rsultat, alors vous devez appeler la fonction mysql_stmt_fetch() pour lire les donnes avant d'appeler tout autre fonction de traitement du rsultat. Pour plus d'informations sur comment lire les donnes binaires, voyez aussi Section 24.2.7.13, mysql_stmt_fetch() . Valeurs retournes Zro si l'excution a russi. Non-zro si une erreur est survenue. Le code d'erreur et le message peuvent tre obtenus en appelant les fonctions mysql_stmt_errno() et mysql_stmt_error(). Erreurs CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order : les commandes ont t excutes dans un ordre invalide. CR_OUT_OF_MEMORY Out of memory : plus de mmoire. CR_SERVER_GONE_ERROR The MySQL server has gone away : le serveur MySQL s'est teint. CR_SERVER_LOST The connection to the server was lost during the query : la connexion a t perdue durant la requte. CR_UNKNOWN_ERROR An unknown error occurred : une erreur inconnue est survenue. Exemple
965
/* Passe en mode d'auto commit */ mysql_autocommit(mysql, 1); if (mysql_query(mysql,"DROP TABLE IF EXISTS test_table")) { fprintf(stderr, "\n suppression de table a chou"); fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } if (mysql_query(mysql,"CREATE TABLE test_table(col1 int, col2 varchar(50), \ col3 smallint,\ col4 timestamp(14))")) { fprintf(stderr, "\n la cration de table a chou"); fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } /* Prepare une requte d'insertion de trois paramtres */ strmov(query, "INSERT INTO test_table(col1,col2,col3) values(?,?,?)"); if(!(stmt = mysql_prepare(mysql, query, strlen(query)))) { fprintf(stderr, "\n la prpartion de l\'insertion a chou"); fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } fprintf(stdout, "\n la prparation de l\'insertion a russi"); /* Lit le nombre de paramtres de la requte */ param_count= mysql_param_count(stmt); fprintf(stdout, "\n total parameters in insert: %d", param_count); if (param_count != 3) /* valide le nombre de paramtres */ { fprintf(stderr, "\n le nombre de paramtres retourn par MySQL est invalide"); exit(0); } /* Lie les donnes aux paramtres */ /* INTEGER PART */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= 0; bind[0].length= 0; /* STRING PART */ bind[1].buffer_type= MYSQL_TYPE_VAR_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= sizeof(str_data); bind[1].is_null= 0; bind[1].length= 0; /* SMALLINT PART */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null; bind[2].length= 0;
966
is_null= 0;
/* Lie les buffers */ if (mysql_bind_param(stmt, bind)) { fprintf(stderr, "\n param bind failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Spcifie les donnes */ int_data= 10; /* integer */ strcpy(str_data,"MySQL"); /* string */ /* INSERT SMALLINT data as NULL */ is_null= 1; /* Excute la requte */ if (mysql_stmt_execute(stmt)) { fprintf(stderr, "\n l\'excution 1 a chou"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Lit le nombre de lignes affectes */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, "\n total affected rows: %lld", affected_rows); if (affected_rows != 1) /* validation du nombre de lignes affectes */ { fprintf(stderr, "\n nombre de lignes affectes par MySQL invalide"); exit(0); } /* R-excute l'insertion, en modifiant les valeurs */ int_data= 1000; strcpy(str_data,"La base de donnes Open Source la plus populaire"); small_data= 1000; /* smallint */ is_null= 0; /* remet zro NULL */ /* Excute l'insertion : 2eme */ if (mysql_stmt_execute(stmt)) { fprintf(stderr, "\n la deuxime excution a chou"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Lit le nombre total de lignes affectes */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, "\n Nombre de lignes affectes : %lld", affected_rows); if (affected_rows != 1) /* valide le nombre de lignes affectes */ { fprintf(stderr, "\n Nombre de lignes affectes invalides"); exit(0); } /* Ferme la requte */ if (mysql_stmt_close(stmt)) { fprintf(stderr, "\n erreur lors de la fermeture de la commande"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Efface la table */ if (mysql_query(mysql,"DROP TABLE test_table")) { fprintf(stderr, "\n suppression de table choue");
967
fprintf(stderr, "\n %s", mysql_error(mysql)); exit(0); } fprintf(stdout, "Bravo! les commandes prpares MySQL fonctionnent!!");
Note : pour des exemples complets sur l'utilisation des commandes prpares, voyez le fichier tests/mysql_client_test.c. Ce fichier est disponible dans la distribution source de MySQL,ou dans le serveur BitKeeper.
24.2.7.11. mysql_stmt_free_result()
my_bool mysql_stmt_free_result(MYSQL_STMT *stmt) A dfinir. Description Valeur retourne Erreurs
24.2.7.12. mysql_stmt_insert_id()
my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt) Description Retourne la valeur gnre pour une colonne de type AUTO_INCREMENT par une requte prpare INSERT ou UPDATE. Utilisez cette fonction aprs avoir excut la commande INSERT sur la table qui contient la colonne AUTO_INCREMENT. Voyez Section 24.2.3.33, mysql_insert_id() pour plus de dtails. Valeurs retournes La valeur gnre puor la colonne AUTO_INCREMENT qui tait automatiquement gnre ou explicitement donne durant l'excution de la requte, ou la valeur gnre par la dernire fonction LAST_INSERT_ID(expr). La valeur retourne est indfinie si la commande n'a pas manipul de valeur AUTO_INCREMENT. Erreurs Aucune.
24.2.7.13. mysql_stmt_fetch()
int mysql_stmt_fetch(MYSQL_STMT *stmt) Description mysql_stmt_fetch() retourne la ligne suivante dans le rsultat. La fonction peut tre appele uniquement si le rsultat existe, c'est dire aprs mysql_stmt_execute() qui cre le rsultat, ou aprs mysql_stmt_store_result(), qui est appel aprs mysql_stmt_execute() pour mettre en buffer tout le rsultat. Si les lignes sont lies des buffers avec mysql_stmt_bind_result(), la fonction retourne les donnes dans ces buffers pour toutes les colonnes de la ligne en cours, et les tailles sont retournes dans le pointeur de taille. Notez que toutes les colonnes doivent tre lies par l'application avant d'appeler mysql_stmt_fetch(). Si les donnes lues contiennent la valeur NULL, alors la valeur is_null de MYSQL_BIND contiendra TRUE, 1, ou sinon, les donnes et leur longueur seront retournes dans les variables *buffer et
968
*length, bases sur le type de buffer, spcifi par l'application. Tous les nombres ont une taille fixe, liste en octet ci-dessous. La taille des types chanes dpend des donnes, comme indiqu dans data_length. Type MYSQL_TYPE_TINY MYSQL_TYPE_SHORT MYSQL_TYPE_LONG MYSQL_TYPE_LONGLONG MYSQL_TYPE_FLOAT MYSQL_TYPE_DOUBLE MYSQL_TYPE_TIME MYSQL_TYPE_DATE MYSQL_TYPE_DATETIME MYSQL_TYPE_TIMESTAMP MYSQL_TYPE_STRING MYSQL_TYPE_VAR_STRING MYSQL_TYPE_TINY_BLOB MYSQL_TYPE_BLOB MYSQL_TYPE_MEDIUM_BLOB MYSQL_TYPE_LONG_BLOB Length 1 2 4 8 4 8 sizeof(MYSQL_TIME) sizeof(MYSQL_TIME) sizeof(MYSQL_TIME) sizeof(MYSQL_TIME) data length data_length data_length data_length data_length data_length
o *data_length ne vaut rien d'autre que 'la taille relle des dones'. Valeurs retournes Return Value 0 1 Description Russi. Les donnes ont t lues, et places dans les buffers. Une erreur est survenue. Le code d'erreur et le message d'erreur sont disponibles grce aux fonctions mysql_stmt_errno() et mysql_stmt_error(). Il ne reste plus de donnes ou de lignes.
CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order : les commandes ont t excutes dans un ordre invalide. CR_OUT_OF_MEMORY Out of memory : plus de mmoire. CR_SERVER_GONE_ERROR The MySQL server has gone away : Le serveur MySQL s'est teint. CR_SERVER_LOST The connection to the server was lost during the query : la connexion au serveur a t perdue durant la requte. CR_UNKNOWN_ERROR
969
An unknown error occurred : Une erreur inconnue est survenue. CR_UNSUPPORTED_PARAM_TYPE If the buffer type is MYSQL_TYPE_DATE,DATETIME,TIME,or TIMESTAMP; and if the field type is not DATE, TIME, DATETIME or TIMESTAMP Le buffer est de type MYSQL_TYPE_DATE,DATETIME,TIME ou TIMESTAMP et le type de champs n'est pas DATE, TIME, DATETIME or TIMESTAMP. Toutes les autres erreurs de conversions non supportes sont disponibles avec mysql_bind_result(). Exemple L'exemple ci-dessous explique l'utilisation de mysql_get_metadata(), mysql_bind_result() et mysql_stmt_fetch() Cette exemple s'attend lire les deux lignes insres dans l'exemple de Section 24.2.7.10, mysql_stmt_execute() .) La variable mysql est suppose tre une connexion valide.
#define STRING_SIZE 50 #define SELECT_SAMPLE "SELECT col1, col2, col3, col4 FROM test_table" MYSQL_STMT MYSQL_BIND MYSQL_RES MYSQL_TIME unsigned long int short int char my_bool *stmt; bind[4]; *prepare_meta_result; ts; length[4]; param_count, column_count, row_count; small_data; int_data; str_data[STRING_SIZE]; is_null[4];
/* Prpare une commande SELECT pour lire les donnes dans la table test_table */ stmt = mysql_prepare(mysql, SELECT_SAMPLE, strlen(SELECT_SAMPLE)); if (!stmt) { fprintf(stderr, " mysql_prepare(), SELECT failed\n"); fprintf(stderr, " %s\n", mysql_error(mysql)); exit(0); } fprintf(stdout, " prepare, SELECT successful\n"); /* Lit le nombre de paramtrs de la commande */ param_count= mysql_param_count(stmt); fprintf(stdout, " total parameters in SELECT: %d\n", param_count); if (param_count != 0) /* validate parameter count */ { fprintf(stderr, " invalid parameter count returned by MySQL\n"); exit(0); } /* Lit les mta-donnes */ prepare_meta_result = mysql_get_metadata(stmt); if (!prepare_meta_result) { fprintf(stderr, " mysql_get_metadata(), returned no meta information\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Lit le nombre de colonnes de la requte */ column_count= mysql_num_fields(prepare_meta_result); fprintf(stdout, " total columns in SELECT statement: %d\n", column_count); if (column_count != 4) /* validate column count */ {
970
fprintf(stderr, " invalid column count returned by MySQL\n"); exit(0); } /* Excute la requte SELECT */ if (mysql_execute(stmt)) { fprintf(stderr, " mysql_execute(), failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Lie les buffers de rsultats pour les 4 colonnes avant de les lire */ /* INTEGER COLUMN */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= &is_null[0]; bind[0].length= &length[0]; /* STRING COLUMN */ bind[1].buffer_type= MYSQL_TYPE_VAR_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= STRING_SIZE; bind[1].is_null= &is_null[1]; bind[1].length= &length[1]; /* SMALLINT COLUMN */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null[2]; bind[2].length= &length[2]; /* TIMESTAMP COLUMN */ bind[3].buffer_type= MYSQL_TYPE_TIMESTAMP; bind[3].buffer= (char *)&ts; bind[3].is_null= &is_null[3]; bind[3].length= &length[3]; /* Lit les rsultats */ if (mysql_bind_result(stmt, bind)) { fprintf(stderr, " mysql_bind_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Maintenant, lis les rsultats dans les buffers */ if (mysql_stmt_store_result(stmt)) { fprintf(stderr, " mysql_stmt_store_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Lit toutes les lignes */ row_count= 0; fprintf(stdout, "Fetching results ...\n"); while (!mysql_stmt_fetch(stmt)) { row_count++; fprintf(stdout, " row %d\n", row_count); /* colonne 1 */ fprintf(stdout, " column1 (integer) : "); if (is_null[0]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", int_data, length[0]); /* colonne 2 */ fprintf(stdout, "
column2 (string)
: ");
971
if (is_null[1]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %s(%ld)\n", str_data, length[1]); /* colonne 3 */ fprintf(stdout, " column3 (smallint) : "); if (is_null[2]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", small_data, length[2]); /* colonne 4 */ fprintf(stdout, " column4 (timestamp): "); if (is_null[3]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %04d-%02d-%02d %02d:%02d:%02d (%ld)\n", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, length[3]); fprintf(stdout, "\n"); } /* Valide la ligne lue */ fprintf(stdout, " total rows fetched: %d\n", row_count); if (row_count != 2) { fprintf(stderr, " MySQL failed to return all rows\n"); exit(0); } /* Libre les mta-donnes de rsultat */ mysql_free_result(prepare_meta_result);
/* Ferme la commande */ if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); }
24.2.7.14. mysql_stmt_fetch_column()
int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind, unsigned int column, unsigned long offset) A dfinir. Description Valeur retourne Erreurs
24.2.7.15. mysql_stmt_field_count()
unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt) Description Retourne le nombre de colonnes de la commande excute la plus rcente. Cette valeur vaudra zro pour les commandes, telles que INSERT ou DELETE, qui n'ont pas produit de rsultat. mysql_stmt_field_count() peut tre appel aprs la prparation de la commande avec mysql_stmt_prepare().
972
Cette fonction a t ajoute en MySQL 4.1.3. Valeurs retournes Un entier non sign, reprsentant le nombre de colonne, si un jeu de rsultats existe. Erreurs Aucune.
24.2.7.16. mysql_stmt_init()
MYSQL_STMT *mysql_stmt_init(MYSQL *mysql) Description Cre une structure MYSQL_STMT. Valeur retournes Un pointeur sur une structure MYSQL_STMT en cas de succs. NULL s'il n'y a plus de mmoire. Erreurs CR_OUT_OF_MEMORY Out of memory : plus de mmoire.
24.2.7.17. mysql_stmt_num_rows()
my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt) Description Retourne le nombre de lignes dans le jeu de rsultat. L'utilisation de mysql_stmt_num_rows() dpend du fait que vous avez utilis ou non mysql_stmt_store_result() pour rapatrier l'intgralit du rsultat dans le client. Si vous utilisez mysql_stmt_store_result(), mysql_stmt_num_rows() peut tre appel immdiamtement. Valeur retourne Le nombre de lignes dans le jeu de rsultat. Erreurs Aucun.
24.2.7.18. mysql_stmt_param_count()
unsigned long mysql_stmt_param_count(MYSQL_STMT *stmt) Description Retourne le nombre de marqueurs de paramtres prsents dans la requte prpare. Valeurs retournes Un entier non sign, reprsentant le nombre de paramtres dans la requte.
973
Erreurs Aucune. Exemple Pour une illustration de la fonction mysql_stmt_param_count(), voyez l'exemple de la fonction Section 24.2.7.10, mysql_stmt_execute() .
24.2.7.19. mysql_stmt_param_metadata()
MYSQL_RES *mysql_stmt_param_metadata(MYSQL_STMT *stmt) A dfinir. Description Valeurs retournes Erreurs
24.2.7.20. mysql_stmt_prepare()
int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length) Description Prpare la requte reprsente par la chane termine par NUL query, et retourne un pointeur de commande utiliser ultrieurement pour les autres oprations. La requte doit contenir une commande SQL unique. Vous ne devez pas ajouter le point-virgule (;) ni \g de fin de requte. L'application peut inclure une ou plusieurs variable de requte SQL, grce au caractre point d'interrogation (?), plac dans la commande SQL, aux bons endroits. Les variables de requtes ne sont valides qu' certaines places dans les commandes SQL. Par exemple, elles sont autorises dans les listes VALUES() d'une commande INSERT (pour spcifier les valeurs des lignes), ou dans les clauses de comparaisons WHERE, pour spcifier une valeur de comparaison. Sinon, elles ne sont pas autorises pour les identifiants (comme les noms de tables ou de colonnes), dans les listes de colonnes slectionnes par la commande SELECT, ou pour spcifier un oprateur tel que =. Cette dernire restriction est due au fait qu'il serait impossible de dterminer le type de paramtre. En gnral, les variables ne sont autorises que dans les commandes de manipulations de donnes (Data Manipulation Language (DML)), et non pas dans les commandes de dfinition des donnes (Data Defination Language (DDL). Les variables de requtes doivent tre lis par l'application des variables, avec la fonction mysql_stmt_bind_param() avant excution. Valeur retournes Erreurs CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order : les commandes ont t excutes dans un ordre invalide. CR_OUT_OF_MEMORY Out of memory : plus de mmoire. 974
CR_SERVER_GONE_ERROR The MySQL server has gone away : le serveur s'est teint durant l'excution de la requte. CR_SERVER_LOST The connection to the server was lost during the query : la connexion au serveur a t perdue. CR_UNKNOWN_ERROR An unknown error occurred : erreur inconnue. Si la prparation choue, c'est dire si mysql_stmt_prepare() retourne NULL), un message d'erreur peut tre obtenu en appelant mysql_error(). Exemple Pour une utilisation de mysql_stmt_prepare(), voyez l'exemple dans Section 24.2.7.10, mysql_stmt_execute() .
24.2.7.21. mysql_stmt_reset()
my_bool mysql_stmt_reset(MYSQL_STMT *stmt) Description Remet la commande prpare sur le client et sur le serveur son tat juste aprs la prpartion. Actuellement, on s'en sert surtout pour remettre zro les donnes envoyes par mysql_stmt_send_long_data(). Pour prparer nouveau la commande pour une autre commande, utilisez mysql_stmt_prepare(). Valeurs retournes Zro si la commande a t remise zro. Non-nulle, si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. : Les commandes ont t excutes dans un ordre invalide. CR_SERVER_GONE_ERROR The MySQL server has gone away : Le serveur s'est teind. CR_SERVER_LOST The connection to the server was lost during the query : La connexion au serveur a t perdue durant l'excution. CR_UNKNOWN_ERROR An unknown error occurred. : Une erreur inconnue est survenue.
24.2.7.22. mysql_stmt_result_metadata()
MYSQL_RES *mysql_stmt_result_metadata(MYSQL_STMT *stmt) Description
975
Si la fonction mysql_prepare() a gnr un rsultat, alors mysql_stmt_result_metadata() retourne les mta donnes de rsultats sous la forme d'un structure MYSQL_RES, qui peut tre utilise ultrieurement pour traiter des mta informations, telles qu le nombre de champs et les informations individuelles de champs. Ce rsultat peut tre pass en argument l'une des fonctions de champs suivantes, pour traiter les donnes : mysql_num_fields() mysql_fetch_field() mysql_fetch_field_direct() mysql_fetch_fields() mysql_field_count() mysql_field_seek() mysql_field_tell() mysql_free_result() La structure de jeu de rsultats doit tre libre une fois que vous en ave fini avec, grce la fonction mysql_free_result(). C'est similaire la mthode pour librer les ressources obtenus de mysql_store_result(). Le jeu de rsultats retourn par mysql_stmt_result_metadata() contient uniquement des mtadonnes. Il ne contient aucune ligne de rsultat. Les lignes sont lues en utitilisant la ressource de commande, avec la fonction mysql_stmt_fetch(). Valeurs retournes Une structure de type MYSQL_RES. NULL si aucune mta donnes n'existe pour la requte prpare. Erreurs CR_OUT_OF_MEMORY Out of memory : plus de mmoire CR_UNKNOWN_ERROR An unknown error occured : Une erreur inconnue est survenue. Exemple Pour une illustration de la fonction mysql_stmt_result_metadata(), voyez l'exemple de la fonction Section 24.2.7.13, mysql_stmt_fetch() .
24.2.7.23. mysql_stmt_row_seek()
MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt, MYSQL_ROW_OFFSET offset) Description Place le pointeur de lignes une position arbitraire dans le jeu de rsultats. La valeur offset est un offset de ligne, qui doit tre retourn par mysql_stmt_row_tell() ou par mysql_stmt_row_seek(). Cette valeur n'est pas un numro de ligne : si vous voulez atteindre une ligne dans un rsultat, partir de son numro, vous devez utiliser mysql_stmt_data_seek(). Cette fonction requiert que le jeu de rsultat entier soit tlcharg, et donc, mysql_stmt_row_seek() ne peut tre utilis qu'avec mysql_stmt_store_result().
976
Valeur retourne La position prcdente du curseur de ligne. Cette valeur peut tre passe mysql_stmt_row_seek(). Erreurs Aucune.
24.2.7.24. mysql_stmt_row_tell()
MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt) Description Retourne la position courante du pointeur de ligne. C'est la position laquelle le dernier appel mysql_fetch() l'a laiss. Cette valeur peut tre utilise comme argument avec mysql_stmt_row_seek(). Vous ne devez utiliser mysql_stmt_row_tell() qu'aprs mysql_stmt_store_result(). Valeur retourne La position courante du pointeur de lignes. Erreurs Aucune.
24.2.7.25. mysql_stmt_send_long_data()
my_bool mysql_stmt_send_long_data(MYSQL_STMT *stmt, unsigned int parameter_number, const char *data, unsigned long length) Description Permet une application d'envoyer des donnes par parties au serveur. Cette fonction doit tre utilise pour envoyer des caractres ou du contenu binaire par partie dans une colonne (qui sera de type TEXT ou BLOB), avec un type de caractre ou de donnes binaires. Le paramtre data est un pointeur sur un buffer qui contient les donnes pour le paramtre, reprsent par parameter_number. Le paramtre length indique la quantit de donnes qui doit tre envoye, en octets. Note : le prochain appel mysql_stmt_execute() va ignorer les buffers de variables de requtes, pour tous les paramtres qui ont t utilis avec mysql_stmt_send_long_data() depuis le dernier appel mysql_stmt_execute() ou mysql_stmt_reset(). Si vous voulez remettre zro cette fonction, utilisez mysql_stmt_reset(). See Section 24.2.7.21, mysql_stmt_reset() . Valeurs retournes Zro si les donnes ont pu tre envoyes au serveur. Non-nul si une erreur est survenue. Erreurs CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order : Les conmmandes ont t envoyes dans un ordre invalide.
977
CR_SERVER_GONE_ERROR The MySQL server has gone away : le serveur MySQL s'est teind. CR_OUT_OF_MEMORY Out of memory : plus de mmoire. CR_UNKNOWN_ERROR An unknown error occured : une erreur inconnue s'est produite. Exemple L'exemple ci-dessous explique comment envoyer des donnes par partie dans une colonne de type TEXT :
#define INSERT_QUERY "INSERT INTO test_long_data(text_column) VALUES(?)" MYSQL_BIND bind[1]; long length; smtt = mysql_stmt_init(mysql); if (!stmt) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); exit(0); } if (mysql_stmt_prepare(stmt, INSERT_QUERY, strlen(INSERT_QUERY))) { fprintf(stderr, "\n mysql_stmt_prepare(), INSERT failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } memset(bind, 0, sizeof(bind)); bind[0].buffer_type= MYSQL_TYPE_STRING; bind[0].length= &length; bind[0].is_null= 0; /* Liaison des buffers */ if (mysql_stmt_bind_param(stmt, bind)) { fprintf(stderr, "\n param bind failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Envoi des donnes au serveur, par parties */ if (!mysql_stmt_send_long_data(stmt,0,"MySQL",5)) { fprintf(stderr, "\n send_long_data failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Envoi des donnes suivantes */ if (mysql_stmt_send_long_data(stmt,0," - The most popular open source database",40)) { fprintf(stderr, "\n send_long_data failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); } /* Excution de la requte */ if (mysql_stmt_execute(stmt)) { fprintf(stderr, "\n mysql_stmt_execute failed"); fprintf(stderr, "\n %s", mysql_stmt_error(stmt)); exit(0); }
978
24.2.7.26. mysql_stmt_sqlstate()
const char *mysql_stmt_sqlstate(MYSQL_STMT *stmt) Description Pour la commande stmt, mysql_stmt_sqlstate() retourne une chane termine par un null, contenant le code d'erreur SQLSTATE de la plus rcente fonction de requte prpare qui ait t utilise. Le code d'erreur est constitu de 5 caractres. "00000" signifie ``pas d'erreur''. Les valeurs sont spcifies par les normes ANSI SQL et ODBC. Pour une liste des valeurs possibles, voyez Chapitre 26, Gestion des erreurs avec MySQL. Notez que toutes les erreurs MySQL ne sont pas associe une erreur SQLSTATE. La valeur "HY000" (erreur gnrale) sert pour les erreurs orphelines. Cette fonction a t ajoute en MySQL 4.1.1. Valeur retourne Une chane de caractres termine par un null, contenant le code d'erreur SQLSTATE.
24.2.7.27. mysql_stmt_store_result()
int mysql_stmt_store_result(MYSQL_STMT *stmt) Description Vous devez appeler la fonction mysql_stmt_store_result() pour chaque requte qui doit lire de donnes (SELECT, SHOW, DESCRIBE, EXPLAIN) et uniquement si vous voulez lire la totalit du rsultat dans un buffer du client, pour que les appels suivants mysql_fetch() retourne des donnes bufferises. Vous n'avez pas appeler mysql_stmt_store_result() pour les requtes suivantes, mais cela ne causera pas de ralentissement notable. Vous pouvez dtecter si une requte n'a pas de rsultat en vrifiant si mysql_prepare_result() retourne 0. Pour plus d'informations, voyez Section 24.2.7.22, mysql_stmt_result_metadata() . Note : MySQL ne calcule pas par dfaut MYSQL_FIELD->max_length pour toutes les colonnes de mysql_stmt_store_result() car ce calcul ralentirait considrablement mysql_stmt_store_result() et la plupart des applications n'ont pas besoin de max_length. Si vous voulez max_length, vous pouvez appeler mysql_stmt_attr_set(MYSQL_STMT, STMT_ATTR_UPDATE_MAX_LENGTH, &flag) pour l'obtenir. See Section 24.2.7.3, mysql_stmt_attr_set() . Valeurs retournes Zro si les rsultats sont mis en buffer correctement, et non-nul si une erreur survient. Errors CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order : les commandes ont t excutes dans un ordre invalide. CR_OUT_OF_MEMORY Out of memory : plus de mmoire. CR_SERVER_GONE_ERROR 979
The MySQL server has gone away : le serveur MySQL s'est teind. CR_SERVER_LOST The connection to the server was lost during the query : la connexion au serveur MySQL s'est interrompue durant la commande. CR_UNKNOWN_ERROR An unknown error occurred : une erreur inconnue est survenue.
980
Afin d'envoyer les donnes, il faut utiliser une requte prpare avec la fonction mysql_prepare(). Avant d'appeler la fonction mysql_execute(), pour excuter la commande, utilisez la procdure suivante pour prparer chaque donne : 1. Dans la structure MYSQL_BIND, associe aux donnes, assignez au membre buffer_type le type de donnes que vous envoyez. Pour DATE, TIME, DATETIME, ou TIMESTAMP, utilisez buffer_type MYSQL_TYPE_DATE, MYSQL_TYPE_TIME, MYSQL_TYPE_DATETIME, ou MYSQL_TYPE_TIMESTAMP, respectivement. 2. Donnez au membre buffer de la structure MYSQL_BIND, l'adresse de la structure MYSQL_TIME dans laquelle vous avez stock votre valeur temporelle. 3. Remplissez les membres de la structure MYSQL_TIME qui sont adapts au type de donnes que vous passez. Utilisez mysql_bind_param() pour lier les donnes la requte. Puis, appelez mysql_execute(). Pour lire des donnes temporelles, la procdure est similaire, hormis le fait que vous donnez au membre buffer_type le type de donne que vous attendez, et que buffer doit pointer sur l'adresse de la structure MYSQL_TIME qui va recevoir les donnes retournes. Utilisez mysql_bind_results() pour lier les buffers la commande aprs avoir appel mysql_execute() et avant de lire les rsultats. Voici un exemple qui ralise l'insertion de donnes DATE, TIME et TIMESTAMP. La variable mysql est suppose reprsenter une connexion valide.
MYSQL_TIME MYSQL_BIND MYSQL_STMT ts; bind[3]; *stmt;
strmov(query, "INSERT INTO test_table(date_field, time_field, timestamp_field) VALUES(?,?,?"); stmt= mysql_prepare(mysql, query, strlen(query))); /* configure les trois buffers pour les trois paramtres */ bind[0].buffer_type= MYSQL_TYPE_DATE; bind[0].buffer= (char *)&ts; bind[0].is_null= 0; bind[0].length= 0; .. bind[1]= bind[2]= bind[0]; .. mysql_bind_param(stmt, bind); /* Fournit les donnes envoyer dans la structure ts */ ts.year= 2002; ts.month= 02; ts.day= 03; ts.hour= 10; ts.minute= 45; ts.second= 20; mysql_execute(stmt); ..
24.2.11.1. my_init()
981
void my_init(void) Description Cette fonction doit tre appele une fois dans le programme avant tout appel une fonction MySQL. Cela initialise quelques variables globales dont MySQL a besoin. Si vous utilisez une bibliothque client sr pour les threads, cela appellera aussi mysql_thread_init() pour ce thread. Ceci est automatiquement appel par mysql_init(), mysql_server_init() et mysql_connect(). Valeur de retour Aucune.
24.2.11.2. mysql_thread_init()
my_bool mysql_thread_init(void) Description Cette fonction doit tre appele chaque cration de thread pour initialiser les variables spcifiques aux threads. Elle est appele automatiquement par my_init() et mysql_connect(). Valeur de retour Aucune.
24.2.11.3. mysql_thread_end()
void mysql_thread_end(void) Description Cette fonction doit tre appele avant pthread_exit() pour librer la mmoire alloue part mysql_thread_init(). Notez que cette fonction n'est pas invoque automatiquement par la bibliothque du client. Elle doit tre invoque explicitement pour viter les pertes de mmoire. Valeur de retour Aucune.
24.2.11.4. mysql_thread_safe()
unsigned int mysql_thread_safe(void) Description Cette fonction indique si le client est compil avec le support des threads (thread-safe). Valeur de retour 1 indique que le client est thread-safe, 0 sinon.
982
Si le programme est li avec -lmysqlclient au lieu de -lmysqld, ces fonctions ne font rien. Cela permet de choisir d'utiliser un serveur embarqu MySQL, ou un serveur tournant part sans avoir changer votre code.
24.2.12.1. mysql_server_init()
int mysql_server_init(int argc, char **argv, char **groups) Description Cette fonction doit tre appele une fois dans le programme avant d'appeler toute autre fonction MySQL. Elle dmarre le serveur et initialise tout sous-systme (mysys, InnoDB, etc.) utilis par le serveur. Si cette fonction n'est pas appele, le programme plantera. Si vous utilisez le paquet DBUG fournit avec MySQL, vous devez excuter cette fonction aprs avoir appel MY_INIT(). Les arguments argc et argv sont analogues aux arguments de main(). Le premier lment argv est ignor (il contient le plus souvent le nom du programme). Par convenance, argc peut tre 0 (zro) si il n'y a aucun argument pass en ligne de commande pour le serveur. La liste de mots termine par NULL dans groups dtermine les groupes dans les fichiers d'options qui seront actifs. See Section 4.3.2, Fichier d'options my.cnf . Par convenance, groups peut tre NULL, dans ce cas, les groupes [server] et [embedded] sont activs. Exemple
#include <mysql.h> #include <stdlib.h> static char *server_args[] = { "ce_programme", /* cette chane n'est pas utilise */ "--datadir=.", "--key_buffer_size=32M" }; static char *server_groups[] = { "embedded", "server", "this_program_SERVER", (char *)NULL }; int main(void) { mysql_server_init(sizeof(server_args) / sizeof(char *), server_args, server_groups); /* Utilisez les fonction de L'API MySQL ici */ mysql_server_end(); return EXIT_SUCCESS; }
24.2.12.2. mysql_server_end()
void mysql_server_end(void) Description Cette fonction doit tre appele une fois dans le programme aprs toutes les autres fonctions MySQL. Elle coupe le serveur incorpor. Valeur de retour
983
Aucune.
984
Pour plus d'informations, voyez la section Section 24.2.3.33, mysql_insert_id() . Lorsqu'une nouvelle valeur AUTO_INCREMENT est gnre, vous pouvez l'obtenir en utilisant la commande SELECT LAST_INSERT_ID() avec mysql_query() et en lisant la valeur dans le rsultat obtenu. Pour LAST_INSERT_ID(), l'identifiant gnr par la dernire insertion est entretenu sur le serveur en se basant sur la connexion. Il ne sera pas chang par un autre client. Il ne changera pas non plus si vous mettez jour une autre colonne AUTO_INCREMENT avec une valeur normale (ni NULL ni 0). Si vous voulez utiliser l'identifiant gnr pour une table et l'insrer dans une autre, vous pouvez utiliser les requtes suivantes :
INSERT INTO foo (auto,text) VALUES(NULL,'text'); INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text'); # gnre un identifiant en insrant NULL # on l'utilise dans la seconde page
Notez que mysql_insert_id() retourne la valeur stocke dans une colonne AUTO_INCREMENT, que cette valeur ait t gnre automatiquement en enregistrant NULL ou 0 ou une valeur explicite. LAST_INSERT_ID() retourne les valeurs gnres automatiquement par AUTO_INCREMENT. Si vous stockez une valeur explicite, autre que NULL ou 0, cela n'affecte pas le rsultat de LAST_INSERT_ID().
Si cela se produit sur votre systme, vous devez inclure la bibliothque mathmatique en ajoutant -lm la fin de la ligne de compilation/liaison.
985
sh -c est ncessaire pour s'assurer que le Shell ne traitera pas le rsultat de mysql_config comme un seul mot.
Cela va crer une bibliothque cliente compatible avec les threads libmysqlclient_r. Supposons que votre systme d'exploitation dispose d'une fonction gethostbyname_r() compatible avec les threads. Cette bibliothque est compatible avec les threads pour chaque connexion. Vous pouvez partager une connexion entre deux threads, avec les limitations suivantes : Deux threads ne peuvent pas envoyer de requtes simultanes au serveur MySQL, sur la mme connexion. En particulier, vous devez vous assurer qu'entre mysql_query() et mysql_store_result(), aucun autre thread n'utilise la mme connexion. De nombreux threads peuvent accder diffrents rsultats qui sont lus avec mysql_store_result(). Si vous utilisez mysql_use_result, vous devez vous assurer qu'aucun autre thread n'utilise la mme connexion jusqu' ce qu'elle soit referme. Cependant, il vaut bien mieux pour votre client thread qu'ils utilisent mysql_store_result(). Si vous voulez utiliser de multiples threads sur la mme connexion, vous devez avoir un verrou mutex autour de vos fonctions mysql_query() et mysql_store_result(). Une fois que mysql_store_result() est prt, le verrou peut tre libr et d'autres threads vont pouvoir utiliser la connexion.
986
Si vous programmez avec les threads POSIX, vous pouvez utiliser les fonctions pthread_mutex_lock() et pthread_mutex_unlock() pour poser et enlever le verrou mutex. Vous devez savoir ce qui suit si vous avez un thread qui appel une fonction MySQL qui n,a pas cre de connexion la base MySQL : Lorsque vous appelez mysql_init() ou mysql_connect(), MySQL va crer une variable spcifique au thread qui est utilise par la libaririe de dbogage (entre autres). Si vous appelez une fonction MYSQL, avant que le thread n'ai appel mysql_init() ou mysql_connect(), le thread ne va pas avoir les variables spcifiques en place, et vous risquez d'obtenir un core dump tt ou tard. Pour faire fonctionner le tout proprement, vous devez suivre ces tapes : 1. Appeler my_init() au dbut du programme, si il appelle une autre fonction MySQL, avant d'appeler mysql_real_connect(). 2. Appeler mysql_thread_init() dans le gestionnaire de threads avant d'appeler une autre fonction MySQL. 3. Dans le thread, appelez mysql_thread_end() avant d'appeler pthread_exit(). Cela va librer la mmoire utiliser par les variables spcifiques MySQL. Vous pouvez rencontrer des erreurs cause des symboles non dfinis lors du link de votre client avec libmysqlclient_r. Dans la plupart des cas, c'est parce que vous n'avez pas inclus la bibliothque de threads dans la ligne de compilation.
mysql_server_init() Doit tre appele avant toute autre fonction MySQL, et de prfrence trs tt dans la fonction main(). mysql_server_end() Doit tre appele avant que votre programme ne se termine. mysql_thread_init() Doit tre appele dans chaque thread que vous crez, qui aura accs MySQL. mysql_thread_end() Doit tre appele avant d'appeler pthread_exit()
Puis, vous devez compiler votre code avec libmysqld.a au lieu de libmysqlclient.a. Les fonctions ci-dessus mysql_server_xxx sont aussi inclues dans la bibliothque libmysqlclient.a pour vous permettre de changer facilement entre les versions de la bibliothque embarque et celle de la bibliothque client/serveur, en compilant simplement la bonne bibliothque. See Section 24.2.12.1, mysql_server_init() .
987
Quand vous liez votre programme avec libmysqld, vous devez aussi inclure les bibliothques pthread spcifiques au systme et quelques bibliothques que le serveur MySQL utilise. Vous pouvez obtenir la liste complte des bibliothques en excutant mysql_config --libmysqldlibs. Les options correctes pour compiler et lier un programme thread doivent tre utilises, mme si vous n'appelez pas directement une fonction de threads dans votre code.
988
requis. Cet exemple est l pour vous donner assez de dtails pour comprendre le problme, sans avoir en tte qu'il s'agit d'une partie ncessaire d'une application relle. Pour essayer ccet exemple, crez un dossier test_libmysqld au mme niveau que le dossier des sources mysql-4.0. Sauvegardez le fichier source test_libmysqld.c et GNUmakefile dans le dossier, puis excutez GNU make l'intrieur du rpertoire test_libmysqld. test_libmysqld.c
/* * Un simple exemple de client, utilisant la bibliothque du serveur embarqu MySQL */ #include #include #include #include <mysql.h> <stdarg.h> <stdio.h> <stdlib.h>
MYSQL *db_connect(const char *dbname); void db_disconnect(MYSQL *db); void db_do_query(MYSQL *db, const char *query); const char *server_groups[] = { "test_libmysqld_SERVER", "embedded", "server", NULL }; int main(int argc, char **argv) { MYSQL *one, *two; /* * * * * * * * * mysql_server_init() doit tre appele avant toute autre fonction mysql. Vous pouvez utiliser mysql_server_init(0, NULL, NULL), et cela initialisera le serveur en utilisant groups = { "server", "embedded", NULL }. Dans votre fichier $HOME/.my.cnf, vous voudrez srement mettre :
[test_libmysqld_SERVER] language = /chemin/vers/la/source/de/mysql/sql/share/english * Vous pouvez, bien sr, modifier argc et argv avant de les passer * cette fonction. Ou vous pouvez en crer de nouveaux de la manire * que vous souhaitez. Mais tout les arguments dans argv ( part * argv[0], qui est le nom du programme) doivent tre des options valides * pour le serveur MySQL. * * Si vous liez ce client avec la bibliothque mysqlclient normale, * cette fonction n'est qu'un bout de code qui ne fait rien. */ mysql_server_init(argc, argv, (char **)server_groups); one = db_connect("test"); two = db_connect(NULL); db_do_query(one, "SHOW TABLE STATUS"); db_do_query(two, "SHOW DATABASES"); mysql_close(two); mysql_close(one); /* Cela doit tre appel aprs toutes les autres fonctions mysql */ mysql_server_end(); exit(EXIT_SUCCESS); } static void
989
die(MYSQL *db, char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); (void)putc('\n', stderr); if (db) db_disconnect(db); exit(EXIT_FAILURE); } MYSQL * db_connect(const char *dbname) { MYSQL *db = mysql_init(NULL); if (!db) die(db, "mysql_init a chou : pas de mmoire"); /* * Notez que le client et le serveur utilisent des noms de groupes spars. * Ceci est critique, car le serveur n'acceptera pas les options du client * et vice versa. */ mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "test_libmysqld_CLIENT"); if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0)) die(db, "mysql_real_connect a chou : %s", mysql_error(db)); return db; } void db_disconnect(MYSQL *db) { mysql_close(db); } void db_do_query(MYSQL *db, const char *query) { if (mysql_query(db, query) != 0) goto err; if (mysql_field_count(db) > 0) { MYSQL_RES *res; MYSQL_ROW row, end_row; int num_fields; if (!(res = mysql_store_result(db))) goto err; num_fields = mysql_num_fields(res); while ((row = mysql_fetch_row(res))) { (void)fputs(">> ", stdout); for (end_row = row + num_fields; row < end_row; ++row) (void)printf("%s\t", row ? (char*)*row : "NULL"); (void)fputc('\n', stdout); } (void)fputc('\n', stdout); } else (void)printf("Lignes affectes : %lld\n", mysql_affected_rows(db)); return; err: die(db, "db_do_query a chou : %s [%s]", mysql_error(db), query); }
GNUmakefile
# On suppose que MySQL est install dans /usr/local/mysql
990
inc lib
:= /usr/local/mysql/include/mysql := /usr/local/mysql/lib
# Si vous n'avez pas encore install MySQL, essayez plutt ceci #inc := $(HOME)/mysql-4.0/include #lib := $(HOME)/mysql-4.0/libmysqld CC := gcc CPPFLAGS := -I$(inc) -D_THREAD_SAFE -D_REENTRANT CFLAGS := -g -W -Wall LDFLAGS := -static # Vous pouvez changer -lmysqld en -lmysqlclient pour utiliser # la bibliothque client/serveur LDLIBS = -L$(lib) -lmysqld -lz -lm -lcrypt ifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null)) # FreeBSD LDFLAGS += -pthread else # Linux LDLIBS += -lpthread endif # Cela fonctionne pour les programmes de tests sur un simple fichier sources := $(wildcard *.c) objects := $(patsubst %c,%o,$(sources)) targets := $(basename $(sources)) all: $(targets) clean: rm -f $(targets) $(objects) *.core
DBI est une interface gnrique plusieurs systmes de bases de donnes. Cela signifie que vous pouvez crire un script qui fonctionne parfaitement avec plusieurs systmes diffrents sans y apporter aucun changement. Vous avez besoin de dfinir un pilote de base de donnes (DataBase Driver : DBD) pour chaque systme. Pour MySQL, ce pilote se nomme DBD::mysql. Perl DBI est maintenant l'interface recommande pour Perl. Elle remple une ancienne interface appele mysqlperl, qui doit tre abandonne. Vous pouvez trouver les dernires informations relatives DBI dans la section Section 2.9, Commentaires sur l'installation de Perl . Plus de dtails sur DBI sont disponibles en ligne de commande, sur Internet ou en version imprime. Une fois que vous avez install DBI et DBD::mysql, vous pouvez utiliser la commande perldoc pour obtenir plus d'informations propos de DBI.
shell> perldoc DBI shell> perldoc DBI::FAQ shell> perldoc DBD::mysql
Vous pouvez aussi utiliser les outils pod2man, pod2html, etc., pour convertir la documentation en diffrents formats. Pour plus d'informations sur le module DBI de Perl5, visitez la page web de DBI : http://dbi.perl.org/ Pour une documentation imprime, voyez le guide officiel DBI : Programming the Perl DBI (Alligator Descartes et Tim Bunce, O'Reilly & Associates, 2000). Les informations sur le livre sont disponibles sur le site de DBI : http://dbi.perl.org/. Pour des informations qui sont spcifiques DBI et MySQL, voyez MySQL and Perl for the Web (Paul DuBois, New Riders, 2001). Le site web de ce livre est http://www.kitebird.com/mysql-perl/.
MySQLtcl est une API simple pour accder au serveur MySQL depuis le langage de programmation Tcl. Il est disponible sur http://www.xdobry.de/mysqltcl/.
993
994
995
Introduction to MyODBC
connexion aux serveurs de bases de donnes. Elle a t dveloppe en fonction des spcifications du SQL Access Group et dfinit un ensemble de fonction, code d'erreurs et types de donns qui peuvent tre utiliss pour dvelopper des applications indpendantes des bases de donnes. ODBC est gnralement utilis lorsque l'indpendance la base de donnes ou les accs simultans de diffrents clients est ncessaire. Pour plus d'informations sur ODBC, voyez http://www.microsoft.com/data/.
996
Introduction to MyODBC
NetBSD OpenBSD OS/2 SGI Irix Solaris SunOS SCO OpenServer SCO UnixWare Tru64 Unix If a binary distribution is not available for downloading for a particular platform, you can build the driver yourself by downloading the driver sources. You can contribute the binaries to MySQL by sending a mail message to <myodbc@lists.mysql.com>, so that it becomes available for other users.
997
Vrifiez le fichier de trace MyODBC, pour essayer de comprendre ce qui ne va pas. Vous devriez tre capable de trouver les requtes mises en recherchant la chane >mysql_real_query dans le fichier myodbc.log. Vous devriez aussi essayer de dupliquer la requte dans le client mysql ou admndemo pour voir si le problme vient de MYODBC ou MySQL. Si vous trouvez quelques chose d'incorrect, n'envoyez que les lignes pertinentes (maximum, 40 lignes) <myodbc@lists.mysql.com>. N'envoyez jamais le fichier de log MYODBC ou ODBC complet! Si vous tes incapables de trouver une erreur, la dernire option est de faire une archive (tar ou zip) qui contienne le fichier de trace MYODBC, le fichier de log ODBC, et un fichier README qui contienne une description du problme. Vous pouvez envoyer le tout ftp://support.mysql.com/pub/mysql/secret/. Seuls nous, MYSQL AB, pourront accder ces fichiers, et nous seront trs respectueux de vos donnes. Si vous pouvez crer un problme qui reproduit le problme, essayez de l'uploader aussi! Si le programme fonctionne avec d'autres serveurs SQL, vous devriez faire un log ODBC o vous fates exactement la mme chose sur les autres serveurs SQL. N'oubliez jamais que plus vous nous fournissez d'explication, plus nous pourront vous aider!
998
Application: An application is a program that calls the ODBC API to access the data from the MySQL server. The Application communicates with the Driver Manager using the standard ODBC calls. The Application does not care where the data is stored, how it is stored, or even how the system is configured to access the data. It needs to know only the Data Source Name (DSN). A number of tasks are common to all applications, no matter how they use ODBC. These tasks are: Selecting the MySQL server and connecting to it Submitting SQL statements for execution Retrieving results (if any) Processing errors Committing or rolling back the transaction enclosing the SQL statement Disconnecting from the MySQL server Because most data access work is done with SQL, the primary tasks for applications that use ODBC are submitting SQL statements and retrieving any results generated by those statements. Driver manager: 999
The Driver Manager is a library that manages communication between application and driver or drivers. It performs the following tasks: Resolves Data Source Names (DSN) Driver loading and unloading Processes ODBC function calls or passes them to the driver MyODBC Driver: The MyODBC driver is a library that implements the functions in the ODBC API. It processes ODBC function calls, submits SQL requests to MySQL server, and returns results back to the application. If necessary, the driver modifies an application's request so that the request conforms to syntax supported by the MySQL. ODBC.INI: ODBC.INI is the ODBC configuration file that stores the driver and database information required to connect to the server. It is used by the Driver Manager to determine which driver to be loaded using the Data Source Name. The driver uses this to read connection parameters based on the DSN specified. For more information, Section 25.1.9, MyODBC Configuration . MySQL Server: The MySQL server is the source of data. MySQL is: A database management system (DBMS) A relational database management system (RDBMS) Open Source Software
1000
Le problme dans ce cas est qu'un autre programme utilise ODBC et du fait de l'architecture Windows, vous ne pouvez pas installer de nouveau pilote ODBC avec le programme d'installation de Microsoft ODBC. Dans la plupart des cas, vous pouvez continuer en cliquant juste sur Ignore pour copier le reste des fichiers MyODBC et l'installation finale devrait fonctionner. Si ce n'est pas le cas, la solution est de redmarrer votre machine en mode ``safe mode`` (faites le en appuyant sur F8 juste avant que votre machine ne dmarre Windows), installez MyODBC, et redmarrez en mode normal. Pour crer une connexion un ordinateur Unix depuis un ordinateur Windows, avec une application ODBC (une qui ne supporte pas MySQL nativement), vous devez installer MyODBC sur l'ordinateur Windows. L'utilisateur et la machine Windows doivent avoir les droits d'accs au serveur MySQL situ sur la machine Unix. vous pouvez configurer cela avec la commande GRANT. See Section 13.5.1.3, Syntaxe de GRANT et REVOKE . Vous devez crer une entre DNS ODBC comme suit : Ouvrez le panneau de configuration de Windows. Double-cliquez sur l'icne Sources de donnes ODBC (32 bits). Cliquez sur le volet User DSN. Cliquez sur le bouton Add. Slectionnez MySQL dans l'cran Create New Data Source et cliquez sur le bouton Terminer. L'cran de configuration par dfaut du pilote MySQL est affich. See Section 25.1.9.2, Configuration du DSN MyODBC sur Windows .
1001
Dmarrez maintenant votre application et slectionnez le pilote ODBC avec les DSN que vous avez spcifi dans l'administrateur ODBC. Notez que d'autres options de configuration sont prsentes dans l'cran de MySQL (traage, se connecter automatiquement, etc.), vous pouvez les essayer en cas de problmes.
Le problme est qu'un autre programme utilise ODBC. A cause de l'architecture de Windows, vous pourriez ne pas pouvoir installer de nouveau pilote ODBC avec le programme d'installation de Microsoft. Dans la plupart des cas, vous pouvez continuer avec le bouton Ignore pour copier le restant des fichiers MyODBC et l'installation finale peut fonctionner malgr tout. Si ce n'est pas le cas, la solution est de relancer votre ordinateur en ``mode sans chec''. Choisissez ce mode en pressant F8 durant le redmarrage de Windows : installez MyODBC et relancez en mode normal.
If there is any dependancy error for MySQL client library, libmysqlclient, simply ignore it by supplying the --nodeps option, and then make sure the MySQL client shared library is in the path or set through LD_LIBRARY_PATH. This installs the driver libraries and related documents to /usr/local/lib and /usr/share/doc/ MyODBC respectively. Now proceed onto Section 25.1.9.3, Configuration d'un DSN MyODBC sous Unix . To uninstall the driver, become root and execute an rpm command:
shell> su root shell> rpm -e MyODBC
1002
Read the installation instructions in the INSTALL-BINARY file and execute these commands.
shell> cp libmyodbc* /usr/local/lib shell> cp odbc.ini /usr/local/etc shell> export ODBCINI=/usr/local/etc/odbc.ini
Then proceed on to how to configure the DSN on unix to configure the DSN for MyODBC. For more information, refer to the INSTALL-BINARY file that comes with your distribution.
2. Editez le fichier Makefile pour spcifier le chemin correct vers les bibliothques client MySQL et les fichiers d'inclusions. Puis, utilisez les commandes suivantes pour compiler et installer votre version :
C:\> nmake -f Makefile C:\> nmake -f Makefile install
nmake -f Makefile compile la version de production du pilote, et place les excutables dans le dossier Release. nmake -f Makefile install installe (copie) le pilote DLL et les bibliothques (myodbc3.dll, myodbc3.lib) dans votre dossier systme. 3. Pour compiler la version de dboguage, utilisez Makefile_Debug plutt que Makefile, comme ceci :
C:\> nmake -f Makefile_debug C:\> nmake -f Makefile_debug install
Note : 1003
Assurez-vous de spcifier le chemin correct jusqu'au bibliothques client MySQL et aux fichiers d'enttes dans le fichier Makefile (modifiez les variables MYSQL_LIB_PATH et MYSQL_INCLUDE_PATH). Le chemin d'entte par dfaut est C:\mysql\include. Le chemin par dfaut pour la bibliothque est C:\mysql\lib\opt pour les versions de publication, et C:\mysql \lib\debug pour les versions de dboguage. Pour une documentation complte de nmake, visitez http://msdn.microsoft.com/library/default.asp? url=/library/en-us/wcepb40/htm/_wcepb_nmake_tool.asp. Si vous utilisez les sources sous BitKeeper pour la compilation, tous les fichiers Makefiles spcifiques Windows sont nomms Win_Makefile*.
1004
Some of the more commonly used configure options are described here: 1. To compile MyODBC, you need to supply the MySQL client include and library files path using the --with-mysql-path=DIR option, where DIR is the directory where the MySQL is installed. MySQL compile options can be determined by running DIR/bin/mysql_config. 2. Supply the standard header and library files path for your ODBC Driver Manager(iodbc or unixodbc). If you are using iodbc and iodbc is not installed in its default location (/usr/local), you might have to use the --with-iodbc=DIR option, where DIR is the directory where iodbc is installed. If the iodbc headers do not reside in DIR/include, you can use the --with-iodbcincludes=INCDIR option to specify their location. The applies to libraries. If they are not in DIR/lib, you can use the --with-iodbclibs=LIBDIR option. If you are using unixODBC, use the --with-unixODBC=DIR option (case sensitive) to make configure look for unixODBC instead of iodbc by default, DIR is the directory where unixODBC is installed. If the unixODBC headers and libraries aren't located in DIR/include and DIR/lib, use the -with-unixODBC-includes=INCDIR and --with-unixODBC-libs=LIBDIR options. 3. You might want to specify an installation prefix other than /usr/local. For example, to install the MyODBC drivers in /usr/local/odbc/lib, use the --prefix=/usr/local/odbc option. The final configuration command will look something like this:
shell> ./configure --prefix=/usr/local \ --with-iodbc=/usr/local \ --with-mysql-path=/usr/local/mysql
This option enables the building of driver thread-safe library libmyodbc3_r.so from by linking with mysql thread-safe client library libmysqlclient_r.so (The extensions are OS dependent). In case while configuring with thread-safe option, and gotten into a configure error; then look at the config.log and see if it is due to the lack of thread-libraries in the system; and supply one with LIBS options i.e.
LIBS="-lpthread" ./configure ..
1005
If any errors occur, correct them and continue the build process. If you aren't able to build, then send a detailed email to <myodbc@lists.mysql.com> for further assistance.
To build shared driver libraries, you must specify the --enable-shared option for configure. By default, configure does not enable this option. If you have configured with the --disable-shared option, you can build the .so file from the static libraries using the following commands:
shell> shell> shell> shell> cd MyODBC-3.51.01 make cd driver CC=/usr/bin/gcc \ $CC -bundle -flat_namespace -undefined error \ -o .libs/libmyodbc3-3.51.01.so \ catalog.o connect.o cursor.o dll.o error.o execute.o \ handle.o info.o misc.o myodbc3.o options.o prepare.o \ results.o transact.o utility.o \ -L/usr/local/mysql/lib/mysql/ \ -L/usr/local/iodbc/lib/ \ -lz -lc -lmysqlclient -liodbcinst
Make sure to change -liodbcinst to -lodbcinst if you are using unixODBC instead of iODBC, and configure the library paths accordingly. This builds and places the libmyodbc3-3.51.01.so file in the .libs directory. Copy this file to MyODBC library directory (/usr/local/lib (or the lib directory under the installation directory that you supplied with the --prefix).
shell> cd .libs shell> cp libmyodbc3-3.51.01.so /usr/local/lib
1006
That command installs one of the following sets of libraries: For MyODBC 3.51: libmyodbc3.so libmyodbc3-3.51.01.so, where 3.51.01 is the version of the driver libmyodbc3.a For thread-safe MyODBC 3.51: libmyodbc3_r.so libmyodbc3-3_r.51.01.so libmyodbc3_r.a For MyODBC 2.5.0: libmyodbc.so libmyodbc-2.50.39.so, where 2.50.39 is the version of the driver libmyodbc.a For more information on build process, refer to the INSTALL file that comes with the source distribution. Note that if you are trying to use the make from Sun, you may end up with errors. On the other hand, GNU gmake should work fine on all platforms.
Make sure the DSN 'myodbc3' is configured first in odbc.ini and environment variable ODBCINI is pointing to the right odbc.ini file; and MySQL server is running. You can find a sample odbc.ini with the driver distribution. You can even modify the samples/run-samples script to pass the desired DSN, UID, and PASSWORD values as the command line arguments to each sample.
1007
The command assumes that the unixODBC and MySQL are installed in the default locations. If not, configure accordingly. On Mac OS X, --enable-shared builds .dylib files by default. You can build .so files like this:
shell> make shell> cd driver shell> CC=/usr/bin/gcc \ $CC -bundle -flat_namespace -undefined error -o .libs/libmyodbc3-3.51.01.so *.o -L/usr/local/mysql/lib/ -L/usr/local/iodbc/lib -liodbcinst -lmysqlclient -lz -lc
Make sure to change the -liodbcinst to -lodbcinst in case of using unixODBC instead of iODBC and configure the libraries path accordingly. In Apple's version of GCC, both cc and gcc are actually symbolic links to gcc3. Now copy this library to the $prefix/lib directory and symlink to libmyodbc3.so. You can cross-check the output shared-library properties using this command:
shell> otool -LD .libs/libmyodbc3-3.51.01.so
If using gcc:
shell> CC="gcc" \ LDFLAGS="-Wl,+b:-Wl,+s" \ ./configure --prefix=/usr/local
1008
Once the driver is built, cross-check its attributes using chatr .libs/libmyodbc3.sl to see whether or not you need to have the MySQL client libraries path using the SHLIB_PATH environment variable. For static versions, ignore all shared-library options and run configure with the -disable-shared option.
NOTE : pour plus d'informations sur la compilation et la configuration de bibliothques statiques ou partages sur diffrentes plates-formes, voyez 'Using static and shared libraries across platforms'.
Dans l'exemple prcdent, les sources seront install dans le dossier myodbc-3.51/ ou par dfaut dans le sous-dossier myodbc3/ de votre dossier courrant. Si vous tes derrire un pare-feu, et que nous devez initier les connexions HTTP, vous devrez utiliser BitKeeper via HTTP. Si vous devez utiliser un serveur proxy, il suffit de configurer la variable d'environnement http_proxy pour qu'elle pointe sur votre proxy :
shell> export http_proxy="http://your.proxy.server:8080/"
Maintenant, remplacez simplement bk:// par http:// lors du clonage. Par exemple :
shell> bk clone http://mysql.bkbits.net/myodbc3 myodbc-3.51
Le tlchargement initial de l'arbre peut prendre un certain temps, en fonction de votre connexion : soyez patients. 4. Vous aurez besoin de GNU autoconf 2.52 (ou plus rcent), automake 1.4, libtool 1.4 et m4 pour lancer les commandes suivantes.
shell> shell> shell> shell> shell> cd myodbc-3.51 bk -r edit aclocal; autoheader; autoconf; automake; ./configure # Add your favorite options here make
1009
MyODBC Configuration
Pour plus d'informations sur la compilation, lisez le fichier INSTALL dans le mme dossier. Sous Windows, utilisez les fichiers Windows Makefiles WIN-Makefile et WIN-Makefile_debug pour compiler le pilote. Pour plus d'informations, voyez Section 25.1.6, Installer MyODBC depuis la version source sur Windows . 5. Lorsque la compilation est faite, lancez make install pour installer le pilote MyODBC 3.51 sur votre systme. 6. Si vous avez atteind l'instruction make et que la distribution ne compile pas, envoyez un message <myodbc@lists.mysql.com>. 7. Aprs la commande bk clone initiale, vous devez utiliser la commande bk pull rgulirement, pour obtenir les dernires modifications. 8. Vous pouvez xaminer l'historique de changements du fichier avec toutes les modifications grce la commande bk sccstool. Si vous rencontrez des patches tranges sur lesquels vous avez des questions, envoyez un mail <myodbc@lists.mysql.com>. De mme, si vous pensez avoir une meilleure ide pour un traitement, envoyez un courriel avec votre patch. bk diffs va gnrer un patch pour vous, partir de vos modifications. Si vous n'avez pas le temps de programmer votre ide, envoyez simplement une description. 9. BitKeeper dispose d'une aide en ligne prcieuse, que vous pouvez obtenir avec bk helptool. Vous pouvez aussi lire les listes de modifications, les commentaires et les sources en ligne : http:// mysql.bkbits.net:8080/myodbc3.
1010
MyODBC Configuration
n'importe quel ordinateur et non pas seulement sur Windows; (b) son contenu peut tre transmis ou copi facilement.
The ODBC Data Source Administrator dialog box appears, as shown here:
1011
MyODBC Configuration
Click Help for detailed information about each tab of the ODBC Data Source Administrator dialog box. To add a data source on Windows: 1. Open the ODBC Data Source Administrator. 2. In the ODBC Data Source Administrator dialog box, click Add. The Create New Data Source dialog box appears. 3. Select MySQL ODBC 3.51 Driver, and then click Finish. The MySQL ODBC 3.51 Driver DSN Configuration dialog box appears, as shown here:
4. In the Data Source Name box, enter the name of the data source you want to access. It can be any valid name that you choose. 5. In the Description box, enter the description needed for the DSN. 6. For Host or Server Name (or IP) box, enter the name of the MySQL server host that you want to access. By default, it is localhost. 7. In the Database Name box, enter the name of the MySQL database that you want to use as the default database. 8. In the User box, enter your MySQL username (your database user ID). 9. In the Password box, enter your password. 10. In the Port box, enter the port number if it is not the default (3306).
1012
MyODBC Configuration
11. In the SQL Command box, you can enter an optional SQL statement that you want to issue automatically after the connection has been established. The final dialog looks like this:
Click OK to add this data source. Note: Upon clicking OK, the Data Sources dialog box appears, and the ODBC Administrator updates the registry information. The username and connect string that you entered become the default connection values for this data source when you connect to it. You can also test whether your settings are suitable for connecting to the server using the button Test Data Source. This feature is available only for the MyODBC 3.51 driver. A successful test results in the following window:
1013
MyODBC Configuration
The DSN configuration dialog also has an Options button. If you select it, the following options dialog appears displaying that control driver behavior. Refer to Section 25.1.9.4, Paramtres de connexion for information about the meaning of these options.
Note: The options listed under Driver Trace Options are disabled (grayed out) unless you are using the debugging version of the driver DLL. To modify a data source on Windows: 1. Open the ODBC Data Source Administrator. Click the appropriate DSN tab. 2. Select the MySQL data source that you want to modify and then click Configure. The MySQL ODBC 3.51 Driver - DSN Configuration dialog box appears. 3. Modify the applicable data source fields, and then click OK.
1014
MyODBC Configuration
When you have finished modifying the information in this dialog box, the ODBC Administrator updates the registry information.
[ODBC Data Sources] myodbc = MyODBC 2.50 Driver DSN myodbc3 = MyODBC 3.51 Driver DSN [myodbc] Driver Description SERVER PORT USER Password Database OPTION SOCKET [myodbc3] Driver Description SERVER PORT USER Password Database OPTION SOCKET [Default] Driver Description SERVER PORT USER Password Database OPTION SOCKET
= = = = = = = = =
= = = = = = = = =
= = = = = = = = =
Reportez vous aux Section 25.1.9.4, Paramtres de connexion , pour la liste de paramtres de connexion qui sont disponibles. Note : si vous utilisez unixODBC, vous pouvez utiliser les outils suivants pour configurer les DSN : ODBCConfig GUI(HOWTO: ODBCConfig) odbcinst Dans certains cas lorsque vous utilisez unixODBC, vous pouvez obtenir cette erreur :
Data source name not found and no default driver specified
Lorsque cela survient, assurez vous que les variables d'environnement ODBCINI et ODBCSYSINI pointent sur le bon fichier odbc.ini. Par exemple, si votre fichier odbc.ini est situ dans /usr/ local/etc, donnez les valeurs suivantes aux variables d'environnement :
export ODBCINI=/usr/local/etc/odbc.ini
1015
MyODBC Configuration
export ODBCSYSINI=/usr/local/etc
L'argument option sert indiquer MyODBC que le client n'est pas compatible 100% ODBC. Sur Windows, vous pouvez slectionner des options avec les botes cocher dans l'cran de configuration, mais vous pouvez aussi les configurer avec l'argument option. Les options suivantes sont listes dans l'ordre d'apparition l'cran de connexion MyODBC : Valeur 1 2 Description Le client ne peut pas grer la taille relle des colonnes retournes par MyODBC. Le client ne peut pas grer la vraie valeur des lignes modifies. Si cette option est active, MySQL retourne ``found rows'' la place. Vous devez avoir MySQL 3.21.14 ou plus rcent pour faire fonctionner cette option. Cre un log de dboguage dans c:\myodbc.log. Cela revient ajouter la ligne MYSQL_DEBUG=d:t:O,c::\myodbc.log dans le fichier AUTOEXEC.BAT. (Sous Unix, ce fichier est /tmp/myodbc.log.) Ne pas envoyer de limites de paquets pour les rsultats et paramtres. Ne pose aucune question, mme si le pilote souhaite poser des questions. Active ou dsactive le support des curseurs dynamiques. (Interdit en MyODBC 2.50.) Ignore l'utilisation du nom de la base de donnes dans la syntaxe db_name.tbl_name.col_name. Force l'utilisation du gestionnaire de curseur ODBC (exprimental). Dsactive l'utilisation de la lecture tendue (extended fetch, exprimental). Complte les colonnes CHAR jusqu' leur taille maximale. SQLDescribeCol() retourne des noms de colonnes complets. Utilise le protocole client - serveur compress. Indique au serveur qu'il peut ignorer l'espace aprs les noms de fonctions, avant la parenthse ouvrante ( (exig par PowerBuilder). Cela transforme tous les noms de fonctions en mots cls. Connexion au serveur mysqld avec les pipes nomms sous NT. Change les colonnes LONGLONG en INT (certaines applications ne peuvent pas grer les LONGLONG).
8192 16384
1016
MyODBC Configuration
Retourne 'user' comme Table_qualifier et Table_owner de SQLTables (exprimental). Lit les paramtres du client depuis les groupes [client] et [odbc] dans my.cnf. Ajoute certains vrifications de scurit (normalement inutile, mais sais-t-on jamais...) Dsactive les transactions. Active le log de requtes dans le fichier c:\myodbc.sql(/tmp/myodbc.sql). (Activ uniquement en mode dboguage).
1048576 Ne met pas les rsultats en cache localement dans le pilote, mais lit toujours auprs du serveur (mysql_use_result()). Cela ne fonctionne que pour les curseurs directs. Cette option est trs importante pour traiter les trs grandes tables, lorsque vous ne voulez pas que le pilote ne mette en cache toute la table. 2097152 Impose l'utilisation du curseur Forward-only. Dans le cas d'applications qui configurent le type par dfaut des curseurs, et que vous souhaitez malgr tout ne pas mettre en cache les rsultats, cette option imposera un comportement de curseur direct. Pour slectionner plusieurs options en mme temps, additionnez leur valeurs. Par exemple, l'option 12 (4+8) vous donne le dbogugage sans limite de paquets. myodbc3.dll par dfaut est compil pour les meilleures performances. Si vous voulez dboguer MyODBC 3.51 (par exemple, pour activer les traces), vous devriez utiliser myodbc3d.dll. Pour installer ce fichier, copiez le fichier myodbc3d.dll la place de myodbc3.dll. Assurez vous de bien remettre la bonne bibliothque une fois que vous avez fini, car la version de dboguage peut vous ralentir considrablement. Pour MyODBC 2.50, myodbc.dll et myodbcd.dll doivent tre utiliss. La table suivante affiche diffrentes valeurs recommandes pour option : Configuration Microsoft Access Microsoft Visual Basic Grandes tables avec trop de lignes Gnration de trace de dboguage Gnration de log de requtes Gnration de logs de requtes et de traces De grandes tables sans cache Valeur 3 3 2049 4 524288 524292 3145731
1017
MyODBC Configuration
Si votre langage de programmation convertit les anti-slash suivis d'espaces en espace, il est prfrable de spcifier la chane de connexion sous la forme d'une longue chane, ou d'utiliser la concatnation de plusieurs chanes, sans ajouter d'espace entre :
ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" "SERVER=localhost;" "DATABASE=test;" "USER=venu;" "PASSWORD=venu;" "OPTION=3;"
Reportez-vous la section Section 25.1.9.4, Paramtres de connexion , pour la liste complte est paramtres de connexion fournir.
3. La commande GRANT donne tous les droits l'utilisateur myuser pour se connecter depuis le systme B, en utilisant le mot de passe mypassword. Pour excuter cette commande, il faut faut les droits de root sur le systme A, ou un utilisateur quivalent. Pour plus d'informations sur le systme de droits de MySQL, voyez la section Section 5.6, Gestion des comptes utilisateurs de MySQL . Sur le systme B, suivez ces instructions : 1. Configurez un DSN MyODBC en utilisant les informations de connexion suivantes :
DSN = remote_test SERVER or HOST = A (ou l'adresse IP du systme A) DATABASE = test (La base de donnes par dfaut) USER = myuser PASSWORD = mypassword
Pour configurer une connexion sans DSN, voyez Section 25.1.9.5, Se connecter sans dfinir de DSN . 2. Vrifiez si vous tes capables d'accder au systme A depuis le systme B avev un ping ou un autre moyen. Si vous n'tes pas capables d'atteindre B, vrifiez votre rseau, les connexions internet ou alors contactez votre administrateur rseau. 3. Maintenant, essayez de vous connecter en utilisant DSN=remote_test. Si vous chouez, lisez le log MyODBC, et suivez les instructions indiques dans le message d'erreur du log. Si vous avez besoin d'autre support, envoyez un mail to <myodbc@lists.mysql.com>. Vous pouvez aussi lire un HOWTO sur http://www.phphelp.com/tutorial/using-myodbc-to-connect-to-aremote-database.html. 1018
MyODBC Configuration
Sur les machines avec des versions de Microsoft plus anciennes, double-cliquez sur 32-bit ODBC ou ODBC dans le panneau de contrle. 3. Le dialogue ODBC Data Source Administrator apparait :
1019
MyODBC Configuration
4. Cliquez sur Help pour des informations dtailles sur chaque onglet de la bote de dialogue. Activez l'option de trace. Cette procdure est diffrente sur Windows et sur Unix. Pour activer l'option de trace sur Windows : 1. L'onglet Tracing de la bote de dialogue de ODBC Data Source Administrator vous permet de configurer la trace des fonctions ODBC. 2. Lorsque vous activez la trace depuis l'onglet Tracing, le Driver Manager va enregistrer toutes les fonctions ODBC de toutes les futures applications. 3. Les fonctions ODBC des applications en fonctionnement ne sont pas enregistres. Les fonctions ODBC sont enregistres dans le fichier de log que vous spcifiez. 4. La trace cesse aprs que vous ayez cliqu sur Stop Tracing Now. N'oubliez pas que tant que la trace est active, le fichier de log continue de croitre en taille, et que la trace ralentit toutes vos applications ODBC.
Pour activer la trace sous Unix : 1. Sous Unix, vous devez explicitement configurer l'option Trace dans le fichier ODBC.INI. Spcifiez la valeur de ON ou OFF aux options TraceFile et Trace dans le fichier odbc.ini :
TraceFile = /tmp/odbc.trace
1020
MyODBC Configuration
Trace
= 1
TraceFile spcifie le nom et le chemin complet des fichiers de trace, et Trace vaut ON ou OFF. Vous pouvez aussi utiliser 1 ou YES pour ON et 0 ou NO pour OFF. Si vous utilisez ODBCConfig avec unixODBC, alors suivez les instructions de trace d'unixODBC sur HOWTO-ODBCConfig. Pour gnrer un log MyODBC, faites ceci : 1. Assurez-vous que vous utilisez la bibliothque de dboguage DLL, c'est dire myodbc3d.dll et non pas myodbc3.dll de MyODBC 3.51, et myodbcd.dll pour MyODBC 2.50. La mthode la plus facile est de prendre myodbc3d.dll ou myodbcd.dll dans la distribution de MyODBC 3.51 et de la copier le fichier myodbc3.dll ou myodbc.dll, qui est probablement dans votre dossier C:\windows\system32 ou C:\winnt\system32. Notez que vous souhaiterez surement remettre l'ancien fichier myodbc.dll lorsque vous aurez fini, car il est bien plus rapide que myodbc3d.dll et myodbcd.dll : alors gardez une copie de vos fichiers originaux. 2. Activez l'option Trace MyODBC dans l'cran de connexion MyODBC. Le log sera crit dans le fichier C:\myodbc.log. Si l'option de trace n'est pas conserve lorsque vous retournez dans l'cran ci-dessus, cela signifie que vous n'utilisez pas le pilote myodbcd.dll. Sur Linux ou si vous avec une connexion sans DSN, il faut fournir l'option OPTION=4 dans la chane de connexion. 3. Lancez votre application, et essayez de reproduire votre problme. Puis, vrifiez le fichier de trace ODBC. Si vous trouvez un problme, envoyez un message <myodbc@lists.mysql.com> ou <support@mysql.com> si vous avez un contrat de support, avec une brve description de votre problme, et les informations suivantes : version de MyODBC type de pilote ODBC et sa version serveur MySQL et sa version la trace ODBC du gestionnaire de pilote le fichier de log MyODBC du pilote MyODBC un exemple reproductible aussi simple que possible Pensez que plus vous nous fournissez d'explication, plus nous pourrons rsoudre votre problme rapidement. De plus, aprs avoir envoy le rapport de bogue, vrifiez les listes de discussion MyODBC sur http:// lists.mysql.com/.
MyODBC Configuration
Crystal Reports DataJunction Delphi ERwin MS Excel iHTML FileMaker Pro FoxPro Notes 4.5/4.6 MS Visio Enterprise 2000 Vision Visual Objects Visual Interdev SBSS Perl DBD-ODBC Paradox Powerbuilder Powerdesigner 32-bit MS Visual C++ Visual Basic ODBC.NET through CSharp(C#), VB and C++ Data Architect(http://thekompany.com/products/dataarchitect/) SQLExpress for Xbase++(http://www.SQLExpress.net) Open Office (http://www.openoffice.org) How-to: MySQL + OpenOffice. How-to: OpenOffice + MyODBC + unixODBC. Star Office (http://wwws.sun.com/software/star/staroffice/6.0/index.html) G2-ODBC bridge (http://www.gensym.com) Sambar Server (http://www.sambarserver.info) How-to: MyODBC + SambarServer + MySQL. If you know of any other applications that work with MyODBC, please send mail to <myodbc@lists.mysql.com> about them.
1022
MyODBC Configuration
Access Pour faire fonctionner Access : Si vous utilisez Access 2000, il est recommand d'installer la dernire version 2.6 ou plus rcente, de Microsoft MDAC (Microsoft Data Access Components) depuis http:// www.microsoft.com/data/. Cela va corriger un problme dans Access lors de l'exportation de donnes vers MySQL, lorsque le nom de la table et de ses colonnes ne sont pas spcfis. Une autre solution ce problme est de passer en MyODBC 2.50.33 et MySQL 3.23.x, qui, ensemble, fournissent un palliatif ce problme. Nous vous recommandons aussi d'appliquer le Microsoft Jet 4.0 Service Pack 5 (SP5) qui est tlchargeable sur http://support.microsoft.com/default.aspx?scid=kb;EN-US;q239114. Cela corrigera des situations o les colonnes sont marques comme #DELETED# dans Access. Note : si vous utilisez MySQL 3.22, vous devez appliquer le patch MDAC et utiliser MyODBC 2.50.32 ou 2.50.34 et plus rcent pour corriger le problme. Pour toutes les versions d'Access, vous devez activer l'option MyODBC Return matching rows. Pour Access 2.0, il faut aussi activer l'option Simulate ODBC 1.0. Il faut avoir une colonne timestamp dans toutes les tables qui seront modifies. Pour une portabilit maximale, n'utilisez pas de spcification de taille dans la dclaration de la colonne. C'est dire, utilisez TIMESTAMP, et non TIMESTAMP(n), n < 14. Vous devez avoir une cl primaire dans la table. Si non, les nouvelles lignes ou les lignes modifies risquent d'apparaitre comme #DELETED#. Utilisez uniquement des champs dcimaux DOUBLE. Access ne sait pas comparer des dcimaux simple. Le symptme est gnralement que les nouvelles lignes ou les lignes modifies apparaissent comme #DELETED# ou que vous ne pouvez pas trouver ou modifier ces lignes. Si vous utilisez MyODBC pour relier une table qui a une colonne BIGINT, le rsultat risque d'apparatre comme #DELETED. La solution est la suivante : Ajoutez une ou plusieurs colonnes TIMESTAMP. Slectionnez l'option Change BIGINT columns to INT dans le dialogue de connexion ODBC DSN Administrator. Effacez le lien de la table depuis Access et recrez le. Les anciennes lignes seront toujours affiches comme #DELETED#, mais les nouvelles lignes seront affiches correctement. Si vous avez toujours des erreurs de type Another user has changed your data aprs avoir ajout une colonne de type TIMESTAMP, le truc suivant pourra vous aider : N'utilisez pas les donnes de la table table en mode tableau. Au lieu de cela, crez un formulaire avec les champs que vous vouleez, et utilisez le mode tableu de ce form. Activez l'option DefaultValue de la colonne TIMESTAMP, avec la valeur NOW(). C'est une bonne ide que de masquer la colonne TIMESTAMP pour que les utilisateurs ne soient pas perturbs. Dans certains cas, Access gnre des commandes SQL incorrecte que MySQL ne peut pas comprendre. Vous pouvez corriger cela en slectionnant l'option "Query|SQLSpecific|PassThrough" dans le menu d'Access. Sous NT, Access indique que les colonnes BLOB sont des OLE OBJECTS. Si vous voulez avoir des colonnes MEMO la place, changez les colonnes BLOB en TEXT avec ALTER TABLE.
1023
MyODBC Configuration
Access ne peut pas toujours grer les colonnes DATE correctement. Si vous avez des problmes avec avec elles, utilisez DATETIME. Si vous avez une colonne d'Access dfinie commme BYTE, Access va l'exporter comme TINYINT au lieu de TINYINT UNSIGNED. Cela vous posera des problmes si vous avez des valeurs suprieures 127. ADO Lorsque vous codez avec l'API ADO et MyODBC, vous devez faire attention aux proprits par dfaut qui ne sont pas supportes par MySQL. Par exemple, en utilisant CursorLocation Property, adUseServer va retourner un rsultat de 1 pour RecordCount Property. Pour avoir la bonne valeur, vous devez donner la valeur de adUseClient cette proprit, tel que prsent ci-dessous :
Dim Dim Dim Dim myconn As New ADODB.Connection myrs As New Recordset mySQL As String myrows As Long
myconn.Open "DSN=MyODBCsample" mySQL = "SELECT * from user" myrs.Source = mySQL Set myrs.ActiveConnection = myconn myrs.CursorLocation = adUseClient myrs.Open myrows = myrs.RecordCount myrs.Close myconn.Close
Un autre palliatif est d'utiliser SELECT COUNT(*) pour connatre le nombre de lignes. Active server pages (ASP) Il est recommand de slectionner l'option Return matching rows. applications BDE Pour faire fonctionner ces applications, vous devez slectionner les options Don't optimize column widths et Return matching rows. Borland Builder 4 Lorsque vous lancez une requte, vous pouvez utiliser la proprit Active ou la mthode Open. Notez que Active commencera par mettre automatiquement une requte SELECT * FROM .... Cela n'est pas forcment pratique si vos tables sont grandes. ColdFusion (On Unix) Les informations suivantes sont tires de la documentation ColdFusion : Utilisez les informations suivantes pour configurer le serveur ColdFusion pour Linux avec le pilote unixODBC et MyODBC pour MySQL. Allaire a vrifi que MyODBC 2.50.26 fonctionne avec MySQL 3.22.27 et ColdFusion pour Linux. Toutes les versions plus rcentes devraient aussi fonctionner. Vous pouvez tlcharger MyODBC sur http://dev.mysql.com/downloads/connector/odbc/. ColdFusion Version 4.5.1 vous permet d'utiliser l'administrateur ColdFusion pour ajouter des sources de donnes MySQL. Cependant, le pilote n'est pas inclus avec ColdFusion Version 4.5.1. Avant que le pilote MySQL n'apparaisse dans les listes de sources ODBC, vous devez compiler et copier le pilote MyODBC dans /opt/coldfusion/lib/libmyodbc.so.
1024
MyODBC Configuration
Le dossier Contrib contient le programme mydsn-xxx.zip qui vous permet de compiler et supprimer le fichier DSN pour les applications Coldfusion qui utilisent le pilote MyODBC. DataJunction Vous devez changer pour exporter des VARCHAR au lieu des types ENUM, car l'export de ce dernier pose des problmes MySQL. Excel Fonctionne. Quelques conseils : Si vous avez des problmes avec les dates, essayez de les transformer en chane, avec la fonction CONCAT() function. Par exemple :
SELECT CONCAT(rise_time), CONCAT(set_time) FROM sunrise_sunset;
Les valeurs lues comme des chanes seront reconnues correctement par Excel97. Le but de CONCAT() dans cette exemple est de faire croire ODBC que la colonne est de type ``chane''. Sans CONCAT(), ODBC sait que la colonne est de type TIME, et Excel ne le comprendra pas. Notez que c'est un bogue dans Excel, car il convertit automatiquement une chane en heure. Cela serait bien si la source tait un fichier de texte, mais malheureusement ici, la connexion ODBC indique le bon type pour chaque colonne. Word Pour lire des donnes depuis MySQL vers des documents Word/Excel, vous devez utiliser le pilote MyODBC et le Add-in Microsoft Query. Par exemple, pour crer une base de donnes avec une table avec 2 colonnes de texte : Inserez deux lignes avec le client mysql. Crez un fichier DSN file en utilisant le gestionnaire ODBC, par exemple, my, pour la base de donnes cre. Lancez Word. Crez un document vide. Dans la barre d'outil Database, cliquez sur le bouton Insert Database. Cliquez sur le bouton Get Data. Dans la gauche de l'cran Get Data, cliquez sur Ms Query. Dans Ms Query, crez une nouvelle source de donnes en utilisant le DSN my. Slectionnez la nouvelle requte. Slectionnez les colonnes que vous voulez. Ajoutez le filtre que vous voulez. Ajoutez le tri que vous souhaitez. Slectionnez Return Data to Microsoft Word.
1025
MyODBC Configuration
Cliquez sur Finish. Cliquez sur Insert Data et slectionnez les lignes. Cliquez sur OK et voyez les lignes dans votre document Word. odbcadmin Program de test pour ODBC. Delphi Vous devez utiliser BDE Version 3.2 ou plus rcent. Slectionnez l'option Don't optimize column width lors de la connexion MySQL. De plus, il y a des codes pratiques Delphi qui configurer une entre ODBC et une source BDE pour MyODBC. La source BDE requiert BDE Alias Editor qui est gratuit sur Delphi Super Page. (Merci Bryan Brunton <bryan@flesherfab.com> pour cela):
fReg:= TRegistry.Create; fReg.OpenKey('\Software\ODBC\ODBC.INI\DocumentsFab', True); fReg.WriteString('Database', 'Documents'); fReg.WriteString('Description', ' '); fReg.WriteString('Driver', 'C:\WINNT\System32\myodbc.dll'); fReg.WriteString('Flag', '1'); fReg.WriteString('Password', ''); fReg.WriteString('Port', ' '); fReg.WriteString('Server', 'xmark'); fReg.WriteString('User', 'winuser'); fReg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True); fReg.WriteString('DocumentsFab', 'MySQL'); fReg.CloseKey; fReg.Free; Memo1.Lines.Add('DATABASE NAME='); Memo1.Lines.Add('USER NAME='); Memo1.Lines.Add('ODBC DSN=DocumentsFab'); Memo1.Lines.Add('OPEN MODE=READ/WRITE'); Memo1.Lines.Add('BATCH COUNT=200'); Memo1.Lines.Add('LANGDRIVER='); Memo1.Lines.Add('MAX ROWS=-1'); Memo1.Lines.Add('SCHEMA CACHE DIR='); Memo1.Lines.Add('SCHEMA CACHE SIZE=8'); Memo1.Lines.Add('SCHEMA CACHE TIME=-1'); Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT'); Memo1.Lines.Add('SQLQRYMODE='); Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE'); Memo1.Lines.Add('ENABLE BCD=FALSE'); Memo1.Lines.Add('ROWSET SIZE=20'); Memo1.Lines.Add('BLOBS TO CACHE=64'); Memo1.Lines.Add('BLOB SIZE=32'); AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
C++ Builder Test avec BDE Version 3.0. Le seul problme est que lorsque le schma de tables change, les champs de requtes ne sont pas mis jour. BDE, de son cot, ne semble pas reconnatre les cls primaires, et seulement l'index appel PRIMARY, mais ce n'est jamais un problme. Vision Vous devez slectionner l'option Return matching rows. Visual Basic Pour tre capable de modifier une table, vous devez dfinir une cl primaire dans la table.
1026
Visual Basic avec ADO ne peut pas grer les grands entiers. Cela signifie que certaines requtes comme SHOW PROCESSLIST ne fonctionneront pas comme attendu. Pour pallier ce problme, il faut utiliser l'option OPTION=16384 dans la chane de connexion ODBC ou slectionez l'option Change BIGINT columns to INT dans l'cran MyODBC. Vous pouvez aussi slectionner l'option Return matching rows. VisualInterDev SI vous avez un BIGINT dans votre rsultat, vous pouvez aussi avoir l'erreur [Microsoft][ODBC Driver Manager] Driver does not support this parameter Essayez de slectionner Change BIGINT columns to INT dans la configuration MyODBC. Visual Objects Vous devriez slectionner l'option Don't optimize column widths. MS Visio Enterprise 2000 Nous avons cr un diagramme de base de donnes en connectant depuis MS Vision Enterprise 2000 vers MySQL via MyODBC (2.50.37 ou plus rcent) et en utilisant les fonctions de retroingnierie de Visio pour lire les informations sur la base (Visio montre toutes les dfinitions de colonnes, les cls primaires, les index, etc.). De plus, nous avons aussi test la conception de nouvelles tables avec Visio, et avons russi les exporter de MySQL via MyODBC.
25.1.10.1. Durant la configuration d'un DSN MyODBC, une erreur Could Not Load Translator or Setup Library survient
Pour plus d'informations, reportez-vous MS KnowledgeBase Article(Q260558). De plus, assurezvous que vous avez la dernire version ctl3d32.dll dans votre systme.
25.1.11.1. Comment configurer Microsoft Access pour travailler avec MySQL via MyODBC?
Les instructions suivantes doivent tre faites sur votre PC, pour que Microsoft Access fonctionne avec MyODBC. 1. Si vous utilisez Access 2000, vous devez installer la dernire version (2.6 ou plus rcent) de Microsoft MDAC (Microsoft Data Access Components) depuis http://www.microsoft.com/ data/. Cela va corriger un bug d'Access qui survient lors de l'export vers MySQL, si les noms de table et de colonne ne sont pas spcifis. Un autre moyen de contourner ce bug est de passer en MyODBC 2.50.33 et MySQL 3.23.x, qui pallie ce problme.
1027
Il est aussi recommand d'obtenir et appliquer le Microsoft Jet 4.0 Service Pack 5 (SP5), qui est disponible sur http://support.microsoft.com/default.aspx?scid=kb;EN-US;q239114. Cela va corriger certains cas o les colonnes sont marques comme #DELETED# par Access. Note : si vous utilisez MySQL 3.22, vous devez appliquer le patch MDAC et utiliser MyODBC 2.50.32 ou 2.50.34 et plus rcent pour corriger ce problme. 2. Installez la dernire version de MySQL depuis http://dev.mysql.com/downloads/. 3. Installez la dernire version de MyODBC 3.51 ou 2.50 depuis http://dev.mysql.com/downloads/ connector/odbc/. 4. Pour toutes les versions d'Access, il faut activer les options Return matching rows. 5. Utilisez Access comme Access interface pour MySQL via MyODBC.
25.1.11.2. Comment exporter une table ou une requte depuis Access vers MySQL?
Vous ne pouvez pas exporter de table ou requte vers MySQL sans avoir install MyODBC. Pour exporter une table depuis Access vers MySQL, suivez ces instructions : 1. Lorsque vous ouvrez une base de donnes Access ou un projet Access, une fentre de base de donnes apparait. Elle affiche les raccourcis pour crer une nouvelle base de donne, ou ouvrir une base existante.
1028
2. Cliquez sur le nom de la table ou de la requte query que vous souhaitez exporter, puis dans le menu File, slectionnez Export. 3. Dans la boite de dialogue Export Object Type Object name To, dans le champ Save As Type, slectionnez ODBC Databases () comme ci-dessous :
4. Dans la bote de dialogue Export, entrez le nom d'un fichier ou bien utilisez le nom suggr, et slectionnez OK. 5. Le dialogue de slection de source de donnes est alors affich : il affiche les sources de donnes ODBC disponibles sur votre machine. Cliquez sur l'onglet File Data Source ou sur Machine Data Source, puis double-cliquez sur la source MyODBC ou MyODBC 3.51 que vous souhaitez exporter. Pour dfinir une nouvelle source MyODBC, voyez Section 25.1.9.2, Configuration du DSN MyODBC sur Windows . Microsoft Access se connecte alors au serveur via ODBC et exporte les donnes.
25.1.11.3. Comment importer ou relier des bases de donnes MySQL avec Access?
Vous ne pouvez pas exporter une table ou une requte vers un serveur MySQL sans avoir install le pilote MyODBC. Pour importer ou relier des tables depuis MySQL vers Access, suivez les instructions suivantes : 1. Ouvrez la base de donnes, ou passez la fentre de bases de donnes de la base courante. 2. Pour importer des tables, dans le menu File, pointer sur Get External Data, et cliquez sur Import. Pour lier des tables, dans le menu File, pointez sur Get External Data, et cliquez sur Link Tables. 3. Dans le dialogue Import (ou Link), dans le champ Files Of Type, slectionnez ODBC Databases (). Le dialogue Select Data Source liste les diffrentes sources de donnes : toutes les sources de tous les pilotes de votre machine sont listes ici. Cliquez sur l'onglet File Data Source ou Machine Data Source, puis double-cliquez sur une source MyODBC ou MyODBC 3.51, que vous voulez exporter. Pour dfinir une nouvelle source pour MyODBC ou MyODBC 3.51, voyez Section 25.1.9.2, Configuration du DSN MyODBC sur Windows . 4. Si la source ODBC que vous avez slectionn requiert une identification, saisissez votre nom d'utilisateur et votre mot de passe (ainsi que les informations complmentaires ventuelles), puis cliquez sur OK. 5. Microsoft Access se connecte au serveur MySQL via ODBC et affiche la liste des tables que vous pouvez importer ou lier. 6. Cliquez sur chaque table que voulez importer ou lier, puis cliquez sur OK. Si vous liez une table et qu'elle n'a pas d'index unique, alors Microsoft Access affiche une liste de champs dans de la table. Cliquez sur un champ ou une combinaison de champs qui identifieront sans ambiguit une ligne, puis OK.
1029
25.1.11.4. La structure ou la localisation d'une table lie a chang. Est-ce que je peux voir ces changements localement?
Oui. Utilisez la procdure suivante pour voir ou rafrachir les liens lorsque la structure ou la localisation d'une table lie a chang. Le Linked Table Manager liste les chemins de toutes les tables lies courantes. Pour voir ou rafrachir des liens : 1. Ouvrez la base de donnes qui contient les tables lies. 2. Dans le menu Tools, pointez sur Add-ins, et cliquez sur Linked Table Manager. 3. Slectionnez la bote cocher des tables que vous voulez rafrachir. 4. Cliquez sur le bouton OK. Microsoft Access confirme les rafrachissement russit, ou, si une table n'a pu tre trouve, affiche le dialogue Select New Location of <table name>, dans lequel vous pouvez indiquer les nouvelles informations de la table. Si plusieurs tables ont t dplaces, le Linked Table Manager va rechercher dans ce dossier toutes les autres tables slectionnes : il va mettre jour plusieurs liens d'un coup. Pour changer le chemin vers un jeu de tables lies : 1. Ouvrez la base de donnes qui contient les tables lies. 2. Dans le menu Tools, pointer sur Add-ins, et cliquez dans Linked Table Manager. 3. Slectionnez la bote Always Prompt For A New Location. 4. Slectionnez la bote des tables dont vous voulez modifier les liens, et cliquez dans OK. 5. Dans le dialogue Select New Location of <table name>, spcifiez la nouvelle localisation, cliquez dans Open, puis cliquez dans OK.
25.1.11.5. Lorsque j'insre ou modifie une ligne dans des tables lies, j'obtiens #DELETED#
Si la ligne insre ou modifie est prsente comme #DELETED#, alors : Si vous utilisez Access 2000, il est recommand d'installer la dernire version (version 2.6 ou plus rcent) Microsoft MDAC (Microsoft Data Access Components) depuis http:// www.microsoft.com/data/. Cela va corriger un bogue d'Access qui ne spcifie pas les noms des colonnes et des tables lors de leur exportation vers MySQL. Un autre palliatif est de passer en MyODBC 2.50.33 et MySQL 3.23.x, qui compense ce problme. Il est aussi recommand d'appliquer le paquet de service Microsoft Jet 4.0 Service Pack 5 (SP5) qui est disponible sur http://support.microsoft.com/default.aspx?scid=kb;EN-US;q239114. Cela corrigera certains cas o les colonnes sont marques comme #DELETED# dans Access. Note : si vous utilisez MySQL 3.22, vous devez appliquer le patch MDAC et utiliser MyODBC 2.50.32 ou 2.50.34 puis corriger ce problme. Pour toutes les versions d'Access, il est recommand d'activer l'option MyODBC Return matching rows. Pour Access 2.0, il est recommand d'ajouter l'option Simulate ODBC 1.0. Il est recommand d'avoir un timestamp dans toutes les tables que vous voulez pouvoir modifier. Pour une portabilit maximale, n'utilisez pas de taille de colonne dans la dclaration. C'est dire, utilisez TIMESTAMP et non pas TIMESTAMP(n), n < 14. 1030
Il est recommand d'avoir toujours une cl primaire dans une table. Si non, les nouvelles lignes ou les lignes modifies peuvent tre indiques comme #DELETED#. Utilisez uniquement des champs dcimaux DOUBLE. Access choue comparer des dcimaux simples. Le symptme est alors que les nouvelles lignes sont indiques comme #DELETED# ou que vous ne pouvez pas les trouver. Si vous utilisez MyODBC pour relier une table qui as une colonne BIGINT, le rsultat risque d'tre affich comme #DELETED. Le palliatif est : Ajoutez une colonne avec le type TIMESTAMP. Slectionnez l'option Change BIGINT columns to INT dans le dialogue de connexion du gestionnaire ODBC. Effacez le lien de table depuis Access, puis recrez-le. Les anciennes lignes seront affiches comme #DELETED#, mais les nouvelles lignes seront affiches correctement.
25.1.11.7. Lorsque j'exporte une table depuis Access 97, une erreur de syntaxe etrange survient
C'est une erreur trange avec Access 97, qui n'apparait plus avec Access 2000 ou 2002. Vous pouvez contourner ce problme en mettant jour le pilote MyODBC en version MyODBC 3.51.02 ou plus rcente.
25.1.11.8. Access retourne l'erreur Another user has modified the record that you have modified durant l'dition de lignes
Avec certains programmes, cette erreur survient : Another user has modified the record that you have modified. Dans la majorit des cas, ce problme peut tre rsolu avec l'une des techniques suivantes : Ajouter une cl primaire dans la table, s'il n'y en pas. Ajouter une colonne timestamp dans la table, s'il n'y en pas. Utiliser uniquement des nombre dcimaux doubles. Certains programmes chouent lors de la comparaison avec des dcimaux simples. Si ces stratgies ne vous dpannent pas, essayez de faire un log depuis le gestionnaire ODBC (c'est le log que vous obtenez lorsque vous demandez des logs depuis ODBCADMIN), et un log MyODBC vous aideront comprendre ce qui se passe. Pour des instructions, voyez Section 25.1.9.7, Obtenir un fichier de trace ODBC .
1031
25.1.11.11. J'ai de trs grandes tables. Quelle est la meilleure configuration pour que MyODBC accde ces tables?
Si vous avez de trs grandes (longues) tables dans Access, elles peuvent prendre beaucoup de temps s'ouvrir. Ou alors, vous allez consommer beaucoup de mmoire, et finir avec une erreur bloquante de type ODBC Query Failed. Pour rgler ce problme, slectionnez une des options suivantes : Return Matching Rows (2) Allow BIG Results (8). La somme de ces deux options fait alors 10 (OPTION=10).
25.1.11.13. INFO : outils pour exporter/importer des donnes entre Access et MySQL
Voyez la section http://www.mysql.com/portal/software/convertors/ pour une liste d'outils disponibles.
25.1.12.1. Pourquoi est-ce que SELECT COUNT(*) FROM tbl_name retourne une erreur?
L'expression COUNT(*) retourne un entier de type BIGINT, et ADO ne comprend pas les nombres aussi gros. Slectionnez l'option Change BIGINT columns to INT (Valeur 16384).
25.1.12.2. Quand j'utilise les mthodes ADO AppendChunk() ou GetChunk(), j'ai une erreur Multiple-step operation generated errors. Check each status value?
Les mthodes GetChunk() et AppendChunk() d'ADO ne fonctionnent pas comment on l'attend lorsque la position du curseur est spcifie avec adUseServer. D'un autre cot, vous pouvez pallier cette erreur avec adUseClient. Un exemple simple est disponible sur http://www.dwam.net/iishelp/ado/docs/adomth02_4.htm.
25.1.12.3. Comment connatre le nombre total de lignes affectes par une requtet SQL, avec ADO?
Vous pouvez utiliser la proprit RecordsAffected de la mthode ADO execute. Pour plus d'informations sur l'utilisation de cette mthode, voyez http://msdn.microsoft.com/library/default.asp? url=/library/en-us/ado270/htm/mdmthcnnexecute.asp.
1032
25.1.12.4. Comment puis-je grer des donnes BLOB avec Visual Basic?
Voici un excellent article de Mike Hillyer (<m.hillyer@telusplanet.net>); qui explique comment insrer et/ou lire des donnes dans des colonnes de type BOLD via MyODBC depuis ADO: MySQL BLOB columns and Visual Basic 6.
25.1.12.5. Comment associer les types de donnes de Visual Basic avec ceux de MySQL?
Voici un autre article brillant de Mike Hillyer (<m.hillyer@telusplanet.net>) : How to map Visual basic data type to MySQL types.
25.1.12.8. INFO: Question frquemment pose sur les objets ActiveX Data Objects (ADO)
Pour plus d'informations, voyez ActiveX Data Objects(ADO) Freqently Asked Questions.
25.1.13.1. Comment lire les donnes MySQL dans un document Word ou Excel?
Pour lire les donnes de MySQL vers Word/Excel, vous devez installer le pilote MyODBC et le compagnon Microsoft Query (Add-in Office). Par exemple, crez une base de donnes avec une table, contenant les deux colonnes suivantes : Insrez des lignes avec le client mysql. Crez un fichier DSN avec le gestionnaire ODBC, par exemple my, pour la base de donnes quie vous avez cr. Lancez Word.
1033
Crez un nouveau document vide. Dans la barre d'outil Database, pressez le bouton Insert Database. Pressez le bouton Get Data. Sur la gauche de l'cran de Get Data, pressez le bouton Ms Query. Dans Ms Query, crez une nouvelle source de donnes, en utilisant le fichier my. Selectionnez une requte. Slectionnez les colonnes que vous dsirez. Ajoutez un filtre si vous voulez. Ajoutez un tri si vous voulez. Slectionnez Return Data to Microsoft Word. Cliquez sur le bouton Finish. Cliquez sur le bouton Insert Data et slectionnez les lignes. Cliquez sur le bouton OK et vous pouvez voir les lignes dans votre document Word.
25.1.13.2. L'export des tables depuis MS DTS vers MySQL avec MyODBC conduit une erreur de syntaxe
Ce problme est similaire celui de Access 97 lorsque votre table est constitue de donnes de type TEXT ou VARCHAR. Vous pouvez corriger ce problme en mettant jour votre pilote MyODBC en version 3.51.02 ou plus rcent.
Ou, si vous voulez juste insrer cette valeur dans une autre table :
INSERT INTO foo (auto,text) VALUES(NULL,'text'); INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');
See Section 24.2.13.3, Comment lire l'identifiant unique de la dernire ligne insre . Pour quelques applications utilisant ODBC (du moins Delphi et Access), la requte suivante peut tre utilise pour trouver une ligne insre dernirement :
1034
25.1.14.5. Puis-je utiliser des applications MyODBC 2.50 avec MyODBC 3.51?
Oui. Si vous trouvez une erreur avec MyODBC 3.51 qui n'apparait pas avec MyODBC 2.50, envoyez un message mail <myodbc@lists.mysql.com>
25.1.14.7. Pourquoi est-ce que MyODBC s'excute lentement et fait beaucoup d'accs disques pour de petites requtes?
MyODBC est bien plus rapide que n'importe quel autre pilote ODBC. Des lenteurs peuvent tre causes par la mauvaise utilisation des options suivantes. L'option ODBC Tracing est active. Vous pouvez vrifier si sette option est active en suivant les instructions suivantes : here.
1035
Comme vous pouvez le voir dans l'image ci-dessus, l'option 'When to trace' du gestionnaire de sources de donnes ODBC, onglet 'Tracing', doit toujours pointer sur 'Start Tracing Now', au lieu de 'Stop Tracing Now'. La version Debug version du pilote est utilise. Si vous utilisez la version de dboguage de la bibliothque DLL, vous sera ralentit par les traitements supplmentaires. Vous pouvez vrifier que vous utilisez la version de dboguage ou non en lisant la section commentaire 'Comments' des proprits de la bibliothque DLL (dans le dossier systme, faites un clic droit sur le pilote DLL et choisissez les proprits), tel que prsent ci-dessous :
1036
L'option Driver trace and query logs est active. Mme si vous envisagez d'utiliser la version de dboguage du pilote (il est recommand de toujours utiliser la version de production), assurez vous que les traces du pilote et que les logs de requtes (options OPTION=4,524288 respectivement) ne sont pas actives :
1037
1038
1039
SQLConnect
Oui
Oui
ISO 92
SQLDriverConnect Oui
Oui
ODBC
SQLAllocEnv SQLAllocConnect
Oui Oui
Oui Oui
Obsolte Obsolte
Obtenir des informations sur les pilotes et les sources de donnes : Nom de la fonction SQLDataSources MyODBC 2.50 Non MyODBC 3.51 Non ISO 92 Retourne la liste des sources de donnes disponibles, gres par le gestionnaire de pilotes. Retourne la liste des pilotes installs, leurs attributs et les pointeurs Retourne les informations sur un pilote spcifique et ses sources de donnes. Retourne les fonctions supportes par le pilote. Retourne les informations sur les types de donnes supportes. Conformit Utilisation
SQLDrivers
Non
Non
ODBC
SQLGetInfo
Oui
Oui
ISO 92
SQLGetFunctions SQLGetTypeInfo
Oui Oui
Oui Oui
ISO 92 ISO 92
1040
Nom de la fonction
MyODBC 2.50
MyODBC 3.51 Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui
Conformit ISO 92 ISO 92 Obsolte Obsolte ISO 92 ISO 92 ISO 92 ISO 92 Obsolte Obsolte
Utilisation Configure un attribut de connexion. Retourne un attribut de connexion. Configure une option de connexion. Retourne une option de connexion. Configure un attribut d'environnement. Retourne un attribut d'environnement. Configure un attribut de commande. Retourne un attribut de commande. Configure une option de commande. Retourne une option de commande.
SQLSetConnectAttrNon SQLGetConnectAttrNon SQLSetConnectOption Oui SQLGetConnectOption Oui SQLSetEnvAttr SQLGetEnvAttr SQLSetStmtAttr SQLGetStmtAttr Non Non Non Non
Prparation des commandes SQL : Nom de la fonction SQLAllocStmt SQLPrepare MyODBC 2.50 Oui Oui MyODBC 3.51 Oui Oui Oui Oui Oui Oui Obsolte ISO 92 ODBC ISO 92 ISO 92 ODBC Alloue un pointeur de connexion. Prpare une commande SQL pour excution ultrieure. Assigne un paramtre de commande SQL. Retourne le nom du curseur associ une commande. Spcifie un nom de curseur. Configure les options qui contrle un curseur. Conformit Utilisation
Envoi de requte : Nom de la fonction SQLExecute SQLExecDirect SQLNativeSql MyODBC 2.50 Oui Oui Oui MyODBC 3.51 Oui Oui Oui ISO 92 ISO 92 ODBC Excute une commande prpare. Excute une commande. Retourne le texte d'une commande, tel que traduit par le pilote. Retourne la description d'un paramtre spcifique d'une commande. Conformit Utilisation
SQLDescribeParam Oui
Oui
ODBC
1041
SQLNumParams SQLParamData
Oui Oui
Oui Oui
ISO 92 ISO 92
Retourne le nombre de paramtre dans une commande. Utilis en conjonction avec SQLPutData pour fournir des donnes supplmentaires au moment de l'excution : pratique pour les donnes de grande taille. Envoie une partie ou toute une valeur de paramtre : pratique pour les donnes de grande taille.
SQLPutData
Oui
Oui
ISO 92
Lecture de rsultats et d'informations sur les rsultats : Nom de la fonction SQLRowCount MyODBC 2.50 Oui MyODBC 3.51 Oui ISO 92 Retourne le nombre de lignes affectes par une insertion, une modification ou un effacement. Retourne le nombre de colonnes dans un rsultat. Dcrit une colonne dans un rsultat. Dcrit un attribut d'une colonne de rsultat. Dcrit les attributs d'une colonne dans un rsultat. Retourne les lignes d'un rsultat multiple. Retourne un rsultat scrollable. Retourne un rsultat scrollable Place un curseur dans un bloc lu, et laisse l'application rafraichir les donnes dans le rsultat, pour modifier ou effacer des lignes dans le rsultat. Effectue des insertions de masse et des oprations de masse, y compris les modification, effacement et lecture par signet. Conformit Utilisation
SQLBulkOperationsNon
Oui
ODBC
Lecture des erreurs et diagnostics : Nom de la fonction SQLError MyODBC 2.50 Oui MyODBC 3.51 Oui Obsolte Retourne des informations supplmentaires sur une erreur ou un statut. Retourne des informations supplmentaires sur un diagnostic (un seul champ de la structure de diagnostic). Conformit Utilisation
SQLGetDiagField
Oui
Oui
ISO 92
1042
SQLGetDiagRec
Oui
Oui
ISO 92
Retourne des informations supplmentaires sur un diagnostic (champ multiple de la structure de diagnostic).
Obtention des informations sur la source de donnes (catalogue de fonctions) : Nom de la fonction MyODBC 2.50 SQLColumnPrivileges Oui MyODBC 3.51 Oui ODBC Retourne la liste des colonnes et les droits associs pour une ou plusieurs tables. Retourne la liste des noms de colonnes pour les tables spcifies. Retourne la liste des noms de colonnes dans une cl trangre, s'il en existe pour les tables mentionnes. Retourne la liste des noms de colonnes de la cl primaire pour la table. Retourne des informations sur le jeu de colonnes optimal qui identifie de manire unique une ligne, ou les colonnes qui sont automatiquement modifie si une ligne est modifie par une transaction. Retourne des statistiques sur une table, et la liste des index associs. Rertourne la liste des tables et les droits associs de chaque table. Retourne la liste des noms de tables stocks dans une source de donnes spcifique. Conformit Utilisation
SQLColumns
Oui
Oui
X/Open
SQLForeignKeys
Oui
Oui
ODBC
SQLPrimaryKeys
Oui
Oui
ODBC
SQLSpecialColumnsOui
Oui
X/Open
SQLStatistics
Oui
Oui
ISO 92
Oui Oui
ODBC X/Open
Excution des transactions : Nom de la fonction SQLTransact SQLEndTran MyODBC 2.50 Oui Non MyODBC 3.51 Oui Oui Obsolte ISO 92 Archive ou annule une transaction Archive ou annule une transaction. Conformit Utilisation
Terminaison d'une commande : Nom de la fonction SQLFreeStmt MyODBC 2.50 Oui MyODBC 3.51 Oui ISO 92 Termine le traitement d'une commande, dtruit les rsultats et libre toute les ressources. Conformit Utilisation
1043
SQLCloseCursor SQLCancel
Oui Oui
Oui Oui
ISO 92 ISO 92
Dtruit un curseur ouvert par une commande. Annule une commande SQL.
Fin d'une connexion : Nom de la fonction SQLDisconnect SQLFreeHandle MyODBC 2.50 Oui Non MyODBC 3.51 Oui Oui ISO 92 ISO 92 Ferme la connexion. Libre les ressources occupes par un environnement, une connexion, une commande ou un descripteur. Libre les ressources d'une commande. Libre les ressources d'un environnement. Conformit Utilisation
SQLFreeConnect SQLFreeEnv
Oui Oui
Oui Oui
Obsolte Obsolte
1044
real double float double precision date time year datetime timestamp text varchar enum set bit bool
SQL_FLOAT SQL_FLOAT SQL_REAL SQL_DOUBLE SQL_DATE SQL_TIME SQL_SMALLINT SQL_TIMESTAMP SQL_TIMESTAMP SQL_VARCHAR SQL_VARCHAR SQL_VARCHAR SQL_VARCHAR SQL_CHAR SQL_CHAR
SQL_C_DOUBLE SQL_C_DOUBLE SQL_C_FLOAT SQL_C_DOUBLE SQL_C_DATE SQL_C_TIME SQL_C_SHORT SQL_C_TIMESTAMP SQL_C_TIMESTAMP SQL_C_CHAR SQL_C_CHAR SQL_C_CHAR SQL_C_CHAR SQL_C_CHAR SQL_C_CHAR
1045
521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 0 0 0 0 0 0 0 0
S1010 S1011 S1012 S1013 S1015 S1024 S1090 S1091 S1092 S1093 S1095 S1106 S1117 S1109 S1C00 21S01 23000 42000 42S02 42S12 42S21 42S22 08S01
HY010 HY011 HY012 HY013 HY015 HY024 HY090 HY091 HY092 HY093 HY095 HY106 HY117 HY109 HYC00 21S01 23000 42000 42S02 42S12 42S21 42S22 08S01
Function sequence error Attribute can not be set now Invalid transaction operation code Memory management error No cursor name available Invalid attribute value Invalid string or buffer length Invalid descriptor field identifier Invalid attribute/option identifier Invalid parameter number Function type out of range Fetch type out of range Row value out of range Invalid cursor position Optional feature not implemented Column count does not match value count Integrity constraint violation Syntax error or access violation Base table or view not found Index not found Column already exists Column not found Communication link failure
'connect to MySQL server using MySQL ODBC 3.51 Driver Set conn = New ADODB.Connection conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};"_ & "SERVER=localhost;"_ & " DATABASE=test;"_ & "UID=venu;PWD=venu; OPTION=3" conn.Open 'create table conn.Execute "DROP TABLE IF EXISTS my_ado" conn.Execute "CREATE TABLE my_ado(id int not null primary key, name varchar(20)," _ & "txt text, dt date, tm time, ts timestamp)"
1046
'direct insert conn.Execute "INSERT INTO my_ado(id,name,txt) values(1,100,'venu')" conn.Execute "INSERT INTO my_ado(id,name,txt) values(2,200,'MySQL')" conn.Execute "INSERT INTO my_ado(id,name,txt) values(3,300,'Delete')" Set rs = New ADODB.Recordset rs.CursorLocation = adUseServer 'fetch the initial table .. rs.Open "SELECT * FROM my_ado", conn Debug.Print rs.RecordCount rs.MoveFirst Debug.Print String(50, "-") & "Initial my_ado Result Set " & String(50, "-") For Each fld In rs.Fields Debug.Print fld.Name, Next Debug.Print Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next rs.MoveNext Debug.Print Loop rs.Close 'rs insert rs.Open "select * from my_ado", conn, adOpenDynamic, adLockOptimistic rs.AddNew rs!Name = "Monty" rs!txt = "Insert row" rs.Update rs.Close 'rs update rs.Open "SELECT * FROM my_ado" rs!Name = "update" rs!txt = "updated-row" rs.Update rs.Close 'rs update second time.. rs.Open "SELECT * FROM my_ado" rs!Name = "update" rs!txt = "updated-second-time" rs.Update rs.Close 'rs delete rs.Open "SELECT * FROM my_ado" rs.MoveNext rs.MoveNext rs.Delete rs.Close 'fetch the updated table .. rs.Open "SELECT * FROM my_ado", conn Debug.Print rs.RecordCount rs.MoveFirst Debug.Print String(50, "-") & "Updated my_ado Result Set " & String(50, "-") For Each fld In rs.Fields Debug.Print fld.Name, Next Debug.Print Do Until rs.EOF For Each fld In rs.Fields Debug.Print fld.Value, Next rs.MoveNext
1047
'connect to MySQL using MySQL ODBC 3.51 Driver Set ws = DBEngine.CreateWorkspace("", "venu", "venu", dbUseODBC) str = "odbc;DRIVER={MySQL ODBC 3.51 Driver};"_ & "SERVER=localhost;"_ & " DATABASE=test;"_ & "UID=venu;PWD=venu; OPTION=3" Set conn = ws.OpenConnection("test", dbDriverNoPrompt, False, str) 'Create table my_dao Set queryDef = conn.CreateQueryDef("", "drop table if exists my_dao") queryDef.Execute Set queryDef = conn.CreateQueryDef("", "create table my_dao(Id INT AUTO_INCREMENT PRIMARY KEY, " _ & "Ts TIMESTAMP(14) NOT NULL, Name varchar(20), queryDef.Execute 'Insert new records using rs.addNew Set rs = conn.OpenRecordset("my_dao") Dim i As Integer For i = 10 To 15 rs.AddNew rs!Name = "insert record" & i rs!Id2 = i rs.Update Next i rs.Close 'rs update.. Set rs = conn.OpenRecordset("my_dao") rs.Edit rs!Name = "updated-string" rs.Update rs.Close 'fetch the table back... Set rs = conn.OpenRecordset("my_dao", dbOpenDynamic) str = "Results:" rs.MoveFirst While Not rs.EOF str = " " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2 Debug.Print "DATA:" & str rs.MoveNext Wend 'rs Scrolling rs.MoveFirst str = " FIRST ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2 Debug.Print str rs.MoveLast str = " LAST ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2 Debug.Print str
1048
rs.MovePrevious str = " LAST-1 ROW: " & rs!Id & " , " & rs!Name & ", " & rs!Ts & ", " & rs!Id2 Debug.Print str 'free all resources rs.Close queryDef.Close conn.Close ws.Close End Sub
'drop table my_rdo SQL = "drop table if exists my_rdo" cn.Execute SQL, rdExecDirect 'create table my_rdo SQL = "create table my_rdo(id int, name varchar(20))" cn.Execute SQL, rdExecDirect 'insert - direct SQL = "insert into my_rdo values (100,'venu')" cn.Execute SQL, rdExecDirect SQL = "insert into my_rdo values (200,'MySQL')" cn.Execute SQL, rdExecDirect 'rs insert SQL = "select * from my_rdo" Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect) rs.AddNew rs!id = 300 rs!Name = "Insert1" rs.Update rs.Close 'rs insert SQL = "select * from my_rdo" Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect) rs.AddNew rs!id = 400 rs!Name = "Insert 2" rs.Update rs.Close 'rs update SQL = "select * from my_rdo" Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect) rs.Edit rs!id = 999 rs!Name = "updated" rs.Update
1049
rs.Close 'fetch back... SQL = "select * from my_rdo" Set rs = cn.OpenResultset(SQL, rdOpenStatic, rdConcurRowVer, rdExecDirect) Do Until rs.EOF For Each cl In rs.rdoColumns Debug.Print cl.Value, Next rs.MoveNext Debug.Print Loop Debug.Print "Row count="; rs.RowCount 'close rs.Close cn.Close End Sub
+ +
3.51 Driver};" + +
1050
//Connect to MySQL using MyODBC OdbcConnection MyConnection = new OdbcConnection(MyConString); MyConnection.Open(); Console.WriteLine("\n !!! success, connected successfully !!!\n"); //Display connection information Console.WriteLine("Connection Information:"); Console.WriteLine("\tConnection String:" + MyConnection.ConnectionString); Console.WriteLine("\tConnection Timeout:" + MyConnection.ConnectionTimeout); Console.WriteLine("\tDatabase:" + MyConnection.Database); Console.WriteLine("\tDataSource:" + MyConnection.DataSource); Console.WriteLine("\tDriver:" + MyConnection.Driver); Console.WriteLine("\tServerVersion:" + MyConnection.ServerVersion); //Create a sample table OdbcCommand MyCommand = new OdbcCommand("DROP TABLE IF EXISTS my_odbc_net",MyConnection); MyCommand.ExecuteNonQuery(); MyCommand.CommandText = "CREATE TABLE my_odbc_net(id int, name varchar(20), idb bigint)"; MyCommand.ExecuteNonQuery(); //Insert MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(10,'venu', 300)"; Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery());; //Insert MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(20,'mysql',400)"; Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery()); //Insert MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(20,'mysql',500)"; Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery()); //Update MyCommand.CommandText = "UPDATE my_odbc_net SET id=999 WHERE id=20"; Console.WriteLine("Update, Total rows affected:" + MyCommand.ExecuteNonQuery()); //COUNT(*) MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_odbc_net"; Console.WriteLine("Total Rows:" + MyCommand.ExecuteScalar()); //Fetch MyCommand.CommandText = "SELECT * FROM my_odbc_net"; OdbcDataReader MyDataReader; MyDataReader = MyCommand.ExecuteReader(); while (MyDataReader.Read()) { if(string.Compare(MyConnection.Driver,"myodbc3.dll") == 0) { Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " + MyDataReader.GetString(1) + " " + MyDataReader.GetInt64(2)); //Supported only by MyODBC 3.51 } else { Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " + MyDataReader.GetString(1) + " " + MyDataReader.GetInt32(2)); //BIGINTs not supported by MyODBC } } //Close all resources MyDataReader.Close(); MyConnection.Close(); } catch (OdbcException MyOdbcException)//Catch any ODBC exception .. { for (int i=0; i < MyOdbcException.Errors.Count; i++) { Console.Write("ERROR #" + i + "\n" + "Message: " + MyOdbcException.Errors[i].Message + "\n" + "Native: " + MyOdbcException.Errors[i].NativeError.ToString() + "\n" + "Source: " + MyOdbcException.Errors[i].Source + "\n" +
1051
25.1.20.2. ODBC.NET: VB
L'exemple suivante cre une table my_vb_net et illustre l'utilisation de VB.
' ' ' ' ' ' ' @sample @purpose @author : myvb.vb : Demo sample for ODBC.NET using MyODBC : Venu, <venu@mysql.com>
' ' build command ' ' vbc /target:exe ' /out:myvb.exe ' /r:Microsoft.Data.Odbc.dll ' /r:System.dll ' /r:System.Data.dll ' Imports Microsoft.Data.Odbc Imports System Module myvb Sub Main() Try 'MyODBC 3.51 connection string Dim MyConString As String = "DRIVER={MySQL ODBC 3.51 Driver};" & _ "SERVER=localhost;" & _ "DATABASE=test;" & _ "UID=venu;" & _ "PASSWORD=venu;" & _ "OPTION=3;" 'Connection Dim MyConnection As New OdbcConnection(MyConString) MyConnection.Open() Console.WriteLine ("Connection State::" & MyConnection.State.ToString) 'Drop Console.WriteLine ("Dropping table") Dim MyCommand As New OdbcCommand() MyCommand.Connection = MyConnection MyCommand.CommandText = "DROP TABLE IF EXISTS my_vb_net" MyCommand.ExecuteNonQuery() 'Create Console.WriteLine ("Creating....") MyCommand.CommandText = "CREATE TABLE my_vb_net(id int, name varchar(30))" MyCommand.ExecuteNonQuery() 'Insert MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(10,'venu')" Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'Insert MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(20,'mysql')" Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'Insert MyCommand.CommandText = "INSERT INTO my_vb_net VALUES(20,'mysql')"
1052
Crdits
Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'Insert MyCommand.CommandText = "INSERT INTO my_vb_net(id) VALUES(30)" Console.WriteLine("INSERT, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'Update MyCommand.CommandText = "UPDATE my_vb_net SET id=999 WHERE id=20" Console.WriteLine("Update, Total rows affected:" & MyCommand.ExecuteNonQuery()) 'COUNT(*) MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_vb_net" Console.WriteLine("Total Rows:" & MyCommand.ExecuteScalar()) 'Select Console.WriteLine ("Select * FROM my_vb_net") MyCommand.CommandText = "SELECT * FROM my_vb_net" Dim MyDataReader As OdbcDataReader MyDataReader = MyCommand.ExecuteReader While MyDataReader.Read If MyDataReader("name") Is DBNull.Value Then Console.WriteLine ("id = " & CStr(MyDataReader("id")) & " "NULL") Else Console.WriteLine ("id = " & CStr(MyDataReader("id")) & " CStr(MyDataReader("name"))) End If End While 'Catch ODBC Exception Catch MyOdbcException As OdbcException Dim i As Integer Console.WriteLine (MyOdbcException.ToString) 'Catch program exception Catch MyException As Exception Console.WriteLine (MyException.ToString) End Try End Sub End Module
25.1.21. Crdits
Voici la liste des dveloppeurs qui ont travaill sur les pilotes MyODBC et MyODBC 3.51 de MySQL AB. Micheal (Monty) Widenius Venu Anuganti Peter Harvey
1053
1054
1055
Erreur: 1011 SQLSTATE: HY000 (ER_CANT_DELETE_FILE) Message: Erreur en effaant '%s' (Errcode: %d) Erreur: 1012 SQLSTATE: HY000 (ER_CANT_FIND_SYSTEM_REC) Message: Ne peut lire un enregistrement de la table 'system' Erreur: 1013 SQLSTATE: HY000 (ER_CANT_GET_STAT) Message: Ne peut obtenir le status de '%s' (Errcode: %d) Erreur: 1014 SQLSTATE: HY000 (ER_CANT_GET_WD) Message: Ne peut obtenir le rpertoire de travail (Errcode: %d) Erreur: 1015 SQLSTATE: HY000 (ER_CANT_LOCK) Message: Ne peut verrouiller le fichier (Errcode: %d) Erreur: 1016 SQLSTATE: HY000 (ER_CANT_OPEN_FILE) Message: Ne peut ouvrir le fichier: '%s' (Errcode: %d) Erreur: 1017 SQLSTATE: HY000 (ER_FILE_NOT_FOUND) Message: Ne peut trouver le fichier: '%s' (Errcode: %d) Erreur: 1018 SQLSTATE: HY000 (ER_CANT_READ_DIR) Message: Ne peut lire le rpertoire de '%s' (Errcode: %d) Erreur: 1019 SQLSTATE: HY000 (ER_CANT_SET_WD) Message: Ne peut changer le rpertoire pour '%s' (Errcode: %d) Erreur: 1020 SQLSTATE: HY000 (ER_CHECKREAD) Message: Enregistrement modifi depuis sa dernire lecture dans la table '%s' Erreur: 1021 SQLSTATE: HY000 (ER_DISK_FULL) Message: Disque plein (%s). J'attend que quelqu'un libre de l'espace... Erreur: 1022 SQLSTATE: 23000 (ER_DUP_KEY) Message: Ecriture impossible, doublon dans une cl de la table '%s' Erreur: 1023 SQLSTATE: HY000 (ER_ERROR_ON_CLOSE) Message: Erreur a la fermeture de '%s' (Errcode: %d) Erreur: 1024 SQLSTATE: HY000 (ER_ERROR_ON_READ) Message: Erreur en lecture du fichier '%s' (Errcode: %d) Erreur: 1025 SQLSTATE: HY000 (ER_ERROR_ON_RENAME) Message: Erreur en renommant '%s' en '%s' (Errcode: %d) Erreur: 1026 SQLSTATE: HY000 (ER_ERROR_ON_WRITE) Message: Erreur d'criture du fichier '%s' (Errcode: %d) Erreur: 1027 SQLSTATE: HY000 (ER_FILE_USED)
1056
Message: '%s' est verrouill contre les modifications Erreur: 1028 SQLSTATE: HY000 (ER_FILSORT_ABORT) Message: Tri alphabtique abandonn Erreur: 1029 SQLSTATE: HY000 (ER_FORM_NOT_FOUND) Message: La vue (View) '%s' n'existe pas pour '%s' Erreur: 1030 SQLSTATE: HY000 (ER_GET_ERRNO) Message: Reu l'erreur %d du handler de la table Erreur: 1031 SQLSTATE: HY000 (ER_ILLEGAL_HA) Message: Le handler de la table '%s' n'a pas cette option Erreur: 1032 SQLSTATE: HY000 (ER_KEY_NOT_FOUND) Message: Ne peut trouver l'enregistrement dans '%s' Erreur: 1033 SQLSTATE: HY000 (ER_NOT_FORM_FILE) Message: Information erronne dans le fichier: '%s' Erreur: 1034 SQLSTATE: HY000 (ER_NOT_KEYFILE) Message: Index corrompu dans la table: '%s'; essayez de le rparer Erreur: 1035 SQLSTATE: HY000 (ER_OLD_KEYFILE) Message: Vieux fichier d'index pour la table '%s'; rparez le! Erreur: 1036 SQLSTATE: HY000 (ER_OPEN_AS_READONLY) Message: '%s' est en lecture seulement Erreur: 1037 SQLSTATE: HY001 (ER_OUTOFMEMORY) Message: Manque de mmoire. Redmarrez le dmon et r-essayez (%d octets ncessaires) Erreur: 1038 SQLSTATE: HY001 (ER_OUT_OF_SORTMEMORY) Message: Manque de mmoire pour le tri. Augmentez-la. Erreur: 1039 SQLSTATE: HY000 (ER_UNEXPECTED_EOF) Message: Fin de fichier inattendue en lisant '%s' (Errcode: %d) Erreur: 1040 SQLSTATE: 08004 (ER_CON_COUNT_ERROR) Message: Trop de connections Erreur: 1041 SQLSTATE: HY000 (ER_OUT_OF_RESOURCES) Message: Manque de 'threads'/mmoire Erreur: 1042 SQLSTATE: 08S01 (ER_BAD_HOST_ERROR) Message: Ne peut obtenir de hostname pour votre adresse Erreur: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
1057
Message: Mauvais 'handshake' Erreur: 1044 SQLSTATE: 42000 (ER_DBACCESS_DENIED_ERROR) Message: Accs refus pour l'utilisateur: '%s'@'@%s'. Base '%s' Erreur: 1045 SQLSTATE: 28000 (ER_ACCESS_DENIED_ERROR) Message: Accs refus pour l'utilisateur: '%s'@'@%s' (mot de passe: %s) Erreur: 1046 SQLSTATE: 3D000 (ER_NO_DB_ERROR) Message: Aucune base n'a t slectionne Erreur: 1047 SQLSTATE: 08S01 (ER_UNKNOWN_COM_ERROR) Message: Commande inconnue Erreur: 1048 SQLSTATE: 23000 (ER_BAD_NULL_ERROR) Message: Le champ '%s' ne peut tre vide (null) Erreur: 1049 SQLSTATE: 42000 (ER_BAD_DB_ERROR) Message: Base '%s' inconnue Erreur: 1050 SQLSTATE: 42S01 (ER_TABLE_EXISTS_ERROR) Message: La table '%s' existe dj Erreur: 1051 SQLSTATE: 42S02 (ER_BAD_TABLE_ERROR) Message: Table '%s' inconnue Erreur: 1052 SQLSTATE: 23000 (ER_NON_UNIQ_ERROR) Message: Champ: '%s' dans %s est ambigu Erreur: 1053 SQLSTATE: 08S01 (ER_SERVER_SHUTDOWN) Message: Arrt du serveur en cours Erreur: 1054 SQLSTATE: 42S22 (ER_BAD_FIELD_ERROR) Message: Champ '%s' inconnu dans %s Erreur: 1055 SQLSTATE: 42000 (ER_WRONG_FIELD_WITH_GROUP) Message: '%s' n'est pas dans 'group by' Erreur: 1056 SQLSTATE: 42000 (ER_WRONG_GROUP_FIELD) Message: Ne peut regrouper '%s' Erreur: 1057 SQLSTATE: 42000 (ER_WRONG_SUM_SELECT) Message: Vous demandez la fonction sum() et des champs dans la mme commande Erreur: 1058 SQLSTATE: 21S01 (ER_WRONG_VALUE_COUNT) Message: Column count doesn't match value count Erreur: 1059 SQLSTATE: 42000 (ER_TOO_LONG_IDENT)
1058
Message: Le nom de l'identificateur '%s' est trop long Erreur: 1060 SQLSTATE: 42S21 (ER_DUP_FIELDNAME) Message: Nom du champ '%s' dj utilis Erreur: 1061 SQLSTATE: 42000 (ER_DUP_KEYNAME) Message: Nom de clef '%s' dj utilis Erreur: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY) Message: Duplicata du champ '%s' pour la clef %d Erreur: 1063 SQLSTATE: 42000 (ER_WRONG_FIELD_SPEC) Message: Mauvais paramtre de champ pour le champ '%s' Erreur: 1064 SQLSTATE: 42000 (ER_PARSE_ERROR) Message: %s prs de '%s' la ligne %d Erreur: 1065 SQLSTATE: 42000 (ER_EMPTY_QUERY) Message: Query est vide Erreur: 1066 SQLSTATE: 42000 (ER_NONUNIQ_TABLE) Message: Table/alias: '%s' non unique Erreur: 1067 SQLSTATE: 42000 (ER_INVALID_DEFAULT) Message: Valeur par dfaut invalide pour '%s' Erreur: 1068 SQLSTATE: 42000 (ER_MULTIPLE_PRI_KEY) Message: Plusieurs clefs primaires dfinies Erreur: 1069 SQLSTATE: 42000 (ER_TOO_MANY_KEYS) Message: Trop de clefs sont dfinies. Maximum de %d clefs allou Erreur: 1070 SQLSTATE: 42000 (ER_TOO_MANY_KEY_PARTS) Message: Trop de parties specifies dans la clef. Maximum de %d parties Erreur: 1071 SQLSTATE: 42000 (ER_TOO_LONG_KEY) Message: La cl est trop longue. Longueur maximale: %d Erreur: 1072 SQLSTATE: 42000 (ER_KEY_COLUMN_DOES_NOT_EXITS) Message: La cl '%s' n'existe pas dans la table Erreur: 1073 SQLSTATE: 42000 (ER_BLOB_USED_AS_KEY) Message: Champ BLOB '%s' ne peut tre utilis dans une cl Erreur: 1074 SQLSTATE: 42000 (ER_TOO_BIG_FIELDLENGTH) Message: Champ '%s' trop long (max = %lu). Utilisez un BLOB Erreur: 1075 SQLSTATE: 42000 (ER_WRONG_AUTO_KEY)
1059
Message: Un seul champ automatique est permis et il doit tre index Erreur: 1076 SQLSTATE: HY000 (ER_READY) Message: %s: Prt pour des connections Version: '%s' socket: '%s' port: %d Erreur: 1077 SQLSTATE: HY000 (ER_NORMAL_SHUTDOWN) Message: %s: Arrt normal du serveur Erreur: 1078 SQLSTATE: HY000 (ER_GOT_SIGNAL) Message: %s: Reu le signal %d. Abandonne! Erreur: 1079 SQLSTATE: HY000 (ER_SHUTDOWN_COMPLETE) Message: %s: Arrt du serveur termin Erreur: 1080 SQLSTATE: 08S01 (ER_FORCING_CLOSE) Message: %s: Arrt forc de la tche (thread) %ld utilisateur: '%s' Erreur: 1081 SQLSTATE: 08S01 (ER_IPSOCK_ERROR) Message: Ne peut crer la connection IP (socket) Erreur: 1082 SQLSTATE: 42S12 (ER_NO_SUCH_INDEX) Message: La table '%s' n'a pas d'index comme celle utilise dans CREATE INDEX. Recrez la table Erreur: 1083 SQLSTATE: 42000 (ER_WRONG_FIELD_TERMINATORS) Message: Sparateur de champs inconnu. Vrifiez dans le manuel Erreur: 1084 SQLSTATE: 42000 (ER_BLOBS_AND_NO_TERMINATED) Message: Vous ne pouvez utiliser des lignes de longueur fixe avec des BLOBs. Utiliser 'fields terminated by'. Erreur: 1085 SQLSTATE: HY000 (ER_TEXTFILE_NOT_READABLE) Message: Le fichier '%s' doit tre dans le rpertoire de la base et lisible par tous Erreur: 1086 SQLSTATE: HY000 (ER_FILE_EXISTS_ERROR) Message: Le fichier '%s' existe dj Erreur: 1087 SQLSTATE: HY000 (ER_LOAD_INFO) Message: Enregistrements: %ld Effacs: %ld Non traits: %ld Avertissements: %ld Erreur: 1088 SQLSTATE: HY000 (ER_ALTER_INFO) Message: Enregistrements: %ld Doublons: %ld Erreur: 1089 SQLSTATE: HY000 (ER_WRONG_SUB_KEY) Message: Mauvaise sous-clef. Ce n'est pas un 'string' ou la longueur dpasse celle dfinie dans la clef Erreur: 1090 SQLSTATE: 42000 (ER_CANT_REMOVE_ALL_FIELDS) Message: Vous ne pouvez effacer tous les champs avec ALTER TABLE. Utilisez DROP TABLE
1060
Erreur: 1091 SQLSTATE: 42000 (ER_CANT_DROP_FIELD_OR_KEY) Message: Ne peut effacer (DROP) '%s'. Vrifiez s'il existe Erreur: 1092 SQLSTATE: HY000 (ER_INSERT_INFO) Message: Enregistrements: %ld Doublons: %ld Avertissements: %ld Erreur: 1093 SQLSTATE: HY000 (ER_UPDATE_TABLE_USED) Message: You can't specify target table '%s' for update in FROM clause Erreur: 1094 SQLSTATE: HY000 (ER_NO_SUCH_THREAD) Message: Numro de tche inconnu: %lu Erreur: 1095 SQLSTATE: HY000 (ER_KILL_DENIED_ERROR) Message: Vous n'tes pas propritaire de la tche no: %lu Erreur: 1096 SQLSTATE: HY000 (ER_NO_TABLES_USED) Message: Aucune table utilise Erreur: 1097 SQLSTATE: HY000 (ER_TOO_BIG_SET) Message: Trop de chanes dans la colonne %s avec SET Erreur: 1098 SQLSTATE: HY000 (ER_NO_UNIQUE_LOGFILE) Message: Ne peut gnrer un unique nom de journal %s.(1-999) Erreur: 1099 SQLSTATE: HY000 (ER_TABLE_NOT_LOCKED_FOR_WRITE) Message: Table '%s' verrouille lecture (READ): modification impossible Erreur: 1100 SQLSTATE: HY000 (ER_TABLE_NOT_LOCKED) Message: Table '%s' non verrouille: utilisez LOCK TABLES Erreur: 1101 SQLSTATE: 42000 (ER_BLOB_CANT_HAVE_DEFAULT) Message: BLOB '%s' ne peut avoir de valeur par dfaut Erreur: 1102 SQLSTATE: 42000 (ER_WRONG_DB_NAME) Message: Nom de base de donne illgal: '%s' Erreur: 1103 SQLSTATE: 42000 (ER_WRONG_TABLE_NAME) Message: Nom de table illgal: '%s' Erreur: 1104 SQLSTATE: 42000 (ER_TOO_BIG_SELECT) Message: SELECT va devoir examiner beaucoup d'enregistrements ce qui va prendre du temps. Vrifiez la clause WHERE et utilisez SET SQL_BIG_SELECTS=1 si SELECT se passe bien Erreur: 1105 SQLSTATE: HY000 (ER_UNKNOWN_ERROR) Message: Erreur inconnue Erreur: 1106 SQLSTATE: 42000 (ER_UNKNOWN_PROCEDURE) Message: Procdure %s inconnue
1061
Erreur: 1107 SQLSTATE: 42000 (ER_WRONG_PARAMCOUNT_TO_PROCEDURE) Message: Mauvais nombre de paramtres pour la procedure %s Erreur: 1108 SQLSTATE: HY000 (ER_WRONG_PARAMETERS_TO_PROCEDURE) Message: Paramtre erron pour la procedure %s Erreur: 1109 SQLSTATE: 42S02 (ER_UNKNOWN_TABLE) Message: Table inconnue '%s' dans %s Erreur: 1110 SQLSTATE: 42000 (ER_FIELD_SPECIFIED_TWICE) Message: Champ '%s' spcifi deux fois Erreur: 1111 SQLSTATE: HY000 (ER_INVALID_GROUP_FUNC_USE) Message: Utilisation invalide de la clause GROUP Erreur: 1112 SQLSTATE: 42000 (ER_UNSUPPORTED_EXTENSION) Message: Table '%s' : utilise une extension invalide pour cette version de MySQL Erreur: 1113 SQLSTATE: 42000 (ER_TABLE_MUST_HAVE_COLUMNS) Message: Une table doit comporter au moins une colonne Erreur: 1114 SQLSTATE: HY000 (ER_RECORD_FILE_FULL) Message: La table '%s' est pleine Erreur: 1115 SQLSTATE: 42000 (ER_UNKNOWN_CHARACTER_SET) Message: Jeu de caractres inconnu: '%s' Erreur: 1116 SQLSTATE: HY000 (ER_TOO_MANY_TABLES) Message: Trop de tables. MySQL ne peut utiliser que %d tables dans un JOIN Erreur: 1117 SQLSTATE: HY000 (ER_TOO_MANY_FIELDS) Message: Trop de champs Erreur: 1118 SQLSTATE: 42000 (ER_TOO_BIG_ROWSIZE) Message: Ligne trop grande. Le taille maximale d'une ligne, sauf les BLOBs, est %ld. Changez le type de quelques colonnes en BLOB Erreur: 1119 SQLSTATE: HY000 (ER_STACK_OVERRUN) Message: Dbordement de la pile des tches (Thread stack). Utilises: %ld pour une pile de %ld. Essayez 'mysqld -O thread_stack=#' pour indiquer une plus grande valeur Erreur: 1120 SQLSTATE: 42000 (ER_WRONG_OUTER_JOIN) Message: Dpendance croise dans une clause OUTER JOIN. Vrifiez la condition ON Erreur: 1121 SQLSTATE: 42000 (ER_NULL_COLUMN_IN_INDEX) Message: La colonne '%s' fait partie d'un index UNIQUE ou INDEX mais n'est pas dfinie comme NOT NULL Erreur: 1122 SQLSTATE: HY000 (ER_CANT_FIND_UDF)
1062
Message: Imposible de charger la fonction '%s' Erreur: 1123 SQLSTATE: HY000 (ER_CANT_INITIALIZE_UDF) Message: Impossible d'initialiser la fonction '%s'; %s Erreur: 1124 SQLSTATE: HY000 (ER_UDF_NO_PATHS) Message: Chemin interdit pour les bibliothques partages Erreur: 1125 SQLSTATE: HY000 (ER_UDF_EXISTS) Message: La fonction '%s' existe dj Erreur: 1126 SQLSTATE: HY000 (ER_CANT_OPEN_LIBRARY) Message: Impossible d'ouvrir la bibliothque partage '%s' (errno: %d %s) Erreur: 1127 SQLSTATE: HY000 (ER_CANT_FIND_DL_ENTRY) Message: Impossible de trouver la fonction '%s' dans la bibliothque Erreur: 1128 SQLSTATE: HY000 (ER_FUNCTION_NOT_DEFINED) Message: La fonction '%s' n'est pas dfinie Erreur: 1129 SQLSTATE: HY000 (ER_HOST_IS_BLOCKED) Message: L'hte '%s' est bloqu cause d'un trop grand nombre d'erreur de connection. Dbloquer le par 'mysqladmin flush-hosts' Erreur: 1130 SQLSTATE: HY000 (ER_HOST_NOT_PRIVILEGED) Message: Le hte '%s' n'est pas authoris se connecter ce serveur MySQL Erreur: 1131 SQLSTATE: 42000 (ER_PASSWORD_ANONYMOUS_USER) Message: Vous utilisez un utilisateur anonyme et les utilisateurs anonymes ne sont pas autoriss changer les mots de passe Erreur: 1132 SQLSTATE: 42000 (ER_PASSWORD_NOT_ALLOWED) Message: Vous devez avoir le privilge update sur les tables de la base de donne mysql pour pouvoir changer les mots de passe des autres Erreur: 1133 SQLSTATE: 42000 (ER_PASSWORD_NO_MATCH) Message: Impossible de trouver un enregistrement correspondant dans la table user Erreur: 1134 SQLSTATE: HY000 (ER_UPDATE_INFO) Message: Enregistrements correspondants: %ld Modifis: %ld Warnings: %ld Erreur: 1135 SQLSTATE: HY000 (ER_CANT_CREATE_THREAD) Message: Impossible de crer une nouvelle tche (errno %d). S'il reste de la mmoire libre, consultez le manual pour trouver un ventuel bug dpendant de l'OS Erreur: 1136 SQLSTATE: 21S01 (ER_WRONG_VALUE_COUNT_ON_ROW) Message: Column count doesn't match value count at row %ld Erreur: 1137 SQLSTATE: HY000 (ER_CANT_REOPEN_TABLE)
1063
Message: Impossible de rouvrir la table: '%s Erreur: 1138 SQLSTATE: 22004 (ER_INVALID_USE_OF_NULL) Message: Utilisation incorrecte de la valeur NULL Erreur: 1139 SQLSTATE: 42000 (ER_REGEXP_ERROR) Message: Erreur '%s' provenant de regexp Erreur: 1140 SQLSTATE: 42000 (ER_MIX_OF_GROUP_FUNC_AND_FIELDS) Message: Mlanger les colonnes GROUP (MIN(),MAX(),COUNT()...) avec des colonnes normales est interdit s'il n'y a pas de clause GROUP BY Erreur: 1141 SQLSTATE: 42000 (ER_NONEXISTING_GRANT) Message: Un tel droit n'est pas dfini pour l'utilisateur '%s' sur l'hte '%s' Erreur: 1142 SQLSTATE: 42000 (ER_TABLEACCESS_DENIED_ERROR) Message: La commande '%s' est interdite l'utilisateur: '%s'@'@%s' sur la table '%s' Erreur: 1143 SQLSTATE: 42000 (ER_COLUMNACCESS_DENIED_ERROR) Message: La commande '%s' est interdite l'utilisateur: '%s'@'@%s' sur la colonne '%s' de la table '%s' Erreur: 1144 SQLSTATE: 42000 (ER_ILLEGAL_GRANT_FOR_TABLE) Message: Commande GRANT/REVOKE incorrecte. Consultez le manuel. Erreur: 1145 SQLSTATE: 42000 (ER_GRANT_WRONG_HOST_OR_USER) Message: L'hte ou l'utilisateur donn en argument GRANT est trop long Erreur: 1146 SQLSTATE: 42S02 (ER_NO_SUCH_TABLE) Message: La table '%s.%s' n'existe pas Erreur: 1147 SQLSTATE: 42000 (ER_NONEXISTING_TABLE_GRANT) Message: Un tel droit n'est pas dfini pour l'utilisateur '%s' sur l'hte '%s' sur la table '%s' Erreur: 1148 SQLSTATE: 42000 (ER_NOT_ALLOWED_COMMAND) Message: Cette commande n'existe pas dans cette version de MySQL Erreur: 1149 SQLSTATE: 42000 (ER_SYNTAX_ERROR) Message: Erreur de syntaxe Erreur: 1150 SQLSTATE: HY000 (ER_DELAYED_CANT_CHANGE_LOCK) Message: La tche 'delayed insert' n'a pas pu obtenir le verrou dmand sur la table %s Erreur: 1151 SQLSTATE: HY000 (ER_TOO_MANY_DELAYED_THREADS) Message: Trop de tche 'delayed' en cours Erreur: 1152 SQLSTATE: 08S01 (ER_ABORTING_CONNECTION) Message: Connection %ld avorte vers la bd: '%s' utilisateur: '%s' (%s)
1064
Erreur: 1153 SQLSTATE: 08S01 (ER_NET_PACKET_TOO_LARGE) Message: Paquet plus grand que 'max_allowed_packet' reu Erreur: 1154 SQLSTATE: 08S01 (ER_NET_READ_ERROR_FROM_PIPE) Message: Erreur de lecture reue du pipe de connection Erreur: 1155 SQLSTATE: 08S01 (ER_NET_FCNTL_ERROR) Message: Erreur reue de fcntl() Erreur: 1156 SQLSTATE: 08S01 (ER_NET_PACKETS_OUT_OF_ORDER) Message: Paquets reus dans le dsordre Erreur: 1157 SQLSTATE: 08S01 (ER_NET_UNCOMPRESS_ERROR) Message: Impossible de dcompresser le paquet reu Erreur: 1158 SQLSTATE: 08S01 (ER_NET_READ_ERROR) Message: Erreur de lecture des paquets reus Erreur: 1159 SQLSTATE: 08S01 (ER_NET_READ_INTERRUPTED) Message: Timeout en lecture des paquets reus Erreur: 1160 SQLSTATE: 08S01 (ER_NET_ERROR_ON_WRITE) Message: Erreur d'criture des paquets envoys Erreur: 1161 SQLSTATE: 08S01 (ER_NET_WRITE_INTERRUPTED) Message: Timeout d'criture des paquets envoys Erreur: 1162 SQLSTATE: 42000 (ER_TOO_LONG_STRING) Message: La chane rsultat est plus grande que 'max_allowed_packet' Erreur: 1163 SQLSTATE: 42000 (ER_TABLE_CANT_HANDLE_BLOB) Message: Ce type de table ne supporte pas les colonnes BLOB/TEXT Erreur: 1164 SQLSTATE: 42000 (ER_TABLE_CANT_HANDLE_AUTO_INCREMENT) Message: Ce type de table ne supporte pas les colonnes AUTO_INCREMENT Erreur: 1165 SQLSTATE: HY000 (ER_DELAYED_INSERT_TABLE_LOCKED) Message: INSERT DELAYED ne peut tre utilis avec la table '%s', car elle est verroue avec LOCK TABLES Erreur: 1166 SQLSTATE: 42000 (ER_WRONG_COLUMN_NAME) Message: Nom de colonne '%s' incorrect Erreur: 1167 SQLSTATE: 42000 (ER_WRONG_KEY_COLUMN) Message: Le handler de la table ne peut index la colonne '%s' Erreur: 1168 SQLSTATE: HY000 (ER_WRONG_MRG_TABLE) Message: Toutes les tables de la table de type MERGE n'ont pas la mme dfinition Erreur: 1169 SQLSTATE: 23000 (ER_DUP_UNIQUE)
1065
Message: criture impossible cause d'un index UNIQUE sur la table '%s' Erreur: 1170 SQLSTATE: 42000 (ER_BLOB_KEY_WITHOUT_LENGTH) Message: La colonne '%s' de type BLOB est utilise dans une dfinition d'index sans longueur d'index Erreur: 1171 SQLSTATE: 42000 (ER_PRIMARY_CANT_HAVE_NULL) Message: Toutes les parties d'un index PRIMARY KEY doivent tre NOT NULL; Si vous avez besoin d'un NULL dans l'index, utilisez un index UNIQUE Erreur: 1172 SQLSTATE: 42000 (ER_TOO_MANY_ROWS) Message: Le rsultat contient plus d'un enregistrement Erreur: 1173 SQLSTATE: 42000 (ER_REQUIRES_PRIMARY_KEY) Message: Ce type de table ncessite une cl primaire (PRIMARY KEY) Erreur: 1174 SQLSTATE: HY000 (ER_NO_RAID_COMPILED) Message: Cette version de MySQL n'est pas compile avec le support RAID Erreur: 1175 SQLSTATE: HY000 (ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE) Message: Vous tes en mode 'safe update' et vous essayez de faire un UPDATE sans clause WHERE utilisant un index Erreur: 1176 SQLSTATE: HY000 (ER_KEY_DOES_NOT_EXITS) Message: L'index '%s' n'existe pas sur la table '%s' Erreur: 1177 SQLSTATE: 42000 (ER_CHECK_NO_SUCH_TABLE) Message: Impossible d'ouvrir la table Erreur: 1178 SQLSTATE: 42000 (ER_CHECK_NOT_IMPLEMENTED) Message: Ce type de table ne supporte pas les %s Erreur: 1179 SQLSTATE: 25000 (ER_CANT_DO_THIS_DURING_AN_TRANSACTION) Message: Vous n'tes pas autoris excute cette commande dans une transaction Erreur: 1180 SQLSTATE: HY000 (ER_ERROR_DURING_COMMIT) Message: Erreur %d lors du COMMIT Erreur: 1181 SQLSTATE: HY000 (ER_ERROR_DURING_ROLLBACK) Message: Erreur %d lors du ROLLBACK Erreur: 1182 SQLSTATE: HY000 (ER_ERROR_DURING_FLUSH_LOGS) Message: Erreur %d lors du FLUSH_LOGS Erreur: 1183 SQLSTATE: HY000 (ER_ERROR_DURING_CHECKPOINT) Message: Erreur %d lors du CHECKPOINT Erreur: 1184 SQLSTATE: 08S01 (ER_NEW_ABORTING_CONNECTION) Message: Connection %ld avorte vers la bd: '%s' utilisateur: '%s' hte: '%s' (%s)
1066
Erreur: 1185 SQLSTATE: HY000 (ER_DUMP_NOT_IMPLEMENTED) Message: Ce type de table ne supporte pas les copies binaires Erreur: 1186 SQLSTATE: HY000 (ER_FLUSH_MASTER_BINLOG_CLOSED) Message: Binlog closed, cannot RESET MASTER Erreur: 1187 SQLSTATE: HY000 (ER_INDEX_REBUILD) Message: La reconstruction de l'index de la table copie '%s' a chou Erreur: 1188 SQLSTATE: HY000 (ER_MASTER) Message: Erreur reue du matre: '%s' Erreur: 1189 SQLSTATE: 08S01 (ER_MASTER_NET_READ) Message: Erreur de lecture rseau reue du matre Erreur: 1190 SQLSTATE: 08S01 (ER_MASTER_NET_WRITE) Message: Erreur d'criture rseau reue du matre Erreur: 1191 SQLSTATE: HY000 (ER_FT_MATCHING_KEY_NOT_FOUND) Message: Impossible de trouver un index FULLTEXT correspondant cette liste de colonnes Erreur: 1192 SQLSTATE: HY000 (ER_LOCK_OR_ACTIVE_TRANSACTION) Message: Impossible d'excuter la commande car vous avez des tables verrouilles ou une transaction active Erreur: 1193 SQLSTATE: HY000 (ER_UNKNOWN_SYSTEM_VARIABLE) Message: Variable systme '%s' inconnue Erreur: 1194 SQLSTATE: HY000 (ER_CRASHED_ON_USAGE) Message: La table '%s' est marque 'crashed' et devrait tre rpare Erreur: 1195 SQLSTATE: HY000 (ER_CRASHED_ON_REPAIR) Message: La table '%s' est marque 'crashed' et le dernier 'repair' a chou Erreur: 1196 SQLSTATE: HY000 (ER_WARNING_NOT_COMPLETE_ROLLBACK) Message: Attention: certaines tables ne supportant pas les transactions ont t changes et elles ne pourront pas tre restitues Erreur: 1197 SQLSTATE: HY000 (ER_TRANS_CACHE_FULL) Message: Cette transaction commandes multiples ncessite plus de 'max_binlog_cache_size' octets de stockage, augmentez cette variable de mysqld et ressayez Erreur: 1198 SQLSTATE: HY000 (ER_SLAVE_MUST_STOP) Message: Cette opration ne peut tre ralise avec un esclave actif, faites STOP SLAVE d'abord Erreur: 1199 SQLSTATE: HY000 (ER_SLAVE_NOT_RUNNING) Message: Cette opration ncessite un esclave actif, configurez les esclaves et faites START SLAVE
1067
Erreur: 1200 SQLSTATE: HY000 (ER_BAD_SLAVE) Message: Le server n'est pas configur comme un esclave, changez le fichier de configuration ou utilisez CHANGE MASTER TO Erreur: 1201 SQLSTATE: HY000 (ER_MASTER_INFO) Message: Impossible d'initialiser les structures d'information de matre, vous trouverez des messages d'erreur supplmentaires dans le journal des erreurs de MySQL Erreur: 1202 SQLSTATE: HY000 (ER_SLAVE_THREAD) Message: Impossible de crer une tche esclave, vrifiez les ressources systme Erreur: 1203 SQLSTATE: 42000 (ER_TOO_MANY_USER_CONNECTIONS) Message: L'utilisateur %s possde dj plus de 'max_user_connections' connections actives Erreur: 1204 SQLSTATE: HY000 (ER_SET_CONSTANTS_ONLY) Message: Seules les expressions constantes sont autorises avec SET Erreur: 1205 SQLSTATE: HY000 (ER_LOCK_WAIT_TIMEOUT) Message: Timeout sur l'obtention du verrou Erreur: 1206 SQLSTATE: HY000 (ER_LOCK_TABLE_FULL) Message: Le nombre total de verrou dpasse la taille de la table des verrous Erreur: 1207 SQLSTATE: 25000 (ER_READ_ONLY_TRANSACTION) Message: Un verrou en update ne peut tre acquit pendant une transaction READ UNCOMMITTED Erreur: 1208 SQLSTATE: HY000 (ER_DROP_DB_WITH_READ_LOCK) Message: DROP DATABASE n'est pas autorise pendant qu'une tche possde un verrou global en lecture Erreur: 1209 SQLSTATE: HY000 (ER_CREATE_DB_WITH_READ_LOCK) Message: CREATE DATABASE n'est pas autorise pendant qu'une tche possde un verrou global en lecture Erreur: 1210 SQLSTATE: HY000 (ER_WRONG_ARGUMENTS) Message: Mauvais arguments %s Erreur: 1211 SQLSTATE: 42000 (ER_NO_PERMISSION_TO_CREATE_USER) Message: '%s'@'%s' n'est pas autoris crer de nouveaux utilisateurs Erreur: 1212 SQLSTATE: HY000 (ER_UNION_TABLES_IN_DIFFERENT_DIR) Message: Dfinition de table incorrecte; toutes les tables MERGE doivent tre dans la mme base de donne Erreur: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK) Message: Deadlock dcouvert en essayant d'obtenir les verrous : essayez de redmarrer la transaction Erreur: 1214 SQLSTATE: HY000 (ER_TABLE_CANT_HANDLE_FT)
1068
Message: Le type de table utilis ne supporte pas les index FULLTEXT Erreur: 1215 SQLSTATE: HY000 (ER_CANNOT_ADD_FOREIGN) Message: Impossible d'ajouter des contraintes d'index externe Erreur: 1216 SQLSTATE: 23000 (ER_NO_REFERENCED_ROW) Message: Impossible d'ajouter un enregistrement fils : une constrainte externe l'empche Erreur: 1217 SQLSTATE: 23000 (ER_ROW_IS_REFERENCED) Message: Impossible de supprimer un enregistrement pre : une constrainte externe l'empche Erreur: 1218 SQLSTATE: 08S01 (ER_CONNECT_TO_MASTER) Message: Error connecting to master: %s Erreur: 1219 SQLSTATE: HY000 (ER_QUERY_ON_MASTER) Message: Error running query on master: %s Erreur: 1220 SQLSTATE: HY000 (ER_ERROR_WHEN_EXECUTING_COMMAND) Message: Error when executing command %s: %s Erreur: 1221 SQLSTATE: HY000 (ER_WRONG_USAGE) Message: Incorrect usage of %s and %s Erreur: 1222 SQLSTATE: 21000 (ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT) Message: The used SELECT statements have a different number of columns Erreur: 1223 SQLSTATE: HY000 (ER_CANT_UPDATE_WITH_READLOCK) Message: Can't execute the query because you have a conflicting read lock Erreur: 1224 SQLSTATE: HY000 (ER_MIXING_NOT_ALLOWED) Message: Mixing of transactional and non-transactional tables is disabled Erreur: 1225 SQLSTATE: HY000 (ER_DUP_ARGUMENT) Message: Option '%s' used twice in statement Erreur: 1226 SQLSTATE: 42000 (ER_USER_LIMIT_REACHED) Message: User '%s' has exceeded the '%s' resource (current value: %ld) Erreur: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Message: Access denied; you need the %s privilege for this operation Erreur: 1228 SQLSTATE: HY000 (ER_LOCAL_VARIABLE) Message: Variable '%s' is a SESSION variable and can't be used with SET GLOBAL Erreur: 1229 SQLSTATE: HY000 (ER_GLOBAL_VARIABLE) Message: Variable '%s' is a GLOBAL variable and should be set with SET GLOBAL Erreur: 1230 SQLSTATE: 42000 (ER_NO_DEFAULT)
1069
Message: Variable '%s' doesn't have a default value Erreur: 1231 SQLSTATE: 42000 (ER_WRONG_VALUE_FOR_VAR) Message: Variable '%s' can't be set to the value of '%s' Erreur: 1232 SQLSTATE: 42000 (ER_WRONG_TYPE_FOR_VAR) Message: Incorrect argument type to variable '%s' Erreur: 1233 SQLSTATE: HY000 (ER_VAR_CANT_BE_READ) Message: Variable '%s' can only be set, not read Erreur: 1234 SQLSTATE: 42000 (ER_CANT_USE_OPTION_HERE) Message: Incorrect usage/placement of '%s' Erreur: 1235 SQLSTATE: 42000 (ER_NOT_SUPPORTED_YET) Message: This version of MySQL doesn't yet support '%s' Erreur: 1236 SQLSTATE: HY000 (ER_MASTER_FATAL_ERROR_READING_BINLOG) Message: Got fatal error %d: '%s' from master when reading data from binary log Erreur: 1237 SQLSTATE: HY000 (ER_SLAVE_IGNORED_TABLE) Message: Slave SQL thread ignored the query because of replicate-*-table rules Erreur: 1238 SQLSTATE: HY000 (ER_INCORRECT_GLOBAL_LOCAL_VAR) Message: Variable '%s' is a %s variable Erreur: 1239 SQLSTATE: 42000 (ER_WRONG_FK_DEF) Message: Incorrect foreign key definition for '%s': %s Erreur: 1240 SQLSTATE: HY000 (ER_KEY_REF_DO_NOT_MATCH_TABLE_REF) Message: Key reference and table reference don't match Erreur: 1241 SQLSTATE: 21000 (ER_OPERAND_COLUMNS) Message: Operand should contain %d column(s) Erreur: 1242 SQLSTATE: 21000 (ER_SUBQUERY_NO_1_ROW) Message: Subquery returns more than 1 row Erreur: 1243 SQLSTATE: HY000 (ER_UNKNOWN_STMT_HANDLER) Message: Unknown prepared statement handler (%.*s) given to %s Erreur: 1244 SQLSTATE: HY000 (ER_CORRUPT_HELP_DB) Message: Help database is corrupt or does not exist Erreur: 1245 SQLSTATE: HY000 (ER_CYCLIC_REFERENCE) Message: Cyclic reference on subqueries Erreur: 1246 SQLSTATE: HY000 (ER_AUTO_CONVERT)
1070
Message: Converting column '%s' from %s to %s Erreur: 1247 SQLSTATE: 42S22 (ER_ILLEGAL_REFERENCE) Message: Reference '%s' not supported (%s) Erreur: 1248 SQLSTATE: 42000 (ER_DERIVED_MUST_HAVE_ALIAS) Message: Every derived table must have its own alias Erreur: 1249 SQLSTATE: 01000 (ER_SELECT_REDUCED) Message: Select %u was reduced during optimization Erreur: 1250 SQLSTATE: 42000 (ER_TABLENAME_NOT_ALLOWED_HERE) Message: Table '%s' from one of the SELECTs cannot be used in %s Erreur: 1251 SQLSTATE: 08004 (ER_NOT_SUPPORTED_AUTH_MODE) Message: Client does not support authentication protocol requested by server; consider upgrading MySQL client Erreur: 1252 SQLSTATE: 42000 (ER_SPATIAL_CANT_HAVE_NULL) Message: All parts of a SPATIAL index must be NOT NULL Erreur: 1253 SQLSTATE: 42000 (ER_COLLATION_CHARSET_MISMATCH) Message: COLLATION '%s' is not valid for CHARACTER SET '%s' Erreur: 1254 SQLSTATE: HY000 (ER_SLAVE_WAS_RUNNING) Message: Slave is already running Erreur: 1255 SQLSTATE: HY000 (ER_SLAVE_WAS_NOT_RUNNING) Message: Slave already has been stopped Erreur: 1256 SQLSTATE: HY000 (ER_TOO_BIG_FOR_UNCOMPRESS) Message: Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted) Erreur: 1257 SQLSTATE: HY000 (ER_ZLIB_Z_MEM_ERROR) Message: ZLIB: Not enough memory Erreur: 1258 SQLSTATE: HY000 (ER_ZLIB_Z_BUF_ERROR) Message: ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted) Erreur: 1259 SQLSTATE: HY000 (ER_ZLIB_Z_DATA_ERROR) Message: ZLIB: Input data corrupted Erreur: 1260 SQLSTATE: HY000 (ER_CUT_VALUE_GROUP_CONCAT) Message: %d line(s) were cut by GROUP_CONCAT() Erreur: 1261 SQLSTATE: 01000 (ER_WARN_TOO_FEW_RECORDS) Message: Row %ld doesn't contain data for all columns
1071
Erreur: 1262 SQLSTATE: 01000 (ER_WARN_TOO_MANY_RECORDS) Message: Row %ld was truncated; it contained more data than there were input columns Erreur: 1263 SQLSTATE: 22004 (ER_WARN_NULL_TO_NOTNULL) Message: Column was set to data type implicit default; NULL supplied for NOT NULL column '%s' at row %ld Erreur: 1264 SQLSTATE: 22003 (ER_WARN_DATA_OUT_OF_RANGE) Message: Out of range value adjusted for column '%s' at row %ld Erreur: 1265 SQLSTATE: 01000 (WARN_DATA_TRUNCATED) Message: Data truncated for column '%s' at row %ld Erreur: 1266 SQLSTATE: HY000 (ER_WARN_USING_OTHER_HANDLER) Message: Using storage engine %s for table '%s' Erreur: 1267 SQLSTATE: HY000 (ER_CANT_AGGREGATE_2COLLATIONS) Message: Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s' Erreur: 1268 SQLSTATE: HY000 (ER_DROP_USER) Message: Cannot drop one or more of the requested users Erreur: 1269 SQLSTATE: HY000 (ER_REVOKE_GRANTS) Message: Can't revoke all privileges for one or more of the requested users Erreur: 1270 SQLSTATE: HY000 (ER_CANT_AGGREGATE_3COLLATIONS) Message: Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s' Erreur: 1271 SQLSTATE: HY000 (ER_CANT_AGGREGATE_NCOLLATIONS) Message: Illegal mix of collations for operation '%s' Erreur: 1272 SQLSTATE: HY000 (ER_VARIABLE_IS_NOT_STRUCT) Message: Variable '%s' is not a variable component (can't be used as XXXX.variable_name) Erreur: 1273 SQLSTATE: HY000 (ER_UNKNOWN_COLLATION) Message: Unknown collation: '%s' Erreur: 1274 SQLSTATE: HY000 (ER_SLAVE_IGNORED_SSL_PARAMS) Message: SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later if MySQL slave with SSL is started Erreur: 1275 SQLSTATE: HY000 (ER_SERVER_IS_IN_SECURE_AUTH_MODE) Message: Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format Erreur: 1276 SQLSTATE: HY000 (ER_WARN_FIELD_RESOLVED) Message: Field or reference '%s%s%s%s%s' of SELECT #%d was resolved in SELECT #%d Erreur: 1277 SQLSTATE: HY000 (ER_BAD_SLAVE_UNTIL_COND)
1072
Message: Incorrect parameter or combination of parameters for START SLAVE UNTIL Erreur: 1278 SQLSTATE: HY000 (ER_MISSING_SKIP_SLAVE) Message: It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart Erreur: 1279 SQLSTATE: HY000 (ER_UNTIL_COND_IGNORED) Message: SQL thread is not to be started so UNTIL options are ignored Erreur: 1280 SQLSTATE: 42000 (ER_WRONG_NAME_FOR_INDEX) Message: Incorrect index name '%s' Erreur: 1281 SQLSTATE: 42000 (ER_WRONG_NAME_FOR_CATALOG) Message: Incorrect catalog name '%s' Erreur: 1282 SQLSTATE: HY000 (ER_WARN_QC_RESIZE) Message: Query cache failed to set size %lu; new query cache size is %lu Erreur: 1283 SQLSTATE: HY000 (ER_BAD_FT_COLUMN) Message: Column '%s' cannot be part of FULLTEXT index Erreur: 1284 SQLSTATE: HY000 (ER_UNKNOWN_KEY_CACHE) Message: Unknown key cache '%s' Erreur: 1285 SQLSTATE: HY000 (ER_WARN_HOSTNAME_WONT_WORK) Message: MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work Erreur: 1286 SQLSTATE: 42000 (ER_UNKNOWN_STORAGE_ENGINE) Message: Unknown table engine '%s' Erreur: 1287 SQLSTATE: HY000 (ER_WARN_DEPRECATED_SYNTAX) Message: '%s' is deprecated; use '%s' instead Erreur: 1288 SQLSTATE: HY000 (ER_NON_UPDATABLE_TABLE) Message: The target table %s of the %s is not updatable Erreur: 1289 SQLSTATE: HY000 (ER_FEATURE_DISABLED) Message: The '%s' feature is disabled; you need MySQL built with '%s' to have it working Erreur: 1290 SQLSTATE: HY000 (ER_OPTION_PREVENTS_STATEMENT) Message: The MySQL server is running with the %s option so it cannot execute this statement Erreur: 1291 SQLSTATE: HY000 (ER_DUPLICATED_VALUE_IN_TYPE) Message: Column '%s' has duplicated value '%s' in %s Erreur: 1292 SQLSTATE: 22007 (ER_TRUNCATED_WRONG_VALUE) Message: Truncated incorrect %s value: '%s'
1073
Erreur: 1293 SQLSTATE: HY000 (ER_TOO_MUCH_AUTO_TIMESTAMP_COLS) Message: Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause Erreur: 1294 SQLSTATE: HY000 (ER_INVALID_ON_UPDATE) Message: Invalid ON UPDATE clause for '%s' column Erreur: 1295 SQLSTATE: HY000 (ER_UNSUPPORTED_PS) Message: This command is not supported in the prepared statement protocol yet Erreur: 1296 SQLSTATE: HY000 (ER_GET_ERRMSG) Message: Got error %d '%s' from %s Erreur: 1297 SQLSTATE: HY000 (ER_GET_TEMPORARY_ERRMSG) Message: Got temporary error %d '%s' from %s Erreur: 1298 SQLSTATE: HY000 (ER_UNKNOWN_TIME_ZONE) Message: Unknown or incorrect time zone: '%s' Erreur: 1299 SQLSTATE: HY000 (ER_WARN_INVALID_TIMESTAMP) Message: Invalid TIMESTAMP value in column '%s' at row %ld Erreur: 1300 SQLSTATE: HY000 (ER_INVALID_CHARACTER_STRING) Message: Invalid %s character string: '%s' Erreur: 1301 SQLSTATE: HY000 (ER_WARN_ALLOWED_PACKET_OVERFLOWED) Message: Result of %s() was larger than max_allowed_packet (%ld) - truncated Erreur: 1302 SQLSTATE: HY000 (ER_CONFLICTING_DECLARATIONS) Message: Conflicting declarations: '%s%s' and '%s%s' Erreur: 1303 SQLSTATE: 2F003 (ER_SP_NO_RECURSIVE_CREATE) Message: Can't create a %s from within another stored routine Erreur: 1304 SQLSTATE: 42000 (ER_SP_ALREADY_EXISTS) Message: %s %s already exists Erreur: 1305 SQLSTATE: 42000 (ER_SP_DOES_NOT_EXIST) Message: %s %s does not exist Erreur: 1306 SQLSTATE: HY000 (ER_SP_DROP_FAILED) Message: Failed to DROP %s %s Erreur: 1307 SQLSTATE: HY000 (ER_SP_STORE_FAILED) Message: Failed to CREATE %s %s Erreur: 1308 SQLSTATE: 42000 (ER_SP_LILABEL_MISMATCH) Message: %s with no matching label: %s
1074
Erreur: 1309 SQLSTATE: 42000 (ER_SP_LABEL_REDEFINE) Message: Redefining label %s Erreur: 1310 SQLSTATE: 42000 (ER_SP_LABEL_MISMATCH) Message: End-label %s without match Erreur: 1311 SQLSTATE: 01000 (ER_SP_UNINIT_VAR) Message: Referring to uninitialized variable %s Erreur: 1312 SQLSTATE: 0A000 (ER_SP_BADSELECT) Message: PROCEDURE %s can't return a result set in the given context Erreur: 1313 SQLSTATE: 42000 (ER_SP_BADRETURN) Message: RETURN is only allowed in a FUNCTION Erreur: 1314 SQLSTATE: 0A000 (ER_SP_BADSTATEMENT) Message: %s is not allowed in stored procedures Erreur: 1315 SQLSTATE: 42000 (ER_UPDATE_LOG_DEPRECATED_IGNORED) Message: The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been ignored Erreur: 1316 SQLSTATE: 42000 (ER_UPDATE_LOG_DEPRECATED_TRANSLATED) Message: The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been translated to SET SQL_LOG_BIN Erreur: 1317 SQLSTATE: 70100 (ER_QUERY_INTERRUPTED) Message: Query execution was interrupted Erreur: 1318 SQLSTATE: 42000 (ER_SP_WRONG_NO_OF_ARGS) Message: Incorrect number of arguments for %s %s; expected %u, got %u Erreur: 1319 SQLSTATE: 42000 (ER_SP_COND_MISMATCH) Message: Undefined CONDITION: %s Erreur: 1320 SQLSTATE: 42000 (ER_SP_NORETURN) Message: No RETURN found in FUNCTION %s Erreur: 1321 SQLSTATE: 2F005 (ER_SP_NORETURNEND) Message: FUNCTION %s ended without RETURN Erreur: 1322 SQLSTATE: 42000 (ER_SP_BAD_CURSOR_QUERY) Message: Cursor statement must be a SELECT Erreur: 1323 SQLSTATE: 42000 (ER_SP_BAD_CURSOR_SELECT) Message: Cursor SELECT must not have INTO Erreur: 1324 SQLSTATE: 42000 (ER_SP_CURSOR_MISMATCH) Message: Undefined CURSOR: %s
1075
Erreur: 1325 SQLSTATE: 24000 (ER_SP_CURSOR_ALREADY_OPEN) Message: Cursor is already open Erreur: 1326 SQLSTATE: 24000 (ER_SP_CURSOR_NOT_OPEN) Message: Cursor is not open Erreur: 1327 SQLSTATE: 42000 (ER_SP_UNDECLARED_VAR) Message: Undeclared variable: %s Erreur: 1328 SQLSTATE: HY000 (ER_SP_WRONG_NO_OF_FETCH_ARGS) Message: Incorrect number of FETCH variables Erreur: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA) Message: No data - zero rows fetched, selected, or processed Erreur: 1330 SQLSTATE: 42000 (ER_SP_DUP_PARAM) Message: Duplicate parameter: %s Erreur: 1331 SQLSTATE: 42000 (ER_SP_DUP_VAR) Message: Duplicate variable: %s Erreur: 1332 SQLSTATE: 42000 (ER_SP_DUP_COND) Message: Duplicate condition: %s Erreur: 1333 SQLSTATE: 42000 (ER_SP_DUP_CURS) Message: Duplicate cursor: %s Erreur: 1334 SQLSTATE: HY000 (ER_SP_CANT_ALTER) Message: Failed to ALTER %s %s Erreur: 1335 SQLSTATE: 0A000 (ER_SP_SUBSELECT_NYI) Message: Subselect value not supported Erreur: 1336 SQLSTATE: 0A000 (ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG) Message: %s is not allowed in stored function or trigger Erreur: 1337 SQLSTATE: 42000 (ER_SP_VARCOND_AFTER_CURSHNDLR) Message: Variable or condition declaration after cursor or handler declaration Erreur: 1338 SQLSTATE: 42000 (ER_SP_CURSOR_AFTER_HANDLER) Message: Cursor declaration after handler declaration Erreur: 1339 SQLSTATE: 20000 (ER_SP_CASE_NOT_FOUND) Message: Case not found for CASE statement Erreur: 1340 SQLSTATE: HY000 (ER_FPARSER_TOO_BIG_FILE) Message: Configuration file '%s' is too big Erreur: 1341 SQLSTATE: HY000 (ER_FPARSER_BAD_HEADER)
1076
Message: Malformed file type header in file '%s' Erreur: 1342 SQLSTATE: HY000 (ER_FPARSER_EOF_IN_COMMENT) Message: Unexpected end of file while parsing comment '%s' Erreur: 1343 SQLSTATE: HY000 (ER_FPARSER_ERROR_IN_PARAMETER) Message: Error while parsing parameter '%s' (line: '%s') Erreur: 1344 SQLSTATE: HY000 (ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER) Message: Unexpected end of file while skipping unknown parameter '%s' Erreur: 1345 SQLSTATE: HY000 (ER_VIEW_NO_EXPLAIN) Message: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table Erreur: 1346 SQLSTATE: HY000 (ER_FRM_UNKNOWN_TYPE) Message: File '%s' has unknown type '%s' in its header Erreur: 1347 SQLSTATE: HY000 (ER_WRONG_OBJECT) Message: '%s.%s' is not %s Erreur: 1348 SQLSTATE: HY000 (ER_NONUPDATEABLE_COLUMN) Message: Column '%s' is not updatable Erreur: 1349 SQLSTATE: HY000 (ER_VIEW_SELECT_DERIVED) Message: View's SELECT contains a subquery in the FROM clause Erreur: 1350 SQLSTATE: HY000 (ER_VIEW_SELECT_CLAUSE) Message: View's SELECT contains a '%s' clause Erreur: 1351 SQLSTATE: HY000 (ER_VIEW_SELECT_VARIABLE) Message: View's SELECT contains a variable or parameter Erreur: 1352 SQLSTATE: HY000 (ER_VIEW_SELECT_TMPTABLE) Message: View's SELECT refers to a temporary table '%s' Erreur: 1353 SQLSTATE: HY000 (ER_VIEW_WRONG_LIST) Message: View's SELECT and view's field list have different column counts Erreur: 1354 SQLSTATE: HY000 (ER_WARN_VIEW_MERGE) Message: View merge algorithm can't be used here for now (assumed undefined algorithm) Erreur: 1355 SQLSTATE: HY000 (ER_WARN_VIEW_WITHOUT_KEY) Message: View being updated does not have complete key of underlying table in it Erreur: 1356 SQLSTATE: HY000 (ER_VIEW_INVALID) Message: View '%s.%s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them Erreur: 1357 SQLSTATE: HY000 (ER_SP_NO_DROP_SP)
1077
Message: Can't drop or alter a %s from within another stored routine Erreur: 1358 SQLSTATE: HY000 (ER_SP_GOTO_IN_HNDLR) Message: GOTO is not allowed in a stored procedure handler Erreur: 1359 SQLSTATE: HY000 (ER_TRG_ALREADY_EXISTS) Message: Trigger already exists Erreur: 1360 SQLSTATE: HY000 (ER_TRG_DOES_NOT_EXIST) Message: Trigger does not exist Erreur: 1361 SQLSTATE: HY000 (ER_TRG_ON_VIEW_OR_TEMP_TABLE) Message: Trigger's '%s' is view or temporary table Erreur: 1362 SQLSTATE: HY000 (ER_TRG_CANT_CHANGE_ROW) Message: Updating of %s row is not allowed in %strigger Erreur: 1363 SQLSTATE: HY000 (ER_TRG_NO_SUCH_ROW_IN_TRG) Message: There is no %s row in %s trigger Erreur: 1364 SQLSTATE: HY000 (ER_NO_DEFAULT_FOR_FIELD) Message: Field '%s' doesn't have a default value Erreur: 1365 SQLSTATE: 22012 (ER_DIVISION_BY_ZERO) Message: Division by 0 Erreur: 1366 SQLSTATE: HY000 (ER_TRUNCATED_WRONG_VALUE_FOR_FIELD) Message: Incorrect %s value: '%s' for column '%s' at row %ld Erreur: 1367 SQLSTATE: 22007 (ER_ILLEGAL_VALUE_FOR_TYPE) Message: Illegal %s '%s' value found during parsing Erreur: 1368 SQLSTATE: HY000 (ER_VIEW_NONUPD_CHECK) Message: CHECK OPTION on non-updatable view '%s.%s' Erreur: 1369 SQLSTATE: HY000 (ER_VIEW_CHECK_FAILED) Message: CHECK OPTION failed '%s.%s' Erreur: 1370 SQLSTATE: 42000 (ER_PROCACCESS_DENIED_ERROR) Message: %s command denied to user '%s'@'%s' for routine '%s' Erreur: 1371 SQLSTATE: HY000 (ER_RELAY_LOG_FAIL) Message: Failed purging old relay logs: %s Erreur: 1372 SQLSTATE: HY000 (ER_PASSWD_LENGTH) Message: Password hash should be a %d-digit hexadecimal number Erreur: 1373 SQLSTATE: HY000 (ER_UNKNOWN_TARGET_BINLOG)
1078
Message: Target log not found in binlog index Erreur: 1374 SQLSTATE: HY000 (ER_IO_ERR_LOG_INDEX_READ) Message: I/O error reading log index file Erreur: 1375 SQLSTATE: HY000 (ER_BINLOG_PURGE_PROHIBITED) Message: Server configuration does not permit binlog purge Erreur: 1376 SQLSTATE: HY000 (ER_FSEEK_FAIL) Message: Failed on fseek() Erreur: 1377 SQLSTATE: HY000 (ER_BINLOG_PURGE_FATAL_ERR) Message: Fatal error during log purge Erreur: 1378 SQLSTATE: HY000 (ER_LOG_IN_USE) Message: A purgeable log is in use, will not purge Erreur: 1379 SQLSTATE: HY000 (ER_LOG_PURGE_UNKNOWN_ERR) Message: Unknown error during log purge Erreur: 1380 SQLSTATE: HY000 (ER_RELAY_LOG_INIT) Message: Failed initializing relay log position: %s Erreur: 1381 SQLSTATE: HY000 (ER_NO_BINARY_LOGGING) Message: You are not using binary logging Erreur: 1382 SQLSTATE: HY000 (ER_RESERVED_SYNTAX) Message: The '%s' syntax is reserved for purposes internal to the MySQL server Erreur: 1383 SQLSTATE: HY000 (ER_WSAS_FAILED) Message: WSAStartup Failed Erreur: 1384 SQLSTATE: HY000 (ER_DIFF_GROUPS_PROC) Message: Can't handle procedures with different groups yet Erreur: 1385 SQLSTATE: HY000 (ER_NO_GROUP_FOR_PROC) Message: Select must have a group with this procedure Erreur: 1386 SQLSTATE: HY000 (ER_ORDER_WITH_PROC) Message: Can't use ORDER clause with this procedure Erreur: 1387 SQLSTATE: HY000 (ER_LOGGING_PROHIBIT_CHANGING_OF) Message: Binary logging and replication forbid changing the global server %s Erreur: 1388 SQLSTATE: HY000 (ER_NO_FILE_MAPPING) Message: Can't map file: %s, errno: %d Erreur: 1389 SQLSTATE: HY000 (ER_WRONG_MAGIC)
1079
Message: Wrong magic in %s Erreur: 1390 SQLSTATE: HY000 (ER_PS_MANY_PARAM) Message: Prepared statement contains too many placeholders Erreur: 1391 SQLSTATE: HY000 (ER_KEY_PART_0) Message: Key part '%s' length cannot be 0 Erreur: 1392 SQLSTATE: HY000 (ER_VIEW_CHECKSUM) Message: View text checksum failed Erreur: 1393 SQLSTATE: HY000 (ER_VIEW_MULTIUPDATE) Message: Can not modify more than one base table through a join view '%s.%s' Erreur: 1394 SQLSTATE: HY000 (ER_VIEW_NO_INSERT_FIELD_LIST) Message: Can not insert into join view '%s.%s' without fields list Erreur: 1395 SQLSTATE: HY000 (ER_VIEW_DELETE_MERGE_VIEW) Message: Can not delete from join view '%s.%s' Erreur: 1396 SQLSTATE: HY000 (ER_CANNOT_USER) Message: Operation %s failed for %s Erreur: 1397 SQLSTATE: XAE04 (ER_XAER_NOTA) Message: XAER_NOTA: Unknown XID Erreur: 1398 SQLSTATE: XAE05 (ER_XAER_INVAL) Message: XAER_INVAL: Invalid arguments (or unsupported command) Erreur: 1399 SQLSTATE: XAE07 (ER_XAER_RMFAIL) Message: XAER_RMFAIL: The command cannot be executed when global transaction is in the %s state Erreur: 1400 SQLSTATE: XAE09 (ER_XAER_OUTSIDE) Message: XAER_OUTSIDE: Some work is done outside global transaction Erreur: 1401 SQLSTATE: XAE03 (ER_XAER_RMERR) Message: XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency Erreur: 1402 SQLSTATE: XA100 (ER_XA_RBROLLBACK) Message: XA_RBROLLBACK: Transaction branch was rolled back Erreur: 1403 SQLSTATE: 42000 (ER_NONEXISTING_PROC_GRANT) Message: There is no such grant defined for user '%s' on host '%s' on routine '%s' Erreur: 1404 SQLSTATE: HY000 (ER_PROC_AUTO_GRANT_FAIL) Message: Failed to grant EXECUTE and ALTER ROUTINE privileges
1080
Erreur: 1405 SQLSTATE: HY000 (ER_PROC_AUTO_REVOKE_FAIL) Message: Failed to revoke all privileges to dropped routine Erreur: 1406 SQLSTATE: 22001 (ER_DATA_TOO_LONG) Message: Data too long for column '%s' at row %ld Erreur: 1407 SQLSTATE: 42000 (ER_SP_BAD_SQLSTATE) Message: Bad SQLSTATE: '%s' Erreur: 1408 SQLSTATE: HY000 (ER_STARTUP) Message: %s: ready for connections. Version: '%s' socket: '%s' port: %d %s Erreur: 1409 SQLSTATE: HY000 (ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR) Message: Can't load value from file with fixed size rows to variable Erreur: 1410 SQLSTATE: 42000 (ER_CANT_CREATE_USER_WITH_GRANT) Message: You are not allowed to create a user with GRANT Erreur: 1411 SQLSTATE: HY000 (ER_WRONG_VALUE_FOR_TYPE) Message: Incorrect %s value: '%s' for function %s Erreur: 1412 SQLSTATE: HY000 (ER_TABLE_DEF_CHANGED) Message: Table definition has changed, please retry transaction Erreur: 1413 SQLSTATE: 42000 (ER_SP_DUP_HANDLER) Message: Duplicate handler declared in the same block Erreur: 1414 SQLSTATE: 42000 (ER_SP_NOT_VAR_ARG) Message: OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger Erreur: 1415 SQLSTATE: 0A000 (ER_SP_NO_RETSET) Message: Not allowed to return a result set from a %s Erreur: 1416 SQLSTATE: 22003 (ER_CANT_CREATE_GEOMETRY_OBJECT) Message: Cannot get geometry object from data you send to the GEOMETRY field Erreur: 1417 SQLSTATE: HY000 (ER_FAILED_ROUTINE_BREAK_BINLOG) Message: A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary logging is enabled; if non-transactional tables were updated, the binary log will miss their changes Erreur: 1418 SQLSTATE: HY000 (ER_BINLOG_UNSAFE_ROUTINE) Message: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) Erreur: 1419 SQLSTATE: HY000 (ER_BINLOG_CREATE_ROUTINE_NEED_SUPER) Message: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
1081
Erreur: 1420 SQLSTATE: HY000 (ER_EXEC_STMT_WITH_OPEN_CURSOR) Message: You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it. Erreur: 1421 SQLSTATE: HY000 (ER_STMT_HAS_NO_OPEN_CURSOR) Message: The statement (%lu) has no open cursor. Erreur: 1422 SQLSTATE: HY000 (ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG) Message: Explicit or implicit commit is not allowed in stored function or trigger. Erreur: 1423 SQLSTATE: HY000 (ER_NO_DEFAULT_FOR_VIEW_FIELD) Message: Field of view '%s.%s' underlying table doesn't have a default value Erreur: 1424 SQLSTATE: HY000 (ER_SP_NO_RECURSION) Message: Recursive stored functions and triggers are not allowed. Erreur: 1425 SQLSTATE: 42000 (ER_TOO_BIG_SCALE) Message: Too big scale %lu specified for column '%s'. Maximum is %d. Erreur: 1426 SQLSTATE: 42000 (ER_TOO_BIG_PRECISION) Message: Too big precision %lu specified for column '%s'. Maximum is %lu. Erreur: 1427 SQLSTATE: 42000 (ER_M_BIGGER_THAN_D) Message: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%s'). Erreur: 1428 SQLSTATE: HY000 (ER_WRONG_LOCK_OF_SYSTEM_TABLE) Message: You can't combine write-locking of system '%s.%s' table with other tables Erreur: 1429 SQLSTATE: HY000 (ER_CONNECT_TO_FOREIGN_DATA_SOURCE) Message: Unable to connect to foreign data source: %s Erreur: 1430 SQLSTATE: HY000 (ER_QUERY_ON_FOREIGN_DATA_SOURCE) Message: There was a problem processing the query on the foreign data source. Data source error: %s Erreur: 1431 SQLSTATE: HY000 (ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST) Message: The foreign data source you are trying to reference does not exist. Data source error: %s Erreur: 1432 SQLSTATE: HY000 (ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE) Message: Can't create federated table. The data source connection string '%s' is not in the correct format Erreur: 1433 SQLSTATE: HY000 (ER_FOREIGN_DATA_STRING_INVALID) Message: The data source connection string '%s' is not in the correct format Erreur: 1434 SQLSTATE: HY000 (ER_CANT_CREATE_FEDERATED_TABLE) Message: Can't create federated table. Foreign data src error: %s Erreur: 1435 SQLSTATE: HY000 (ER_TRG_IN_WRONG_SCHEMA)
1082
Message: Trigger in wrong schema Erreur: 1436 SQLSTATE: HY000 (ER_STACK_OVERRUN_NEED_MORE) Message: Thread stack overrun: %ld bytes used of a %ld byte stack, and %ld bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack. Erreur: 1437 SQLSTATE: 42000 (ER_TOO_LONG_BODY) Message: Routine body for '%s' is too long Erreur: 1438 SQLSTATE: HY000 (ER_WARN_CANT_DROP_DEFAULT_KEYCACHE) Message: Cannot drop default keycache Erreur: 1439 SQLSTATE: 42000 (ER_TOO_BIG_DISPLAYWIDTH) Message: Display width out of range for column '%s' (max = %lu) Erreur: 1440 SQLSTATE: XAE08 (ER_XAER_DUPID) Message: XAER_DUPID: The XID already exists Erreur: 1441 SQLSTATE: 22008 (ER_DATETIME_FUNCTION_OVERFLOW) Message: Datetime function: %s field overflow Erreur: 1442 SQLSTATE: HY000 (ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG) Message: Can't update table '%s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Erreur: 1443 SQLSTATE: HY000 (ER_VIEW_PREVENT_UPDATE) Message: The definition of table '%s' prevents operation %s on table '%s'. Erreur: 1444 SQLSTATE: HY000 (ER_PS_NO_RECURSION) Message: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner Erreur: 1445 SQLSTATE: HY000 (ER_SP_CANT_SET_AUTOCOMMIT) Message: Not allowed to set autocommit from a stored function or trigger Erreur: 1446 SQLSTATE: HY000 (ER_MALFORMED_DEFINER) Message: Definer is not fully qualified Erreur: 1447 SQLSTATE: HY000 (ER_VIEW_FRM_NO_USER) Message: View '%s'.'%s' has no definer information (old table format). Current user is used as definer. Please recreate the view! Erreur: 1448 SQLSTATE: HY000 (ER_VIEW_OTHER_USER) Message: You need the SUPER privilege for creation view with '%s'@'%s' definer Erreur: 1449 SQLSTATE: HY000 (ER_NO_SUCH_USER) Message: There is no '%s'@'%s' registered Erreur: 1450 SQLSTATE: HY000 (ER_FORBID_SCHEMA_CHANGE)
1083
Message: Changing schema from '%s' to '%s' is not allowed. Erreur: 1451 SQLSTATE: 23000 (ER_ROW_IS_REFERENCED_2) Message: Cannot delete or update a parent row: a foreign key constraint fails (%s) Erreur: 1452 SQLSTATE: 23000 (ER_NO_REFERENCED_ROW_2) Message: Cannot add or update a child row: a foreign key constraint fails (%s) Erreur: 1453 SQLSTATE: 42000 (ER_SP_BAD_VAR_SHADOW) Message: Variable '%s' must be quoted with `...`, or renamed Erreur: 1454 SQLSTATE: HY000 (ER_TRG_NO_DEFINER) Message: No definer attribute for trigger '%s'.'%s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger. Erreur: 1455 SQLSTATE: HY000 (ER_OLD_FILE_FORMAT) Message: '%s' has an old format, you should re-create the '%s' object(s) Erreur: 1456 SQLSTATE: HY000 (ER_SP_RECURSION_LIMIT) Message: Recursive limit %d (as set by the max_sp_recursion_depth variable) was exceeded for routine %s Erreur: 1457 SQLSTATE: HY000 (ER_SP_PROC_TABLE_CORRUPT) Message: Failed to load routine %s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d) Erreur: 1458 SQLSTATE: 42000 (ER_SP_WRONG_NAME) Message: Incorrect routine name '%s' Erreur: 1459 SQLSTATE: HY000 (ER_TABLE_NEEDS_UPGRADE) Message: Table upgrade required. Please do "REPAIR TABLE `%s`" to fix it! Erreur: 1460 SQLSTATE: 42000 (ER_SP_NO_AGGREGATE) Message: AGGREGATE is not supported for stored functions Erreur: 1461 SQLSTATE: 42000 (ER_MAX_PREPARED_STMT_COUNT_REACHED) Message: Can't create more than max_prepared_stmt_count statements (current value: %lu) Erreur: 1462 SQLSTATE: HY000 (ER_VIEW_RECURSIVE) Message: `%s`.`%s` contains view recursion Erreur: 1463 SQLSTATE: 42000 (ER_NON_GROUPING_FIELD_USED) Message: non-grouping field '%s' is used in %s clause Erreur: 1464 SQLSTATE: HY000 (ER_TABLE_CANT_HANDLE_SPKEYS) Message: The used table type doesn't support SPATIAL indexes Erreur: 1465 SQLSTATE: HY000 (ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA) Message: Triggers can not be created on system tables
1084
Erreur: 1466 SQLSTATE: HY000 (ER_REMOVED_SPACES) Message: Leading spaces are removed from name '%s' Erreur: 1467 SQLSTATE: HY000 (ER_AUTOINC_READ_FAILED) Message: Failed to read auto-increment value from storage engine Erreur: 1468 SQLSTATE: HY000 (ER_USERNAME) Message: user name Erreur: 1469 SQLSTATE: HY000 (ER_HOSTNAME) Message: host name Erreur: 1470 SQLSTATE: HY000 (ER_WRONG_STRING_LENGTH) Message: String '%s' is too long for %s (should be no longer than %d) Erreur: 1471 SQLSTATE: HY000 (ER_NON_INSERTABLE_TABLE) Message: The target table %s of the %s is not insertable-into Erreur: 1472 SQLSTATE: HY000 (ER_ADMIN_WRONG_MRG_TABLE) Message: Table '%s' is differently defined or of non-MyISAM type or doesn't exist Erreur: 1473 SQLSTATE: HY000 (ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT) Message: Too high level of nesting for select Erreur: 1474 SQLSTATE: HY000 (ER_NAME_BECOMES_EMPTY) Message: Name '%s' has become '' Erreur: 1475 SQLSTATE: HY000 (ER_AMBIGUOUS_FIELD_TERM) Message: First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY Erreur: 1476 SQLSTATE: HY000 (ER_LOAD_DATA_INVALID_COLUMN) Message: Invalid column reference (%s) in LOAD DATA Erreur: 1477 SQLSTATE: HY000 (ER_LOG_PURGE_NO_FILE) Message: Being purged log %s was not found Erreur: 1478 SQLSTATE: XA106 (ER_XA_RBTIMEOUT) Message: XA_RBTIMEOUT: Transaction branch was rolled back: took too long Erreur: 1479 SQLSTATE: XA102 (ER_XA_RBDEADLOCK) Message: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected Erreur: 1480 SQLSTATE: HY000 (ER_TOO_MANY_CONCURRENT_TRXS) Message: Too many active concurrent transactions Les informations d'erreur client sont issues des fichiers suivants : Les valeurs d'erreur et les symboles entre parenthses correspondent aux dfinitions dans le fichier include/errmsg.h MySQL.
1085
La valeur du correspond au message d'erreur list dans le fichier libmysql/errmsg.c. %d et %s reprsentent des nombres ou des chanes qui seront remplaces dans les messages lorsqu'elles seront affiches. Comme les mises jour sont frquentes, il est possible que ces fichiers contiennent des erreurs qui ne sont pas listes ici. Erreur: 2000 (CR_UNKNOWN_ERROR) Message: Unknown MySQL error Erreur: 2001 (CR_SOCKET_CREATE_ERROR) Message: Can't create UNIX socket (%d) Erreur: 2002 (CR_CONNECTION_ERROR) Message: Can't connect to local MySQL server through socket '%s' (%d) Erreur: 2003 (CR_CONN_HOST_ERROR) Message: Can't connect to MySQL server on '%s' (%d) Erreur: 2004 (CR_IPSOCK_ERROR) Message: Can't create TCP/IP socket (%d) Erreur: 2005 (CR_UNKNOWN_HOST) Message: Unknown MySQL server host '%s' (%d) Erreur: 2006 (CR_SERVER_GONE_ERROR) Message: MySQL server has gone away Erreur: 2007 (CR_VERSION_ERROR) Message: Protocol mismatch; server version = %d, client version = %d Erreur: 2008 (CR_OUT_OF_MEMORY) Message: MySQL client ran out of memory Erreur: 2009 (CR_WRONG_HOST_INFO) Message: Wrong host info Erreur: 2010 (CR_LOCALHOST_CONNECTION) Message: Localhost via UNIX socket Erreur: 2011 (CR_TCP_CONNECTION) Message: %s via TCP/IP Erreur: 2012 (CR_SERVER_HANDSHAKE_ERR) Message: Error in server handshake Erreur: 2013 (CR_SERVER_LOST) Message: Lost connection to MySQL server during query Erreur: 2014 (CR_COMMANDS_OUT_OF_SYNC)
1086
Message: Commands out of sync; you can't run this command now Erreur: 2015 (CR_NAMEDPIPE_CONNECTION) Message: Named pipe: %s Erreur: 2016 (CR_NAMEDPIPEWAIT_ERROR) Message: Can't wait for named pipe to host: %s pipe: %s (%lu) Erreur: 2017 (CR_NAMEDPIPEOPEN_ERROR) Message: Can't open named pipe to host: %s pipe: %s (%lu) Erreur: 2018 (CR_NAMEDPIPESETSTATE_ERROR) Message: Can't set state of named pipe to host: %s pipe: %s (%lu) Erreur: 2019 (CR_CANT_READ_CHARSET) Message: Can't initialize character set %s (path: %s) Erreur: 2020 (CR_NET_PACKET_TOO_LARGE) Message: Got packet bigger than 'max_allowed_packet' bytes Erreur: 2021 (CR_EMBEDDED_CONNECTION) Message: Embedded server Erreur: 2022 (CR_PROBE_SLAVE_STATUS) Message: Error on SHOW SLAVE STATUS: Erreur: 2023 (CR_PROBE_SLAVE_HOSTS) Message: Error on SHOW SLAVE HOSTS: Erreur: 2024 (CR_PROBE_SLAVE_CONNECT) Message: Error connecting to slave: Erreur: 2025 (CR_PROBE_MASTER_CONNECT) Message: Error connecting to master: Erreur: 2026 (CR_SSL_CONNECTION_ERROR) Message: SSL connection error Erreur: 2027 (CR_MALFORMED_PACKET) Message: Malformed packet Erreur: 2028 (CR_WRONG_LICENSE) Message: This client library is licensed only for use with MySQL servers having '%s' license Erreur: 2029 (CR_NULL_POINTER) Message: Invalid use of null pointer Erreur: 2030 (CR_NO_PREPARE_STMT)
1087
Message: Statement not prepared Erreur: 2031 (CR_PARAMS_NOT_BOUND) Message: No data supplied for parameters in prepared statement Erreur: 2032 (CR_DATA_TRUNCATED) Message: Data truncated Erreur: 2033 (CR_NO_PARAMETERS_EXISTS) Message: No parameters exist in the statement Erreur: 2034 (CR_INVALID_PARAMETER_NO) Message: Invalid parameter number Erreur: 2035 (CR_INVALID_BUFFER_USE) Message: Can't send long data for non-string/non-binary data types (parameter: %d) Erreur: 2036 (CR_UNSUPPORTED_PARAM_TYPE) Message: Using unsupported buffer type: %d (parameter: %d) Erreur: 2037 (CR_SHARED_MEMORY_CONNECTION) Message: Shared memory: %s Erreur: 2038 (CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR) Message: Can't open shared memory; client could not create request event (%lu) Erreur: 2039 (CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR) Message: Can't open shared memory; no answer event received from server (%lu) Erreur: 2040 (CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR) Message: Can't open shared memory; server could not allocate file mapping (%lu) Erreur: 2041 (CR_SHARED_MEMORY_CONNECT_MAP_ERROR) Message: Can't open shared memory; server could not get pointer to file mapping (%lu) Erreur: 2042 (CR_SHARED_MEMORY_FILE_MAP_ERROR) Message: Can't open shared memory; client could not allocate file mapping (%lu) Erreur: 2043 (CR_SHARED_MEMORY_MAP_ERROR) Message: Can't open shared memory; client could not get pointer to file mapping (%lu) Erreur: 2044 (CR_SHARED_MEMORY_EVENT_ERROR) Message: Can't open shared memory; client could not create %s event (%lu) Erreur: 2045 (CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR) Message: Can't open shared memory; no answer from server (%lu) Erreur: 2046 (CR_SHARED_MEMORY_CONNECT_SET_ERROR)
1088
Message: Can't open shared memory; cannot send request event to server (%lu) Erreur: 2047 (CR_CONN_UNKNOW_PROTOCOL) Message: Wrong or unknown protocol Erreur: 2048 (CR_INVALID_CONN_HANDLE) Message: Invalid connection handle Erreur: 2049 (CR_SECURE_AUTH) Message: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) Erreur: 2050 (CR_FETCH_CANCELED) Message: Row retrieval was canceled by mysql_stmt_close() call Erreur: 2051 (CR_NO_DATA) Message: Attempt to read column without prior row fetch Erreur: 2052 (CR_NO_STMT_METADATA) Message: Prepared statement contains no metadata Erreur: 2053 (CR_NO_RESULT_SET) Message: Attempt to read a row while there is no result set associated with the statement Erreur: 2054 (CR_NOT_IMPLEMENTED) Message: This feature is not implemented yet Erreur: 2055 (CR_SERVER_LOST_EXTENDED) Message: Lost connection to MySQL server at '%s', system error: %d
1089
1090
1091
mysqladmin processlist affiche uniquement les threads de connexion, ceux de INSERT DELAYED et ceux de rplication.
1092
Bien sur, nous esprons que vous n'aurez jamais a diter le rsultat du fichier mysqltest -r ca vous n'avez faire cela que lorsque vous dcouvrez un bug. Pour tre cohrent avec votre configuration, vous devriez placer les fichiers de rsultats dans le dossier mysql-test/r et les nommer test_name.result. Si le test produit plus qu'un rsultat, vous devez utiliser test_name.a.result, test_name.b.result, etc. Si une commande retourne une erreur, vous devez, sur la ligne de la commande, le spcifier avec --error error-number. Le numro d'erreur peut tre une liste d'erreurs possibles, spares par des virgules ','. Si vous crivez un test de rplication, vous devez, sur la premire ligne du fichier de test, ajouter le code source include/master-slave.inc;. Pour passer entre le matre et l'esclave, utilisez connection master; et connection slave;. Si vous avez besoin d'utiliser une connexion alternative, vous pouvez utiliser connection master1; pour le matre, et connection slave1; pour l'esclave. Si vous avez besoin d'une boucle, vous pouvez utiliser ceci :
let $1=1000; while ($1) { # votre requte ici dec $1; }
Pour faire une pause entre les requtes, utilisez la commande sleep. Elle supporte les fraction de secondes, ce qui vous permet d'utiliser sleep 1.3;, pour attendre 1,3 secondes. Pour excuter l'esclave avec des options additionnelles pour votre cas de tests, ajoutez les au format ligne de commande dans mysql-test/t/test_name-slave.opt. Pour le matre, ajoutez les dans mysql-test/t/test_name-master.opt. Si vous avez une question sur la suite de tests, ou que vous avez un test proposer, envoyez le par email sur la liste interne. See Section 1.4.1.1, Les listes de diffusion de MySQL . Comme la liste n'accepte pas les attachements, vous devriez les placer sur le serveur FTP : ftp://support.mysql.com/ pub/mysql/Incoming/
Si cela choue, alors vous devriez configurer MySQL avec --with-debug et excuter mysqltest-run avec l'option --debug. Si cela choue aussi, envoyez le fichier de trace var/tmp/ master.trace ftp://support.mysql.com/pub/mysql/secret pour que nous puissions l'examiner. N'oubliez pas d'inclure une description complte de votre systme, ainsi que de la version de l'excutable mysqld, et de sa compilation. Essayez d'excuter mysql-test-run avec l'option --force pour voir si il n'y a pas d'autres tests qui chouent.
1093
Si vous avez compil MySQL vous-mme, vrifiez notre manuel, ainsi que les notes de compilations pour votre plate-forme, ou bien, utilisez la place un des excutables que nous avons compil pour vous, disponibles http://www.mysql.com/downloads/. Toutes nos versions excutables doivent passer la suite de tests. Si vous obtenez une erreur, comme Result length mismatch ou Result content mismatch, cela signifie que le rsultat de la suite de tests n'a pas la taille attendue. Cela peut tre un bug de MySQL, ou que votre version de MySQL fournit un rsultat d'une autre taille, dans certaines circonstances. Les rsultats de tests qui ont chous sont placs dans un fichier avec le mme nom de base que le fichier de test, et avec l'extension .reject. Si votre test choue, faites un diff sur les deux fichiers. Si vous ne pouvez pas voir o ils diffrent, examinez ces deux fichiers avec od -c, et vrifiez leur tailles respectives. Si un test choue totalement, vous devriez vrifier les fichiers de log dans le dossier mysql-test/ var/log, pour avoir des indices sur ce qui a chou. Si vous avez compil MySQL avec le dbogage, vous pouvez essayer de le dboger en excutant mysql-test-run avec --gdb et/ou --debug. See Section D.1.2, Crer un fichier de traage . Si vous n'avez pas compil MySQL pour le dbogage, vous devriez essayer de le faire. Spcifiez simplement l'option --with-debug dans le script de configure! See Section 2.4, Installation de MySQL avec une distribution source .
1094
Des informations fournies aux fonctions pour qu'elles puissent vrifier le nombre et le type des arguments qui leur sont pass. Vous pouvez demander MySQL de forcer certains arguments certains types avant de les transmettre votre fonction. Vous pouvez indiquer qu'une fonction retourne NULL ou qu'une erreur est survenue.
Une fonction dfinie par un utilisateur (UDF) est une mthode pour intgrer une fonction qui fonctionne de la mme faon qu'une fonction native de MySQL, comme ABS() et CONCAT(). AGGREGATE est une nouvelle option pour MySQL version 3.23. Une fonction AGGREGATE fonctionne exactement comme une fonction native comme SUM ou COUNT(). CREATE FUNCTION enregistre le nom de la fonction, le type, et le nom des bibliothques partages dans la table mysql.func. Vous devez avoir les droits INSERT et DELETE dans la base mysql pour crer et supprimer les fonctions. Toutes les fonctions actives sont recharges chaque fois que le serveur dmarre, sauf si vous dmarrez mysqld avec l'option --skip-grant-tables. Dans ce cas, l'utilisation des UDF n'est pas prise en compte et les UDFs ne sont pas disponibles. (Une fonction active est une fonction qui peut tre charge avec CREATE FUNCTION et supprime par REMOVE FUNCTION). Concernant l'criture des UDFs, Section 27.2, Ajouter des fonctions MySQL . Pour que le mcanisme des fonctions UDF fonctionne, les fonctions doivent tre crites en C ou C++, votre systme doit supporter le chargement dynamique et vous devez avoir compil mysqld dynamiquement (pas statiquement). Notez que pour faire fonctionner AGGREGATE, vous devez avoir une table mysql.func qui contient la colonne type. Si ce n'est pas le cas, vous devez excuter le script mysql_fix_privilege_table pour rsoudre ce problme.
1095
xxx() (requis) La fonction principale. C'est l o le rsultat de la fonction est calcul. La correspondance entre le type de SQL et le type retourn par votre fonction C/C++ est affich ci-dessous : SQL type STRING INTEGER REAL xxx_init() (optionnel) La fonction d'initialisation de xxx(). Elle peut-tre utilise pour : Vrifier le nombre d'arguments de XXX(). Vrifier que les arguments correspondent aux types requis ou indiquer MySQL de contraindre des arguments aux types que vous voulez quand la fonction principale est appele. Allouer la mmoire requise pour la fonction principale. Spcifier la longueur maximale de la sortie. Spcifier (pour les fonctions REAL) le nombre maximal de dcimales. Spcifier si le rsultat peut-tre NULL. xxx_deinit() (optionnel) La terminaison de la fonction xxx(). Elle doit librer toute la mmoire alloue par l'initialisation de la fonction. Quand une requte SQL fait appel XXX(), MySQL appelle l'initialisation de la fonction xxx_init(), pour laisser excuter n'importe quelle action exige, telle que la vrification d'arguments ou l'allocation de mmoire. Si xxx_init() retourne une erreur, la requte SQL est annule avec un message d'erreur et la fonction principale et la fonction de terminaison ne sont pas appeles. Autrement, la fonction principale xxx() est appele une fois pour chaque ligne. Aprs que toutes les lignes aient t traites, la fonction de terminaison xxx_deinit() est appele pour procder aux nettoyages requis. Pour les fonctions d'agrgat (comme SUM()), vous pouvez galement ajouter les fonctions suivantes : xxx_reset() (requise) Remet la somme zro et insre l'argument en tant que valeur initiale pour un nouveau groupe. xxx_add() (requise) Ajoute l'argument l'ancienne somme. Quand vous utilisez les UDF d'agrgat, MySQL opre comme suit : Toutes les fonctions doivent tre compatibles avec les threads (et non pas simplement la fonction principale, mais aussi les fonctions d'initialisation et de terminaison). Cela signifie que vous ne pouvez pas allouer de variables globales ou statiques. Si vous avez besoin de mmoire, allouez-la avec la fonction xxx_init() et librez la avec xxx_deinit(). 1. Appeler xxx_init() pour laisser la fonction d'agrgat allouer la mmoire dont elle aura besoin pour stocker les rsultats. 1096 C/C++ type char * long long double
2. Trier la table en accord avec la clause GROUP BY. 3. Pour la premire ligne dans un nouveau groupe, appeler la fonction xxx_reset(). 4. Pour chaque ligne appartenant un mme groupe, appeler la fonction xxx_add(). 5. Quand le groupe change ou lorsque la dernire ligne a t traite, appeler xxx() pour obtenir le rsultat de l'agrgat. 6. Rpter les tapes de 3 5 tant que toutes les lignes n'ont pas t traites. 7. Appeler xxx_deinit() pour librer la mmoire alloue. Toutes les fonctions doivent tre srs pour les threads (pas seulement la fonction principale, mais les fonctions d'initialisation et de terminaison galement). Cela signifie que vous n'tes pas autoriss allouer une variable globale ou statique qui change ! Si vous avez besoin de mmoire, vous devez l'allouer avec la fonction xxx_init() et la librer avec xxx_deinit().
Le paramtre initid est pass aux trois fonctions. Il pointe sur une structure UDF_INIT qui est utilise pour communiquer des informations entre les fonctions. Les membres de la structure UDF_INIT sont ceux qui sont lists ci-dessous. La fonction d'initialisation doit prparer les membres qu'elle veut, et notamment leur donner une valeur initiale (pour utiliser les valeurs par dfaut, laissez le membre intact) : my_bool maybe_null xxx_init() doit remplacer maybe_null par 1 si xxx() peut retourner NULL. La valeur par dfaut est 1 si l'un des arguments n'est dclar comme maybe_null. unsigned int decimals Le nombre de dcimales. La valeur par dfaut est le nombre maximum de dcimales dans l'argument pass la fonction. Par exemple, vis la fonction reoit 1.34, 1.345 et 1.3, ce nombre sera 3, car 1.345 a 3 dcimales. unsigned int max_length
1097
La taille maximale de la chane rsultat. La valeur par dfaut dpend du type de rsultat de la fonction. Pour les fonctions de chanes, la valeur par dfaut est la taille du plus grand argument. Pour les fonctions entires, la valeur est de 21 chiffres. Pour les fonctions nombre virgule flottante, la valeur est de 13, plus le nombre de dcimales indiques par initid->decimals. Pour les fonctions numriques, la taille inclut le signe et le sparateur dcimal. Si vous voulez retourner un BLOB, vous devez donner ce membre la valeur de 65 ko ou 16 Mo; cet espace mmoire ne sera pas allou, mais utilis pour dcider quel type de colonne utiliser, si il y a un besoin de stockage temporaire. char *ptr Un pointeur que la fonction peut utiliser pour ses besoins propres. Par exemple, la fonction peut utiliser initid->ptr pour transfrer de la mmoire alloue entre les trois fonctions. En xxx_init(), allouez de la mmoire, et assignez la ce pointeur :
initid->ptr = allocated_memory;
Cette fonction est appele lorsque MySQL trouve la premire ligne dans un nouveau groupe. Dans cette fonction, vous devez remettre zro des variables internes de sommaire, puis indique le nouvel argument comme premier membre du nouveau groupe. Dans de nombreuses situations, cela se fait en interne en remettant zro toutes les variables, et en appelant xxx_add(). Cette fonction n'est demande que par MySQL 4.1.1 et plus rcent :
char *xxx_clear(UDF_INIT *initid, char *is_null, char *error);
Cette fonction est appele chaque fois qu'une ligne qui appartient un groupe est trouve, hormis la premire ligne. Durant cette fonction, vous devez ajouter les donnes dans votre variable interne de sommaire. Vous pouvez utiliser le pointeur error pour stocker un octet si quelque chose n'a pas fonctionn.
char *xxx_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
Cette fonction est appele pour toutes les lignes du mme groupe, hormis pour la premire ligne. Dans cette dernire, vous devez ajouter la valeur dans UDF_ARGS pour vos variables internes. La fonction xxx() doit tre dclare de manire identique celle d'un fonction utilisateur simple. See Section 27.2.3.1, Fonctions utilisateur : appeler des fonctions simples . Cette fonction est appele lorsque toutes les lignes d'un groupe ont t traites. Vous ne devez normalement pas accder la variable args ici, mais retourner votre valeur, partir des valeurs du sommaire interne.
1098
Tous les traitements des arguments de xxx_reset() et xxx_add() doivent tre fait d'une manire similaire celle des fonctions UDF normales. See Section 27.2.3.3, Traitement des arguments . La gestion de la valeur retourne par xxx() doit tre identique celle d'une fonction utilisateur classique. See Section 27.2.3.4, Valeurs de retour et gestion d'erreurs. . Le pointeur argument de is_null et error sont les mmes pour tous les appels de xxx_reset(), xxx_add() et xxx(). Vous pouvez utiliser ces valeur pour vous rappeler si vous avez rencontr une erreur, ou si la fonction xxx() doit retourner NULL. Notez que vous ne devez pas stocker de chane dans *error! C'est un conteneur d'un seul octet! is_null est remis zro pour chaque (avant d'appeler xxx_reset(). error n'est jamais remis zro. Si isnull ou error sont modifis aprs xxx(), alors MySQL va retourner NULL comme rsultat de la fonction de groupement.
enum Item_result *arg_type Le type de chaque argument. Les valeurs possibles pour chaque type sont STRING_RESULT, INT_RESULT et REAL_RESULT. Pour s'assurer que les arguments sont d'un type donn, et retourner une erreur dans le cas contraire, vrifiez le tableau arg_type durant la fonction d'initialisation. Par exemple :
if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT) { strcpy(message,"XXX() requires a string and an integer"); return 1; }
Comme alternative l'imposition d'un type particulier pour les arguments des fonctions, vous pouvez utiliser la fonction pour qu'elle modifie le type des arguments et donne aux valeurs de arg_type le type que vous souhaitez. Cela fait que MYSQL va forcer les arguments un type donne, pour chaque appel de la fonction xxx(). Par exemple, pour forcer le type des deux premiers arguments en chane et entier, vous pouvez utiliser la fonction d'initialisation xxx_init() :
args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT;
char **args args->args communique les informations la fonction d'initialisation, ainsi que la nature des arguments avec laquelle elle a t appele. Pour un argument constant i, args->args[i] pointe sur la valeur de l'argument. Voir plus bas pour les instructions d'accs cette valeur. Pour les valeurs non constantes, args->args[i] vaut 0. Un argument constant est une expression qui utilise des constantes, comme 3 ou 4*7-2 ou SIN(3.14). Un argument non-constant est une 1099
expression qui fait rfrence aux valeurs qui peuvent changer de ligne en ligne, par exemple des noms de colonnes ou des fonctions qui sont appeles avec des arguments non-constants. Pour chaque invocation de la fonction principale, args->args contient les arguments rels qui sont passs la ligne qui sera traite. Les fonctions peuvent faire rfrence un argument i comme ceci : Un argument de type STRING_RESULT est donn sous la forme d'un pointeur de chane, plus une longueur, pour permettre la gestion des donnes binaires ou des donnes de taille arbitraire. Le contenu des chanes est disponible avec l'expression args->args[i] et la taille de la chane est args->lengths[i]. Ne supposez pas que les chanes sont termins par le caractre nul. Pour un argument de type INT_RESULT, vous devez transtyper la valeur args->args[i] en valeur long long :
long long int_val; int_val = *((long long*) args->args[i]);
Pour un argument de type REAL_RESULT, vous devez transtyper la valeur args->args[i] en valeur double :
double real_val; real_val = *((double*) args->args[i]);
unsigned long *lengths Pour une fonction d'initialisation, le tableau lengths indique la taille maximale des chanes pour chaque argument. Vous ne devez pas les modifier. Pour chaque appel de la fonction principale, lengths contient la taille relle de toutes les chanes arguments qui sont pass pour la ligne traite. Pour les arguments de type INT_RESULT ou REAL_RESULT, lengths contient toujours la taille maximale de l'argument (comme pour la fonction d'initialisation).
Le tampon result qui est pass la fonction a une taille de 255 bits. Si votre rsultat dpasse ceci, ne vous inquitez pas de l'allocation de mmoire pour ce rsultat. Si votre fonction de chanes de caractres a besoin de retourner une chane de caractres plus grande que 255 bits, vous devez allouer de l'espace pour cela avec malloc() dans votre fonction xxx_init(). Vous pouvez stocker la mmoire alloue dans le buffer ptr de la structure UDF_INIT pour tre r-utilise par les appels futurs de xxx(). See Section 27.2.3.1, Fonctions utilisateur : appeler des fonctions simples . Pour indiquer une valeur de retour NULL dans la fonction principale, mettez is_null 1 :
*is_null = 1;
1100
Pour indiquer une erreur retourne dans la fonction principale, mettez le paramtre error 1:
*error = 1;
Si xxx() met *error 1 pour chaque ligne, la valeur de la fonction est NULL pour la ligne en question et pour chaque ligne suivante traite par le processus dans lequel XXX() est invoqu. (xxx() ne sera mme pas appel pour les lignes suivantes.) Remarque : dans les versions antrieures 3.22.10, vous devez dfinir *error et *is_null :
*error = 1; *is_null = 1;
Vous pouvez facilement trouver les options correctes pour la compilation en excutant cette commande dans le dossier sql de votre installation source :
shell> make udf_example.o
Vous devez excuter une commande de compilation similaire celle que le make affiche, sauf que vous devrez supprimer l'option -c prs de la fin de la ligne, et ajouter -o udf_example.so la fin de la ligne. Sur certains systmes, vous devrez aussi supprimer -c de la commande). Une fois que vous compilez un objet partags contenant des fonctions utilisateurs, vous devez les installer, et prvenir le serveur MYSQL. Compiler un objet partag avec udf_example.cc produit un fichier qui s'appelle udf_example.so (le nom exact peut varier suivant la plate-forme). Copiez ce fichier dans l'un des dossiers utilis par ld, tel que /usr/lib. Par exemple, /etc/ld.so.conf. Sur de nombreux systmes, vous pouvez faire pointer la variable d'environnement LD_LIBRARY ou LD_LIBRARY_PATH pour qu'elle pointe dans le dossier o vous avez vos fichiers de fonctions. Le manuel de dlopen vous indiquera quelle variable utiliser sur votre systme. Vous devriez indiquer cette valeur dans les options de dmarrage de mysql.server et safe_mysqld, et redmarrer mysqld. Aprs que la bibliothque ait t installe, indiquez mysqld ces nouvelles fonctions avec ces commandes :
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so";
1101
FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so"; FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so"; FUNCTION lookup RETURNS STRING SONAME "udf_example.so"; FUNCTION reverse_lookup RETURNS STRING SONAME "udf_example.so"; CREATE AGGREGATE FUNCTION avgcost RETURNS REAL SONAME "udf_example.so";
Les fonctions peuvent tre effaces plus tard avec DROP FUNCTION:
mysql> mysql> mysql> mysql> mysql> mysql> DROP DROP DROP DROP DROP DROP FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION metaphon; myfunc_double; myfunc_int; lookup; reverse_lookup; avgcost;
Les commandes CREATE FUNCTION et DROP FUNCTION modifient la table systme func dans la base mysql. Le nom de la fonction, son type et le nom de la bibliothque partage sont alors sauvs dans la table. Vous devez avoir les droits de INSERT et DELETE dans la base mysql pour ajouter et effacer des fonctions. Vous ne devez pas utiliser la commande CREATE FUNCTION pour ajouter une fonction qui a dj t cre. Si vous devez reinstaller une fonction, vous devez la supprimer avec la commande DROP FUNCTION puis la reinstaller avec CREATE FUNCTION. Vous devrez faire cela, par exemple, si vous recompilez une nouvelle version de votre fonction, pour que mysqld utilise cette nouvelle version. Sinon, le serveur va continuer utiliser l'ancienne version. Les fonctions actives sont recharges chaque fois que le serveur dmarre, moins que vous ne dmarriez le serveur mysqld avec l'option --skip-grant-tables. Dans ce cas, l'initialisation des fonctions utilisateurs sont ignores, et ces fonctions sont inutilisables. Une fonction active doit avoir t cre avec CREATE FUNCTION et pas supprime avec DROP FUNCTION.
La procdure pour ajouter une nouvelle fonction native est dcrite ici. Notez que vous ne pouvez ajouter de fonctions natives une distribution binaire car la procdure implique la modifications du code source de MySQL. Vous devez compiler MySQL vous-mme partir d'une distribution des sources. Notez aussi que si vous migrez vers une autre version de MySQL (par exemple, quand une nouvelle version est ralise), vous devrez rpter la procdure avec la nouvelle version. Pour ajouter une nouvelle fonction native MySQL, suivez les tapes suivantes : 1. Ajoutez une ligne dans lex.h qui dfinit le nom de la fonction dans le tableau sql_functions[]. 2. Si le prototype de la fonction est simple (elle prend zro, un, deux ou trois arguments), vous devez spcifier dans lex.h SYM(FUNC_ARG#) (o # est le nombre d'arguments) en tant que second argument dans le tableau sql_functions[] et ajouter une fonction qui cre un objet fonction dans item_create.cc. Regardez "ABS" et create_funcs_abs() pour un exemple. Si le prototype de la fonction est compliqu (par exemple, elle prend un nombre variable d'arguments), vous devez ajouter deux lignes sql_yacc.yy. Une qui indique le symbole preprocesseur que yacc doit dfinir (cela doit tre ajout au dbut du fichier). Puis dfinir les paramtres de la fonction et un ``item'' avec ces paramtres la rgle simple_expr. Pour un exemple, vrifiez toutes les occurrences de ATAN dans sql_yacc.yy pour voir comment cela se fait. 3. Dans item_func.h, dclarez une classe hritant de Item_num_func ou de Item_str_func, selon que votre fonction retourne une nombre ou un chane. 4. Dans le fichier item_func.cc, ajoutez l'une des dclaration suivantes, selon que vous dfinissez une fonction numrique ou de chane de caractres :
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
Si vous hritez votre objet de l'un des lments standards (comme Item_num_func) vous n'aurez probablement qu' dfinir l'une des fonctions dcrites ci-dessus et laisser l'objet parent prendre soin des autres fonctions. Par exemple, la classe Item_str_func dfinit une fonction val() qui excute atof() sur la valeur retourne par ::str(). 5. Vous devez aussi probablement dfinir la fonction objet suivante :
void Item_func_newname::fix_length_and_dec()
Cette fonction doit au moins calculer max_length en se basant sur les arguments donns. max_length est le nombre maximal de caractres que la fonction peut retourner. Cette fonction doit aussi dfinir maybe_null = 0 si la fonction principale ne peut pas retourner une valeur NULL. La fonction peut vrifier si l'un de ses arguments peut retourner NULL en vrifiant la variable maybe_null des arguments. Vous pouvez regarder Item_func_mod::fix_length_and_dec pour avoir un exemple concret. Toutes les fonctions doivent tre sres pour les threads (en d'autres termes, n'utilisez aucune variable statique ou globale dans la fonction sans les protger avec mutex). Si vous voulez retourner NULL, partir de ::val(), ::val_int() ou ::str() vous devez mettre null_value 1 et retourner 0. Pour les fonctions de l'objet ::str(), il y a d'autres considrations prendre en compte : L'argument String *str fournit un tampon de chane qui peut tre utilis pour contenir le rsultat. (Pour plus d'informations propos du type String, regardez le fichier sql_string.h.) La fonction ::str() doit retourner la chane contenant le rsultat ou (char*) 0 si celui-ci est NULL.
1103
Aucune des fonctions de chanes n'essaye d'allouer de mmoire tant que ce n'est pas ncessaire !
1104
Ce chapitre liste quelques problmes et erreurs communes que les utilisateurs rencontreront. Vous apprendrez dterminer d'o vient le problme, et comment le rsoudre. Vous trouverez aussi les solutions appropries quelques problmes communs.
1105
1106
Est-ce que le programme en question a caus une erreur de segmentation (ore dump) ? Est-ce que le programme consomme toutes les ressources processeur ? Vrifiez avec top Laissez le programme fonctionne un bout de temps, il se peut qu'il soit entrain de traiter une tche lourde. Si c'est le serveur mysqld qui pose problme, pouvez vous essayer un mysqladmin -u root ping ou mysqladmin -u root processlist ? Que dit un programme client (essayez avec mysql, par exemple) quand vous essayez de vous connecter au serveur MySQL ? Le programme se bloque-t-il ? Obtenez vous un retour quelconque ? Lors de l'envoi d'un rapport de bogue, vous devez respecter les rgles dfinies dans ce manuel. See Section 1.4.1.2, Poser des questions ou rapporter un bogue .
Notez l'utilisation des guillemets obliques plutt que les simples avec la commande hostname; cela provoque la substitution de hostname par la valeur courante du nom d'hte de la machine dans la commande mysqladmin.
1107
Voil quelques raisons pouvant entraner l'erreur Can't connect to local MySQL server : mysqld ne fonctionne pas. Vous utilisez un systme qui utilise les pthreads MIT. Si vous utilisez un systme qui n'a pas le support natif des threads, mysqld utilises le paquet MIT-pthreads. See Section 2.1.1, Systmes d'exploitation supports par MySQL . Toutefois, toutes les versions de MIT-pthreads ne supportent pas les sockets Unix. Sur un systme qui ne supporte pas les sockets vous devez toujours spcifier le nom d'hte explicitement lors de la connexion au serveur. Utilisez cette commande pour vrifier la connexion au serveur :
shell> mysqladmin -h `hostname` version
Quelqu'un a effac le fichier de socket Unix que mysqld utilise (/tmp/mysqld.sock par dfaut). Vous avez peut-tre une tche cron qui efface la socket MySQL (par exemple, une tche qui supprime les anciens fichiers du dossier /tmp). Vous pouvez toujours excuter mysqladmin version et vrifier que la socket que mysqladmin tente d'utiliser existe vraiment. La solution dans ce cas est de modifier la tche cron pour qu'elle n'efface plus mysqld.sock ou de placer la socket quelque part d'autre. See Section A.4.5, Comment protger ou changer le fichier socket /tmp/ mysql.sock . Vous avez dmarr mysqld avec l'option --socket=/chemin/vers/socket. Si vous changez le chemin vers la socket vous devez aussi en notifier les clients. Vous pouvez le faire en fournissant le chemin vers la socket en argument au client. See Section A.4.5, Comment protger ou changer le fichier socket /tmp/mysql.sock . Vous utilisez Linux et un thread s'est termin (core dumped). Dans ce cas, vous devez aussi terminer les autres threads mysqld (par exemple, avec le script mysql_zap avant de pouvoir dmarrer un nouveau serveur MySQL. See Section A.4.2, Que faire si MySQL plante constamment ? . Vous n'avez peut-tre pas les privilges de lecture et criture sur le dossier contenant la socket ou sur la socket elle-mme. Dans ce cas, vous devez changer les droits sur ce dossier / fichier ou redmarrer mysqld pour qu'il prenne en compte un dossier auquel vous avec accs. Si vous obtenez l'erreur Can't connect to MySQL server on un_hte, vous pouvez essayer ce qui suit pour trouver le problme : Vrifiez que le serveur fonctionne en faisant telnet votre-nom-d-hte port-tcp-ip et pressez la touche Enter plusieurs fois. Si il y a un serveur MySQL qui tourne sur ce port, vous devriez obtenir une rponse contenant le numro de version du serveur. Si vous obtenez une erreur proche de telnet: Unable to connect to remote host: Connection refused, c'est qu'il n'y a pas de serveur tournant sur le port donn. Essayez de vous connecter au dmon mysqld sur la machine locale et vrifiez le port TCP/IP de la configuration de mysqld (variable port) avec mysqladmin variables. Vrifiez que votre serveur mysqld n'est pas configur avec l'option --skip-networking.
1108
Passer tous les programmes clients en version 4.1.1, ou plus rcent. Utiliser un compte qui a un ancien mot de passe, lorsque vous vous connectez avec un client pre-4.1. Remettre un mot de passe ancien format pour les clients pre-4.1 : Ceci est fait avec la commande SET PASSWORD et la fonction OLD_PASSWORD() :
mysql> SET PASSWORD FOR -> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
Dire au serveur qu'il doit utiliser l'ancien algorithme de hashage : 1. Dmarrez mysqld avec --old-passwords. 2. Donnez un mot de passe tous les utilisateurs qui ont un hash long de mot de passe. Vous pouvez les trouver comme ceci :
SELECT * FROM mysql.user WHERE LENGTH(password) > 16;
Pour plus d'information sur l'identification et le hashage, voyez Section 5.5.9, Hashage de mots de passe en MySQL 4.1 .
Sur certains systmes, vous vous apercevrez que votre mot de passe fonctionne lorsqu'il est spcifi dans un fichier de configuration, ou bien en ligne de commande, mais pas interactivement, lorsque l'invite Enter password: est propose. Cela survient lorsque la bibliothque systme limite la taille des mots de passe 8 caractres (gnralement). C'est un problme li la bibliothque systme, et non MySQL. Pour pallier ce problme, changez votre mot de passe MySQL pour qu'il fasse 8 ou moins de caractres, ou bien placez votre mot de passe dans votre fichier d'options.
cela veut dire que mysqld a reu trop de (max_connect_errors) tentatives de connexions l'hte 'hostname' qui ont t interrompus en plein milieu. Aprs max_connect_errors requtes choues, mysqld pense qu'il se passe quelque chose de mauvais (comme une attaque de la part d'un pirate), et bloque le serveur pour les prochaines connexions jusqu' ce que quelqu'un excute la commande mysqladmin flush-hosts. See Section 5.2.3, Variables serveur systme . Par dfaut, mysqld bloque le serveur aprs 10 connexions errones. Vous pouvez facilement changer ce comportement en dmarrant le serveur avec ces arguments :
shell> safe_mysqld -O max_connect_errors=10000 &
1109
Notez que si vous recevez ce message pour un hte en particulier, vous devriez vous assurer qu'il n'y a pas de problmes de connexions TCP/IP depuis cet hte. Si vos connexions TCP/IP ne marchent pas, il ne servira rien d'augmenter la valeur de la variable max_connect_errors!
notez que cette erreur parle du client MySQL client mysql. La raison de cette erreur est simplement que le client n'a pas la mmoire suffisante pour stocker le rsultat en entier. Pour remdier ce problme, vrifiez d'abord que votre requte est correcte. Est-ce normal qu'elle retourne autant de lignes? Si oui, vous pouvez utiliser mysql --quick, qui utilise mysql_use_result() pour rcuprer les rsultats. Cela sollicitera moins le client (mais plus le serveur).
1110
CR_SERVER_LOST
Le client n'a pas obtenu d'erreur en contactant le serveur, mais n'a pas obtenu de rponse complte la question pose.
Par dfaut, le serveur ferme la connexion aprs 8 heures si rien ne se passe durant ce temps. Vous pouvez modifier la limite de temps en changeant la variable wait_timeout lorsque vous lancez mysqld. See Section 5.2.3, Variables serveur systme . Si vous avez un script, il suffit d'mettre une nouvelle requte pour que le client se reconnecte automatiquement. Vous obtiendrez aussi cette erreur si quelqu'un termin le processus avec kill #idprocessus#. Vous pouvez vrifier si le serveur MySQL est encore en marche en excutant mysqladmin version et examinant la date de mise en route. Si le problme est que mysqld a plant, vous devriez vous concentrer sur la rsolution du problme. Vous devez dans ce cas commencer par vrifier si emmtre la mme requte fera nouveau planter MySQL. See Section A.4.2, Que faire si MySQL plante constamment ? . Vous pouvez aussi obtenir ces erreurs si vous envoyez une requte incorrecte ou trop grande au serveur. Si mysqld reoit un paquet trop large ou mal ordonn, il suppose que quelque chose s'est mal pass au niveau du client et ferme la connexion. Si vous avez besoin de grande requtes (par exemple, si vous travaillez avec de grandes colonnes BLOB) vous pouvez augmenter la taille limite des requtes en dmarrant mysqld avec l'option -O max_allowed_packet=# (1 Mo par dfaut). Le surplus de mmoire est allou la demande, ce qui fait que mysqld n'utilisera de la mmoire que lorsque vous emmtrez une grande requte ou qu'il aura retourner de grandes rponses ! Plus d'informations sur la configuration de la taille des paquets sont disponibles dans la section Section A.2.9, Erreur Packet too large . Si vous voulez rapporter un bogue concernant ce problme, merci d'inclure les informations suivantes : MySQL a-t-il plant ? (Vous pouvez le savoir en regardant le fichier hostname.err. See Section A.4.2, Que faire si MySQL plante constamment ? . Si une requte spcifique fait planter mysqld et que les tables concernes ont bien t vrifies avec CHECK TABLE avant l'excution, pouvez-vous faire une batterie de tests ? See Section D.1.6, Faire une batterie de tests lorsque vous faites face un problme de table corrompue . Quelle est la valeur de la variable wait_timeout dans le serveur MySQL ? mysqladmin variables vous donnera une rponse Avez-vous essay de dmarrer mysqld avec --log et vrifi si la requte apparat bien dans le log ? See Section 1.4.1.2, Poser des questions ou rapporter un bogue .
1111
Notez que le client et le serveur ont chacun leur propre variable max_allowed_packet. Si vous voulez grer les gros paquets, vous devrez changer cette variable ct client et ct serveur. Si utilisez le client mysql, la variable max_allowed_packet vaut par dfaut 16Mo. C'est aussi la valeur maximale avant MySQL 4.0. Pour lui donner une valeur maximale plus grande, depuis 4.0, lancez mysql comme ceci :
mysql> mysql --max_allowed_packet=32M
Cela fixe une taille de paquet 32Mo. La valeur par dfaut de max_allowed_packet est 1Mo. Vous pouvez augmenter cette valeur si le serveur doit grer de grosses requtes (par exemple, si vous travaillez avec de grandes colonnes BLOB). Par exemple, pour modifier la variable en lui donnant une valeur de 16 MO, lancez le serveur comme ceci :
mysql> mysqld --max_allowed_packet=16M
Vous pouvez aussi utiliser le fichier d'options pour spcifier la valeur de max_allowed_packet. Par exemple, pour spcifier une valeur de 16M0, ajoutez la ligne suivante dans le fichiers d'options :
[mysqld] max_allowed_packet=16M
Il n'est pas dangereux d'augmenter cette valeur tant donn que la mmoire n'est allou que lorsque besoin en est. Cette variable est plus une prcaution pour capturer les paquets errons qui circulent entre le client et le serveur. Elle sert aussi a vous assurer que vous n'utilisez pas accidentellement de gros paquets qui consommeront toute la mmoire. Si vous utilisez le client mysql, vous pouvez spcifier un plus grand tampon en dmarrant le client avec mysql --set-variable=max_allowed_packet=8M. Les autres clients ont diffrentes mthodes pour configurer cette variable. Notez que --set-variable est dsapprouve depuis MySQL 4.0, utilisez --max-allowed-packet=8M la place. Vous pouvez utiliser le fichier d'options pour augmenter la taille de max_allowed_packet dans mysqld. Par exemple, si vous vous attendez stocker la totalit d'un MEDIUMBLOB dans une table, vous aurez besoin de dmarrer le serveur avec l'option setvariable=max_allowed_packet=16M. Vous pouvez aussi rencontrer d'tranges problmes avec les gros paquets si vous utilisez les grands blob, mais que vous n'avez pas donn mysqld l'accs assez de mmoire pour grer ces requtes. Si vous pensez tre dans ce cas, essayez d'ajouter ulimit -d 256000 au dbut du script safe_mysqld et redmarrez mysqld.
1112
Cela signifie qu'un problme est survenu : Le programme client n'a pas appel mysql_close() avant de quitter. Le client a t inactif plus de wait_timeout ou interactive_timeout secondes sans aucune requte. See Section 5.2.3, Variables serveur systme . L'excution du programme client s'est termine soudainement au milieu d'un transfert. Lorsque ce qui prcde arrive, la variable Aborted_clients est incrmente. La variable serveur Aborted_connects est incrmente lorsque : Un paquet de connexion ne contient pas la bonne information. L'utilisateur n'avait pas les droits d'accs la base de donnes. L'utilisateur a utilis un mot de passe erron. Il a fallu plus de connect_timeout secondes pour obtenir un paquet de communication. See Section 5.2.3, Variables serveur systme . Notez que ce qui prcde peut indiquer que quelqu'un essaye de s'introduire dans votre base de donnes ! Autres raisons pour les problmes de clients chous / connexions interrompues : L'utilisation du protocole Ethernet sous Linux, que le Duplex soit intgral (Full-Duplex) ou partiel (Half Duplex) avec Linux. La plupart des pilotes Ethernet de Linux ont ce bogue. Vous pouvez tester ce bogue en transfrant un norme fichier via FTP d'une machine l'autre. Si le transfert est saccad (succession de transfert-pause-transfert-pause) alors vous vivez le syndrme du duplex de Linux. La seule solution est de changer le mode de Duplex sur les deux cartes rseau et Hub/Switch en duplex partiel ou duplex intgral et de faire des tests pour connatre la meilleure configuration. Quelques problmes avec la bibliothque de threads qui causent des interruptions de lectures. Mauvaise configuration TCP/IP. Les cbles, concentrateurs ou commutateurs Ethernet dfectueux. On peut le diagnostiquer aisment en remplacement le matriel. max_allowed_packet est trop petit ou les requtes ont besoin de plus de mmoire que celle que vous avez allou mysqld. See Section A.2.9, Erreur Packet too large .
1113
Vous utilisez des tables ISAM ou MyISAM sur un systme d'exploitation qui ne supporte pas les fichiers de plus de 2G et vous avez atteint cette limite dans le fichier de donnes ou d'index. See Section 5.2.3, Variables serveur systme . Vous utilisez des tables MyISAM et la taille des donnes ou de l'index est plus grande que celle que MySQL a allou aux pointeurs. (Si vous ne spcifiez pas MAX_ROWS CREATE TABLE MySQL n'allouera que des pointeurs supportant 4G de donnes). Vous pouvez obtenir la taille maximale des donnes / index en faisant :
SHOW TABLE STATUS FROM database LIKE 'nom_de_table';
or using myisamchk -dv database/nom_de_table. Si le problme vient de l, vous pouvez le corriger en faisant quelque chose se rapprochant de :
ALTER TABLE nom_de_table MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
Vous n'avez besoin de spcifier AVG_ROW_LENGTH que pour les tables avec des champs BLOB/ TEXT car dans ce cas, MySQL ne peut optimiser l'espace requis en se basant uniquement sur le nombre de lignes.
cela signifie que MySQL ne peut crer de fichier temporaire pour le jeu de rsultats dans le dossier temporaire dfini. (L'erreur prcdente est typique de Windows, et le message d'erreur Unix est similaire.) La solution est de dmarrer mysqld avec l'option --tmpdir=chemin ou d'ajouter votre fichier d'options. Par exemple, pour spcifier le dossier C:\temp, utilisez ces lignes :
[mysqld] tmpdir=C:/temp
Le dossier C:\temp doit exister au pralable. See Section 4.3.2, Fichier d'options my.cnf . Vrifiez aussi le code erreur que vous obtenez avec perror. Une autre raison peut tre une erreur de disque satur.
shell> perror 28 Error code 28: No space left on device
1114
Causes possibles et solutions pour ce problme : Vous faites peut-tre tourner une nouvelle version de mysqld avec une vielle table user. Vous pouvez vrifier cela en excutant mysqlshow mysql user pour voir si le champ du mot de passe est plus petit que 16 caractres. Si c'est le cas, vous pouvez le corriger en excutant le script scripts/add_long_password. L'utilisateur a un ancien mot de passe (8 caractres) et vous n'avez pas dmarr mysqld avec l'option --old-protocol. Mettez jour le mot de passe dans la table user ou redmarrez mysqld avec --old-protocol. Vous avez spcifi un mot de passe dans la table user sans passer par la fonction PASSWORD(). Utilisez mysql pour mettre jour l'utilisateur dans la table user avec un nouveau mot de passe. Assurez-vous d'utiliser la fonction PASSWORD() :
mysql> UPDATE user SET password=PASSWORD('votre mot de passe') -> WHERE user='XXX';
Dans certains cas, les tables pourraient exister, mais vous n'utilisez pas les rfrences correctes : Comme MySQL utilise des dossiers et des fichiers pour stocker les bases de donnes et les tables, les noms sont sensibles la casse si le serveur fonctionne sur un systme d'exploitation qui est sensible la casse. Mme pour les systmes de fichiers qui ne sont pas sensibles la casse, comme sur Windows, toutes les rfrences dans une requtes doivent tre fates dans la mme casse. Vous pouvez vrifiez les tables disponibles avec la commande SHOW TABLES. See Section 13.5.3, Syntaxe de SHOW .
Cela signifie l'une des choses suivantes : Le jeu de caractres est un jeu multi-octets et votre client ne les supporte pas. Dans ce cas, vous devez recompiler le client avec --with-charset=xxx ou avec --withextra-charsets=xxx. See Section 2.4.2, Options habituelles de configure . Tous les binaires standards de MySQL sont compils avec --with-extra-charactersets=complex qui active le support de tous les jeux de caractres multi-octets. See Section 5.8.1, Le jeu de caractres utilis pour les donnes et le stockage . Le jeu de caractres est un simple jeu de caractres qui n'est pas compil dans mysqld et les fichiers de dfinition du jeu ne sont pas l'endroit o le client si attend. Dans ce cas vous avez besoin de : Recompiler le client avec le support du jeu de caractres. See Section 2.4.2, Options habituelles de configure .
1115
Spcifier au client o les fichiers de dfinition du jeu de caractres se situent. Pour beaucoup de clients, vous pouvez le faire avec l'option --character-sets-dir=chemin-vers-dossierjeu-caractres. Copier les fichiers de dfinition du jeu de caractres dans le dossier o le client s'attend les trouver.
Le problme ici est que mysqld essaye de garder trop de fichiers ouverts en mme temps. Vous pouvez soit demander mysqld de ne pas ouvrir autant de fichiers simultanment ou augmenter le nombre de descripteurs de fichiers allous mysqld. Pour dire mysqld de garder moins de fichiers ouverts en mme temps, vous pouvez rendre le cache de tables plus petit en utilisant l'option -O table_cache=32 de safe_mysqld (la valeur par dfaut est 64). Rduire la valeur de max_connections rduira aussi le nombre de fichiers ouverts (90 comme valeur de dfaut). Pour changer le nombre de descripteurs de fichiers allous mysqld, vous pouvez utiliser l'option --open-files-limit=# de safe_mysqld ou -O open-files-limit=# de mysqld. See Section 13.5.3.18, Syntaxe de SHOW VARIABLES . La faon la plus facile de faire cela est d'ajouter cette option dans votre fichiers d'options. See Section 4.3.2, Fichier d'options my.cnf . Si vous avec une ancienne version de mysqld qui ne le supporte pas, vous pouvez diter le script safe_mysqld. Il y a une ligne commente ulimit -n 256 dans le script. Vous pouvez enlever le caractre # pour dcommenter cette ligne, et changer le nombre 256 pour affecter le nombre de descripteurs de fichiers allous mysqld. ulimit (et open-files-limit) peuvent augmenter le nombre de descripteurs de fichiers, mais seulement jusqu' la limite impose par le systme d'exploitation. Il y a aussi une limite 'matrielle' qui ne peut tre dpasse que si vous dmarrez safe_mysqld ou mysqld en tant que root (souvenezvous juste que vous devez aussi utiliser l'option --user=... dans ce cas). Si vous avez besoin de repousser les limites du systme d'exploitation pour les descripteurs de fichiers disponibles pour chaque processus, consultez la documentation de votre systme. Note : Notez que si vous dmarrez le Shell tcsh, ulimit ne fonctionnera pas ! tcsh retournera aussi des valeurs incorrectes si vous atteignez la limite courante ! Dans ce cas, vous devez dmarrer safe_mysqld avec sh !
1116
/tmp/ccFKsdPa.o(.text+0x57): undefined reference to `mysql_real_connect' /tmp/ccFKsdPa.o(.text+0x69): undefined reference to `mysql_error' /tmp/ccFKsdPa.o(.text+0x9a): undefined reference to `mysql_close'
vous pouvez rparer cela en ajoutant -Ldir_path-lmysqlclient dans votre ligne de liaison. Pour dterminer le dossier correct, utilisez cette commande :
shell> mysql_config --libs
Si vous obtenez une erreur undefined reference pour la fonction uncompress ou compress, ajoutez -lz la fin de votre ligne de liaison et essayez nouveau ! Si vous obtenez des erreurs undefined reference pour des fonctions qui devraient exister sur votre systme, comme connect, vrifiez la page de manuel de la fonction en question, pour les bibliothques que vous devez ajouter la ligne de liaison ! Si vous obtenez une erreur undefined reference pour des fonctions inexistantes sur votre systme, ressemblant ce qui suit :
mf_format.o(.text+0x201): undefined reference to `__lxstat'
cela signifie que votre bibliothque est compil sur un systme qui n'est pas 100% compatible avec le votre. Dans ce cas, vous devez obtenir la dernire distribution des sources de MySQL et compiler vous-mmes. See Section 2.4, Installation de MySQL avec une distribution source . Si vous essayez de faire fonctionner un programme et que vous obtenez des erreurs pour des symboles non-rfrencs qui commencent par mysql_ ou une erreur disant que la bibliothque mysqlclient ne peut tre trouve, cela signifie que votre systme n'arrive pas trouver la bibliothque partage libmysqlclient.so. La solution est de dire votre systme de chercher les bibliothques partages l o la bibliothque est situe avec l'une des mthodes suivantes : Ajouter le chemin vers le dossier o se situe libmysqlclient.so dans la variable d'environnement LD_LIBRARY_PATH. Ajouter le chemin vers le dossier o se situe libmysqlclient.so dans la variable d'environnement LD_LIBRARY. Copiez le fichier libmysqlclient.so un endroit o votre systme le cherche, comme dans le dossier /lib, et mettez jour les informations de la bibliothque partage en excutant ldconfig. Un autre moyen de rsoudre ce problme est de lier votre programme statiquement, avec -static, ou en effaant les bibliothques dynamiques de MySQL avant de lier votre code. Dans le second cas vous devez vous assurer qu'aucun autre programme n'utilise les bibliothques dynamiques !
Si les dossier ou les fichiers de donnes de MySQL sont des liens symboliques, vous devez vous assurer de pouvoir suivre ces lignes, et de changer les propritaires des fichiers et dossiers sur lesquels ils pointent. L'option chown -R de chown peut ne pas suivre les liens symboliques.
1117
3. Dmarrez le serveur avec l'utilisateur nom_utilisateur, ou bien, si vous utilisez MySQL version 3.22 ou plus rcent, dmarrez mysqld en tant que root Unix, et utilisez l'option -user=nom_utilisateur. mysqld va alors changer automatiquement d'utilisateur pour utiliser nom_utilisateur avant d'accepter les connexions. 4. Pour dmarrer le serveur sous le nom d'utilisateur automatiquement au moment du dmarrage du systme, ajouter une ligne user qui spcifie le nom de l'utilisateur que le groupe de [mysqld] est du mme groupe que le fichier d'options /etc/my.cnf ou le fichier d'options my.cnf dans le dossier de donnes du serveur. Par exemple :
[mysqld] user=nom_utilisateur
A ce moment, votre processus mysqld doit fonctionner normalement sous le nom de l'utilisateur Unix nom_utilisateur. Une chose n'a pas chang : les droits dans les tables de droits de MySQL. Par dfaut, juste aprs avoir excut le script d'installation des tables de droits mysql_install_db, l'utilisateur MySQL root est le seul utilisateur du systme avec les droits de crer et de dtruire les bases. A moins que vous n'ayez chang ces droits, ils ont toujours cours. Cela ne va pas vous empcher d'accder MySQL en tant que root MySQL, mme si vous n'tes pas connect en tant que root Unix. Spcifiez simplement l'option -u root au programme client. Notez qu'accder MySQL en tant que root, en fournissant l'option -u root en ligne de commande, n'a rien a voir avec MySQL qui fonctionne avec les droits de root Unix, ou d'un autre utilisateur Unix. Les droits d'accs et les noms d'utilisateurs MySQL sont compltement spar des noms d'utilisateurs et des mots de passes Unix. Le seul rapport avec les utilisateurs Unix est que si vous ne fournissez pas l'option -u lorsque vous dmarrez votre client, le client va essayer de se connecter MySQL avec votre nom d'utilisateur Unix. Si votre serveur Unix n'est pas scuris, il est recommand de donner un mot de passe l'utilisateur MySQL root dans les tables de droits. Sinon, n'importe quel utilisateur ayant un compte sur cette machine va pouvoir accder au compte root avec l'option mysql -u root nom_base et faire ce qu'il veut. See Section 2.5, Procdure de post-installation .
alors la variable d'environnement UMASK est peut-tre mal configure lorsque mysqld est dmarr. La valeur par dfaut de umask est 0660. Vous pouvez corriger ce comportement en dmarrant safe_mysqld de la faon suivante :
shell> UMASK=384 # = 600 en octal shell> export UMASK shell> /chemin/vers/safe_mysqld &
Par dfaut, MySQL crera les dossiers des bases de donnes et de RAID avec 0700 comme type de permissions. Vous pouvez modifier ce comportement en dfinissant la variable UMASK_DIR. Si vous le faite, les nouveaux dossiers seront cres en combinant UMASK et UMASK_DIR. Par exemple, si vous voulez donner un accs de groupe tout les nouveaux dossiers, vous pouvez faire :
shell> UMASK_DIR=504 # = 770 en octal shell> export UMASK_DIR shell> /chemin/vers/safe_mysqld &
A partir de la version 3.23.25, MySQL suppose que les valeurs de UMASK et UMASK_DIR sont en octal si elles commencent par un zro. See Annexe E, Variables d'environnement.
1118
Puis, trouver le service MySQL dans la liste, et arrtez le. Si votre serveur ne fonctionne pas comme un service, essayer d'utiliser le gestionnaire de tches pour l'arrter. 3. Ouvrez une fentre de console DOS :
Start Menu -> Run -> cmd
4. Nous supposerons ici que vous avez install MySQL dans le dossier C:\mysql. Si vous l'avez install ailleurs, ajustez les commandes. A l'invite de commandes, excutez cette commande :
C:\> C:\mysql\bin\mysqld-nt --skip-grant-tables
Cela va relancer le serveur dans un mode spcial, qui ne vrifie pas les droits dans les tables. 5. Gardez la premire console ouverte, et ouvrez-en une seconde, et excutez la commande suivante (une commande par ligne) :
C:\> C:\mysql\bin\mysqladmin -u root flush-privileges password "newpwd" C:\> C:\mysql\bin\mysqladmin -u root -p shutdown
Remplacez ``newpwd'' par le mot de passe root que vous voulez utiliser. La seconde commande va vous demander d'enter le mot de passe pour identification d'accs. Entrez le mot de passe que vous avez assign dans la premire commande. 6. Stoppez le serveur MySQL, et relancez le comme d'habitude. Si vous lancez MySQL comme un service, dmarrez le depuis le gestionnaire de services. Si vous le lancez manuellement, utilisez votre commande habituelle. 7. Vous devriez pouvoir vous connecter en utilisant le nouveau mot de passe. Dans un environnement Unix, la procdure pour redfinir le mot de passe root est le suivant : 1. Connectez vous sur votre systme en tant que root Unix, ou avec le compte qui fait tourner le dmon mysqld. 2. Reprez le fichier .pid qui contient l'identifiant du processus du serveur. Le chemin et le nom exact de ce fichier dpendent de votre distribution, nom de serveur et configuration. Les chemins classiques sont : /var/lib/mysql/, /var/run/mysqld/ et /usr/local/mysql/data/.
1119
Gnralement, le nom du fichier est suivi de l'extension .pid et commence avec mysqld ou le nom de votre serveur. Terminez le serveur mysqld en lui envoyant une commande kill (pas un kill -9), en utilisant le numro d'identifiant de processus que vous venez de lire dans le fichier .pid.
shell> kill `cat /dossier-donnees-mysql/hote.pid`
Vous devez tre l'utilisateur Unix root ou l'utilisateur qui fait tourner mysqld pour pouvoir le faire. 3. Redmarrez mysqld avec l'option --skip-grant-tables.
shell> mysqld_safe --skip-grant-tables &
Remplacez ``nouveaumotdepasse'' avec le mot de passe root que vous souhaitez. 5. Aprs cela, vous devriez pouvoir vous connecter avec le nouveau mot de passe. Alternativement, sur toutes les plate-formes, vous pouvez aussi choisir le nouveau mot de passe en utilisant le client mysql : 1. Stoppez et redmarrez mysqld avec l'option --skip-grant-tables comme dcrit plus haut. 2. Connectez vous au serveur mysqld avec :
shell> mysql -u root mysql
4. Aprs cela, vous devriez pouvoir vous connecter avec le nouveau mot de passe.
1120
Ce qui prcde signifie que normalement, vous ne devriez obtenir de tables corrompues que si : Quelqu'un ou quelque chose a coup mysqld ou la machine au milieu d'une mise jour. Vous avez trouv un bogue dans mysqld qui le termine au milieu d'une mise jour. Quelqu'un manipule les fichiers de donnes ou d'index en dehors de mysqld sans verrouiller proprement les tables. Si vous faites tourner plusieurs serveurs mysqld avec les mmes donnes sur un systme qui ne gre pas bien les verrous de fichiers (normalement grs par le dmon lockd) ou que vous le faites avec --skip-external-locking Vous avez un fichier de donnes ou d'index corrompu qui contient des donnes fausses ce qui amne mysqld confusion. Vous avez trouv un bogue dans le systme de stockage des donnes. Cela parait impossible, mais sait-on jamais ? Dans ce cas, essayez de changer le type de fichier pour qu'il soit pris en charge par un autre gestionnaire de bases de donnes en utilisant ALTER TABLE sur une copie rpare de la table ! Parce qu'il est trs difficile de savoir pourquoi quelque chose plante, essayez d'abord de voir si les choses qui marchent pour les autres ne fonctionnent pas chez vous. Merci d'essayer les diffrentes choses suivantes : Coupez le dmon mysqld avec mysqladmin shutdown, excutez myisamchk --silent -force */*.MYI sur toutes les tables, et redmarrez le dmon mysqld. Cela vous assurera que vous partez d'un bon point de dpart. See Chapitre 5, Administration du serveur. Utilisez mysqld --log et essayez de dterminer partir des informations du log si une requte spcifique fait planter le serveur. Plus de 95% de tous les bogues sont lis une requte spcifique ! Normalement, c'est la dernire requte dans le fichier de log avant que MySQL n'ait redmarr. See Section 5.9.2, Le log gnral de requtes . Si vous pouvez faire planter MySQL plusieurs reprise avec une requte, mme aprs avoir vrifi toutes les tables avant de l'excuter, alors vous avez trouv le bogue et vous devez faire un rapport de bogue pour nous en avertir ! See Section 1.4.1.3, Comment rapporter un bogue ou un problme . Essayer d'effectuer une batterie de tests que nous pourrons utiliser pour reproduire le problme. See Section D.1.6, Faire une batterie de tests lorsque vous faites face un problme de table corrompue . Essayez d'excuter le test inclus du dossier mysql-test et les benchmarks MySQL. See Section 27.1.2, Suite de test de MySQL . Ils devraient tester plutt bien MySQL. Vous pouvez aussi ajouter ce code au benchmarks pour simuler votre application ! Les benchmarks peuvent tre trouvs dans le rpertoire sql-bench dans la distribution des sources ou, pour une distribution binaire, dans le rpertoire sql-bench de votre dossier d'installation MySQL. Essayez fork_test.pl. Il est situ dans le dossier tests de la distribution source. Si vous configurez MySQL pour le dbogage, il sera plus facile d'obtenir des informations propos des erreurs possibles si quelque chose se passe mal. Reconfigurez MySQL avec l'option --withdebug ou --with-debug=full de configure puis recompilez. See Section D.1, Dboguer un serveur MySQL . Configurer MySQL pour le dbogage inclus un outil d'allocation de mmoire qui peut trouver quelques erreurs. Il fournit aussi beaucoup d'informations sur ce qui se passe. Avez-vous appliqu les derniers patches de votre systme d'exploitation ? Utilisez l'option --skip-external-locking de mysqld. Sur quelques systmes, le gestionnaire des verrous lockd ne fonctionne pas convenablement; l'option --skip-external-locking dit
1121
mysqld de ne pas utiliser de pas utiliser de verrous externes. (Cela signifie que vous ne pouvez pas faire tourner deux serveurs mysqld sur les mmes donnes et que vous devez faire attention si vous utilisez myisamchk, mais il peut tre instructif d'essayer cette option comme test.) Avez-vous essay mysqladmin -u root processlist lorsque mysqld semble fonctionner mais ne rpond plus ? Quelquefois, mysqld n'est pas comateux, mme si vous le croyez. Le problme peut-tre que toutes les connexions sont utilises, ou qu'il y a quelques problmes avec les verrous internes. mysqladmin processlist devra normalement tre en mesure d'effectuer une connexion mme dans ce cas, et peut fournir des informations utiles propos du nombre de connexions courantes et de leur statut. Excutez la commande mysqladmin -i 5 status ou mysqladmin -i 5 -r status ou dans une fentre spare pour produire des statistiques pendant que vous excutez vos autres requtes. Essayez ce qui suit : 1. Dmarrez mysqld partir de gdb (ou d'un autre dbogueur). See Section D.1.3, Dboguer mysqld sous gdb . 2. Excutez vos scripts de tests. 3. Affichez le traage et les variables locales aux trois niveaux les plus bas. Avec gdb vous pouvez le faire avec les commandes suivantes lorsque mysqld s'est plant l'intrieur de gdb :
backtrace info local up info local up info local
Avec gdb vous pouvez aussi savoir quels threads existent avec info threads et en prendre un avec thread #, o # est l'identifiant du thread. Essayez de simuler votre application avec un script Perl pour forcer MySQL planter ou avoir un comportement dfectueux. Envoyez un rapport de bogue normal. See Section 1.4.1.3, Comment rapporter un bogue ou un problme . Soyez le plus prcis possible et donnez plus de dtails que d'habitude. Puisque MySQL fonctionne pour beaucoup de personnes, il se peut que le plantage rsulte de quelque chose de spcifique votre systme (par exemple, une erreur lie la particularit de vos bibliothques systme). Si vous avez des problmes avec des tables lignes de longueurs dynamiques et que vous n'utilisez pas de colonnes BLOB/TEXT (mais seulement des colonnes VARCHAR), vous pouvez essayer de changer tous les VARCHAR en CHAR avec ALTER TABLE. Cela forcera MySQL utiliser des lignes de tailles fixes. Les lignes tailles fixes prennent un peu plus d'espace, mais sont plus tolrants aux corruptions ! Le code courant des lignes dynamiques est utilis chez MySQL AB depuis au moins 3 ans sans aucun problme, mais par nature, les lignes longueur dynamique sont plus exposes aux erreurs, il est donc bon d'essayer ce qui prcde pour voir si cela vous aide !
1122
Pour contourner ce problme, vous pouvez effectuer les actions suivantes : Pour continuer, il suffit juste d'avoir assez d'espace disque pour insrer tous les enregistrements. Pour annuler le thread, vous devez lui envoyer un mysqladmin kill. Le thread sera annul la prochaine fois qu'il vrifiera le disque (dans 1 minute). Notez que d'autres threads peuvent tre en train d'attendre pour accder la table qui a caus le problme de disque plein. Si vous avez beaucoup de threads ``locked'', terminer le thread qui a caus la dfaillance permettra aux autres threads de continuer. Les exceptions pour le comportement suivant sont lorsque vous utilisez REPAIR ou OPTIMIZE ou lorsque les index sont crs dans un batch aprs l'excution de LOAD DATA INFILE ou d'un ALTER TABLE. Toutes les commandes prcdentes risquent d'utiliser de gros fichiers temporaires, qui pourraient perturber le reste du systme s'ils n'taient pas supprims. Si MySQL obtient une erreur de disque plein lors de l'excution d'une des commandes prcdentes, il effacera les gros fichiers temporaires et marquera la table comme corrompue ( part pour ALTER TABLE, o l'ancienne table sera restaure).
taille du pointeur de base vaut gnralement 4, mais peut crotre dans le futur pour les tables rellement grandes. Pour certaines requtes SELECT, MySQL cre aussi des tables temporaires SQL. Elles ne sont pas caches, et portent un nom du type SQL_*. ALTER TABLE cre une table temporaire dans le mme dossier que la table originale.
1123
Vous pouvez vrifier que le bit sticky est actif en excutant ls -ld /tmp. Si le dernier bit de permission est t, il l'est. Vous pouvez changer l'endroit o MySQL utilise / place le fichier de socket de la faon suivante : Spcifiez le chemin dans un fichier d'options globales ou locales. Par exemple, placez dans /etc/ my.cnf :
[client] socket=chemin-vers-fichier-socket [mysqld] socket=chemin-vers-fichier-socket
See Section 4.3.2, Fichier d'options my.cnf . Spcifiez cela en ligne de commande safe_mysqld et la plupart des clients avec l'option -socket=chemin-vers-fichier-socket. Spcifiez le chemin vers la socket dans la variable d'environnement MYSQL_UNIX_PORT. Dfinissez le chemin avec l'option de configure --with-unix-socket-path=chemin-versfichier-socket. See Section 2.4.2, Options habituelles de configure . Vous pouvez vrifier que la socket fonctionne avec cette commande :
shell> mysqladmin --socket=/chemin/vers/socket version
1124
Dans les anciennes versions de MySQL les comparaisons avec LIKE taient effectues sur la majuscule de chaque caractre (E == e mais E <> ). Dans les nouvelles versions LIKE fonctionne comme les autres oprateurs de comparaison. Si vous voulez qu'une colonne soit toujours traite de faon sensible la casse, dclarez l en tant que BINARY. See Section 13.2.5, Syntaxe de CREATE TABLE . Si vous utilisez des donnes chinoises avec l'encodage big5, vous devez rendre toutes les colonnes de chanes BINARY. Cela fonctionne car l'ordre de tri de l'encodage big5 est bas sur l'ordre des codes ASCII. Depuis MySQL 4.1, vous pouvez explicitement dclarer une colonne avec le jeu de caractres big5 :
CREATE TABLE t (name CHAR(40) CHARACTER SET big5);
MySQL convertit automatiquement une date en nombre si la date est utilise dans un contexte numrique (et vice versa). Il est aussi assez intelligent pour permettre une forme ``relaxe'' lors des mises jour et dans les clauses WHERE qui comparent une date et une colonne TIMESTAMP, DATE, ou DATETIME. (Forme relaxe signifie que n'importe quel caractre de ponctuation peut tre utilis en tant que sparateurs des parties. Par exemple, '1998-08-15' et '1998#08#15' sont quivalents.) MySQL peut convertir une chane ne contenant aucun sparateur (comme '19980815'), en supposant qu'elle a un sens pour une date. La date spciale '0000-00-00' peut tre stocke et rcupre en tant que '0000-00-00'. Lors de l'utilisation d'une date '0000-00-00' avec MyODBC, elle sera automatiquement convertie en NULL partir de la version 2.50.12 de MyODBC, car ODBC ne peut grer ce type de dates. Puisque MySQL effectue les conversions dcrites plus haut, ce qui suit fonctionnera :
mysql> mysql> mysql> mysql> mysql> mysql> mysql> mysql> mysql> mysql> INSERT INSERT INSERT INSERT INSERT INSERT SELECT SELECT SELECT SELECT INTO INTO INTO INTO INTO INTO nom_de_table nom_de_table nom_de_table nom_de_table nom_de_table nom_de_table (idate) (idate) (idate) (idate) (idate) (idate) VALUES VALUES VALUES VALUES VALUES VALUES (19970505); ('19970505'); ('97-05-05'); ('1997.05.05'); ('1997 05 05'); ('0000-00-00'); '1997-05-05'; 19970505; idate >= 19970505; '19970505';
idate FROM nom_de_table WHERE idate >= idate FROM nom_de_table WHERE idate >= MOD(idate,100) FROM nom_de_table WHERE idate FROM nom_de_table WHERE idate >=
STRCMP() est une fonction de chanes de caractres, il convertit donc idate en une chane et effectue une comparaison de chanes. Il ne convertit pas '19970505' en date et n'effectue donc pas de comparaison de dates. Notez que MySQL vrifie trs peu l'intgrit des dates. Si vous stockez une date errone, comme '1998-2-31', la date errone sera enregistre. Vu que MySQL compresse les dates pour les stocker, il ne peut stocker tout format donn car il risquerait de ne pas correspondre au tampon de rsultat. Les rgles d'acceptations de dates sont : Si MySQL peut enregistrer et rcuprer une date donne, la date errone est accepte pour les colonnes DATE et DATETIME
1125
Toutes les valeurs de ours comprises entre 0 et 31 sont acceptes. Cela est fort convenable pour les applications web o vous demandez l'anne, mois et jour dans trois champs textes (ou liste droulantes) diffrents. Le champ jour ou mois peut tre un zro. Cela est convenable si vous voulez enregistrer un anniversaire dans une colonne DATE et que vous ne connaissez qu'une partie de la date. Si la date ne peut tre convertie en une valeur raisonnable, un 0 est insr dans le champ DATE, il sera rcupr en tant que 0000-00-00. Cela est une solution rapide et convenue vu que nous considrons que la responsabilit de la base de donnes est de rcuprer la mme date que vous aviez stock (mme si la date n'est pas correcte). Nous pensons que c'est l'application de vrifier les dates, et non au serveur de le faire.
Les deux requtes insrent des valeurs dans la colonne telephone, mais la premire insre une valeur NULL et la seconde insre une chane vide. La signification de la premire peut tre ``le numro de tlphone est inconnu'' et la seconde peut tre considre comme ``elle n'a pas de tlphone''. En SQL, la valeur NULL est toujours false en comparaison n'importe quelle autre valeur, mme NULL. Une expression contenant NULL produit toujours un rsultat NULL sauf si une indication contraire est prsente dans la documentation des oprateurs et des fonctions impliques dans l'expression. Toutes les colonnes de l'exemple suivant retournent NULL :
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);
Si vous voulez trouver les colonnes dont la valeur est NULL, vous ne pouvez pas utiliser le test =NULL. La requte suivante ne retourne aucune ligne car expr = NULL est FALSE, pour n'importe quelle expression :
mysql> SELECT * FROM ma_table WHERE telephone = NULL;
Pour trouver les valeurs NULL, vous devez utiliser le test IS NULL. Ce qui suit montre comment trouver les numros de tlphone NULL et les numros vides :
mysql> SELECT * FROM ma_table WHERE telephone IS NULL; mysql> SELECT * FROM ma_table WHERE telephone = "";
Notez que vous ne pouvez ajouter d'index qu'aux colonnes pouvant avoir la valeur NULL si vous utilisez la version 3.23.2 de MySQL ou plus rcente avec des tables de type MyISAM ou InnoDB. Dans les versions prcdentes et avec les autres types, vous devez dclarer de telles colonnes NOT NULL. Cela signifie aussi que vous ne pouvez pas insrer NULL dans les colonnes indexes. Lors de la lecture de donnes avec LOAD DATA INFILE, les colonnes vides sont interprtes en tant que ''. Si vous voulez une valeur NULL dans une colonne, vous devez utiliser \N dans le fichier. Le mot littral 'NULL' peut aussi tre utilis dans certaines circonstances. See Section 13.1.5, Syntaxe de LOAD DATA INFILE . Lors de l'utilisation de ORDER BY, les valeurs NULL sont prsentes en premier. Si vous triez dans l'ordre dcroissant en utilisant DESC, les valeurs NULL sont prsentes en dernier. Lors de l'utilisation de GROUP BY, toutes les valeurs NULL sont considres comme gales. Pour mieux grer les valeurs NULL, vous pouvez utiliser les oprateurs IS NULL et IS NOT NULL et la fonction IFNULL().
1126
Lors de l'utilisation de GROUP BY, toutes les valeurs NULL sont considres comme gales. Les fonctions agrgeantes comme COUNT(), MIN() et SUM() ignorent les valeurs NULL. Exception faite de COUNT(*), qui compte les lignes et non pas les valeurs de colonnes. Par exemple, la commande suivante va donner deux comptes diffrents. Le premier est le nombre de lignes de la table, et le second est le nombre de ligne non-NULL de la colonne age :
mysql> SELECT COUNT(*), COUNT(age) FROM person;
Pour certains types de colonnes, les valeurs NULL sont traites spcialement. Si vous insrez NULL dans la premire colonne TIMESTAMP d'une table, la date et le temps courants sont insrs. Si vous insrez NULL dans une colonne AUTO_INCREMENT, le nombre suivant de la squence sera insr.
Notez que ANSI SQL ne vous permet pas de vous rfrer un alias dans une clause WHERE. Il en est ainsi car lorsque le code de WHERE est excut, la valeur de la colonne ne peut pas encore tre dtermine. Par exemple, la requte suivante est illgale :
SELECT id,COUNT(*) AS cnt FROM nom_de_table WHERE cnt > 0 GROUP BY id;
La clause WHERE est excute pour savoir quelles lignes devraient tre inclues dans la partie GROUP BY tandis que HAVING est utilis pour dcider quelles lignes du jeu de rsultats doivent tre utilises.
en essayant de faire un ROLLBACK, cela signifie que certaines tables que vous avez utilis dans la transaction ne supportent pas les transactions. Ces tables non-transactionnelles ne seront pas affectes par la commande ROLLBACK. Si vous ne mlangez pas dlibrment des tables transactionnelles et non-transactionnelles dans une transaction, la source la plus probablement de cette erreur est qu'une table que vous croyiez transactionnelle ne l'est pas. Cela peut arriver lorsque vous crez une table en utilisant un moteur de table qui n'est pas support par le serveur mysqld (ou qui a t dsactive avec une option de dmarrage). Si mysqld ne supporte pas le moteur de table, il va changer le type et utiliser MyISAM, qui n'est pas non-transactionnelle. Vous pouvez vrifier le type de table en utilisant une de ces commandes :
SHOW TABLE STATUS LIKE 'tbl_name'; SHOW CREATE TABLE tbl_name;
Voyez Section 13.5.3.16, SHOW TABLE STATUS et Section 13.5.3.5, Syntaxe de SHOW CREATE TABLE . Vous pouvez vrifier les moteurs de tables disponibles avec le serveur mysqld, avec ces commandes :
1127
SHOW ENGINES;
Avant MySQL 4.1.2, SHOW ENGINES est inaccessible. Utilisez la commande suivante et vrifiez la valeur de la variable qui est associe au moteur de tables que vous voulez :
SHOW VARIABLES LIKE 'have_%';
Par exemple, pour dterminer si le moteur InnoDB est disponible, vrifiez la valeur de la variable have_innodb. Voyez Section 13.5.3.7, Syntaxe SHOW ENGINES et Section 13.5.3.18, Syntaxe de SHOW VARIABLES .
1128
Envoyez le fichier de test, en utilisant mysqlbug, sur les listes diffusion. See Section 1.4.1.1, Les listes de diffusion de MySQL .
Le rsultat est correcte. Mme si les cinq premiers enregistrements ne devraient pas passer le test priori, ils le font srement car la diffrence entre les nombres se situe plus loin que les dcimales, ou que cela dpend de l'architecture de l'ordinateur. Le problme ne peut tre rsolu en utilisant ROUND() (ou une fonction similaire), car le rsultat est encore un nombre virgule flottante. Exemple :
mysql> SELECT i, ROUND(SUM(d1), 2) AS a, ROUND(SUM(d2), 2) AS b -> FROM t1 GROUP BY i HAVING a <> b; +------+--------+-------+ | i | a | b | +------+--------+-------+ | 1 | 21.40 | 21.40 | | 2 | 76.80 | 76.80 | | 3 | 7.40 | 7.40 | | 4 | 15.40 | 15.40 | | 5 | 7.20 | 7.20 | | 6 | -51.40 | 0.00 | +------+--------+-------+
1129
Selon l'architecture de votre ordinateur, vous pouvez obtenir ou non les mmes rsultats. Chaque CPU peut valuer les nombres virgule flottante d'une manire diffrente. Par exemple, sur des machines vous pouvez obtenir les rsultats 'correctes' en multipliant les deux arguments par 1, l'exemple suivant illustre cela. ATTENTION : NE FAITES JAMAIS CONFIANCE A CETTE METHODE DANS VOS APPLICATIONS, C'EST UN EXEMPLE DE MAUVAISE METHODES !!!
mysql> SELECT i, ROUND(SUM(d1), 2)*1 AS a, ROUND(SUM(d2), 2)*1 AS b -> FROM t1 GROUP BY i HAVING a <> b; +------+--------+------+ | i | a | b | +------+--------+------+ | 6 | -51.40 | 0.00 | +------+--------+------+
La raison pour laquelle l'exemple prcdent semble fonctionner est que sur la machine en particulier o le test a t effectu, l'arithmtique des nombres virgule flottante du CPU arrondi les nombres la mme valeur, mais il n'y a aucune rgle stipulant qu'un CPU doit faire cela, on ne peut donc pas s'y fier. La faon correcte d'effectuer des comparaisons de nombre virgule flottante est d'en premier lieu dcider du degr de tolrance voulu entre les nombres puis d'effectuer la comparaison selon le nombre de tolrance. Par exemple, si nous dcidons que les nombres virgule flottante sont considrs comme gaux si ils ont la mme prcision au dix-millime prs (0.0001), la comparaison ressemblera cela :
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1 -> GROUP BY i HAVING ABS(a - b) > 0.0001; +------+--------+------+ | i | a | b | +------+--------+------+ | 6 | -51.40 | 0.00 | +------+--------+------+ 1 row in set (0.00 sec)
Et vice versa, si vous voulez obtenir les lignes o les nombres sont les mmes, le test sera :
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1 -> GROUP BY i HAVING ABS(a - b) < 0.0001; +------+-------+-------+ | i | a | b | +------+-------+-------+ | 1 | 21.40 | 21.40 | | 2 | 76.80 | 76.80 | | 3 | 7.40 | 7.40 | | 4 | 15.40 | 15.40 | | 5 | 7.20 | 7.20 | +------+-------+-------+
EXPLAIN est prsent en dtails dans la section Section 7.2.1, Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT) .
1130
Utilisez la commande ANALYZE TABLE tbl_name pour mettre jour les distributions de cls dans la table traite. See Section 13.5.2.1, Syntaxe de ANALYZE TABLE . Utilisez l'option FORCE INDEX pour la table scanne, pour dire MySQL que les scans de tables sont trs coteux, compars aux scans d'index. See Section 13.1.7, Syntaxe de SELECT .
SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
USE INDEX et IGNORE INDEX peuvent aussi tre utiles. STRAIGHT_JOIN de niveau global ou table. See Section 13.1.7, Syntaxe de SELECT . Vous pouvez paramtrer les variables globales ou spcifiques au thread. Par exemple, lancez mysqld avec l'option --max-seeks-for-key=1000 ou utilisez SET max_seeks_for_key=1000 pour dire l'optimiseur qu'il doit supposer que les scans de cls ne reprsenteront pas plus de 1000 recherches. Voyez Section 5.2.3, Variables serveur systme .
le problme est peut-tre que MySQL a plant lors d'un prcdent appel ALTER TABLE et qu'il y a une ancienne table nomme A-quelquechose ou B-quelquechose qui subsiste. Dans ce cas, placez-vous dans le dossier de donnes MySQL et effacez tout les fichiers dont les noms commencent par A- ou B-. (Vous voudrez peut-tre les dplacer autre part plutt que de les effacer.) ALTER TABLE fonctionne de la faon suivante : Cre une nouvelle table nomme A-xxx avec les changements voulus. Toutes les lignes de l'ancienne table sont copies dans A-xxx. L'ancienne table est renomme B-xxx. A-xxx est renomme avec le nom de votre ancienne table. B-xxx est supprime. Si quelque chose se passe mal durant l'opration de changement de nom, MySQL essaye d'annuler les changements. Si quelque chose de grave se passe (cela ne devrait jamais arriver bien sr), MySQL peut laisser l'ancienne table en tant que B-xxx, mais un simple changement de nom au niveau systme devrait restaurer vos donnes.
1131
Si vous dcidez de changer l'ordre des colonnes dans une table, vous pouvez le faire comme ceci : 1. Crez une nouvelle table avec les colonnes dans le nouvel ordre. 2. Excutez cette commande :
mysql> INSERT INTO new_table -> SELECT columns-in-new-order FROM old_table;
3. Effacez ou renommez la table old_table. 4. Renommez la nouvelle table avec l'ancien nom.
mysql> ALTER TABLE new_table RENAME old_table;
SELECT * est parfait pour tester les requtes. Mais, dans une application, vous me devriez jamais utiliser SELECT * et lire les colonnes en vous basant sur l'ordre retourn par la table. L'ordre et la position des colonnes peut changer. Un simple modification de la structure de la table vous conduira une erreur.
La commande SHOW TABLES ne liste pas les tables TEMPORARY. Vous ne pouvez pas utiliser la commande RENAME pour renommer une table TEMPORARY. Cependant, vous pouvez utiliser la commande ALTER TABLE pour cela :
mysql> ALTER TABLE orig_name RENAME new_name;
1132
Annexe B. Crdits
Table des matires
B.1. B.2. B.3. B.4. B.5. B.6. B.7. B.8. Dveloppeurs chez MySQL AB ......................................................................................... Contributeurs MySQL .................................................................................................... Documenteurs et traducteurs ............................................................................................ Bibliothques utilises et incluses dans MySQL ................................................................. Applications qui supportent MySQL ................................................................................... Outils utiliss pour crer MySQL ....................................................................................... Supporters de MySQL ...................................................................................................... Les volutions de MySQL (la liste des tches) ................................................................... B.8.1. Nouvelles fonctionnalits prvues pour la version 5.0 .............................................. B.8.2. Nouvelles fonctionnalits prvues pour 5.1 ............................................................. B.8.3. Ce qui doit tre fait dans un futur proche ................................................................ B.8.4. Ce qui est prvu moyen terme ............................................................................ B.8.5. Ce qui n'est pas prvu .......................................................................................... 1133 1137 1141 1142 1143 1144 1144 1145 1145 1146 1146 1149 1150
Cet annexe liste les dveloppeurs, contributeurs, et supporters qui ont fait de MySQL est ce qu'il est aujourd'hui.
1133
Le support initial de Autoconf, Automake et Libtool. Les licences. Des parties de tous les fichiers textes (de nos jours, uniquement le README est encore prsent. le reste est dans le manuel). Nombreux tests des nouvelles fonctionnalits. Notre expert lgal des logiciels libres. Le responsable des listes de diffusion (qui n'a jamais le temps de le faire correctement...). Notre code initial pour le port (bientt plus de 10 ans). De nos jours, seules des parties de mysys restent. La personne que Monty appelle au milieu de la nuit lorsqu'il a russi a faire fonctionner la nouvelle fonctionnalit! Le chef "Open Source" (Relations avec la communaut MySQL). Jani Tolonen mysqlimport Un grand nombre d'extension pour le client en ligne de commande. PROCEDURE ANALYSE() Sinisa Milivojevic Compression du protocole client/serveur avec zlib. Hashing parfait pour la phase d'analyse lexicale. Insertions multi-lignes Option mysqldump -e LOAD DATA LOCAL INFILE Option SQL_CALC_FOUND_ROWS SELECT Option --max-user-connections=... net_read et net_write_timeout GRANT/REVOKE et SHOW GRANTS FOR Nouveau protocole client/serveur pour la version 4.0 UNION en version 4.0 Traitements multi-table de DELETE/UPDATE Tables drives en version 4.1 Gestion des ressources utilisateurs. Dveloppeur initial de l'API MySQL++ C++ API et du client MySQLGUI. Tonu Samuel (ancien dveloppeur)
1134
Interface VIO (la base pour le protocole client/serveur chiffr ). Systme de fichier MySQL (une mthode pour utiliser la base MySQL comme un systme de fichiers). L'expression CASE. Les fonctions MD5() et COALESCE(). Le support RAID des tables MyISAM. Sasha Pachev Implmentation initiale de la rplication (jusqu'en version 4.0). SHOW CREATE TABLE. mysql-bench Matt Wagner Suite de tests MySQL. Webmestre (jusqu'en 2002). Coordinateur du dveloppement. Miguel Solorzano Dveloppement Win32 et publications. Code du serveur sur Windows NT. WinMySQLAdmin Timothy Smith (ancien dveloppeur) Support des jeux de caractres dynamiques. le script configure, les RPM et d'autres parties du systme de compilation. Dveloppeur initial de libmysqld, le serveur intgr. Sergei Golubchik Recherche en texte plein. bibliothque de cls pour MERGE. Jeremy Cole Relecture et dition de ce manuel. ALTER TABLE ... ORDER BY .... UPDATE ... ORDER BY .... DELETE ... ORDER BY .... Indrek Siitan Design et programmation de notre interface web.
1135
Auteur de notre lettre d'actualit. Jorge del Conde MySQLCC (MySQL Control Center) Dveloppement Win32 Implmentation initiale des portails du site web. Venu Anuganti MyODBC 3.51 Nouveau protocole client/serveur pour la version 4.1 (pour les requtes prpares). Arjen Lentz Responsable du manuel de rfrence MySQL. Prparation de la version imprime chez O'Reilly. Alexander (Bar) Barkov, Alexey (Holyfoot) Botchkov et Ramil Kalimullin Donnes spatiales (GIS) et R-Trees en version 4.1 Unicode et jeux de caractres pour la version 4.1 Oleksandr (Sanja) Byelkin Cache de requtes en version 4.0 Implmentation des sous-requtes en version 4.1. Aleksey (Walrus) Kishkin et Alexey (Ranger) Stroganov Design des tests de performance et analyse. Maintenance de la suite de test MySQL. Zak Greant Porte parole Open Source, relation avec la communaut. Carsten Pedersen Le programme de certification MySQL. Lenz Grimmer Ingnierie de mise en production (compilation et publication). Peter Zaitsev Fonction SHA1(), AES_ENCRYPT() et AES_DECRYPT(). Dbogage et nettoyage de diverses fonctionnalits. Alexander (Salle) Keremidarski Support. Dbogage.
1136
Contributeurs MySQL
Per-Erik Martin Chef de projet pour les procdures stockes et les triggers. Jim Winstead Chef dveloppeur web. Mark Matthews Connecteur/Pilote J (Java). Peter Gulutzan Compatibilit avec les standards SQL-99, SQL-2003. Documentation des codes/algorithmes MySQL existant. Guilhem Bichot Rplication, depuis MySQL version 4.0. Correction de la gestion des exposants pour les DECIMAL. Auteur de mysql_tableinfo. Antony T. Curtis Port de MySQL sur OS/2.
1137
Contributeurs MySQL
Pour nous avoir aid acqurir http://www.mysql.com/. Fred Lindberg Pour avoir configur qmail pour qu'il gre les listes de diffusions MySQLm et pour l'aide incroyable que nous avons reu pour grer les listes de diffusions de MySQL. Igor Romanenko <igor@frog.kiev.ua> mysqldump (prcdemment appel msqldump, mais port et amlior par Monty). Yuri Dario Pour avoir suivi et amlior la version MySQL pour OS/2. Tim Bunce Auteur de mysqlhotcopy. Zarko Mocnik <zarko.mocnik@dem.si> Tri pour le slovne. "TAMITO" <tommy@valley.ne.jp> Les macros de jeu de caractres _MBm et les jeux de caractres ujis et sjis. Joshua Chamas <joshua@chamas.com> La base des insertions concurrentes, la syntaxe de date amliore, le dbogage sous NT et les rponses sur la liste de diffusion. Yves Carlier <Yves.Carlier@rug.ac.be> mysqlaccess, un programme qui affiche les droits des utilisateurs. Rhys Jones <rhys@wales.com> (et GWE Technologies Limited) Pour JDBC, un module pour extraire des donnes de bases MySQL avec un client Java. Dr Xiaokun Kelvin ZHU <X.Zhu@brad.ac.uk> Dveloppement du pilote JDBC et d'autres outils MySQL lis Java. James Cooper <pixel@organic.com> Pour la configuration d'une archive indexe des listes de diffusion sur son site. Rick Mehalick <Rick_Mehalick@i-o.com> Pour xmysql, un client graphique X pour MySQL. Doug Sisk <sisk@wix.com> Pour les paquets RPM de MySQL pour RedHat Linux. Diemand Alexander V. <axeld@vial.ethz.ch> Pour les paquets RPM de MySQL pour RedHat Linux-Alpha. Antoni Pamies Olive <toni@readysoft.es> Pour les paquets RPM de MySQL pour Intel et SPARC.
1138
Contributeurs MySQL
Jay Bloodworth <jay@pathways.sde.state.sc.us> Pour les paquets RPM de MySQL pour MySQL Version 3.21. David Sacerdote <davids@secnet.com> Ides pour la vrification scuritaire des noms d'htes. Wei-Jou Chen <jou@nematic.ieo.nctu.edu.tw> Le support des caractres chinois (BIG5). Wei He <hewei@mail.ied.ac.cn> Un grand nombre de fonctionnalits pour le jeu de caractres Chinese(GBK). Jan Pazdziora <adelton@fi.muni.cz> Ordre de tri tchque. Zeev Suraski <bourbon@netvision.net.il> Format d'heure FROM_UNIXTIME(), fonctions ENCRYPT() et conseiller bison. Membre actif des listes de diffusion. Luuk de Boer <luuk@wxs.nl> Portage et amlioration de la suite de tests avec DBI/DBD. A t d'une grande aide avec le test crash-me et l'excution des tests. Certaines amliorations de la fonction de date. Le script mysql_setpermissions. Alexis Mikhailov <root@medinf.chuvashia.su> Fonctions utilisateurs (UDF); CREATE FUNCTION et DROP FUNCTION. Andreas F. Bobak <bobak@relog.ch> L'extension AGGREGATE des fonctions UDF. Ross Wakelin <R.Wakelin@march.co.uk> Aide avec InstallShield pour MySQL-Win32. Jethro Wright III <jetman@li.net> La bibliothque libmysql.dll. James Pereria <jpereira@iafrica.com> Mysqlmanager, un outil d'administration Win32 graphique pour MySQL. Curt Sampson <cjs@portal.ca> Portage des MIT-pthreads vers NetBSD/Alpha et NetBSD 1.3/i386. Martin Ramsch <m.ramsch@computer.org> Exemples dans les tutoriels du manuel MySQL. Steve Harvey Pour la scurisation de mysqlaccess. Konark IA-64 Centre of Persistent Systems Private Limited
1139
Contributeurs MySQL
http://www.pspl.co.in/konark/. Aide avec le port Win64 du serveur MySQL. Albert Chin-A-Young. Modifications de la configuration pour Tru64, support des grands fichiers, et amlioration des gestionnaires TCP. John Birrell Emulation de pthread_mutex() pour OS/2. Benjamin Pflugmann Tables MERGE amliore pour la gestion des INSERTS. Membre actif des listes de diffusion. Jocelyn Fournier Travail excellent et report d'un grand nombre de bogues (surtout dans le code des requtes imbriques de MySQL 4.1). Marc Liyanage Maintenance des paquets Mac OS X et informations de grande valeur en ce qui concerne la cration des paquets pour Mac OS X. D'autres contributeurs, chasseurs de bugs et testeurs : James H. Thompson, Maurizio Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis, Elmar Haneke, <jehamby@lightside>, <psmith@BayNetworks.com>, <duane@connect.com.au>, Ted Deppner <ted@psyber.com>, Mike Simons, Jaakko Hyvatti. Et de nombreux autres patches et rapports issus des mailing listes : Un grand merci ceux qui aident rpondre aux questions sur la liste de diffusion de MYSQL : Daniel Koch <dkoch@amcity.com> Configuration Irix. Luuk de Boer <luuk@wxs.nl> Questions performances. Tim Sailer <tps@users.buoy.com> Questions sur DBD::mysql. Boyd Lynn Gerber <gerberb@zenez.com> Questions sur SCO. Richard Mehalick <RM186061@shellus.com> Questions sur xmysql et les questions d'installation de base. Zeev Suraski <bourbon@netvision.net.il> Configuration du module Apache (log & identification), MySQL et PHP, syntaxe SQL et autres questions. Francesc Guasch <frankie@citel.upc.es> Questions gnrales. Jonathan J Smith <jsmith@wtp.net>
1140
Documenteurs et traducteurs
Questions spcifiques aux OS comme Linux, syntaxe SQL et autres sujets intressants. David Sklar <sklar@student.net> Utilisation de MySQL avec PHP et Perl. Alistair MacDonald <A.MacDonald@uel.ac.uk> Pas encore spcifi mais gnraliste : Linux et un peu HP-UX. Pousse les utilisateurs utiliser mysqlbug. John Lyon <jlyon@imag.net> Questions sur l'installation de MySQL sur le systme Linux, avec soit les fichiers .rpm ou en compilant depuis la source. Lorvid Ltd. <lorvid@WOLFENET.com> Questions sur la facturation, les licences, le support et le copyright de MySQL. Patrick Sherrill <patrick@coconet.com> Questions sur les interfaces ODBC et VisualC++. Randy Harmon <rjharmon@uptimecomputers.com> DBD, Linux, et quelques questions SQL.
1141
Petr Snajdr, <snajdr@pvt.net> Messages d'erreurs en tchque. Jaroslaw Lewandowski <jotel@itnet.com.pl> Messages d'erreurs en polonais. Miguel Angel Fernandez Roiz Messages d'erreurs en espagnol. Roy-Magne Mo <rmo@www.hivolda.no> Messages d'erreurs en norvgien et test de la version 3.21.#. Timur I. Bakeyev <root@timur.tatarstan.ru> Messages d'erreurs en russe. <brenno@dewinter.com> & Filippo Grassilli <phil@hyppo.com> Messages d'erreurs en italien. Dirk Munzinger <dirk@trinity.saar.de> Messages d'erreurs en allemand. Billik Stefan <billik@sun.uniag.sk> Messages d'erreurs en slovaque. Stefan Saroiu <tzoompy@cs.washington.edu> Messages d'erreurs en roumain. Peter Feher Messages d'erreurs en hongrois. Roberto M. Serqueira Messages d'erreurs en portugais. Carsten H. Pedersen Messages d'erreurs en danois. Arjen G. Lentz Messages d'erreurs en hollandais, et fin de la traduction partielle.
1142
Pour la bibliothque de gestion des chanes de caractres, disponible dans le domaine public. Henry Spencer Pour sa bibliothque d'expressions rgulires, utilise dans WHERE column REGEXP regexp. Chris Provenzano Pthreads utilisateurs. Dans le copyright : This product includes software developed by Chris Provenzano, the University of California, Berkeley, and contributors. Nous utilisons la version 1_60_beta6, modifie par Monty (voir mit-pthreads/ Changes-mysql). Jean-loup Gailly et Mark Adler Pour la bibliothque zlib (utilise avec MySQL sous Windows). Bjorn Benson Pour son paquet safe_malloc (contrle de mmoire), qui est utilis lorsque vous configurez MySQL avec --debug. Free Software Foundation La bibliothque readline (utilise par le client mysql). La fondation NetBSD Le paquet libedit (utilis optionnellement par le client mysql).
1143
1144
1145
Rsolution du problme avec RENAME TABLE, utilis sur une table active dans un MERGE, qui conduit la corruption de la table. Le manuel inclut le changelog de la version, avec plus de dtails sur les nouvelles fonctionnalits. See Section C.1, Changements de la version 5.0.0 (Dveloppement) .
1146
Changer le moment de modifications des variables, pour que l'on puisse les utiliser avec les commandes de groupement GROUP BY, comme ceci : SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM table_name GROUP BY id. Ajout de l'option IMAGE la commande LOAD DATA INFILE pour ne pas modifier les champs TIMESTAMP et AUTO_INCREMENT. Ajout de la syntaxe LOAD DATE INFILE ... UPDATE, qui fonctionne comme ceci : Pour les tables ayant des cls primaires, si les donnes contiennent une cl primaire, les donnes qui existent et correspondent cette cl, sont modifies. Cependant, les colonnes omises sont ignores. Pour les tables ayant une cl primaire dont il manque une partie dans les donnes entrantes, ou qui n'ont pas de cl primaire, le flux est trait comme LOAD DATA INFILE ... REPLACE INTO. Rendre la syntaxe LOAD DATA INFILE utilisable comme ceci :
LOAD DATA INFILE 'file_name.txt' 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
Cela peut tre utilis pour ignorer des colonnes supplmentaires dans le fichier texte, ou pour modifier des colonnes en fonction de donnes dans les valeurs entrantes. De nouvelles fonctions pour travailler avec le type de colonne SET : ADD_TO_SET(value,set) REMOVE_FROM_SET(value,set) Si vous interrompez mysql au beau milieu d'une requte, vous pouvez ouvrir une autre connexion pour tuer la requte en cours. Ou bien, une tentative doit tre faite pour dtecter cela sur le serveur. Ajout d'une interface au moteur de sauvegarde pour que vous puissiez l'utiliser comme table systme. Cela sera un peu lent si vous demandez toutes les informations de toutes les tables, mais trs souple. SHOW INFO FROM tbl_name doit tre implment pour connatre les informations de bases des tables. Permettre SELECT a FROM crash_me LEFT JOIN crash_me2 USING (a); dans ce cas, a est suppos provenir de la table crash_me. Les options DELETE et REPLACE dans les commandes UPDATE (cela va effacer les lignes lors d'un doublon dans la requte). Modification du format de DATETIME pour stocker les fractions de secondes. Rendre possible l'utilisation de la bibliothque GNU regexp au lieu de la bibliothque actuelle (la bibliothque GNU devrait tre plus rapide que l'ancienne). Compatibilit avec les standards, migration et portabilit. Ne pas utiliser de valeur par dfaut (DEFAULT) pour les colonnes. Indiquer une erreur lors des commandes INSERT, si elle contient une colonne qui n'a pas de valeur par dfaut. Ajout des fonctions de groupement ANY(), EVERY() et SOME(). En ANSI SQL, elles ne fonctionnent que sur les colonnes de type boolens, mais nous pouvons tendre leur champ
1147
d'action aux colonnes et expression, en appliquant la rgle suivante : value == 0 -> FALSE et value <> 0 -> TRUE. Correction du type pour que MAX(column) ait le mme type de colonne :
mysql> mysql> mysql> mysql> CREATE TABLE t1 (a DATE); INSERT INTO t1 VALUES (NOW()); CREATE TABLE t2 SELECT MAX(a) FROM t1; SHOW COLUMNS FROM t2;
Amlioration des performances Ne permettre qu' un nombre dfini de threads d'excuter des rparations MyISAM simultanment. Changer INSERT ... SELECT pour utiliser optionnellement des insertions simultanes. Ajouter une option pour crire sur le disque les pages de cls pour les tables cls retardes, qui n'ont pas t sauves dernirement. Permettre les jointures sur des parties de cls (problme d'optimisation). Un analyseur de logs, qui permettrait d'extraire des informations sur les tables les plus souvent utilises, les jointures, etc... Cela permettra aux utilisateurs d'identifier les tables qui peuvent tre optimises. Internationalisation Ergonomie Retourner le type de champs original lors des requtes SELECT MIN(column) ... GROUP BY. Rendre possible la spcification de long_query_time avec une granularit de l'ordre de la microseconde. Intgrer le code de myisampack dans le serveur, activer les commandes PACK or COMPRESS depuis le serveur. Ajouter un cache de buffer de cl temporaire durant les commandes INSERT/DELETE/UPDATE pour que nous puissions nous rtablir si jamais le fichier d'index est plein. Si vous effectuez la commande ALTER TABLE sur une table qui est un lien symbolique sur un autre disque, les tables temporaires seront aussi faites sur ce disque. Implmenter un type DATE/DATETIME qui gre les fuseaux horaire correctement, pour rsoudre le problme du dcalage horaire. Corriger la configuration pour que l'on puisse compiler toute les bibliothques (comme MyISAM) sans les threads. Permettre toutes les variables SQL dans la clause LIMIT, comme LIMIT @a,@b. Affichage automatique de mysql vers un navigateur web. LOCK DATABASES (avec diffrentes options). De nombreuses nouvelles variables dans SHOW STATUS. Les lignes lues et modifies. Les slections sur tables uniques et les jointures. Le nombre moyen de tables dans une slection. Le nombre de requtes ORDER BY et GROUP BY. mysqladmin copy database new-database; a besoin de la commande COPY dans mysqld. La liste des processus doit afficher le nombre de requtes et de threads.
1148
SHOW HOSTS affichera les informations concernant le cache de noms d'htes. Changer le nom des tables de chane vide NULL pour les colonnes calcules. Ne pas utiliser la fonction Item_copy_string sur les valeurs numriques, pour viter les conversions nombre -> chane -> nombre en cas de : SELECT COUNT(*)*(id+0) FROM table_name GROUP BY id Changer ALTER TABLE pour qu'il n'interrompe pas le client qui excute des INSERT DELAYED. Lorsque les colonnes sont spcifies dans UPDATE, elles contiennent les anciennes valeurs d'avant la modification. Nouveaux systmes d'exploitation. Port des clients MySQL vers LynxOS.
1149
Alertes lors des connexions/critures/lectures du client. Notez ces modifications de safe_mysqld : selon la FSSTND (que Debian essaie de suivre) les fichiers PID devraient tre placs dans /var/run/<progname>.pid et les fichiers de logs dans / var/log. Il serait bien si vous pouviez mettre le "DATADIR" dans la premire dclaration de "pidfile" et "log", de faon 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 rsolu). Utiliser des smaphores pour compter les threads. Il faut commencer par implmenter des smaphores pour MIT-pthreads. Ajouter le support complet pour les JOIN avec parenthses. Comme alternative la relation un thread, une connexion, grer un groupe de threads pour rpondre aux requtes. Permettre la pose de plusieurs verrous avec GET_LOCK. Lors de ces verrous multiples, grer le cas des blocages par verrous qui pourrait tre introduit. Le temps est indiqu en temps de travail et non pas en temps normal.
1150
1151
C.4.3. Changements de la version 3.23.57 (06 juin 2003) .................................................. C.4.4. Changements de la version 3.23.56 (13 mars 2003) ............................................... C.4.5. Changements de la version 3.23.55 (23 janvier 2003) ............................................. C.4.6. Changements de la version 3.23.54 (05 dcembre 2002) ........................................ C.4.7. Changements de la version 3.23.53 (09 octobre 2002) ............................................ C.4.8. Changements de la version 3.23.52 (14 aot 2002) ................................................ C.4.9. Changements de la version 3.23.51 (31 mai 2002) ................................................. C.4.10. Changements de la version 3.23.50 (21 avril 2002) ............................................... C.4.11. Changements de la version 3.23.49 ..................................................................... C.4.12. Changements de la version 3.23.48 (07 fvrier 2002) ............................................ C.4.13. Changements de la version 3.23.47 (27 dcembre 2001) ...................................... C.4.14. Changements de la version 3.23.46 (29 novembre 2001) ...................................... C.4.15. Changements de la version 3.23.45 (22 novembre 2001) ...................................... C.4.16. Changements de la version 3.23.44 (31 octobre 2001) .......................................... C.4.17. Changements de la version 3.23.43 (04 octobre 2001) .......................................... C.4.18. Changements de la version 3.23.42 (08 septembre 2001) ...................................... C.4.19. Changements de la version 3.23.41 (11 aot 2001) ............................................... C.4.20. Changements de la version 3.23.40 ..................................................................... C.4.21. Changements de la version 3.23.39 (12 juin 2001) ................................................ C.4.22. Changements de la version 3.23.38 (09 mai 2001) ................................................ C.4.23. Changements de la version 3.23.37 (17 avril 2001) ............................................... C.4.24. Changements de la version 3.23.36 (27 mars 2001) .............................................. C.4.25. Changements de la version 3.23.35 (15 mars 2001) .............................................. C.4.26. Changements de la version 3.23.34a ................................................................... C.4.27. Changements de la version 3.23.34 (10 mars 2001) .............................................. C.4.28. Changements de la version 3.23.33 (09 fvrier 2001) ............................................ C.4.29. Changements de la version 3.23.32 (22 Jan 2001: Production) .............................. C.4.30. Changements de la version 3.23.31 (17 janvier 2001) ........................................... C.4.31. Changements de la version 3.23.30 (04 janvier 2001) ........................................... C.4.32. Changements de la version 3.23.29 (16 dcembre 2000) ...................................... C.4.33. Changements de la version 3.23.28 (22 Nov 2000: Gamma) .................................. C.4.34. Changements de la version 3.23.27 (24 octobre 2000) .......................................... C.4.35. Changements de la version 3.23.26 (18 octobre 2000) .......................................... C.4.36. Changements de la version 3.23.25 (29 septembre 2000) ...................................... C.4.37. Changements de la version 3.23.24 (08 septembre 2000) ...................................... C.4.38. Changements de la version 3.23.23 (01 septembre 2000) ...................................... C.4.39. Changements de la version 3.23.22 (31 juillet 2000) ............................................. C.4.40. Changements de la version 3.23.21 ..................................................................... C.4.41. Changements de la version 3.23.20 ..................................................................... C.4.42. Changements de la version 3.23.19 ..................................................................... C.4.43. Changements de la version 3.23.18 ..................................................................... C.4.44. Changements de la version 3.23.17 ..................................................................... C.4.45. Changements de la version 3.23.16 ..................................................................... C.4.46. Changements de la version 3.23.15 (May 2000: Beta) ........................................... C.4.47. Changements de la version 3.23.14 ..................................................................... C.4.48. Changements de la version 3.23.13 ..................................................................... C.4.49. Changements de la version 3.23.12 (07 mars 2000) .............................................. C.4.50. Changements de la version 3.23.11 ..................................................................... C.4.51. Changements de la version 3.23.10 ..................................................................... C.4.52. Changements de la version 3.23.9 ....................................................................... C.4.53. Changements de la version 3.23.8 (02 janvier 2000) ............................................. C.4.54. Changements de la version 3.23.7 (10 dcembre 1999) ........................................ C.4.55. Changements de la version 3.23.6 ....................................................................... C.4.56. Changements de la version 3.23.5 (20 octobre 1999) ............................................ C.4.57. Changements de la version 3.23.4 (28 septembre 1999) ....................................... C.4.58. Changements de la version 3.23.3 ....................................................................... C.4.59. Changements de la version 3.23.2 (09 aot 1999) ................................................ C.4.60. Changements de la version 3.23.1 .......................................................................
1254 1255 1256 1257 1258 1258 1259 1260 1261 1261 1262 1262 1262 1263 1264 1264 1265 1266 1266 1267 1268 1268 1269 1269 1269 1270 1271 1272 1273 1273 1275 1277 1277 1278 1279 1279 1281 1281 1282 1282 1282 1282 1283 1284 1285 1285 1286 1286 1287 1287 1288 1288 1289 1290 1291 1291 1292 1292
1152
C.4.61. Changements de la version 3.23.0 (05 Aug 1999: Alpha) ....................................... C.5. Changements de la version 3.22.x (Old; discontinued) ....................................................... C.5.1. Changements de la version 3.22.35 ....................................................................... C.5.2. Changements de la version 3.22.34 ....................................................................... C.5.3. Changements de la version 3.22.33 ....................................................................... C.5.4. Changements de la version 3.22.32 (14 fvrier 2000) .............................................. C.5.5. Changements de la version 3.22.31 ....................................................................... C.5.6. Changements de la version 3.22.30 ....................................................................... C.5.7. Changements de la version 3.22.29 (02 janvier 2000) ............................................. C.5.8. Changements de la version 3.22.28 (20 octobre 1999) ............................................ C.5.9. Changements de la version 3.22.27 ....................................................................... C.5.10. Changements de la version 3.22.26 (16 septembre 1999) ...................................... C.5.11. Changements de la version 3.22.25 ..................................................................... C.5.12. Changements de la version 3.22.24 (05 juillet 1999) ............................................. C.5.13. Changements de la version 3.22.23 (08 juin 1999) ................................................ C.5.14. Changements de la version 3.22.22 (30 avril 1999) ............................................... C.5.15. Changements de la version 3.22.21 ..................................................................... C.5.16. Changements de la version 3.22.20 (18 mars 1999) .............................................. C.5.17. Changements de la version 3.22.19 (Mar 1999: Production) .................................. C.5.18. Changements de la version 3.22.18 ..................................................................... C.5.19. Changements de la version 3.22.17 ..................................................................... C.5.20. Changements de la version 3.22.16 (Feb 1999: Gamma) ...................................... C.5.21. Changements de la version 3.22.15 ..................................................................... C.5.22. Changements de la version 3.22.14 ..................................................................... C.5.23. Changements de la version 3.22.13 ..................................................................... C.5.24. Changements de la version 3.22.12 ..................................................................... C.5.25. Changements de la version 3.22.11 ..................................................................... C.5.26. Changements de la version 3.22.10 ..................................................................... C.5.27. Changements de la version 3.22.9 ....................................................................... C.5.28. Changements de la version 3.22.8 ....................................................................... C.5.29. Changements de la version 3.22.7 (Sep 1998: Beta) ............................................. C.5.30. Changements de la version 3.22.6 ....................................................................... C.5.31. Changements de la version 3.22.5 ....................................................................... C.5.32. Changements de la version 3.22.4 ....................................................................... C.5.33. Changements de la version 3.22.3 ....................................................................... C.5.34. Changements de la version 3.22.2 ....................................................................... C.5.35. Changements de la version 3.22.1 (Jun 1998: Alpha) ............................................ C.5.36. Changements de la version 3.22.0 ....................................................................... C.6. Changements de la version 3.21.x .................................................................................... C.6.1. Changements de la version 3.21.33 ....................................................................... C.6.2. Changements de la version 3.21.32 ....................................................................... C.6.3. Changements de la version 3.21.31 ....................................................................... C.6.4. Changements de la version 3.21.30 ....................................................................... C.6.5. Changements de la version 3.21.29 ....................................................................... C.6.6. Changements de la version 3.21.28 ....................................................................... C.6.7. Changements de la version 3.21.27 ....................................................................... C.6.8. Changements de la version 3.21.26 ....................................................................... C.6.9. Changements de la version 3.21.25 ....................................................................... C.6.10. Changements de la version 3.21.24 ..................................................................... C.6.11. Changements de la version 3.21.23 ..................................................................... C.6.12. Changements de la version 3.21.22 ..................................................................... C.6.13. Changements de la version 3.21.21a ................................................................... C.6.14. Changements de la version 3.21.21 ..................................................................... C.6.15. Changements de la version 3.21.20 ..................................................................... C.6.16. Changements de la version 3.21.19 ..................................................................... C.6.17. Changements de la version 3.21.18 ..................................................................... C.6.18. Changements de la version 3.21.17 ..................................................................... C.6.19. Changements de la version 3.21.16 .....................................................................
1293 1295 1295 1295 1295 1295 1295 1295 1296 1296 1296 1296 1297 1297 1297 1297 1297 1298 1298 1298 1298 1298 1299 1299 1299 1299 1300 1300 1301 1302 1302 1303 1303 1304 1305 1305 1305 1306 1307 1307 1308 1308 1308 1309 1309 1309 1309 1310 1310 1310 1311 1311 1311 1312 1312 1312 1312 1313
1153
C.6.20. Changements de la version 3.21.15 ..................................................................... C.6.21. Changements de la version 3.21.14b ................................................................... C.6.22. Changements de la version 3.21.14a ................................................................... C.6.23. Changements de la version 3.21.13 ..................................................................... C.6.24. Changements de la version 3.21.12 ..................................................................... C.6.25. Changements de la version 3.21.11 ..................................................................... C.6.26. Changements de la version 3.21.10 ..................................................................... C.6.27. Changements de la version 3.21.9 ....................................................................... C.6.28. Changements de la version 3.21.8 ....................................................................... C.6.29. Changements de la version 3.21.7 ....................................................................... C.6.30. Changements de la version 3.21.6 ....................................................................... C.6.31. Changements de la version 3.21.5 ....................................................................... C.6.32. Changements de la version 3.21.4 ....................................................................... C.6.33. Changements de la version 3.21.3 ....................................................................... C.6.34. Changements de la version 3.21.2 ....................................................................... C.6.35. Changements de la version 3.21.0 ....................................................................... C.7. Changements de la version 3.20.x .................................................................................... C.7.1. Changements de la version 3.20.18 ....................................................................... C.7.2. Changements de la version 3.20.17 ....................................................................... C.7.3. Changements de la version 3.20.16 ....................................................................... C.7.4. Changements de la version 3.20.15 ....................................................................... C.7.5. Changements de la version 3.20.14 ....................................................................... C.7.6. Changements de la version 3.20.13 ....................................................................... C.7.7. Changements de la version 3.20.11 ....................................................................... C.7.8. Changements de la version 3.20.10 ....................................................................... C.7.9. Changements de la version 3.20.9 ......................................................................... C.7.10. Changements de la version 3.20.8 ....................................................................... C.7.11. Changements de la version 3.20.7 ....................................................................... C.7.12. Changements de la version 3.20.6 ....................................................................... C.7.13. Changements de la version 3.20.3 ....................................................................... C.7.14. Changements de la version 3.20.0 ....................................................................... C.8. Changements de la version 3.19.x .................................................................................... C.8.1. Changements de la version 3.19.5 ......................................................................... C.8.2. Changements de la version 3.19.4 ......................................................................... C.8.3. Changements de la version 3.19.3 ......................................................................... C.9. Evolutions de InnoDB ....................................................................................................... C.9.1. MySQL/InnoDB-4.0.21, pas publie ........................................................................ C.9.2. MySQL/InnoDB-4.1.4, 31 Aot 2004 ....................................................................... C.9.3. MySQL/InnoDB-4.1.3, 28 Juin 2004 ....................................................................... C.9.4. MySQL/InnoDB-4.1.2, pas publie .......................................................................... C.9.5. MySQL/InnoDB-4.0.20, 18 mai 2004 ...................................................................... C.9.6. MySQL/InnoDB-4.0.19, 4 mai 2004 ........................................................................ C.9.7. MySQL/InnoDB-4.0.18, 13 fvrier 2004 .................................................................. C.9.8. MySQL/InnoDB-5.0.0, 24 dcembre 2003 ............................................................... C.9.9. MySQL/InnoDB-4.0.17, 17 dcembre 2003 ............................................................. C.9.10. MySQL/InnoDB-4.1.1, 4 dcembre 2003 ............................................................... C.9.11. MySQL/InnoDB-4.0.16, 22 octobre 2003 ............................................................... C.9.12. MySQL/InnoDB-3.23.58, 15 septembre 2003 ........................................................ C.9.13. MySQL/InnoDB-4.0.15, 10 septembre 2003 .......................................................... C.9.14. MySQL/InnoDB-4.0.14, 22 juillet 2003 .................................................................. C.9.15. MySQL/InnoDB-3.23.57, 20 juin 2003 ................................................................... C.9.16. MySQL/InnoDB-4.0.13, 20 mai 2003 .................................................................... C.9.17. MySQL/InnoDB-4.1.0, 3 avril 2003 ....................................................................... C.9.18. MySQL/InnoDB-3.23.56, 17 mars 2003 ................................................................. C.9.19. MySQL/InnoDB-4.0.12, 18 mars 2003 .................................................................. C.9.20. MySQL/InnoDB-4.0.11, 25 fvrier 2003 ................................................................. C.9.21. MySQL/InnoDB-4.0.10, 4 fvrier 2003 .................................................................. C.9.22. MySQL/InnoDB-3.23.55, 24 janvier 2003 ..............................................................
1313 1314 1314 1314 1315 1316 1316 1316 1316 1317 1317 1317 1318 1318 1319 1319 1320 1320 1321 1322 1322 1322 1323 1323 1324 1324 1324 1324 1325 1326 1326 1327 1327 1327 1328 1328 1328 1328 1329 1330 1330 1331 1331 1332 1332 1333 1333 1333 1333 1334 1335 1335 1336 1336 1336 1337 1337 1337
1154
C.9.23. MySQL/InnoDB-4.0.9, 14 janvier 2003 .................................................................. C.9.24. MySQL/InnoDB-4.0.8, 7 janvier 2003 .................................................................... C.9.25. MySQL/InnoDB-4.0.7, 26 dcembre 2002 ............................................................. C.9.26. MySQL/InnoDB-4.0.6, 19 dcembre 2002 ............................................................. C.9.27. MySQL/InnoDB-3.23.54, 12 d#cembre 2003 ......................................................... C.9.28. MySQL/InnoDB-4.0.5, 18 novembre 2002 ............................................................. C.9.29. MySQL/InnoDB-3.23.53, 9 octobre 2002 ............................................................... C.9.30. MySQL/InnoDB-4.0.4, 2 octobre 2002 .................................................................. C.9.31. MySQL/InnoDB-4.0.3, 28 aot 2002 ..................................................................... C.9.32. MySQL/InnoDB-3.23.52, 16 aot 2002 ................................................................. C.9.33. MySQL/InnoDB-4.0.2, 10 juillet 2002 .................................................................... C.9.34. MySQL/InnoDB-3.23.51, 12 juin 2002 ................................................................... C.9.35. MySQL/InnoDB-3.23.50, 23 avril 2002 .................................................................. C.9.36. MySQL/InnoDB-3.23.49, 17 fvrier 2002 ............................................................... C.9.37. MySQL/InnoDB-3.23.48, 9 fvrier 2002 ................................................................. C.9.38. MySQL/InnoDB-3.23.47, 28 dcembre 2001 ......................................................... C.9.39. MySQL/InnoDB-4.0.1, 3 dcembre 2001 ............................................................... C.9.40. MySQL/InnoDB-3.23.46, 30 novembre 2001 ......................................................... C.9.41. MySQL/InnoDB-3.23.45, 23 novembre 2001 ......................................................... C.9.42. MySQL/InnoDB-3.23.44, 2 novembre 2001 ........................................................... C.9.43. MySQL/InnoDB-3.23.43, 4 octobre 2001 ............................................................... C.9.44. MySQL/InnoDB-3.23.42, 9 septembre 2001 .......................................................... C.9.45. MySQL/InnoDB-3.23.41, 13 aot 2001 ................................................................. C.9.46. MySQL/InnoDB-3.23.40, 16 juillet 2001 ................................................................ C.9.47. MySQL/InnoDB-3.23.39, 13 juin 2001 ................................................................... C.9.48. MySQL/InnoDB-3.23.38, 12 mai 2001 ................................................................... C.10. Historique de MySQL Cluster ...................................................................................... C.10.1. MySQL Cluster-4.1.11 (01 Apr 2005) .................................................................... C.10.2. MySQL Cluster-4.1.10 (12 Feb 2005) ................................................................... C.10.3. MySQL Cluster-4.1.9 (13 Jan 2005) ..................................................................... C.10.4. MySQL Cluster-4.1.8 (14 Dec 2004) ..................................................................... C.10.5. MySQL Cluster-4.1.7, (23 Octobre 2004) .............................................................. C.10.6. MySQL Cluster-4.1.6, 10 octobre 2004 ................................................................. C.10.7. MySQL Cluster-4.1.5, 16 septembre 2004 ............................................................ C.10.8. MySQL Cluster-4.1.4, 31 aot 2004 ..................................................................... C.10.9. MySQL Cluster-5.0.1, 27 juillet 2004 .................................................................... C.10.10. MySQL Cluster-4.1.3, 28 juin 2004 ..................................................................... C.11. Historique de MyODBC .................................................................................................... C.11.1. Changes in MyODBC 3.51.12 .............................................................................. C.11.2. Changes in MyODBC 3.51.11 .............................................................................. Cet appendice liste les changements de version version dans le code source de MySQL.
1338 1338 1338 1338 1339 1339 1340 1340 1341 1341 1343 1343 1343 1344 1344 1345 1345 1345 1345 1346 1347 1347 1347 1347 1347 1347 1347 1347 1348 1348 1349 1351 1351 1352 1353 1353 1354 1354 1354 1354
Nous travaillons maintenant activement sur MySQL 4.1 et 5.0 et ne fournirons que les correctifs pour les bogues critiques de MySQL 3.23 et 4.0. Nous mettons jour cette section lorsque nous ajoutons de nouvelles fonctionnalits pour que tout le monde puisse suivre le cours du dveloppement. Notre section TODO contient ce que nous planifions pour les versions 4.x. See Section B.8, Les volutions de MySQL (la liste des tches) . Notez que nous essayons de mettre jour le manuel en mme temps que nous apportons des changements MySQL. Si vous trouvez une version mentionne ici que vous ne pouvez retrouver dans la page des tlchargements MySQL (http://www.mysql.com/downloads/), cela signifie que la version n'a pas encore t publie ! La date mentionne avec la version est la date de dernire modification dans le serveur BitKeeper, sur laquelle la version a t btie. Les excutables sont gnralement disponibles aprs quelques jours, car il faut du temps pour compiler et tester tous les paquets.
1155
1156
disabled); if set to 2, then when the MySQL server shuts down, InnoDB will just flush its logs and then shut down brutally (and quickly) as if it was a MySQL crash; no committed transaction will be lost, but a crash recovery will be done at next startup. Bogues corrigs : Security fix : If mysqld was started with --user=non_existent_user, it would run using the privileges of the account it was invoked from, even if that was root. (Bug #9833) Multiple-table updates could produce spurious data-truncation warnings if they used a join across columns that are indexed using a column prefix. (Bug #9103) Fixed a string-length comparison problem that caused mysql to fail loading dump files containing certain \-sequences. (Bug #9756) Fixed a failure to resolve a column reference properly when an outer join involving a view contained a subquery and the column was used in the subquery and the outer query. (Bug #6106, Bug #6107) Use of a subquery that used WITH ROLLUP in the FROM clause of the main query sometimes resulted in a Column cannot be null error. (Bug #9681) Fixed a memory leak that occurred when selecting from a view that contained a subquery. (Bug #10107) Fixed an optimizer bug in computing the union of two ranges for the OR operator. (Bug #9348) Fixed a segmentation fault in mysqlcheck that occurred when the last table checked in --autorepair mode returned an error (such as the table being a MERGE table). (Bug #9492) Incorrect results were returned for queries of the form SELECT ... LEFT JOIN ... WHERE EXISTS (subquery), where the subquery selected rows based on an IS NULL condition. (Bug #9516) Executing LOCK TABLES and then calling a stored procedure caused an error and resulting in the server thinking that no stored procedures exist. (Bug #9566) Selecting from a view containing a subquery caused the server to hang. (Bug #8490) Attempting to execute a multiple-table UPDATE within a stored procedure failed with a Table 'tbl_name' was locked with a READ lock and can't be updated error. (Bug #9486) Starting mysqld with the --skip-innodb and --default-storage-engine=innodb (or -default-table-type=innodb caused a server crash. (Bug #9815) Queries containing CURRENT_USER() incorrectly were registered in the query cache. (Bug #9796) Setting the storage_engine system variable to MEMORY succeeded, but retrieving the variable resulted in a value of HEAP (the old name for the MEMORY storage engine) rather than MEMORY. (Bug #10039) mysqlshow displayed an incorrect row count for tables. (Bug #9391) The server died with signal 11 if a non-existent location was specified for the location of the binary log. Now the server exits after printing an appropriate error messsage. (Bug #9542) Fixed a problem in the client/server protocol where the server closed the connection before sending the final error message. The problem could show up as a Lost connection to MySQL server during query when attempting to connect to access a non-existent database. (Bug #6387, Bug #9455) Fixed a readline-related crash in mysql when the user pressed Control-R. (Bug #9568) For stored functions that should return a YEAR value, corrected a failure of the value to be in YEAR format. (Bug #8861)
1157
Fixed a server crash resulting from invocation of a stored function that returned a value having an ENUM or SET data type. (Bug #9775) Fixed a server crash resulting from invocation of a stored function that returned a value having a BLOB data type. (Bug #9102) Fixed a server crash resulting from invocation of a stored function that returned a value having a BIT data type. (Bug #7648) TIMEDIFF() with a negative time first argument and positive time second argument produced incorrect results. (Bug #8068) Fixed a problem with OPTIMIZE TABLE for InnoDB tables being written twice to the binary log. (Bug #9149) InnoDB : Prevent ALTER TABLE from changing the storage engine if there are foreign key constraints on the table. (Bug #5574, Bug #5670) InnoDB : Fixed a bug where next-key locking doesn't allow the insert which does not produce a phantom. (Bug #9354) If the range is of type 'a' <= uniquecolumn, InnoDB lock only the RECORD, if the record with the column value 'a' exists in a CLUSTERED index. This allows inserts before a range. InnoDB : When FOREIGN_KEY_CHECKS=0, ALTER TABLE and RENAME TABLE will ignore any type incompatibilities between referencing and referenced columns. Thus, it will be possible to convert the character sets of columns that participate in a foreign key. Be sure to convert all tables before modifying any data! (Bug #9802) Provide more informative error messages in clustered setting when a query is issued against a table that has been modified by another mysqld server. (Bug #6762)
1158
Fixed an optimizer problem where extraneous comparisons between NULL values in indexed columns were being done for operators such as = that are never true for NULL. (Bug #8877) Fixed the client/server protocol for prepared statements so that reconnection works properly when the connection is killed while reconnect is enabled. (Bug #8866) A server installed as a Windows service and started with --shared-memory could not be stopped. (Bug #9665) Fixed a server crash resulting from multiple executions of a prepared statement involving a join of an INFORMATION_SCHEMA table with another table. (Bug #9383) Fixed utf8_spanish2_ci and ucs2_spanish2_ci collations to not consider r equal to rr. If you upgrade to this version from an earlier version, you should rebuild the indexes of affected tables. (Bug #9269) mysqldump dumped core when invoked with --tmp and --single-transaction options and a non-existent table name. (Bug #9175) Allow extra HKSCS and cp950 characters (big5 extension characters) to be accepted in big5 columns. (Bug #9357) mysql.server no longer uses non-portable alias command or LSB functions. (Bug #9852) Fixed a server crash resulting from GROUP BY on a decimal expression. (Bug #9210) In prepared statements, subqueries containing parameters were erroneously treated as const tables during preparation, resulting in a server crash. (Bug #8807) InnoDB : ENUM and SET columns were treated incorrectly as character strings. This bug did not manifest itself with latin1 collations if there were less than about 100 elements in an ENUM, but it caused malfunction with UTF-8. Old tables will continue to work. In new tables, ENUM and SET will be internally stored as unsigned integers. (Bug #9526) InnoDB : Avoid test suite failures caused by a locking conflict between two server instances at server shutdown/startup. This conflict on advisory locks appears to be the result of a bug in the operating system; these locks should be released when the files are closed, but somehow that does not always happen immediately in Linux. (Bug #9381) InnoDB : True VARCHAR : InnoDB stored the 'position' of a row wrong in a column prefix primary key index; this could cause MySQL to complain ERROR 1032: Can't find record in an update of the primary key, and also some ORDER BY or DISTINCT queries. (Bug #9314) InnoDB : Fix bug in MySQL/InnoDB 5.0.3 : SQL statements were not rolled back on error. (Bug #8650) Fixed a Commands out of sync error when two prepared statements for single-row result sets were open simultaneously. (Bug #8880) Fixed a server crash after a call to mysql_stmt_close() for single-row result set. (Bug #9159) Fixed server crashes for CREATE TABLE ... SELECT or INSERT INTO ... SELECT when selecting from multiple-table view. (Bug #8703, Bug #9398) TRADITIONAL SQL mode should prevent inserts where a column with no default value is omitted or set to a value of DEFAULT. Fixed cases where this restriction was not enforced. (Bug #5986) Fixed a server crash when creating a PRIMARY KEY for a table, if the table contained a BIT column. (Bug #9571) Warning message from GROUP_CONCAT() did not always indicate correct number of lines. (Bug #8681)
1159
The commit count cache for NDB was not properly invalidated when deleting a record using a cursor. (Bug #8585) Fixed option-parsing code for the embedded server to understand K, M, and G suffixes for the net_buffer_length and max_allowed_packet options. (Bug #9472) Selecting a BIT column failed if the binary client/server protocol was used. (Bug #9608) Fixed a permissions problem whereby information in INFORMATION_SCHEMA could be exposed to a user with insufficient privileges. (Bug #7214) An error now occurs if you try to insert an invalid value via a stored procedure in STRICT mode. (Bug #5907) Link with libsupc++ on Fedora Core 3 to get language support functions. (Bug #6554) The value of the CHARACTER_MAXIMUM_LENGTH and CHARACTER_OCTET_LENGTH columns of the INFORMATION_SCHEMA.COLUMNS table must be NULL for numeric columns, but were not. (Bug #9344) DROP TABLE did not drop triggers that were defined for the table. DROP DATABASE did not drop triggers in the database. (Bug #5859, Bug #6559) CREATE OR REPLACE VIEW and ALTER VIEW now require the CREATE VIEW and DROP privileges, not CREATE VIEW and DELETE. (DELETE is a row-level privilege, not a table-level privilege.) (Bug #9260) Some user variables were not being handled with ``implicit'' coercibility. (Bug #9425) Setting the max_error_count system variable to 0 resulted in a setting of 1. (Bug #9072) Fixed a collation coercibility problem that caused a union between binary and non-binary columns to fail. (Bug #6519) Fixed a bug in division of floating point numbers. It could cause nine zeroes (000000000) to be inserted in the middle of the quotient. (Bug #9501) INFORMATION_SCHEMA tables had an implicit upper limit for the number of rows. As a result, not all data could be returned for some queries. (Bug #9317) Fixed a problem with the tee command in mysql that resulted in mysql crashing. (Bug #8499) CAST() now produces warnings when casting a wrong INTEGER and CHAR values. This also applies to implicite string to number casts. (Bug #5912) ALTER TABLE now fails in STRICT mode if generates warnings. Using CONVERT('0000-00-00',date) or CAST('0000-00-00' as date) in TRADITIONAL mode now produces a warning. (Bug #6145) Inserting a zero date in a DATE, DATETIME or TIMESTAMP column during TRADITIONAL mode now produces an error. (Bug #5933) Inserting a zero date into a DATETIME column in TRADITIONAL mode now produces an error. STR_TO_DATE() now produces errors in strict mode (and warnings otherwise) when given an illegal argument. (Bug #5902) Fixed a problem with ORDER BY that sometimes caused incorrect sorting of utf8 data. (Bug #9309) Fixed server crash resulting from queries that combined SELECT DISTINCT, SUM(), and ROLLUP. (Bug #8615) Incorrect results were returned from queries that combined SELECT DISTINCT, GROUP BY , and ROLLUP. (Bug #8616)
1160
Too many rows were returned from queries that combined ROLLUP and LIMIT if SQL_CALC_FOUND_ROWS was given. (Bug #8617) If on replication master a LOAD DATA INFILE is interrupted in the middle (integrity constraint violation, killed connection...), the slave used to skip this LOAD DATA INFILE entirely, thus missing some changes if this command permanently inserted/updated some table records before being interrupted. This is now fixed. (Bug #3247)
1161
CHECKSUM TABLE returns a warning for non-existing tables. The checksum value remains NULL as before. (Bug #8256) The server now includes a timestamp in the Ready for connections message that is written to the error log at startup. (Bug #8444) Added SQL_NOTES session variable to cause Note-level warnings not to be recorded. (Bug #6662) Allowed the service-installation command for Windows servers to specify a single option other than --defaults-file following the service name. This is for compatibility with MySQL 4.1. (Bug #7856) InnoDB : Upgrading from 4.1 : The sorting order for end-space in TEXT columns for InnoDB tables has changed. Starting from 5.0.3, InnoDB compares TEXT columns as space-padded at the end. If you have a non-unique index on a TEXT column, you should run CHECK TABLE on it, and run OPTIMIZE TABLE if the check reports errors. If you have a UNIQUE INDEX on a TEXT column, you should rebuild the table with OPTIMIZE TABLE. InnoDB : Commit after every 10,000 copied rows when executing ALTER TABLE, CREATE INDEX, DROP INDEX or OPTIMIZE TABLE. This makes it much faster to recover from an aborted operation. Added VAR_POP() and STDDEV_POP() as standard SQL aliases for the VARIANCE() and STDDEV() functions that compute population variance and standard deviation. Added new VAR_SAMP() and STDDEV_SAMP() functions to compute sample variance and standard deviation. (Bug #3190) Fixed a problem with out-of-order packets being sent (ERROR after OK or EOF) following a KILL QUERY statement. (Bug #6804) Retrieving from a view defined as a SELECT that mixed UNION ALL and UNION DISTINCT resulted in a different result than retrieving from the original SELECT. (Bug #6565) Fixed a problem with non-optimal index_merge query execution plans being chosen on IRIX. (Bug #8578) BIT in column definitions now is a distinct data type; it no longer is treated as a synonym for TINYINT(1). Bit-field values can be written using b'value' notation. value is a binary value written using 0s and 1s. From the Windows distribution, predefined accounts without passwords for remote users ("root@%", "@%") were removed (other distributions never had them). Added mysql_library_init() and mysql_library_end() as synonyms for the mysql_server_init() and mysql_server_end() C API functions. mysql_library_init() and mysql_library_end() are #define symbols, but the names more clearly indicate that they should be called when beginning and ending use of a MySQL C API library no matter whether the application uses libmysqlclient or libmysqld. (Bug #6149) SHOW COLUMNS now displays NO rather than blank in the Null output column if the corresponding table column cannot be NULL. Changed XML format for mysql from <col_name>col_value</col_name> to <field name="col_name">col_value</field> to allow for proper encoding of column names that are not legal as element names. (Bug #7811) Added --innodb-checksums and --innodb-doublewrite options for mysqld. Added --large-pages option for mysqld. Added multi_read_range system variable.
1162
SHOW DATABASES, SHOW TABLES, SHOW COLUMNS, and so forth display information about the INFORMATION_SCHEMA database. Also, several SHOW statements now accept a WHERE clause specifying which output rows to display. See Chapitre 22, La base de donnes d'informations INFORMATION_SCHEMA. Added the CREATE ROUTINE and ALTER ROUTINE privileges, and made the EXECUTE privilege operational. InnoDB : Corrected a bug in the crash recovery of ROW_FORMAT=COMPACT tables that caused corruption. (Bug #7973) There may still be bugs in the crash recovery, especially in COMPACT tables. When the MyISAM storage engine detects corruption of a MyISAM table, a message describing the problem now is written to the error log. InnoDB : When MySQL/InnoDB is compiled on Mac OS X 10.2 or earlier, detect the operating system version at run time and use the fcntl() file flush method on Mac OS X versions 10.3 and later. Apple had disabled fsync() in Mac OS X for internal disk drives, which caused corruption at power outages. InnoDB : Implemented fast TRUNCATE TABLE. The old approach (deleting rows one by one) may be used if the table is being referenced by foreign keys. (Bug #7150) Added cp932 (SJIS for Windows Japanese) and eucjpms (UJIS for Windows Japanese) character sets. Added several InnoDB status variables. See Section 5.2.4, Variables de statut du serveur . Added the FEDERATED storage engine. See Section 14.6, Le moteur de table FEDERATED . SHOW CREATE TABLE now uses USING index_type rather than TYPE index_type to specify an index type. (Bug #7233) InnoDB now supports a fast TRUNCATE TABLE. One visible change from this is that auto-increment values for this table are reset on TRUNCATE. Added an error member to the MYSQL_BIND data structure that is used in the C API for prepared statements. This member is used for reporting data truncation errors. Truncation reporting is enabled via the new MYSQL_REPORT_DATA_TRUNCATION option for the mysql_options() C API function. API change : the reconnect flag in the MYSQL structure is now set to 0 by mysql_real_connect(). Only those client programs which didn't explicitly set this flag to 0 or 1 after mysql_real_connect() experience a change. Having automatic reconnection enabled by default was considered too dangerous (after reconnection, table locks, temporary tables, user and session variables are lost). FLUSH TABLES WITH READ LOCK is now killable while it's waiting for running COMMIT statements to finish. MEMORY (HEAP) can have VARCHAR() fields. VARCHAR columns now remember end space. A VARCHAR() column can now contain up to 65535 bytes. For more details, see Section C.1, Changements de la version 5.0.0 (Dveloppement) . If the table handler doesn't support the new VARCHAR type, then it's converted to a CHAR column. Currently this happens for NDB tables. InnoDB : Introduced a compact record format that does not store the number of columns or the lengths of fixed-size columns. The old format can be requested by specifying ROW_FORMAT=REDUNDANT. The new format (ROW_FORMAT=COMPACT) is the default. The new format typically saves 20 % of disk space and memory. InnoDB : Setting the initial AUTO_INCREMENT value for an InnoDB table using CREATE TABLE ... AUTO_INCREMENT = n now works, and ALTER TABLE ... AUTO_INCREMENT = n resets the current value.
1163
Seconds_Behind_Master is NULL (which means ``unknown'') if the slave SQL thread is not running, or if the slave I/O thread is not running or not connected to master. It is zero if the SQL thread has caught up to the I/O thread. It no longer grows indefinitely if the master is idle. The MySQL server aborts immediately instead of simply issuing a warning if it is started with the -log-bin option but cannot initialize the binary log at startup (that is, an error occurs when writing to the binary log file or binary log index file). The binary log file and binary log index file now are handled the same way as MyISAM tables when there is a ``disk full'' or ``quota exceeded'' error. See Section A.4.3, Comment MySQL gre un disque plein . The MySQL server now aborts when started with option --log-bin-index and without --logbin, and when started with --log-slave-updates and without --log-bin. If the MySQL server is started without an argument to --log-bin and without --log-bin-index, thus not providing a name for the binary log index file, a warning is issued because MySQL falls back to using the hostname for that name, and this is prone to replication issues if the server's hostname's gets changed later. See Section 1.5.7.4, Bugs connus / limitations de MySQL . Added account-specific MAX_USER_CONNECTIONS limit, which allows you to specify the maximum number of concurrent connections for the account. Also, all limited resources now are counted per account (instead of being counted per user + host pair as it was before). Use the --old-styleuser-limits option to get the old behavior. InnoDB : A shared record lock (LOCK_REC_NOT_GAP) is now taken for a matching record in the foreign key check because inserts can be allowed into gaps. InnoDB : Relaxed locking in INSERT...SELECT, single table UPDATE...SELECT and single table DELETE...SELECT clauses when innobase_locks_unsafe_for_binlog is used and isolation level of the transaction is not serializable. InnoDB uses consistent read in these cases for a selected table. Added a new global system variable slave_transaction_retries : if the replication slave SQL thread fails to execute a transaction because of an InnoDB deadlock or exceeded InnoDB's innodb_lock_wait_timeout or NDBCluster's TransactionDeadlockDetectionTimeout or TransactionInactiveTimeout, it automatically retries slave_transaction_retries times before stopping with an error. The default is 10. (Bug #8325) When a client releases a user-level lock, DO RELEASE_LOCK() will not be written to the binary log anymore (this makes the binary log smaller); as a counterpart, the slave does not actually take the lock when it executes GET_LOCK(). This is mainly an optimization and should not affect existing setups. (Bug #7998) The way the character set information is stored into the binary log was changed, so that it's now possible to have a replication master and slave running with different global character sets. A drawback is that replication from 5.0.3 masters to pre-5.0.3 slaves is impossible. The LOAD DATA statement was extended to support user variables in the target column list, and an optional SET clause. Now one can perform some transformations on data after they have been read and before they are inserted into the table. For example :
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @var1) SET column2 = @var1/100;
Also, replication of LOAD DATA was changed, so you can't replicate such statements from a 5.0.3 master to pre-5.0.3 slaves. Bogues corrigs : If a MyISAM table on Windows had INDEX DIRECTORY or DATA DIRECTORY table options, mysqldump dumped the directory pathnames with single-backslash pathname separators. This
1164
would cause syntax errors when importing the dump file. mysqldump now changes \ to / in the pathnames on Windows. (Bug #6660) mysql_fix_privilege_tables now fixes that the mysql privilege tables can be used in MySQL 4.1. This allows one to easily downgrade to 4.1 or run MySQL 5.0 and 4.1 with the same privilege files for testing purposes. Fixed bug creating user with GRANT fails with password but works without, (Bug #7905) mysqldump misinterpreted _ and % characters in the names of tables to be dumped as wildcard characters. (Bug #9123) The definition of the enumeration-valued sql_mode column of the mysql.proc table was missing some of the current allowable SQL modes, so stored routines would not necessarily execute with the SQL mode in effect at the time of routine definition. (Bug #8902) REPAIR TABLE did not invalidate query results in the query cache that were generated from the table. (Bug #8480) In strict or traditional SQL mode, too-long string values assigned to string columns (CHAR, VARCHAR, BINARY, VARBINARY, TEXT, or BLOB) were correctly truncated, but the server returned an SQLSTATE value of 01000 (should be 22001). (Bug #6999, Bug #9029) Stored functions that used cursors could return incorrect results. (Bug #8386) AES_DECRYPT(col_name,key) could fail to return NULL for invalid values in col_name, if col_name was declared as NOT NULL. (Bug #8669) Ordering by unsigned expression (more complex than a column reference) was treating the value as signed, producing incorrectly sorted results. (Bug #7425) HAVING was treating unsigned columns as signed. (Bug #7425) Fixed a problem with boolean full-text searches on utf8 columns where a double quote in the search string caused a server crash. (Bug #8351) For a query with both GROUP BY and COUNT(DISTINCT) clauses and a FROM clause with a subquery, NULL was returned for any VARCHAR column selected by the subquery. (Bug #8218) Fixed a bug in TRUNCATE, which did not work within stored procedures. A workaround has been made so that within stored procedures, TRUNCATE is executed like DELETE. This was necessary because TRUNCATE is implicitly locking tables. (Bug #8850) Fixed an optimizer bug that caused incorrectly ordered result from a query that used a FULLTEXT index to retrieve rows and there was another index that was usable for ORDER BY. For such a query, EXPLAIN showed fulltext join type, but regular (not FULLTEXT) index in the Key column. (Bug #6635) If SELECT DISTINCT named an index column multiple times in the select list, the server tried to access different key fields for each instance of the column, which could result in a crash. (Bug #8532) For a stored function that refers to a given table, invoking the function while selecting from the same table resulted in a server crash. (Bug #8405) Comparison of a DECIMAL column containing NULL to a subquery that produced DECIMAL values resulted in a server crash. (Bug #8397) The --set-character-set option for myisamchk was changed to --set-collation. The value needed for specifying how to sort indexes is a collation name, not a character set name. (Bug #8349) Hostname matching didn't work if a netmask was specified for table-specific privileges. (Bug #3309)
1165
Corruption of MyISAM table indexes could occur with TRUNCATE TABLE if the table had already been opened. For example, this was possible if the table had been opened implicitly by selecting from a MERGE table that mapped to the MyISAM table. The server now issues an error message for TRUNCATE TABLE under these conditions. (Bug #8306) Setting the connection collation to a value different from the server collation followed by a CREATE TABLE statement that included a quoted default value resulted in a server crash. (Bug #8235) Fixed handling of table-name matching in mysqlhotcopy to accommodate DBD::mysql 2.9003 and up (which implement identifier quoting). (Bug #8136) Selecting from a view defined as a join caused a server crash if the query cache was enabled. (Bug #8054) Results in the query cache generated from a view were not properly invalidated after ALTER VIEW or DROP VIEW on that view. (Bug #8050) FOUND_ROWS() returned an incorrect value after a SELECT SQL_CALC_FOUND_ROWS DISTINCT statement that selected constants and included GROUP BY and LIMIT clauses. (Bug #7945) Selecting from an INFORMATION_SCHEMA table combined with a subselect on an INFORMATION_SCHEMA table caused an error with the message Table tbl_name is corrupted. (Bug #8164) Fixed a problem with equality propagation optimization for prepared statements and stored procedures that caused a server crash upon re-execution of the prepared statement or stored procedure. (Bug #8115, Bug #8849) LEFT OUTER JOIN between an empty base table and a view on an empty base table caused a server crash. (Bug #7433) Use of GROUP_CONCAT() in the select list when selecting from a view caused a server crash. (Bug #7116) Use of a view in a correlated subquery that contains HAVING but no GROUP BY caused a server crash. (Bug #6894) Handling by mysql_list_fields() of references to stored functions within views was incorrect and could result in a server crash. (Bug #6814) mysqldump now avoids writing SET NAMES to the dump output if the server is older than version 4.1 and would not understand that statement. (Bug #7997) Fixed problems when selecting from a view that had an EXISTS or NOT EXISTS subquery. Selecting columns by name caused a server crash. With SELECT *, a crash did not occur, but columns in outer query were not resolved properly. (Bug #6394) DDL statements for views were not being written to the binary log (and thus not subject to replication). (Bug #4838) The CHAR() function was not ignoring NULL arguments, contrary to the documentation. (Bug #6317) Creating a table using a name containing a character that is illegal in character_set_client resulted in the character being stripped from the name and no error. The character now is considered an error. (Bug #8041) Fixed a problem with the Cyrillic letters I and SHORT I being treated the same by the utf8_general_ci collation. (Bug #8385) Some INFORMATION_SCHEMA columns that contained catalog identifiers were of type LONGTEXT. These were changed to VARCHAR(N, where N is the appropriate maximum identifier length. (Bug #7215)
1166
Some INFORMATION_SCHEMA columns that contained timestamp values were of type VARBINARY. These were changed to TIMESTAMP. (Bug #7217) An expression that tested a case-insensitive character column against string constants that differed in lettercase could fail because the constants were treated as having a binary collation. (For example, WHERE city='London' AND city='london' could fail.) (Bug #7098, Bug #8690) The output of the STATUS (\s) command in mysql had the values for the server and client character sets reversed. (Bug #7571) If the slave was running with --replicate-*-table options which excluded one temporary table and included another, and the two tables were used in a single DROP TEMPORARY TABLE IF EXISTS statement, as the ones the master automatically writes to its binary log upon client's disconnection when client has not explicitly dropped these, the slave could forget to delete the included replicated temporary table. Only the slave needs to be upgraded. (Bug #8055) When setting integer system variables to a negative value with SET VARIABLES, the value was treated as a positive value modulo 2^32. (Bug #6958) Corrected a problem with references to DUAL where statements such as SELECT 1 AS a FROM DUAL would succeed but statements such as SELECT 1 AS a FROM DUAL LIMIT 1 would fail. (Bug #8023) Fixed a server crash caused by DELETE FROM tbl_name ... WHERE ... ORDER BY tbl_name.col_name when the ORDER BY column was qualified with the table name. (Bug #8392) Fixed a bug in MATCH ... AGAINST in natural language mode that could cause a server crash if the FULLTEXT index was not used in a join (EXPLAIN did not show fulltext join mode) and the search query matched no rows in the table (Bug #8522). InnoDB : Honor the --tmpdir startup option when creating temporary files. Previously, InnoDB temporary files were always created in the temporary directory of the operating system. On Netware, InnoDB will continue to ignore --tmpdir. (Bug #5822) Platform and architecture information in version information produced for --version option on Windows was always Win95/Win98 (i32). More accurately determine platform as Win32 or Win64 for 32-bit or 64-bit Windows, and architecture as ia32 for x86, ia64 for Itanium, and axp for Alpha. (Bug #4445) If multiple semicolon-separated statements were received in a single packet, they were written to the binary log as a single event rather than as separate per-statement events. For a server serving as a replication master, this caused replication to fail when the event was sent to slave servers. (Bug #8436) Fixed LOAD INDEX statement to actually load index in memory. (Bug #8452) Fixed a failure of multiple-table updates to replicate properly on slave servers when --replicate*-table options had been specified. (Bug #7011) Fixed failure of CREATE TABLE ... LIKE Windows when the source or destination table was located in a symlinked database directory. (Bug #6607) With lower_case_table_names set to 1, mysqldump on Windows could write the same table name in different lettercase for different SQL statements. Fixed so that consistent lettercase is used. (Bug #5185) mysqld_safe now understands the --help option. Previously, it ignored the option and attempted to start the server anyway. (Bug #7931) Fixed problem in NO_BACKSLASH_ESCAPES SQL mode for strings that contained both the string quoting character and backslash. (Bug #6368)
1167
Fixed some portability issues with overflow in floating point values. Prepared statements now gives warnings on prepare. Fixed bug in prepared statements with SUM(DISTINCT...). Fixed bug in prepared statements with OUTER JOIN. Fixed a bug in CONV() function returning unsigned BIGINT number (third argument is positive, and return value does not fit in 32 bits). (Bug #7751) Fixed a failure of the IN() operator to return correct result if all values in the list were constants and some of them were using substring functions, for example, LEFT(), RIGHT(), or MID(). (Bug #7716) Fixed a crash in CONVERT_TZ() function when its second or third argument was from a const table (see Section 7.2.1, Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT) ). (Bug #7705) Fixed a problem with calculation of number of columns in row comparison against subquery. (Bug #8020) Fixed erroneous output resulting from SELECT DISTINCT combined with a subquery and GROUP BY. (Bug #7946) Fixed server crash in comparing a nested row expression (for example row(1,(2,3))) with a subquery. (Bug #8022) Fixed server crash resulting from certain correlated subqueries with forward references (references to an alias defined later in the outer query). (Bug #8025) Fixed server crash resulting from re-execution of prepared statements containing subqueries. (Bug #8125) Fixed a bug where ALTER TABLE improperly would accept an index on a TIMESTAMP column that CREATE TABLE would reject. (Bug #7884) SHOW CREATE TABLE now reports ENGINE=MEMORY rather than ENGINE=HEAP for a MEMORY table (unless the MYSQL323 SQL mode is enabled). (Bug #6659) Fixed a bug where the use of GROUP_CONCAT() with HAVING caused a server crash. (Bug #7769) Fixed a bug where comparing the result of a subquery to a non-existent column caused a server crash on Windows. (Bug #7885) Fixed a bug in a combination of -not and trunc* operators of full-text search. Using more than one truncated negative search term, was causing empty result set. InnoDB : Corrected the handling of trailing spaces in the ucs2 character set. (Bug #7350, Bug #8771) InnoDB : Use native tmpfile() function on Netware. All InnoDB temporary files are created under sys:\tmp. Previously, InnoDB temporary files were never deleted on Netware. Fixed a bug in max_heap_table_size handling, that resulted in Table is full error when the table was still smaller than the limit. (Bug #7791). Fixed a symlink vulnerability in the mysqlaccess script. Reported by Javier Fernandez-Sanguino Pena and Debian Security Audit Team. (CVE-2005-0004) Fixed a bug that caused server crash if some error occured during filling of temporary table created for derived table or view handling. (Bug #7413)
1168
Fixed a bug which caused server crash if query containing CONVERT_TZ() function with constant arguments was prepared. (Bug #6849) Prevent adding CREATE TABLE .. SELECT query to the binary log when the insertion of new records partially failed. (Bug #6682) Fixed a bug which caused a crash when only the slave I/O thread was stopped and started. (Bug #6148) Giving mysqld a SIGHUP caused it to crash. Changed semantics of CREATE/ALTER/DROP DATABASE statements so that replication of CREATE DATABASE is possible when using --binlog-do-db and --binlog-ignore-db. (Bug #6391) A sequence of BEGIN (or SET AUTOCOMMIT=0), FLUSH TABLES WITH READ LOCK, transactional update, COMMIT, FLUSH TABLES WITH READ LOCK could hang the connection forever and possibly the MySQL server itself. This happened for example when running the innobackup script several times. (Bug #6732) mysqlbinlog did not print SET PSEUDO_THREAD_ID statements in front of LOAD DATA INFILE statements inserting into temporary tables, thus causing potential problems when rolling forward these statements after restoring a backup. (Bug #6671) InnoDB : Fixed a bug no error message for ALTER with InnoDB and AUTO_INCREMENT (Bug #7061). InnoDB now supports ALTER TABLE...AUTO_INCREMENT = x query to set auto increment value for a table. Made the MySQL server accept executing SHOW CREATE DATABASE even if the connection has an open transaction or locked tables; refusing it made mysqldump --single-transaction sometimes fail to print a complete CREATE DATABASE statement for some dumped databases. (Bug #7358) Fixed that, when encountering a ``disk full'' or ``quota exceeded'' write error, MyISAM sometimes didn't sleep and retry the write, thus resulting in a corrupted table. (Bug #7714) Fixed that --expire-log-days was not honored if using only transactions. (Bug #7236) Fixed that a slave could crash after replicating many ANALYZE TABLE, OPTIMIZE TABLE, or REPAIR TABLE statements from the master. (Bug #6461, Bug #7658) mysqlbinlog forgot to add backquotes around the collation of user variables (causing later parsing problems as BINARY is a reserved word). (Bug #7793) Ensured that mysqldump --single-transaction sets its transaction isolation level to REPEATABLE READ before proceeding (otherwise if the MySQL server was configured to run with a default isolation level lower than REPEATABLE READ it could give an inconsistent dump). (Bug #7850) Fixed that when using the RPAD() function (or any function adding spaces to the right) in a query that had to be resolved by using a temporary table, all resulting strings had rightmost spaces removed (i.e. RPAD() did not work) (Bug #4048) Fixed that a 5.0.3 slave can connect to a master < 3.23.50 without hanging (the reason for the hang is a bug in these quite old masters -- SELECT @@unknown_var hangs them -- which was fixed in MySQL 3.23.50). (Bug #7965) InnoDB : Fixed a deadlock without any locking, simple select and update (Bug #7975). InnoDB now takes an exclusive lock when INSERT ON DUPLICATE KEY UPDATE is checking duplicate keys. Fixed a bug where MySQL was allowing concurrent updates (inserts, deletes) to a table if binary logging is enabled. Changed to ensure that all updates are executed in a serialized fashion, because they are executed serialized when binlog is replayed. (Bug #7879)
1169
Fixed a rare race condition which could lead to FLUSH TABLES WITH READ LOCK hanging. (Bug #8682) Fixed a bug that caused the slave to stop on statements that produced an error on the master. (Bug #8412)
1170
If the server finds that the user table has not been upgraded to include the view-related privilege columns, it treats each account as having view privileges that are the same as its CREATE privilege. Bogues corrigs : Fixed that mysqlbinlog --read-from-remote-server sometimes couldn't accept two binary logfiles on the command line. (Bug #4507) Fixed that mysqlbinlog --position --read-from-remote-server had incorrect # at lines. (Bug #4506) Fixed that CREATE TABLE ... TYPE=HEAP ... AS SELECT... caused replication slave to stop. (Bug #4971) Fixed that mysql_options(...,MYSQL_OPT_LOCAL_INFILE,...) failed to disable LOAD DATA LOCAL INFILE. (Bug #5038) Fixed that disable-local-infile option had no effect if client read it from a configuration file using mysql_options(...,MYSQL_READ_DEFAULT,...). (Bug #5073) Fixed that SET GLOBAL SYNC_BINLOG did not work on some platforms (Mac OS X). (Bug #5064) Fixed that mysql-test-run failed on the rpl_trunc_binlog test if running test from the installed (the target of 'make install') directory. (Bug #5050) Fixed that mysql-test-run failed on the grant_cache test when run as Unix user 'root'. (Bug #4678) Fixed an unlikely deadlock which could happen when using KILL. (Bug #4810) Fixed a crash when one connection got KILLed while it was doing START SLAVE. (Bug #4827) Made FLUSH TABLES WITH READ LOCK block COMMIT if server is running with binary logging; this ensures that the binary log position can be trusted when doing a full backup of tables and the binary log. (Bug #4953) Fixed that the counter of an auto_increment column was not reset by TRUNCATE TABLE is the table was a temporary one. (Bug #5033) Fixed slave SQL thread so that the SET COLLATION_SERVER... statements it replicates don't advance its position (so that if it gets interrupted before the actual update query, it will later redo the SET). (Bug #5705) Fixed that if the slave SQL thread found a syntax error in a query (which should be rare, as the master parsed it successfully), it stops. (Bug #5711) Fixed that if a write to a MyISAM table fails because of a full disk or an exceeded disk quota, it prints a message to the error log every 10 minutes, and waits until disk becomes free. (Bug #3248) Fixed problem introduced in 4.0.21 where a connection starting a transaction, doing updates, then FLUSH TABLES WITH READ LOCK, then COMMIT, would cause replication slaves to stop complaing about error 1223. Bug surfaced when using the InnoDB innobackup script. (Bug #5949)
1171
the slave still has out-of-date data in the table. But if you use the --init-file option to populate the MEMORY table on the master at startup, it ensures that the failing time interval is zero. (Bug #2477) When a session having open temporary tables terminates, the statement automatically written to the binary log is now DROP TEMPORARY TABLE IF EXISTS instead of DROP TEMPORARY TABLE, for more robustness. The MySQL server now returns an error if SET SQL_LOG_BIN is issued by a user without the SUPER privilege (in previous versions it just silently ignored the statement in this case). Changed that when the MySQL server has binary logging disabled (that is, no log-bin option was used) then no transaction binlog cache is allocated for connections (this should save binlog_cache_size bytes of memory (32 kilobytes by default) for every connection). Added option --replicate-same-server-id. Bogues corrigs : Strange results with index (x, y) ... WHERE x=val_1 AND y>=val_2 ORDER BY pk; (Bug #3155) Subquery and order by (Bug #3118) ALTER DATABASE caused the client to hang if the database did not exist. (Bug #2333) SLAVE START (which is a deprecated syntax, START SLAVE should be used instead) could crash the slave. (Bug #2516) Multiple-table DELETE statements were never replicated by the slave if there were any replicate*-table options. (Bug #2527) The MySQL server did not report any error if the query (submitted through mysql_real_query() or mysql_prepare()) was terminated by garbage characters (which can happen if you pass a wrong length parameter to mysql_real_query() or mysql_prepare()); the result was that the garbage characters were written into the binary log. (Bug #2703) Replication: If a client connects to a slave server and issues an administrative statement for a table (for example, OPTIMIZE TABLE or REPAIR TABLE), this could sometimes stop the slave SQL thread. This does not lead to any corruption, but you must use START SLAVE to get replication going again. (Bug #1858) Made clearer the error message which one gets when an update is refused because of the readonly option. (Bug #2757) Fixed that replicate-wild-*-table rules apply to ALTER DATABASE when the table pattern is '%', like it is already the case for CREATE DATABASE and DROP DATABASE. (Bug #3000) Fixed that when a Rotate event is found by the slave SQL thread in the middle of a transaction, the value of Relay_Log_Pos in SHOW SLAVE STATUS remains correct. (Bug #3017) Corrected the master's binary log position that InnoDB reports when it is doing a crash recovery on a slave server. (Bug #3015) Changed the column Seconds_Behind_Master in SHOW SLAVE STATUS to never show a value of -1. (Bug #2826) Changed that when a DROP TEMPORARY TABLE statement is automatically written to the binlog when a session ends, the statement is recorded with an error code of value zero (this ensures that killing a SELECT on the master does not result in a superfluous error on the slave). (Bug #3063) Changed that when a thread handling INSERT DELAYED (also known as a delayed_insert thread) is killed, its statements are recorded with an error code of value zero (killing such a thread does not endanger replication, so we thus avoid a superfluous error on the slave). (Bug #3081)
1172
Fixed deadlock when two START SLAVE commands were run at the same time. (Bug #2921) Fixed that a statement never triggers a superfluous error on the slave, if it must be excluded given the replicate-* options. The bug was that if the statement had been killed on the master, the slave would stop. (Bug #2983) The --local-load option of mysqlbinlog now requires an argument. Fixed a segmentation fault when running LOAD DATA FROM MASTER after RESET SLAVE. (Bug #2922) mysqlbinlog --read-from-remote-server read all binary logs following the one that was requested. It now stops at the end of the requested file, the same was it does when reading a local binary log. (Bug #3204) Fixed mysqlbinlog --read-from-remote-server to print the exact positions of events in the "at #" lines. (Bug #3214) Fixed a rare error condition that caused the slave SQL thread spuriously to print the message Binlog has bad magic number and stop when it was not necessary to do so. (Bug #3401) Fixed mysqlbinlog not to forget to print a USE statement under rare circumstances where the binary log contained a LOAD DATA INFILE statement. (Bug #3415) Fixed a memory corruption when replicating a LOAD DATA INFILE when the master had version 3.23. (Bug #3422) Multiple-table DELETE statements were always replicated by the slave if there were some replicate-*-ignore-table options and no replicate-*-do-table options. (Bug #3461) Fixed a crash of the MySQL slave server when it was built with --with-debug and replicating itself. (BUG #3568) Fixed that in some replication error messages, a very long query caused the rest of the message to be invisible (truncated), by putting the query last in the message. (Bug #3357)
1173
Easier replication upgrade (5.0.0 masters can read older binary logs and 5.0.0 slaves can read older relay logs). See Section 6.5, Compatibilit de la rplication entre les versions de MySQL for more details). The format of the binary log and relay log is changed compared to that of MySQL 4.1 and older. Important note: If you upgrade to MySQL 4.1.1 or higher, it is difficult to downgrade back to 4.0 or 4.1.0! That is because, for earlier versions, InnoDB is not aware of multiple tablespaces. Bogues corrigs :
1174
the character sets of columns that participate in a foreign key. Be sure to convert all tables before modifying any data! (Bug #9802) Previously in MySQL 4.1, an Illegal mix of collations error occurred when mixing strings from same character set when one had a non-binary collation and the other a binary collation. Now the binary collation takes precedence, so that both strings are treated as having the binary collation. This restores compatibility with MySQL 4.0 behavior. Bogues corrigs : Security fix: If mysqld was started with --user=non_existent_user, it would run using the privileges of the account it was invoked from, even if that was root. (Bug #9833) MAX() for an INT UNSIGNED (unsigned 4-byte integer) column could return negative values if the column contained values larger than 2^31. (Bug #9298) Fixed a deadlock resulting from use of FLUSH TABLES WITH READ LOCK while an INSERT DELAYED statement is in progress. (Bug #7823) Multiple-table updates could produce spurious data-truncation warnings if they used a join across columns that are indexed using a column prefix. (Bug #9103) Use of a subquery that used WITH ROLLUP in the FROM clause of the main query sometimes resulted in a Column cannot be null error. (Bug #9681) RENAME TABLE for an ARCHIVE table failed if the .arn file was not present. (Bug #9911) Fixed an optimizer problem where extraneous comparisons between NULL values in indexed columns were being done for operators such as = that are never true for NULL. (Bug #8877) SELECT ROUND(expr) produced a different result than CREATE TABLE ... SELECT ROUND(expr). (Bug #9837) Fixed some awk script portability problems in cmd-line-utils/libedit/makelist.sh. (Bug #9954) Changed metadata for result of SHOW KEYS: Data type for Sub_part column now is SMALLINT rather than TINYINT because key part length can be longer than 255. (Bug #9439) Fixed some problems with myisampack on 64-bit systems that resulted in segmentation violations. (Bug #9487) Fixed an optimizer bug in computing the union of two ranges for the OR operator. (Bug #9348) Fixed an index corruption problem for MyISAM tables that resulted from the 4.1 behavior of padding values with blanks for comparison: Dumping a table with mysqldump, reloading it, and then rerunning the binary log against it crashed the index and necessitated a repair. (Bug #9188) Fixed a segmentation fault in mysqlcheck that occurred when the last table checked in --autorepair mode returned an error (such as the table being a MERGE table). (Bug #9492) Fixed the client/server protocol for prepared statements so that reconnection works properly when the connection is killed while reconnect is enabled. (Bug #8866) INSERT ... ON DUPLICATE KEY UPDATE incorrectly updated a TIMESTAMP column to the current timestamp, even if the update list included col_name = col_name for that column to prevent the update. (Bug #7806) Starting mysqld with the --skip-innodb and --default-storage-engine=innodb (or -default-table-type=innodb caused a server crash. (Bug #9815) Queries containing CURRENT_USER() incorrectly were registered in the query cache. (Bug #9796)
1175
A server installed as a Windows service and started with --shared-memory could not be stopped. (Bug #9665) mysqldump dumped core when invoked with --tmp and --single-transaction options and a non-existent table name. (Bug #9175) Additional fix for mysql_server_init() and mysql_server_end() C API functions so that stopping and restarting the embedded server will not cause a crash. (Bug #7344) mysql.server no longer uses non-portable alias command or LSB functions. (Bug #9852) Fixed a readline-related crash in mysql when the user pressed Control-R. (Bug #9568) TIMEDIFF() with a negative time first argument and postive time second argument produced incorrect results. (Bug #8068) Fixed a bug that caused concurrent inserts to be allowed into the tables in the SELECT ... UNION ... part of INSERT ... SELECT ... UNION .... This could result in the incorrect order of queries in the binary log. (Bug #9922) Warning message from GROUP_CONCAT() did not always indicate correct number of lines. (Bug #8681) InnoDB: ENUM and SET columns were treated incorrectly as character strings. This bug did not manifest itself with latin1 collations, but it caused malfunction with utf8. Old tables will continue to work. In new tables, ENUM and SET will be internally stored as unsigned integers. (Bug #9526) InnoDB: Avoid test suite failures caused by a locking conflict between two server instances at server shutdown/startup. This conflict on advisory locks appears to be the result of a bug in the operating system; these locks should be released when the files are closed, but somehow that does not always happen immediately in Linux. (Bug #9381) InnoDB: Prevent ALTER TABLE from changing the storage engine if there are foreign key constraints on the table. (Bug #5574, Bug #5670) InnoDB: Fixed a deadlock without any locking, simple select and update. (Bug #7975) InnoDB now takes an exclusive lock when INSERT ON DUPLICATE KEY UPDATE is checking duplicate keys.
1176
For slave replication servers started with --replicate-* options, statements that should not be replicated according those options no longer are written to the slave's general query log. (Bug #8297) Added SQL_NOTES session variable to cause Note-level warnings not to be recorded. (Bug #6662) InnoDB: Commit after every 10,000 copied rows when executing CREATE INDEX, DROP INDEX or OPTIMIZE TABLE, which are internally implemented as ALTER TABLE. This makes it much faster to recover from an aborted operation. Added a new global system variable slave_transaction_retries: If the replication slave SQL thread fails to execute a transaction because of an InnoDB deadlock or exceeded InnoDB's innodb_lock_wait_timeout or NDBCluster's TransactionDeadlockDetectionTimeout or TransactionInactiveTimeout, it automatically retries slave_transaction_retries times before stopping with an error. The default in MySQL 4.1 is 0. You must explicitly set the value greater than 0 to enable the ``retry'' behavior. (In MySQL 5.0.3 or newer, the default is 10.) (Bug #8325) Added --with-big-tables compilation option to configure. (Previously it was necessary to pass -DBIG_TABLES to the compiler manually in order to enable large table support.) See Section 2.4.2, Options habituelles de configure for details. Added configuration directives !include and !includedir for including option files and searching directories for option files. See Section 4.3.2, Fichier d'options my.cnf for usage. Bogues corrigs : The use of XOR together with NOT ISNULL() erroneously resulted in some outer joins being converted to inner joins by the optimizer. (Bug #9017) Fixed utf8_spanish2_ci and ucs2_spanish2_ci collations to not consider r equal to rr. If you upgrade to this version from an earlier version, you should rebuild the indexes of affected tables. (Bug #9269) Allow extra HKSCS and cp950 characters (big5 extension characters) to be accepted in big5 columns. (Bug #9357) BLOB(M) and TEXT(M) columns, with M less than 256, were being created as BLOB and TEXT columns rather than TINYBLOB or TINYTEXT columns. (Bug #9303) Fixed a problem with INSERT ... SELECT ... ON DUPLICATE KEY UPDATE where a column named in the insert list and in the ON DUPLICATE KEY UPDATE clause was erroneously declared to be ambiguous. (Bug #8147) In prepared statements, subqueries containing parameters were erroneously treated as const tables during preparation, resulting in a server crash. (Bug #8807) Fixed a problem with OPTIMIZE TABLE for InnoDB tables being written twice to the binary log. (Bug #9149) Provide more informative error messages in clustered setting when a query is issued against a table that has been modified by another mysqld server. (Bug #6762) For MyISAM tables, REPAIR TABLE no longer discard rows that have incorrect checksum. (Bug #9824) Depending on index statistics, GROUP BY col1, col2, ... could return incorrect results if the first table processed for a join had several indexes that cover the grouped columns. (Bug #9213) Fixed incorrect evaluation of ALL/ANY subqueries that contain a HAVING clause. (Bug #9350) Fixed server crash when left expression of IN/ALL/ANY comparision was a subquery. (Bug #8888) Fixed option-parsing code for the embedded server to understand K, M, and G suffixes for the net_buffer_length and max_allowed_packet options. (Bug #9472)
1177
Fixed a crash when using TIMESTAMP columns with no minute or second parts in GROUP BY with the new system variable set to 1. (Bug #9401) If a MyISAM table on Windows had INDEX DIRECTORY or DATA DIRECTORY table options, mysqldump dumped the directory pathnames with single-backslash pathname separators. This would cause syntax errors when importing the dump file. mysqldump now changes \ to / in the pathnames on Windows. (Bug #6660) Fixed a server crash caused by use of NOW() is a subquery. (Bug #8824) Fixed problems with static variables to allow building on Fedora Core 3. (Bug #6554) Some user variables were not being handled with ``implicit'' coercibility. (Bug #9425) Setting the max_error_count system variable to 0 resulted in a setting of 1. (Bug #9072) Fixed a collation coercibility problem that caused a union between binary and non-binary columns to fail. (Bug #6519) Fixed a problem with the tee command in mysql that resulted in mysql crashing. (Bug #8499) On Windows, create shared memory objects with the proper access rights to make them usable when the client and server are running under different accounts. (Bug #8226) Bundled zlib in the source distribution was upgraded to 1.2.2. (Bug #9118) Fixed server crash resulting from queries that combined SELECT DISTINCT, SUM(), and ROLLUP. (Bug #8615) Incorrect results were returned from queries that combined SELECT DISTINCT, GROUP BY , and ROLLUP. (Bug #8616) Fixed a bug that under certain circumstances could allow a privilege escalation via database wildcards in GRANT. (CVE-2004-0957) Too many rows were returned from queries that combined ROLLUP and LIMIT if SQL_CALC_FOUND_ROWS was given. (Bug #8617) mysqldump misinterpreted _ and % characters in the names of tables to be dumped as wildcard characters. (Bug #9123) Made the relay_log_space_limit system variable show up in the output of SHOW VARIABLES. (Bug #7100) Use of GROUP_CONCAT(x) in a subquery, where x was an alias to a column in the outer query, resulted in a server crash. (Bug #8656) The CHARSET(), COLLATION(), and COERCIBILITY() functions sometimes returned NULL. CHARSET() and COLLATION() returned NULL when given any of these arguments that evaluated to NULL: A system function such as DATABASE(); a column value; and a user variable. Now CHARSET() and COLLATION() return the system character set and collation; the column character set and collation; and binary. COERCIBILITY(NULL) now returns ``ignorable'' coercibility rather than NULL. (Bug #9129) Expressions involving nested CONCAT() calls and character set conversion of string constants could return an incorrect result. (Bug #8785) The MEMORY storage engine did not properly increment an AUTO_INCREMENT column if there was a second composite index that included the column. (Bug #8489) Fixed a bug in the filesort routine such that killing a filesort could cause an assertion failure. (Bug #8799)
1178
REPAIR TABLE did not invalidate query results in the query cache that were generated from the table. (Bug #8480) If max_join_size was set, a query containing a subquery that exceeded the examined-rows limit could hang. (Bug #8726) Mixed-case database and table names in the grant tables were ignored for authentication if the lower_case_table_names system variable was set. GRANT will not create such privileges when lower_case_table_names is set, but it is possible to create them by direct manipulation of the grant tables, or that old grant records were present before setting the variable. (Bug #7989) AES_DECRYPT(col_name,key) could fail to return NULL for invalid values in col_name, if col_name was declared as NOT NULL. (Bug #8669) Ordering by unsigned expression (more complex than a column reference) was treating the value as signed, producing incorrectly sorted results. (Bug #7425) HAVING was treating unsigned columns as signed. (Bug #7425) Fixed a problem with boolean full-text searches on utf8 columns where a double quote in the search string caused a server crash. (Bug #8351) MIN(col_name) and MAX(col_name) could fail to produce the correct result if col_name was contained in multiple indexes and the optimizer did not choose the first index that contained the column. (Bug #8893) Table creation for a MyISAM table failed if DATA DIRECTORY or INDEX DIRECTORY options were given that specified the pathname to the database directory where the table files would be created by default. (Bug #8707) Fixed a problem with LIKE pattern-matching for strings with the cp1251_bin binary collation. (Bug #8560) A join on two tables failed when each contained a BIGINT UNSIGNED column that were compared when their values exceeded 2^63 1. The match failed and the join returned no rows. (Bug #8562) For a query with both GROUP BY and COUNT(DISTINCT) clauses and a FROM clause with a subquery, NULL was returned for any VARCHAR column selected by the subquery. (Bug #8218) Fixed an optimizer bug that caused incorrectly ordered result from a query that used a FULLTEXT index to retrieve rows and there was another index that was usable for ORDER BY. For such a query, EXPLAIN showed fulltext join type, but regular (not FULLTEXT) index in the Key column. (Bug #6635) For a statement string that contained multiple slow queries, only the last one would be written to the slow query log. (Bug #8475) When the server was started with --skip-name-resolve, specifying hostname values that included netmasks in GRANT statements did not work. (Bug #8471) The --set-character-set option for myisamchk was changed to --set-collation. The value needed for specifying how to sort indexes is a collation name, not a character set name. (Bug #8349) Hostname matching didn't work if a netmask was specified for table-specific privileges. (Bug #3309) Binary data stored in BLOB or BINARY columns would be erroneously dumped if mysqldump was invoked with --hex-blob and --skip-extended-insert arguments. This happened if data contained characters larger then 0x7F (Bug #8830). Corruption of MyISAM table indexes could occur with TRUNCATE TABLE if the table had already been opened. For example, this was possible if the table had been opened implicitly by selecting
1179
from a MERGE table that mapped to the MyISAM table. The server now issues an error message for TRUNCATE TABLE under these conditions. (Bug #8306) Fixed handling of table-name matching in mysqlhotcopy to accommodate DBD::mysql 2.9003 and up (which implement identifier quoting). (Bug #8136) In the mysql_real_escape_string() C API function, when a multi-byte character is encountered that is illegal in the current character set, escape only the first byte, not each byte. This avoids creating a valid character from an invalid one. (Bug #8378) Fixed a problem with the cp1250_czech_cs collation that caused empty literal strings not to compare equal to empty character columns. (Bug #8840) Fixed a problem in index cost calculation that caused a USE INDEX or FORCE INDEX hint not to be used properly for a LEFT JOIN across indexed BLOB columns. (Bug #7520) The column type for MAX(datetime_col) was returned as VARCHAR rather than DATETIME if the query included a GROUP BY clause. (Bug #5615) FOUND_ROWS() returned an incorrect value for preceding SELECT statements that used no table or view. (Bug #6089) In string literals with an escape character (\) followed by a multi-byte character that has a second byte of \, the literal was not interpreted correctly. The next character now is escaped, not just the next byte. (Bug #8303) InnoDB: Work around a problem in AIX 5.1 patched with ML7 security patch: InnoDB would refuse to open its ibdata files, complaining about an operating system error 0. InnoDB: Fixed a memory corruption bug if one created a table with a primary key that contained at least two column prefixes. An example: CREATE TABLE t(a char(100), b tinyblob, PRIMARY KEY(a(5), b(10))). InnoDB: Do not try to space-pad BLOB columns containing ucs2 characters. This avoids an assertion failure that was introduced when fixing Bug #7350. (Bug #8771) InnoDB: Fixed a bug : MySQL-4.1.8 - 4.1.10 could complain that an InnoDB table created with MySQL-3.23.49 or earlier was in the new compact InnoDB table format of 5.0.3 or later, and InnoDB would refuse to use that table. There is nothing wrong with the table, it is mysqld that is in error. Workaround: wait that 4.1.11 is released before doing an upgrade, or dump the table and recreate it with any MySQL version >= 3.23.50 before upgrading. InnoDB: Honor the --tmpdir startup option when creating temporary files. Previously, InnoDB temporary files were always created in the temporary directory of the operating system. On Netware, InnoDB will continue to ignore --tmpdir. (Bug #5822) InnoDB: If MySQL wrote to its binlog, but for some reason trx->update_undo and trx>insert_undo were NULL in InnoDB, then trx->commit_lsn was garbage, and InnoDB could assert in the log flush of trx_commit_complete_for_mysql(). (Bug #9277) InnoDB: If InnoDB cannot allocate memory, keep retrying for 60 seconds before we intentionally crash mysqld; maybe the memory shortage is just temporary. InnoDB: If one used LOCK TABLES, created an InnoDB temp table, and did a multi-table update where a MyISAM table was the update table and the temp table was a read table, then InnoDB asserted in row0sel.c because n_mysql_tables_in_use was 0. Also, we remove the assertion altogether and just print an error to the .err log if this important consistency check fails. (Bug #8677) mysqldump now avoids writing SET NAMES to the dump output if the server is older than version 4.1 and would not understand that statement. (Bug #7997)
1180
Fixed a bug in my_print_defaults that made it ignore the --defaults-extra-file and -defaults-file options. Retrieving from a view defined as a SELECT that mixed UNION ALL and UNION DISTINCT resulted in a different result than retrieving from the original SELECT. (Bug #6565) Worked around a bug in support for NSS support in glibc when static linking is used and LDAP is one of the NSS sources. The workaround is to detect when the bug causes a segfault and issue a diagnostic message with information about the problem. (Bug #3037, Bug #4872) If the mysql prompt was configured to display the default database name, and that database was dropped, mysql did not update the prompt. (Bug #4802) perror was printing a spurious extra line of output ("Error code ###: Unknown error ###" printed directly before the correct line with the error message). (Bug #8517) The CHAR() function was not ignoring NULL arguments, contrary to the documentation. (Bug #6317) Neither SHOW ERRORS nor SHOW WARNINGS were displaying Error-level messages. (Bug #6572) Creating a table using a name containing a character that is illegal in character_set_client resulted in the character being stripped from the name and no error. The character now is considered an error. (Bug #8041) Fixed a problem with the Cyrillic letters I and SHORT I being treated the same by the utf8_general_ci collation. (Bug #8385) The MAX_CONNECTIONS_PER_HOUR resource limit was not being reset hourly and thus imposed an absolute limit on number of connections per account until the server is restarted or the limits flushed. (Bug #8350) With a database was dropped with lower_case_table_names=2, tables in the database also were dropped but not being flushed properly from the table cache. If the database was recreated, the tables also would appear to have been recreated. (Bug #8355) Changed mysql_server_end() C API function to restore more variables to their initial state so that a subsequent call to mysql_server_init() would not cause a client program crash. (Bug #7344) Fixed a problem with accented letters improperly being treated as distinct with the utf_general_ci collation. (Bug #7878) ENUM and SET columns in privilege tables incorrectly had a case-sensitive collation, resulting in failure of assignments of values that did not have the same lettercase as given in the column definitions. The collation was changed to be case insensitive. (Bug #7617) An expression that tested a case-insensitive character column against string constants that differed in lettercase could fail because the constants were treated as having a binary collation. (For example, WHERE city='London' AND city='london' could fail.) (Bug #7098, Bug #8690) The output of the STATUS (\s) command in mysql had the values for the server and client character sets reversed. (Bug #7571) If the slave was running with --replicate-*-table options which excluded one temporary table and included another, and the two tables were used in a single DROP TEMPORARY TABLE IF EXISTS statement, as the ones the master automatically writes to its binary log upon client's disconnection when client has not explicitly dropped these, the slave could forget to delete the included replicated temporary table. Only the slave needs to be upgraded. (Bug #8055) Treat user variables as having IMPLICIT derivation (coercibility) to avoid ``Illegal mix of collations'' errors when replicating user variables. (Bug #6676)
1181
When setting integer system variables to a negative value with SET VARIABLES, the value was treated as a positive value modulo 2^32. (Bug #6958) Fixed a bug in bundled readline library that caused segmentation fault in mysql when user entered Shift+Enter. (Bug #5672) Fix conversion of strings -> double to get higher accuracy for floating point values that are integers, like: 123.45E+02 (Bug #7840). Fixed a bug in MATCH ... AGAINST in natural language mode that could cause a server crash if the FULLTEXT index was not used in a join (EXPLAIN did not show fulltext join mode) and the search query matched no rows in the table (Bug #8522). Platform and architecture information in version information produced for --version option on Windows was always Win95/Win98 (i32). More accurately determine platform as Win32 or Win64 for 32-bit or 64-bit Windows, and architecture as ia32 for x86, ia64 for Itanium, and axp for Alpha. (Bug #4445) Fixed a rare race condition which could lead to FLUSH TABLES WITH READ LOCK hanging. (Bug #8682) Fixed a bug that caused the slave to stop on statements that produced an error on the master. (Bug #8412) If multiple semicolon-separated statements were received in a single packet, they were written to the binary log as a single event rather than as separate per-statement events. For a server serving as a replication master, this caused replication to fail when the event was sent to slave servers. (Bug #8436)
1182
Thread stack size was increased from 192KB to 256KB on Linux/IA-64 (too small stack size was causing server crashes on some queries). (Bug #8391) From the Windows distribution, predefined accounts without passwords for remote users ("root@%", "@%") were removed (other distributions never had them). Added mysql_library_init() and mysql_library_end() as synonyms for the mysql_server_init() and mysql_server_end() C API functions. mysql_library_init() and mysql_library_end() are #define symbols, but the names more clearly indicate that they should be called when beginning and ending use of a MySQL C API library no matter whether the application uses libmysqlclient or libmysqld. (Bug #6149) The server now issues a warning when lower_case_table_names=2 and the data directory is on a case-sensitive filesystem, just as when lower_case_table_names=0 on a case-insensitive filesystem. (Bug #7887) The server now issues a warning to the error log when it encounters older tables that contain character columns that might be interpreted by newer servers to have a different column length. (Bug #6913) See Section 2.6.2, Passer de la version 4.0 la version 4.1 for a discussion of this problem and what to do about it. InnoDB: When MySQL/InnoDB is compiled on Mac OS X 10.2 or earlier, detect the operating system version at run time and use the fcntl() file flush method on Mac OS X versions 10.3 and later. Apple had disabled fsync() in Mac OS X for internal disk drives, which caused corruption at power outages. InnoDB: A shared record lock (LOCK_REC_NOT_GAP) is now taken for a matching record in the foreign key check because inserts can be allowed into gaps. InnoDB: Relaxed locking in INSERT...SELECT, single table UPDATE...SELECT and single table DELETE...SELECT clauses when innobase_locks_unsafe_for_binlog is used and isolation level of the transaction is not serializable. InnoDB uses consistent read in these cases for a selected table. Bogues corrigs : FOUND_ROWS() returned an incorrect value after a SELECT SQL_CALC_FOUND_ROWS DISTINCT statement that selected constants and included GROUP BY and LIMIT clauses. (Bug #7945) Fixed a bug in cardinality estimations for HASH indexes of TEMPORARY tables created using MEMORY storage engine. As a result queries that were using this index (as shown by EXPLAIN) could have returned incorrect results. (Bug #8371) Corrected a problem with references to DUAL where statements such as SELECT 1 AS a FROM DUAL would succeed but statements such as SELECT 1 AS a FROM DUAL LIMIT 1 would fail. (Bug #8023) Fixed a server crash caused by DELETE FROM tbl_name ... WHERE ... ORDER BY tbl_name.col_name when the ORDER BY column was qualified with the table name. (Bug #8392) mysqld had problems finding its language files if the basedir value was specified as a very long pathname. (Bug #8015) Updates were being written to the binary log when there were binlog-do-db or binlog-ignoredb options even when there was no current database, contrary to Section 5.9.4, Le log binaire . (Bug #6749) Fixed conversion of floating-point values to character fields when the absolute value of the float was less than 1, and also fixed calculation of length for negative values. (Bug #7774) Column headers in query results retrieved from the query cache could be corrupted when a non-4.1 client was served a result originally generated for a 4.1 client. The query cache was not keeping track of which client/server protocol was being used. (Bug #6511)
1183
Fixed LOAD INDEX statement to actually load index in memory. (Bug #8452) If multiple prepared statements were executed without retrieving their results, executing one of them again would cause the client program to crash. (Bug #8330) Non-numeric values inserted into a YEAR column were being stored as 2000 rather than as 0000. (Bug #6067) Fixed a failure of multiple-table updates to replicate properly on slave servers when --replicate*-table options had been specified. (Bug #7011) mysql_stmt_close() C API function was not clearing an error indicator when a previous prepare call failed, causing subsequent invocations of error-retrieving calls to indicate spurious error values. (Bug #7990) Fixed failure of CREATE TABLE ... LIKE Windows when the source or destination table was located in a symlinked database directory. (Bug #6607) With lower_case_table_names set to 1, mysqldump on Windows could write the same table name in different lettercase for different SQL statements. Fixed so that consistent lettercase is used. (Bug #5185) HAVING that referred to RAND() or a user-defined function in the SELECT part through an alias could cause a crash or wrong value. (Bug #8216) If one used CONVERT_TZ() function in SELECT, which in its turn was used in CREATE TABLE statements, then system time zone tables were added to list of tables joined in SELECT and thus erroneous result was produced. (Bug #7899) Fixed a bug in CONV() function returning unsigned BIGINT number (third argument is positive, and return value does not fit in 32 bits). (Bug #7751) Fixed a failure of the IN() operator to return correct result if all values in the list were constants and some of them were using substring functions, for example, LEFT(), RIGHT(), or MID(). Fixed problem with SHOW INDEX reporting Sub_part values in bytes rather than characters for columns with a multi-byte character set. (Bug #7943) Fixed a crash in CONVERT_TZ() function when its second or third argument was from a const table (see Section 7.2.1, Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT) ). (Bug #7705) Correct a problem with mysql_config, which was failing to produce proper zlib option for linking under some circumstances. (Bug #6273) Fixed a problem with calculation of number of columns in row comparison against a subquery. (Bug #8020) Fixed erroneous output resulting from SELECT DISTINCT combined with a subquery and GROUP BY. (Bug #7946) Fixed server crash in comparing a nested row expression (for example row(1,(2,3))) with a subquery. (Bug #8022) Fixed server crash resulting from certain correlated subqueries with forward references (referring to an alias defined later in the outer query). (Bug #8025) Fixed server crash resulting from re-execution of prepared statements containing subqueries. (Bug #8125) Removed a dependence of boolean full-text search on --default-character-set option. (Bug #8159) Fixed a crash in a boolean full-text search in certain joins. (Bug #8234)
1184
Fixed erroneous comparison where strings that began with CHAR(31) were considered equal to the empty string. (Bug #8134) Add description of debug command to mysqladmin help output. (Bug #8207) perror.exe was always returning ``Unknown error'' on Windows. See Section 8.12, perror, expliquer les codes d'erreurs . (Bug #7390) Modify SET statements produced by mysqldump to write quoted strings using single quotes rather than double quotes. This avoids problems if the dump file is reloaded while the ANSI_QUOTES SQL mode is in effect. (Bug #8148) Fixed a bug where ALTER TABLE improperly would accept an index on a TIMESTAMP column that CREATE TABLE would reject. (Bug #7884) Fixed a bug in multiple-table UPDATE statements that could cause spurious Table '#sql_....' is full errors if the number of rows to update is big enough. (Bug #7788) Fixed a problem where SHOW INDEX on a MERGE table could crash a debugging version of the server. (Bug #7377) Fixed a problem where adding an ORDER BY clause for an indexed column would cause a SELECT to return an empty result. (Bug #7331) Fixed a problem where ALTER TABLE on a TEMPORARY table with a mixed-lettercase name could cause the table to disappear when lower_case_table_names was set to 2. (Bug #7261) Fixed a problem with key cache statistics being reported incorrectly by the server after receipt of a SIGHUP signal. (Bug #4285) Fixed a problem that caused mysql_stmt_prepare() to be very slow when used in client programs on Windows. (Bug #5787) For indexes, SHOW CREATE TABLE now displays the index type even if it is the default, for storage engines that support multiple index types. (Bug #7235) Fixed a bug where the use of GROUP_CONCAT() with HAVING caused a server crash. (Bug #7769) Fixed a bug where comparing the result of a subquery to a non-existent column caused a server crash on Windows. (Bug #7885) Fixed a bug which caused TIMEDIFF() function to return wrong results if one of its arguments had non-zero microsecond part (Bug #7586). Fixed a bug which caused TIMESTAMP columns with display width specified to be not identical to DATETIME columns when server was run in MAXDB mode (Bug #7418). Fixed a bug in UNION statements that resulted in the wrong number of the examined rows reported in the slow query log. Fixed a bug in a combination of -not and trunc* operators of full-text search. Using more than one truncated negative search term, was causing empty result set. InnoDB: Fixed a bug introduced in 4.1.9 to the Windows version if you used innodb_file_per_table. mysqld would stop and complain about Windows error number 87 in a file operation. (See the Bugs database or the 4.1.9 change notes about a workaround for that bug in 4.1.9). (Bug #8021) InnoDB: Corrected the handling of trailing spaces in the ucs2 character set. (Bug #7350) InnoDB: Use native tmpfile() function on Netware. All InnoDB temporary files are created under sys:\tmp. Previously, InnoDB temporary files were never deleted on Netware.
1185
InnoDB: Fix a race condition that could cause the assertion space->n_pending_flushes == 0 to fail in fil0fil.c, in fil_space_free(), in DROP TABLE or in ALTER TABLE. InnoDB: ALTER TABLE ... ADD CONSTRAINT PRIMARY KEY ... complained about bad foreign key definition. (Bug #7831) InnoDB: Fix a theoretical hang over the adaptive hash latch in InnoDB if one runs INSERT ... SELECT ... (binlog not enabled), or a multi-table UPDATE or DELETE, and only the read tables are InnoDB type, the rest are MyISAM. (Bug #7879) Fixed a bug in max_heap_table_size handling, that resulted in Table is full error when the table was still smaller than the limit. (Bug #7791). Fixed a symlink vulnerability in the mysqlaccess script. Reported by Javier Fernandez-Sanguino Pena and Debian Security Audit Team. (CVE-2005-0004) mysqlbinlog forgot to add backquotes around the collation of user variables (causing later parsing problems as BINARY is a reserved word). (Bug #7793) Ensured that mysqldump --single-transaction sets its transaction isolation level to REPEATABLE READ before proceeding (otherwise if the MySQL server was configured to run with a default isolation level lower than REPEATABLE READ it could give an inconsistent dump). (Bug #7850) Changed mysql client so that including \p as part of a prompt command uses the name of the shared memory connection when the connection is using shared memory. (Bug #7922) Fixed a problem in the server where executing a multi-statement query more than once with the query cache active could yield incorrect result sets. (Bug #7966) Fixed that a 4.1.10 slave can connect to a master < 3.23.50 without hanging (the reason for the hang is a bug in these quite old masters -- SELECT @@unknown_var hangs them -- which was fixed in MySQL 3.23.50). (Bug #7965) Fixed a bug where MySQL was allowing concurrent updates (inserts, deletes) to a table if binary logging is enabled. Changed to ensure that all updates are executed in a serialized fashion, because they are executed serialized when binlog is replayed. (Bug #7879)
1186
Seconds_Behind_Master is NULL (which means ``unknown'') if the slave SQL thread is not running, or if the slave I/O thread is not running or not connected to master. It is zero if the SQL thread has caught up with the I/O thread. It no longer grows indefinitely if the master is idle. InnoDB: Do not acquire an internal InnoDB table lock in LOCK TABLES if AUTOCOMMIT=1. This helps in porting old MyISAM applications to InnoDB. InnoDB table locks in that case caused deadlocks very easily. InnoDB: Print a more descriptive error and refuse to start InnoDB if the size of ibdata files is smaller than what is stored in the tablespace header; innodb_force_recovery overrides this. The MySQL server aborts immediately instead of simply issuing a warning if it is started with the -log-bin option but cannot initialize the binary log at startup (that is, an error occurs when writing to the binary log file or binary log index file). The binary log file and binary log index file now behave like MyISAM when there is a "disk full" or "quota exceeded" error. See Section A.4.3, Comment MySQL gre un disque plein . Bogues corrigs : Fixed problem where running mysql_fix_privilege_tables could result in grant table columns with too-short lengths if the server character set had been set to a multi-byte character set first. (Bug #7539) InnoDB: Fixed the critical bug if you enabled innodb_file_per_table in my.cnf. If you shut down mysqld, records could disappear from the secondary indexes of a table. Unfortunately, on Windows a new Bug #8021 was introduced. Windows users of innodb_file_per_table should put a line innodb_flush_method=unbuffered to their my.cnf or my.ini to work around 8021. (Bug #7496) InnoDB: Fixed a bug : 32-bit mysqld binaries built on HP-UX-11 did not work with InnoDB files greater than 2 GB in size. (Bug #6189) InnoDB: Return a sensible error code from DISCARD TABLESPACE if it fails because the table is referenced by a FOREIGN KEY. InnoDB: Fixed a bug : InnoDB failed to drop a table in the background drop queue if the table was referenced by a FOREIGN KEY constraint. InnoDB: Fixed a bug : if we dropped a table where an INSERT was waiting for a lock to check a FOREIGN KEY constraint, then an assertion would fail in lock_reset_all_on_table(). InnoDB: Fix a little bug: we looked at the physical size of a stored SQL NULL value from a wrong field in the index; this has probably caused no bugs visible to the user. It caused only some extra space to be used in some rare cases. InnoDB: Use the fcntl() file flush method on Mac OS X versions 10.3 and up. Apple had disabled fsync() in Mac OS X for internal disk drives, which caused corruption at power outages. mysqladmin password now checks whether the server has --old-passwords turned on or predates 4.1 and uses the old-format password if so. (Bug #7451) Added a --default-character-set option to mysqladmin to avoid problems when the default character set is not latin1. (Bug #7524) Fix a problem with truncation of FLOAT values. (Bug #7361) Fixed a bug in PROCEDURE ANALYSE(), which did not quote some ENUM values properly. (Bug #2813) Fixed a bug that caused incorrect results for complex datetime expressions containing casts of datetime values to TIME or DATE values. (Bug #6914)
1187
Include compression library flags in the output from mysql_config --lib_r. (Bug #7021) Corrected a problem with mysql_config not producing all relevant flags from CFLAGS. (Bug #6964) Corrected a problem with mysqld_safe not properly capturing output from ps. (Bug #5878) Fixed a bug that caused a linking failure when linking both the MySQL client library and IMAP library. (Bug #7428) Fixed table corruption bug when using INSERT DELAYED with prepared statements. Fixed a bug that caused microseconds to be gobbled from the string result of the STR_TO_DATE function, if there is some other specifier in the format string following %f. (Bug #7458) Made the MySQL server accept executing SHOW CREATE DATABASE even if the connection has an open transaction or locked tables. Refusing it made mysqldump --single-transaction sometimes fail to print a complete CREATE DATABASE statement for some dumped databases. (Bug #7358) Fixed that, when encountering a ``disk full'' or ``quota exceeded'' write error, MyISAM sometimes didn't sleep and retry the write, thus resulting in a corrupted table. (Bug #7714) Fixed that --expire-log-days was not honored if using only transactions. (Bug #7236) Fixed that a slave could crash after replicating many ANALYZE TABLE, OPTIMIZE TABLE, or REPAIR TABLE statements from the master. (Bug #6461, Bug #7658)
1188
Fixed a bug in the prepared statements protocol when wrong metadata was sent for SELECT statements not returning a result set (such as SELECT ... INTO OUTFILE). (Bug #6059) Fixed bug which allowed to circumvent missing UPDATE privilege if one had INSERT and SELECT privileges for table with primary key. (Bug #6173) Fixed a bug in libmysqlclient with wrong conversion of negative time values to strings. (Bug #6049). Fixed a bug in libmysqlclient with wrong conversion of zero date values (0000-00-00) to strings. (Bug #6058) Fixed a bug that caused the server to crash on attempt to prepare a statement with RAND(?). (Bug #5985) Fixed a bug with handling of DATE, TIME, and DATETIME columns in the binary protocol. The problem is compiler-specific and could have been observed on HP-UX, AIX, Solaris9, when compiling with native compiler. (Bug #6025) Fixed a bug with handling of TINYINT columns in the binary protocol. The problem is specific to platforms where the C compiler has the char data type unsigned by default. (Bug #6024) Fixed problem introduced in MySQL 4.0.21 where a connection starting a transaction, doing updates, then FLUSH TABLES WITH READ LOCK, then COMMIT, would cause replication slaves to stop complaing about error 1223. Bug surfaced when using the InnoDB innobackup script. (Bug #5949)
1189
Fixed a bug that caused the server to sometimes choose non-optimal execution plan for a prepared statement executed with changed placeholder values. (Bug #6042) InnoDB: Make the check for excessive semaphore waits tolerate glitches in the system clock (do not crash the server if the system time is adjusted while InnoDB is under load.). (Bug #5898) InnoDB: Fixed a bug in the InnoDB FOREIGN KEY parser that prevented ALTER TABLE of tables containing # in their names. (Bug #5856) InnoDB: Fixed a bug that prevented ALTER TABLE t DISCARD TABLESPACE from working. (Bug #5851) InnoDB: SHOW CREATE TABLE now obeys the SET SQL_MODE=ANSI and SET SQL_QUOTE_SHOW_CREATE=0 settings. (Bug #5292) InnoDB: Fixed a bug that caused CREATE TEMPORARY TABLE ... ENGINE=InnoDB to terminate mysqld when running in innodb_file_per_table mode. Per-table tablespaces for temporary tables from now on are created in the temporary directory of mysqld. (Bug #5137) InnoDB: Fixed some (not all) UTF-8 bugs in column prefix indexes. (Bug #5975) InnoDB: If one updated a column so that its size changed, or updated it to an externally stored (TEXT or BLOB) value, then ANOTHER externally stored column would show up as 512 bytes of good data + 20 bytes of garbage in a consistent read that fetched the old version of the row. (Bug #5960) InnoDB: Change error code to HA_ERR_ROW_IS_REFERENCED if we cannot DROP a parent table referenced by a FOREIGN KEY constraint; this error number is less misleading than the previous number HA_ERR_CANNOT_ADD_FOREIGN, but misleading still. (Bug #6202) Fixed REVOKE ALL PRIVILEGES, GRANT OPTION FROM user so that all privileges are revoked correctly. (Bug #5831) Fixed a bug that caused the server to crash when character set conversion was implicitly used in prepared mode; for example, as in 'abc' LIKE CONVERT('abc' as utf8). (Bug #5688) The mysql_change_user() C API function now frees all prepared statements associated with the connection. (Bug #5315) Fixed a bug when inserting NULL into an AUTO_INCREMENT column failed, when using prepared statements. (Bug #5510) Fixed slave SQL thread so that the SET COLLATION_SERVER... statements it replicates don't advance its position (so that if it gets interrupted before the actual update query, it later redoes the SET). (Bug #5705) Fixed that if the slave SQL thread found a syntax error in a query (which should be rare, as the master parsed it successfully), it stops. (Bug #5711) Fixed that if a write to a MyISAM table fails because of a full disk or an exceeded disk quota, it prints a message to the error log every 10 minutes, and waits until disk space becomes available. (Bug #3248) Now MySQL does not prefer columns, which are mentioned in select list but are renamed, over columns from other tables participating in FROM clause when it resolves GROUP BY clause (e.g. SELECT t1.a AS c FROM t1, t2 ORDER BY a produces an error if both t1 and t2 tables contain a column). (Bug #4302) Behavior of ALTER TABLE converting column containing NULL values to AUTO_INCREMENT column is no longer affected by NO_AUTO_VALUE_ON_ZERO mode. (Bug #5915).
1190
InnoDB: Added configuration option innodb_autoextend_increment for setting the size in megabytes by which InnoDB tablespaces are extended when they become full. The default value is 8, corresponding to the fixed increment of 8MB in previous versions of MySQL. Bogues corrigs : Fixed a bug which caused the server to crash on attempt to execute a prepared statement with BETWEEN ? AND ? and a datetime column. (Bug #5748) Fixed name resolving of external fields of subqueries if subquery placed in select list of query with grouping. (Bug #5326) Fixed detection of using same table for updating and selecting in multi-update queries. (Bug #5455) The values of the max_sort_length, sql_mode, and group_concat_max_len system variables now are stored in the query cache with other query information to avoid returning an incorrect result from the query cache. (Bug #5394) (Bug #5515) Fixed syntax analyzer with sql_mode=IGNORE_SPACE. It happened to take phrases like default .07 as identifier.identifier. (Bug #5318) Fixed illegal internal field length of user variables of integer type. This showed up when creating a table as SELECT @var_name. (Bug #4788) Fixed a buffer overflow in prepared statements API (libmysqlclient) when a statement containing thousands of placeholders was executed. (Bug #5194) Fixed a bug in the server when after reaching a certain limit of prepared statements per connection (97), statement ids began to overlap, so occasionally wrong statements were chosen for execution. (Bug #5399) Fixed a bug in prepared statements when LIKE used with arguments in different character sets crashed server on first execute. (Bug #4368) Fixed a bug in prepared statements when providing '0000-00-00' date to a parameter lead to server crash. (Bug #4231, Bug #4562) Fixed a bug in OPTIMIZE TABLE that could cause table corruption on FULLTEXT indexes. (Bug #5327) InnoDB: Fixed a bug that InnoDB only allowed a maximum of 1000 connections inside InnoDB at the same time. A higher number could cause an assertion failure in sync0arr.c, line 384. Now we allow 1000, 10000, or 50000, depending on the buffer pool size. (Bug #5414)
1191
Added Latin language collations for the ucs2 and utf8 Unicode character sets. These are called ucs2_roman_ci and utf8_roman_ci. Corrected the name of the Mac OS X StartupItem script (it must match the name of the subdirectory, which was renamed to MySQLCOM in MySQL 4.1.2). Thanks to Bryan McCormack for reporting this. Added --start-datetime, --stop-datetime, --start-position, and --stop-position options to mysqlbinlog. These make point-in-time recovery easier. Killing a CHECK TABLE statement does not result in the table being marked as ``corrupted'' any more; the table remains as if CHECK TABLE had not even started. See Section 13.5.4.3, Syntaxe de KILL . Made the MySQL server ignore SIGHUP and SIGQUIT on Mac OS X 10.3. This is needed because under this OS, the MySQL server receives lots of these signals (reported as Bug #2030). Bogues corrigs : Fixed a bug that caused libmysql to crash when attempting to fetch a value of MEDIUMINT column. (Bug #5126) Fixed a bug that caused the MySQL server to crash when attempting to execute a prepared statement with SELECT ... INTO @var for a second time. (Bug #5034) Fixed execution of optimized IN subqueries that use compound indexes. (Bug #4435) Prohibited resolving of table fields in inner queries if fields do not take part in grouping for queries with grouping (inside aggregate function arguments, all table fields are still allowed). (Bug #4814) Fixed a crash after SLAVE STOP if the IO thread was in a special state. (Bug #4629) Fixed an old bug in concurrent accesses to MERGE tables (even one MERGE table and MyISAM tables), that could have resulted in a crash or hang of the server. (Bug #2408) Fixed a bug that caused server crash on attempt to execute for a second time a prepared statement with NOT in WHERE or ON clauses. (Bug #4912) MATCH ... AGAINST now works in a subquery. (Bug #4769) Fixed a bug that omitted the .err extension of the error log file (--log-error) when the hostname contained a domain name. The domain name is now replaced by the extension. (Bug #4997) Fixed a crash in myisamchk. (Bug #4901) Fixed a bug which caused server crash if one used the CONVERT_TZ() function with time zone described in database as parameter and this time zone was not used before. (Bug #4508) Support for %T, %r, %V, %v and %X, %x format specifiers was added to STR_TO_DATE() function. (Bug #4756) Fixed a bug (hang) in NATURAL JOIN where joined table had no common column. (Bug #4807) Fixed a crash caused by UNHEX(NULL). (Bug #4441) mysql_fix_privilege_tables didn't correctly handle the argument of its --password=# option. (Bug #4240, Bug #4543) Fixed that mysqlbinlog --read-from-remote-server sometimes couldn't accept 2 binary logs on command line. (Bug #4507) Fixed that mysqlbinlog --position --read-from-remote-server had wrong # at lines. (Bug #4506) If CREATE TEMPORARY TABLE t SELECT failed while loading the data, the temporary table was not dropped. (Bug #4551)
1192
Fixed that when a multiple-table DROP TABLE failed to drop a table on the master server, the error code was not written to the binary log. (Bug #4553) When the slave SQL thread was replicating a LOAD DATA INFILE statement, it didn't show the statement in the output of SHOW PROCESSLIST. (Bug #4326) Fixed an assertion failure when reading the grant tables (Bug #4407) Fixed that CREATE TABLE ... TYPE=HEAP ... AS SELECT... caused replication slave to stop. (Bug #4971) Fixed that mysql_options(...,MYSQL_OPT_LOCAL_INFILE,...) failed to disable LOAD DATA LOCAL INFILE. (Bug #5038) Fixed that disable-local-infile option had no effect if client read it from a configuration file using mysql_options(...,MYSQL_READ_DEFAULT,...). (Bug #5073) Fixed that SET GLOBAL SYNC_BINLOG did not work on some platforms (Mac OS X). (Bug #5064) Fixed that mysql-test-run failed on the rpl_trunc_binlog test if running test from the installed (the target of 'make install') directory. (Bug #5050) Fixed that mysql-test-run failed on the grant_cache test when run as Unix user 'root'. (Bug #4678) Fixed an unlikely deadlock which could happen when using KILL. (Bug #4810) Fixed a crash when one connection got KILLed while it was doing START SLAVE. (Bug #4827) Made FLUSH TABLES WITH READ LOCK block COMMIT if server is running with binary logging; this ensures that the binary log position is trustable when doing a full backup of tables and the binary log. (Bug #4953) Fixed that the counter of an auto_increment column was not reset by TRUNCATE TABLE if the table was a temporary table. (Bug #5033) Fixed bug which caused error to be reported when column from ORDER BY clause was present in two tables participating in SELECT even if the second instance of column in select list was renamed. (Bug #4302)
1193
The --defaults-file=file_name option now requires that the filename must exist (safety fix). (Bug #3413) mysqld_multi now creates the log in datadir (from [mysqld] section in my.cnf or compiled in), not in /tmp - vulnerability id CVE-2004-0388. Thanks to Christian Hammers from Debian Security Team for reporting this! Warning: Incompatible change! String comparison now works according to the SQL standard. Because we have that 'a' = 'a ' then from it must follow that 'a' > 'a\t'. (The latter was not the case before 4.1.2.) To implement it, we had to change how storage engines compare strings internally. As a side effect, if you have a table where a CHAR or VARCHAR column in some row has a value with the last character less than ASCII(32), you will have to repair this table. CHECK TABLES will tell you if this problem exists. (Bug #3152) Added support for DEFAULT CURRENT_TIMESTAMP and for ON UPDATE CURRENT_TIMESTAMP specifications for TIMESTAMP columns. Now you can explicitly say that a TIMESTAMP column should be set automatically to the current timestamp for INSERT and/or UPDATE statements, or even prevent the column from updating automatically. Only one column with such an auto-set feature per table is supported. TIMESTAMP columns created with earlier versions of MySQL behave as before. Behavior of TIMESTAMP columns that were created without explicit specification of default/on as earlier depends on its position in table: If it is the first TIMESTAMP column, it will be treated as having been specified as TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. In other cases, it would be treated as a TIMESTAMP DEFAULT 0 column. NOW is supported as an alias for CURRENT_TIMESTAMP. Warning: Incompatible change! Unlike in previous versions, explicit specification of default values for TIMESTAMP column is never ignored and turns off the auto-set feature (unless you have CURRENT_TIMESTAMP as the default). Warning: Incompatible change! Renamed prepared statements C API functions: Old Name mysql_bind_param() mysql_bind_result() mysql_prepare() mysql_execute() mysql_fetch() mysql_fetch_column() mysql_param_count() mysql_param_result() mysql_get_metadata() New Name mysql_stmt_bind_param() mysql_stmt_bind_result() mysql_stmt_prepare() mysql_stmt_execute() mysql_stmt_fetch() mysql_stmt_fetch_column() mysql_stmt_param_count() mysql_stmt_param_metadata() mysql_stmt_result_metadata()
mysql_send_long_data() mysql_stmt_send_long_data() Now all functions that operate with a MYSQL_STMT structure begin with the prefix mysql_stmt_. Warning: Incompatible change! The signature of the mysql_stmt_prepare() function was changed to int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length). To create a MYSQL_STMT handle, you should use the mysql_stmt_init() function. SHOW GRANTS with no FOR clause or with FOR CURRENT_USER() shows the privileges for the current session. The improved character set support introduced in MySQL 4.1.0 for the MyISAM and HEAP storage engines is now available for InnoDB as well. A name of ``Primary'' no longer can be specified as an index name. (That name is reserved for the PRIMARY KEY if the table has one.) (Bug #856)
1194
MySQL now issues a warning when a SET or ENUM column with duplicate values in the list is created. (Bug #1427) Now SQL_SELECT_LIMIT variable has no influence on subqueries. (Bug #2600) UNHEX() function implemented. See Section 12.3, Fonctions de chanes de caractres . History in command line client does not store multiple copies of identical queries that are run consecutively. Multi-line queries in the command line client now are stored as a single line. UUID() function implemented. Note that it does not work with replication yet. See Section 12.8.4, Fonctions diverses . Prepared statements with all types of subqueries fixed. MySQL now supports up to 64 keys per table. MyISAM tables now support keys up to 1000 bytes long. MyISAM and InnoDB tables now support index prefix lengths up to 1000 bytes long. If you try to create a key with a key part that is too long, and it is safe to auto-truncate it to a smaller length, MySQL now does so. A warning is generated, rather than an error. The ft_boolean_syntax variable now can be changed while the server is running. See Section 5.2.3, Variables serveur systme . REVOKE ALL PRIVILEGES, GRANT FROM user_list is changed to a more consistent REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_list. (Bug #2642) Internal string-to-number conversion now supports only SQL:2003 compatible syntax for numbers. In particular, '0x10'+0 will not work anymore. (Actually, it worked only on some systems before, such as Linux. It did not work on others, such as FreeBSD or Solaris. Making these queries OSindependent was the goal of this change). Use CONV() to convert hexadecimal numbers to decimal. E.g. CONV(MID('0x10',3),16,10)+0. mysqlhotcopy now works on NetWare. ALTER TABLE DROP PRIMARY KEY no longer drops the first UNIQUE index if there is no primary index. (Bug #2361) Added latin1_spanish_ci (Modern Spanish) collation for the latin1 character set. Added the ENGINE table option as a synonym for the TYPE option for CREATE TABLE and ALTER TABLE. Added the --default-storage-engine server option as a synonym for --default-tabletype. Added the storage_engine system variable as a synonym for table_type. Added init_connect and init_slave server variables. The values should be SQL statements to be executed when each client connects or each time a slave's SQL thread starts, respectively. C API enhancement: SERVER_QUERY_NO_INDEX_USED and SERVER_QUERY_NO_GOOD_INDEX_USED flags are now set in the server_status field of the MYSQL structure. It is these flags that make the query to be logged as slow if mysqld was started with --log-slow-queries --log-queries-not-using-indexes. For replication of MEMORY (HEAP) tables: Made the master automatically write a DELETE FROM statement to its binary log when a MEMORY table is opened for the first time since master's startup. This is for the case where the slave has replicated a non-empty MEMORY table, then the master is
1195
shut down and restarted: the table is now empty on master; the DELETE FROM empties it on slave too. Note that even with this fix, between the master's restart and the first use of the table on master, the slave still has out-of-date data in the table. But if you use the init-file option to populate the MEMORY table on the master at startup, it ensures that the failing time interval is zero. (Bug #2477) When a session having open temporary tables terminates, the statement automatically written to the binary log is now DROP TEMPORARY TABLE IF EXISTS instead of DROP TEMPORARY TABLE, for more robustness. The MySQL server now returns an error if SET SQL_LOG_BIN or SET SQL_LOG_UPDATE is issued by a user without the SUPER privilege (in previous versions it just silently ignored the statement in this case). Changed that when the MySQL server has binary logging disabled (that is, no log-bin option was used) then no transaction binlog cache is allocated for connections (this should save binlog_cache_size bytes of memory (32 kilobytes by default) for every connection). Added Binlog_cache_use and Binlog_cache_disk_use status variables that count the number of transactions that used transaction binary log and that had to flush this temporary binary log to disk instead of using only buffer in memory. They can be used for tuning the binlog_cache_size system variable. Added option --replicate-same-server-id. The Mac OS X Startup Item has been moved from the directory /Library/StartupItems/MySQL to /Library/StartupItems/MySQLCOM to avoid a file name collision with the MySQL Startup Item installed with Mac OS X Server. See Section 2.8.2, Notes relatives Mac OS X . Bogues corrigs : Fixed check of EXPLAIN of UNION. (Bug #3639) Fixed a bug in a query that used DISTINCT and ORDER BY by column's real name, while the column had an alias, specified in SELECT clause. (Bug #3681) Fixed crash of group_concat on expression with ORDER BY and external ORDER BY in a query. (Bug #3752) Fixed a bug in ALL/SOME subqueries in case of optimisation (key field present in subquery). (Bug #3646) Fixed a bug in SHOW GRANTS and EXPLAIN SELECT character set conversion. (Bug #3403) Prepare statements parameter do not cause error message as fields used in select list but not included in ORDER BY list. UNION statements did not consult SQL_SELECT_LIMIT value when set. This is now fixed properly, which means that this limit is applied to the top level query, unless LIMIT for entire UNION is used. Fixed a bug in multiple-table UPDATE statements that resulted in an error when one of the tables was not updated but was used in the nested query, contained therein. Fixed mysql_stmt_send_long_data() behavior on second execution of prepared statement and in case when long data had zero length. (Bug #1664) Fixed crash on second execution of prepared statement with UNION. (Bug #3577) Fixed incorrect results of aggregate functions in subquery with empty result set. (Bug #3505) You can now call mysql_stmt_attr_set(..., STMT_ATTR_UPDATE_MAX_LENGTH) to tell the client library to update MYSQL_FIELD->max_length when doing mysql_stmt_store_result(). (Bug #1647). Added support for unsigned integer types to prepared statement API (Bug #3035).
1196
Fixed crash in prepared statements when subquery in the FROM clause with parameter used. (Bug #3020) Fixed unknown error when negative value bind to unsigned. (Bug #3223) Fixed aggregate function in prepared statements. (Bug #3360) Incorrect error message when wrong table used in multiple-table DELETE statement in prepared statements. (Bug #3411) Requiring UPDATE privilege for tables which will not be updated in multiple-table UPDATE statement in prepared statements. Fixed prepared statement support for INSERT, REPLACE, CREATE, DELETE, SELECT, DO, SET and SHOW. All other commands are prohibited via prepared statement interface. (Bug #3398, Bug #3406, Bug #2811) Fixed a lot of bugs in GROUP_CONCAT(). (Bug #2695, Bug #3381, Bug #3319) Added optimization that allows for prepared statements using a large number of tables or tables with a large number of columns to be re-executed significantly faster. (Bug #2050) Fixed bug that caused execution of prepared statements to fail then table that this statement were using left table cache. This bug showed up as if this prepared statement used random garbage as column names or as server crashes. (Bug #3307) Fixed a problem resulting from setting the character_set_results variable to NULL. (Bug #3296) Fixed query cache statistics. Fixed bug in ANALYZE TABLE on a BDB table inside a transaction that hangs server thread. (Bug #2342) Fixed a symlink vulnerability in mysqlbug script. (Bug #3284) Fixed a bug in parallel repair (myisamchk -p, myisam_repair_threads); sometimes the repair process failed to repair a table. (Bug #1334) A query that uses both UNION [DISTINCT] and UNION ALL now works correctly. (Bug #1428) Table default character set affects LONGBLOB columns. (Bug #2821) CONCAT_WS() makes the server die in case of illegal mix of collations. (Bug #3087) UTF8 charset breaks joins with mixed column/string constant. (Bug #2959) Fixed DROP DATABASE to report number of tables deleted. Fixed memory leak in the client library when statement handle was freed on closed connection (call to mysql_stmt_close after mysql_close). (Bug #3073) Fixed server segfaults when processing malformed prepared statements commands. (Bug #2795, Bug #2274) Fixed using subqueries with OR and AND functions. (Bug #2838) Fixed comparison of tables/database names with --lower_case_table_names option. (Bug #2880) Removed try to check NULL if index built on column where NULL is impossible in IN subquery optimization. (Bug #2393) Fixed incorrect parsing of subqueries in the FROM clause. (Bug #2421)
1197
Fixed processing of RAND() in subqueries with static tables. (bug #2645) Fixed bug with quoting of table names in mysqldump for various values of sql_mode of server. (Bug #2591) Fixed bug with storing values that are out of range for DOUBLE and FLOAT columns. (Bug #2082) Fixed bug with compiling --with-pstack with binutils 2.13.90. (Bug #1661) Fixed a bug in the GRANT system. When a password was assigned to an account at the global level and then privileges were granted at the database level (without specifying any password), the existing password was replaced temporarily in memory until the next FLUSH PRIVILEGES operation or the server was restarted. (Bug #2953) Fixed a bug in full-text search on multi-byte character set (such as UTF8) that appeared when a search word was shorter than a matching word from the index (for example, searching for ``Uppsala'' when table data contain ``Uppsa*la''). (Bug #3011) Fixed a bug that made Max_used_connections to be less than the actual maximum number of connections in use simultaneously. Fixed calculation of Index_length in HEAP table status for BTREE indexes. (Bug #2719) Fixed mysql_stmt_affected_rows() call to always return number of rows affected by given statement. (Bug #2247) Fixed crash in MATCH ... AGAINST() on a phrase search operator with a missing closing double quote. (Bug #2708) Fixed output of mysqldump --tab. (Bug #2705) Fix for a bug in UNION operations that prevented proper handling of NULL columns. This happened only if a column in the first SELECT node was NOT NULL. (Bug #2508) Fix for a bug in UNION operations with InnoDB storage engine, when some columns from one table where used in one SELECT statement and some were used in another SELECT statement. (Bug #2552) Fixed a few years old bug in the range optimizer that caused a segmentation fault on some very rare queries. (Bug #2698) Fixed bug with SHOW CREATE TABLE ... which didn't properly double quotes. (Bug #2593) Queries with subqueries in FROM clause locks all tables at once for now. This also fixed bugs in EXPLAIN of subqueries in FROM output. (Bug #2120) Fixed bug with mysqldump not quoting ``tricky'' names correctly. (Bug #2592) Fix for a bug that prevented table / column privileges from being loaded on startup. (Bug #2546) Fixed bug in replication with CREATE TABLE ... LIKE ... that resulted in a statement not being written to the binary log. (Bug #2557) Fixed memory leak in INSERT ... ON DUPLICATE KEY UPDATE .... (Bug #2438) Fixed bug in the parser, making the syntax CONVERT(expr,type) legal again. Fixed parsing of short-form IP addresses in INET_ATON(). (Bug #2310) Fixed a bug in CREATE ... SELECT that sometimes caused a string column with a multi-byte character set (such as utf8) to have insufficient length to hold the data. Fixed a rare table corruption on adding data (INSERT, REPLACE, UPDATE, etc. but not DELETE) to a FULLTEXT index. (Bug #2417)
1198
Compile the MySQL-client RPM package against libreadline instead of libedit. (Bug #2289) Fix for a crashing bug that was caused by not setting vio_timeout() virtual function for all protocols. This bug occurred on Windows. (Bug #2025) Fix for a bug that caused mysql client program to erroneously cache the value of the current database. (Bug #2025) Fix for a bug that caused client/server communication to be broken when mysql_set_server_option() or mysql_get_server_option() were invoked. (Bug #2207) Fix for a bug that caused wong results when CAST() was applied on NULL to signed or unsigned integer column. (Bug #2219) Fix for a crashing bug that occurred in the mysql client program when database name was longer then expected. (Bug #2221) Fixed a bug in CHECK TABLE that sometimes resulted in a spurious error Found key at page ... that points to record outside datafile for a table with a FULLTEXT index. (Bug #2190) Fixed bug in GRANT with table-level privilege handling. (Bug #2178) Fixed bug in ORDER BY on a small column. (Bug #2147) Fixed a bug with the INTERVAL() function when 8 or more comparison arguments are provided. (Bug #1561) Packaging: Fixed a bug in the Mac OS PKG postinstall script (mysql_install_db was called with an obsolete argument). Packaging: Added missing file mysql_create_system_tables to the server RPM package. This bug was fixed for the 4.1.1 RPMs by updating the MySQL-server RPM from MySQLserver-4.1.1-0 to MySQL-server-4.1.1-1. The other RPMs were not affected by this change. Fixed a bug in myisamchk and CHECK TABLE that sometimes resulted in a spurious error Found key at page ... that points to record outside datafile for a table with a FULLTEXT index. (Bug #1977) Fixed a hang in full-text indexing of strings in multi-byte (all besides utf8) charsets. (Bug #2065) Fixed a crash in full-text indexing of UTF8 data. (Bug #2033) Replication: a rare race condition in the slave SQL thread that could lead to an incorrect complaint that the relay log is corrupted. (Bug #2011) Replication: If a client connects to a slave server and issues an administrative statement for a table (for example, OPTIMIZE TABLE or REPAIR TABLE), this could sometimes stop the slave SQL thread. This does not lead to any corruption, but you must use START SLAVE to get replication going again. (Bug #1858) Replication: in the slave SQL thread, a multiple-table UPDATE could produce an incorrect complaint that some record was not found in one table, if the UPDATE was preceded by a INSERT ... SELECT. (Bug #1701) Replication: sometimes the master gets a non-fatal error during the execution of a statement but finally the statements succeeds (for example, a write to a MyISAM table first receives "no space left on device" but is able to finally complete, see Section A.4.3, Comment MySQL gre un disque plein ); the bug was that the master forgot to reset the error code to 0 after success, so the error code got into its binary log, thus making the slave giving false alarms like "did not get the same error as on master". (Bug #2083)
1199
Removed a misleading "check permissions on master.info" from a replication error message, because the cause of the problem could be different from permissions. (Bug #2121) Fixed a crash when the replication slave was unable to create the first relay log. (Bug #2145) ALTER DATABASE caused the client to hang if the database did not exist. (Bug #2333) Multiple-table DELETE statements were never replicated by the slave if there were any replicate*-table options. (Bug #2527) Fixed bug in ALTER TABLE RENAME, when rename to the table with the same name in another database silently dropped destination table if it existed. (Bug #2628) The MySQL server did not report any error if the query (submitted through mysql_real_query() or mysql_prepare()) was terminated by garbage characters (which can happen if you pass a wrong length parameter to mysql_real_query() or mysql_prepare()); the result was that the garbage characters were written into the binary log. (Bug #2703) Fixed bug in client library which caused mysql_fetch and mysql_stmt_store_result() to hang if they were called without prior call of mysql_execute(). Now they give an error instead. (Bug #2248) Made clearer the error message which one gets when an update is refused because of the readonly option. (Bug #2757) Fixed that replicate-wild-*-table rules apply to ALTER DATABASE when the table pattern is '%', like it is already the case for CREATE DATABASE and DROP DATABASE. (Bug #3000) Fixed that when a Rotate event is found by the slave SQL thread in the middle of a transaction, the value of Relay_Log_Pos in SHOW SLAVE STATUS remains correct. (Bug #3017) Corrected the master's binary log position that InnoDB reports when it is doing a crash recovery on a slave server. (Bug #3015) Changed the column Seconds_Behind_Master in SHOW SLAVE STATUS to never show a value of -1. (Bug #2826) Changed that when a DROP TEMPORARY TABLE statement is automatically written to the binary log when a session ends, the statement is recorded with an error code of value zero (this ensures that killing a SELECT on the master does not result in a superfluous error on the slave). (Bug #3063) Changed that when a thread handling INSERT DELAYED (also known as a delayed_insert thread) is killed, its statements are recorded with an error code of value zero (killing such a thread does not endanger replication, so we thus avoid a superfluous error on the slave). (Bug #3081) Fixed deadlock when two START SLAVE commands were run at the same time. (Bug #2921) Fixed that a statement never triggers a superfluous error on the slave, if it must be excluded given the replicate-* options. The bug was that if the statement had been killed on the master, the slave would stop. (Bug #2983) The --local-load option of mysqlbinlog now requires an argument. Fixed a segmentation fault when running LOAD DATA FROM MASTER after RESET SLAVE. (Bug #2922) mysqlbinlog --read-from-remote-server read all binary logs following the one that was requested. It now stops at the end of the requested file, the same was it does when reading a local binary log. (Bug #3204) Fixed mysqlbinlog --read-from-remote-server to print the exact positions of events in the "at #" lines. (Bug #3214)
1200
Fixed a rare error condition that caused the slave SQL thread spuriously to print the message Binlog has bad magic number and stop when it was not necessary to do so. (Bug #3401) Fixed the Exec_master_log_pos column and its disk image in the relay-log.info file to be correct if the master had version 3.23. (The value was too big by six bytes.) This bug does not exist in MySQL 5.0. (Bug #3400) Fixed mysqlbinlog not to forget to print a USE statement under rare circumstances where the binary log contained a LOAD DATA INFILE statement. (Bug #3415) Fixed a memory corruption when replicating a LOAD DATA INFILE when the master had version 3.23. Some smaller problems remain in this setup, See Section 6.7, Fonctionnalits de la rplication et problmes connus . (Bug #3422) Multiple-table DELETE statements were always replicated by the slave if there were some replicate-*-ignore-table options and no replicate-*-do-table options. (Bug #3461) Fixed a crash of the MySQL slave server when it was built with --with-debug and replicating itself. (BUG #3568) Fixed that in some replication error messages, a very long query caused the rest of the message to be invisible (truncated), by putting the query last in the message. (Bug #3357)
1201
The mysql_next_result() C API function now returns -1 if there are no more result sets. Renamed CLIENT_MULTI_QUERIES connect option flag to CLIENT_MULTI_STATEMENTS. To allow for a transition period, the old option will continue to be recognized for a while. Require DEFAULT before table and database default character set. This enables us to use ALTER TABLE tbl_name ... CHARACTER SET=... to change the character set for all CHAR, VARCHAR, and TEXT columns in a table. Added MATCH ... AGAINST( ... WITH QUERY EXPANSION) and the ft_query_expansion_limit server variable. Removed unused ft_max_word_len_for_sort system variable. Removed unused ft_max_word_len_for_sort variable from myisamchk. Full-text search now supports multi-byte character sets and the Unicode utf8 character set. (The Unicode ucs2 character set is not yet supported.) Phrase search in MATCH ... AGAINST ( ... IN BOOLEAN MODE) no longer matches partial words. Added aggregate function BIT_XOR() for bitwise XOR operations. Replication over SSL now works. The START SLAVE statement now supports an UNTIL clause for specifying that the slave SQL thread should be started but run only until it reaches a given position in the master's binary logs or in the slave's relay logs. Produce warnings even for single-row INSERT statements, not just for multiple-row INSERT statements. Previously, it was necessary to set SQL_WARNINGS=1 to generate warnings for singlerow statements. Added delimiter (\d) command to the mysql command-line client for changing the statement delimiter (terminator). The default delimiter is semicolon. CHAR, VARCHAR, and TEXT columns now have lengths measured in characters rather than in bytes. The character size depends on the column's character set. This means, for example, that a CHAR(n) column for a multi-byte character set will take more storage than before. Similarly, index values on such columns are measured in characters, not bytes. LIMIT no longer accepts negative arguments (they used to be treated as very big positive numbers before). The DATABASE() function now returns NULL rather than the empty string if there is no database selected. Added --sql-mode=NO_AUTO_VALUE_ON_ZERO option to suppress the usual behavior of generating the next sequence number when zero is stored in an AUTO_INCREMENT column. With this mode enabled, zero is stored as zero; only storing NULL generates a sequence number. Warning: Incompatible change! Client authentication now is based on 41-byte passwords in the user table, not 45-byte passwords as in 4.1.0. Any 45-byte passwords created for 4.1.0 must be reset after running the mysql_fix_privilege_tables script. Added secure_auth global server system variable and --secure-auth server option that disallow authentication for accounts that have old (pre-4.1.1) passwords. Added --secure-auth option to mysql command-line client. If this option is set, the client refuses to send passwords in old (pre-4.1.1) format. Warning: Incompatible change! Renamed the C API mysql_prepare_result() function to mysql_get_metadata() as the old name was confusing.
1202
Added DROP USER 'user_name'@'host_name' statement to drop an account that has no privileges. The interface to aggregated UDF functions has changed a bit. You must now declare a xxx_clear() function for each aggregate function XXX(). Added new ADDTIME(), DATE(), DATEDIFF(), LAST_DAY(), MAKEDATE(), MAKETIME(), MICROSECOND(), SUBTIME(), TIME(), TIMEDIFF(), TIMESTAMP(), UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP(), and WEEKOFYEAR() functions. Added new syntax for ADDDATE() and SUBDATE(). The second argument now may be a number representing the number of days to be added to or subtracted from the first date argument. Added new type values DAY_MICROSECOND, HOUR_MICROSECOND, MINUTE_MICROSECOND, SECOND_MICROSECOND, and MICROSECOND for DATE_ADD(), DATE_SUB(), and EXTRACT(). Added new %f microseconds format specifier for DATE_FORMAT() and TIME_FORMAT(). All queries in which at least one SELECT does not use indexes properly now are written to the slow query log when long log format is used. It is now possible to create a MERGE table from MyISAM tables in different databases. Formerly, all the MyISAM tables had to be in the same database, and the MERGE table had to be created in that database as well. Added new COMPRESS(), UNCOMPRESS(), and UNCOMPRESSED_LENGTH() functions. When using SET sql_mode='mode' for a complex mode (like ANSI), we now update the sql_mode variable to include all the individual options implied by the complex mode. Added the OLAP (On-Line Analytical Processing) function ROLLUP, which provides summary rows for each GROUP BY level. Added SQLSTATE codes for all server errors. Added mysql_sqlstate() and mysql_stmt_sqlstate() C API client functions that return the SQLSTATE error code for the last error. TIME columns with hour values greater than 24 were returned incorrectly to the client. ANALYZE TABLE, OPTIMIZE TABLE, REPAIR TABLE, and FLUSH statements are now stored in the binary log and thus replicated to slaves. This logging does not occur if the optional NO_WRITE_TO_BINLOG keyword (or its alias LOCAL) is given. Exceptions are that FLUSH LOGS, FLUSH MASTER, FLUSH SLAVE, and FLUSH TABLES WITH READ LOCK are not logged in any case. For a syntax example, see Section 13.5.4.2, Syntaxe de FLUSH . New global system variable relay_log_purge to enable or disable automatic relay log purging. LOAD DATA now produces warnings that can be fetched with SHOW WARNINGS. Added support for syntax CREATE TABLE table2 (LIKE table1) that creates an empty table table2 with a definition that is exactly the same as table1, including any indexes. CREATE TABLE tbl_name (...) TYPE=storage_engine now generates a warning if the named storage engine is not available. The table is still created as a MyISAM table, as before. Most subqueries are now much faster than before. Added PURGE BINARY LOGS as an alias for PURGE MASTER LOGS. Disabled the PURGE LOGS statement that was added in version 4.1.0. The statement now should be issued as PURGE MASTER LOGS or PURGE BINARY LOGS. Added SHOW BDB LOGS as an alias for SHOW LOGS.
1203
Added SHOW MASTER LOGS (which had been deleted in version 4.1.0) as an alias for SHOW BINARY LOGS. Added Slave_IO_State and Seconds_Behind_Master columns to the output of SHOW SLAVE STATUS. Slave_IO_State indicates the state of the slave I/O thread, and Seconds_Behind_Master indicates the number of seconds by which the slave is late compared to the master. The --lower-case-table-names=1 server option now also makes aliases case insensitive. (Bug #534) Changed that the relay log is flushed to disk by the slave I/O thread every time it reads a relay log event. This reduces the risk of losing some part of the relay log in case of brutal crash. Bogues corrigs : Fixed mysql parser not to erroneously interpret ; character within /* ... */ comment as statement terminator. Fixed merging types and length of result set columns for UNION operations. The types and lengths now are determined taking into account values for all SELECT statements in the UNION, not just the first SELECT. Fixed a bug in privilege handling that caused connections from certain IP addresses to be assigned incorrect database-level privileges. A connection could be assigned the database privileges of the previous successful authentication from one of those IP addresses, even if the IP address username and database name were different. (Bug #1636) Error-handling functions were not called properly when an error resulted from [CREATE | REPLACE| INSERT] ... SELECT statements. HASH, BTREE, RTREE, ERRORS, and WARNINGS no longer are reserved words. (Bug #724) Fix for bug in ROLLUP when all tables were const tables. (Bug #714) Fixed a bug in UNION that prohibited NULL values from being inserted into result set columns where the first SELECT of the UNION retrieved NOT NULL columns. The type and max_length of the result column is now defined based on all UNION parts. Fixed name resolution of columns of reduced subqueries in unions. (Bug #745) Fixed memory overrun in subqueries in select list with WHERE clause bigger than outer query WHERE clause. (Bug #726) Fixed a bug that caused MyISAM tables with FULLTEXT indexes created in 4.0.x to be unreadable in 4.1.x. Fixed a data loss bug in REPAIR TABLE ... USE_FRM when used with tables that contained TIMESTAMP columns and were created in 4.0.x. Fixed reduced subquery processing in ORDER BY/GROUP BY clauses. (Bug #442) Fixed name resolution of outer columns of subquery in INSERT/REPLACE statements. (Bug #446) Fixed bug in marking columns of reduced subqueries. (Bug #679) Fixed a bug that made CREATE FULLTEXT INDEX syntax illegal. Fixed a crash when a SELECT that required a temporary table (marked by Using temporary in EXPLAIN output) was used as a derived table in EXPLAIN command. (Bug #251) Fixed a rare table corruption bug in DELETE from a big table with a new (created by MySQL-4.1) fulltext index.
1204
LAST_INSERT_ID() now returns 0 if the last INSERT statement didn't insert any rows. Fixed missing last character in function output. (Bug #447) Fixed a rare replication bug when a transaction spanned two or more relay logs, and the slave was stopped while executing the part of the transaction that was in the second or later relay log. Then replication would resume at the beginning of the second or later relay log, which was incorrect. (It should resume at BEGIN, in the first relay log.) (Bug #53) CONNECTION_ID() now is properly replicated. (Bug #177) The new PASSWORD() function in 4.1 is now properly replicated. (Bug #344) Fixed a bug with double freed memory. Fixed a crashing bug in UNION operations that involved temporary tables. Fixed a crashing bug in DERIVED TABLES when EXPLAIN is used on a DERIVED TABLES with a join. Fixed a crashing bug in DELETE with ORDER BY and LIMIT caused by an uninitialized array of reference pointers. Fixed a bug in the USER() function caused by an error in the size of the allocated string. Fixed a crashing bug when attempting to create a table containing a spatial (GIS) column with a storage engine that does not support spatial types. Fixed a crashing bug in UNION caused by the empty select list and a non-existent column being used in some of the individual SELECT statements. Fixed a replication bug with a 3.23 master and a 4.0 slave: The slave lost the replicated temporary tables if FLUSH LOGS was issued on the master. (Bug #254) Fixed a security bug: A server compiled without SSL support still allowed connections by users who had the REQUIRE SSL option specified for their accounts. When an undefined user variable was used in a updating query on the master (such as INSERT INTO t VALUES(@a), where @a had never been set by this connection before), the slave could replicate the query incorrectly if a previous transaction on the master used a user variable of the same name. (Bug #1331) Fixed bug with prepared statements: Using the ? prepared statement parameter as the argument to certain functions or statement clauses caused a server crash when mysql_prepare() was invoked. (Bug #1500) Fixed bug with prepared statements: after call to mysql_prepare placeholders became allowed in all consequent statements, even if they are not prepared (Bug #1946) SLAVE START (which is a deprecated syntax, START SLAVE should be used instead) could crash the slave. (Bug #2516) Fixed bug in ALTER TABLE RENAME, when rename to the table with the same name in another database silently dropped destination table if it existed. (Bug #2628)
1205
New CHARSET() and COLLATION() functions to return the character set and collation of a string. Allow index type to be specified explicitly for some storage engines via USING type_name syntax in index definition. New function IS_USED_LOCK() for determining the connection identifier of the client that holds a given advisory lock. New more secure client authentication based on 45-byte passwords in the user table. New CRC32() function to compute cyclic redundancy check value. On Windows, we are now using shared memory to communicate between server and client when they are running on the same machine and you are connecting to localhost. REPAIR TABLE of MyISAM tables now uses less temporary disk space when sorting char columns. DATE/DATETIME checking is now a bit stricter to support the ability to automatically distinguish between date, datetime, and time with microseconds. For example, dates of type YYYYMMDD HHMMDD are no longer supported; you must either have separators between each DATE/TIME part or not at all. Server side help for all MySQL functions. One can now type help week in the mysql client and get help for the week() function. Added new mysql_get_server_version() C API client function. Fixed bug in libmysqlclient that fetched column defaults. Fixed bug in mysql command-line client in interpreting quotes within comments. (Bug #539) Added record_in_range() method to MERGE tables to be able to choose the right index when there are many to choose from. Replication now works with RAND() and user variables @var. Allow one to change mode for ANSI_QUOTES on the fly. EXPLAIN SELECT now can be killed. See Section 13.5.4.3, Syntaxe de KILL . REPAIR TABLE now can be killed. See Section 13.5.4.3, Syntaxe de KILL . Allow empty index lists to be specified for USE INDEX, IGNORE INDEX, and FORCE INDEX. DROP TEMPORARY TABLE now drops only temporary tables and doesn't end transactions. Added support for UNION in derived tables. Warning: Incompatible change! TIMESTAMP is now returned as a string of type 'YYYY-MM-DD HH:MM:SS' and different timestamp lengths are not supported. This change was necessary for SQL standards compliance. In a future version, a further change will be made (backward compatible with this change), allowing the timestamp length to indicate the desired number of digits of fractions of a second. New faster client/server protocol that supports prepared statements, bound parameters, and bound result columns, binary transfer of data, warnings. Added database and real table name (in case of alias) to the MYSQL_FIELD structure. Multi-line queries: You can now issue several queries at once and then read the results in one go. In CREATE TABLE foo (a INT not null primary key) the PRIMARY word is now optional.
1206
In CREATE TABLE the attribute SERIAL is now an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE. SELECT ... FROM DUAL is an alias for SELECT .... (To be compatible with some other databases). If one creates a too long CHAR/VARCHAR it's now automatically changed to TEXT or BLOB; One will get a warning in this case. One can specify the different BLOB/TEXT types with the syntax BLOB(length) and TEXT(length). MySQL will automatically change it to one of the internal BLOB/TEXT types. CHAR BYTE is an alias for CHAR BINARY. VARCHARACTER is an alias for VARCHAR. New operators integer MOD integer and integer DIV integer. SERIAL DEFAULT VALUE added as an alias for AUTO_INCREMENT. TRUE and FALSE added as alias for 1 and 0, respectively. Aliases are now forced in derived tables, as per standard SQL. Fixed SELECT .. LIMIT 0 to return proper row count for SQL_CALC_FOUND_ROWS. One can specify many temporary directories to be used in a round-robin fashion with: -tmpdir=dirname1:dirname2:dirname3. Subqueries: SELECT * from t1 where t1.a=(SELECT t2.b FROM t2). Derived tables:
SELECT a.col1, b.col2 FROM (SELECT MAX(col1) AS col1 FROM root_table) a, other_table b WHERE a.col1=b.col1;
Character sets to be defined per column, table and database. Unicode (UTF8) support. New CONVERT(... USING ...) syntax for converting string values between character sets. BTREE index on MEMORY (HEAP) tables. Faster embedded server (new internal communication protocol). One can add a comment per column in CREATE TABLE. SHOW FULL COLUMNS FROM tbl_name shows column comments. ALTER DATABASE. Support for GIS (Geometrical data). See Chapitre 18, Donnes spatiales avec MySQL. SHOW [COUNT(*)] WARNINGS shows warnings from the last command. One can specify a column type for a column in CREATE TABLE ... SELECT by defining the column in the CREATE part.
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
expr SOUNDS LIKE expr same as SOUNDEX(expr)=SOUNDEX(expr). Added new VARIANCE(expr) function returns the variance of expr
1207
One can create a table from the existing table using CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table (LIKE table). The table can be either normal or temporary. New options --reconnect and --skip-reconnect for the mysql client, to reconnect automatically or not if the connection is lost. START SLAVE (STOP SLAVE) no longer returns an error if the slave is already started (stopped); it returns a warning instead. SLAVE START and SLAVE STOP are no longer accepted by the query parser; use START SLAVE and STOP SLAVE instead.
1208
Fixed a deadlock resulting from use of FLUSH TABLES WITH READ LOCK while an INSERT DELAYED statement is in progress. (Bug #7823) Fixed a segmentation fault in mysqlcheck that occurred when the last table checked in --autorepair mode returned an error (such as the table being a MERGE table). (Bug #9492) Fixed faulty display of TIMESTAMP columns retrieved as col_name+0 while the new system variable is set to 1. (Bug #8894) Queries containing CURRENT_USER() incorrectly were registered in the query cache. (Bug #9796) Fixed problems with static variables to allow building on Fedora Core 3. (Bug #6554) An UPDATE that updated only some of the columns in a multiple-column index could result in a loop. (Bug #8942) REPAIR TABLE did not invalidate query results in the query cache that were generated from the table. (Bug #8480) Fixed a bug that caused concurrent inserts to be allowed into the tables in the SELECT ... UNION ... part of INSERT ... SELECT ... UNION .... This could result in the incorrect order of queries in the binary log. (Bug #9922) Fixed a bug that under certain circumstances could allow a privilege escalation via database wildcards in GRANT. (Bug #3924, CVE-2004-0957) <=> was not properly comparing NULL values in the WHERE clause of outer joins. (Bug #8711) InnoDB: Fixed a bug : MySQL-4.0.23 and 4.0.24 could complain that an InnoDB table created with MySQL-3.23.49 or earlier was in the new compact InnoDB table format of 5.0.3 or later, and InnoDB would refuse to use that table. (The same bug exists in 4.1.8 - 4.1.10.) There is nothing wrong with the table, it is mysqld that is in error. Workaround: wait that 4.0.25 or 4.1.11 is released before doing an upgrade, or dump the table and recreate it with any MySQL version >= 3.23.50 before upgrading to 4.0.23 or 4.0.24.
1209
InnoDB: Do not acquire an internal InnoDB table lock in LOCK TABLES if AUTOCOMMIT=1. This helps in porting old MyISAM applications to InnoDB. InnoDB table locks in that case caused deadlocks very easily. Bogues corrigs : AES_DECRYPT(col_name,key) could fail to return NULL for invalid values in col_name, if col_name was declared as NOT NULL. (Bug #8669) FOUND_ROWS() returned an incorrect value after a SELECT SQL_CALC_FOUND_ROWS DISTINCT statement that selected constants and included GROUP BY and LIMIT clauses. (Bug #7945) Queries of the form (SELECT ...) ORDER BY ... were being treated as a UNION. This improperly resulted in only distinct values being returned (because UNION by default eliminates.) (Bug #7672) Index cardinality was not being updated properly for TEMPORARY tables under some circumstances, such as CREATE TABLE ... SELECT followed by ANALYZE TABLE. (Bug #7519) Fixed a server crash caused by DELETE FROM tbl_name ... WHERE ... ORDER BY tbl_name.col_name when the ORDER BY column was qualified with the table name. (Bug #8392) Fixed a bug in MATCH ... AGAINST in natural language mode that could cause a server crash if the FULLTEXT index was not used in a join (EXPLAIN did not show fulltext join mode) and the search query matched no rows in the table (Bug #8522). Platform and architecture information in version information produced for --version option on Windows was always Win95/Win98 (i32). More accurately determine platform as Win32 or Win64 for 32-bit or 64-bit Windows, and architecture as ia32 for x86, ia64 for Itanium, and axp for Alpha. (Bug #4445) Fixed an optimization problem that allowed a negative number to be stored in a DOUBLE UNSIGNED column when it was assigned a value from a signed DOUBLE column. (Bug #7700) Fixed a failure of multiple-table updates to replicate properly on slave servers when --replicate*-table options had been specified. (Bug #7011) Renamed set_bit() and clear_bit() functions in source code to avoid a conflict with functions of the same names in Linux kernel header files. (Bug #7971) Part of the information being used to cache access-permission lookups was not always reinitialized properly, particularly for connections from localhost on Windows. The result was connection failures that appeared to occur randomly. (Bug #5569) Corrected a problem with the QUOTE() function returning bad results. (Bug #8248) Fixed a problem where INSERT INTO ...SELECT failed when the source and target table were the same. (Bug #6034) Fixed a problem where RPM installation on Linux as a non-privileged user would result in incomplete installation. (Bug #7347) Change thread stack size used for building Linux RPM distributions to avoid warnings about stack size during server startup. (Bug #6226) Fixed a symlink vulnerability in the mysqlaccess script. Reported by Javier Fernandez-Sanguino Pena and Debian Security Audit Team. (CVE-2005-0004) Fixed support for C API function mysql_list_fields(), which was accidentally broken in 4.0.22 (Bug#6761) Make query_cache_wlock_invalidate system variable visible in SHOW VARIABLES output. (Bug #7594)
1210
Fixed a bug which caused FROM_UNIXTIME() function to return NULL for zero argument instead of the Epoch. (Bug #7515) Now in datetime values two digit year is interpreted as year in 20th or 21st century even with zero month and day. (Bug #7297) Fixed a bug in QUOTE function when used in conjunction with some other string functions. This lead to severe buffer overflow and server crashing. (Bug #7495) InnoDB: Work around a problem in AIX 5.1 patched with ML7 security patch: InnoDB would refuse to open its ibdata files, complaining about an operating system error 0. InnoDB: Fixed a memory corruption bug if one created a table with a primary key that contained at least two column prefixes. An example: CREATE TABLE t(a char(100), b tinyblob, PRIMARY KEY(a(5), b(10))). InnoDB: Use native tmpfile() function on Netware. All InnoDB temporary files are created under sys:\tmp. Previously, InnoDB temporary files were never deleted on Netware. InnoDB: Honor the --tmpdir startup option when creating temporary files. Previously, InnoDB temporary files were always created in the temporary directory of the operating system. On Netware, InnoDB will continue to ignore --tmpdir. (Bug #5822) InnoDB: Fix a theoretical hang over the adaptive hash latch in InnoDB if one runs INSERT ... SELECT ... (binlog not enabled), or a multi-table UPDATE or DELETE, and only the read tables are InnoDB type, the rest are MyISAM; this also fixes bug #7879 for InnoDB type tables. (Bug #7879) InnoDB: Fixed a bug : 32-bit mysqld binaries built on HP-UX-11 did not work with InnoDB files greater than 2 GB in size. (Bug #6189) InnoDB: Fixed a bug : InnoDB failed to drop a table in the background drop queue if the table was referenced by a foreign key constraint. InnoDB: Fixed a bug : if we dropped a table where an INSERT was waiting for a lock to check a FOREIGN KEY constraint, then an assertion would fail in lock_reset_all_on_table(), since that operation assumes no waiting locks on the table or its records. Fixed that, when encountering a ``disk full'' or ``quota exceeded'' write error, MyISAM sometimes didn't sleep and retry the write, thus resulting in a corrupted table. (Bug #7714) Fixed that a slave could crash after replicating many ANALYZE TABLE, OPTIMIZE TABLE, or REPAIR TABLE statements from the master. (Bug #6461, Bug #7658) Fixed a bug where MySQL was allowing concurrent updates (inserts, deletes) to a table if binary logging is enabled. Changed to ensure that all updates are executed in a serialized fashion, because they are executed serialized when binlog is replayed. (Bug #7879) Fixed a bug that caused the slave to stop on statements that produced an error on the master. (Bug #8412) Documented problem with using mysqldump in 4.0.x to dump TIMESTAMP(2) and TIMESTAMP(4) column types. (Bug #6530)
1211
Added --hex-blob option to mysqldump for dumping binary string columns using hexadecimal notation. Added mysql_hex_string() C API function that hex-encodes a string. InnoDB: Do not periodically write SHOW INNODB STATUS information to a temporary file unless the configuration option innodb_status_file=1 is set. InnoDB: Made the foreign key parser better aware of quotes. (Bug #6340) mysqlbinlog now prints an informative commented line (thread id, timestamp, server id, etc) before each LOAD DATA INFILE, like it does for other queries; unless --short-form is used. Bogues corrigs : Corrected accounts in the mysql.user table in Windows distributions that had been created with a Host value of build rather than %. (Bug #6000) Prevent adding CREATE TABLE .. SELECT query to the binary log when the insertion of new records partially failed. (Bug #6682) Fixed bug which caused FROM_UNIXTIME() function to return wrong result if the argument was too big. (Bug #6439) Fixed bug which caused MySQL server to store wrong values in TIMESTAMP columns and give wrong results for UNIX_TIMESTAMP() function if it was run in time zone with leap seconds. (Bug #6387) InnoDB: Fixed a bug in LOAD DATA INFILEREPLACE printing duplicate key error when executing the same load query several times. (Bug #5835) InnoDB: Refuse to open new-style tables created with MySQL 5.0.3 or later. (Bug #7089) InnoDB: Do not call rewind() when displaying SHOW INNODB STATUS information on stderr. InnoDB: If one used INSERT IGNORE to insert several rows at a time, and the first inserts were ignored because of a duplicate key collision, then InnoDB in a replication slave assigned AUTO_INCREMENT values 1 bigger than in the master. This broke the MySQL replication. (Bug #6287) InnoDB: Fix two hangs: FOREIGN KEY constraints treated table and database names as caseinsensitive. RENAME TABLE t TO T would hang in an endless loop if t had a foreign key constraint defined on it. Fix also a hang over the dictionary mutex that would occur if one tried in ALTER TABLE or RENAME TABLE to create a foreign key constraint name that collided with another existing name. (Bug #3478) InnoDB: Treat character 0xA0 as space in InnoDB's FOREIGN KEY parser if MySQL treats it as space in the default charset. EMS MySQL Manager inserts character 0xA0 after the table name in an ALTER, which confused InnoDB's parser. Fixed a bug which caused a crash when only the slave I/O thread was stopped and restarted. (Bug #6148) If a connection had an open transaction but had done no updates to transactional tables (for example if had just done a SELECT FOR UPDATE then executed a non-transactional update, that update automatically committed the transaction (thus releasing InnoDB's row-level locks etc). (Bug #5714) If a connection was interrupted by a network error and did a rollback, the network error code got stored into the BEGIN and ROLLBACK binary log events; that caused superfluous slave stops. (Bug #6522) A sequence of BEGIN (or SET AUTOCOMMIT=0), FLUSH TABLES WITH READ LOCK, transactional update, COMMIT, FLUSH TABLES WITH READ LOCK could hang the connection forever and
1212
possibly the MySQL server itself. This happened for example when running the innobackup script several times. (Bug #6732)
1213
mysqladmin now returns a status of 0 even when the server denies access; such an error means theserver is running. (Bug #3120) InnoDB: Fixed a bug introduced in 4.0.21. An assertion failed if one used mysqldump with the option -l or --opt, or if one used LOCK TABLES ... LOCAL. (Workaround in 4.0.21: use --quick and --single-transaction. (Bug #5538) Fixed that if the slave SQL thread found a syntax error in a query (which should be rare, as the master parsed it successfully), it stops. (Bug #5711) Fixed that if a write to a MyISAM table fails because of a full disk or an exceeded disk quota, it prints a message to the error log every 10 minutes, and waits until disk becomes free. (Bug #3248) Fixed problem with symlinked databases on Windows being shown with SHOW DATABASES even if the database name doesn't match the given wildcard (Bug #5539) Fixed problem introduced in 4.0.21 where a connection starting a transaction, doing updates, then FLUSH TABLES WITH READ LOCK, then COMMIT, would cause replication slaves to stop complaing about error 1223. Bug surfaced when using the InnoDB innobackup script. (Bug #5949)
1214
If length of a timestamp field is defined as 19, the timestamp will be displayed as "YYYY-MM-DD HH:MM:SS. This is done to make it easier to use tables created in MySQL 4.1 to be used in MySQL 4.0. If you use RAID_CHUNKS with a value > 255 it will be set to 255. This was made to ensure that all raid directories are always 2 hex bytes. (Bug #3182) Changed that the optimizer will now consider the index specified in FORCE INDEX clause as a candidate to resolve ORDER BY as well. Non-standard behavior of UNION statements has changed to the standard ones. So far, a table name in the ORDER BY clause was tolerated. From now on a proper error message is issued (Bug #3064). Added max_insert_delayed_threads system variable as a synonym for max_delayed_threads. Added query_cache_wlock_invalidate system variable. It allow emulation of MyISAM table write-locking behavior, even for queries in the query cache. (Bug #2693) The keyword MASTER_SERVER_ID is not reserved anymore. The following is mainly relevant for Mac OS X users who use a case-insensitive filesystem. This is not relevant for Windows users as InnoDB in this case always stores file names in lower case: One can now force lower_case_table_names to 0 from the command line or a configuration file. This is useful with case-insensitive filesystems when you have previously not used lower_case_table_names=1 or lower_case_table_names=2 and your have already created InnoDB tables. With lower_case_table_names=0, InnoDB tables were stored in mixed case while setting lower_case_table_names <> 0 will now force it to lower case (to make the table names case insensitive). Because it's possible to crash MyISAM tables by referring to them with different case on a case-insensitive filesystem, we recommend that you use lower_case_table_names or lower_case_table_names=2 on such filesystems. The easiest way to convert to use lower_case_table_names=2 is to dump all your InnoDB tables with mysqldump, drop them and then restore them. Non-standard behavior of UNION statements has changed to the standard ones. So far, a table name in the ORDER BY clause was tolerated. From now on a proper error message is issued (Bug #3064). Added max_insert_delayed_threads system variable as a synonym for max_delayed_threads. Added query_cache_wlock_invalidate system variable. It allow emulation of MyISAM table write-locking behavior, even for queries in the query cache. (Bug #2693) Changed that the relay log is flushed to disk by the slave I/O thread every time it reads a relay log event. This reduces the risk of losing some part of the relay log in case of brutal crash. When a session having open temporary tables terminates, the statement automatically written to the binary log is now DROP TEMPORARY TABLE IF EXISTS instead of DROP TEMPORARY TABLE, for more robustness. Added option --replicate-same-server-id. Bogues corrigs : Added missing full-text variable ft_stopword_file to myisamchk. Don't allow stray ',' at the end of field specifications. (Bug #3481) INTERVAL now can handle big values for seconds, minutes and hours. (Bug #3498)
1215
Blank hostname did not work as documented for table and column privileges. Now it's works the same way as '%'. (Bug #3473) Fixed a harmless buffer overflow in replace utility. (Bug# 3541) Fixed SOUNDEX() to ignore non-alphabetic characters also in the beginning of the string. (Bug #3556) Fixed a bug in MATCH ... AGAINST() searches when another thread was doing concurrent inserts into the MyISAM table in question. The first --- full-text search --- query could return incorrect results in this case (e.g. ``phantom'' rows or not all matching rows, even an empty result set). The easiest way to check whether you are affected is to start mysqld with --skip-concurrentinsert switch and see if it helps. Fixed bug when doing DROP DATABASE on a directory containing non- MySQL files. Now a proper error message is returned. Fixed bug in ANALYZE TABLE on a BDB table inside a transaction that hangs server thread. (Bug #2342) Fixed a symlink vulnerability in mysqlbug script. (Bug #3284) Fixed core dump bug in SELECT DISTINCT where all selected parts where constants and there were hidden columns in the created temporary table. (Bug #3203) Fixed core dump bug in COUNT(DISTINCT) when there was a lot of values and one had a big value for max_heap_table_size. Fixed problem with multi-table-update and BDB tables. (Bug: #3098) Fixed memory leak when dropping database with RAID tables. (Bug #2882) Fixed core dump crash in replication during relay-log switch when the relay log went over max_relay_log_size and the slave thread did a flush_io_cache() at the same time. Fixed hangup bug when issuing multiple SLAVE START from different threads at the same time. (Bug #2921) Fixed bug when using DROP DATABASE with lower_case_table_names=2. Fixed wrong result in UNION when using lower_case_table_names=2. (Bug #2858) One can now kill threads that is 'stuck' in the join optimizer (can happen when there is MANY tables in the join in which case the optimizer can take really long time). (Bug #2825) Rollback DELETE and UPDATE statements if thread is killed. (Bug #2422) Ensure that all rows in an INSERT DELAYED statement is written at once if binary logging is enabled. (Bug #2491). Fixed bug in query cache statistic, more accurate formula linked statistic variables mentioned in the manual. Fixed a bug in parallel repair (myisamchk -p, myisam_repair_threads) - sometimes repair process failed to repair a table. (Bug #1334) Fixed bugs with names of tables, databases and columns that end to space (Bug #2985) Fixed a bug in multiple-table UPDATE statements involving at least one constant table. Bug was exhibited in allowing non matching row to be updated. (Bug #2996). Fixed all bugs in scripts for creating/upgrading system database (Bug #2874) Added tests which guarantee against such bugs in the future. Fixed bug in mysql command-line client in interpreting quotes within comments. (Bug #539)
1216
--set-character-set and --character-sets-dir options in myisamchk now work. Fixed a bug in mysqlbinlog that caused one pointer to be free'd twice in some cases. Fixed a bug in boolean full-text search, that sometimes could lead to false matches in queries with several levels of subexpressions using + operator (for example, MATCH ... AGAINST('+(+(word1 word2)) +word3*' IN BOOLEAN MODE). Fixed Windows-specific portability bugs in myisam_ftdump. Fixed a bug in multiple-table DELETE that was caused by foreign key constraints. If the order of the tables established by MySQL optimizer did not match parent-child order, no rows were deleted and no error message was provided. (Bug #2799) Fixed a few years old bug in the range optimizer that caused a segmentation fault on some very rare queries. (Bug #2698) Replication: If a client connects to a slave server and issues an administrative statement for a table (for example, OPTIMIZE TABLE or REPAIR TABLE), this could sometimes stop the slave SQL thread. This does not lead to any corruption, but you must use START SLAVE to get replication going again. (Bug #1858) The bug was accidentally not fixed in 4.0.17 as it was unfortunately earlier said. Fixed that when a Rotate event is found by the slave SQL thread in the middle of a transaction, the value of Relay_Log_Pos in SHOW SLAVE STATUS remains correct. (Bug #3017) Corrected the master's binary log position that InnoDB reports when it is doing a crash recovery on a slave server. (Bug #3015) Changed that when a DROP TEMPORARY TABLE statement is automatically written to the binary log when a session ends, the statement is recorded with an error code of value zero (this ensures that killing a SELECT on the master does not result in a superfluous error on the slave). (Bug #3063) Changed that when a thread handling INSERT DELAYED (also known as a delayed_insert thread) is killed, its statements are recorded with an error code of value zero (killing such a thread does not endanger replication, so we thus avoid a superfluous error on the slave). (Bug #3081) Fixed deadlock when two START SLAVE commands were run at the same time. (Bug #2921) Fixed that a statement never triggers a superfluous error on the slave, if it must be excluded given the replicate-* options. The bug was that if the statement had been killed on the master, the slave would stop. (Bug #2983) The --local-load option of mysqlbinlog now requires an argument. Fixed a segmentation fault when running LOAD DATA FROM MASTER after RESET SLAVE. (Bug #2922) Fixed a rare error condition that caused the slave SQL thread spuriously to print the message Binlog has bad magic number and stop when it was not necessary to do so. (Bug #3401) Fixed the column Exec_master_log_pos (and its disk image in the relay-log.info file) to be correct if the master had version 3.23 (it was too big by 6 bytes). This bug does not exist in the 5.0 version. (Bug #3400) Fixed that mysqlbinlog does not forget to print a USE command under rare circumstances where the binary log contained a LOAD DATA INFILE command. (Bug #3415) Fixed a memory corruption when replicating a LOAD DATA INFILE when the master had version 3.23. Some smaller problems remain in this setup, See Section 6.7, Fonctionnalits de la rplication et problmes connus . (Bug #3422) Multiple-table DELETE statements were always replicated by the slave if there were some replicate-*-ignore-table options and no replicate-*-do-table options. (Bug #3461)
1217
Fixed a crash of the MySQL slave server when it was built with --with-debug and replicating itself. (BUG #3568)
1218
Fixed a spurious table corruption problem that could sometimes appear on tables with indexed TEXT columns if these columns happened to contain values having trailing spaces. This bug was introduced in 4.0.17. Fixed a problem where some queries could hang if a condition like indexed_TEXT_column = expr was present and the column contained values having trailing spaces. This bug was introduced in 4.0.17. Fixed a bug that could cause incorrect results from a query that involved range conditions on indexed TEXT columns that happened to contain values having trailing spaces. This bug was introduced in 4.0.17. (Bug #2295) Fixed incorrect path names in some of the manual pages. (Bug #2270) Fixed spurious ``table corrupted'' errors in parallel repair operations. See Section 5.2.3, Variables serveur systme . Fixed a crashing bug in parallel repair operations. See Section 5.2.3, Variables serveur systme . Fixed bug in updating MyISAM tables for BLOB values longer than 16MB. (Bug #2159) Fixed bug in mysqld_safe when running multiple instances of MySQL. (Bug #2114) Fixed a bug in using HANDLER statement with tables not from a current database. (Bug #2304) Fixed a crashing bug that occurred due to the fact that multiple-table UPDATE statements did not check that there was only one table to be updated. (Bug #2103) Fixed a crashing bug that occurred due to BLOB column type index size being calculated incorrectly in MIN() and MAX() optimizations. (Bug #2189) Fixed a bug with incorrect syntax for LOCK TABLES in mysqldump. (Bug #2242) Fixed a bug in mysqld_safe that caused mysqld to generate a warning about duplicate user=xxx options if this option was specified in the [mysqld] or [server] sections of my.cnf. (Bug #2163) INSERT DELAYED ... SELECT ... could cause table corruption because tables were not locked properly. This is now fixed by ignoring DELAYED in this context. (Bug #1983) Replication: Sometimes the master gets a non-fatal error during the execution of a statement that does not immediately succeed. (For example, a write to a MyISAM table may first receive ``no space left on device,'' but later complete when disk space becomes available. See Section A.4.3, Comment MySQL gre un disque plein .) The bug was that the master forgot to reset the error code to 0 after success, so the error code got into its binary log, thus causing the slave to issue false alarms such as ``did not get the same error as on master.'' (Bug #2083) Removed a misleading ``check permissions on master.info'' from a replication error message, because the cause of the problem could be something other than permissions. (Bug #2121) Fixed a crash when the replication slave was unable to create the first relay log. (Bug #2145) Replication of LOAD DATA INFILE for an empty file from a 3.23 master to a 4.0 slave caused the slave to print an error. (Bug #2452) When automatically forcing lower_case_table_names to 1 if the file system was case insensitive, mysqld could crash. This bug existed only in MySQL 4.0.17. (Bug #2481) Restored ability to specify default values for TIMESTAMP columns that was erroneously disabled in previous release. (Bug #2539) Fixed SHOW CREATE TABLE to reflect these values. (Bug #1885) Note that because of the auto-update feature for the first TIMESTAMP column in a table, it makes no sense to specify a default value for the column. Any such default will be silently ignored (unless another TIMESTAMP column is added before this one). Also fixed the meaning of the DEFAULT
1219
keyword when it is used to specify the value to be inserted into a TIMESTAMP column other than the first. (Bug #2464) Fixed bug for out-of-range arguments on QNX platform that caused UNIX_TIMESTAMP() to produce incorrect results or that caused non-zero values to be inserted into TIMESTAMP columns. (Bug #2523) Also, current time zone now is taken into account when checking if datetime values satisfy both range boundaries for TIMESTAMP columns. The range allowed for a TIMESTAMP column is time zone-dependent and equivalent to a range of 1970-01-01 00:00:01 UTC to 2037-12-31 23:59:59 UTC. Multiple-table DELETE statements were never replicated by the slave if there were any replicate*-table options. (Bug #2527) Changes to session counterparts of variables query_prealloc_size, query_alloc_block_size, trans_prealloc_size, trans_alloc_block_size now have an effect. (Bug #1948) Fixed bug in ALTER TABLE RENAME, when rename to the table with the same name in another database silently dropped destination table if it existed. (Bug #2628)
1220
Fixed problem with UNIX_TIMESTAMP() for timestamps close to 0. (Bug #1998) Fixed problem with character values greater than 128 in the QUOTE() function. (Bug #1868) Fixed searching of TEXT with end space. (Bug #1651) Fixed caching bug in multiple-table updates where same table was used twice. (Bug #1711) Fixed directory permissions for the MySQL-server RPM documentation directory. (Bug #1672) Fixed server crash when updating an ENUM column that is set to the empty string (for example, with REPLACE()). (Bug #2023) mysql client program now correctly prints connection identifier returned by mysql_thread_id() as unsigned integer rather than as signed integer. (Bug #1951) FOUND_ROWS() could return incorrect number of rows after a query with an impossible WHERE condition. (Bug #1468) SHOW DATABASES no longer shows .sym files (on Windows) that do not point to a valid directory. (Bug #1385) Fixed a possible memory leak on Mac OS X when using the shared libmysql.so library. (from pthread_key_create()). (Bug #2061) Fixed bug in UNION statement with alias *. (Bug #1249) Fixed a bug in DELETE ... ORDER BY ... LIMIT where the rows where not deleted in the proper order. (Bug #1024, Bug #1697). Fixed serious problem with multi-threaded programs on Windows that used the embedded MySQL libraries. (Locks of tables were not handled correctly between different threads). Code cleanup: Fixed a few code defects (potential memory leaks, null pointer dereferences, uninitialized variables). Thanks to Reasoning Inc. for informing us about these findings. Fixed a buffer overflow error that occurred with prepended 0 characters in some columns of type DECIMAL. (Bug #2128) Filesort was never shown in EXPLAIN if query contained an ORDER BY NULL clause. (Bug #1335) Fixed invalidation of whole query cache on DROP DATABASE. (Bug #1898) Fixed bug in range optimizer that caused wrong results for some unlikely AND/OR queries. (Bug #1828) Fixed a crash in ORDER BY when ordering by expression and identifier. (Bug #1945) Fixed a crash in an open HANDLER when an ALTER TABLE was executed in a different connection. (Bug #1826) Fixed a bug in trunc* operator of full-text search which sometimes caused MySQL not to find all matched rows. Fixed bug in prepending 0 characters to DECIMAL column values. Fixed optimizer bug, introduced in 4.0.16, when REF access plan was preferred to more efficient RANGE on another column. Fixed problem when installing a MySQL server as a Windows service using a command of the form mysqld --install mysql --defaults-file=path-to-file. (Bug #1643) Fixed an incorrect result from a query that uses only const tables (such as one-row tables) and nonconstant expression (such as RAND()). (Bug #1271)
1221
Fixed bug when the optimizer did not take SQL_CALC_FOUND_ROWS into account if LIMIT clause was present. (Bug #1274) mysqlbinlog now asks for a password at the console when the -p or --password option is used with no argument. This is consistent with the way that other clients such mysqladmin and mysqldump already behave. Note: A consequence of this change is that it is no longer possible to invoke mysqlbinlog as mysqlbinlog -p pass_val (with a space between the -p option and the following password value). (Bug #1595) Fixed bug accidentally introduced in 4.0.16 where the slave SQL thread deleted its replicated temporary tables when STOP SLAVE was issued. In a ``chain'' replication setup A->B->C, if 2 sessions on A updated temporary tables of the same name at the same time, the binary log of B became incorrect, resulting in C becoming confused. (Bug #1686) In a ``chain'' replication setup A->B->C, if STOP SLAVE was issued on B while it was replicating a temporary table from A, then when START SLAVE was issued on B, the binary log of B became incorrect, resulting in C becoming confused. (Bug #1240) When MASTER_LOG_FILE and MASTER_LOG_POS were not specified, CHANGE MASTER used the coordinates of the slave I/O thread to set up replication, which broke replication if the slave SQL thread lagged behind the slave I/O thread. This caused the slave SQL thread to lose some events. The new behavior is to use the coordinates of the slave SQL thread instead. See Section 13.6.2.1, CHANGE MASTER TO . (Bug #1870) Now if integer is stored or converted to TIMESTAMP or DATETIME value checks of year, month, day, hour, minute and second ranges are performed and numbers representing illegal timestamps are converted to 0 value. This behavior is consistent with manual and with behavior of string to TIMESTAMP/DATETIME conversion. (Bug #1448) Fixed bug when BIT_AND() and BIT_OR() group functions returned incorrect value if SELECT used a temporary table and no rows were found. (Bug #1790). BIT_AND() is now unsigned in all contexts. This means that it will now return 18446744073709551615 (= 0xffffffffffffffff) instead of -1 if there were no rows in the result. Fixed bug with BIT_AND() still returning signed value for an empty set in some cases. (Bug #1972) Fixed bug with ^ (XOR) and >> (bit shift) still returning signed value in some cases. (Bug #1993) Replication: a rare race condition in the slave SQL thread, which could lead to a wrong complain that the relay log is corrupted. (Bug #2011) Replication: if an administrative command on a table (OPTIMIZE TABLE, REPAIR TABLE etc) was run on the slave, this could sometimes stop the slave SQL thread (this did not led to any corruption; one just had to type START SLAVE to get replication going again). (Bug #1858) Replication: in the slave SQL thread, a multi-table UPDATE could produce a wrong complain that some record was not found in one table, if the UPDATE was preceded by a INSERT ... SELECT. (Bug #1701) Fixed deficiency in MySQL code which is responsible for scanning directories. This deficiency caused SHOW TABLE STATUS to be very slow for big number of tables in database even if single particular table were specified. (Bug #1952)
1222
Write memory allocation information to error log when doing mysqladmin debug. This works only on systems that support the mallinfo() call (like newer Linux systems). Added the following new server variables to allow more precise memory allocation: range_alloc_block_size, query_alloc_block_size, query_prealloc_size, transaction_alloc_block_size, and transaction_prealloc_size. mysqlbinlog now reads option files. To make this work, you must now specify --read-fromremote-server when reading binary logs from a MySQL server. (Note that using a remote server is deprecated and may disappear in future mysqlbinlog versions). Block SIGPIPE signals also for non-threaded programs. The blocking is moved from mysql_init() to mysql_server_init(), which is automatically called on the first call to mysql_init(). Added --libs_r and --include options to mysql_config. New `> prompt for mysql. This prompt is similar to the '> and "> prompts, but indicates that an identifier quoted with backticks was begun on an earlier line and the closing backtick has not yet been seen. Updated mysql_install_db to be able to use the local machine's IP address instead of the hostname when building the initial grant tables if skip-name-resolve has been specified. This option can be helpful on FreeBSD to avoid thread-safety problems with the FreeBSD resolver libraries. (Thanks to Jeremy Zawodny for the patch.) A documentation change: Added a note that when backing up a slave, it is necessary also to back up the master.info and relay-log.info files, as well as any SQL_LOAD-* files located in the directory specified by the --slave-load-tmpdir option. All these files are needed when the slave resumes replication after you restore the slave's data. Bogues corrigs : Fixed a spurious error ERROR 14: Can't change size of file (Errcode: 2) on Windows in DELETE FROM tbl_name without a WHERE clause or TRUNCATE TABLE tbl_name, when tbl_name is a MyISAM table. (Bug #1397) Fixed a bug that resulted in thr_alarm queue is full warnings after increasing the max_connections variable with SET GLOBAL. (Bug #1435) Made LOCK TABLES to work when Lock_tables_priv is granted on the database level and Select_priv is granted on the table level. Fixed crash of FLUSH QUERY CACHE on queries that use same table several times (Bug #988). Fixed core dump bug when setting an enum system variable (such as SQL_WARNINGS) to NULL. Extended the default timeout value for Windows clients from 30 seconds to 1 year. (The timeout that was added in MySQL 4.0.15 was way too short). This fixes a bug that caused ERROR 2013: Lost connection to MySQL server during query for queries that lasted longer than 30 seconds, if the client didn't specify a limit with mysql_options(). Users of 4.0.15 on Windows should upgrade to avoid this problem. More ``out of memory'' checking in range optimizer. Fixed and documented a problem when setting and using a user variable within the same SELECT statement. (Bug #1194). Fixed bug in overrun check for BLOB values with compressed tables. This was a bug introduced in 4.0.14. It caused MySQL to regard some correct tables containing BLOB values as corrupted. (Bug #770, Bug #1304, and maybe Bug #1295)
1223
SHOW GRANTS showed USAGE instead of the real column-level privileges when no table-level privileges were given. When copying a database from the master, LOAD DATA FROM MASTER dropped the corresponding database on the slave, thus erroneously dropping tables that had no counterpart on the master and tables that may have been excluded from replication using replicate-*-table rules. Now LOAD DATA FROM MASTER no longer drops the database. Instead, it drops only the tables that have a counterpart on the master and that match the replicate-*-table rules. replicate-*-db rules can still be used to include or exclude a database as a whole from LOAD DATA FROM MASTER. A database will also be included or excluded as a whole if there are some rules like replicatewild-do-table=db1.% or replicate-wild-ignore-table=db1.%, as is already the case for CREATE DATABASE and DROP DATABASE in replication. (Bug #1248) Fixed a bug where mysqlbinlog crashed with a segmentation fault when used with the -h or -host option. (Bug #1258) Fixed a bug where mysqlbinlog crashed with a segmentation fault when used on a binary log containing only final events for LOAD DATA. (Bug #1340) mysqlbinlog will not reuse temporary file names from previous runs. Previously mysqlbinlog failed if was used several times on the same binary log file that contained a LOAD DATA command. Fixed compilation problem when compiling with OpenSSL 0.9.7 with disabled old DES support (If OPENSSL_DISABLE_OLD_DES_SUPPORT option was enabled). Fixed a bug when two (or more) MySQL servers were running on the same machine, and they were both slaves, and at least one of them was replicating some LOAD DATA INFILE command from its master. The bug was that one slave MySQL server sometimes deleted the SQL_LOAD-* files (used for replication of LOAD DATA INFILE and located in the slave-load-tmpdir directory, which defaults to tmpdir) belonging to the other slave MySQL server of this machine, if these slaves had the same slave-load-tmpdir directory. When that happened, the other slave could not replicate LOAD DATA INFILE and complained about not being able to open some SQL_LOAD-* file. (Bug #1357) If LOAD DATA INFILE failed for a small file, the master forgot to write a marker (a Delete_file event) in its binary log, so the slave could not delete 2 files (SQL_LOAD-*.info and SQL_LOAD*.data from its tmpdir. (Bug #1391) On Windows, the slave forgot to delete a SQL_LOAD-*.info file from tmpdir after successfully replicating a LOAD DATA INFILE command. (Bug #1392) When a connection terminates, MySQL writes DROP TEMPORARY TABLE statements to the binary log for all temporary tables which the connection had not explicitly dropped. MySQL forgot to use backticks to quote the database and table names in the statement. (Bug #1345) On some 64-bit machines (some HP-UX and Solaris machines), a slave installed with the 64-bit MySQL binary could not connect to its master (it connected to itself instead). (Bug #1256, Bug #1381) Code was introduced in MySQL 4.0.15 for the slave to detect that the master had died while writing a transaction to its binary log. This code reported an error in a legal situation: When the slave I/O thread was stopped while copying a transaction to the relay log, the slave SQL thread would later pretend that it found an unfinished transaction. (Bug #1475)
1224
Windows client library that causes Windows clients using the library to die with a Lost connection to MySQL server during query error for queries that take more than 30 seconds. This problem is specific to Windows; clients on other platforms are unaffected. Fonctionnalit ajoute ou modifie : mysqldump now correctly quotes all identifiers when communicating with the server. This assures that during the dump process, mysqldump will never send queries to the server that result in a syntax error. This problem is not related to the mysqldump program's output, which was not changed. (Bug #1148) Change result set metadata information so that MIN() and MAX() report that they can return NULL (this is true because an empty set will return NULL). (Bug #324) Produce an error message on Windows if a second mysqld server is started on the same TCP/IP port as an already running mysqld server. The mysqld server variables wait_timeout, net_read_timeout, and net_write_timeout now work on Windows. One can now also set timeouts for read and writes in Windows clients with mysql_options(). Added option --sql-mode=NO_DIR_IN_CREATE to make it possible for slaves to ignore INDEX DIRECTORY and DATA DIRECTORY options given to CREATE TABLE. When this is mode is on, SHOW CREATE TABLE will not show the given directories. SHOW CREATE TABLE now shows the INDEX DIRECTORY and DATA DIRECTORY options, if they were specified when the table was created. The open_files_limit server variable now shows the real open files limit. MATCH ... AGAINST() in natural language mode now treats words that are present in more than 2,000,000 rows as stopwords. The Mac OS X installation disk images now include an additional MySQLStartupItem.pkg package that enables the automatic startup of MySQL on system bootup. See Section 2.2.13, Installer MySQL sur Mac OS X . Most of the documentation included in the binary tarball distributions (.tar.gz) has been moved into a subdirectory docs. See Section 2.1.5, Dispositions d'installation . The manual is now included as an additional info file in the binary distributions. (Bug #1019) The binary distributions now include the embedded server library (libmysqld.a) by default. Due to a linking problem with non-gcc compilers, it was not included in all packages of the initial 4.0.15 release. The affected packages were rebuilt and released as 4.0.15a. See Section 1.3.1.2, MySQL Server intgr (embedded) . MySQL can now use range optimization for BETWEEN with non-constant limits. (Bug #991) Replication error messages now include the default database, so that users can check which database the failing query was run for. A documentation change: Added a paragraph about how the binlog-do-db and binlogignore-db options are tested against the database on the master (see Section 5.9.4, Le log binaire ), and a paragraph about how replicate-do-db, replicate-do-table and analogous options are tested against the database and tables on the slave (see Section 6.8, Options de dmarrage de la rplication ). Now the slave does not replicate SET PASSWORD if it is configured to exclude the mysql database from replication (using for example replicate-wild-ignore-table=mysql.%). This was already the case for GRANT and REVOKE since version 4.0.13 (though there was Bug #980 in 4.0.13 & 4.0.14, which has been fixed in 4.0.15).
1225
Rewrote the information shown in the State column of SHOW PROCESSLIST for replication threads and for MASTER_POS_WAIT() and added the most common states for these threads to the documentation, see Section 6.3, Dtails d'implmentation de la rplication . Added a test in replication to detect the case where the master died in the middle of writing a transaction to the binlog; such unfinished transactions now trigger an error message on the slave. A GRANT command that creates an anonymous user (that is, an account with an empty username) no longer requires FLUSH PRIVILEGES for the account to be recognized by the server. (Bug #473) CHANGE MASTER now flushes relay-log.info. Previously this was deferred to the next run of START SLAVE, so if mysqld was shutdown on the slave after CHANGE MASTER without having run START SLAVE, the relay log's name and position were lost. At restart they were reloaded from relay-log.info, thus reverting to their old (incorrect) values from before CHANGE MASTER and leading to error messages (as the old relay log did not exist any more) and the slave threads refusing to start. (Bug #858) Bogues corrigs : Fixed buffer overflow in password handling which could potentially be exploited by MySQL users with ALTER privilege on the mysql.user table to execute random code or to gain shell access with the UID of the mysqld process (thanks to Jedi/Sector One for spotting and reporting this bug). Fixed server crash on FORCE INDEX in a query that contained "Range checked for each record" in the EXPLAIN output. (Bug #1172) Fixed table/column grant handling - proper sort order (from most specific to less specific, see Section 5.5.6, Contrle d'accs, tape 2 : Vrification de la requte ) was not honored. (Bug #928) Fixed rare bug in MYISAM introduced in 4.0.3 where the index file header was not updated directly after an UPDATE of split dynamic rows. The symptom was that the table had a corrupted delete-link if mysqld was shut down or the table was checked directly after the update. Fixed Can't unlock file error when running myisamchk --sort-index on Windows. (Bug #1119) Fixed possible deadlock when changing key_buffer_size while the key cache was actively used. (Bug #1088) Fixed overflow bug in MyISAM and ISAM when a row is updated in a table with a large number of columns and at least one BLOB/TEXT column. Fixed incorrect result when doing UNION and LIMIT #,# when one didn't use braces around the SELECT parts. Fixed incorrect result when doing UNION and ORDER BY .. LIMIT # when one didn't use braces around the SELECT parts. Fixed problem with SELECT SQL_CALC_FOUND_ROWS ... UNION ALL ... LIMIT # where FOUND_ROWS() returned incorrect number of rows. Fixed unlikely stack bug when having a BIG expression of type 1+1-1+1-1... in certain combinations. (Bug #871) Fixed the bug that sometimes prevented a table with a FULLTEXT index from being marked as "analyzed". Fixed MySQL so that the column length (in C API) for the second column in SHOW CREATE TABLE is always larger than the data length. The only known application that was affected by the old behavior was Borland dbExpress, which truncated the output from the command. (Bug #1064) Fixed crash in comparisons of strings using the tis620 character set. (Bug #1116)
1226
Fixed ISAM bug in MAX() optimization. myisamchk --sort-records=N no longer marks table as crashed if sorting failed because of an inappropriate key. (Bug #892) Fixed a minor bug in MyISAM compressed table handling that sometimes made it impossible to repair compressed table in "Repair by sort" mode. "Repair with keycache" (myisamchk --saferecover) worked, though. (Bug #1015) Fixed bug in propagating the version number to the manual included in the distribution files. (Bug #1020) Fixed key sorting problem (a PRIMARY key declared for a column that is not explicitly marked NOT NULL was sorted after a UNIQUE key for a NOT NULL column). Fixed the result of INTERVAL when applied to a DATE value. (Bug #792) Fixed compiling of the embedded server library in the RPM spec file. (Bug #959) Added some missing files to the RPM spec file and fixed some RPM building errors that occurred on Red Hat Linux 9. (Bug #998) Fixed incorrect XOR evaluation in WHERE clause. (Bug #992) Fixed bug with processing in query cache merged tables constructed from more then 255 tables. (Bug #930) Fixed incorrect results from outer join query (e.g. LEFT JOIN) when ON condition is always false, and range search in used. (Bug #926) Fixed a bug causing incorrect results from MATCH ... AGAINST() in some joins. (Bug #942) MERGE tables do not ignore "Using index" (from EXPLAIN output) anymore. Fixed a bug that prevented an empty table from being marked as "analyzed". (Bug #937) Fixed myisamchk --sort-records crash when used on compressed table. Fixed slow (as compared to 3.23) ALTER TABLE and related commands such as CREATE INDEX. (Bug #712) Fixed segmentation fault resulting from LOAD DATA FROM MASTER when the master was running without the --log-bin option. (Bug #934) Fixed a security bug: A server compiled without SSL support still allowed connections by users that had the REQUIRE SSL option specified for their accounts. Fixed a random bug: Sometimes the slave would replicate GRANT or REVOKE queries even if it was configured to exclude the mysql database from replication (for example, using replicate-wildignore-table=mysql.%). (Bug #980) The Last_Errno and Last_Error fields in the output of SHOW SLAVE STATUS are now cleared by CHANGE MASTER and when the slave SQL thread starts. (Bug #986) A documentation mistake: It said that RESET SLAVE does not change connection information (master host, port, user, and password), whereas it does. The statement resets these to the startup options (master-host etc) if there were some. (Bug #985) SHOW SLAVE STATUS now shows correct information (master host, port, user, and password) after RESET SLAVE (that is, it shows the new values, which are copied from the startup options if there were some). (Bug #985) Disabled propagation of the original master's log position for events because this caused unexpected values for Exec_Master_Log_Pos and problems with MASTER_POS_WAIT() in A->B->C replication setup. (Bug #1086)
1227
Fixed a segfault in mysqlbinlog when --position=x was used with x being between a Create_file event and its fellow Append_block, Exec_load or Delete_file events. (Bug #1091) mysqlbinlog printed superfluous warnings when using --database, which caused syntax errors when piped to mysql. (Bug #1092) Made mysqlbinlog --database filter LOAD DATA INFILE too (previously, it filtered all queries except LOAD DATA INFILE). (Bug #1093) mysqlbinlog in some cases forgot to put a leading '#' in front of the original LOAD DATA INFILE (this command is displayed only for information, not to be run; it is later reworked to LOAD DATA LOCAL with a different filename, for execution by mysql). (Bug #1096) binlog-do-db and binlog-ignore-db incorrectly filtered LOAD DATA INFILE (it was halfwritten to the binary log). This resulted in a corrupted binary log, which could cause the slave to stop with an error. (Bug #1100) When, in a transaction, a transactional table (such as an InnoDB table) was updated, and later in the same transaction a non-transactional table (such as a MyISAM table) was updated using the updated content of the transactional table (with INSERT ... SELECT for example), the queries were written to the binary log in an incorrect order. (Bug #873) When, in a transaction, INSERT ... SELECT updated a non-transactional table, and ROLLBACK was issued, no error was returned to the client. Now the client is warned that some changes could not be rolled back, as this was already the case for normal INSERT. (Bug #1113) Fixed a potential bug: When STOP SLAVE was run while the slave SQL thread was in the middle of a transaction, and then CHANGE MASTER was used to point the slave to some non-transactional statement, the slave SQL thread could get confused (because it would still think, from the past, that it was in a transaction).
1228
Added thread-specific max_seeks_for_key variable that can be used to force the optimizer to use keys instead of table scans even if the cardinality of the index is low. Added optimization that converts LEFT JOIN to normal join in some cases. A documentation change: added a paragraph about failover in replication (how to use a surviving slave as the new master, how to resume to the original setup). See Section 6.9, FAQ de la rplication . A documentation change: added warning notes about safe use of the CHANGE MASTER command. See Section 13.6.2.1, CHANGE MASTER TO . MySQL now issues a warning (not an error, as in 4.0.13) when it opens a table that was created with MySQL 4.1. Added --nice option to mysqld_safe to allow setting the niceness of the mysqld process. (Thanks to Christian Hammers for providing the initial patch.) (Bug #627) Added --read-only option to cause mysqld to allow no updates except from slave threads or from users with the SUPER privilege. (Original patch from Markus Benning). SHOW BINLOG EVENTS FROM x where x is less than 4 now silently converts x to 4 instead of printing an error. The same change was done for CHANGE MASTER TO MASTER_LOG_POS=x and CHANGE MASTER TO RELAY_LOG_POS=x. mysqld now only adds an interrupt handler for the SIGINT signal if you start it with the new --gdb option. This is because some MySQL users encountered strange problems when they accidentally sent SIGINT to mysqld threads. RESET SLAVE now clears the Last_Errno and Last_Error fields in the output of SHOW SLAVE STATUS. Added max_relay_log_size variable; the relay log will be rotated automatically when its size exceeds max_relay_log_size. But if max_relay_log_size is 0 (the default), max_binlog_size will be used (as in older versions). max_binlog_size still applies to binary logs in any case. FLUSH LOGS now rotates relay logs in addition to the other types of logs it already rotated. Bogues corrigs : Comparison/sorting for latin1_de character set was rewritten. The old algorithm could not handle cases like "s" > "a". See Section 5.8.1.1, Jeu de caractres allemand . In rare cases it resulted in table corruption. Fixed a problem with the password prompt on Windows. (Bug #683) ALTER TABLE ... UNION=(...) for MERGE table is now allowed even if some underlying MyISAM tables are read-only. (Bug #702) Fixed a problem with CREATE TABLE t1 SELECT x'41'. (Bug #801) Removed some incorrect lock warnings from the error log. Fixed memory overrun when doing REPAIR TABLE on a table with a multiple-part auto_increment key where one part was a packed CHAR. Fixed a probable race condition in the replication code that could potentially lead to INSERT statements not being replicated in the event of a FLUSH LOGS command or when the binary log exceeds max_binlog_size. (Bug #791) Fixed a crashing bug in INTERVAL and GROUP BY or DISTINCT. (Bug #807)
1229
Fixed bug in mysqlhotcopy so it actually aborts for unsuccessful table copying operations. Fixed another bug so that it succeeds when there are thousands of tables to copy. (Bug #812) Fixed problem with mysqlhotcopy failing to read options from option files. (Bug #808) Fixed bugs in optimizer that sometimes prevented MySQL from using FULLTEXT indexes even though it was possible (for example, in SELECT * FROM t1 WHERE MATCH a,b AGAINST("index") > 0). Fixed a bug with ``table is full'' in UNION operations. Fixed a security problem that enabled users with no privileges to obtain information on the list of existing databases by using SHOW TABLES and similar commands. Fixed a stack problem on UnixWare/OpenUnix. Fixed a configuration problem on UnixWare/OpenUNIX and OpenServer. Fixed a stack overflow problem in password verification. Fixed a problem with max_user_connections. HANDLER without an index now works properly when a table has deleted rows. (Bug #787) Fixed a bug with LOAD DATA in mysqlbinlog. (Bug #670) Fixed that SET CHARACTER SET DEFAULT works. (Bug #462) Fixed MERGE table behavior in ORDER BY ... DESC queries. (Bug #515) Fixed server crash on PURGE MASTER LOGS or SHOW MASTER LOGS when the binary log is off. (Bug #733) Fixed password-checking problem on Windows. (Bug #464) Fixed the bug in comparison of a DATETIME column and an integer constant. (Bug #504) Fixed remote mode of mysqlbinlog. (Bug #672) Fixed ERROR 1105: Unknown error that occurred for some SELECT queries, where a column that was declared as NOT NULL was compared with an expression that took NULL value. Changed timeout in mysql_real_connect() to use poll() instead of select() to work around problem with many open files in the client. Fixed incorrect results from MATCH ... AGAINST used with a LEFT JOIN query. Fixed a bug that limited the maximum value for mysqld variables to 4294967295 when they are specified on the command line. Fixed a bug that sometimes caused spurious ``Access denied'' errors in HANDLER ... READ statements, when a table is referenced via an alias. Fixed portability problem with safe_malloc, which caused MySQL to give "Freeing wrong aligned pointer" errors on SCO 3.2. ALTER TABLE ... ENABLE/DISABLE KEYS could cause a core dump when done after an INSERT DELAYED statement on the same table. Fixed problem with conversion of localtime to GMT where some times resulted in different (but correct) timestamps. Now MySQL should use the smallest possible timestamp value in this case. (Bug #316) Very small query cache sizes could crash mysqld. (Bug #549)
1230
Fixed a bug (accidentally introduced by us but present only in version 4.0.13) that made INSERT ... SELECT into an AUTO_INCREMENT column not replicate well. This bug is in the master, not in the slave. (Bug #490) Fixed a bug : When an INSERT ... SELECT statement inserted rows into a non-transactional table, but failed at some point (for example, due to a ``Duplicate key'' error), the query was not written to the binary log. Now it is written to the binary log, with its error code, as all other queries are. About the slave-skip-errors option for how to handle partially completed queries in the slave, see Section 6.8, Options de dmarrage de la rplication . (Bug #491) SET FOREIGN_KEY_CHECKS=0 was not replicated properly. The fix probably will not be backported to 3.23. On a slave, LOAD DATA INFILE which had no IGNORE or REPLACE clause on the master, was replicated with IGNORE. While this is not a problem if the master and slave data are identical (a LOAD that produces no duplicate conflicts on the master will produce none on the slave anyway), which is true in normal operation, it is better for debugging not to silently add the IGNORE. That way, you can get an error message on the slave and discover that for some reason, the data on master and slave are different and investigate why. (Bug #571) On a slave, LOAD DATA INFILE printed an incomplete ``Duplicate entry '%-.64s' for key %d''' message (the key name and value were not mentioned) in case of duplicate conflict (which does not happen in normal operation). (Bug #573) When using a slave compiled with --debug, CHANGE MASTER TO RELAY_LOG_POS could cause a debug assertion failure. (Bug #576) When doing a LOCK TABLES WRITE on an InnoDB table, commit could not happen, if the query was not written to the binary log (for example, if --log-bin was not used, or binlog-ignore-db was used). (Bug #578) If a 3.23 master had open temporary tables that had been replicated to a 4.0 slave, and the binary log got rotated, these temporary tables were immediately dropped by the slave (which caused problems if the master used them subsequently). This bug had been fixed in 4.0.13, but in a manner which caused an unlikely inconvenience: If the 3.23 master died brutally (power failure), without having enough time to automatically write DROP TABLE statements to its binary log, then the 4.0.13 slave would not notice the temporary tables have to be dropped, until the slave mysqld server is restarted. This minor inconvenience is fixed in 3.23.57 and 4.0.14 (meaning the master must be upgraded to 3.23.57 and the slave to 4.0.14 to remove the inconvenience). (Bug #254) If MASTER_POS_WAIT() was waiting, and the slave was idle, and the slave SQL thread terminated, MASTER_POS_WAIT() would wait forever. Now when the slave SQL thread terminates, MASTER_POS_WAIT() immediately returns NULL (``slave stopped''). (Bug #651) After RESET SLAVE; START SLAVE;, the Relay_Log_Space value displayed by SHOW SLAVE STATUS was too big by four bytes. (Bug #763) If a query was ignored on the slave (because of replicate-ignore-table and other similar rules), the slave still checked if the query got the same error code (0, no error) as on the master. So if the master had an error on the query (for example, ``Duplicate entry'' in a multiple-row insert), then the slave stopped and warned that the error codes didn't match. (Bug #797)
1231
Removed timing of tests from mysql-test-run. time does not accept all required parameters on many platforms (for example, QNX) and timing the tests is not really required (it's not a benchmark anyway). SHOW MASTER STATUS and SHOW SLAVE STATUS required the SUPER privilege; now they accept REPLICATION CLIENT as well. (Bug #343) Added multi-threaded MyISAM repair optimization and myisam_repair_threads variable to enable it. See Section 5.2.3, Variables serveur systme . Added innodb_max_dirty_pages_pct variable which controls amount of dirty pages allowed in InnoDB buffer pool. CURRENT_USER() and Access denied error messages now report the hostname exactly as it was specified in the GRANT command. Removed benchmark results from the source and binary distributions. They are still available in the BK source tree, though. InnoDB tables now support ANALYZE TABLE. MySQL now issues an error when it opens a table that was created with MySQL 4.1. Option --new now changes binary items (0xFFDF) to be treated as binary strings instead of numbers by default. This fixes some problems with character sets where it's convenient to input the string as a binary item. After this change you have to convert the binary string to INTEGER with a CAST if you want to compare two binary items with each other and know which one is bigger than the other. SELECT CAST(0xfeff AS UNSIGNED) < CAST(0xff AS UNSIGNED). This will be the default behavior in MySQL 4.1. (Bug #152) Enabled delayed_insert_timeout on Linux (most modern glibc libraries have a fixed pthread_cond_timedwait()). (Bug #211) Don't create more insert delayed threads than given by max_delayed_threads. (Bug #211) Changed UPDATE ... LIMIT to apply the limit to rows that were matched, whether or not they actually were changed. Previously the limit was applied as a restriction on the number of rows changed. Tuned optimizer to favor clustered index over table scan. BIT_AND() and BIT_OR() now return an unsigned 64-bit value. Added warnings to error log of why a secure connection failed (when running with --logwarnings). Deprecated options --skip-symlink and --use-symbolic-links and replaced these with -symbolic-links. The default option for innodb_flush_log_at_trx_commit was changed from 0 to 1 to make InnoDB tables ACID by default. See Section 15.5, Options de dmarrage InnoDB . Added a feature to SHOW KEYS to display keys that are disabled by ALTER TABLE DISABLE KEYS command. When using a non-existing table type with CREATE TABLE, first try if the default table type exists before falling back to MyISAM. Added MEMORY as an alias for HEAP. Renamed function rnd to my_rnd as the name was too generic and is an exported symbol in libmysqlclient (thanks to Dennis Haney for the initial patch).
1232
Portability fix: renamed include/dbug.h to include/my_dbug.h. mysqldump no longer silently deletes the binary logs when invoked with the --master-data or -first-slave option; while this behavior was convenient for some users, others may suffer from it. Now you must explicitly ask for binary logs to be deleted by using the new --delete-masterlogs option. If the slave is configured (using for example replicate-wild-ignore-table=mysql. %) to exclude mysql.user, mysql.host, mysql.db, mysql.tables_priv and mysql.columns_priv from replication, then GRANT and REVOKE will not be replicated. Bogues corrigs : Logged Access denied error message had incorrect Using password value. (Bug #398) Fixed bug with NATURAL LEFT JOIN, NATURAL RIGHT JOIN and RIGHT JOIN when using many joined tables. The problem was that the JOIN method was not always associated with the tables surrounding the JOIN method. If you have a query that uses many RIGHT JOIN or NATURAL ... JOINS you should verify that they work as you expected after upgrading MySQL to this version. (Bug #291) Fixed mysql parser not to erroneously interpret ' or " characters within /* ... */ comment as beginning a quoted string. mysql command line client no longer looks for \* commands inside backtick-quoted strings. Fixed Unknown error when using UPDATE ... LIMIT. (Bug #373) Fixed problem with ANSI mode and GROUP BY with constants. (Bug #387) Fixed bug with UNION and OUTER JOIN. (Bug #386) Fixed bug if one used a multiple-table UPDATE and the query required a temporary table bigger than tmp_table_size. (Bug #286) Run mysql_install_db with the -IN-RPM option for the Mac OS X installation to not fail on systems with improperly configured hostname configurations. LOAD DATA INFILE will now read 000000 as a zero date instead as "2000-00-00". Fixed bug that caused DELETE FROM table WHERE const_expression always to delete the whole table (even if expression result was false). (Bug #355) Fixed core dump bug when using FORMAT('nan',#). (Bug #284) Fixed name resolution bug with HAVING ... COUNT(DISTINCT ...). Fixed incorrect result from truncation operator (*) in MATCH ... AGAINST() in some complex joins. Fixed a crash in REPAIR ... USE_FRM command, when used on read-only, nonexisting table or a table with a crashed index file. Fixed a crashing bug in mysql monitor program. It occurred if program was started with --nodefaults, with a prompt that contained the hostname and a connection to a non-existent database was requested. Fixed problem when comparing a key for a multi-byte character set. (Bug #152) Fixed bug in LEFT, RIGHT and MID when used with multi-byte character sets and some GROUP BY queries. (Bug #314) Fix problem with ORDER BY being discarded for some DISTINCT queries. (Bug #275)
1233
Fixed that SET SQL_BIG_SELECTS=1 works as documented (This corrects a new bug introduced in 4.0) Fixed some serious bugs in UPDATE ... ORDER BY. (Bug #241) Fixed unlikely problem in optimizing WHERE clause with constant expression like in WHERE 1 AND (a=1 AND b=1). Fixed that SET SQL_BIG_SELECTS=1 works again. Introduced proper backtick quoting for db.table in SHOW GRANTS. FULLTEXT index stopped working after ALTER TABLE that converts TEXT column to CHAR. (Bug #283) Fixed a security problem with SELECT and wildcarded select list, when user only had partial column SELECT privileges on the table. Mark a MyISAM table as "analyzed" only when all the keys are indeed analyzed. Only ignore world-writable my.cnf files that are regular files (and not, for example, named pipes or character devices). Fixed few smaller issues with SET PASSWORD. Fixed error message which contained deprecated text. Fixed a bug with two NATURAL JOINs in the query. SUM() didn't return NULL when there was no rows in result or when all values was NULL. On Unix symbolic links handling was not enabled by default and there was no way to turn this on. Added missing dashes to parameter --open-files-limit in mysqld_safe. (Bug #264) Fixed incorrect hostname for TCP/IP connections displayed in SHOW PROCESSLIST. Fixed a bug with NAN in FORMAT(...) function ... Fixed a bug with improperly cached database privileges. Fixed a bug in ALTER TABLE ENABLE / DISABLE KEYS which failed to force a refresh of table data in the cache. Fixed bugs in replication of LOAD DATA INFILE for custom parameters (ENCLOSED, TERMINATED and so on) and temporary tables. (Bug #183, Bug #222) Fixed a replication bug when the master is 3.23 and the slave 4.0: the slave lost the replicated temporary tables if FLUSH LOGS was issued on the master. (Bug #254) Fixed a bug when doing LOAD DATA INFILE IGNORE: When reading the binary log, mysqlbinlog and the replication code read REPLACE instead of IGNORE. This could make the slave's table become different from the master's table. (Bug #218) Fixed a deadlock when relay_log_space_limit was set to a too small value. (Bug #79) Fixed a bug in HAVING clause when an alias is used from the select list. Fixed overflow bug in MyISAM when a row is inserted into a table with a large number of columns and at least one BLOB/TEXT column. Bug was caused by incorrect calculation of the needed buffer to pack data. Fixed a bug when SELECT @nonexistent_variable caused the error in client - server protocol due to net_printf() being sent to the client twice.
1234
Fixed a bug in setting SQL_BIG_SELECTS option. Fixed a bug in SHOW PROCESSLIST which only displayed a localhost in the "Host" column. This was caused by a glitch that used only current thread information instead of information from the linked list of threads. Removed unnecessary Mac OS X helper files from server RPM. (Bug #144) Allow optimization of multiple-table update for InnoDB tables as well. Fixed a bug in multiple-table updates that caused some rows to be updated several times. Fixed a bug in mysqldump when it was called with --master-data: the CHANGE MASTER TO commands appended to the SQL dump had incorrect coordinates. (Bug #159) Fixed a bug when an updating query using USER() was replicated on the slave; this caused segfault on the slave. (Bug #178). USER() is still badly replicated on the slave (it is replicated to "").
1235
RAND() entries were not read correctly by mysqlbinlog from the binary log which caused problems when restoring a table that was inserted with RAND(). INSERT INTO t1 VALUES(RAND()). In replication this worked ok. SET SQL_LOG_BIN=0 was ignored for INSERT DELAYED queries. (Bug #104) SHOW SLAVE STATUS reported too old positions (columns Relay_Master_Log_File and Exec_Master_Log_Pos) for the last executed statement from the master, if this statement was the COMMIT of a transaction. The master must be upgraded for that, not the slave. (Bug #52) LOAD DATA INFILE was not replicated by the slave if replicate_*_table was set on the slave. (Bug #86) After RESET SLAVE, the coordinates displayed by SHOW SLAVE STATUS looked un-reset (though they were, but only internally). (Bug #70) Fixed query cache invalidation on LOAD DATA. Fixed memory leak on ANALYZE procedure with error. Fixed a bug in handling CHAR(0) columns that could cause incorrect results from the query. Fixed rare bug with incorrect initialization of AUTO_INCREMENT column, as a secondary column in a multi-column key (see Section 3.6.9, Utiliser AUTO_INCREMENT ), when data was inserted with INSERT ... SELECT or LOAD DATA into an empty table. On Windows, STOP SLAVE didn't stop the slave until the slave got one new command from the master (this bug has been fixed for MySQL 4.0.11 by releasing updated 4.0.11a Windows packages, which include this individual fix on top of the 4.0.11 sources). (Bug #69) Fixed a crash when no database was selected and LOAD DATA command was issued with full table name specified, including database prefix. Fixed a crash when shutting down replication on some platforms (for example, Mac OS X). Fixed a portability bug with pthread_attr_getstacksize on HP-UX 10.20 (Patch was also included in 4.0.11a sources). Fixed the bigint test to not fail on some platforms (for example, HP-UX and Tru64) due to different return values of the atof() function. Fixed the rpl_rotate_logs test to not fail on certain platforms (e.g. Mac OS X) due to a too long file name (changed slave-master-info.opt to .slave-mi).
1236
Novell NetWare 6.0 porting effort completed, Novell patches merged into the main source tree. Bogues corrigs : Fixed problem with multiple-table delete and InnoDB tables. Fixed a problem with BLOB NOT NULL columns used with IS NULL. Re-added missing pre- and post(un)install scripts to the Linux RPM packages (they were missing after the renaming of the server subpackage). Fixed that table locks are not released with multiple-table updates and deletes with InnoDB storage engine. Fixed bug in updating BLOB columns with long strings. Fixed integer-wraparound when giving big integer (>= 10 digits) to function that requires an unsigned argument, like CREATE TABLE (...) AUTO_INCREMENT=#. MIN(key_column) could in some cases return NULL on a column with NULL and other values. MIN(key_column) and MAX(key_column) could in some cases return incorrect values when used in OUTER JOIN. MIN(key_column) and MAX(key_column) could return incorrect values if one of the tables was empty. Fixed rare crash in compressed MyISAM tables with blobs. Fixed bug in using aggregate functions as argument for INTERVAL, CASE, FIELD, CONCAT_WS, ELT and MAKE_SET functions. When running with --lower-case-table-names (default on Windows) and you had tables or databases with mixed case on disk, then executing SHOW TABLE STATUS followed with DROP DATABASE or DROP TABLE could fail with Errcode 13.
1237
If a slave is configured with replicate_wild_do_table=db.% or replicate_wild_ignore_table=db.%, these rules will be applied to CREATE/DROP DATABASE, too. Added timeout value for MASTER_POS_WAIT(). Bogues corrigs : Fixed initialization of the random seed for newly created threads to give a better rand() distribution from the first call. Fixed a bug that caused mysqld to hang when a table was opened with the HANDLER command and then dropped without being closed. Fixed bug in logging to binary log (which affects replication) a query that inserts a NULL in an AUTO_INCREMENT column and also uses LAST_INSERT_ID(). Fixed an unlikely bug that could cause a memory overrun when using ORDER BY constant_expression. Fixed a table corruption in myisamchk's parallel repair mode. Fixed bug in query cache invalidation on simple table renaming. Fixed bug in mysqladmin --relative. On some 64-bit systems, show status reported a strange number for Open_files and Open_streams. Fixed incorrect number of columns in EXPLAIN on empty table. Fixed bug in LEFT JOIN that caused zero rows to be returned in the case the WHERE condition was evaluated as FALSE after reading const tables. (Unlikely condition). FLUSH PRIVILEGES didn't correctly flush table/column privileges when mysql.tables_priv is empty. Fixed bug in replication when using LOAD DATA INFILE one a file that updated an AUTO_INCREMENT column with NULL or 0. This bug only affected MySQL 4.0 masters (not slaves or MySQL 3.23 masters). Note: If you have a slave that has replicated a file with generated AUTO_INCREMENT columns then the slave data is corrupted and you should reinitialize the affected tables from the master. Fixed possible memory overrun when sending a BLOB value larger than 16M to the client. Fixed incorrect error message when setting a NOT NULL column to an expression that returned NULL. Fixed core dump bug in str LIKE "%other_str%" where str or other_str contained characters >= 128. Fixed bug: When executing on master LOAD DATA and InnoDB failed with table full error the binary log was corrupted.
1238
Added join operator FORCE INDEX (key_list). This acts likes USE INDEX (key_list) but with the addition that a table scan is assumed to be VERY expensive. One bad thing with this is that it makes FORCE a reserved word. Reset internal row buffer in MyISAM after each query. This will reduce memory in the case you have a lot of big blobs in a table. Bogues corrigs : A security patch in 4.0.8 causes the mysqld server to die if the remote hostname can't be resolved. This is now fixed. Fixed crash when replication big LOAD DATA INFILE statement that caused log rotation.
1239
mysql_drop_db() didn't check permissions properly so anyone could drop another users database. DROP DATABASE is checked properly.
1240
A fix for the bug in a SELECT with joined tables with ORDER BY and LIMIT clause when filesort had to be used. In that case LIMIT was applied to filesort of one of the tables, although it could not be. This fix also solved problems with LEFT JOIN. mysql_server_init() now makes a copy of all arguments. This fixes a problem when using the embedded server in C# program. Fixed buffer overrun in libmysqlclient library that allowed a malicious MySQL server to crash the client application. Fixed security-related bug in mysql_change_user() handling. All users are strongly recommended to upgrade to version 4.0.6. Fixed bug that prevented --chroot command-line option of mysqld from working. Fixed bug in phrase operator "..." in boolean full-text search. Fixed bug that caused OPTIMIZE TABLE to corrupt the table under some rare circumstances. Part rewrite of multiple-table-update to optimize it, make it safer and more bug free. LOCK TABLES now works together with multiple-table-update and multiple-table-delete. --replicate-do=xxx didn't work for UPDATE commands. (Bug introduced in 4.0.0) Fixed shutdown problem on Mac OS X. Major InnoDB bugs in REPLACE, AUTO_INCREMENT, INSERT INTO ... SELECT ... were fixed. See the InnoDB changelog in the InnoDB section of the manual. RESET SLAVE caused a crash if the slave threads were running.
1241
One can create TEMPORARY MERGE tables now. DELETE FROM myisam_table now shrinks not only the .MYD file but also the .MYI file. When one uses the --open-files-limit=# option to mysqld_safe it's now passed on to mysqld. Changed output from EXPLAIN from 'where used' to 'Using where' to make it more in line with other output. Removed variable safe_show_database as it was no longer used. Updated source tree to be built using automake 1.5 and libtool 1.4. Fixed an inadvertently changed option (--ignore-space) back to the original --ignore-spaces in mysqlclient. (Both syntaxes will work). Don't require UPDATE privilege when using REPLACE. Added support for DROP TEMPORARY TABLE ..., to be used to make replication safer. When transactions are enabled, all commands that update temporary tables inside a BEGIN/ COMMIT are now stored in the binary log on COMMIT and not stored if one does ROLLBACK. This fixes some problems with non-transactional temporary tables used inside transactions. Allow braces in joins in all positions. Formerly, things like SELECT * FROM (t2 LEFT JOIN t3 USING (a)), t1 worked, but not SELECT * FROM t1, (t2 LEFT JOIN t3 USING (a)). Note that braces are simply removed, they do not change the way the join is executed. InnoDB now supports also isolation levels READ UNCOMMITTED and READ COMMITTED. For a detailed InnoDB changelog, see Section C.9, Evolutions de InnoDB in this manual. Bogues corrigs : Fixed bug in MAX() optimization when used with JOIN and ON expressions. Fixed that INSERT DELAY threads don't hang on Waiting for INSERT when one sends a SIGHUP to mysqld. Fixed that MySQL will not use an index scan on an index that has been disabled with IGNORE INDEX or USE INDEX. Corrected test for root user in mysqld_safe. Fixed error message issued when storage engine cannot do CHECK or REPAIR. Fixed rare core dump problem in complicated GROUP BY queries that didn't return any result. Fixed mysqlshow to work properly with wildcarded database names and with database names that contain underscores. Portability fixes to get MySQL to compile cleanly with Sun Forte 5.0. Fixed MyISAM crash when using dynamic-row tables with huge numbers of packed fields. Fixed query cache behavior with BDB transactions. Fixed possible floating point exception in MATCH relevance calculations. Fixed bug in full-text search IN BOOLEAN MODE that made MATCH to return incorrect relevance value in some complex joins. Fixed a bug that limited MyISAM key length to a value slightly less that 500. It is exactly 500 now.
1242
Fixed that GROUP BY on columns that may have a NULL value doesn't always use disk based temporary tables. The filename argument for the --des-key-file argument to mysqld is interpreted relative to the data directory if given as a relative pathname. Removed a condition that temp table with index on column that can be NULL has to be MyISAM. This was okay for 3.23, but not needed in 4.*. This resulted in slowdown in many queries since 4.0.2. Small code improvement in multiple-table updates. Fixed a newly introduced bug that caused ORDER BY ... LIMIT row_count to not return all rows. Fixed a bug in multiple-table deletes when outer join is used on an empty table, which gets first to be deleted. Fixed a bug in multiple-table updates when a single table is updated. Fixed bug that caused REPAIR TABLE and myisamchk to corrupt FULLTEXT indexes. Fixed bug with caching the mysql grant table database. Now queries in this database are not cached in the query cache. Small fix in mysqld_safe for some shells. Give error if a MyISAM MERGE table has more than 2 ^ 32 rows and MySQL was not compiled with DBIG_TABLES. Fixed some ORDER BY ... DESC problems with InnoDB tables.
1243
In SHOW TABLE ... STATUS, compressed tables sometimes showed up as dynamic. SELECT @@[global|session].var_name didn't report global | session in the result column name. Fixed problem in replication that FLUSH LOGS in a circular replication setup created an infinite number of binary log files. Now a rotate-binary-log command in the binary log will not cause slaves to rotate logs. Removed STOP EVENT from binary log when doing FLUSH LOGS. Disable the use of SHOW NEW MASTER FOR SLAVE as this needs to be completely reworked in a future release. Fixed a bug with constant expression (for example, field of a one-row table, or field from a table, referenced by a UNIQUE key) appeared in ORDER BY part of SELECT DISTINCT. --log-binary=a.b.c now properly strips off .b.c. FLUSH LOGS removed numerical extension for all future update logs. GRANT ... REQUIRE didn't store the SSL information in the mysql.user table if SSL was not enabled in the server. GRANT ... REQUIRE NONE can now be used to remove SSL information. AND is now optional between REQUIRE options. REQUIRE option was not properly saved, which could cause strange output in SHOW GRANTS. Fixed that mysqld --help reports correct values for --datadir and --bind-address. Fixed that one can drop UDFs that didn't exist when mysqld was started. Fixed core dump problem with SHOW VARIABLES on some 64-bit systems (like Solaris SPARC). Fixed a bug in my_getopt(); --set-variable syntax didn't work for those options that didn't have a valid variable in the my_option struct. This affected at least the default-table-type option. Fixed a bug from 4.0.2 that caused REPAIR TABLE and myisamchk --recover to fail on tables with duplicates in a unique key. Fixed a bug from 4.0.3 in calculating the default datatype for some functions. This affected queries of type CREATE TABLE table_name SELECT expression(),... Fixed bug in queries of type SELECT * FROM table-list GROUP BY ... and SELECT DISTINCT * FROM .... Fixed bug with the --slow-log when logging an administrator command (like FLUSH TABLES). Fixed a bug that OPTIMIZE of locked and modified table, reported table corruption. Fixed a bug in my_getopt() in handling of special prefixes (--skip-, --enable-). --skipexternal-locking didn't work and the bug may have affected other similar options. Fixed bug in checking for output file name of the tee option. Added some more optimization to use index for SELECT ... FROM many_tables .. ORDER BY key limit # Fixed problem in SHOW OPEN TABLES when a user didn't have access permissions to one of the opened tables.
1244
1245
Fixed bug in multiple-table UPDATE: when updating a table, do_select() became confused about reading records from a cache. Fixed bug in multiple-table UPDATE when several fields were referenced from a single table Fixed bug in truncating nonexisting table. Fixed bug in REVOKE that caused user resources to be randomly set. Fixed bug in GRANT for the new CREATE TEMPORARY TABLE privilege. Fixed bug in multiple-table DELETE when tables are re-ordered in the table initialization method and ref_lengths are of different sizes. Fixed two bugs in SELECT DISTINCT with large tables. Fixed bug in query cache initialization with very small query cache size. Allow DEFAULT with INSERT statement. The startup parameters myisam_max_sort_file_size and myisam_max_extra_sort_file_size are now given in bytes, not megabytes. External system locking of MyISAM/ISAM files is now turned off by default. One can turn this on with --external-locking. (For most users this is never needed). Fixed core dump bug with INSERT ... SET db_name.table_name.colname=''. Fixed client hangup bug when using some SQL commands with incorrect syntax. Fixed a timing bug in DROP DATABASE New SET [GLOBAL | SESSION] syntax to change thread-specific and global server variables at runtime. Added variable slave_compressed_protocol. Renamed variable query_cache_startup_type to query_cache_type, myisam_bulk_insert_tree_size to bulk_insert_buffer_size, record_buffer to read_buffer_size and record_rnd_buffer to read_rnd_buffer_size. Renamed some SQL variables, but old names will still work until 5.0. See Section 2.6.3, Passer de la version 3.23 la version 4.0 . Renamed --skip-locking to --skip-external-locking. Removed unused variable query_buffer_size. Fixed a bug that made the pager option in the mysql client non-functional. Added full AUTO_INCREMENT support to MERGE tables. Extended LOG() function to accept an optional arbitrary base parameter. See Section 12.4.2, Fonctions mathmatiques . Added LOG2() function (useful for finding out how many bits a number would require for storage). Added LN() natural logarithm function for compatibility with other databases. It is synonymous with LOG(X).
1246
Fixed truncate() to round up negative values to the nearest integer. Changed --chroot=path option to execute chroot() immediately after all options have been parsed. Don't allow database names that contain \. lower_case_table_names now also affects database names. Added XOR operator (logical and bitwise XOR) with ^ as a synonym for bitwise XOR. Added function IS_FREE_LOCK("lock_name"). Based on code contributed by Hartmut Holzgraefe <hartmut@six.de>. Removed mysql_ssl_clear() from C API, as it was not needed. DECIMAL and NUMERIC types can now read exponential numbers. Added SHA1() function to calculate 160 bit hash value as described in RFC 3174 (Secure Hash Algorithm). This function can be considered a cryptographically more secure equivalent of MD5(). See Section 12.8.4, Fonctions diverses . Added AES_ENCRYPT() and AES_DECRYPT() functions to perform encryption according to AES standard (Rijndael). See Section 12.8.4, Fonctions diverses . Added --single-transaction option to mysqldump, allowing a consistent dump of InnoDB tables. See Section 8.8, mysqldump, sauvegarde des structures de tables et les donnes . Fixed bug in innodb_log_group_home_dir in SHOW VARIABLES. Fixed a bug in optimizer with merge tables when non-unique values are used in summing up (causing crashes). Fixed a bug in optimizer when a range specified makes index grouping impossible (causing crashes). Fixed a rare bug when FULLTEXT index is present and no tables are used. Added privileges CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES and SUPER. To use these, you must have run the mysql_fix_privilege_tables script after upgrading. Fixed query cache align data bug. Fixed mutex bug in replication when reading from master fails. Added missing mutex in TRUNCATE TABLE; This fixes some core dump/hangup problems when using TRUNCATE TABLE. Fixed bug in multiple-table DELETE when optimizer uses only indexes. Fixed that ALTER TABLE table_name RENAME new_table_name is as fast as RENAME TABLE. Fixed bug in GROUP BY with two or more fields, where at least one field can contain NULL values. Use Turbo Boyer-Moore algorithm to speed up LIKE "%keyword%" searches. Fixed bug in DROP DATABASE with symlink. Fixed crash in REPAIR ... USE_FRM. Fixed bug in EXPLAIN with LIMIT offset != 0. Fixed bug in phrase operator "..." in boolean full-text search. Fixed bug that caused duplicated rows when using truncation operator * in boolean full-text search.
1247
Fixed bug in truncation operator of boolean full-text search (incorrect results when there are only +word*s in the query). Fixed bug in boolean full-text search that caused a crash when an identical MATCH expression that did not use an index appeared twice. Query cache is now automatically disabled in mysqldump. Fixed problem on Windows 98 that made sending of results very slow. Boolean full-text search weighting scheme changed to something more reasonable. Fixed bug in boolean full-text search that caused MySQL to ignore queries of ft_min_word_len characters. Boolean full-text search now supports ``phrase searches''. New configure option --without-query-cache. Memory allocation strategy for ``root memory'' changed. Block size now grows with number of allocated blocks. INET_NTOA() now returns NULL if you give it an argument that is too large (greater than the value corresponding to 255.255.255.255). Fix SQL_CALC_FOUND_ROWS to work with UNION. It will work only if the first SELECT has this option and if there is global LIMIT for the entire statement. For the moment, this requires using parentheses for individual SELECT queries within the statement. Fixed bug in SQL_CALC_FOUND_ROWS and LIMIT. Don't give an error for CREATE TABLE ...(... VARCHAR(0)). Fixed SIGINT and SIGQUIT problems in mysql.cc on Linux with some glibc versions. Fixed bug in convert.cc, which is caused by having an incorrect net_store_length() linked in the CONVERT::store() method. DOUBLE and FLOAT columns now honor the UNSIGNED flag on storage. InnoDB now retains foreign key constraints through ALTER TABLE and CREATE/DROP INDEX. InnoDB now allows foreign key constraints to be added through the ALTER TABLE syntax. InnoDB tables can now be set to automatically grow in size (autoextend). Added --ignore-lines=n option to mysqlimport. This has the same effect as the IGNORE n LINES clause for LOAD DATA. Fixed bug in UNION with last offset being transposed to total result set. REPAIR ... USE_FRM added. Fixed that DEFAULT_SELECT_LIMIT is always imposed on UNION result set. Fixed that some SELECT options can appear only in the first SELECT. Fixed bug with LIMIT with UNION, where last select is in the braces. Fixed that full-text works fine with UNION operations. Fixed bug with indexless boolean full-text search. Fixed bug that sometimes appeared when full-text search was used with const tables.
1248
Fixed incorrect error value when doing a SELECT with an empty HEAP table. Use ORDER BY column DESC now sorts NULL values first. (In other words, NULL values sort first in all cases, whether or not DESC is specified.) This is changed back in 4.0.10. Fixed bug in WHERE key_name='constant' ORDER BY key_name DESC. Fixed bug in SELECT DISTINCT ... ORDER BY DESC optimization. Fixed bug in ... HAVING 'GROUP_FUNCTION'(xxx) IS [NOT] NULL. Fixed bug in truncation operator for boolean full-text search. Allow value of --user=# option for mysqld to be specified as a numeric user ID. Fixed a bug where SQL_CALC_ROWS returned an incorrect value when used with one table and ORDER BY and with InnoDB tables. Fixed that SELECT 0 LIMIT 0 doesn't hang thread. Fixed some problems with USE/IGNORE INDEX when using many keys with the same start column. Don't use table scan with BerkeleyDB and InnoDB tables when we can use an index that covers the whole row. Optimized InnoDB sort-buffer handling to take less memory. Fixed bug in multiple-table DELETE and InnoDB tables. Fixed problem with TRUNCATE and InnoDB tables that produced the error Can't execute the given command because you have active locked tables or an active transaction. Added NO_UNSIGNED_SUBTRACTION to the set of flags that may be specified with the --sql-mode option for mysqld. It disables unsigned arithmetic rules when it comes to subtraction. (This will make MySQL 4.0 behave more like 3.23 with UNSIGNED columns). The result returned for all bit functions (|, <<, ...) is now of type unsigned integer. Added detection of nan values in MyISAM to make it possible to repair tables with nan in float or double columns. Fixed new bug in myisamchk where it didn't correctly update number of ``parts'' in the MyISAM index file. Changed to use autoconf 2.52 (from autoconf 2.13). Fixed optimization problem where the MySQL Server was in ``preparing'' state for a long time when selecting from an empty table which had contained a lot of rows. Fixed bug in complicated join with const tables. This fix also improves performance a bit when referring to another table from a const table. First pre-version of multiple-table UPDATE statement. Fixed bug in multiple-table DELETE. Fixed bug in SELECT CONCAT(argument_list) ... GROUP BY 1. INSERT ... SELECT did a full rollback in case of an error. Fixed so that we only roll back the last statement in the current transaction. Fixed bug with empty expression for boolean full-text search.
1249
Fixed core dump bug in updating full-text key from/to NULL. ODBC compatibility: Added BIT_LENGTH() function. Fixed core dump bug in GROUP BY BINARY column. Added support for NULL keys in HEAP tables. Use index for ORDER BY in queries of type: SELECT * FROM t WHERE key_part1=1 ORDER BY key_part1 DESC,key_part2 DESC Fixed bug in FLUSH QUERY CACHE. Added CAST() and CONVERT() functions. The CAST and CONVERT functions are nearly identical and mainly useful when you want to create a column with a specific type in a CREATE ... SELECT statement. For more information, read Section 12.7, Fonctions de transtypage . CREATE ... SELECT on DATE and TIME functions now create columns of the expected type. Changed order in which keys are created in tables. Added new columns Null and Index_type to SHOW INDEX output. Added --no-beep and --prompt options to mysql command-line client. New feature: management of user resources.
GRANT ... WITH MAX_QUERIES_PER_HOUR N1 MAX_UPDATES_PER_HOUR N2 MAX_CONNECTIONS_PER_HOUR N3;
See Section 5.6.4, Limiter les ressources utilisateurs . Added mysql_secure_installation to the scripts/ directory.
1250
Fixed core dump bug on 64-bit machines when it got an incorrect communication packet. MATCH ... AGAINST(... IN BOOLEAN MODE) can now work without FULLTEXT index. Fixed slave to replicate from 3.23 master. Miscellaneous replication fixes/cleanup. Got shutdown to work on Mac OS X. Added myisam/ft_dump utility for low-level inspection of FULLTEXT indexes. Fixed bug in DELETE ... WHERE ... MATCH .... Added support for MATCH ... AGAINST(... IN BOOLEAN MODE). Note: you must rebuild your tables with ALTER TABLE tablename TYPE=MyISAM to be able to use boolean full-text search. LOCATE() and INSTR() are now case-sensitive if either argument is a binary string. Changed RAND() initialization so that RAND(N) and RAND(N+1) are more distinct. Fixed core dump bug in UPDATE ... ORDER BY. In 3.23, INSERT INTO ... SELECT always had IGNORE enabled. Now MySQL will stop (and possibly roll back) by default in case of an error unless you specify IGNORE. Ignore DATA DIRECTORY and INDEX DIRECTORY directives on Windows. Added boolean full-text search code. It should be considered early alpha. Extended MODIFY and CHANGE in ALTER TABLE to accept the FIRST and AFTER keywords. Indexes are now used with ORDER BY on a whole InnoDB table.
1251
TRUNCATE TABLE and DELETE FROM tbl_name are now separate functions. One bonus is that DELETE FROM tbl_name now returns the number of deleted rows, rather than zero. DROP DATABASE now executes a DROP TABLE on all tables in the database, which fixes a problem with InnoDB tables. Added support for UNION. Added support for multiple-table DELETE operations. A new HANDLER interface to MyISAM tables. Added support for INSERT on MERGE tables. Patch from Benjamin Pflugmann. Changed WEEK(date,0) to match the calendar in the USA. COUNT(DISTINCT) is about 30% faster. Speed up all internal list handling. Speed up IS NULL, ISNULL() and some other internal primitives. Full-text index creation now is much faster. Tree-like cache to speed up bulk inserts and myisam_bulk_insert_tree_size variable. Searching on packed (CHAR/VARCHAR) keys is now much faster. Optimized queries of type: SELECT DISTINCT * from tbl_name ORDER by key_part1 LIMIT row_count. SHOW CREATE TABLE now shows all table attributes. ORDER BY ... DESC can now use keys. LOAD DATA FROM MASTER ``automatically'' sets up a slave. Renamed safe_mysqld to mysqld_safe to make this name more in line with other MySQL scripts/commands. Added support for symbolic links to MyISAM tables. Symlink handling is now enabled by default for Windows. Added SQL_CALC_FOUND_ROWS and FOUND_ROWS(). This makes it possible to know how many rows a query would have returned without a LIMIT clause. Changed output format of SHOW OPEN TABLES. Allow SELECT expression LIMIT .... Added ORDER BY syntax to UPDATE and DELETE. SHOW INDEXES is now a synonym for SHOW INDEX. Added ALTER TABLE tbl_name DISABLE KEYS and ALTER TABLE tbl_name ENABLE KEYS commands. Allow use of IN as a synonym for FROM in SHOW commands. Implemented ``repair by sort'' for FULLTEXT indexes. REPAIR TABLE, ALTER TABLE, and OPTIMIZE TABLE for tables with FULLTEXT indexes are now up to 100 times faster. Allow standard SQL syntax X'hexadecimal-number'.
1252
Cleaned up global lock handling for FLUSH TABLES WITH READ LOCK. Fixed problem with DATETIME = constant in WHERE optimization. Added --master-data and --no-autocommit options to mysqldump. (Thanks to Brian Aker for this.) Added script mysql_explain_log.sh to distribution. (Thanks to mobile.de).
1253
then the slave stopped and warned that the error codes didn't match. This is a backport of the fix for MySQL 4.0. (Bug #797) mysqlbinlog now asks for a password at console when the -p/--password option is used with no argument. This is how the other clients (mysqladmin, mysqldump..) already behave. Note that one now has to use mysqlbinlog -p<my_password>; mysqlbinlog -p <my_password> will not work anymore (in other words, put no space after -p). (Bug #1595) On some 64-bit machines (some HP-UX and Solaris machines), a slave installed with the 64-bit MySQL binary could not connect to its master (it connected to itself instead). (Bug #1256, Bug #1381) Fixed a Windows-specific bug present since MySQL 3.23.57 and 3.23.58 that caused Windows slaves to crash when they started replication if a master.info file existed. (Bug #1720) Fixed bug in ALTER TABLE RENAME, when rename to the table with the same name in another database silently dropped destination table if it existed. (Bug #2628)
1254
Fixed a security problem with SELECT and wildcarded select list, when user only had partial column SELECT privileges on the table. Fixed unlikely problem in optimizing WHERE clause with a constant expression such as in WHERE 1 AND (a=1 AND b=1). Fixed problem on IA-64 with timestamps that caused mysqlbinlog to fail. The default option for innodb_flush_log_at_trx_commit was changed from 0 to 1 to make InnoDB tables ACID by default. See Section 15.5, Options de dmarrage InnoDB . Fixed problem with too many allocated alarms on slave when connecting to master many times (normally not a very critical error). Fixed a bug in replication of temporary tables. (Bug #183) Fixed 64-bit bug that affected at least AMD hammer systems. Fixed a bug when doing LOAD DATA INFILE IGNORE: When reading the binary log, mysqlbinlog and the replication code read REPLACE instead of IGNORE. This could make the slave's table become different from the master's table. (Bug #218) Fixed overflow bug in MyISAM when a row is inserted into a table with a large number of columns and at least one BLOB/TEXT column. Bug was caused by incorrect calculation of the needed buffer to pack data. The binary log was not locked during TRUNCATE table_name or DELETE FROM table_name statements, which could cause an INSERT to table_name to be written to the log before the TRUNCATE or DELETE statements. Fixed rare bug in UPDATE of InnoDB tables where one row could be updated multiple times. Produce an error for empty table and column names. Changed PROCEDURE ANALYSE() to report DATE instead of NEWDATE. Changed PROCEDURE ANALYSE(#) to restrict the number of values in an ENUM column to # also for string values. mysqldump no longer silently deletes the binary logs when invoked with the --master-data or -first-slave option; while this behavior was convenient for some users, others may suffer from it. Now one has to explicitly ask for binary logs to be deleted by using the new --delete-masterlogs option. Fixed a bug in mysqldump when it was invoked with the --master-data option: The CHANGE MASTER TO statements that were appended to the SQL dump had incorrect coordinates. (Bug #159)
1255
Security enhancement: Don't allow BACKUP TABLE to overwrite existing files. Fixed unlikely deadlock bug when one thread did a LOCK TABLE and another thread did a DROP TABLE. In this case one could do a KILL on one of the threads to resolve the deadlock. LOAD DATA INFILE was not replicated by slave if replicate_*_table was set on the slave. Fixed a bug in handling CHAR(0) columns that could cause incorrect results from the query. Fixed a bug in SHOW VARIABLES on 64-bit platforms. The bug was caused by incorrect declaration of variable server_id. The Comment column in SHOW TABLE STATUS now reports that it can contain NULL values (which is the case for a crashed .frm file). Fixed the rpl_rotate_logs test to not fail on certain platforms (e.g. Mac OS X) due to a too long file name (changed slave-master-info.opt to .slave-mi). Fixed a problem with BLOB NOT NULL columns used with IS NULL. Fixed bug in MAX() optimization in MERGE tables. Better RAND() initialization for new connections. Fixed bug with connect timeout. This bug was manifested on OS's with poll() system call, which resulted in timeout the value specified as it was executed in both select() and poll(). Fixed bug in SELECT * FROM table WHERE datetime1 IS NULL OR datetime2 IS NULL. Fixed bug in using aggregate functions as argument for INTERVAL, CASE, FIELD, CONCAT_WS, ELT and MAKE_SET functions. When running with --lower-case-table-names (default on Windows) and you had tables or databases with mixed case on disk, then executing SHOW TABLE STATUS followed with DROP DATABASE or DROP TABLE could fail with Errcode 13. Fixed bug in logging to binary log (which affects replication) a query that inserts a NULL in an auto_increment field and also uses LAST_INSERT_ID(). Fixed bug in mysqladmin --relative. On some 64-bit systems, show status reported a strange number for Open_files and Open_streams.
1256
Fixed a bug in scripts/mysqld_safe.sh in NOHUP_NICENESS testing. Transactions in AUTOCOMMIT=0 mode didn't rotate binary log. Fixed a bug in scripts/make_binary_distribution that resulted in a remaining @HOSTNAME@ variable instead of replacing it with the correct path to the hostname binary. Fixed a very unlikely bug that could cause SHOW PROCESSLIST to core dump in pthread_mutex_unlock() if a new thread was connecting. Forbid SLAVE STOP if the thread executing the query has locked tables. This removes a possible deadlock situation.
1257
Fixed MyISAM crash when using dynamic-row tables with huge numbers of packed fields. Updated source tree to be built using automake 1.5 and libtool 1.4.
1258
Fixed thread bug in SLAVE START, SLAVE STOP and automatic repair of MyISAM tables that could cause table cache to be corrupted. Fixed possible thread related key-cache-corruption problem with OPTIMIZE TABLE and REPAIR TABLE. Added name of 'administrator command' logs. Fixed bug with creating an auto-increment value on second part of a UNIQUE() key where first part could contain NULL values. Don't write slave-timeout reconnects to the error log. Fixed bug with slave net read timeouting Fixed a core-dump bug with MERGE tables and MAX() function. Fixed bug in ALTER TABLE with BDB tables. Fixed bug when logging LOAD DATA INFILE to binary log with no active database. Fixed a bug in range optimizer (causing crashes). Fixed possible problem in replication when doing DROP DATABASE on a database with InnoDB tables. Fixed mysql_info() to return 0 for Duplicates value when using INSERT DELAYED IGNORE. Added -DHAVE_BROKEN_REALPATH to the Mac OS X (darwin) compile options in configure.in to fix a failure under high load.
1259
If we get an overflow when inserting '+11111' for DECIMAL(5,0) UNSIGNED columns, we will just drop the sign. Fixed optimization bug with ISNULL(expression_which_cannot_be_null) and ISNULL(constant_expression). Fixed host lookup bug in the glibc library that we used with the 3.23.50 Linux-x86 binaries.
1260
Update source to work with new version of bison. Updated shell scripts to now agree with new POSIX standard. Fixed bug where DATE_FORMAT() returned empty string when used with GROUP BY.
1261
If inserts to several tables containing an AUTO_INCREMENT column were wrapped inside one LOCK TABLES, InnoDB asserted in lock0lock.c. In 3.23.47 we allowed several NULL values in a UNIQUE secondary index for an InnoDB table. But CHECK TABLE was not relaxed: it reports the table as corrupt. CHECK TABLE no longer complains in this situation. SHOW GRANTS now shows REFERENCES instead of REFERENCE.
1262
Fixed core dump when repairing corrupted packed MyISAM files. --core-file now works on Solaris. Fix a bug which could cause InnoDB to complain if it cannot find free blocks from the buffer cache during recovery. Fixed bug in InnoDB insert buffer B-tree handling that could cause crashes. Fixed bug in InnoDB lock timeout handling. Fixed core dump bug in ALTER TABLE on a TEMPORARY InnoDB table. Fixed bug in OPTIMIZE TABLE that reset index cardinality if it was up to date. Fixed problem with t1 LEFT_JOIN t2 ... WHERE t2.date_column IS NULL when date_column was declared as NOT NULL. Fixed bug with BDB tables and keys on BLOB columns. Fixed bug in MERGE tables on OS with 32-bit file pointers. Fixed bug in TIME_TO_SEC() when using negative values.
1263
InnoDB now supports datafiles and raw disk partitions bigger than 4 GB on those operating systems that have big files. InnoDB calculates better table cardinality estimates for the MySQL optimizer. Accent characters in the default character set latin1 are ordered according to the MySQL ordering. Note: if you are using latin1 and have inserted characters whose code is greater than 127 into an indexed CHAR column, you should run CHECK TABLE on your table when you upgrade to 3.23.44, and drop and reimport the table if CHECK TABLE reports an error! A new my.cnf parameter, innodb_thread_concurrency, helps in performance tuning in heavily concurrent environments. A new my.cnf parameter, innodb_fast_shutdown, speeds up server shutdown. A new my.cnf parameter, innodb_force_recovery, helps to save your data in case the disk image of the database becomes corrupt. innodb_monitor has been improved and a new innodb_table_monitor added. Increased maximum key length from 500 to 7000 bytes. Fixed a bug in replication of AUTO_INCREMENT columns with multiple-line inserts. Fixed a bug when the case of letters changes in an update of an indexed secondary column. Fixed a hang when there are > 24 datafiles. Fixed a crash when MAX(col) is selected from an empty table, and col is not the first column in a multi-column index. Fixed a bug in purge which could cause crashes.
1264
Fixed rare hang when doing mysqladmin shutdown when there was a lot of activity in other threads. Fixed problem with INSERT DELAYED where delayed thread could be hanging on upgrading locks for no apparent reason. Fixed problem with myisampack and BLOB. Fixed problem when one edited .MRG tables by hand. (Patch from Benjamin Pflugmann). Enforce that all tables in a MERGE table come from the same database. Fixed bug with LOAD DATA INFILE and transactional tables. Fix bug when using INSERT DELAYED with wrong column definition. Fixed core dump during REPAIR of some particularly broken tables. Fixed bug in InnoDB and AUTO_INCREMENT columns. Fixed bug in InnoDB and RENAME TABLE columns. Fixed critical bug in InnoDB and BLOB columns. If you have used BLOB columns larger than 8000 bytes in an InnoDB table, it is necessary to dump the table with mysqldump, drop it and restore it from the dump. Applied large patch for OS/2 from Yuri Dario. Fixed problem with InnoDB when one could get the error Can't execute the given command... even when no transaction was active. Applied some minor fixes that concern Gemini. Use real arithmetic operations even in integer context if not all arguments are integers. (Fixes uncommon bug in some integer contexts). Don't force everything to lowercase on Windows. (To fix problem with Windows and ALTER TABLE). Now --lower_case_names also works on Unix. Fixed that automatic rollback is done when thread end doesn't lock other threads.
1265
Fixed overflow bug with ALTER TABLE and MERGE tables. Added prototypes for my_thread_init() and my_thread_end() to mysql_com.h Added --safe-user-create option to mysqld. Fixed bug in SELECT DISTINCT ... HAVING that caused error message Can't find record in #...
1266
REAL @variable values were represented with only 2 digits when converted to strings. Fixed problem that client ``hung'' when LOAD TABLE FROM MASTER failed. myisamchk --fast --force will no longer repair tables that only had the open count wrong. Added functions to handle symbolic links to make life easier in 4.0. We are now using the -lcma thread library on HP-UX 10.20 so that MySQL will be more stable on HP-UX. Fixed problem with IF() and number of decimals in the result. Fixed date-part extraction functions to work with dates where day and/or month is 0. Extended argument length in option files from 256 to 512 chars. Fixed problem with shutdown when INSERT DELAYED was waiting for a LOCK TABLE. Fixed core dump bug in InnoDB when tablespace was full. Fixed problem with MERGE tables and big tables (> 4G) when using ORDER BY.
1267
1268
Fixed some problems with FLUSH TABLES and TEMPORARY tables. (Problem with freeing the key cache and error Can't reopen table....) Fixed a problem in InnoDB with other character sets than latin1 and another problem when using many columns. Fixed bug that caused a core dump when using a very complex query involving DISTINCT and summary functions. Added SET TRANSACTION ISOLATION LEVEL ... Added SELECT ... FOR UPDATE. Fixed bug where the number of affected rows was not returned when MySQL was compiled without transaction support. Fixed a bug in UPDATE where keys weren't always used to find the rows to be updated. Fixed a bug in CONCAT_WS() where it returned incorrect results. Changed CREATE ... SELECT and INSERT ... SELECT to not allow concurrent inserts as this could make the binary log hard to repeat. (Concurrent inserts are enabled if you are not using the binary or update log.) Changed some macros to be able to use fast mutex with glibc 2.2.
1269
Fixed bug in ALTER TABLE ... ORDER BY. Added max_user_connections variable to mysqld. Limit query length for replication by max_allowed_packet, not the arbitrary limit of 4 MB. Allow space around = in argument to --set-variable. Fixed problem in automatic repair that could leave some threads in state Waiting for table. SHOW CREATE TABLE now displays the UNION=() for MERGE tables. ALTER TABLE now remembers the old UNION=() definition. Fixed bug when replicating timestamps. Fixed bug in bidirectional replication. Fixed bug in the BDB storage engine that occurred when using an index on multi-part key where a key part may be NULL. Fixed MAX() optimization on sub-key for BDB tables. Fixed problem where garbage results were returned when using BDB tables and BLOB or TEXT fields when joining many tables. Fixed a problem with BDB tables and TEXT columns. Fixed bug when using a BLOB key where a const row wasn't found. Fixed that mysqlbinlog writes the timestamp value for each query. This ensures that one gets same values for date functions like NOW() when using mysqlbinlog to pipe the queries to another server. Allow --skip-gemini, --skip-bdb, and --skip-innodb options to be specified when invoking mysqld, even if these storage engines are not compiled in to mysqld. One can now do GROUP BY ... DESC. Fixed a deadlock in the SET code, when one ran SET @foo=bar, where bar is a column reference, an error was not properly generated.
1270
Added --sort-recover option to myisamchk. myisamchk -S and OPTIMIZE TABLE now work on Windows. Fixed bug when using DISTINCT on results from functions that referred to a group function, like:
SELECT a, DISTINCT SEC_TO_TIME(SUM(a)) FROM tbl_name GROUP BY a, b;
Fixed buffer overrun in libmysqlclient library. Fixed bug in handling STOP event after ROTATE event in replication. Fixed another buffer overrun in DROP DATABASE. Added Table_locks_immediate and Table_locks_waited status variables. Fixed bug in replication that broke slave server start with existing master.info. This fixes a bug introduced in 3.23.32. Added SET SQL_SLAVE_SKIP_COUNTER=n command to recover from replication glitches without a full database copy. Added max_binlog_size variable; the binary log will be rotated automatically when the size crosses the limit. Added Last_Error, Last_Errno, and Slave_skip_counter variables to SHOW SLAVE STATUS. Fixed bug in MASTER_POS_WAIT() function. Execute core dump handler on SIGILL, and SIGBUS in addition to SIGSEGV. On x86 Linux, print the current query and thread (connection) id, if available, in the core dump handler. Fixed several timing bugs in the test suite. Extended mysqltest to take care of the timing issues in the test suite. ALTER TABLE can now be used to change the definition for a MERGE table. Fixed creation of MERGE tables on Windows. Portability fixes for OpenBSD and OS/2. Added --temp-pool option to mysqld. Using this option will cause most temporary files created to use a small set of names, rather than a unique name for each new file. This is to work around a problem in the Linux kernel dealing with creating a bunch of new files with different names. With the old behavior, Linux seems to "leak" memory, as it's being allocated to the directory entry cache instead of the disk cache.
1271
Don't convert field names when using mysql_list_fields(). This is to keep this code compatible with SHOW FIELDS. MERGE tables didn't work on Windows. Fixed problem with SET PASSWORD=... on Windows. Added missing my_config.h to RPM distribution. TRIM("foo" from "foo") didn't return an empty string. Added --with-version-suffix option to configure. Fixed core dump when client aborted connection without mysql_close(). Fixed a bug in RESTORE TABLE when trying to restore from a non-existent directory. Fixed a bug which caused a core dump on the slave when replicating SET PASSWORD. Added MASTER_POS_WAIT().
In this case the test in the WHERE clause was wrongly optimized away. Fixed bug in MyISAM when deleting keys with possible NULL values, but the first key-column was not a prefix-compressed text column. Fixed mysql.server to read the [mysql.server] option file group rather than the [mysql_server] group. Fixed safe_mysqld and mysql.server to also read the server option section. Added Threads_created status variable to mysqld.
1272
1273
Fixed a bug in UPDATE involving multi-part keys where one specified all key parts both in the update and the WHERE part. In this case MySQL could try to update a record that didn't match the whole WHERE part. Changed drop table to first drop the tables and then the .frm file. Fixed a bug in the hostname cache which caused mysqld to report the hostname as '' in some error messages. Fixed a bug with HEAP type tables; the variable max_heap_table_size wasn't used. Now either MAX_ROWS or max_heap_table_size can be used to limit the size of a HEAP type table. Changed the default server-id to 1 for masters and 2 for slaves to make it easier to use the binary log. Renamed bdb_lock_max variable to bdb_max_lock. Added support for AUTO_INCREMENT on sub-fields for BDB tables. Added ANALYZE of BDB tables. In BDB tables, we now store the number of rows; this helps to optimize queries when we need an approximation of the number of rows. If we get an error in a multi-row statement, we now only roll back the last statement, not the entire transaction. If you do a ROLLBACK when you have updated a non-transactional table you will get an error as a warning. Added --bdb-shared-data option to mysqld. Added Slave_open_temp_tables status variable to mysqld Added binlog_cache_size and max_binlog_cache_size variables to mysqld. DROP TABLE, RENAME TABLE, CREATE INDEX and DROP INDEX are now transaction endpoints. If you do a DROP DATABASE on a symbolically linked database, both the link and the original database is deleted. Fixed DROP DATABASE to work on OS/2. Fixed bug when doing a SELECT DISTINCT ... table1 LEFT JOIN table2 ... when table2 was empty. Added --abort-slave-event-count and --disconnect-slave-event-count options to mysqld for debugging and testing of replication. Fixed replication of temporary tables. Handles everything except slave server restart. SHOW KEYS now shows whether key is FULLTEXT. New script mysqld_multi. See Section 5.1.5, mysqld_multi, un programme pour grer plusieurs serveurs MySQL . Added new script, mysql-multi.server.sh. Thanks to Tim Bunce <Tim.Bunce@ig.co.uk> for modifying mysql.server to easily handle hosts running many mysqld processes. safe_mysqld, mysql.server, and mysql_install_db have been modified to use mysql_print_defaults instead of various hacks to read the my.cnf files. In addition, the handling of various paths has been made more consistent with how mysqld handles them by default.
1274
Automatically remove Berkeley DB transaction logs that no longer are in use. Fixed bug with several FULLTEXT indexes in one table. Added a warning if number of rows changes on REPAIR/OPTIMIZE. Applied patches for OS/2 by Yuri Dario. FLUSH TABLES tbl_name didn't always flush the index tree to disk properly. --bootstrap is now run in a separate thread. This fixes a problem that caused mysql_install_db to core dump on some Linux machines. Changed mi_create() to use less stack space. Fixed bug with optimizer trying to over-optimize MATCH() when used with UNIQUE key. Changed crash-me and the MySQL benchmarks to also work with FrontBase. Allow RESTRICT and CASCADE after DROP TABLE to make porting easier. Reset status variable which could cause problem if one used --slow-log. Added connect_timeout variable to mysql and mysqladmin. Added connect-timeout as an alias for timeout for option files read by mysql_options().
1275
The --skip-networking option now works properly on NT. Fixed a long outstanding bug in the ISAM tables when a row with a length of more than 65K was shortened by a single byte. Fixed a bug in MyISAM when running multiple updating processes on the same table. Allow one to use FLUSH TABLE tbl_name. Added --replicate-ignore-table, --replicate-do-table, --replicate-wildignore-table, and --replicate-wild-do-table options to mysqld. Changed all log files to use our own IO_CACHE mechanism instead of FILE to avoid OS problems when there are many files open. Added --open-files and --timezone options to safe_mysqld. Fixed a fatal bug in CREATE TEMPORARY TABLE ... SELECT .... Fixed a problem with CREATE TABLE ... SELECT NULL. Added variables large_file_support,net_read_timeout, net_write_timeout and query_buffer_size to SHOW VARIABLES. Added status variables created_tmp_files and sort_merge_passes to SHOW STATUS. Fixed a bug where we didn't allow an index name after the FOREIGN KEY definition. Added TRUNCATE table_name as a synonym for DELETE FROM table_name. Fixed a bug in a BDB key compare function when comparing part keys. Added bdb_lock_max variable to mysqld. Added more tests to the benchmark suite. Fixed an overflow bug in the client code when using overly long database names. mysql_connect() now aborts on Linux if the server doesn't answer in timeout seconds. SLAVE START did not work if you started with --skip-slave-start and had not explicitly run CHANGE MASTER TO. Fixed the output of SHOW MASTER STATUS to be consistent with SHOW SLAVE STATUS. (It now has no directory in the log name.) Added PURGE MASTER LOGS TO. Added SHOW MASTER LOGS. Added --safemalloc-mem-limit option to mysqld to simulate memory shortage when compiled with the --with-debug=full option. Fixed several core dumps in out-of-memory conditions. SHOW SLAVE STATUS was using an uninitialized mutex if the slave had not been started yet. Fixed bug in ELT() and MAKE_SET() when the query used a temporary table. CHANGE MASTER TO without specifying MASTER_LOG_POS would set it to 0 instead of 4 and hit the magic number in the master binlog. ALTER TABLE ... ORDER BY ... syntax added. This will create the new table with the rows in a specific order.
1276
1277
Added --default-extra-file=# option to all MySQL clients. Columns referenced in INSERT statements now are initialized properly. UPDATE didn't always work when used with a range on a timestamp that was part of the key that was used to find rows. Fixed a bug in FULLTEXT index when inserting a NULL column. Changed to use mkstemp() instead of tempnam(). Based on a patch from John Jones.
1278
Fixed bug in mysqldump from 3.23 which caused some CHAR columns not to be quoted. Merged analyze, check, optimize and repair code. OPTIMIZE TABLE is now mapped to REPAIR with statistics and sorting of the index tree. This means that for the moment it only works on MyISAM tables. Added a pre-alloced block to root_malloc to get fewer mallocs. Added a lot of new statistics variables. Fixed ORDER BY bug with BDB tables. Removed warning that mysqld couldn't remove the .pid file under Windows. Changed --log-isam to log MyISAM tables instead of isam tables. Fixed CHECK TABLE to work on Windows. Added file mutexes to make pwrite() safe on Windows.
1279
Updated mysqlhotcopy to use the new FLUSH TABLES table_list syntax. Only tables which are being backed up are flushed now. Changed behavior of --enable-thread-safe-client so that both non-threaded (lmysqlclient) and threaded (-lmysqlclient_r) libraries are built. Users who linked against a threaded -lmysqlclient will need to link against -lmysqlclient_r now. Added atomic RENAME TABLE command. Don't count NULL values in COUNT(DISTINCT ...). Changed ALTER TABLE, LOAD DATA INFILE on empty tables and INSERT ... SELECT ... on empty tables to create non-unique indexes in a separate batch with sorting. This will make the above calls much faster when you have many indexes. ALTER TABLE now logs the first used insert_id correctly. Fixed crash when adding a default value to a BLOB column. Fixed a bug with DATE_ADD/DATE_SUB where it returned a datetime instead of a date. Fixed a problem with the thread cache which made some threads show up as ***DEAD*** in SHOW PROCESSLIST. Fixed a lock in our thr_rwlock code, which could make selects that run at the same time as concurrent inserts crash. This only affects systems that don't have the pthread_rwlock_rdlock code. When deleting rows with a non-unique key in a HEAP table, all rows weren't always deleted. Fixed bug in range optimizer for HEAP tables for searches on a part index. Fixed SELECT on part keys to work with BDB tables. Fixed INSERT INTO bdb_table ... SELECT to work with BDB tables. CHECK TABLE now updates key statistics for the table. ANALYZE TABLE will now only update tables that have been changed since the last ANALYZE. Note that this is a new feature and tables will not be marked to be analysed until they are updated in any way with 3.23.23 or newer. For older tables, you have to do CHECK TABLE to update the key distribution. Fixed some minor privilege problems with CHECK, ANALYZE, REPAIR and SHOW CREATE commands. Added CHANGE MASTER TO statement. Added FAST, QUICK EXTENDED check types to CHECK TABLES. Changed myisamchk so that --fast and --check-only-changed are also honored with -sort-index and --analyze. Fixed fatal bug in LOAD TABLE FROM MASTER that did not lock the table during index re-build. LOAD DATA INFILE broke replication if the database was excluded from replication. More variables in SHOW SLAVE STATUS and SHOW MASTER STATUS. SLAVE STOP now will not return until the slave thread actually exits. Full-text search via the MATCH() function and FULLTEXT index type (for MyISAM files). This makes FULLTEXT a reserved word.
1280
1281
LOAD TABLE FROM MASTER is sufficiently bug-free to announce it as a feature. MATCH and AGAINST are now reserved words.
1282
Added table locks to Berkeley DB. Fixed a bug with LEFT JOIN and ORDER BY where the first table had only one matching row. Added 4 sample my.cnf example files in the support-files directory. Fixed duplicated key problem when doing big GROUP BY operations. (This bug was probably introduced in 3.23.15.) Changed syntax for INNER JOIN to match SQL-99. Added NATURAL JOIN syntax. A lot of fixes in the BDB interface. Added handling of --no-defaults and --defaults-file to safe_mysqld.sh and mysql_install_db.sh. Fixed bug in reading compressed tables with many threads. Fixed that USE INDEX works with PRIMARY keys. Added BEGIN statement to start a transaction in AUTOCOMMIT mode. Added support for symbolic links for Windows. Changed protocol to let client know if the server is in AUTOCOMMIT mode and if there is a pending transaction. If there is a pending transaction, the client library will give an error before reconnecting to the server to let the client know that the server did a rollback. The protocol is still backwardcompatible with old clients. KILL now works on a thread that is locked on a 'write' to a dead client. Fixed memory leak in the replication slave thread. Added new log-slave-updates option to mysqld, to allow daisy-chaining the slaves. Fixed compile error on FreeBSD and other systems where pthread_t is not the same as int. Fixed master shutdown aborting the slave thread. Fixed a race condition in INSERT DELAYED code when doing ALTER TABLE. Added deadlock detection sanity checks to INSERT DELAYED.
1283
Fixed bug with delay_key_write tables and CHECK TABLE. Added replicate-do-db and replicate-ignore-db options to mysqld, to restrict which databases get replicated. Added SQL_LOG_BIN option.
1284
1285
Fixed a possible endless loop when calculating timestamp. Added print_defaults program to the .rpm files. Removed mysqlbug from the client .rpm file.
1286
Added --i-am-a-dummy and --safe-updates options to mysql. Added select_limit and max_join_size variables to mysql. Added SQL_MAX_JOIN_SIZE and SQL_SAFE_UPDATES options. Added READ LOCAL lock that doesn't lock the table for concurrent inserts. (This is used by mysqldump.) Changed that LOCK TABLES ... READ no longer allows concurrent inserts. Added --skip-delay-key-write option to mysqld. Fixed security problem in the protocol regarding password checking. _rowid can now be used as an alias for an integer type unique indexed column. Added back blocking of SIGPIPE when compiling with --thread-safe-clients to make things safe for old clients.
1287
Added read-next-on-key to HEAP tables. This should fix all problems with HEAP tables when using non-UNIQUE keys. Added option to print default arguments to all clients. Added --log-slow-queries option to mysqld to log all queries that take a long time to a separate log file with a time indicating how long the query took. Fixed core dump when doing WHERE key_col=RAND(...). Fixed optimization bug in SELECT ... LEFT JOIN ... key_col IS NULL, when key_col could contain NULL values. Fixed problem with 8-bit characters as separators in LOAD DATA INFILE.
1288
Inverted flag delay_key_write on show variables. Renamed concurrency variable to thread_concurrency. The following functions are now multi-byte-safe: LOCATE(substr,str), POSITION(substr IN str), LOCATE(substr,str,pos), INSTR(str,substr), LEFT(str,len), RIGHT(str,len), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len), MID(str,pos,len), SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING_INDEX(str,delim,count), RTRIM(str), TRIM([[BOTH | TRAILING] [remstr] FROM] str), REPLACE(str,from_str,to_str), REVERSE(str), INSERT(str,pos,len,newstr), LCASE(str), LOWER(str), UCASE(str) and UPPER(str); patch by Wei He. Fix core dump when releasing a lock from a non-existent table. Remove locks on tables before starting to remove duplicates. Added option FULL to SHOW PROCESSLIST. Added option --verbose to mysqladmin. Fixed problem when automatically converting HEAP to MyISAM. Fixed bug in HEAP tables when doing insert + delete + insert + scan the table. Fixed bugs on Alpha with REPLACE() and LOAD DATA INFILE. Added interactive_timeout variable to mysqld. Changed the argument to mysql_data_seek() from ulong to ulonglong.
1289
Changed the meaning of FLOAT(X): Now this is the same as FLOAT if X <= 24 and a DOUBLE if 24 < X <= 53. DECIMAL(X) is now an alias for DECIMAL(X,0) and DECIMAL is now an alias for DECIMAL(10,0). The same goes for NUMERIC. Added option ROW_FORMAT={DEFAULT | DYNAMIC | FIXED | COMPRESSED} to CREATE_TABLE. DELETE FROM table_name didn't work on temporary tables. Changed function CHAR_LENGTH() to be multi-byte character safe. Added function ORD(string).
1290
1291
1292
This procedure is extremely useful when you want to check the data in your table! BINARY cast to force a string to be compared in case-sensitive fashion. Added --skip-show-database option to mysqld. Check whether a row has changed in an UPDATE now also works with BLOB/TEXT columns. Added the INNER join syntax. Note: This made INNER a reserved word! Added support for netmasks to the hostname in the MySQL grant tables. You can specify a netmask using the IP/NETMASK syntax.
1293
If you compare a NOT NULL DATE/DATETIME column with IS NULL, this is changed to a compare against 0 to satisfy some ODBC applications. (By <shreeve@uci.edu>.) NULL IN (...) now returns NULL instead of 0. This will ensure that null_column NOT IN (...) doesn't match NULL values. Fix storage of floating-point values in TIME columns. Changed parsing of TIME strings to be more strict. Now the fractional second part is detected (and currently skipped). The following formats are supported: [[DAYS] [H]H:]MM:]SS[.fraction] [[[[[H]H]H]H]MM]SS[.fraction] Detect (and ignore) fractional second part from DATETIME. Added the LOW_PRIORITY attribute to LOAD DATA INFILE. The default index name now uses the same case as the column name on which the index name is based. Changed default number of connections to 100. Use bigger buffers when using LOAD DATA INFILE. DECIMAL(x,y) now works according to standard SQL. Added aggregate UDF functions. Thanks to Andreas F. Bobak (<bobak@relog.ch>) for this! LAST_INSERT_ID() is now updated for INSERT INTO ... SELECT. Some small changes to the join table optimizer to make some joins faster. SELECT DISTINCT is much faster; it uses the new UNIQUE functionality in MyISAM. One difference compared to MySQL 3.22 is that the output of DISTINCT is no longer sorted. All C client API macros are now functions to make shared libraries more reliable. Because of this, you can no longer call mysql_num_fields() on a MYSQL object, you must use mysql_field_count() instead. Added use of LIBWRAP; patch by Henning P. Schmiedehausen. Don't allow AUTO_INCREMENT for other than numerical columns. Using AUTO_INCREMENT will now automatically make the column NOT NULL. Show NULL as the default value for AUTO_INCREMENT columns. Added SQL_BIG_RESULT; SQL_SMALL_RESULT is now default. Added a shared library RPM. This enhancement was contributed by David Fox (<dsfox@cogsci.ucsd.edu>). Added --enable-large-files and --disable-large-files options to configure. See configure.in for some systems where this is automatically turned off because of broken implementations. Upgraded readline to 4.0. New CREATE TABLE options: PACK_KEYS and CHECKSUM. Added --default-table-type option to mysqld.
1294
1295
Fixed non-critical Y2K problem when writing short date to log files.
1296
1297
Fixed bug in LEFT JOIN involving empty tables. Changed the mysql.db column from CHAR(32) to CHAR(60). MODIFY and DELAYED are no longer reserved words. Fixed a bug when storing days in a TIME column. Fixed a problem with Host '...' is not allowed to connect to this MySQL server after one had inserted a new MySQL user with a GRANT command. Changed to use TCP_NODELAY also on Linux (should give faster TCP/IP connections).
1298
1299
Fixed bug in GRANT checking with SELECT on many tables. Added missing file mysql_fix_privilege_tables to the RPM distribution. This is not run by default because it relies on the client package. Added option SQL_SMALL_RESULT to SELECT to force use of fast temporary tables when you know that the result set will be small. Allow use of negative real numbers without a decimal point. Day number is now adjusted to maximum days in month if the resulting month after DATE_ADD/DATE_SUB() doesn't have enough days. Fix that GRANT compares columns in case-insensitive fashion. Fixed a bug in sql_list.h that made ALTER TABLE dump core in some contexts. The hostname in user@hostname can now include . and - without quotes in the context of the GRANT, REVOKE and SET PASSWORD FOR ... statements. Fix for isamchk for tables which need big temporary files.
1300
Added --bootstrap option to mysqld and recoded mysql_install_db to use it. This will make it easier to install MySQL with RPMs. Changed +, - (sign and minus), *, /, %, ABS() and MOD() to be BIGINT aware (64-bit safe). Fixed a bug in ALTER TABLE that caused mysqld to crash. MySQL now always reports the conflicting key values when a duplicate key entry occurs. (Before this was only reported for INSERT.) New syntax: INSERT INTO tbl_name SET col_name=value, col_name=value, ... Most errors in the .err log are now prefixed with a time stamp. Added option MYSQL_INIT_COMMAND to mysql_options() to make a query on connect or reconnect. Added option MYSQL_READ_DEFAULT_FILE and MYSQL_READ_DEFAULT_GROUP to mysql_options() to read the following parameters from the MySQL option files: port, socket, compress, password, pipe, timeout, user, init-command, host and database. Added maybe_null to the UDF structure. Added option IGNORE to INSERT statements with many rows. Fixed some problems with sorting of the koi8 character sets; users of koi8 must run isamchk rq on each table that has an index on a CHAR or VARCHAR column. New script mysql_setpermission, by Luuk de Boer. It allows easy creation of new users with permissions for specific databases. Allow use of hexadecimal strings (0x...) when specifying a constant string (like in the column separators with LOAD DATA INFILE). Ported to OS/2 (thanks to Antony T. Curtis <antony.curtis@olcs.net>). Added more variables to SHOW STATUS and changed format of output to be like SHOW VARIABLES. Added extended-status command to mysqladmin which will show the new status variables.
1301
1302
1303
{INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... You can also use SET SQL_LOW_PRIORITY_UPDATES={0|1} to change the priority for one thread. One side effect is that LOW_PRIORITY is now a reserved word. :( Add support for INSERT INTO table ... VALUES(...),(...),(...), to allow inserting multiple rows with a single statement. INSERT INTO tbl_name is now also cached when used with LOCK TABLES. (Previously only INSERT ... SELECT and LOAD DATA INFILE were cached.) Allow GROUP BY functions with HAVING:
mysql> SELECT col FROM table GROUP BY col HAVING COUNT(*)>0;
mysqld will now ignore trailing ; characters in queries. This is to make it easier to migrate from some other SQL servers that require the trailing ;. Fix for corrupted fixed-format output generated by SELECT INTO OUTFILE. Warning: incompatible change! Added Oracle GREATEST() and LEAST() functions. You must now use these instead of the MAX() and MIN() functions to get the largest/smallest value from a list of values. These can now handle REAL, BIGINT and string (CHAR or VARCHAR) values. Warning: incompatible change! DAYOFWEEK() had offset 0 for Sunday. Changed the offset to 1. Give an error for queries that mix GROUP BY columns and fields when there is no GROUP BY specification. Added --vertical option to mysql, for printing results in vertical mode. Index-only optimization; some queries are now resolved using only indexes. Until MySQL 4.0, this works only for numeric columns. See Section 7.4.5, Comment MySQL utilise les index . Lots of new benchmarks. A new C API chapter and lots of other improvements in the manual.
to:
SELECT ... FROM table WHERE auto_increment_column == LAST_INSERT_ID()
This allows some ODBC programs (Delphi, Access) to retrieve the newly inserted row to fetch the AUTO_INCREMENT id. DROP TABLE now waits for all users to free a table before deleting it. Fixed small memory leak in the new connect protocol. New functions BIN(), OCT(), HEX() and CONV() for converting between different number bases. Added function SUBSTRING() with 2 arguments. If you created a table with a record length smaller than 5, you couldn't delete rows from the table. Added optimization to remove const reference tables from ORDER BY and GROUP BY.
1304
mysqld now automatically disables system locking on Linux and Windows, and for systems that use MIT-pthreads. You can force the use of locking with the --enable-external-locking option. Added --console option to mysqld, to force a console window (for error messages) when using Windows. Fixed table locks for Windows. Allow $ in identifiers. Changed name of user-specific configuration file from my.cnf to .my.cnf (Unix only). Added DATE_ADD() and DATE_SUB() functions.
1305
Added new API functions mysql_init() and mysql_options(). You now MUST call mysql_init() before you call mysql_real_connect(). You don't have to call mysql_init() if you only use mysql_connect(). Added mysql_options(...,MYSQL_OPT_CONNECT_TIMEOUT,...) so you can set a timeout for connecting to a server. Added --timeout option to mysqladmin, as a test of mysql_options(). Added AFTER column and FIRST options to ALTER TABLE ... ADD columns. This makes it possible to add a new column at some specific location within a row in an existing table. WEEK() now takes an optional argument to allow handling of weeks when the week starts on Monday (some European countries). By default, WEEK() assumes the week starts on Sunday. TIME columns weren't stored properly (bug in MySQL Version 3.22.0). UPDATE now returns information about how many rows were matched and updated, and how many ``warnings'' occurred when doing the update. Fixed incorrect result from FORMAT(-100,2). ENUM and SET columns were compared in binary (case-sensitive) fashion; changed to be caseinsensitive.
Each connection is handled by its own thread, rather than by the master accept() thread. This fixes permanently the telnet bug that was a topic on the mail list some time ago. All TCP/IP connections are now checked with backward-resolution of the hostname to get better security. mysqld now has a local hostname resolver cache so connections should actually be faster than before, even with this feature. A site automatically will be blocked from future connections if someone repeatedly connects with an ``improper header'' (like when one uses telnet). You can now refer to tables in different databases with references of the form tbl_name@db_name or db_name.tbl_name. This makes it possible to give a user read access to some tables and write access to others simply by keeping them in different databases! Added --user option to mysqld, to allow it to run as another Unix user (if it is started as the Unix root user). Added caching of users and access rights (for faster access rights checking) Normal users (not anonymous ones) can change their password with mysqladmin password "new_password". This uses encrypted passwords that are not logged in the normal MySQL log! All important string functions are now coded in assembler for x86 Linux machines. This gives a speedup of 10% in many cases. For tables that have many columns, the column names are now hashed for much faster column name lookup (this will speed up some benchmark tests a lot!)
1306
Some benchmarks are changed to get better individual timing. (Some loops were so short that a specific test took < 2 seconds. The loops have been changed to take about 20 seconds to make it easier to compare different databases. A test that took 1-2 seconds before now takes 11-24 seconds, which is much better) Re-arranged SELECT code to handle some very specific queries involving group functions (like COUNT(*)) without a GROUP BY but with HAVING. The following now works:
mysql> SELECT COUNT(*) as C FROM table HAVING C > 1;
Changed the protocol for field functions to be faster and avoid some calls to malloc(). Added -T32 option to mysqld, for running all queries under the main thread. This makes it possible to debug mysqld under Linux with gdb! Added optimization of not_null_column IS NULL (needed for some Access queries). Allow STRAIGHT_JOIN to be used between two tables to force the optimizer to join them in a specific order. String functions now return VARCHAR rather than CHAR and the column type is now VARCHAR for fields saved as VARCHAR. This should make the MyODBC driver better, but may break some old MySQL clients that don't handle FIELD_TYPE_VARCHAR the same way as FIELD_TYPE_CHAR. CREATE INDEX and DROP INDEX are now implemented through ALTER TABLE. CREATE TABLE is still the recommended (fast) way to create indexes. Added --set-variable option wait_timeout to mysqld. Added time column to mysqladmin processlist to show how long a query has taken or how long a thread has slept. Added lots of new variables to show variables and some new to show status. Added new type YEAR. YEAR is stored in 1 byte with allowable values of 0, and 1901 to 2155. Added new DATE type that is stored in 3 bytes rather than 4 bytes. All new tables are created with the new date type if you don't use the --old-protocol option to mysqld. Fixed bug in record caches; for some queries, you could get Error from table handler: # on some operating systems. Added --enable-assembler option to configure, for x86 machines (tested on Linux + gcc). This will enable assembler functions for the most important string functions for more speed!
1307
1308
SELECT statements with & or | (bit functions) failed on columns with NULL values. When comparing a field = field, where one of the fields was a part key, only the length of the part key was compared.
1309
Fixed bug when using BLOB/TEXT in GROUP BY with many tables. An ENUM field that is not declared NOT NULL has NULL as the default value. (Previously, the default value was the first enumeration value.) Fixed bug in the join optimizer code when using many part keys on the same key: INDEX (Organization,Surname(35),Initials(35)). Added some tests to the table order optimizer to get some cases with SELECT ... FROM many_tables much faster. Added a retry loop around accept() to possibly fix some problems on some Linux machines.
1310
Added function TIME_FORMAT(). This works like DATE_FORMAT(), but takes a time string ('HH:MM:SS') as argument. Fixed unlikely(?) key optimizer bug when using OR operators of key parts inside AND expressions. Added variables command to mysqladmin. A lot of small changes to the binary releases. Fixed a bug in the new protocol from MySQL Version 3.21.20. Changed ALTER TABLE to work with Windows (Windows can't rename open files). Also fixed a couple of small bugs in the Windows version. All standard MySQL clients are now ported to MySQL for Windows. MySQL can now be started as a service on NT.
Upgraded Msql-Mysql-modules to 1.1825. Upgraded mysqlaccess to 2.02. Fixed problem with Russian character set and LIKE. Ported to OpenBSD 2.1. New Dutch error messages.
1311
Added SHOW STATUS command. Removed manual.ps from the source distribution to make it smaller.
1312
SELECT col_name, SUM(expr) now returns NULL for col_name when there are matching rows. Fixed problem with comparing binary strings and BLOB values with ASCII characters over 127. Fixed lock problem: when freeing a read lock on a table with multiple read locks, a thread waiting for a write lock would have been given the lock. This shouldn't affect data integrity, but could possibly make mysqld restart if one thread was reading data that another thread modified. LIMIT offset,count didn't work in INSERT ... SELECT. Optimized key block caching. This will be quicker than the old algorithm when using bigger key caches.
1313
Added new commands CREATE DATABASE db_name and DROP DATABASE db_name. Added RENAME option to ALTER TABLE: ALTER TABLE name RENAME TO new_name. make_binary_distribution now includes libgcc.a in libmysqlclient.a. This should make linking work for people who don't have gcc. Changed net_write() to my_net_write() because of a name conflict with Sybase. New function DAYOFWEEK() compatible with ODBC.
Stack checking and bison memory overrun checking to make MySQL safer with weird queries.
1314
New error message so you can check whether the connection was lost while the command was running or whether the connection was down from the start. Added --table option to mysql to print in table format. Moved time and row information after query result. Added automatic reconnect of lost connections. Added != as a synonym for <>. Added function VERSION() to make easier logs. New multi-user test tests/fork_test.pl to put some strain on the thread library.
1315
1316
Added handling of calculation of SUM() functions. For example, you can now use SUM(column)/ COUNT(column). Added handling of trigometric functions: PI(), ACOS(), ASIN(), ATAN(), COS(), SIN() and TAN(). New languages: Norwegian, Norwegian-ny and Portuguese. Fixed parameter bug in net_print() in procedure.cc. Fixed a couple of memory leaks. Now allow also the old SELECT ... INTO OUTFILE syntax. Fixed bug with GROUP BY and SELECT on key with many values. mysql_fetch_lengths() sometimes returned incorrect lengths when you used mysql_use_result(). This affected at least some cases of mysqldump --quick. Fixed bug in optimization of WHERE const op field. Fixed problem when sorting on NULL fields. Fixed a couple of 64-bit (Alpha) problems. Added --pid-file=# option to mysqld. Added date formatting to FROM_UNIXTIME(), originally by Zeev Suraski. Fixed bug in BETWEEN in range optimizer (did only test = of the first argument). Added machine-dependent files for MIT-pthreads i386-SCO. There is probably more to do to get this to work on SCO 3.5.
1317
New function FROM_UNIXTIME(timestamp) which returns a date string in 'YYYY-MM-DD HH:MM:SS' format. New function SEC_TO_TIME(seconds) which returns a string in 'HH:MM:SS' format. New function SUBSTRING_INDEX(), originally by Zeev Suraski.
1318
Note: some_field is normally in the SELECT part. Standard SQL should require it.
1319
New command LOCK TABLES tbl_name [AS alias] {READ|WRITE} ... Added --log-update option to mysqld, to get a log suitable for incremental updates. New command EXPLAIN SELECT ... to get information about how the optimizer will do the join. For easier client code, the client should no longer use FIELD_TYPE_TINY_BLOB, FIELD_TYPE_MEDIUM_BLOB, FIELD_TYPE_LONG_BLOB or FIELD_TYPE_VAR_STRING (as previously returned by mysql_list_fields). You should instead only use FIELD_TYPE_BLOB or FIELD_TYPE_STRING. If you want exact types, you should use the command SHOW FIELDS. Added varbinary syntax: 0x###### which can be used as a string (default) or a number. FIELD_TYPE_CHAR is renamed to FIELD_TYPE_TINY. Changed all fields to C++ classes. Removed FORM struct. Fields with DEFAULT values no longer need to be NOT NULL. New field types: ENUM A string which can take only a couple of defined values. The value is stored as a 1-3 byte number that is mapped automatically to a string. This is sorted according to string positions! SET A string which may have one or many string values separated with ','. The string is stored as a 1-, 2-, 3-, 4- or 8-byte number where each bit stands for a specific set member. This is sorted according to the unsigned value of the stored packed number. Now all function calculation is done with double or long long. This will provide the full 64-bit range with bit functions and fix some conversions that previously could result in precision losses. One should avoid using unsigned long long columns with full 64-bit range (numbers bigger than 9223372036854775807) because calculations are done with signed long long. ORDER BY will now put NULL field values first. GROUP BY will also work with NULL values. Full WHERE with expressions. New range optimizer that can resolve ranges when some keypart prefix is constant. Example:
mysql> SELECT * FROM tbl_name -> WHERE key_part_1="customer" -> AND key_part_2>=10 AND key_part_2<=10;
1320
New mysqlperl version. It is now compatible with msqlperl-0.63. New DBD module available. Added group function STD() (standard deviation). The mysqld server is now compiled by default without debugging information. This will make the daemon smaller and faster. Now one usually only has to specify the --basedir option to mysqld. All other paths are relative in a normal installation. BLOB columns sometimes contained garbage when used with a SELECT on more than one table and ORDER BY. Fixed that calculations that are not in GROUP BY work as expected (SQL-99 extension). Example:
mysql> SELECT id,id+1 FROM table GROUP BY id;
The test of using MYSQL_PWD was reversed. Now MYSQL_PWD is enabled as default in the default release. Fixed conversion bug which caused mysqld to core dump with Arithmetic error on SPARC-386. Added --unbuffered option to mysql, for new mysqlaccess. When using overlapping (unnecessary) keys and join over many tables, the optimizer could get confused and return 0 records.
1321
LIKE was case-sensitive in some places and case-insensitive in others. Now LIKE is always caseinsensitive. mysql.cc: Allow '#' anywhere on the line. New command SET SQL_SELECT_LIMIT=#. See the FAQ for more details. New version of the mysqlaccess script. Change FROM_DAYS() and WEEKDAY() to also take a full TIMESTAMP or DATETIME as argument. Before they only took a number of type YYYYMMDD or YYMMDD. Added new function UNIX_TIMESTAMP(timestamp_column).
1322
Fixed adding an AUTO_INCREMENT key with ALTER_TABLE. AVG() gave too small value on some SELECT statements with GROUP BY and ORDER BY. Added new DATETIME type (by Giovanni Maruzzelli <maruzz@matrice.it>). Fixed that defining DONT_USE_DEFAULT_FIELDS works. Changed to use a thread to handle alarms instead of signals on Solaris to avoid race conditions. Fixed default length of signed numbers. (George Harvey <georgeh@pinacl.co.uk>.) Allow anything for CREATE INDEX. Add prezeros when packing numbers to DATE, TIME and TIMESTAMP. Fixed a bug in OR of multiple tables (gave empty set). Added many patches to MIT-pthreads. This fixes at least one lookup bug.
1323
Fixed MIT-pthreads readdir_r(). Now mysqladmin create database and mysqladmin drop database should work. Changed MIT-pthreads to use our tempnam(). This should fix the ``sort aborted'' bug. Added sync of records count in sql_update. This fixed slow updates on first connection. (Thanks to Vaclav Bittner for the test.)
1324
Added status command to mysqladmin for short logging. Increased maximum number of keys to 16 and maximum number of key parts to 15. Use of sub keys. A key may now be a prefix of a string field. Added -k option to mysqlshow, to get key information for a table. Added long options to mysqldump.
Previously, this resulted in the error: Column: 'filter_nr' in order clause is ambiguous. mysql now outputs '\0', '\t', '\n' and '\\' when encountering ASCII 0, tab, newline or '\' while writing tab-separated output. This is to allow printing of binary data in a portable format. To get the old behavior, use -r (or --raw). Added german error messages (60 of 80 error messages translated). Added new API function mysql_fetch_lengths(MYSQL_RES *), which returns an array of column lengths (of type uint). Fixed bug with IS NULL in WHERE clause. Changed the optimizer a little to get better results when searching on a key part. Added SELECT option STRAIGHT_JOIN to tell the optimizer that it should join tables in the given order. Added support for comments starting with '--' in mysql.cc (Postgres syntax). You can have SELECT expressions and table columns in a SELECT which are not used in the group part. This makes it efficient to implement lookups. The column that is used should be a constant for each group because the value is calculated only once for the first row that is found for a group.
mysql> SELECT id,lookup.text,SUM(*) FROM test,lookup -> WHERE test.id=lookup.id GROUP BY id;
1325
inserted 0, but it should insert an AUTO_INCREMENT value. mysqlshow.c: Added number of records in table. Had to change the client code a little to fix this. mysql now allows doubled '' or "" within strings for embedded ' or ". New math functions: EXP(), LOG(), SQRT(), ROUND(), CEILING().
1326
Separate client compilation: the client code should be very easy to compile on systems which don't have threads. The old Perl interface code is automatically compiled and installed. Automatic compiling of DBD will follow when the new DBD code is ported. Dynamic language support: mysqld can now be started with Swedish or English (default) error messages. New functions: INSERT(), RTRIM(), LTRIM() and FORMAT(). mysqldump now works correctly for all field types (even AUTO_INCREMENT). The format for SHOW FIELDS FROM tbl_name is changed so the Type column contains information suitable for CREATE TABLE. In previous releases, some CREATE TABLE information had to be patched when re-creating tables. Some parser bugs from 3.19.5 (BLOB and TIMESTAMP) are corrected. TIMESTAMP now returns different date information depending on its create length. Changed parser to allow a database, table or field name to start with a number or '_'. All old C code from Unireg changed to C++ and cleaned up. This makes the daemon a little smaller and easier to understand. A lot of small bug fixes done. New INSTALL files (not final version) and some information regarding porting.
1327
IF(arg,syntax_error,syntax_error) crashed. Added functions CEILING(), ROUND(), EXP(), LOG() and SQRT(). Enhanced BETWEEN to handle strings.
1328
Changes for NetWare to exit InnoDB gracefully on NetWare even in a case of an assertion failure, instead of intentionally crashing the mysqld server process. Bogues corrigs : Fixed a bug in ON DELETE CASCADE and ON UPDATE CASCADE foreign key constraints: long chains of cascaded operations would cause a stack overflow and crash the server. Cascaded operations are now limited to 15 levels. (Bug #4446) Increment the InnoDB watchdog timeout during CHECK TABLE. (Bug #2694) If you configure innodb_additional_mem_pool_size so small that InnoDB memory allocation spills over from it, then every 4 billionth spill may cause memory corruption. A symptom is a printout like below in the .err log.
InnoDB: Error: Mem area size is 0. Possibly a memory overrun of the InnoDB: previous allocated area! InnoDB: Apparent memory corruption: mem dump len 500; hex
Fixed a glitch introduced in 4.0.18 and 4.1.2: in SHOW TABLE STATUS InnoDB systematically overestimated the row count by 1 if the table fit on a single 16 kB data page. InnoDB created temporary files with the C library function tmpfile(). On Windows, the files would be created in the root directory of the current file system. To correct this behavior, the invocations of tmpfile() were replaced with code that uses the function create_temp_file() in the MySQL portability layer. (Bug #3998) If we RENAMEd a table, InnoDB forgot to load the foreign key constraints that reference the new table name, and forgot to check that they are compatible with the table. If there was little file I/O in InnoDB, but the insert buffer was used, it could happen that 'Pending normal aio reads' was bigger than 0, but the I/O handler thread did not get waken up in 600 seconds. This resulted in a hang, and an intentional crashing of mysqld.
1329
The special meaning of the table names innodb_monitor, innodb_lock_monitor, innodb_tablespace_monitor, innodb_table_monitor, and innodb_validate in CREATE TABLE and DROP TABLE statements was accidentally removed in MySQL/InnoDB-4.1.2. The diagnostic functions attached to these special table names (see Section 15.12.1, Le moniteur InnoDB ) are accessible again in MySQL/InnoDB-4.1.3. When the private SQL parser of InnoDB was modified in MySQL/InnoDB-4.0.19 in order to allow the use of the apostrophe (') in table and column names, the fix relied on a previously unused function mem_realloc(), whose implementation was incorrect. As a result, InnoDB can incorrectly parse column and table names as the empty string. The InnoDB realloc() implementation has been corrected in MySQL/InnoDB-4.1.3. In a clean-up of MySQL/InnoDB-4.1.2, the code for invalidating the query cache was broken. Now the query cache should be correctly invalidated for tables affected by ON UPDATE CASCADE or ON DELETE CASCADE constraints. Fixed a bug : in LIKE 'abc%', the '%' did not match the empty string if the character set was not latin1_swedish_ci. This bug was fixed by changing the sorting order in these character sets. See the above note about data conversion in 4.1.3.
1330
1331
An optimization in locking: If AUTOCOMMIT=1, then we do not need to make a plain SELECT set shared locks even on the SERIALIZABLE isolation level, because we know that the transaction is read-only. A read-only transaction can always be performed on the REPEATABLE READ level, and that does not endanger the serializability. Implement an automatic downgrade from >= 4.1.1 -> 4.0.18 if the user has not created tables in .ibd files or used other 4.1.x features. Consult the manual section on multiple tablespaces carefully if you want to downgrade! Fixed a bug : MySQL should not allow REPLACE to internally perform an UPDATE if the table is referenced by a FOREIGN KEY. The MySQL manual states that REPLACE must resolve a duplicatekey error semantically with DELETE(s) + INSERT, and not by an UPDATE. In versions < 4.0.18 and < 4.1.2, MySQL could resolve a duplicate key conflict in REPLACE by doing an UPDATE on the existing row, and FOREIGN KEY checks could behave in a semantically wrong way. (Bug #2418) Fixed a bug : generate FOREIGN KEY constraint identifiers locally for each table, in the form db_name/tbl_name_ibfk_number. If the user gives the constraint name explicitly, then remember it. These changes should ensure that foreign key id's in a slave are the same as in the master, and DROP FOREIGN KEY does not break replication. (Bug #2167) Fixed a bug : allow quoting of identifiers in InnoDB's FOREIGN KEY definitions with a backtick (`) and a double quote ("). You can now use also spaces in table and column names, if you quote the identifiers. (Bug #1725, Bug #2424) Fixed a bug : FOREIGN KEY ... ON UPDATE/DELETE NO ACTION must check the foreign key constraint, not ignore it. Since we do not have deferred constraints in InnoDB, this bugfix makes InnoDB to check NO ACTION constraints immediately, like it checks RESTRICT constraints. Fixed a bug : InnoDB crashed in RENAME TABLE if 'db_name.tbl_name' is shorter than 5 characters. (Bug #2689) Fixed a bug : in SHOW TABLE STATUS, InnoDB row count and index cardinality estimates wrapped around at 512 million in 32-bit computers. Note that unless MySQL is compiled with the BIG_TABLES option, they will still wrap around at 4 billion. Fixed a bug : If there was a UNIQUE secondary index, and NULL values in that unique index, then with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many. This bug was introduced in 4.0.16. (Bug #2483)
1332
There are still several outstanding non-critical bugs reported in the MySQL bugs database. Their fixing has been delayed, because resources were allocated to the 4.1.1 release.
1333
Fixed a bug introduced in 4.0.13: if a CREATE TABLE ended in a comment, that could cause a memory overrun. Fixed a bug : If InnoDB printed Operating system error number .. in a file operation to the .err log in Windows, the error number explanation was wrong. Workaround: look at section 13.2 of http://www.innodb.com/ibman.php about Windows error numbers. Fixed a bug : If you created a column prefix PRIMARY KEY like in t(a CHAR(200), PRIMARY KEY (a(10))) on a fixed-length CHAR column, InnoDB would crash even in a simple SELECT. CCHECK TABLE would report the table as corrupt, also in the case where the created key was not PRIMARY.
but that is not dangerous and can be ignored. Modified the buffer pool replacement algorithm so that it tries to flush modified pages if there are no replaceable pages in the last 10 % of the LRU list. This can reduce disk i/o if the workload is a mixture of reads and writes. The buffer pool checkpoint flush algorithm now tries to flush also close neighbors of the page at the end of the flush list. This can speed up database shutdown, and can also speed up disk writes if InnoDB log files are very small compared to the buffer pool size. In 4.0.13 we made SHOW INNODB STATUS to print detailed info on the latest UNIQUE KEY error, but storing that info could slow down REPLACE significantly. We no longer store or print the info. Fixed a bug : SET FOREIGN_KEY_CHECKS=0 was not replicated properly in the MySQL replication. The fix will not be backported to 3.23. Fixed a bug : the parameter innodb_max_dirty_pages_pct forgot to take into account the free pages in the buffer pool. This could lead to excessive flushing even though there were lots of free pages in the buffer pool. Workaround: SET GLOBAL innodb_max_dirty_pages_pct = 100. Fixed a bug : if there were big index scans then a file read request could starve and InnoDB could assert because of a very long semaphore wait. Fixed a bug : if AUTOCOMMIT=1 then inside LOCK TABLES MySQL failed to do the commit after an updating SQL statement if binlogging was not on, and for SELECT statements did not commit regardless of binlogging state. Fixed a bug : InnoDB could make the index page directory corrupt in the first B-tree page splits after a mysqld startup. A symptom would be an assertion in page0page.c, in function page_dir_find_slot(). Fixed a bug : if in a FOREIGN KEY with an UPDATE CASCADE clause the parent column was of a different internal storage length than the child column, then a cascaded update would make the column length wrong in the child table and corrupt the child table. Because of MySQL's 'silent column
1334
specification changes' a fixed-length CHAR column can change internally to a VARCHAR and cause this error. Fixed a bug : if a non-latin1 character set was used and if in a FOREIGN KEY the parent column was of a different internal storage length than the child column, then all inserts to the child table would fail in a foreign key error. Fixed a bug : InnoDB could complain that it cannot find the clustered index record, or in rare cases return an extraneous row if a rollback, purge, and a SELECT coincided. Fixed a possible hang over the btr0sea.c latch if SELECT was used inside LOCK TABLES. Fixed a bug : contrary to what the release note of 4.0.13 said, the group commit still did not work if the MySQL binlogging was on. Fixed a bug : os_event_wait() did not work properly in Unix, which might have caused starvation in various log operations. Fixed a bug : if a single DELETE statement first managed to delete some rows and then failed in a FOREIGN KEY error or a 'Table is full error', MySQL did not roll back the whole SQL statement as it should, and also wrote the failed statement to the binlog, reporting there a non-zero error_code. Fixed a bug : the maximum allowed number of columns in a table is 1000, but InnoDB did not check that limit in CREATE TABLE, and a subsequent INSERT or SELECT from that table could cause an assertion.
1335
Added a new global settable MySQL system variable innodb_max_dirty_pages_pct. It is an integer in the range 0 - 100. The default is 90. The main thread in InnoDB tries to flush pages from the buffer pool so that at most this many percents are not yet flushed at any time. If innodb_force_recovery=6, do not let InnoDB do repair of corrupt pages based on the doublewrite buffer. InnoDB start-up now happens faster because it does not set the memory in the buffer pool to zero. Fixed a bug : The InnoDB parser for FOREIGN KEY definitions was confused by the keywords 'foreign key' inside MySQL comments. Fixed a bug : If you dropped a table to which there was a FOREIGN KEY reference, and later created the same table with non-matching column types, InnoDB could assert in dict0load.c, in function dict_load_table(). Fixed a bug : GROUP BY and DISTINCT could treat NULL values as not equal. MySQL also failed to do the next-key locking in the case of an empty index range. Fixed a bug : Do not commit the current transaction when a MyISAM table is updated; this also makes CREATE TABLE not to commit an InnoDB transaction, even when binlogging is enabled. Fixed a bug : We did not allow ON DELETE SET NULL to modify the same table where the delete was made; we can allow it because that cannot produce infinite loops in cascaded operations. Fixed a bug : Allow HANDLER PREV and NEXT also after positioning the cursor with a unique search on the primary key. Fixed a bug : If MIN() or MAX() resulted in a deadlock or a lock wait timeout, MySQL did not return an error, but returned NULL as the function value. Fixed a bug : InnoDB forgot to call pthread_mutex_destroy() when a table was dropped. That could cause memory leakage on FreeBSD and other non-Linux Unix systems.
1336
1337
Fixed a bug : some file system snapshot tool in Windows 2000 could cause an InnoDB file write to fail with error 33 ERROR_LOCK_VIOLATION. In synchronous writes InnoDB now retries the write 100 times at 1 second intervals. An outstanding bug: SET FOREIGN_KEY_CHECKS=0 is not replicated properly in the MySQL replication. The fix will appear in 4.0.11 and will probably not be backported to 3.23. Fixed bug in InnoDB page0cur.c file in function page_cur_search_with_match which caused InnoDB to remain on the same page forever. This bug is evident only in tables with more than one page.
1338
Fixed a bug : TRUNCATE on a TEMPORARY table crashed InnoDB. Fixed a bug introduced in 4.0.5: if binlogging was not switched on, INSERT INTO ... SELECT ... or CREATE TABLE ... SELECT ... could cause InnoDB to hang on a semaphore created in btr0sea.c, line 128. Workaround: switch binlogging on. Fixed a bug : in replication issuing SLAVE STOP in the middle of a multi-statement transaction could cause that SLAVE START would only perform a part of the transaction. A similar error could occur if the slave crashed and was restarted.
1339
Fixed a bug : if SHOW INNODB STATUS, innodb_monitor, or innodb_lock_monitor had to print several hundred transactions in one report, and the output became truncated, InnoDB would hang, printing to the error log many waits for a mutex created at srv0srv.c, line 1621. Fixed a bug : SHOW INNODB STATUS on Unix always reported average file read size as 0 bytes. Fixed a potential bug in 4.0.4: InnoDB now does ORDER BY ... DESC like MyISAM. Fixed a bug : DROP TABLE could cause crash or a hang if there was a rollback concurrently running on the table. The fix will only be backported to 3.23 if this appears a real problem for users. Fixed a bug : ORDER BY could fail if you had not created a primary key to a table, but had defined several indexes of which at least one was a UNIQUE index with all its columns declared as NOT NULL. Fixed a bug : a lock wait timeout in connection with ON DELETE CASCADE could cause corruption in indexes. Fixed a bug : if a SELECT was done with a unique key from a primary index, and the search matched to a delete-marked record, InnoDB could return the NEXT record. Outstanding bugs: in 4.0.4 two bugs were introduced to AUTO_INCREMENT. REPLACE can cause the counter to be left 1 too low. A deadlock or a lock wait timeout can cause the same problem. These will be fixed in 4.0.6.
1340
Increased the max key length of InnoDB tables from 500 to 1024 bytes. Increased the table comment field in SHOW TABLE STATUS so that up to 16000 characters of foreign key definitions can be printed there. The auto-increment counter is no longer incremented if an insert of a row immediately fails in an error. Allow dropping and creating a table even if innodb_force_recovery is set. One can use this to drop a table which would cause a crash in rollback or purge, or if a failed table import causes a runaway rollback in recovery. Fixed a bug : Using ORDER BY primarykey DESC in 4.0.3 causes an assertion failure in btr0pcur.c, line 203. Fixed a bug : fast shutdown (which is the default) sometimes was slowed down by purge and insert buffer merge. Fixed a bug : doing a big SELECT from a table where no rows were visible in a consistent read could cause a very long (> 600 seconds) semaphore wait in btr0cur.c line 310. Fixed a bug : if the MySQL query cache was used, it did not get invalidated by a modification done by ON DELETE CASCADE or ...SET NULL. Fixed a bug : if you created a temporary table inside LOCK TABLES, and used that temporary table, that caused an assertion failure in ha_innodb.cc. Fixed a bug : if you set innodb_flush_log_at_trx_commit to 1, SHOW VARIABLES would show its value as 16 million.
1341
BEGIN and COMMIT are now added in the binlog around transactions. The MySQL replication now respects transaction borders: a user will no longer see half transactions in replication slaves. A replication slave now prints in crash recovery the last master binlog position it was able to recover to. A new setting innodb_flush_log_at_trx_commit=2 makes InnoDB to write the log to the operating system file cache at each commit. This is almost as fast as the setting innodb_flush_log_at_trx_commit=0, and the setting 2 also has the nice feature that in a crash where the operating system does not crash, no committed transaction is lost. If the operating system crashes or there is a power outage, then the setting 2 is no safer than the setting 0. Added checksum fields to log blocks. SET FOREIGN_KEY_CHECKS=0 helps in importing tables in an arbitrary order which does not respect the foreign key rules. SET UNIQUE_CHECKS=0 speeds up table imports into InnoDB if you have UNIQUE constraints on secondary indexes. This flag should be used only if you are certain that the input records contain no UNIQUE constraint violations. SHOW TABLE STATUS now lists also possible ON DELETE CASCADE or ON DELETE SET NULL in the comment field of the table. When CHECK TABLE is run on any InnoDB type table, it now checks also the adaptive hash index for all tables. If you defined ON DELETE CASCADE or SET NULL and updated the referenced key in the parent row, InnoDB deleted or updated the child row. This is now changed to conform to SQL-92: you get the error 'Cannot delete parent row'. Improved the auto-increment algorithm: now the first insert or SHOW TABLE STATUS initializes the auto-increment counter for the table. This removes almost all surprising deadlocks caused by SHOW TABLE STATUS. Aligned some buffers used in reading and writing to datafiles. This allows using unbuffered raw devices as datafiles in Linux. Fixed a bug : If you updated the primary key of a table so that only the case of characters changed, that could cause assertion failures, mostly in page0page.ic line 515. Fixed a bug : If you delete or update a row referenced in a foreign key constraint and the foreign key check has to wait for a lock, then the check may report an erroneous result. This affects also the ON DELETE... operation. Fixed a bug : A deadlock or a lock wait timeout error in InnoDB causes InnoDB to roll back the whole transaction, but MySQL could still write the earlier SQL statements to the binlog, even though InnoDB rolled them back. This could, for example, cause replicated databases to get out-of-sync. Fixed a bug : If the database happened to crash in the middle of a commit, then the recovery might leak tablespace pages. Fixed a bug : If you specified a non-latin1 character set in my.cnf, then, in contrary to what is stated in the manual, in a foreign key constraint a string type column had to have the same length specification in the referencing table and the referenced table. Fixed a bug : DROP TABLE or DROP DATABASE could fail if there simultaneously was a CREATE TABLE running. Fixed a bug : If you configured the buffer pool bigger than 2 GB in a 32-bit computer, InnoDB would assert in buf0buf.ic line 214.
1342
Fixed a bug : on 64-bit computers updating rows which contained the SQL NULL in some column could cause the undo log and the ordinary log to become corrupt. Fixed a bug : innodb_log_monitor caused a hang if it suppressed lock prints for a page. Fixed a bug : in the HP-UX-10.20 version mutexes would leak and cause race conditions and crashes in any part of InnoDB code. Fixed a bug : if you ran in the AUTOCOMMIT mode, executed a SELECT, and immediately after that a RENAME TABLE, then RENAME would fail and MySQL would complain about error 1192. Fixed a bug : if compiled on 64-bit Solaris, InnoDB produced a bus error at startup.
1343
You can now add a new foreign key constraint with ALTER TABLE ... ADD CONSTRAINT FOREIGN KEY (...) REFERENCES ... (...). FOREIGN KEY definitions now allow backquotes around table and column names. MySQL command SET TRANSACTION ISOLATION LEVEL ... has now the following effect on InnoDB tables: if a transaction is defined as SERIALIZABLE then InnoDB conceptually adds LOCK IN SHARE MODE to all consistent reads. If a transaction is defined to have any other isolation level, then InnoDB obeys its default locking strategy which is REPEATABLE READ. SHOW TABLE STATUS no longer sets an x-lock at the end of an auto-increment index if the autoincrement counter has already been initialized. This removes in almost all cases the surprising deadlocks caused by SHOW TABLE STATUS. Fixed a bug : in a CREATE TABLE statement the string 'foreign' followed by a non-space character confused the FOREIGN KEY parser and caused table creation to fail with errno 150.
1344
Fixed a bug : on Sparc and other high-endian processors SHOW VARIABLES showed innodb_flush_log_at_trx_commit and other boolean-valued startup parameters always OFF even if they were switched on. Fixed a bug : if you ran mysqld-max-nt as a service on Windows NT/2000, the service shutdown did not always wait long enough for the InnoDB shutdown to finish.
1345
Fixed an assertion failure in .44, in trx0trx.c, line 178 when you drop a table which has the .frm file but does not exist inside InnoDB. Fixed a bug in the insert buffer. The insert buffer tree could get into an inconsistent state, causing a crash, and also crashing the recovery. This bug could appear especially in large table imports or alterations. Fixed a bug in recovery: InnoDB could go into an infinite loop constantly printing a warning message that it cannot find free blocks from the buffer pool. Fixed a bug : when you created a temporary table of the InnoDB type, and then used ALTER TABLE to it, the MySQL server could crash. Prevented creation of MySQL system tables 'mysql.user', 'mysql.host', or 'mysql.db', in the InnoDB type. Fixed a bug which can cause an assertion failure in 3.23.44 in srv0srv.c, line 1728.
1346
1347
Bogues corrigs : (Bug #9435) TIMESTAMP columns don't update (Bug #8753) Invalid schema object version after dropping index (crash fixed, currently retry required) (Bug #8557) ndbd does not get same nodeid on restart (Bug #8556) corrupt ndb_mgm show printout for certain configurations (Bug #8167) cluster shared memory and mysqld signal usage clash
1348
(Bug #7470) shared memory transporter does not connect (Bug #7396) Primary Key not working in NDB Mysql Clustered table (solaris) (Bug #7379) ndb restore fails to handle blobs and multiple databases (Bug #7346) ndb_restore enters infinite loop (Bug #7340) Problem for inserting data into the Text field on utf8 (Bug #7124) ndb_mgmd is aborted on startup when using SHM connection
Added use of section [mysql_cluster] in my.cnf. All cluster executables, including mysqld, parse this section. Convenient place to put e.g. ndb-connectstring so that it only needs to be specified once. Added cluster log info events on allocation and deallocation of nodeid's. Added cluster log info events on connection refuse as a result of version mismatch. Extended connectstring syntax to allow for leaving the port number out. E.g. ndb-connectstring| connect-string=myhost1,myhost2,myhost3 is a valid connectstring and connect occurs on default port 1186. Clear text ndb error messages provided also for error codes that are mapped to corresponding mysql error codes, by executing SHOW WARNINGS after an error has occured which relates to the ndb storage engine. Significant performance improvements done for read performance, especially for blobs. Added some variables for performance tuning, ndb_force_send and ndb_use_exact_count. Do show variables like 'ndb%'; in mysql client for listing. Use set command to alter variables. Added variables to set some options, ndb_use_transactions and ndb_autoincrement_prefetch_sz. Bogues corrigs : (Bug #7303) ndb_mgm: Trying to set CLUSTERLOG for a specific node id core dumps
1349
(Bug #7193) start backup gives false error printout (Bug #7153) Cluster nodes don't report error on endianness mismatch (Bug #7152) ndb_mgmd segfaults on incorrect HostName in configuration (Bug #7104) clusterlog filtering and level setting broken (Bug #6995) ndb_recover on varchar fields results in changing case of data (Bug #6919) all status only shows 2 nodes on a 8-node cluster (Bug #6871) DBD execute failed: Got error 897 'Unknown error code' from ndbcluster (Bug #6794) Wrong outcome of update operation of ndb table (Bug #6791) Segmentation fault when config.ini is not correctly set (Bug #6775) failure in acc when running many mysql clients (Bug #6696) ndb_mgm command line options inconsistent with behavior (Bug #6684) ndb_restore doesn't give error messages if inproper command given (Bug #6677) ndb_mgm can crash on "ALL CLUSTERLOG" (Bug #6538) Error code returned when select max() on empty table with index (Bug #6451) failing create table givers "ghost" tables which are impossible to remove (Bug #6435) strange behavior of left join (Bug #6426) update with long pk fails (Bug #6398) update of primary key fails (Bug #6354) mysql does not complain about --ndbcluster option when NDB is not compiled in (Bug #6331) INSERT IGNORE .. SELECT breaks subsequent inserts (Bug #6288) cluster nodes crash on data import (Bug #6031) To drop database you have to execute DROP DATABASE command twice (Bug #6020) LOCK TABLE + delete returns error 208 (Bug #6018) REPLACE does not work for BLOBs + NDB (Bug #6016) Strange crash with blobs + different DATABASES (Bug #5973) ndb table belonging to different database shows up in show tables (Bug #5872) ALTER TABLE with blob from ndb table to myisam fails (Bug #5844) Failing mysql-test-run leaves stray NDB processes behind (Bug #5824) HELP text messed up in ndb_mgm (Bug #5786) Duplicate key error after restore (Bug #5785) lock timeout during concurrent update (Bug #5782) Unknown error when using LIMIT with ndb table (Bug #5756) RESTART node from ndb_mgm fails
1350
1351
SHOW TABLES now directly shows ndb tables created on a different mysql server, i.e. without a prior table access. Enhanced support for starting MySQL Server independently of ndbd and ndb_mgmd. Bogues corrigs : Quite a few bugs fixed.
The management client (ndb_mgm) now has more commands and more information is printed in some commands such as show. In previous versions, the files were called ndb_0.. when it wasn't possible to allocate a node ID when starting the node. To ensure that files are not so easily overwritten, these files are now named ndb_pid.., where pid is the process ID assigned by the OS. The default parameters have changed for ndb_mgmd and ndbd. Yn particular, they are now started as daemons by default. The -n option was removed since it could confusion as to whether its meaning is nostart or nodaemon. In the configuration file, you can now use [NDBD] as an alias for [DB], [MYSQLD] as an alias for [API], and [NDB_MGMD] as an alias for [MGM]. Many more checks of the consistency of the configuration have been introduced to provide quicker feedback on configuration errors. In the connect string, it is now possible to use both ; and , as the separator between entries. So "nodeid=2,host=localhost:2200" is equivalent to "nodeid=2;host=localhost:2200". In the configuration, it is possible to use : or = as the assignment symbol. Thus MaxNoOfOrderedIndexes : 128 and MaxNoOfOrderedIndexes = 128 are equivalent. The configuration variable names are now case insensitive so MaxNoOfOrderedIndexes: 128 is equivalent to MAXNOOFORDEREDINDEXES = 128. It is possible now to set the backup directory separately from the FileSystemPath by using the BackupDir config variable. Log files and trace files can now be put in any directory by setting the DataDir configuration variable. FileSystemPath is no longer mandatory and defaults to DataDir. It is now supported to perform queries involving tables from different databases in MySQL. It is now possible to update the primary key. The performance of the ordered index has been greatly improved, particularly the maintenance of the index at updates, inserts and deletes. Bogues corrigs : Quite a few bugs fixed.
1353
This was the first MySQL Cluster release in 5.0. Actually almost all attention was on getting 4.1 stable so it is not recommended to use MySQL 5.0.1 for MySQL Cluster usage. Bogues corrigs :
1354
1355
Toutes les tapes dont vous avez besoin pour reconstruire le tout partir des fichiers de base.
/bin/rm */.deps/*.P /bin/rm -f config.cache aclocal autoheader aclocal automake autoconf ./configure --with-debug=full --prefix='votre dossier installation' # les fichiers make gnrs plus haut ont besoin de GNU make 3.75 ou plus rcent. # (appel gmake ci-dessous) gmake clean all install init-db
Si vous rencontrez des problmes avec un nouveau port, vois devrez faire du dbogage de MySQL ! See Section D.1, Dboguer un serveur MySQL . Note : avant de commencer dboguer mysqld, faites d'abord fonctionner les programmes de tests mysys/thr_alarm et mysys/thr_lock. Cela assurera que votre installation des threads a une chance de fonctionner !
1356
Cela vitera les problmes avec la bibliothque libstdc++ et les exceptions C++ (plusieurs compilateurs ont des problmes avec les exceptions C++ dans le code thread) et compilera une version MySQL avec le support de tous les jeux de caractres. Si vous suspectez un dpassement de la mmoire, vous pouvez configurer MySQL avec --withdebug=full, qui installera un vrificateur d'allocation mmoire (SAFEMALLOC). Fonctionner avec SAFEMALLOC est cependant un peu ralentissant, et donc, si vous rencontrez des problmes de performances, vous devez dmarrer mysqld avec l'option --skip-safemalloc. Cela dsactivera les vrifications de dpassements de mmoire pour chaque appel malloc ou free. Si mysqld ne plante plus lorsque vous le compilez avec --with-debug, vous avez probablement trouv un bogue du compilateur ou un bogue de temporisation dans MySQL. Dans ce cas, vous pouvez essayer d'ajouter -g aux variables CFLAGS et CXXFLAGS vues plus haut et ne pas utiliser -with-debug. Si mysqld plante maintenant, vous pouvez vous y attacher avec gdb ou utiliser gdb sur le fichier noyau pour trouver ce qui est arriv. Lorsque vous configurez MySQL pour le support du dbogage, vous activez automatiquement un tas de fonctions de tests supplmentaires qui se chargent de surveiller le bon fonctionnement de mysqld. Si elles trouvent quelque chose d'inattendu (``unexpected''), une entre sera crite dans stderr, que safe_mysqld redirige vers le log d'erreurs ! Cela signifie aussi que si vous avez quelques problmes inattendus avec MySQL et que vous utilisez une distribution des sources, la premire chose faire est de configurer MySQL avec le support du dbogage ! (la seconde, bien sr, tant d'envoyer un mail sur les listes de diffusion pour demander de l'aide. ) See Section 1.4.1.1, Les listes de diffusion de MySQL . Merci d'utiliser le script mysqlbug pour tous les rapport de bogues ou questions concernant la version de MySQL que vous utilisez ! Dans la distribution Windows de MySQL, mysqld.exe est par dfaut compil avec le support des fichiers de traage.
Sous Windows vous devez aussi utiliser l'option --standalone pour ne pas dmarrer mysqld en tant que service : Dans une console DOS entrez :
mysqld --debug --standalone
Aprs cela, vous pouvez utiliser l'outil en ligne de commande mysql.exe dans une seconde fentre pour reproduire le problme. Vous pouvez couper le serveur avec la commande mysqladmin shutdown. Notez que le fichier de traage deviendra trs gros ! si vous voulez obtenir un fichier plus petit, utilisez ce qui suit par exemple :
1357
mysqld --debug=d,info,error,query,general,where:O,/tmp/mysqld.trace qui n'crit que les informations les plus intressantes. Si vous crez un rapport de bogue, merci de n'envoyer que les lignes du fichier de traage o le problme se concrtise la liste de diffusion approprie ! Si vous n'arrivez pas trouver le bon endroit dans le fichier, vous pouvez envoyer la totalit du fichier ainsi que le rapport de bogue via FTP ftp:// support.mysql.com/pub/mysql/secret/ pour qu'un dveloppeur MySQL y jette un coup d'oeil. Le fichier de traage est gnr avec le paquet DBUG de Fred Fish. See Section D.3, Le paquet DBUG .
See Section A.4.2, Que faire si MySQL plante constamment ? . Si vous utilisez gdb 4.17.x ou plus rcent sous Linux, vous devez installer un fichier .gdb, avec les informations suivantes, dans votre rpertoire courant :
set print sevenbit off handle SIGUSR1 nostop noprint handle SIGUSR2 nostop noprint handle SIGWAITING nostop noprint handle SIGLWP nostop noprint handle SIGPIPE nostop handle SIGALRM nostop handle SIGHUP nostop handle SIGTERM nostop noprint
Si vous rencontrez des problmes lors du dbogage des threads avec gdb, vous devez obtenir la version 5.x de gdb et essayer cela la place. La nouvelle version de gdb a une meilleur gestion des threads ! Voil un exemple de comment dboguer mysqld :
shell> gdb /usr/local/libexec/mysqld gdb> run ...
1358
Incluez la sortie suivante dans un mail gnr avec mysqlbug et envoyez le sur les listes de diffusion. See Section 1.4.1.1, Les listes de diffusion de MySQL . Si mysqld ne rpond plus, vous pouvez utiliser des outils systme tel que strace ou /usr/proc/ bin/pstack pour savoir o mysqld s'est bloqu.
strace /tmp/log libexec/mysqld
Si vous utilisez l'interface DBI de Perl, vous pouvez activer le dbogage en utilisant la mthode trace ou en dfinissant la variable d'environnement DBI_TRACE.
vous pouvez trouver o s'est termin mysqld en excutant ce qui suit : 1. Copiez les nombres prcdents dans un fichier, mysqld.stack par exemple. 2. crez un fichier symbolique pour le serveur mysqld :
nm -n libexec/mysqld > /tmp/mysqld.sym
Notez que beaucoup de distributions binaires MySQL fournissent le fichier prcdent, nomm mysqld.sym.gz. Dans ce cas, dcompressez le en faisant :
gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym
3. Excutez resolve_stack_dump -s /tmp/mysqld.sym -n mysqld.stack. Cela affichera l'endroit o mysqld a plant. Si cela ne vous aide pas trouver pourquoi mysqld a plant, vous devez crer un rapport de bogue et y inclure le rsultat de la commande prcdente. Notez toutefois que dans la plupart de cas le fait de n'avoir que le traage de la pile ne nous aidera pas trouver d'o vient le problme. Pour tre capable de trouver le bogue, ou fournir une parade,
1359
Utilisation des fichiers de log pour trouver d'o viennent les erreurs de mysqld
nous aurons besoin dans la plupart des cas, nous aurons besoin de connatre la requte qui a fait planter mysqld et une batterie de tests pour que nous puissions reproduire le problme ! See Section 1.4.1.3, Comment rapporter un bogue ou un problme .
D.1.5. Utilisation des fichiers de log pour trouver d'o viennent les erreurs de mysqld
Notez qu'avant de dmarrer mysqld avec --log vous devez vrifier toutes vos tables avec myisamchk. See Chapitre 5, Administration du serveur. Si mysqld se termine ou se bloque, vous devez dmarrer mysqld avec --log. Lorsque mysqld se termine nouveau, vous pouvez examiner la fin de votre fichier de log pour trouver les requtes qui ont termin mysqld. Si vous utilisez --log sans spcifier un nom de fichier, le log est enregistr dans le dossier des bases de donnes en tant que host_name.log. Dans la plupart des cas, c'est la dernire requte dans le fichier de log qui a termin mysqld, mais si possible, vrifiez le en redmarrant mysqld et excutant nouveau la requte en question partir du client en ligne de commande mysql. Si elle fonctionne, vous devez aussi tester les autres requtes complexes qui n'ont pas abouties. Vous pouvez aussi utiliser la commande EXPLAIN sur toutes vos requtes SELECT qui prennent beaucoup de temps s'excuter pour tre srs que mysqld utilise les index convenablement. See Section 7.2.1, Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT) . Vous pouvez trouver les requtes qui prennent trop de temps s'excuter en dmarrant mysqld avec --log-slow-queries. See Section 5.9.5, Le log des requtes lentes . Si vous trouvez le texte mysqld restarted dans le log d'erreurs (normalement nomm hostname.err) vous avez probablement trouv une requte qui fait planter mysqld. Si tel est le cas, vous devez vrifier toutes vos tables avec myisamchk (see Chapitre 5, Administration du serveur), et tester les requtes dans les fichiers de log MySQL pour voir si elles ne fonctionnent toujours pas. si vous trouvez une requte de ce genre, essayez d'abord de mettre jour votre version de MySQL en prenant la version la plus rcente. Si cela ne vous aide pas et que vous ne pouvez trouver d'aide dans les archives des mails de mysql, vous devez reporter ce bogue sur les listes de diffusion. Des liens vers les archives de mails sont disponibles en ligne l'adresse suivante : http://lists.mysql.com/. Si vous avez dmarr mysqld avec myisam-recover, MySQL vrifiera et essayera automatiquement de rparer les tables MyISAM si elles sont marques comme "not closed properly" ou "crashed". Si cela arrive, MySQL ajoutera une entre dans le fichier hostname.err 'Warning: Checking table ...' qui sera suivie de Warning: Repairing table si la table devait tre rpare. si vous obtenez beaucoup de ces erreurs, sans que mysqld n'ait plant juste avant, alors quelque chose ne va pas, et une enqute plus approfondie est ncessaire. See Section 4.3.1, Options de ligne de commande de mysqld . Ce n'est bien sr pas de bon augure si mysqld a crash, mais dans ce cas, il ne faut pas s'attarder sur les messages Checking table... mais plutt essayer de savoir pourquoi mysqld a crash.
D.1.6. Faire une batterie de tests lorsque vous faites face un problme de table corrompue
Si vos tables sont corrompues ou que mysqld choue toujours avec quelques commandes de mises jour, vous pouvez tester si le bogue est reproductible en effectuant ce qui suit : Coupez le dmon MySQL (avec mysqladmin shutdown). Crez une copie de vos tables (pour prvoir le cas trs improbable ou la rparation tournerait mal). Vrifiez toutes les tables avec myisamchk -s base/*.MYI. Rparez toute table corrompue avec myisamchk -r base/table.MYI.
1360
Crez une seconde copie des tables. Effacez (ou dplacez) tout les vieux fichiers de log du rpertoire de donnes de MySQL si vous avez besoin de plus d'espace. Dmarrez mysqld avec --log-bin. See Section 5.9.4, Le log binaire . Si vous voulez trouver une requte qui fait planter mysqld, vous devez utiliser --log --log-bin. Lorsque vous obtenez une table corrompue, stoppez le serveur mysqld. Restaurez les sauvegardes. Redmarrez le serveur mysqld sans --log-bin Re-excutez les commandes avec mysqlbinlog update-log-file | mysql. Le log des mises jour est est sauvegard dans le dossier des donnes de MySQL avec le nom hostname-bin.#. Si les tables sont nouveau corrompues ou que vous pouvez faire chouer mysqld avec la commande prcdente, vous avez trouv un bogue reproductible qui devrait tre facile corriger ! Envoyez les tables et le log binaire via FTP ftp://support.mysql.com/pub/mysql/ secret/ et envoyez un mail <bugs@lists.mysql.com> ou (si vous tes client du support) <support@mysql.com> propos du problme et l'quipe MySQL le corrigera le plus vite possible. Vous pouvez aussi utiliser le script mysql_find_rows pour n'excuter que quelques requtes de mises jour si vous voulez mieux cerner le problme.
Cela fait gnrer au client un fichier de traage dans /tmp/client.trace. Si vous avez un problme avec votre propre code client, vous devez essayer de vous connecter au serveur et excuter vos requtes en utilisant un client qui fonctionne. Faites le en utilisant mysql en mode dbogage (en supposant que vous ayez compil MySQL avec le support du dbogage) :
shell> mysql --debug=d:t:O,/tmp/client.trace
Il vous fournira des informations utiles si vous voulez envoyer un rapport de bogue. See Section 1.4.1.3, Comment rapporter un bogue ou un problme . Si votre client se plante au niveau d'un code qui vous parait "valide", vous devez vrifier que votre fichier mysql.h inclus correspond votre bibliothque MySQL. Une erreur trs courante est d'utiliser un vieux fichier mysql.h d'une ancienne installation avec la nouvelle bibliothque MySQL.
1361
Le paquet DBUG
La plupart des programmes MySQL ont une chane de dbogage par dfaut qui sera utilise si vous ne spcifiez aucune option --debug. Le fichier de traage par dfaut est usuellement /tmp/ nomprogramme.trace sur Unix et \nomprogramme.trace sur Windows. La chane de caractres de controle du dbogage est une squence de champs spars par des deuxpoints (:) comme celle qui suit :
<champ_1>:<champ_2>:...:<champ_N>
Chaque champ consiste d'un caractre attribut suivi d'une liste de modificateurs, commenant optionnellement par une virgule ,, spars par des virgules :
flag[,modificateur,modificateur,...,modificateur]
Les caractres attributs actuellement reconnus sont : Attribut Description d Active les sorties des macros DBUG_<N> pour l'tat courant. Peut tre suivi d'une liste de mots clefs, ce qui slectionne la sortie seuelemnt pour les macros DBUG contenant ces mots. Une liste de mots clefs vides implique les sorties de toutes les macros. Attendre aprs chaque ligne rsultante du dbogueur. L'argument est le nombre de diximme de secondes attendre, sujet aux capabilits de la machine. Et donc, -#D,20 est une attente de deux secondes. Limiter le dbogage et/ou le traage aux fonctions cites. Notez qu'une liste nulle dsactivera toutes les fonctions. Les attributs appropris "d" ou "t" doivent quand mme tre donns, cet attribut ne limite que leurs actions si ils sont activs. Identifie le nom du fichier source pour chaque ligne de dbogage ou de traage affiche. Identifie le processus avec son identifiant pour chaque ligne de dbogage ou de traage affiche. Active le profiling. Cre un fichier nomm dbugmon.out contenant des informations qui peuvent tre utilises pour profiler le programme. Peut tre suivi d'une liste de mots clefs qui slectionnent le profiling uniquement pour les fonctions prsentes dans ctte liste. Une liste nulle implique que toutes les fonctions sont considres. Identifie le numro de ligne du fichier source pour chaque ligne renvoye par le traage ou le dbogage. Imprime le niveau de profondeur de la fonction en cours d'excution pour la sortie du traage ou du dbogage. Numrote chaque ligne de la sortie du dbogage. Redirige le flux de sortie du dbogueur vers le fichier spcifi. Par dfaut, c'est stderr. Comme o mais le fichier est vraiement crit entre chaque ajout de contenu. Lorsque le besoin en est, le fichier est ferm puis rouvert entre chaque criture. Limite les actions du dbogueur aux processus spcifis. Un processus peut tre identifi avec la macro DBUG_PROCESS et correspondre un processus dans la liste pour que le dbogage ait lieu. Affiche le nom du processus courant pour chaque ligne de sortie de dbogage ou de traage. Lors du passage un nouvel tat, ne pas hriter le niveau de profondeur de l'tat de la fonction prcdente. Utile lorsque l'affichage commence la marge gauche. Excute la fonction _sanity(_file_,_line_) sur chaque fonction dbogue jusqu' ce que la valeur de retour de _sanity() diffre de 0. (La plupart du temps utilise avec safemalloc pour trouver les pertes de mmoire) Active le traage des appels/sorties des fonctions. Peut tre suivi d'une liste (ne contenant qu'un seul modificateur) donnant un maximum numrique du traage, au del duquel aucune sortie ne sera affiche pour les macros de dbogage ou de traage. Par dfaut, c'est une option de temps de compilation.
F i g
L n N o O p
P r S
1362
Quelques exemples de chanes de controle de dbogage pouvant tre utilise en ligne de commande dans le shell ("-#" est typiquement utilis pour introduire une chane de controle un programme d'application) sont :
-#d:t -#d:f,main,subr1:F:L:t,20 -#d,input,output,files:n -#d:t:i:O,\\mysqld.trace
En MySQL, les balises communes affiches (avec l'option d) sont : enter,exit,error,warning,info et loop.
1363
process_alarm process_alarm thread_alarm Thread: 6 Slept for 1 (1) sec Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 2 (2) sec Thread: 6 Simulation of no alarm needed Thread: 6 Slept for 0 (3) sec Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 4 (4) sec Thread: 6 Waiting process_alarm thread_alarm Thread: 5 Slept for 10 (10) sec Thread: 5 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 5 (5) sec Thread: 6 Waiting process_alarm process_alarm ... thread_alarm Thread: 5 Slept for 0 (1) sec end
1364
sont bons pour les threads et ne devraient avoir besoin que d'une petite perte de performances. Solaris, HP-UX, AIX et OSF/1 ont des threads noyau. Avec quelques systmes, les threads du noyau sont grs en intgrant les threads niveau utilisateur dans les bibliothques du systme. Dans ces cas, le changement de thread ne peut tre fait qu'avec la bibliothque de threads et le noyau n'est pas vraiment ``attentif aux threads''.
1365
1366
1367
1368
a?
1369
{1}, {2,3} Voici une faon plus gnrale d'crire les expressions rgulires qui correspondent plusieurs occurrences du dernier atome. m et n sont des entiers. a* Peut tre crit a{0,}. a+ Peut tre crit a{1,}. a? Peut tre crit a{0,1}. Pour tre plus prcis, un atome suivi d'une accolade contenant un entier i et pas de virgule trouve une squence de exactement i atomes. Un atome suivi d'une accolade contenant un entier i et une virgule trouve une squence de i ou plus atomes. Un atome suivi d'une accolade contenant deux entiers i et j spars d'une virgule trouve les squences de i j (inclusif) atomes. Les deux arguments doivent tre compris entre 0 et RE_DUP_MAX (par dfaut 255), inclusif. S'il y a deux arguments, le second doit tre suprieur ou gal au premier.
mysql> SELECT 'abcde' REGEXP 'a[bcd]{2}e'; mysql> SELECT 'abcde' REGEXP 'a[bcd]{3}e'; mysql> SELECT 'abcde' REGEXP 'a[bcd]{1,10}e'; -> 0 -> 1 -> 1
[a-dX], [^a-dX] Trouve n'importe quel caractre qui est (ou n'est pas, si ^ est utilis) a, b, c, d ou X. Pour inclure le caractre littral ], il doit suivre immdiatement le crochet ouvrant [. Pour inclure le caractre littral -, il doit tre crit en premier ou en dernier. Ce qui fait que [0-9] correspond n'importe 1370
quel chiffre. Chaque caractre qui n'a pas de signification spciale l'intrieur une paire de [] ne joue pas de rle spcial et ne correspond qu' lui mme.
mysql> mysql> mysql> mysql> mysql> mysql> SELECT SELECT SELECT SELECT SELECT SELECT 'aXbc' REGEXP '[a-dXYZ]'; 'aXbc' REGEXP '^[a-dXYZ]$'; 'aXbc' REGEXP '^[a-dXYZ]+$'; 'aXbc' REGEXP '^[^a-dXYZ]+$'; 'gheis' REGEXP '^[^a-dXYZ]+$'; 'gheisa' REGEXP '^[^a-dXYZ]+$'; -> -> -> -> -> -> 1 0 1 0 1 0
[.characters.] La squence de caractres de cet lment d'assemblage. La squence est un lment de la liste contenue entre les crochets. Une telle expression contenant un lment d'assemblage multicaractres peut ainsi trouver plus d'un caractre. Vous trouverez la liste complte des noms de caractres dans regexp/cname.h.
mysql> SELECT '~' REGEXP '[[.~.]]'; mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1 -> 1
[=character_class=] Une classe d'quivalence, remplaant les squences de caractres de tous les lments de l'assemblage quivalents celui-ci, lui mme inclut. Par exemple, si o et (+) sont membres d'une classe d'quivalence, alors [[=o=]], [[=(+)=]], et [o(+)] sont tous des synonymes. Une classe d'quivalence ne doit pas tre un point final d'intervalle. [:character_class:] Dans une expression entre crochets, le nom d'une classe de caractres entoure de [: et :] remplace la liste de tous les caractres appartenant cette classe. Les noms des classes de caractres sont : Caractres alpha-numriques Caractres alphabtiques Caractres espace Caractres de contrle Chiffres Caractres graphiques Minuscules Caractres graphiques ou espaces Ponctuation Espace, tabulation, nouvelle ligne et retour chariot Majuscules
alnum alpha blank cntrl digit graph lower print punct space upper
xdigit Chiffres hexadcimaux Voil les classes de caractres dfinies dans la page de manuel ctype(3). Une locale peut en fournir d'autres. Une classe de caractre ne doit pas tre utilise en tant que point final d'intervalle.
mysql> SELECT "justalnums" REGEXP "[[:alnum:]]+"; mysql> SELECT "!!" REGEXP "[[:alnum:]]+"; -> 1 -> 0
[[:<:]], [[:>:]]
1371
Ceux l trouvent la chane nulle qui prcde et suit chaque mot. Un mot est dfini comme tant une squence de caractres qui n'est ni suivi ni prcde d'un caractre de mot. Un caractre de mot est un caractre alnum (dfini par ctype(3)) ou un tiret bas (_).
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 1 -> 0
Pour utiliser une instance littrale d'un caractre spcial dans une expression rgulire, vous devez la faire prcder de deux caractres anti-slash. L'analyseur MySQL interprte le premier anti-slash, et la bibliothque d'expressions rgulires utilisera le second. Par exemple, pour rechercher l'expression 1+2 qui contient le caractre spcial +, seule la dernire expression rgulire sera correcte :
mysql> SELECT '1+2' REGEXP '1+2'; mysql> SELECT '1+2' REGEXP '1\+2'; mysql> SELECT '1+2' REGEXP '1\\+2'; -> 0 -> 0 -> 1
1372
Preamble Les licences relatives la plupart des logiciels sont destines supprimer votre libert de les partager et de les modifier. Par contraste, la licence publique gnrale GNU General Public License veut garantir votre libert de partager et de modifier les logiciels libres, pour qu'ils soient vraiment libres pour tous leurs utilisateurs. La prsente licence publique gnrale s'applique la plupart des logiciels de la Free Software Foundation, ainsi qu' tout autre programme dont les auteurs s'engagent l'utiliser. (Certains autres logiciels sont couverts par la Licence Publique Gnrale pour Bibliothques GNU la place). Vous pouvez aussi l'appliquer vos programmes. Quand nous parlons de logiciels libres, nous parlons de libert, non de gratuit. Nos licences publiques gnrales veulent vous garantir que vous avez toute libert de distribuer des copies des logiciels libres (et de facturer ce service, si vous le souhaitez), que vous recevez les codes sources ou pouvez les obtenir si vous le souhaitez, que vous pouvez modifier les logiciels ou en utiliser des lments dans de nouveaux programmes libres, et que vous savez que vous pouvez le faire. Pour protger vos droits, nous devons apporter des restrictions, qui vont interdire quiconque de vous dnier ces droits, ou de vous demander de vous en dsister. Ces restrictions se traduisent par certaines responsabilits pour ce qui vous concerne, si vous distribuez des copies de logiciels, ou si vous les modifiez. Par exemple, si vous distribuez des copies d'un tel programme, gratuitement ou contre une rmunration, vous devez transfrer aux destinataires tous les droits dont vous disposez. Vous devez vous garantir qu'eux-mmes, par ailleurs, reoivent ou peuvent recevoir le code source. Et vous devez leur montrer les prsentes dispositions, de faon qu'ils connaissent leurs droits. Nous protgeons vos droits en deux tapes : (1) Nous assurons le droit d'auteur (copyright) du logiciel, et (2) Nous vous proposons cette licence, qui vous donne l'autorisation lgale de dupliquer, distribuer et/ou modifier le logiciel.
1373
De mme, pour la protection de chacun des auteurs, et pour notre propre protection, nous souhaitons nous assurer que tout le monde comprenne qu'il n'y a aucune garantie portant sur ce logiciel libre. Si le logiciel est modifi par quelqu'un d'autre puis transmis des tiers, nous souhaitons que les destinataires sachent que ce qu'ils possdent n'est pas l'original, de faon que tous problmes introduits par d'autres ne se traduisent pas par une rpercussion ngative sur la rputation de l'auteur original. Enfin, tout programme libre est en permanence menac par des brevets de logiciels. Nous souhaitons viter le danger que des sous-distributeurs d'un programme libre obtiennent titre individuel des licences de brevets, avec comme consquence qu'ils ont un droit de proprit sur le programme. Pour viter cette situation, nous avons fait tout ce qui est ncessaire pour que tous brevets doivent faire l'objet d'une concession de licence qui en permette l'utilisation libre par quiconque, ou bien qu'il ne soit pas concd du tout. Nous prsentons ci-dessous les clauses et dispositions concernant la duplication, la distribution et la modification. CONDITIONS D'EXPLOITATION PORTANT SUR LA DUPLICATION, LA DISTRIBUTION ET LA MODIFICATION 1. Le prsent contrat de licence s'applique tout programme ou autre ouvrage contenant un avis, appos par le dtenteur du droit de proprit, disant qu'il peut tre distribu au titre des dispositions de la prsente Licence Publique Gnrale. Ci-aprs, le "Programme" dsigne l'un quelconque de ces programmes ou ouvrages, et un "ouvrage fond sur le programme" dsigne soit le programme, soit un ouvrage qui en drive au titre de la loi sur le droit d'auteur ; plus prcisment, il s'agira d'un ouvrage contenant le programme ou une version de ce dernier, soit mot mot, soit avec des modifications et/ou traduit en une autre langue (ci-aprs, le terme "modification" englobe, sans aucune limitation, les traductions qui en sont faites). Chaque titulaire de licence sera appel "concessionnaire". Les activits autres que la duplication, la distribution et la modification ne sont pas couvertes par la prsente licence ; elles n'entrent pas dans le cadre de cette dernire. L'excution du programme n'est soumise aucune restriction, et les rsultats du programme ne sont couverts que si son contenu constitue un ouvrage fond sur le programme (indpendamment du fait qu'il a t ralis par excution du programme). La vracit de ce qui prcde dpend de ce que fait le programme. 2. Le concessionnaire peut dupliquer et distribuer des copies mot mot du code source du programme tel qu'il les reoit, et ce sur un support quelconque, du moment qu'il appose, d'une manire parfaitement visible et approprie, sur chaque exemplaire, un avis appropri de droits d'auteur (Copyright) et de renonciation garantie ; qu'il maintient intacts tous les avis qui se rapportent la prsente licence et l'absence de toute garantie ; et qu'il transmet tout destinataire du programme un exemplaire de la prsente licence en mme temps que le programme. Le concessionnaire peut facturer l'acte physique de transfert d'un exemplaire, et il peut, sa discrtion, proposer en change d'une rmunration une protection en garantie. 3. Le concessionnaire peut modifier son ou ses exemplaires du programme ou de toute portion de ce dernier, en formant ainsi un ouvrage fond sur le programme, et dupliquer et distribuer ces modifications ou cet ouvrage selon les dispositions de la section 1 ci-dessus, du moment que le concessionnaire satisfait aussi toutes ces conditions : a. Le concessionnaire doit faire en sorte que les fichiers modifis portent un avis, parfaitement visible, disant que le concessionnaire a modifi les fichiers, avec la date de tout changement. b. Le concessionnaire doit faire en sorte que tout ouvrage qu'il distribue ou publie, et qui, en totalit ou en partie, contient le programme ou une partie quelconque de ce dernier ou en drive, soit concd en bloc, titre gracieux, tous tiers au titre des dispositions de la prsente licence.
1374
c. Si le programme modifi lit normalement des instructions interactives lors de son excution, le concessionnaire doit, quand il commence l'excution du programme pour une telle utilisation interactive de la manire la plus usuelle, faire en sorte que ce programme imprime ou affiche une annonce, comprenant un avis appropri de droits d'auteur, et un avis selon lequel il n'y a aucune garantie (ou autrement, que le concessionnaire fournit une garantie), et que les utilisateurs peuvent redistribuer le programme au titre de ces dispositions, et disant l'utilisateur comment visualiser une copie de cette licence (exception : si le programme par lui-mme est interactif mais n'imprime normalement pas une telle annonce, l'ouvrage du concessionnaire se fondant sur le programme n'a pas besoin d'imprimer une annonce). Les exigences ci-dessus s'appliquent l'ouvrage modifi pris en bloc. Si des sections identifiables de cet ouvrage ne drivent pas du programme et peuvent tre considres raisonnablement comme reprsentant des ouvrages indpendants et distincts par eux-mmes, alors la prsente licence, et ses dispositions, ne s'appliquent pas ces sections quand le concessionnaire les distribue sous forme d'ouvrages distincts. Mais quand le concessionnaire distribue ces mmes sections en tant qu'lment d'un tout qui reprsente un ouvrage se fondant sur le programme, la distribution de ce tout doit se faire conformment aux dispositions de la prsente licence, dont les autorisations, portant sur d'autres concessionnaires, s'tendent la totalit dont il est question, et ainsi chacune de ces parties, indpendamment de celui qu'il a crite. Ainsi, cette section n'a pas pour but de revendiquer des droits ou de contester vos droits sur un ouvrage entirement crit par le concessionnaire ; bien plus, l'intention est d'exercer le droit de surveiller la distribution d'ouvrages drive ou collective se fondant sur le programme. De plus, un simple assemblage d'un autre ouvrage ne se fondant pas sur le programme, avec le programme (ou avec un ouvrage se fondant sur le programme) sur un volume d'un support de stockage ou distribution, ne fait pas entrer l'autre ouvrage dans le cadre de la prsente licence. 4. Le concessionnaire peut dupliquer et distribuer le programme (ou un ouvrage se fondant sur ce dernier, au titre de la Section 2), en code objet ou sous une forme excutable, au titre des dispositions des Sections 1 et 2 ci-dessus, du moment que le concessionnaire effectue aussi l'une des oprations suivantes : a. Lui joindre le code source complet correspondant, exploitable par une machine, code qui doit tre distribu au titre des Sections 1 et 2 ci-dessus sur un support couramment utilis pour l'change de logiciels ; ou bien b. Lui joindre une offre crite, dont la validit se prolonge pendant au moins 3 ans, de transmettre un tiers quelconque, pour un montant non suprieur au cot pour le concessionnaire, de ralisation physique de la distribution de la source, un exemplaire complet, exploitable par une machine, du code source correspondant, qui devra tre distribu au titre des dispositions des Sections 1 et 2 ci-dessus sur un support couramment utilis pour l'change des logiciels ; ou bien c. Lui joindre les informations que le concessionnaire a reues, pour proposer une distribution du code source correspondant (cette variante n'est autorise que pour la distribution non commerciale, et seulement si le concessionnaire a reu le programme sous forme excutable ou sous forme d'un code objet, avec une telle offre, conformment l'alina b) ci-dessus). Le code source d'un ouvrage reprsente la forme prfre de l'ouvrage pour y effectuer des modifications. Pour un ouvrage excutable, le code source complet reprsente la totalit du code source pour tous les modules qu'il contient, plus tous fichiers de dfinitions d'interface associs, plus les informations en code machine pour commander la compilation et l'installation du programme excutable. Cependant, titre d'exceptions spciales, le code source distribu n'a pas besoin de comprendre quoi que ce soit qui est normalement distribu (sous forme source ou sous forme binaire) avec les composants principaux (compilateur, noyau de systme d'exploitation, etc.) du systme d'exploitation sur lequel est excut le programme excutable, moins que le composant, par lui-mme, soit joint au programme excutable.
1375
Si la distribution de l'excutable ou du code objet est ralise de telle sorte qu'elle offre d'accder une copie partir d'un lieu dsign, alors le fait d'offrir un accs quivalent la duplication du code source partir de ce mme lieu s'entend comme distribution du code source, mme si des tiers ne sont pas contraintes de dupliquer la source en mme temps que le code objet. 5. Le concessionnaire ne peut dupliquer, modifier, concder en sous-licence ou distribuer le programme, sauf si cela est expressment prvu par les dispositions de la prsente licence. Toute tentative pour autrement dupliquer, modifier, concder en sous-licence ou distribuer le programme est rpte nulle, et met automatiquement fin aux droits du concessionnaire au titre de la prsente licence. Cependant, les parties qui ont reu des copies, ou des droits, de la part du concessionnaire au titre de la prsente licence, ne verront pas expirer leur contrat de licence, tant que ces parties agissent d'une manire parfaitement conforme. 6. Il n'est pas exig du concessionnaire qu'il accepte la prsente licence, car il ne l'a pas signe. Cependant, rien d'autre n'octroie au concessionnaire l'autorisation de modifier ou de distribuer le programme ou ses ouvrages drivs. Ces actions sont interdites par la loi si le concessionnaire n'accepte pas la prsente licence. En consquence, par le fait de modifier ou de distribuer le programme (ou un ouvrage quelconque se fondant sur le programme), le concessionnaire indique qu'il accepte la prsente licence, et qu'il a la volont de se conformer toutes les clauses et dispositions concernant la duplication, la distribution ou la modification du programme ou d'ouvrages se fondant sur ce dernier. 7. Chaque fois que le concessionnaire redistribue le programme (ou tout ouvrage se fondant sur le programme), le destinataire reoit automatiquement une licence de l'metteur initial de la licence, pour dupliquer, distribuer ou modifier le programme, sous rserve des prsentes clauses et dispositions. Le concessionnaire ne peut imposer aucune restriction plus pousse sur l'exercice, par le destinataire, des droits octroys au titre des prsentes. Le concessionnaire n'a pas pour responsabilit d'exiger que des tiers se conforment la prsente licence. 8. Si, en consquence une dcision de justice ou une allgation d'infraction au droit des brevets, ou pour toute autre raison (qui n'est pas limite des problmes de proprits industrielles), des conditions sont imposes au concessionnaire (par autorit de justice, par convention ou autrement), qui entrent en contradiction avec les dispositions de la prsente licence, elles n'exemptent pas le concessionnaire de respecter les dispositions de la prsente licence. Si le concessionnaire ne peut procder la distribution de faon satisfaire simultanment ces obligations au titre de la prsente licence et toutes autres obligations pertinentes, alors, en consquence de ce qui prcde, le concessionnaire peut ne pas procder du tout la distribution du programme. Par exemple, si une licence de brevet ne permettait pas une redistribution du programme, sans redevances, par tous ceux qui reoivent des copies directement ou indirectement par l'intermdiaire du concessionnaire, alors le seul moyen par lequel le concessionnaire pourrait satisfaire tant cette licence de brevet qu' la prsente licence, consisterait s'abstenir compltement de distribuer le programme. Si une partie quelconque de cette section est considre comme nulle ou non excutoire dans certaines circonstances particulires, le reste de cette section est rput s'appliquer, et la section dans son ensemble est considre comme s'appliquant dans les autres circonstances. La prsente section n'a pas pour objet de pousser le concessionnaire enfreindre tous brevets ou autres revendications droit de proprit, ou encore contester la validit de une ou plusieurs quelconques de ces revendications ; la prsente section a pour objet unique de protger l'intgrit du systme de distribution des logiciels libres, systme qui est mis en oeuvre par les pratiques lies aux licences publiques. De nombreuses personnes ont apport une forte contribution la gamme tendue des logiciels distribus par ce systme, en comptant sur l'application systmatique de ce systme ; c'est l'auteur/donateur de dcider s'il a la volont de distribuer le logiciel par un quelconque autre systme, et un concessionnaire ne peut imposer ce choix. La prsente section veut rendre parfaitement claire ce que l'on pense tre une consquence du reste de la prsente licence.
1376
9. Si la distribution et/ou l'utilisation du Programme est restreinte dans certains pays, sous l'effet de brevets ou d'interfaces prsentant un droit d'auteur, le dtenteur du droit d'auteur original, qui soumet le Programme aux dispositions de la prsente licence, pourra ajouter une limitation expresse de distribution gographique excluant ces pays, de faon que la distribution ne soit autorise que dans les pays ou parmi les pays qui ne sont pas ainsi exclus. Dans ce cas, la limitation fait partie intgrante de la prsente licence, comme si elle tait crite dans le corps de la prsente licence. 10. La Free Software Foundation peut, de temps autre, publier des versions rvises et/ou nouvelles du General Public License. Ces nouvelles versions seront analogues, du point de vue de leur esprit, la prsente version, mais pourront en diffrer dans le dtail, pour rsoudre de nouveaux problmes ou de nouvelles situations. Chaque version reoit un numro de version qui lui est propre. Si le programme spcifie un numro de version de la prsente licence, qui s'applique cette dernier et " toute autre version ultrieure", le concessionnaire a le choix de respecter les clauses et dispositions de cette version, ou une quelconque version ultrieure publie par la Free Software Foundation. Si le programme ne spcifie pas de numro de version de la prsente licence, le concessionnaire pourra choisir une version quelconque publie tout moment par la Free Software Foundation. 11. Si le concessionnaire souhaite incorporer des parties du programme dans d'autres programmes libres dont les conditions de distribution sont diffrentes, il devrait crire l'auteur pour demander son autorisation. Pour un logiciel soumis droit d'auteur par la Free Software Foundation, il devra crire la Free Software Foundation ; nous faisons quelquefois des exceptions cette rgle. Notre dcision va tre guide par le double objectif de protger le statut libre de tous les drivs de nos logiciels libres, et de favoriser le partage et la rutilisation des logiciels en gnral. ABSENCE DE GARANTIE 12. COMME LA LICENCE DU PROGRAMME EST CONCEDEE A TITRE GRATUIT, IL N'Y AUCUNE GARANTIE S'APPLIQUANT AU PROGRAMME, DANS LA MESURE AUTORISEE PAR LA LOI EN VIGUEUR. SAUF MENTION CONTRAIRE ECRITE, LES DETENTEURS DU DROIT D'AUTEUR ET/OU LES AUTRES PARTIES METTENT LE PROGRAMME A DISPOSITON "EN L'ETAT", SANS AUCUNE GARANTIE DE QUELQUE NATURE QUE CE SOIT, EXPRESSE OU IMPLICITE, Y COMPRIS, MAIS SANS LIMITATION, LES GARANTIES IMPLICITES DE COMMERCIALISATION ET DE L'APTITUDE A UN OBJET PARTICULIER. C'EST LE CONCESSIONNAIRE QUI PREND LA TOTALITE DU RISQUE QUANT A LA QUALITE ET AUX PERFORMANCES DU PROGRAMME. SI LE PROGRAMME SE REVELAIT DEFECTUEUX, C'EST LE CONCESSIONNAIRE QUI PRENDRAIT A SA CHARGE LE COUT DE L'ENSEMBLE DES OPERATIONS NECESSAIRES D'ENTRETIEN, REPARATION OU CORRECTION. 13. EN AUCUN CAS, SAUF SI LA LOI EN VIGUEUR L'EXIGE OU SI UNE CONVENTION ECRITE EXISTE A CE SUJET, AUCUN DETENTEUR DE DROITS D'AUTEUR, OU AUCUNE PARTIE AYANT LE POUVOIR DE MODIFIER ET/OU DE REDISTRIBUER LE PROGRAMME CONFORMEMENT AUX AUTORISATIONS CI-DESSUS, N'EST RESPONSABLE VIS-AVIS DU CONCESSIONNAIRE POUR CE QUI EST DES DOMMAGES, Y COMPRIS TOUS DOMMAGES GENERAUX, SPECIAUX, ACCIDENTELS OU INDIRECTS, RESULTANT DE L'UTILISATION OU DU PROGRAMME OU DE L'IMPOSSIBILITE D'UTILISER LE PROGRAMME (Y COMPRIS, MAIS SANS LIMITATION, LA PERTE DE DONNEES, OU LE FAIT QUE DES DONNEES SONT RENDUES IMPRECISES, OU ENCORE LES PERTES EPROUVEES PAR LE CONCESSIONNAIRE OU PAR DES TIERS, OU ENCORE UN MANQUEMENT DU PROGRAMME A FONCTIONNER AVEC TOUS AUTRES PROGRAMMES), MEME SI CE DETENTEUR OU CETTE AUTRE PARTIE A ETE AVISE DE LA POSSIBILITE DE TELS DOMMAGES. FIN DES CONDITIONS D'EXPLOITATION Comment appliquer ces dispositions a vos nouveaux programmes? Si le concessionnaire dveloppe un nouveau programme, et s'il en souhaite l'utilisation la plus large possible dans le public, le meilleur moyen d'y arriver est d'en faire un logiciel libre, que tout le monde
1377
pourra redistribuer et modifier au titre des prsentes dispositions. Dans ce but, il convient de rattacher au programme les avis suivants. Le moyen le plus sr consiste les rattacher au dbut de chaque fichier source, pour avertir le plus efficacement possible de l'exclusion de garantie ; et chaque fichier doit comporter au moins la ligne ``copyright'', et un pointeur indiquant o est localise la totalit de l'avis.
Une ligne pour donner le nom du programme et une ide de ce qu'il fait. Copyright (C) yyyy nom de l'auteur Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier conformment aux dispositions de la Licence Publique Gnrale GNU, telle que publie par la Free Software Foundation ; version 2 de la licence, ou encore ( votre choix) toute version ultrieure. Ce programme est distribu dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans mme la garantie implicite de COMMERCIALISATION ou D'ADAPTATION A UN OBJET PARTICULIER. Pour plus de dtail, voir la Licence Publique Gnrale GNU . Vous devez avoir reu un exemplaire de la Licence Publique Gnrale GNU en mme temps que ce programme ; si ce n'est pas le cas, crivez la Free Software Foundation Inc., 675 Mass Ave, Cambridge, MA 02139, Etats-Unis.
Ajoutez aussi des informations sur le moyen permettant d'entrer en contact avec vous par courrier lectronique (e-mail) et courrier normal. Si le programme est interactif, prvoyez en sortie un court avis, tel que celui qui est prsent cidessous, lors du dmarrage en mode interactif.
Gnomovision version 69, Copyright (C) yyyy nom de l'auteur Gnomovision est livr absolument SANS AUCUNE GARANTIE ; pour plus de dtail, tapez 'show w'. Il s'agit d'un logiciel libre, et vous avez le droit de le redistribuer dans certaines conditions ; pour plus de dtail, tapez 'show c'.
Les instructions hypothtiques show w et show c doivent prsenter les parties appropries de la Licence Publique Gnrale. Bien videmment, les instructions que vous utilisez peuvent porter d'autres noms que show w et show c ; elles peuvent mme correspondre des clics de souris ou des lments d'un menu, selon ce qui convient votre programme. Si ncessaire, vous devrez aussi demander votre employeur (si vous travaillez en tant que programmeur) ou votre ventuelle cole ou universit, de signer une ``renonciation droit d'auteur'' concernant le programme. En voici un chantillon (il suffit de modifier les noms) :
Yoyodyne, Inc., par la prsente, renonce tout intrt de droits d'auteur dans le programme `Gnomovision' (qui fait des passages au niveau des compilateurs) crit par James Hacker. signature de Ty Coon, 1er avril 1989 Ty Coon, President of Vice
La prsente Licence Publique Gnrale n'autorise pas le concessionnaire incorporer son programme dans des programmes propritaires. Si votre programme est une bibliothque de sous-programmes, vous pouvez considrer comme plus intressant d'autoriser une dition de liens des applications propritaires avec la bibliothque. Si c'est ce que vous souhaitez, vous devrez utiliser non pas la prsente licence, mais la Licence Publique Gnrale pour Bibliothques GNU. Sauf mention contraire indique plus haut, le prsent document est soumis aux conditions d'exploitation suivantes : Copyright 2001 APRIL Ce document peut tre reproduit par n'importe quel moyen que ce soit, pourvu qu'aucune modification ne soit effectue et que cette notice soit prserve.
1378
1379
Common Public License GNU Library or "Lesser" General Public License (LGPL) Jabber Open Source License MIT license Mozilla Public License (MPL) Open Software License PHP License Python license (CNRI Python License) Python Software Foundation License Sleepycat License W3C License X11 License Zlib/libpng License Zope Public License
1.0 2.0/2.1 1.0 1.0/1.1 2.0 3.0 2.1.1 "1999" "2001" "2001" 2.0
A cause des nombreuses variantes de certaines des licences ci-dessus, nous demandons que la version utilise suive les dfinitions Free Software Definitio version 2003 de la Free Software Foundation (http://www.gnu.org/philosophy/free-sw.html) ou la version 1.9 de la Open Source Definition de l'Open Source Initiative (http://www.opensource.org/docs/definition.php). 3. Dfinitions a. Les termes utiliss mais non dfinis, doivent tr considrs dans leur dfinition fournie par la licence GPL. b. Un travail driv est un travail driv, dans le cadre de la loi sur les droits d'auteurs. 4. Domaine d'application Cette exception FLOSS s'applique tous les Programmes qui contiennent une note place par MySQL AB, qui indique que le Programme peut tre distribu sous les termes de cette exception FLOSS. Si vous crez ou distribuez un travail qui est un travaill driv du Programme ou d'un autre projet plac sous licence GPL, alors cette exception FLOSS n'est pas disponible pour ce travail; par consquent, vous devez supprimer la note d'exception FLOSS de ce travail, et vous conformer toutes les conditions de la licence GPL. Vous pouvez dcider de distribuer une copie du Programme uniquement sous les conditions de la licence GPL, en supprimant l'exception FLOSS de cette copie du Programme, tant que cette copie n'a pas t modifie, par vous-mme ou une tierce partie.
1380
Index
Symboles
! (logical NOT), 536 != (not equal), 533 ", 473 % (modulo), 553 % (wildcard character), 470 & (bitwise AND), 578 && (logical AND), 536 () (parentheses), 532 (Control-Z) \z, 470 * (multiplication), 550 + (addition), 549 - (subtraction), 549 - (unary minus), 550 --password option, 288 --with-raid link errors, 96 -p option, 288 .my.cnf file, 77, 195, 197, 266, 273, 288, 333 .mysql_history file, 438 .pid (process ID) file, 311 / (division), 550 /etc/passwd, 258, 613 < (less than), 534 <<, 185 << (left shift), 578 <= (less than or equal), 533 <=> (equal to), 533 <> (not equal), 533 = (equal), 533 > (greater than), 534 >= (greater than or equal), 534 >> (right shift), 578 \" (double quote), 470 \' (single quote), 470 \0 (ASCII 0), 470 \b (backspace), 470 \n (linefeed), 470 \n (newline), 470 \r (carriage return), 470 \t (tab), 470 \z (Control-Z) ASCII(26), 470 \\ (escape), 470 ^ (bitwise XOR), 578 _ (wildcard character), 470 `, 473 | (bitwise OR), 578 || (logical OR), 537 ~, 579
A
aborted clients, 1112 aborted connection, 1112 ABS(), 550 access control, 266 access denied errors, 1107
access privileges, 259 Access program, 1022 account privileges adding, 282 accounts anonymous user, 113 root, 113 ACID, 28, 720 ACLs, 259 ACOS(), 551 ActiveState Perl, 154 ADDDATE(), 556 adding character sets, 317 native functions, 1102 new account privileges, 282 new functions, 1094 new user privileges, 282 new users, 86, 89 procedures, 1104 user-definable functions, 1095 addition (+), 549 ADDTIME(), 556 administration server, 443 ADO program, 1024 AES_DECRYPT(), 579 AES_ENCRYPT(), 579 age calculating, 171 alias, 1127 alias names case sensitivity, 474 aliases for expressions, 593 for tables, 612 in GROUP BY clauses, 593 in ORDER BY clauses, 593 names, 472 on expressions, 611 ALLOW_INVALID_DATES SQL mode, 221 ALTER COLUMN, 630 ALTER DATABASE, 628 ALTER FUNCTION, 870 ALTER PROCEDURE, 870 ALTER TABLE, 628, 630, 1131 ALTER VIEW, 881 ANALYZE TABLE, 658 AND bitwise, 578 logical, 536 anonymous user, 113, 113, 267, 270 ANSI mode running, 24 ANSI SQL differences from, 657 ANSI SQL mode, 221, 224 ANSI_QUOTES SQL mode, 222
1381
answering questions etiquette, 22 Apache, 190 API's list of, 1143 APIs, 909 Perl, 991 approximate-value literals, 899 ARCHIVE storage engine, 716 ARCHIVE table type, 716 Area(), 858, 859 argument processing, 1099 arithmetic expressions, 549 arithmetic functions, 578 AS, 611, 615 AsBinary(), 854 ASCII(), 539 ASIN(), 551 AsText(), 854 ATAN(), 551 ATAN2(), 551 attackers security against, 256 AUTO-INCREMENT ODBC, 1034 AUTO_INCREMENT, 186 and NULL values, 1127 AVG(), 588
B
backing up databases, 455, 460 backslash escape character, 469 backspace (\b), 470 BACKUP TABLE, 659 backups, 295 database, 659 batch mysql option, 435 batch mode, 180 BDB storage engine, 695, 708 BDB table type, 695, 708 BDB tables, 28 BdMPolyFromText(), 849 BdMPolyFromWKB(), 850 BdPolyFromText(), 849 BdPolyFromWKB(), 850 BEGIN, 647, 871 benchmark suite, 372 BENCHMARK(), 582 benchmarks, 374 BerkeleyDB storage engine, 695, 708 BerkeleyDB table type, 695, 708 BETWEEN ... AND, 534 Big5 Chinese character encoding, 1124 BIGINT, 510 BIN(), 539
BINARY data type, 524 binary distributions, 49 installing, 83 on Linux, 130 binary log, 323 BIT, 510 bit functions, 578 BitKeeper tree, 92 BIT_AND(), 588 BIT_COUNT, 185 BIT_COUNT(), 579 bit_functions example, 185 BIT_LENGTH(), 539 BIT_OR, 185 BIT_OR(), 588 BIT_XOR(), 588 BLOB, 514, 524 inserting binary data, 471 size, 528 BLOB columns default values, 525 indexing, 406, 638 blocking_queries mysqlcc option, 450 BOOL, 510 BOOLEAN, 510 Borland Builder 4 program, 1024 Borland C++ compiler, 992 Boundary(), 855 brackets square, 509 buffer sizes client, 909 Buffer(), 860 bug reports criteria for, 20 bugs known, 34 reporting, 18 bugs database, 18 bugs.mysql.com, 18 building client programs, 985
C
C API datatypes, 911 functions, 914 linking problems, 985 C Prepared statements API functions, 958 C++ APIs, 992 C++ Builder, 1026 C++ compiler gcc, 90 C++ compiler cannot create executables, 95 C:\my.cnf file, 333
1382
CACHE INDEX, 680 caches clearing, 680 calculating dates, 171 CALL, 871 calling sequences for aggregate functions UDF, 1098 calling sequences for simple functions UDF, 1097 can't create/write to file, 1114 carriage return (\r), 470 CASE, 539, 875 case sensitivity in identifiers, 474 in names, 474 in string comparisons, 548 case-sensitivity in access checking, 262 in searches, 1124 of database names, 25 of table names, 25 CAST, 576 casts, 532 CC environment variable, 90, 90, 96, 1367 cc1plus problems, 95 CCX environment variable, 1367 CEILING(), 551 Centroid(), 859 CFLAGS environment variable, 90, 96, 1367 CHANGE MASTER TO, 685 ChangeLog, 1155 changes log, 1155 version 3.19, 1327 version 3.20, 1320 version 3.21, 1307 version 3.22, 1295 version 3.23, 1253 version 4.0, 1208 version 4.1, 1174 version 5.0, 1156 changes to privileges, 272 changing column, 630 column order, 1131 database, 628 field, 630 table, 628, 630, 1131 changing socket location, 90, 110, 1124 CHAR, 513 CHAR data type, 523 CHAR VARYING, 514 CHAR(), 540 CHARACTER, 513 character sets, 91, 316 adding, 317 Character sets, 485
CHARACTER VARYING, 514 character-sets-dir mysql option, 435 characters multi-byte, 320 CHARACTER_LENGTH(), 540 CHARACTER_SETS INFORMATION_SCHEMA table, 891 CHARSET(), 582 CHAR_LENGTH(), 540 check options myisamchk, 303 CHECK TABLE, 659 checking tables for errors, 308 checksum errors, 138 CHECKSUM TABLE, 661 Chinese, 1124 choosing a MySQL version, 45 choosing types, 529 clearing caches, 680 clefs, 405 multi-colonnes, 406 client programs building, 985 client tools, 909 clients de MySQL, 372 debugging, 1361 threaded, 986 CLOSE, 874 closing tables, 413 COALESCE(), 535 COERCIBILITY(), 582 ColdFusion program, 1024 collating strings, 319 COLLATION(), 583 COLLATIONS INFORMATION_SCHEMA table, 891 COLLATION_CHARACTER_SET_APPLICABILITY INFORMATION_SCHEMA table, 892 colonnes index, 405 column changing, 630 column comments, 637 column names case sensitivity, 474 columns changing, 1131 displaying, 464 names, 472 other types, 529 selecting, 169
1383
storage requirements, 528 types, 509 COLUMNS INFORMATION_SCHEMA table, 887 COLUMN_PRIVILEGES INFORMATION_SCHEMA table, 890 command syntax, 4 command-line history mysql, 438 command-line options, 211 mysql, 435 mysqladmin, 446 mysqlcc, 450 command-line tool, 434 commands for binary distribution, 84 replication masters, 683 replication slaves, 685 commands out of sync, 1114 Comment syntax, 479 comments adding, 479 starting, 32 COMMIT, 28, 647 comparison operators, 532 compatibility between MySQL versions, 117, 117, 120, 124, 125 with mSQL, 549 with ODBC, 474, 511, 532, 534, 616, 636, 1314 with Oracle, 26, 590, 647 with PostgreSQL, 27 with standard SQL, 23 with Sybase, 647 compilation optimisation, 415 compiler C++ gcc, 90 compiling on Windows, 102 problems, 95 speed, 418 statically, 90 user-defined functions, 1101 compliance Y2K, 10 compress mysql option, 435 mysqlcc option, 450 COMPRESS(), 540 compressed tables, 429, 701 CONCAT(), 540 CONCAT_WS(), 540 concurrent inserts, 402 Conditions, 872 config-file mysqld_multi option, 209 config.cache, 95 config.cache file, 95
configuration files, 273 configuration options, 89 configure running after prior invocation, 95 configure option --with-charset, 91 --with-collation, 91 --with-extra-charsets, 91 --with-low-memory, 95 configure script, 89 connecting remotely with SSH, 294 to the server, 159, 265 verification, 266 connection aborted, 1112 CONNECTION_ID(), 583 connection_name mysqlcc option, 451 Connector/J, 1053 Connector/JDBC, 995 Connector/ODBC, 995, 995 Connectors MySQL, 995 connect_timeout variable, 438, 447, 452 constant table, 376, 384 constraints, 33 CONSTRAINTS INFORMATION_SCHEMA table, 892 Contains(), 862 contributing companies list of, 1144 contributors list of, 1137 control access, 266 control flow functions, 537 CONV(), 541 conventions typographical, 3 CONVERT, 576 CONVERT TO, 631 ConvexHull(), 860 copying databases, 127 copying tables, 642 COS(), 551 COT(), 551 COUNT(), 588 COUNT(DISTINCT), 589 counting table rows, 176 crash, 1356 recovery, 307 repeated, 1120 crash-me, 374 crash-me program, 371, 372 CRC32(), 552 CREATE DATABASE, 632 CREATE FUNCTION, 868, 1095
1384
CREATE INDEX, 633 CREATE PROCEDURE, 868 CREATE TABLE, 634 CREATE USER, 651 CREATE VIEW, 881 creating bug reports, 18 databases, 163 default startup options, 194 tables, 164 creating user accounts, 651 CROSS JOIN, 615 Crosses(), 862 CSV storage engine, 716 CSV table type, 716 CURDATE(), 556 CURRENT_DATE, 556 CURRENT_TIME, 556 CURRENT_TIMESTAMP, 556 CURRENT_USER(), 583 Cursors, 873 CURTIME(), 556 customer support mailing address, 22 CVS tree, 92 CXX environment variable, 90, 90, 95, 96, 96 CXXFLAGS environment variable, 90, 96, 1367
D
data character sets, 316 importing, 462 loading into tables, 166 retrieving, 167 size, 405 data type BINARY, 524 CHAR, 523 DECIMAL, 899 VARBINARY, 524 VARCHAR, 523 data types, 509 database changing, 628 deleting, 644 mysql option, 435 mysqlcc option, 451 database design, 404 Database information obtaining, 667 database metadata, 883 database names case sensitivity, 474 case-sensitivity, 25 DATABASE(), 583 databases backups, 295 copying, 127
creating, 163 defined, 4 displaying, 464 dumping, 455, 460 information about, 179 names, 472 replicating, 339 selecting, 164 symbolic links, 422 using, 163 DataJunction, 1025 datatypes C API, 911 DATE, 512, 517, 1125 date and time functions, 555 Date and Time types, 516 date calculations, 170 DATE columns problems, 1125 date functions Y2K compliance, 10 date types, 528 Y2K issues, 522 date values problems, 519 DATE(), 557 DATEDIFF(), 557 DATETIME, 512, 517 DATE_ADD(), 557 DATE_FORMAT(), 559 DATE_SUB(), 557 DAY(), 560 DAYNAME(), 560 DAYOFMONTH(), 560 DAYOFWEEK(), 560 DAYOFYEAR(), 560 db table sorting, 270 DB2 SQL mode, 224 DBI interface, 992 DBI->quote, 471 DBI->trace, 1359 DBI/DBD interface, 992 DBI_TRACE environment variable, 1359, 1367 DBI_USER environment variable, 1367 DBUG package, 1361 DEALLOCATE PREPARE, 692 debug mysql option, 435 debug-info mysql option, 435 debugging client, 1361 server, 1356 DEC, 512 DECIMAL, 511 decimal arithmetic, 899 DECIMAL data type, 899
1385
decimal point, 509 DECLARE, 871 DECODE(), 579 decode_bits myisamchk variable, 302 default privileges, 113 default hostname, 265 default installation location, 57 default options, 194 default values, 637 BLOB and TEXT columns, 525 suppression, 33 default-character-set mysql option, 435 defaults embedded, 988 DEGREES(), 552 DELAYED, 602 delayed_insert_limit, 603 DELETE, 595 deleting database, 644 foreign key, 631, 733 function, 1095 index, 630, 645 primary key, 630 rows, 1128 table, 645 user, 285, 652 users, 285, 652 deletion mysql.sock, 1124 Delphi program, 1026 derived tables, 622 DESC, 646 DESCRIBE, 179, 646 design choices, 404 issues, 34 limitations, 370 DES_DECRYPT(), 580 DES_ENCRYPT(), 580 developers list of, 1133 development source tree, 92 Difference(), 860 digits, 509 Dimension(), 854 directory structure default, 57 DISCARD TABLESPACE, 631, 736 disconnecting from the server, 159 Disjoint(), 862 disk full, 1122 disk issues, 421 disks splitting data across, 424
display size, 509 displaying database information, 464 information SHOW, 668, 671, 677 table status, 676 Distance(), 863 DISTINCT, 169, 391, 589 DIV, 550 division (/), 550 DNS, 421 DO, 597 Documenters list of, 1141 DOUBLE, 511 DOUBLE PRECISION, 511 double quote (\"), 470 downgrading, 116, 128 downloading, 54 DROP DATABASE, 644 DROP FOREIGN KEY, 631, 733 DROP FUNCTION, 870, 1095 DROP INDEX, 630, 645 DROP PRIMARY KEY, 630 DROP PROCEDURE, 870 DROP TABLE, 645 DROP USER, 651 DROP VIEW, 882 dropping user, 285, 652 DUMPFILE, 614 dumping databases, 455, 460 dynamic table characteristics, 701
E
e-mail lists, 15 Eiffel Wrapper, 993 ELT(), 541 embedded MySQL server library, 987 ENCODE(), 580 ENCRYPT(), 581 encryption functions, 579 END, 871 EndPoint(), 856 entering queries, 160 ENUM, 514, 525 size, 529 Envelope(), 855 environment variable CC, 90, 90, 96 CFLAGS, 90, 96 CXX, 90, 90, 96 CXXFLAGS, 90, 96 HOME, 438 LD_RUN_PATH, 133 MYSQL_DEBUG, 428
1386
MYSQL_HISTFILE, 438 MYSQL_HOST, 266 MYSQL_PWD, 266, 428 MYSQL_TCP_PORT, 332, 333, 428 MYSQL_UNIX_PORT, 332, 333, 428 PATH, 85, 192 USER, 266 Environment variable CC, 1367 CCX, 1367 CFLAGS, 1367 CXX, 95 CXXFLAGS, 1367 DBI_TRACE, 1359, 1367 DBI_USER, 1367 HOME, 1367 LD_LIBRARY_PATH, 155 LD_RUN_PATH, 140, 155, 1367 MYSQL_DEBUG, 1361, 1367 MYSQL_HISTFILE, 1367 MYSQL_HOST, 1367 MYSQL_PS1, 1367 MYSQL_PWD, 1367 MYSQL_TCP_PORT, 1367 MYSQL_UNIX_PORT, 108, 1367 PATH, 1367 TMPDIR, 108, 1367 TZ, 1124, 1367 UMASK, 1118, 1367 UMASK_DIR, 1118, 1367 USER, 1367 Environment variables CXX, 96 environment variables, 197, 273, 428 list of, 1367 equal (=), 533 Equals(), 862 Errcode, 466 errno, 466 error mesaages can't find file, 1118 error messages displaying, 466 languages, 317 errors access denied, 1107 checking tables for, 308 common, 1105 directory checksum, 138 handling for UDFs, 1100 known, 34 linking, 1116 list of, 1107 reporting, 2, 15, 18 ERROR_FOR_DIVISION_BY_ZERO SQL mode, 222 escape (\\), 470 escape characters, 469 estimating
query performance, 382 exact-value literals, 899 example mysqld_multi option, 209 EXAMPLE storage engine, 713 EXAMPLE table type, 713 examples compressed tables, 430 myisamchk output, 312 queries, 181 Excel, 1025 execute mysql option, 435 EXECUTE, 692 EXP(), 552 EXPLAIN, 375 EXPORT_SET(), 541 expression aliases, 593, 611 expressions extended, 173 extensions to standard SQL, 23 EXTRACT(), 560 extracting dates, 171
F
FALSE, 471 fatal signal 11, 95 features of MySQL, 6 FEDERATED storage engine, 713 FEDERATED table type, 713 FETCH, 874 field changing, 630 FIELD(), 541 FILE, 543 files binary log, 323 config.cache, 95 error messages, 317 log, 89, 326 my.cnf, 351 not found message, 1118 permissions, 1118 query log, 322 repairing, 304 script, 180 size limits, 9 slow query log, 326 text, 462 tmp, 108 update log, 323 FIND_IN_SET(), 541 FIXED, 512 fixed-point arithmetic, 899 FLOAT, 511, 511 FLOAT(M
1387
D), 511 FLOAT(precision), 511, 511 floating-point number, 511 floats, 471 FLOOR(), 552 FLUSH, 680 flush tables, 445 force mysql option, 435 FORCE INDEX, 611, 616 FORCE KEY, 611, 616 foreign key constraint, 33 deleting, 631, 733 foreign keys, 30, 184, 631 FORMAT(), 586 Forums, 23 FOUND_ROWS(), 584 FreeBSD troubleshooting, 96 FROM, 611 FROM_DAYS(), 561 FROM_UNIXTIME(), 561 ft_max_word_len myisamchk variable, 302 ft_min_word_len myisamchk variable, 302 ft_stopword_file myisamchk variable, 302 full disk, 1122 full-text search, 569 FULLTEXT, 569 function deleting, 1095 functions, 531 arithmetic, 578 bit, 578 C API, 914 C Prepared statements API, 958 control flow, 537 date and time, 555 encryption, 579 GROUP BY, 588 grouping, 532 information, 582 mathematical, 550 miscellaneous, 586 native adding, 1103 new, 1094 string, 539 string comparison, 547 user-definable adding, 1095 user-defined, 1094 Functions user-defined, 1095 functions for SELECT and WHERE clauses, 531 Future development of MySQL CLuster, 822
gdb using, 1358 general information, 1 General Public License, 5 geographic feature, 840 GeomCollFromText(), 849 GeomCollFromWKB(), 850 geometry, 840 GEOMETRY, 847 GEOMETRYCOLLECTION, 847 GeometryCollection(), 851 GeometryCollectionFromText(), 849 GeometryCollectionFromWKB(), 850 GeometryFromText(), 848 GeometryFromWKB(), 849 GeometryN(), 859 GeometryType(), 854 GeomFromText(), 848, 853 GeomFromWKB(), 849, 853 geospatial feature, 840 getting MySQL, 54 GET_FORMAT(), 561 GET_LOCK(), 586 GIS, 839, 840 GLength(), 856, 857 global privileges, 652 goals of MySQL, 5 GPL General Public License, 1373 GNU General Public License, 1373 MySQL FLOSS License Exception, 1379 GRANT, 652 GRANT statemenet, 292 GRANT statement, 282 grant tables, 272 re-creating, 104 sorting, 269, 270 upgrading, 127 granting privileges, 652 GRANTS, 670 graphical tool, 450 greater than (>), 534 greater than or equal (>=), 534 GREATEST(), 535 GROUP BY, 393 aliases in, 593 extensions to standard SQL, 593, 612 GROUP BY functions, 588 grouping expressions, 532 GROUP_CONCAT(), 589 GUI tool, 450
H
HANDLER, 598 Handlers, 872 handling
G
gcc, 90
1388
errors, 1100 HEAP storage engine, 695, 706 HEAP table type, 695, 706 help mysql option, 435 mysqlcc option, 450 mysqld_multi option, 209 HEX(), 542 hexadecimal values, 471 hints, 25, 614, 616, 616, 616 history of MySQL, 5 history_size mysqlcc option, 451 HOME environment variable, 438, 1367 host mysql option, 435 mysqlcc option, 451 host table, 271 sorting, 270 host.frm problems finding, 105 hostname default, 265 HOUR(), 562 html mysql option, 435
I
ID unique, 984 identifiers, 472 case sensitivity, 474 quoting, 473 IF, 874 IF(), 538 IFNULL(), 537 IGNORE INDEX, 611, 616 IGNORE KEY, 611, 616 ignore-space mysql option, 436 IGNORE_SPACE SQL mode, 222 IMPORT TABLESPACE, 631, 736 importing data, 462 IN, 535 increasing performance, 364 speed, 339 index colonnes, 405 deleting, 630, 645 multi-colonnes, 406 index multi-colonnes, 406 indexes, 633 and BLOB columns, 406, 638 and IS NULL, 408 and LIKE, 408 and NULL values, 638
and TEXT columns, 406, 638 assigning to key cache, 680 block size, 233 leftmost prefix of, 408 multi-part, 633 names, 472 use of, 407 INET_ATON(), 586 INET_NTOA(), 587 information functions, 582 INFORMATION_SCHEMA, 883, 885 INNER JOIN, 615 InnoDB, 720 InnoDB storage engine, 695, 719 InnoDB table type, 695, 720 InnoDB tables, 28 INSERT, 396, 599 INSERT ... SELECT, 601 INSERT DELAYED, 602, 602 INSERT statement grant privileges, 283 INSERT(), 542 inserting speed of, 396 installation layouts, 57 installation overview, 86 installing binary distribution, 83 Linux RPM packages, 78 Mac OS X PKG packages, 80 overview, 42 Perl, 153 Perl on Windows, 154 source distribution, 86 user-defined functions, 1101 INSTR(), 542 INT, 510 INTEGER, 510 integer arithmetic, 899 integers, 471 InteriorRingN(), 858, 858 internal compiler errors, 95 internal locking, 401 internals, 1091 Internet Relay Chat, 22 Intersection(), 860 Intersects(), 862 INTERVAL(), 535 introducer string literal, 469, 492 IRC, 22 IS NOT NULL, 534 IS NULL, 390, 534 and indexes, 408 ISAM storage engine, 695, 716 ISAM table type, 695, 716 IsClosed(), 856, 858 IsEmpty(), 855
1389
ISNULL(), 535 ISOLATION LEVEL, 651 IsRing(), 857 IsSimple(), 855 IS_FREE_LOCK(), 587 IS_USED_LOCK(), 587 ITERATE, 875
J
Java connectivity, 1053 JDBC, 1053 JOIN, 615
K
Key cache MyISAM, 409 key cache assigning indexes to, 680 key space MyISAM, 700 keys foreign, 30, 184 searching on two, 185 keywords, 480 key_buffer_size myisamchk variable, 302 KEY_COLUMN_USAGE INFORMATION_SCHEMA table, 893 KILL, 682 known errors, 34
L
language support, 317 last row unique ID, 984 LAST_DAY(), 562 LAST_INSERT_ID(), 30, 601 LAST_INSERT_ID([expr]), 584 layout of installation, 57 LCASE(), 542 LD_LIBRARY_PATH environment variable, 155 LD_RUN_PATH environment variable, 133, 140, 155, 1367 LEAST(), 536 LEAVE, 875 LEFT JOIN, 391, 615 LEFT OUTER JOIN, 615 LEFT(), 542 leftmost prefix of indexes, 408 legal names, 472 LENGTH(), 542 less than (<), 534 less than or equal (<=), 533 libmysqld, 987 libraries list of, 1142 library mysqlclient, 909
License, 1379 LIKE, 548 and indexes, 408 and wildcards, 408 LIMIT, 395, 584 limitations design, 370 replication, 351 limits file-size, 9 linefeed (\n), 470 LineFromText(), 848 LineFromWKB(), 849 LINESTRING, 847 LineString(), 851 LineStringFromText(), 848 LineStringFromWKB(), 849 linking, 985 errors, 1116 problems, 985 speed, 418 links symbolic, 422 Linux binary distribution, 130 source distribution, 132 literals, 469 LN(), 552 LOAD DATA FROM MASTER, 687 LOAD DATA INFILE, 604, 1126 LOAD TABLE FROM MASTER, 687 loading tables, 166 LOAD_FILE(), 543 local-infile mysql option, 436 mysqlcc option, 451 LOCALTIME, 562 LOCALTIMESTAMP, 562 LOCATE(), 543 LOCK TABLES, 649 locking page-level, 401 row-level, 30, 401 table-level, 401 locking methods, 401 log changes, 1155 mysqld_multi option, 209 log files, 89 maintaining, 326 names, 295 Log files, 321 LOG(), 552 LOG10(), 553 LOG2(), 553 Logical operators, 536 LONG, 524
1390
LONGBLOB, 514 LONGTEXT, 514 LOOP, 875 LOWER(), 543 LPAD(), 543 LTRIM(), 543
M
Mac OS X installation, 80 mailing address for customer support, 22 mailing list address, 2 mailing lists, 15 archive location, 18 guidelines, 22 main features of MySQL, 6 maintaining log files, 326 tables, 311 MAKEDATE(), 562 MAKETIME(), 563 make_binary_distribution, 203 MAKE_SET(), 544 manual available formats, 2 online location, 2 typographical conventions, 3 master-slave setup, 340 MASTER_POS_WAIT(), 587, 688 MATCH ... AGAINST(), 569 matching patterns, 173 math, 899 mathematical functions, 550 MAX(), 590 MAXDB SQL mode, 224 maximum memory used, 446 max_allowed_packet variable, 438, 452 max_join_size variable, 438, 452 MBR, 860 MBRContains(), 860 MBRDisjoint(), 861 MBREquals(), 861 MBRIntersects(), 861 MBROverlaps(), 861 MBRTouches(), 861 MBRWithin(), 861 MD5(), 581 MEDIUMBLOB, 514 MEDIUMINT, 510 MEDIUMTEXT, 514 MEMORY storage engine, 695, 706 MEMORY table type, 695, 706 memory usage myisamchk, 306 memory use, 419, 446 MERGE storage engine, 695, 703
MERGE table type, 695, 704 MERGE tables defined, 704 messages languages, 317 metadata database, 883 methods locking, 401 MICROSECOND(), 563 MID(), 544 MIN(), 590 Minimum Bounding Rectangle, 860 minus unary (-), 550 MINUTE(), 563 mirror sites, 54 miscellaneous functions, 586 Mise en cache des noms d'hte, 421 MIT-pthreads, 98 MLineFromText(), 849 MLineFromWKB(), 850 MOD (modulo), 553 MOD(), 553 modes batch, 180 modules list of, 8 modulo (%), 553 modulo (MOD), 553 monitor terminal, 159 MONTH(), 563 MONTHNAME(), 563 MPointFromText(), 848 MPointFromWKB(), 850 MPolyFromText(), 849 MPolyFromWKB(), 850 mSQL compatibility, 549 msql2mysql, 909 MSSQL SQL mode, 224 multi mysqld, 208 multi-byte character sets, 1115 multi-byte characters, 320 multi-part index, 633 MULTILINESTRING, 847 MultiLineString(), 851 MultiLineStringFromText(), 849 MultiLineStringFromWKB(), 850 multiple servers, 327 multiplication (*), 550 MULTIPOINT, 847 MultiPoint(), 850 MultiPointFromText(), 848 MultiPointFromWKB(), 850 MULTIPOLYGON, 847 MultiPolygon(), 851 MultiPolygonFromText(), 849
1391
MultiPolygonFromWKB(), 850 My derivation, 5 my.cnf file, 351 MyISAM compressed tables, 429, 701 size, 529 MyISAM key cache, 409 MyISAM storage engine, 695, 697 MyISAM table type, 695, 697 myisamchk, 92, 203 example output, 312 options, 301 myisampack, 427, 429, 644, 701 myisam_block_size myisamchk variable, 302 MyODBC, 995 reporting problems, 997 MySQL defined, 4 introduction, 4 pronunciation, 5 mysql, 427, 434 MySQL binary distribution, 45 MYSQL C type, 911 MySQL C type, 956 MySQL Cluster in MySQL 5.0 and 5.1, 822 mysql command-line options, 435 mysql commands list of, 439 MySQL Dolphin name, 5 MySQL history, 5 mysql history file, 438 MySQL mailing lists, 15 MySQL name, 5 mysql prompt command, 440 MySQL source distribution, 45 MySQL storage engines, 695 MySQL table types, 695 MySQL version, 54 MySQL++, 992 mysql.server, 202 mysql.sock changing location of, 90 protection, 1124 MYSQL323 SQL mode, 224 MYSQL40 SQL mode, 224 mysqlaccess, 427 mysqladmin, 427, 443, 633, 645, 675, 677, 680, 682 mysqld_multi option, 209 mysqladmin command-line options, 446 mysqlbinlog, 427, 447 mysqlbug, 203 mysqlbug script, 18 location, 2 mysqlcc, 428, 450 mysqlcc command-line options, 450 mysqlcheck, 428 mysqlclient library, 909
mysqld, 202 mysqld_multi option, 209 starting, 1117 mysqld options, 211 mysqld-max, 202, 203 mysqldump, 128, 428, 455 mysqld_multi, 203, 208 mysqld_safe, 202, 205 mysqlhotcopy, 428 mysqlimport, 128, 428, 462, 604 mysqlshow, 428 mysqltest MySQL Test Suite, 1092 mysql_affected_rows(), 918 mysql_autocommit()., 953 MYSQL_BIND C type, 956 mysql_change_user(), 919 mysql_character_set_name(), 920 mysql_close(), 920 mysql_commit()., 953 mysql_config, 909 mysql_connect(), 920 mysql_create_db(), 921 mysql_data_seek(), 921 MYSQL_DEBUG environment variable, 428, 1361, 1367 mysql_debug(), 922 mysql_drop_db(), 922 mysql_dump_debug_info(), 923 mysql_eof(), 923 mysql_errno(), 924 mysql_error(), 925 mysql_escape_string(), 925 mysql_fetch_field(), 925 mysql_fetch_fields(), 926 mysql_fetch_field_direct(), 926 mysql_fetch_lengths(), 927 mysql_fetch_row(), 927 MYSQL_FIELD C type, 912 mysql_field_count(), 928, 938 MYSQL_FIELD_OFFSET C type, 912 mysql_field_seek(), 929 mysql_field_tell(), 929 mysql_fix_privilege_tables, 203, 273 mysql_free_result(), 930 mysql_get_client_info(), 930 mysql_get_client_version(), 930 mysql_get_host_info(), 931 mysql_get_proto_info(), 931 mysql_get_server_info(), 931 mysql_get_server_version(), 931 mysql_hex_string(), 932 MYSQL_HISTFILE environment variable, 438, 1367 MYSQL_HOST environment variable, 266, 1367 mysql_info(), 601, 609, 627, 632, 933 mysql_init(), 933 mysql_insert_id(), 30, 601, 934 mysql_install_db, 203
1392
mysql_install_db script, 107 mysql_kill(), 934 mysql_library_end(), 935 mysql_library_init(), 935 mysql_list_dbs(), 935 mysql_list_fields(), 936 mysql_list_processes(), 936 mysql_list_tables(), 937 mysql_more_results()., 954 mysql_next_result()., 954 mysql_num_fields(), 938 mysql_num_rows(), 939 mysql_options(), 939 mysql_ping(), 941 MYSQL_PS1 environment variable, 1367 MYSQL_PWD environment variable, 266, 428, 1367 mysql_query(), 942, 984 mysql_real_connect(), 942 mysql_real_escape_string(), 471, 945 mysql_real_query(), 946 mysql_reload(), 946 MYSQL_RES C type, 912 mysql_rollback()., 953 MYSQL_ROW C type, 912 mysql_row_seek(), 947 mysql_row_tell(), 947 mysql_select_db(), 947 mysql_server_end(), 983 mysql_server_init(), 983 mysql_set_sever_option(), 948 mysql_shutdown(), 948 mysql_sqlstate(), 949 mysql_ssl_set(), 949 mysql_stat(), 950 MYSQL_STMT C type, 955 mysql_stmt_affected_rows(), 960 mysql_stmt_attr_get(), 961 mysql_stmt_attr_set(), 961 mysql_stmt_bind_param(), 962 mysql_stmt_bind_result(), 962 mysql_stmt_close(), 963 mysql_stmt_data_seek(), 964 mysql_stmt_errno(), 964 mysql_stmt_error()., 964 mysql_stmt_execute(), 965 mysql_stmt_fetch(), 968 mysql_stmt_fetch_column(), 972 mysql_stmt_field_count(), 972 mysql_stmt_free_result(), 968 mysql_stmt_init(), 973 mysql_stmt_insert_id(), 968 mysql_stmt_num_rows(), 973 mysql_stmt_param_count(), 973 mysql_stmt_param_metadata(), 974 mysql_stmt_prepare(), 974 mysql_stmt_reset(), 975 mysql_stmt_result_metadata., 975 mysql_stmt_row_seek(), 976
mysql_stmt_row_tell(), 977 mysql_stmt_send_long_data()., 977 mysql_stmt_sqlstate(), 979 mysql_stmt_store_result(), 979 mysql_store_result(), 950, 984 MYSQL_TCP_PORT environment variable, 332, 333, 428, 1367 mysql_thread_end(), 982 mysql_thread_id(), 951 mysql_thread_init(), 982 mysql_thread_safe(), 982 MYSQL_UNIX_PORT environment variable, 108, 332, 333, 428, 1367 mysql_use_result(), 952 mysql_warning_count()., 953 my_init(), 981 my_ulonglong C type, 912 my_ulonglong values printing, 912
N
named pipes, 69, 73 named-commands mysql option, 436 names, 472 case sensitivity, 474 variables, 476 naming releases of MySQL, 45 NATIONAL CHAR, 513 native functions adding, 1103 native thread support, 43 NATURAL LEFT JOIN, 615 NATURAL LEFT OUTER JOIN, 615 NATURAL RIGHT JOIN, 615 NATURAL RIGHT OUTER JOIN, 615 NCHAR, 513 negative values, 471 nested queries, 618 nested query, 618 nesting queries, 618 net etiquette, 18, 22 netmask notation in mysql.user table, 267 NetWare, 82 net_buffer_length variable, 438, 452 New features in MySQL Cluster, 822 new procedures adding, 1104 new users adding, 86, 89 newline (\n), 470 no matching rows, 1128 no-auto-rehash mysql option, 436 no-beep mysql option, 436
1393
no-log mysqld_multi option, 209 no-named-commands mysql option, 436 no-pager mysql option, 436 no-tee mysql option, 436 non-delimited strings, 518 Non-transactional tables, 1127 NOT logical, 536 NOT BETWEEN, 534 not equal (!=), 533 not equal (<>), 533 NOT IN, 535 NOT LIKE, 549 NOT NULL constraint, 33 NOT REGEXP, 549 Novell NetWare, 82 NOW(), 563 NO_AUTO_VALUE_ON_ZERO SQL mode, 222 NO_DIR_IN_CREATE SQL mode, 222 NO_FIELD_OPTIONS SQL mode, 222 NO_KEY_OPTIONS SQL mode, 222 NO_TABLE_OPTIONS SQL mode, 223 NO_UNSIGNED_SUBTRACTION SQL mode, 223 NO_ZERO_DATE SQL mode, 223 NO_ZERO_IN_DATE SQL mode, 223 NUL, 470 NULL, 173, 1126 testing for null, 533, 534, 535, 537 NULL value, 173, 472 NULL values and AUTO_INCREMENT columns, 1127 and indexes, 638 and TIMESTAMP columns, 1127 vs. empty values, 1126 NULLIF(), 538 numbers, 471 NUMERIC, 512 numeric types, 528 NumGeometries(), 859 NumInteriorRings(), 858 NumPoints(), 857
O
OCT(), 544 OCTET_LENGTH(), 544 ODBC, 995 ODBC compatibility, 474, 511, 532, 534, 616, 636, 1314 odbcadmin program, 1026 OLAP, 590 OLD_PASSWORD(), 581 one-database mysql option, 436
online location of manual, 2 ONLY_FULL_GROUP_BY SQL mode, 223 OPEN, 874 Open Source defined, 5 open tables, 413, 446 OpenGIS, 840 opening tables, 413 opens, 445 OpenSSL, 288 open_files_limit variable, 449 operating systems file-size limits, 9 supported, 42 Windows versus Unix, 75 operations arithmetic, 549 operators, 531 cast, 549 Operators logical, 536 optimisation tips, 398 optimisation du systme, 415 optimisations, 383 optimising DISTINCT, 391 LEFT JOIN, 391 LIMIT, 395 tables, 310 optimizations, 388 OPTIMIZE TABLE, 661 optimizer controlling, 418 optimizing GROUP BY, 393 option files, 194, 273 options command-line, 211 mysql, 435 mysqladmin, 446 mysqlcc, 450 configure, 89 myisamchk, 301 provided by MySQL, 159 replication, 351 options de mysqld, 415 OR, 388 bitwise, 578 logical, 537 OR Index Merge optimization, 388 Oracle compatibility, 26, 590, 647 ORACLE SQL mode, 224 ORD(), 544 ORDER BY, 170, 612, 630 aliases in, 593 Overlaps(), 862
1394
overview, 1
P
packages list of, 1143 pack_isam, 429 page-level locking, 401 pager mysql option, 436 paramtres serveur, 415 paramtres de dmarrage, 415 rglages, 415 parentheses ( and ), 532 password mysql option, 436 mysqlcc option, 451 mysqld_multi option, 209 root user, 113 password encryption reversibility of, 581 PASSWORD(), 267, 286, 581, 1115 passwords for users, 281 forgotten, 1119 lost, 1119 resetting, 1119 security, 259 setting, 286, 655, 658 PATH environment variable, 85, 192, 1367 pattern matching, 173 performance benchmarks, 374 disk issues, 421 estimating, 382 improving, 364, 405 PERIOD_ADD(), 563 PERIOD_DIFF(), 563 Perl installing, 153 installing on Windows, 154 Perl API, 992 Perl DBI/DBD installation problems, 155 permission checks effect on speed, 374 perror, 428, 466 PHP API, 991 PI(), 553 PIPES_AS_CONCAT SQL mode, 223 plugins_path mysqlcc option, 451 POINT, 847 Point(), 850 PointFromText(), 848 PointFromWKB(), 849 PointN(), 857 PointOnSurface(), 859
PolyFromText(), 848 PolyFromWKB(), 849 POLYGON, 847 Polygon(), 851 PolygonFromText(), 848 PolygonFromWKB(), 849 port mysql option, 437 mysqlcc option, 451 portability, 370 types, 529 porting to other systems, 1355 POSITION(), 544 post-install multiple servers, 327 post-installation setup and testing, 102 PostgreSQL compatibility, 27 POSTGRESQL SQL mode, 224 POW(), 553 POWER(), 553 precision arithmetic, 899 precision math, 899 PREPARE, 692 PRIMARY KEY, 630, 637 constraint, 33 primary key deleting, 630 privilege changes, 272 privilege information location, 263 privilege system, 259 described, 260 privileges access, 259 adding, 282 default, 113 deleting, 285, 652 display, 670 dropping, 285, 652 granting, 652 revoking, 652 problems access denied errors, 1107 common errors, 1105 compiling, 95 DATE columns, 1125 date values, 519 installing on IBM-AIX, 146 installing on Solaris, 138 installing Perl, 155 linking, 1116 ODBC, 997 reporting, 18 starting the server, 111
1395
table locking, 403 timezone, 1124 procedures adding, 1104 stored, 30, 867 process support, 43 processes display, 673 processing arguments, 1099 PROCESSLIST, 673 program variables setting, 198 programs client, 985 crash-me, 371 list of, 202 prompt mysql option, 437 prompts meanings, 162 pronunciation MySQL, 5 protocol mysql option, 437 Protocol mismatch, 126 PURGE MASTER LOGS, 683 Python APIs, 992
Q
QUARTER(), 564 queries entering, 160 estimating performance, 382 examples, 181 speed of, 374 Twin Studeis project, 187 query mysqlcc option, 451 Query Cache, 333 query log, 322 questions, 445 answering, 22 quick mysql option, 437 QUOTE(), 544 quotes in strings, 470 quoting, 471 quoting binary data, 471 quoting of identifiers, 473
R
RADIANS(), 553 RAID compile errors, 96 table type, 641
RAND(), 553 raw mysql option, 437 re-creating grant tables, 104 read_buffer_size myisamchk variable, 302 REAL, 511 REAL_AS_FLOAT SQL mode, 223 reconfiguring, 95, 95 reconnect mysql option, 437 recovery from crash, 307 reducing data size, 405 references, 631 ref_or_null, 390 regex, 1369 REGEXP, 549 register mysqlcc option, 451 regular expression syntax described, 1369 Related(), 863 relational databases defined, 5 release numbers, 45 releases naming scheme, 45 testing, 46 updating, 47 RELEASE_LOCK(), 587 RENAME TABLE, 645 RENAME USER, 658 renaming user accounts, 658 reordering columns, 1131 repair options myisamchk, 304 REPAIR TABLE, 662 repairing tables, 308 REPEAT, 876 REPEAT(), 545 replace, 428 REPLACE, 610 REPLACE ... SELECT, 601 replace utility, 466 REPLACE(), 545 replication, 339 replication limitations, 351 replication masters commands, 683 replication options, 351 replication slaves commands, 685 reporting bugs, 18
1396
errors, 2, 15 MyODBC problems, 997 REQUIRE GRANT option, 292, 656 reserved words exceptions, 480 RESET MASTER, 684 RESET SLAVE, 688 restarting the server, 106 RESTORE TABLE, 663 retrieving data from tables, 167 return (\r), 470 return values UDFs, 1100 REVERSE(), 545 REVOKE, 652 revoking privileges, 652 RIGHT JOIN, 615 RIGHT OUTER JOIN, 615 RIGHT(), 545 RLIKE, 549 ROLLBACK, 28, 647 ROLLBACK TO SAVEPOINT, 648 ROLLUP, 590 root password, 113 root user password resetting, 1119 ROUND(), 554 rounding, 899 rounding errors, 510, 555 ROUTINES INFORMATION_SCHEMA table, 893 row-level locking, 401 rows counting, 176 deleting, 1128 locking, 30 matching problems, 1128 selecting, 168 sorting, 170 RPAD(), 545 RPM file, 78 RPM Package Manager, 78 RTRIM(), 545 RTS-threads, 1363 running ANSI mode, 24 batch mode, 180 multiple servers, 327 queries, 160 running configure after prior invocation, 95
S
safe-updates mysql option, 437 safe-updates option, 442
safe_mysqld, 205 Sakila, 5 SAVEPOINT, 648 scale arithmetic, 899 SCHEMATA INFORMATION_SCHEMA table, 885 SCHEMA_PRIVILEGES INFORMATION_SCHEMA table, 889 script files, 180 scripts, 205, 208 mysqlbug, 18 mysql_install_db, 107 SQL, 434 searching and case-sensitivity, 1124 full-text, 569 MySQL web pages, 18 two keys, 185 SECOND(), 564 security against attackers, 256 security system, 259 SEC_TO_TIME(), 564 SELECT, 610 optimizing, 375 Query Cache, 333 SELECT INTO, 872 SELECT INTO TABLE, 28 SELECT speed, 383 selecting databases, 164 select_limit variable, 438, 452 SEQUENCE, 186 sequence emulation, 585 sequences, 186 server connecting, 159, 265 debugging, 1356 disconnecting, 159 mysqlcc option, 451 restart, 106 shutdown, 106 starting, 104 starting and stopping, 108 starting problems, 111 server administration, 443 server variables, 225, 476, 677 servers multiple, 327 serveur mysqld taille des tampons, 415 SESSION_USER(), 585 SET, 514, 526, 663, 872 size, 529 SET GLOBAL SQL_SLAVE_SKIP_COUNTER, 688 SET OPTION, 663 SET PASSWORD, 658
1397
SET PASSWORD statement, 286 SET SQL_LOG_BIN, 684 SET TRANSACTION, 651 setting passwords, 286 setting passwords, 658 setting program variables, 198 setup post-installation, 102 SHA(), 582 SHA1(), 582 shell syntax, 4 SHOW BINLOG EVENTS, 667, 684 SHOW COLLATION, 668 SHOW COLUMNS, 667, 668 SHOW CREATE DATABASE, 667, 668 SHOW CREATE FUNCTION, 870 SHOW CREATE PROCEDURE, 870 SHOW CREATE TABLE, 667, 669 SHOW CREATE VIEW, 882 SHOW DATABASES, 667, 669 SHOW ENGINES, 667, 667, 669 SHOW ERRORS, 667, 670 SHOW extensions, 895 SHOW FIELDS, 667 SHOW FUNCTION STATUS, 871 SHOW GRANTS, 667, 670 SHOW INDEX, 667, 671 SHOW INNODB STATUS, 667 SHOW KEYS, 667, 671 SHOW MASTER LOGS, 667, 684 SHOW MASTER STATUS, 667, 685 SHOW PRIVILEGES, 667, 672 SHOW PROCEDURE STATUS, 871 SHOW PROCESSLIST, 667, 673 SHOW SCHEMAS, 669 SHOW SLAVE HOSTS, 667, 685 SHOW SLAVE STATUS, 667, 688 SHOW STATUS, 667 SHOW STORAGE ENGINES, 669 SHOW TABLE STATUS, 667 SHOW TABLE TYPES, 667, 669 SHOW TABLES, 667, 677 SHOW VARIABLES, 667 SHOW WARNINGS, 667, 678 SHOW with WHERE, 883, 896 showing database information, 464 shutdown_timeout variable, 447 shutting down the server, 106 SIGN(), 554 silent mysql option, 437 silent column changes, 643 SIN(), 555 single quote (\'), 470 size of tables, 9
sizes display, 509 skip-column-names mysql option, 437 skip-line-numbers mysql option, 437 slow queries, 445 slow query log, 326 SMALLINT, 510 socket mysql option, 437 mysqlcc option, 451 socket location changing, 90 Solaris installation problems, 138 Solaris troubleshooting, 96 sorting character sets, 316 data, 170 grant tables, 269, 270 table rows, 170 sort_buffer_size myisamchk variable, 302 sort_key_blocks myisamchk variable, 302 SOUNDEX(), 545 SOUNDS LIKE, 546 source distribution installing, 86 source distributions on Linux, 132 SPACE(), 546 Spatial Extensions in MySQL, 840 speed compiling, 418 increasing, 339 inserting, 396 linking, 418 of queries, 374, 383 SQL defined, 5 SQL commands replication masters, 683 replication slaves, 685 SQL scripts, 434 SQL-92 extensions to, 23 SQL_CACHE, 335 SQL_NO_CACHE, 335 sql_yacc.cc problems, 95 SQRT(), 555 square brackets, 509 SRID(), 855 SSH, 294 SSL and X509 Basics, 288 SSL command-line options, 293 SSL related options, 292, 656 stability, 8 standard SQL extensions to, 23
1398
standards compatibility, 23 START SLAVE, 691 START TRANSACTION, 647 starting comments, 32 mysqld, 1117 the server, 104 the server automatically, 108 Starting many servers, 327 StartPoint(), 857 startup options default, 194 startup parameters mysql, 435 mysqladmin, 446 mysqlcc, 450 statements GRANT, 282 INSERT, 283 statically compiling, 90 STATISTICS INFORMATION_SCHEMA table, 888 status tables, 676 status command, 439 results, 445 status variables, 246, 675 STD(), 590 STDDEV(), 590 STOP SLAVE, 692 stopping the server, 108 storage engines choosing, 695 storage of data, 404 storage requirements column type, 528 storage space minimising, 405 stored procedures, 867 stored procedures and triggers defined, 30 STRAIGHT_JOIN, 615 STRCMP(), 549 STRICT SQL mode, 221 STRICT_ALL_TABLES SQL mode, 223 STRICT_TRANS_TABLES SQL mode, 221, 223 string collating, 319 string comparison functions, 547 string comparisons case sensitivity, 548 string functions, 539 string literal introducer, 469, 492 string replacement replace utility, 466 string types, 523, 523 strings
defined, 469 escaping characters, 469 non-delimited, 518 striping defined, 421 STR_TO_DATE(), 564 SUBDATE(), 564 subqueries, 618 subquery, 618 subselects, 618 SUBSTRING(), 546 SUBSTRING_INDEX(), 546 SUBTIME(), 565 subtraction (-), 549 SUM(), 590 superuser, 113 support for operating systems, 43 mailing address, 22 suppression default values, 33 Sybase compatibility, 647 symbolic links, 422, 424 SymDifference(), 860 syntax mysqlcc option, 451 regular expression, 1369 syntax_file mysqlcc option, 451 SYSDATE(), 565 system privilege, 259 security, 254 system table, 376 system variables, 225, 476, 677 SYSTEM_USER(), 585
T
tab (\t), 470 table changing, 628, 630, 1131 deleting, 645 mysql option, 437 table aliases, 612 table cache, 413 table is full, 665, 1113 table names case sensitivity, 474 case-sensitivity, 25 Table scan, 395 table types choosing, 695 table-level locking, 401 tables ARCHIVE, 716 BDB, 708 Berkeley DB, 708 changing column order, 1131
1399
checking, 303 closing, 413 compressed, 429 compressed format, 701 constant, 376, 384 copying, 642 counting rows, 176 creating, 164 CSV, 716 defragment, 311, 701 defragmenting, 661 deleting rows, 1128 displaying, 464 displaying status, 676 dumping, 455, 460 dynamic, 701 error checking, 308 EXAMPLE, 713 FEDERATED, 713 flush, 445 fragmentation, 661 grant, 272 HEAP, 706 host, 271 improving performance, 405 information, 312 information about, 179 InnoDB, 720 ISAM, 716 loading data, 166 maintenance regimen, 311 maximum size, 9 MEMORY, 706 MERGE, 704 merging, 704 multiple, 177 MyISAM, 697 names, 472 open, 413 opening, 413 optimising, 310 partitioning, 704 RAID, 641 repairing, 308 retrieving data, 167 selecting columns, 169 selecting rows, 168 sorting rows, 170 symbolic links, 423 system, 376 too many, 415 unique ID for last row, 984 updating, 28 TABLES INFORMATION_SCHEMA table, 886 table_cache, 413 TABLE_PRIVILEGES INFORMATION_SCHEMA table, 890
taille des tampons serveur mysqld, 415 TAN(), 555 tar problems on Solaris, 138 Tcl APIs, 992 tcp-ip mysqld_multi option, 210 TCP/IP, 69, 73 technical support mailing address, 22 tee mysql option, 437 temporary file write access, 108 temporary tables problems, 1132 terminal monitor defined, 159 testing connection to the server, 266 installation, 104 of MySQL releases, 46 post-installation, 102 testing mysqld mysqltest, 1092 Texinfo, 2 TEXT, 514, 524 size, 528 TEXT columns default values, 525 indexing, 406, 638 text files importing, 462 thread packages differences between, 1364 thread support, 43 non-native, 98 threaded clients, 986 threads, 445, 673, 1091 display, 673 RTS, 1363 TIME, 512, 521 time types, 528 TIME(), 565 TIMEDIFF(), 565 timeout, 230, 586, 603 connect_timeout variable, 438, 447, 452 shutdown_timeout variable, 447 TIMESTAMP, 512, 517 and NULL values, 1127 TIMESTAMP(), 565 TIMESTAMPADD(), 565 TIMESTAMPDIFF(), 566 timezone problems, 1124 TIME_FORMAT(), 566 TIME_TO_SEC(), 566 TINYBLOB, 514
1400
TINYINT, 510 TINYTEXT, 514 tips optimisation, 398 TMPDIR environment variable, 108, 1367 TODO embedded server, 988 symlinks, 424 ToDo list for MySQL, 1145 tools command-line, 434 graphical, 450 GUI, 450 list of, 1144 mysqld_multi, 208 mysqld_safe, 205 safe_mysqld, 205 Touches(), 862 TO_DAYS(), 566 trace DBI method, 1359 TRADITIONAL SQL mode, 221, 224 transaction-safe tables, 28, 720 transactions support, 28, 720 translations_path mysqlcc option, 452 Translators list of, 1141 triggers, 877 stored, 30 TRIM(), 546 troubleshooting FreeBSD, 96 Solaris, 96 TRUE, 471 TRUNCATE, 626 TRUNCATE(), 555 tutorial, 159 Twin Studies queries, 187 type conversions, 532 types columns, 509, 529 data, 509 date, 528 Date and Time, 516 numeric, 528 of tables, 695 portability, 529 strings, 523, 523 time, 528 typographical conventions, 3 TZ environment variable, 1124, 1367
U
UCASE(), 546 UCS-2, 485 UDF functions, 1095
UDFs compiling, 1101 defined, 1094 return values, 1100 ulimit, 1116 UMASK environment variable, 1118, 1367 UMASK_DIR environment variable, 1118, 1367 unary minus (-), 550 unbuffered mysql option, 437 UNCOMPRESS(), 547 UNCOMPRESSED_LENGTH(), 547 UNHEX(), 547 Unicode, 485 UNION, 185, 617 Union(), 860 UNIQUE, 630 constraint, 33 unique ID, 984 UNIX_TIMESTAMP(), 566 unloading tables, 167 UNLOCK TABLES, 649 unnamed views, 622 UNTIL, 876 UPDATE, 627 update log, 323 updating releases of MySQL, 47 tables, 28 upgrading, 116 3.20 to 3.21, 126 3.21 to 3.22, 125 3.22 to 3.23, 124 3.23 to 4.0, 120 4.0 to 4.1, 117 different architecture, 127 grant tables, 127 to 5.0, 117 UPPER(), 547 uptime, 445 URLS for downloading MySQL, 54 USE, 647 USE INDEX, 611, 616 USE KEY, 611, 616 user mysql option, 438 mysqlcc option, 452 mysqld_multi option, 210 user accounts creating, 651 renaming, 658 USER environment variable, 266, 1367 user names and passwords, 281 user privileges adding, 282 deleting, 285, 652
1401
dropping, 285, 652 user table sorting, 269 user variables, 476 USER(), 585 user-defined functions adding, 1094, 1095 User-defined functions, 1095 users adding, 86, 89 deleting, 285, 652 root, 113 USER_PRIVILEGES INFORMATION_SCHEMA table, 889 using multiple disks to start data, 424 UTC_DATE(), 567 UTC_TIME(), 567 UTC_TIMESTAMP(), 567 UTF-8, 485 UTF8, 485 utilisation de MySQL, 371 UUID(), 587
INFORMATION_SCHEMA table, 895 virtual memory problems while compiling, 95 Visual Basic, 1026
W
wait mysql option, 438 WEEK(), 567 WEEKDAY(), 568 WEEKOFYEAR(), 569 Well-Known Binary format, 847 Well-Known Text format, 846 What is encryption, 289 What is X509/Certificate?, 289 WHERE, 383 with SHOW, 883, 896 WHILE, 876 Wildcard character (%), 470 Wildcard character (_), 470 wildcards and LIKE, 408 in mysql.columns_priv table, 270 in mysql.db table, 270 in mysql.host table, 270 in mysql.tables_priv table, 270 in mysql.user table, 267 Windows, 995 compiling on, 102 open issues, 77 upgrading, 74 versus Unix, 75 Within(), 862 without-server option, 89 WKB, 847 WKT, 846 Word, 1025 wrappers Eiffel, 993 write access tmp, 108 write_buffer_size myisamchk variable, 302
V
valeurs par dfaut, 370 Valeurs par dfaut, 599 valid numbers examples, 471 VARBINARY data type, 524 VARCHAR, 514 size, 528 VARCHAR data type, 523 VARCHARACTER, 514 variables mysqld, 416 server, 225, 677 status, 246, 675 system, 225, 677 System, 476 user, 475 values, 227 VARIANCE(), 590 verbose mysql option, 438 vrrouillage, 415 version choosing, 45 latest, 54 mysql option, 438 mysqlcc option, 452 mysqld_multi option, 210 VERSION(), 586 vertical mysql option, 438 views, 32, 881, 881 updatable, 881 VIEWS
X
X(), 855 xml mysql option, 438 XOR bitwise, 578 logical, 537
Y
Y(), 856 YEAR, 513, 522 Year 2000 compliance, 10 Year 2000 issues, 522 YEAR(), 569
1402